summaryrefslogtreecommitdiff
path: root/home/init.asm
blob: 2fc21053bfefa3f6ee38e32866338d90904002a8 (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
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
    db $21, $C6


SECTION "Init", ROM0[$52F]

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 ???
    ld a, $4B ; TODO: add predefs so the line above can be uncommented
    call Predef
    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

_FillBGMap:
    ld de, $400
    ld l, e
.loop
    ld [hli], a
    dec e
    jr nz, .loop
    dec d
    jr nz, .loop
    ret