        .global main                    
		
        .global _etext                 
        .global _data                   
        .global _edata
        .global __bss_start             
        .global __bss_end__            
        .global _stack                  


        .set  UND_STACK_SIZE, 0x00000004
        .set  ABT_STACK_SIZE, 0x00000004
        .set  FIQ_STACK_SIZE, 0x00000004
        .set  IRQ_STACK_SIZE, 0X00000080
        .set  SVC_STACK_SIZE, 0x00000004


        .set  MODE_USR, 0x10            
        .set  MODE_FIQ, 0x11            
        .set  MODE_IRQ, 0x12           
        .set  MODE_SVC, 0x13            
        .set  MODE_ABT, 0x17            
        .set  MODE_UND, 0x1B            
        .set  MODE_SYS, 0x1F           

        .equ  I_BIT, 0x80               
        .equ  F_BIT, 0x40          

        .text
        .code 32
        .align 2

        .global _boot
        .func   _boot
_boot:


Vectors:
        b     _start                   
        ldr   pc,_undf                 
        ldr   pc,_swi                   
        ldr   pc,_pabt                 
        ldr   pc,_dabt                  
        nop                             
        ldr   pc,[pc,#-0xFF0]           
        ldr   pc,_fiq                  

#if 0

_undf:  .word _reset                    
_swi:   .word _reset                    
_pabt:  .word _reset                    
_dabt:  .word _reset                    
_irq:   .word _reset                    
_fiq:   .word _reset                   

#else

_undf:  .word __undf                    
_swi:   .word __swi                    
_pabt:  .word __pabt                    
_dabt:  .word __dabt                    
_irq:   .word __irq                    
_fiq:   .word __fiq                    

__undf: b     .                         
__swi:  b     .                         
__pabt: b     .                         
__dabt: b     .                        
__irq:  b     .                        
__fiq:  b     .                        
#endif
        .size _boot, . - _boot
        .endfunc



        .global _start, start, _mainCRTStartup
        .func   _start

_start:
start:
_mainCRTStartup:


        ldr   r0,=_stack
        msr   CPSR_c,#MODE_UND|I_BIT|F_BIT 
        mov   sp,r0
        sub   r0,r0,#UND_STACK_SIZE
        msr   CPSR_c,#MODE_ABT|I_BIT|F_BIT
        mov   sp,r0
        sub   r0,r0,#ABT_STACK_SIZE
        msr   CPSR_c,#MODE_FIQ|I_BIT|F_BIT
        mov   sp,r0
        sub   r0,r0,#FIQ_STACK_SIZE
        msr   CPSR_c,#MODE_IRQ|I_BIT|F_BIT
        mov   sp,r0
        sub   r0,r0,#IRQ_STACK_SIZE
        msr   CPSR_c,#MODE_SVC|I_BIT|F_BIT
        mov   sp,r0
        sub   r0,r0,#SVC_STACK_SIZE
        msr   CPSR_c,#MODE_SYS|I_BIT|F_BIT
        mov   sp,r0


#ifdef ROM_RUN
        ldr   r1,=_etext               
        ldr   r2,=_data                
        ldr   r3,=_edata               
1:      cmp   r2,r3                    
        ldrlo r0,[r1],#4                
        strlo r0,[r2],#4
        blo   1b                        
#endif

        mov   r0,#0                   
        ldr   r1,=__bss_start          
        ldr   r2,=__bss_end__          
2:      cmp   r1,r2                   
        strlo r0,[r1],#4              
        blo   2b                       


        mov   r0,#0                  
        mov   r1,r0
        mov   r2,r0
        mov   fp,r0                     
        mov   r7,r0                    
        ldr   r10,=main
        mov   lr,pc
        bx    r10                     

        .size   _start, . - _start
        .endfunc

        .global _reset, reset, exit, abort
        .func   _reset
_reset:
reset:
exit:
abort:
#if 0

        mrs   r0,cpsr                   
        orr   r0,r0,#I_BIT|F_BIT        
        msr   cpsr,r0                  

        ldr   r1,=(PS_BASE)             
        ldr   r0,=(PS_PIO)             
        str   r0,[r1,#PS_PCER_OFF]    
        ldr   r1,=(PIO_BASE)           
        ldr   r0,=(1<<23)              
        str   r0,[r1,#PIO_PER_OFF]      
        str   r0,[r1,#PIO_CODR_OFF]   
        str   r0,[r1,#PIO_OER_OFF]      
#endif
        b     .                       

        .size _reset, . - _reset
        .endfunc

        .end
