summaryrefslogtreecommitdiff
path: root/home/init.asm
blob: 98fa129bb07ee65bb51a45d3896c62903d8c7cd6 (plain)
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
INCLUDE "constants.asm"

SECTION "Entry point", ROM0[$100]
	nop
	jp Init

SECTION "Global check value", ROM0[$14E]
; The ROM has an incorrect global check, so set it here
; It is not corrected by RGBFIX
if def(GOLD)
if DEBUG
    db $21, $C6
else
    db $7e, $49
endc
else
if DEBUG
    db $c9, $2f
else
    db $b1, $7a
endc
endc

SECTION "Init", ROM0[$51C]

Reset: ; 51c (0:051c)
	call DisableAudio
	call ClearPalettes
	ei

	ld hl, wJoypadFlags
	set 7, [hl]

	ld c, 32
	call DelayFrames

	jr Init

Init: ; 052f
	di
	xor a
	ld [rIF], a
	ld [rIE], a
	ld [rSCX], a
	ld [rSCY], a
	ld [rSB], a
	ld [rSC], a
	ld [rWX], a
	ld [rWY], a
	ld [rBGP], a
	ld [rOBP0], a
	ld [rOBP1], a
	ld [rTMA], a
	ld [rTAC], a
	ld [wcc38], a ; Useless, since WRAM gets cleared right after
	ld a, 1 << rTAC_ON | rTAC_4096_HZ
	ld [rTAC], a
	ld a, 1 << rLCDC_ENABLE
	ld [rLCDC], a
	call DisableLCD

	ld sp, wStackBottom
	call ClearVRAM
	ld hl, WRAM0_Begin
	ld bc, WRAM1_End - WRAM0_Begin
.ByteFill ; 0565
	ld [hl], 0
	inc hl
	dec bc
	ld a, b
	or c
	jr nz, .ByteFill
	ld hl, HRAM_Begin
	ld bc, HRAM_End - HRAM_Begin
	call ByteFill
	call ClearSprites

	ld a, BANK(WriteOAMDMACodeToHRAM)
	call Bankswitch
	call WriteOAMDMACodeToHRAM

	xor a
	ldh [hMapAnims], a
	ldh [hSCX], a
	ldh [hSCY], a
	ldh [rJOYP], a
	ld a, 1 << rSTAT_HBLANK
	ld [rSTAT], a
	ld a, SCREEN_HEIGHT_PX
	ldh [hWY], a
	ld [rWY], a
	ld a, 7
	ldh [hWX], a
	ld [rWX], a

	ld a, $ff
	ldh [hLinkPlayerNumber], a
	ld h, HIGH($9800)
	call BlankBGMap
	ld h, HIGH($9C00)
	call BlankBGMap
	ld a, LCDC_DEFAULT
	ld [rLCDC], a

	call DisableAudio
	call _2007
	predef CheckSGB
	ld a, $1F
	ld [rIE], a
	ld a, HIGH($9C00)
	ldh [hBGMapAddress + 1], a
	xor a
	ldh [hBGMapAddress], a

	call DisableLCD
	call ClearVRAM
	ld a, LCDC_DEFAULT
	ld [rLCDC], a
	ei

	ld a, SRAM_ENABLE
	ld [MBC3SRamEnable], a
	ld a, RTC_DH
	ld [MBC3SRamBank], a
	xor a
	ld [SRAM_Begin], a
	ld a, 0 ; Useless
	ld [MBC3LatchClock], a
	ld [MBC3SRamEnable], a
	jp GameInit

ClearVRAM: ; 05e6
	ld hl, VRAM_Begin
	ld bc, VRAM_End - VRAM_Begin
	xor a
	call ByteFill
	ret

BlankBGMap:
	ld a, $7f
	jr _FillBGMap

FillBGMap:
	ld a, l
	; fallthrough

_FillBGMap:
	ld de, BG_MAP_WIDTH * BG_MAP_HEIGHT
	ld l, e
.loop
	ld [hli], a
	dec e
	jr nz, .loop
	dec d
	jr nz, .loop
	ret