update DI disc code
[libogc.git] / libogc / ogc_crt0.S
blobca9849d4b2a03b44e055f238e515580fc40f7c0b
1 #include <asm.h>
3         .text
4         .section .init
6         # crt0.s file for the GameCube V1.1 by Costis (costis@gbaemu.com)!
7         #
8         # Updates: Added support for clearing the BSS section so that global
9         #            variables are cleared to 0 upon start-up. 
10         #
11         # This is start-up code for initializing the GameCube system and hardware
12         # before executing the actual user program code. It clears the GPR's,
13         # initializes the FPR's, initializes the Data, Code, and L2 caches, clears
14         # and initializes SPR's, and disables exceptions (interrupts).
15         #
16         # Have fun!!! Please e-mail any suggestions or bugs to costis@gbaemu.com.
18         # Entry Point
20         .extern InitBATS
21         .extern __PSInit
22         .extern __CacheInit
23         .extern __SystemInit
24         .extern __sbss_start, __bss_end, __CheckARGV
25         .globl _start, __main, __system_argv
26 _start:
27         b       startup
28         .long   0x5f617267
29 __argv:
30         .long   0               # argv magic
31         .long 0         # command line
32         .long 0         # command line length
33         .long   0               # argc
34         .long   0               #       argv
35         .long 0         # end address of argv
37 startup:
38         bl              InitBATS                        # Initialize BATs to a clear and known state
39         bl              InitGPRS                        # Initialize the General Purpose Registers
40         bl              FPRInit                         # Initialize the FPR's
41         bl              __PSInit                        # Initialize Paired Singles
42         bl              __CacheInit             # Initialize the system caches
43         bl              __SystemInit            # Initialize more cache aspects, clear a few SPR's, and disable interrupts.
45         bl              __CheckARGV             # check for argv & initialise struct
47         lis             r3,__isIPL@h
48         ori             r3,r3,__isIPL@l
49         cmplwi  r3,0
50         bne             1f
52         # Clear the BSS section!
53         lis             r3,__sbss_start@h
54         ori             r3,r3,__sbss_start@l
55         li              r4,0
56         lis             r5,__bss_end@h
57         ori             r5,r5,__bss_end@l
58         sub             r5,r5,r3
59         bl              _memset
62         b      SYS_Init # Branch to the user code!
64 InitGPRS:
65         # Clear all of the GPR's to 0
66         li      r0,0
67         li      r3,0
68         li      r4,0
69         li      r5,0
70         li      r6,0
71         li      r7,0
72         li      r8,0
73         li      r9,0
74         li      r10,0
75         li      r11,0
76         li      r12,0
77         li      r14,0
78         li      r15,0
79         li      r16,0
80         li      r17,0
81         li      r18,0
82         li      r19,0
83         li      r20,0
84         li      r21,0
85         li      r22,0
86         li      r23,0
87         li      r24,0
88         li      r25,0
89         li      r26,0
90         li      r27,0
91         li      r28,0
92         li      r29,0
93         li      r30,0
94         li      r31,0
96         lis             sp,__crt0stack@h                    # we take 0x8173FFF0 as the topmost starting point for our stack,this gives us ~128Kb Stack
97         ori             sp,sp,__crt0stack@l
98         addi    sp,sp,-4
99         stw             r0,0(sp)
100         stwu    sp,-56(sp)
102         lis     r2,_SDA2_BASE_@h
103         ori     r2,r2,_SDA2_BASE_@l  # Set the Small Data 2 (Read Only) base register.
104         lis     r13,_SDA_BASE_@h
105         ori     r13,r13,_SDA_BASE_@l # Set the Small Data (Read\Write) base register.   
106         blr
108 FPRInit:
109         # Enable the Floating Point Registers
110         mfmsr   r3
111         ori     r3,r3,0x2000
112         mtmsr   r3
113         
114         # Clear all of the FPR's to 0
115         lis         r3,zfloat@ha
116         lfd         fr0,zfloat@l(r3)
117         fmr     fr1,fr0
118         fmr     fr2,fr0
119         fmr     fr3,fr0
120         fmr     fr4,fr0
121         fmr     fr5,fr0
122         fmr     fr6,fr0
123         fmr     fr7,fr0
124         fmr     fr8,fr0
125         fmr     fr9,fr0
126         fmr     fr10,fr0
127         fmr     fr11,fr0
128         fmr     fr12,fr0
129         fmr     fr13,fr0
130         fmr     fr14,fr0
131         fmr     fr15,fr0
132         fmr     fr16,fr0
133         fmr     fr17,fr0
134         fmr     fr18,fr0
135         fmr     fr19,fr0
136         fmr     fr20,fr0
137         fmr     fr21,fr0
138         fmr     fr22,fr0
139         fmr     fr23,fr0
140         fmr     fr24,fr0
141         fmr     fr25,fr0
142         fmr     fr26,fr0
143         fmr     fr27,fr0
144         fmr     fr28,fr0
145         fmr     fr29,fr0
146         fmr     fr30,fr0
147         fmr     fr31,fr0
148         mtfsf   255,fr0
150         # Return
151         blr
153         //r3 = ptr, r4 = fill, r5 = size
154         .globl _memset
155 _memset:
156         clrlwi. r6,r5,29
157         srwi    r5,r5,2
158         subi    r3,r3,4
159         mtctr   r5
160 1:      stwu    r4,4(r3)
161         bdnz    1b
162         cmplwi  r6,0
163         beq             3f
164 2:      stbu    r4,1(r3)
165         addic.  r6,r6,-1
166         bne+    2b
167 3:      blr
169         .globl video_line
170 video_line:
171         mulli   r5,r3,640
172         lis             r3,0xC0F0
173         mtctr   r5
174 1:      stwu    r4,4(r3)
175         bdnz    1b
176         blr
178         .section .bss
179         .balign 8
180 __crt0stack_end:
181         .space 0x4000
182 __crt0stack:
184         .section .data
185         .balign 4
186 zfloat:
187         .double 0.0
189         .globl __system_argv
190         .section        .sdata,"aw",@progbits
191         .align 2
192         .type   __system_argv, @object
193         .size   __system_argv, 4
194 __system_argv:
195         .long   __argv