diff options
author | Jonas Höglund <firefly@firefly.nu> | 2014-07-26 11:36:08 +0200 |
---|---|---|
committer | Jonas Höglund <firefly@firefly.nu> | 2014-07-26 11:36:08 +0200 |
commit | 1add32ab4d4544bb10bcb6c85d7427732c2821c4 (patch) | |
tree | 8430c555fc514b87240b33c9d5865a7220326727 | |
parent | 24fd45099664e2b6dab105cebfea118a1605efc3 (diff) |
Home: do palette functions, vblank & timer interrupts
-rwxr-xr-x | engine/bank3.asm | 10 | ||||
-rwxr-xr-x | engine/home.asm | 138 | ||||
-rwxr-xr-x | engine/music1.asm | 4 | ||||
-rwxr-xr-x | wram.asm | 34 |
4 files changed, 106 insertions, 80 deletions
diff --git a/engine/bank3.asm b/engine/bank3.asm index e212969..1ff0abf 100755 --- a/engine/bank3.asm +++ b/engine/bank3.asm @@ -242,11 +242,11 @@ Func_c1b1: ; c1b1 (3:41b1) farcall Func_1c82e farcall Func_131b3 xor a - ld [wCounter0], a - ld [wCounter1], a - ld [wCounter2], a - ld [wCounter3], a - ld [wCounter4], a + ld [wCounter + 0], a + ld [wCounter + 1], a + ld [wCounter + 2], a + ld [wCounter + 3], a + ld [wCounter + 4], a ret Func_c1ed: ; c1ed (3:41ed) diff --git a/engine/home.asm b/engine/home.asm index 79c52f7..b52e18b 100755 --- a/engine/home.asm +++ b/engine/home.asm @@ -56,7 +56,7 @@ Start: ; 0150 (0:0150) call SetupVRAM call SetupLCD call SetupPalettes - call Func_377f + call SetupSound_T call SetupTimer call ResetSerial call CopyDMAFunction @@ -73,17 +73,18 @@ VBlankHandler: ; 019b (0:019b) push hl ld a, [hBankROM] push af - ld hl, $caba + ld hl, wReentrancyFlag bit 0, [hl] - jr nz, .asm_1dd + jr nz, .done set 0, [hl] - ld a, [$cac0] + ld a, [wVBlankOAMCopyToggle] or a - jr z, .asm_1b8 - call hDMAFunction + jr z, .no_oam_copy + call hDMAFunction ; DMA-copy $ca00-$ca9f to OAM memory xor a - ld [$cac0], a -.asm_1b8 + ld [wVBlankOAMCopyToggle], a +.no_oam_copy + ; flush scaling/windowing parameters ld a, [hSCX] ld [rSCX], a ld a, [hSCY] @@ -92,16 +93,17 @@ VBlankHandler: ; 019b (0:019b) ld [rWX], a ld a, [hWY] ld [rWY], a + ; flush LCDC ld a, [wLCDC] ld [rLCDC], a ei call $cad0 - call Func_042d + call FlushPalettes ld hl, wVBlankCtr inc [hl] - ld hl, $caba + ld hl, wReentrancyFlag res 0, [hl] -.asm_1dd +.done pop af call BankswitchHome pop hl @@ -116,27 +118,31 @@ TimerHandler: ; 01e6 (0:01e6) push de push bc ei - call Func_0c91 - ld hl, $cac3 + call SerialTimerHandler + ; only trigger every fourth interrupt ≈ 60.24 Hz + ld hl, wCounterCtr ld a, [hl] inc [hl] and $3 - jr nz, .asm_217 + jr nz, .done + ; increment the 60-60-60-255-255 counter call IncrementCounter - ld hl, $caba + ; check in-timer flag + ld hl, wReentrancyFlag bit 1, [hl] - jr nz, .asm_217 + jr nz, .done set 1, [hl] ld a, [hBankROM] push af - ld a, BANK(Func_f4003) + ld a, BANK(SoundTimerHandler_Ext) call BankswitchHome - call Func_f4003 + call SoundTimerHandler_Ext pop af call BankswitchHome - ld hl, $caba + ; clear in-timer flag + ld hl, wReentrancyFlag res 1, [hl] -.asm_217 +.done pop bc pop de pop hl @@ -144,12 +150,11 @@ TimerHandler: ; 01e6 (0:01e6) reti ; increment timer counter by a tick -; the counter consists of three fields 0..60 and two fields 0..255 IncrementCounter: ; 021c (0:021c) ld a, [wCounterEnable] or a ret z - ld hl, wCounter0 + ld hl, wCounter inc [hl] ld a, [hl] cp 60 @@ -174,15 +179,16 @@ IncrementCounter: ; 021c (0:021c) inc [hl] ret -; setup timer to roughly 60 Hz +; setup timer to 16384/68 ≈ 240.94 Hz SetupTimer: ; 0241 (0:0241) - ld b, $bc + ld b, $100 - 68 + ; ld b, $bc call CheckForCGB jr c, .asm_250 ld a, [rKEY1] and $80 jr z, .asm_250 - ld b, $78 + ld b, $100 - 2*68 .asm_250 ld a, b ld [rTMA], a @@ -225,7 +231,7 @@ EnableLCD: ; 0277 (0:0277) ld [wLCDC], a ; ld [rLCDC], a ; turn LCD on ld a, $c0 - ld [$cabf], a + ld [wFlushPaletteFlags], a ret ; wait for vblank, then turn LCD off @@ -303,14 +309,14 @@ SetupLCD: ; 030b (0:030b) ld [hWX], a ld [hWY], a xor a - ld [$caba], a - ld a, $c3 + ld [wReentrancyFlag], a + ld a, $c3 ; $c3 = jp nn ld [$cacd], a - ld [$cad0], a - ld hl, $cad1 - ld [hl], NopF & $ff - inc hl - ld [hl], NopF >> $8 + ld [wVBlankFunctionTrampoline], a + ld hl, wVBlankFunctionTrampoline + 1 + ld [hl], NopF & $ff ; + inc hl ; load `jp NopF` + ld [hl], NopF >> $8 ; ld a, $47 ld [wLCDC], a ld a, $1 @@ -350,7 +356,7 @@ SetupPalettes: ; 036a (0:036a) ld [hli], a ld [hl], a xor a - ld [$cabf], a + ld [wFlushPaletteFlags], a ld a, [wConsole] cp CONSOLE_CGB ret nz @@ -367,7 +373,7 @@ SetupPalettes: ; 036a (0:036a) jr nz, .asm_38c dec c jr nz, .asm_387 - call Func_0458 + call FlushBothCGBPalettes ret InitialPalette: ; 0399 (0:0399) @@ -457,14 +463,14 @@ Func_040c: ; 040c (0:040c) asm_40f ld a, $80 asm_411 - ld [$cabf], a + ld [wFlushPaletteFlags], a ld a, [wLCDC] rla ret c push hl push de push bc - call Func_042d + call FlushPalettes pop bc pop de pop hl @@ -478,10 +484,16 @@ Set_OBP1: ; 0428 (0:0428) ld [wOBP1], a jr asm_40f -Func_042d: ; 042d (0:042d) - ld a, [$cabf] +; flushes non-CGB palettes from [wBGP], [wOBP0], [wOBP1] as well as CGB +; palettes from [wBufPalette..wBufPalette+$1f] (BG palette) and +; [wBufPalette+$20..wBufPalette+$3f] (sprite palette). +; only flushes if [wFlushPaletteFlags] is nonzero, and only flushes sprite +; palette if bit6 of that location is set. +FlushPalettes: ; 042d (0:042d) + ld a, [wFlushPaletteFlags] or a ret z + ; flush grayscale (non-CGB) palettes ld hl, wBGP ld a, [hli] ld [rBGP], a @@ -491,29 +503,33 @@ Func_042d: ; 042d (0:042d) ld [rOBP1], a ld a, [wConsole] cp CONSOLE_CGB - jr z, asm_44a -asm_445 + jr z, flushPaletteCGB +flushPaletteDone xor a - ld [$cabf], a + ld [wFlushPaletteFlags], a ret -asm_44a - ld a, [$cabf] +flushPaletteCGB + ; flush BG palette (BGP) + ; if bit6 of [wFlushPaletteFlags] is set, flush OBP too + ld a, [wFlushPaletteFlags] bit 6, a - jr nz, Func_0458 + jr nz, FlushBothCGBPalettes ld b, $8 - call InitializePalettes - jr asm_445 + call CopyPalette + jr flushPaletteDone -Func_0458: ; 0458 (0:0458) +FlushBothCGBPalettes: ; 0458 (0:0458) xor a ld b, $40 - call InitializePalettes + ; flush BGP $00-$1f + call CopyPalette ld a, $8 ld b, $40 - call InitializePalettes - jr asm_445 + ; flush OBP $00-$1f + call CopyPalette + jr flushPaletteDone -InitializePalettes: ; 0467 (0:0467) +CopyPalette: ; 0467 (0:0467) add a add a add a @@ -559,10 +575,10 @@ Func_04a2: ; 04a2 (0:04a2) ld a, [wConsole] cp CONSOLE_SGB ret nz - call EnableLCD - ld hl, SGB_04bf - call SendSGB - call DisableLCD + call EnableLCD ; + ld hl, SGB_04bf ; send SGB data + call SendSGB ; + call DisableLCD ; ret SGB_04bf: ; 04bf (0:04bf) @@ -1061,7 +1077,7 @@ SetupExtRAM: ; 080b (0:080b) Func_084d: ; 084d (0:084d) ld a, $3 .asm_84f - call Func_0863 + call ClearExtRAMBank dec a cp $ff jr nz, .asm_84f @@ -1073,7 +1089,7 @@ Func_084d: ; 084d (0:084d) ld [hl], $5 ret -Func_0863: ; 0863 (0:0863) +ClearExtRAMBank: ; 0863 (0:0863) push af call BankswitchRAM call EnableExtRAM @@ -1580,7 +1596,7 @@ MemcpyDEHL_hblank: ; 0c32 (0:0c32) INCBIN "baserom.gbc",$0c4b,$0c91 - $0c4b -Func_0c91: ; 0c91 (0:0c91) +SerialTimerHandler: ; 0c91 (0:0c91) ld a, [$cb74] cp $29 jr z, .asm_c9d @@ -3613,8 +3629,8 @@ Func_3212: ; 3212 (0:3212) INCBIN "baserom.gbc",$321d,$377f - $321d -Func_377f: ; 377f (0:377f) - farcall Func_f4000 +SetupSound_T: ; 377f (0:377f) + farcall SetupSound_Ext ret Func_3784: ; 3784 (0:3784) diff --git a/engine/music1.asm b/engine/music1.asm index 22392bb..21b7007 100755 --- a/engine/music1.asm +++ b/engine/music1.asm @@ -1,7 +1,7 @@ -Func_f4000: ; f4000 (3d:4000) +SetupSound_Ext: ; f4000 (3d:4000) jp Func_f407d -Func_f4003: ; f4003 (3d:4003) +SoundTimerHandler_Ext: ; f4003 (3d:4003) jp Func_f40e9 Func_f4006: ; f4006 (3d:4006) @@ -6,7 +6,8 @@ wInitialA: ; cab3 ds $1 wConsole: ; cab4 - ds $2 + ds $1 + ds $1 wTileMapFill: ; cab6 ds $1 @@ -15,7 +16,13 @@ wIE: ; cab7 ds $1 wVBlankCtr: ; cab8 - ds $3 + ds $1 + ds $1 + +; bit0: is in vblank interrupt? +; bit1: is in timer interrupt? +wReentrancyFlag: ; caba + ds $1 wLCDC: ; cabb ds $1 @@ -27,28 +34,31 @@ wOBP0: ; cabd ds $1 wOBP1: ; cabe - ds $6 - -wCounterEnable: ; cac4 ds $1 -wCounter0: ; cac5 +wFlushPaletteFlags: ; cabf ds $1 -wCounter1: ; cac6 +wVBlankOAMCopyToggle: ; cac0 ds $1 + ds $2 -wCounter2: ; cac7 +wCounterCtr: ; cac3 ds $1 -wCounter3: ; cac8 +wCounterEnable: ; cac4 ds $1 -wCounter4: ; cac9 - ds $27 +wCounter: ; cac5 + ds $5 + ds $6 + +wVBlankFunctionTrampoline: ; cad0 + ds $20 ; unknown length wBufPalette: ; caf0 - ds $84 + ds $80 + ds $4 wBufSerial: ; cb74 ds $1 |