summaryrefslogtreecommitdiff
path: root/src/home/setup.asm
diff options
context:
space:
mode:
authorDaniel Harding <33dannye@gmail.com>2021-09-19 00:21:14 -0500
committerGitHub <noreply@github.com>2021-09-19 00:21:14 -0500
commitdf67aac83b466dadf5f74c881bf84dd9ef19bdfc (patch)
tree47501aced2d256052b8f78bc97328d5af5703add /src/home/setup.asm
parente4bce9b7ee5e89f8edfd921de2379f0fa06af206 (diff)
parent8dee6b7a11e85d6d4b9f8ec9fb9d53a499fd37dc (diff)
Merge pull request #110 from ElectroDeoxys/master
Split Home bank
Diffstat (limited to 'src/home/setup.asm')
-rw-r--r--src/home/setup.asm158
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..10ecc70
--- /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:
+ 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