diff options
Diffstat (limited to 'src/home/setup.asm')
-rw-r--r-- | src/home/setup.asm | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/home/setup.asm b/src/home/setup.asm new file mode 100644 index 0000000..bf58452 --- /dev/null +++ b/src/home/setup.asm @@ -0,0 +1,158 @@ +; initialize scroll, window, and lcdc registers, set trampoline functions +; for the lcdc and vblank interrupts, latch clock data, and enable SRAM/RTC +SetupRegisters: ; 030b (0:030b) + 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: ; 0348 (0:0348) + ret + +; sets wConsole and, if CGB, selects WRAM bank 1 and switches to double speed mode +DetectConsole: ; 0349 (0:0349) + 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: ; 036a (0:036a) + 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: ; 0399 (0:0399) + 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: ; 03a1 (0:03a1) + 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: ; 03c0 (0:03c0) + 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: ; 03ec (0:03ec) + 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 |