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


SECTION "NULL", ROM0
NULL::


SECTION "home/init.asm@Entry point", ROM0
	nop
	jp Init


SECTION "home/init.asm@Global check value", ROM0
; The ROM has an incorrect global check, so set it here.
; It is not corrected by RGBFIX.
	dw $C621


SECTION "home/init.asm@Init", ROM0

Reset:
	call DisableAudio
	call ClearPalettes
	ei

	ld hl, wJoypadFlags
	set 7, [hl]

	ld c, 32
	call DelayFrames

	jr Init ; pointless

Init:
	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 [wTitleSequenceOpeningType], 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
.clear_loop
	ld [hl], 0
	inc hl
	dec bc
	ld a, b
	or c
	jr nz, .clear_loop

	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:
	ld hl, VRAM_Begin
	ld bc, VRAM_End - VRAM_Begin
	xor a
	call ByteFill
	ret

BlankBGMap:
	ld a, " "
	jr _FillBGMap

FillBGMap:
	ld a, l
_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