/
home.asm
253 lines (212 loc) · 4.18 KB
/
home.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
; Copyleft 2016 Henry "wolfboyft" Fleminger Thomson.
; Licensed under the GNU General Public License ver. 3.
; Refer to file LICENSE for information on the GPL 3.
INCLUDE "macros.asm"
SECTION "Org $00", HOME[$00]
RST_00::
ld [Buffer], a
jp Farcall
SECTION "Org $08", HOME[$08]
RST_08::
ld [ROMBank], a
ld [$2000], a
ret
; no need for anything along the lines of jp Bankswitch, it's all here
SECTION "Org $10", HOME[$10]
RST_10::
push de
ld e, a
ld d, 0
rept 2
add hl, de
endr
ld a, [hli]
ld h, [hl]
ld l, a
pop de
jp hl
; SECTION "Org $18", HOME[$18]
;RST_18::
; jp $100
SECTION "Org $20", HOME[$20]
RST_20::
push de
ld e, a
ld d, 0
rept 2
add hl, de
endr
ld a, [hli]
ld h, [hl]
ld l, a
pop de
ret
; SECTION "Org $28", HOME[$28]
;RST_28::
; jp $100
;
SECTION "Org $30", HOME[$30]
RST_30::
jp $100
SECTION "Org $38", HOME[$38]
RST_38::
jp $100
SECTION "V-Blank IRQ Vector", HOME[$40]
VBL_VECT::
jp VBlank
SECTION "LCD IRQ Vector", HOME[$48]
LCD_VECT::
reti
SECTION "Timer IRQ Vector", HOME[$50]
TIMER_VECT::
reti
SECTION "Serial IRQ Vector", HOME[$58]
SERIAL_VECT::
reti
SECTION "Joypad IRQ Vector", HOME[$60]
JOYPAD_VECT::
reti
SECTION "Header", HOME[$100]
nop
jp Start
; $0104-$0133 (Nintendo logo - do _not_ modify the logo data here or the GB will not run the program)
NINTENDO_LOGO
; $0134-$013E (Game title - up to 11 upper case ASCII characters; pad with $00)
ds 11
;0123456789A
; $013F-$0142 (Product code - 4 ASCII characters, assigned by Nintendo, just leave blank)
db " "
;0123
; $0143 (Color GameBoy compatibility code)
db $00 ; $00 - DMG
; $80 - DMG/GBC
; $C0 - GBC Only cartridge
; $0144 (High-nibble of license code - normally $00 if $014B != $33)
db $00
; $0145 (Low-nibble of license code - normally $00 if $014B != $33)
db $00
; $0146 (GameBoy/Super GameBoy indicator)
db $00 ; $00 - GameBoy
; $0147 (Cartridge type - all Color GameBoy cartridges are at least $19)
db $1B ; $1B - ROM + MBC5 + RAM + BATT
; $0148 (ROM size)
db $02 ; 128 KiB (8 banks)
; $0149 (RAM size)
db $04 ;4 - 1MBit =128kB =16 banks
; $014A (Destination code)
db $01 ; $01 - All others
; $00 - Japan
; $014B (Licensee code - this _must_ be $33)
db $33 ; $33 - Check $0144/$0145 for Licensee code.
; $014C (Mask ROM version - handled by RGBFIX)
db $00
; $014D (Complement check - handled by RGBFIX)
db $00
; $014E-$014F (Cartridge checksum - handled by RGBFIX)
dw $00
SECTION "Program Start", HOME[$0150]
Start::
ld sp, StackStart
push af
ld sp, $FFFF
di
ld bc, $2000
ld hl, $C000
ld de, 0
EmbeddedSetForwards::
ld a, b
or c
jr z, .done
ld a, d
ld [hli], a
dec bc
jr EmbeddedSetForwards
.done
xor a
ld [$3000], a
inc a
ld [$2000], a
ld sp, StackStart - 2
call StopLCD
xor a
ld d, a
ld bc, $FFFE - $FF80 + 1
ld hl, $FF80
call SetForwards
ld de, WaitDMADoneSource
ld hl, $FF80
ld bc, WaitDMADoneSourceEnd - WaitDMADoneSource
call CopyForwards
xor a
ld d, a
ld bc, $FE9F - $FE00 + 1
ld hl, $FE00
call SetForwards
ld bc, $9FFF - $8000 + 1
ld hl, $8000
call SetForwards
ld a, $e4
ld [rBGP], a
xor a
ld [rSCX], a
ld [rSCY], a
ld a, $57
ld [$9A48], a
inc a
ld [$9A49], a
ld a, $C2
ld [CursorPos], a
ld a, $1C
ld [CursorPos + 1], a
pop af
cp $11
jr z, .non_CGB
ld a, 1
ld [WRAMBank], a
ld [rSVBK], a
ld a, $80
ld [rBCPS], a
ld bc, $4069
ld hl, Palettes
.loop
ld a, [hli]
ld [c], a
dec b
jr nz, .loop
.returnfromskip
call StartLCD
xor a
cpl
inc a
ld [rIF], a
inc a
ld [rIE], a
ld [DownJoypad], a
ei
; If you need to test something quickly, put it here
ld de, Text_Eulaworld
call PrintText
call WaitForStart
jp MainMenu
.non_CGB
ld hl, Flags
set 3, [hl]
jr .returnfromskip
Palettes::
REPT 8
RGBSet $FF, $FF, $FF
RGBSet $AA, $AA, $AA
RGBSet $55, $55, $55
RGBSet $00, $00, $00
ENDR
CallTable:: ; Useful for when you want the next ret after a JumpTable to return to where the JumpTable was executed.
rst JumpTable
INCLUDE "far.asm"
INCLUDE "joypad.asm"
INCLUDE "update.asm"
INCLUDE "data.asm"
INCLUDE "video.asm"
INCLUDE "misc.asm"
INCLUDE "text.asm"
INCLUDE "mainmenu.asm"
INCLUDE "memory.asm" ; memory.asm needs to know what RAM type our cartridge has. Said information lies within home.asm.