gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-lib/libc/targets/z80/gg/crt0.s
1 .include "global.s"
2
3 .title "Runtime"
4 .module Runtime
5
6 .ez80
7
8 .area _HEADER (ABS)
9
10 .globl .OUTI32
11
12 .org 0x00 ; Reset 00h
13 di ; disable interrupt
14 im 1 ; interrupt mode 1 (this won't change)
15 jp .init
16
17 ; .org 0x08 ; --profile handler
18
19 .org 0x10 ; RST 0x10: VDP_WRITE_CMD
20
21 _WRITE_VDP_CMD::
22 VDP_WRITE_CMD h, l
23 ret
24
25 ; .org 0x18 ; unusable
26
27 .org 0x20 ; RST 0x20: VDP_WRITE_DATA
28
29 _WRITE_VDP_DATA::
30 VDP_WRITE_DATA h, l
31 ret
32
33 ; .org 0x28 ; unusable
34
35 .org 0x30 ; RST 0x30: call HL
36 .call_hl::
37 jp (HL)
38
39 .org 0x38 ; handle IRQ
40 jp _INT_ISR
41
42 .org 0x66 ; handle NMI
43 jp _NMI_ISR
44
45 .org 0x80
46
47 .init::
48 ld sp, #.STACK ; set stack pointer at end of RAM
49
50 ld a, (#.BIOS)
51 push af
52
53 xor a
54 ld bc, #l__DATA
55 ld hl, #s__DATA
56 call .memset_simple ; initialize veriables in RAM with zero
57
58 pop af
59 ld (#__BIOS), a ; save BIOS value
60
61 ld hl, #_shadow_OAM
62 ld de, #(_shadow_OAM + 1)
63 ld bc, #64
64 ld (hl), #0xc0
65 ldir
66 ld (hl), #0
67 ld bc, #(128 - 1)
68 ldir
69
70 ld hl,#0x0000 ; initialize mappers
71 ld (#.RAM_CONTROL),hl ; [.RAM_CONTROL]=$00, [.MAP_FRAME0]=$00
72 ld hl,#0x0201
73 ld (#.MAP_FRAME1),hl ; [.MAP_FRAME1]=$01, [.MAP_FRAME2]=$02
74
75 ; Initialise global variables
76 call .gsinit
77
78 ; Clear VRAM and Initialize VDP
79
80 ld hl, #((.VDP_R1 << 8) | (.R1_DEFAULT | .R1_DISP_OFF))
81 ld c, #.VDP_CMD
82 out (c), l
83 out (c), h
84
85 ; clear VRAM
86 call .clear_VRAM
87
88 ; set default palette
89 call .set_default_palette
90
91 ; set VDP registers
92 ld c, #.VDP_CMD
93 ld b, #(.shadow_VDP_end - .shadow_VDP)
94 ld hl,#(.shadow_VDP_end - 1)
95 1$:
96 outd
97
98 ld a, b
99 or #.VDP_REG_MASK
100 out (c), a
101
102 ld a, b
103 or a
104 jr nz, 1$
105
106 ; detect PAL/NTSC
107 in a, (.GG_STATE)
108 and #.GGSTATE_NNTS
109 jr nz, 2$
110 ld a, #.SYSTEM_NTSC
111 jr 3$
112 2$:
113 ld a, #.SYSTEM_PAL
114 3$:
115 ld (#__SYSTEM), a
116
117 VDP_CANCEL_INT
118
119 ei ; re-enable interrupts before going to main()
120
121 call _main
122 10$:
123 halt
124 jr 10$
125
126 ; Ordering of segments for the linker.
127 .area _HOME
128 .area _BASE
129 .area _CODE
130 .area _CODE_0
131 .area _LIT
132 .area _INITIALIZER
133 .area _GSINIT
134 .area _GSFINAL
135
136 .area _DATA
137 .area _INITIALIZED
138 .area _BSEG
139 .area _BSS
140 .area _HEAP
141 .area _HEAP_END
142
143 .area _CODE
144 .area _GSINIT
145 .gsinit::
146 ; initialize static storage variables
147 ld bc, #l__INITIALIZER
148 ld hl, #s__INITIALIZER
149 ld de, #s__INITIALIZED
150 call .memcpy_simple
151
152 .area _GSFINAL
153 ret
154
155 .area _HOME
156
157 .clear_VRAM:
158 ld hl, #.VDP_VRAM
159 ld c, #.VDP_CMD
160 out (c), l
161 out (c), h
162 xor a
163 ld bc, #0x4101
164 jr 6$
165 5$:
166 out (.VDP_DATA), a
167 6$:
168 dec c
169 jr nz, 5$
170 dec b
171 jr nz, 5$
172 ret
173
174 .set_default_palette:
175 ld hl, #.VDP_CRAM
176 ld c, #.VDP_CMD
177 out (c), l
178 out (c), h
179 ld c, #.VDP_DATA
180 ld hl, #.CRT_DEFAULT_PALETTE
181 call .OUTI32
182 ld hl, #.CRT_DEFAULT_PALETTE
183 jp .OUTI32
184
185 .CRT_DEFAULT_PALETTE::
186 .dw 0b0000111111111111
187 .dw 0b0000100010001000
188 .dw 0b0000010001000100
189 .dw 0b0000000000000000
190 .dw 0b0000000000001000
191 .dw 0b0000000010000000
192 .dw 0b0000100000000000
193 .dw 0b0000000010001000
194 .dw 0b0000100010000000
195 .dw 0b0000100000001000
196 .dw 0b0000000000001111
197 .dw 0b0000000011110000
198 .dw 0b0000111100000000
199 .dw 0b0000000011111111
200 .dw 0b0000111111110000
201 .dw 0b0000111100001111
202
203 ; fills memory at HL of length BC with A, clobbers DE
204 ; falls through into the .memcpy_simple
205 .memset_simple::
206 ld e, a
207 ld a, c
208 or b
209 ret z
210 ld (hl), e
211 dec bc
212 ld d, h
213 ld e, l
214 inc de
215
216 ; copies BC bytes from HL into DE
217 .memcpy_simple::
218 ld a, c
219 or b
220 ret z
221 ldir
222 ret
223
224 ; Wait for VBL interrupt to be finished
225 .wait_vbl_done::
226 _wait_vbl_done::
227 _vsync::
228 ld a, (_shadow_VDP_R1)
229 and #.R1_DISP_ON
230 ret z
231
232 xor a
233 ld (.vbl_done), a
234 1$:
235 halt
236 ld a, (.vbl_done)
237 or a
238 jr z, 1$
239 ret
240
241 .area _DATA
242
243 .start_crt_globals:
244 __BIOS::
245 .ds 0x01 ; GB type (GB, PGB, CGB)
246 __SYSTEM::
247 .ds 0x01 ; PAL/NTSC
248 .end_crt_globals:
249
250 .area _INITIALIZED
251 .shadow_VDP:
252 _shadow_VDP_R0::
253 .ds 0x01
254 _shadow_VDP_R1::
255 .ds 0x01
256 _shadow_VDP_R2::
257 .ds 0x01
258 _shadow_VDP_R3::
259 .ds 0x01
260 _shadow_VDP_R4::
261 .ds 0x01
262 _shadow_VDP_R5::
263 .ds 0x01
264 _shadow_VDP_R6::
265 .ds 0x01
266 _shadow_VDP_R7::
267 _shadow_VDP_RBORDER::
268 .ds 0x01
269 _shadow_VDP_R8::
270 _shadow_VDP_RSCX::
271 .ds 0x01
272 _shadow_VDP_R9::
273 _shadow_VDP_RSCY::
274 .ds 0x01
275 _shadow_VDP_R10::
276 .ds 0x01
277 .shadow_VDP_end::
278
279 .sys_time::
280 _sys_time::
281 .ds 0x02
282 .vbl_done::
283 __vbl_done::
284 .ds 0x01
285 _VDP_ATTR_SHIFT::
286 .vdp_shift::
287 .ds 0x01
288 __shadow_OAM_base::
289 .ds 0x01
290 __shadow_OAM_OFF::
291 .ds 0x01
292 __sprites_OFF::
293 .ds 0x01
294 .mode::
295 .ds 0x01 ; Current mode
296
297 .area _INITIALIZER
298
299 .db .R0_DEFAULT
300 .db #(.R1_DEFAULT | .R1_DISP_ON | .R1_IE) ; VBLANK
301 .db .R2_MAP_0x1800 ; .R2_MAP_0x3800
302 .db 0xFF
303 .db 0xFF
304 .db .R5_SAT_0x1F00 ; .R5_SAT_0x3F00
305 .db .R6_DATA_0x2000
306 .db #(0 | .R7_COLOR_MASK)
307 .db 0 ; SCX
308 .db 0 ; SCY
309 .db .R10_INT_OFF
310 .dw 0x0000 ; .sys_time
311 .db 0 ; .vbl_done
312 .db 0 ; _VDP_ATTR_SHIFT
313 .db #>_shadow_OAM ; __shadow_OAM_base
314 .db 0 ; __shadow_OAM_OFF
315 .db 0 ; __sprites_OFF
316 .db .T_MODE_INOUT ; .mode
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.