; crt0.s - Startup code for the ms2. This code initializes the C ; run-time model. ; ; ; Copyright 2001, 2002, 2003, 2004 Morpho Technologies ; ; Create a label for the start of the eh_frame section. .section .eh_frame __eh_frame_begin: .text .global _start _start: ;; Initialize the stack pointer ldui sp, #%hi16(__stack) addui sp, sp, #%lo16(__stack) or fp, sp, sp ;; Zero the bss space ldui r9, #%hi16(__bss_start) addui r9, r9, #%lo16(__bss_start) ldui r10, #%hi16(__bss_end) addui r10, r10, #%lo16(__bss_end) or r0, r0, r0 brle r10, r9, .Lnext1 or r0, r0, r0 .Lcpy0: stw r0, r9, #0 addi r9, r9, #4 or r0, r0, r0 ; nop brle r9, r10, .Lcpy0 or r0, r0, r0 ; nop .Lnext1: ;; Copy data from ROM to Frame Buffer (on-chip memory) ldui r9, #%hi16(_fbdata_start) ori r9, r9, #%lo16(_fbdata_start) ldui r10, #%hi16(_fbdata_end) ori r10, r10, #%lo16(_fbdata_end) ldui r11, #%hi16(_fbdata_vma) brle r10, r9, .Lnext2 ori r11, r11, #%lo16(_fbdata_vma) .Lcpy1: ldw r5, r9, #$0 addi r9, r9, #$4 stw r5, r11, #$0 brlt r9, r10, .Lcpy1 addi r11, r11, #$4 .Lnext2: ;; Zero the frame buffer bss section ldui r9, #%hi16(_fbbss_start) ori r9, r9, #%lo16(_fbbss_start) ldui r10, #%hi16(_fbbss_end) ori r10, r10, #%lo16(_fbbss_end) or r0, r0, r0 brle r10, r9, .Lnext3 or r0, r0, r0 .Lcpy2: stw r0, r9, #$0 addi r9, r9, #$4 or r0, r0, r0 brle r9, r10, .Lcpy2 or r0, r0, r0 .Lnext3: ;; Copy data from ROM to SRAM (another on-chip memory) ldui r9, #%hi16(_sram_data_start) ori r9, r9, #%lo16(_sram_data_start) ldui r10, #%hi16(_sram_data_end) ori r10, r10, #%lo16(_sram_data_end) ldui r11, #%hi16(_sram_data_vma) brle r10, r9, .Lnext4 ori r11, r11, #%lo16(_sram_data_vma) .Lcpy3: ldw r5, r9, #$0 addi r9, r9, #$4 stw r5, r11, #$0 brlt r9, r10, .Lcpy3 addi r11, r11, #$4 .Lnext4: ;; Call global and static constructors ldui r10, #%hi16(_init) ori r10, r10, #%lo16(_init) or r0, r0, r0 ; nop or r0, r0, r0 ; nop, added 06Sep05 jal r14, r10 or r0, r0, r0 ; nop ;; Call main ldui r10, #%hi16(main) ori r10, r10, #%lo16(main) or r0, r0, r0 ; nop or r0, r0, r0 ; nop, added 06Sep05 jal r14, r10 or r0, r0, r0 ; nop ;; DJK - Added 12Nov01. Pass main's return value to exit. or r1, r11, r0 ;; Jump to exit ldui r10, #%hi16(exit) ori r10, r10, #%lo16(exit) or r0, r0, r0 ; nop or r0, r0, r0 ; nop, added 06Sep05 jal r14, r10 or r0, r0, r0 ; nop ;; Exit does not return, however, this code is to catch an ;; error if it does. Set the processor into sleep mode. ori r1, r0, #$1 stw r1, r0, #%lo16(_DEBUG_HALT_REG) or r0, r0, r0 or r0, r0, r0 or r0, r0, r0 or r0, r0, r0 or r0, r0, r0 .Lend: jmp .Lend or r0, r0, r0