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
|
; initialize scroll, window, and lcdc registers, set trampoline functions
; for the lcdc and vblank interrupts, latch clock data, and enable SRAM/RTC
SetupRegisters:
xor a
ldh [rSCY], a
ldh [rSCX], a
ldh [rWY], a
ldh [rWX], a
ld [wcab0], a
ld [wcab1], a
ld [wcab2], a
ldh [hSCX], a
ldh [hSCY], a
ldh [hWX], a
ldh [hWY], a
xor a
ld [wReentrancyFlag], a
ld a, $c3 ; $c3 = jp nn
ld [wLCDCFunctionTrampoline], a
ld [wVBlankFunctionTrampoline], a
ld hl, wVBlankFunctionTrampoline + 1
ld [hl], LOW(NoOp) ;
inc hl ; load `jp NoOp`
ld [hl], HIGH(NoOp) ;
ld a, LCDC_BGON | LCDC_OBJON | LCDC_OBJ16 | LCDC_WIN9C00
ld [wLCDC], a
ld a, $1
ld [MBC3LatchClock], a
ld a, SRAM_ENABLE
ld [MBC3SRamEnable], a
NoOp:
ret
; sets wConsole and, if CGB, selects WRAM bank 1 and switches to double speed mode
DetectConsole:
ld b, CONSOLE_CGB
cp GBC
jr z, .got_console
call DetectSGB
ld b, CONSOLE_DMG
jr nc, .got_console
call InitSGB
ld b, CONSOLE_SGB
.got_console
ld a, b
ld [wConsole], a
cp CONSOLE_CGB
ret nz
ld a, $01
ldh [rSVBK], a
call SwitchToCGBDoubleSpeed
ret
; initialize the palettes (both monochrome and color)
SetupPalettes:
ld hl, wBGP
ld a, %11100100
ldh [rBGP], a
ld [hli], a ; wBGP
ldh [rOBP0], a
ldh [rOBP1], a
ld [hli], a ; wOBP0
ld [hl], a ; wOBP1
xor a
ld [wFlushPaletteFlags], a
ld a, [wConsole]
cp CONSOLE_CGB
ret nz
ld de, wBackgroundPalettesCGB
ld c, 16
.copy_pals_loop
ld hl, InitialPalette
ld b, CGB_PAL_SIZE
.copy_bytes_loop
ld a, [hli]
ld [de], a
inc de
dec b
jr nz, .copy_bytes_loop
dec c
jr nz, .copy_pals_loop
call FlushAllCGBPalettes
ret
InitialPalette:
rgb 28, 28, 24
rgb 21, 21, 16
rgb 10, 10, 08
rgb 00, 00, 00
; clear VRAM tile data ([wTileMapFill] should be an empty tile)
SetupVRAM:
call FillTileMap
call CheckForCGB
jr c, .vram0
call BankswitchVRAM1
call .vram0
call BankswitchVRAM0
.vram0
ld hl, v0Tiles0
ld bc, v0BGMap0 - v0Tiles0
.loop
xor a
ld [hli], a
dec bc
ld a, b
or c
jr nz, .loop
ret
; fill VRAM0 BG map 0 with [wTileMapFill] and VRAM1 BG map 0 with $00
FillTileMap:
call BankswitchVRAM0
ld hl, v0BGMap0
ld bc, v0BGMap1 - v0BGMap0
.vram0_loop
ld a, [wTileMapFill]
ld [hli], a
dec bc
ld a, c
or b
jr nz, .vram0_loop
ld a, [wConsole]
cp CONSOLE_CGB
ret nz
call BankswitchVRAM1
ld hl, v1BGMap0
ld bc, v1BGMap1 - v1BGMap0
.vram1_loop
xor a
ld [hli], a
dec bc
ld a, c
or b
jr nz, .vram1_loop
call BankswitchVRAM0
ret
; zero work RAM, stack area, and high RAM ($C000-$DFFF, $FF80-$FFEF)
ZeroRAM:
ld hl, $c000
ld bc, $e000 - $c000
.zero_wram_loop
xor a
ld [hli], a
dec bc
ld a, c
or b
jr nz, .zero_wram_loop
ld c, LOW($ff80)
ld b, $fff0 - $ff80
xor a
.zero_hram_loop
ld [$ff00+c], a
inc c
dec b
jr nz, .zero_hram_loop
ret
|