JuiceBox Code Lcd Startup

From eLinux.org
Jump to: navigation, search

(file: crt0.s)

    .global main                    // int main(void)

    .global _etext                  // -> .data initial values in ROM
    .global _data                   // -> .data area in RAM
    .global _edata                  // end of .data area
    .global __bss_start             // -> .bss area in RAM
    .global __bss_end__             // end of .bss area
    .global _stack                  // top of stack

// Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
    .set  MODE_USR, 0x10            // User Mode
    .set  MODE_FIQ, 0x11            // FIQ Mode
    .set  MODE_IRQ, 0x12            // IRQ Mode
    .set  MODE_SVC, 0x13            // Supervisor Mode
    .set  MODE_ABT, 0x17            // Abort Mode
    .set  MODE_UND, 0x1B            // Undefined Mode
    .set  MODE_SYS, 0x1F            // System Mode

    .equ  I_BIT, 0x80               // when I bit is set, IRQ is disabled
    .equ  F_BIT, 0x40               // when F bit is set, FIQ is disabled

    .text
    .code 32
    .align 2


// Setup the operating mode & stack.
// ---------------------------------
    .global _start, start, _mainCRTStartup
    .func   _start

_start:
start:
_mainCRTStartup:

    mrs   r0,cpsr                   // get PSR
    orr   r0,r0,#I_BIT|F_BIT        // disable IRQ and FIQ
    msr   cpsr,r0                   // set up status register

    ldr   r0,=_stack
    mov   sp,r0

// Clear .bss
// ----------

    mov   r0,#0                     // get a zero
    ldr   r1,=__bss_start           // -> bss start
    ldr   r2,=__bss_end__           // -> bss end
2:  cmp   r1,r2                     // check if data to clear
    strlo r0,[r1],#4                // clear 4 bytes
    blo   2b                        // loop until done

    ldr   r1,=main
    mov   lr,pc
    bx    r1                       // enter main()

    .size   _start, . - _start
    .endfunc

    .end