diff options
Diffstat (limited to 'home/vblank.asm')
-rw-r--r-- | home/vblank.asm | 653 |
1 files changed, 380 insertions, 273 deletions
diff --git a/home/vblank.asm b/home/vblank.asm index 9dc7c33c..9cf36f9a 100644 --- a/home/vblank.asm +++ b/home/vblank.asm @@ -1,277 +1,384 @@ VBlank:: - push af ; 150 - push bc ; 151 - push de ; 152 - push hl ; 153 - ld a, [hVBlank] ; 154 - and $7 ; 156 - ld e, a ; 158 - ld d, $0 ; 159 - ld hl, .blanks ; 15b - add hl, de ; 15e - add hl, de ; 15f - ld a, [hli] ; 160 - ld h, [hl] ; 161 - ld l, a ; 162 - ld de, .return ; 163 - push de ; 166 - jp [hl] ; 167 + push af + push bc + push de + push hl + ld a, [hVBlank] + and $7 + ld e, a + ld d, $0 + ld hl, .blanks + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .return + push de + jp [hl] .return - call Function1efa ; 168 - pop hl ; 16b - pop de ; 16c - pop bc ; 16d - pop af ; 16e - reti ; 16f -; 170 + call Function1efa + pop hl + pop de + pop bc + pop af + reti .blanks - dw Function180 - dw Function1f4 - dw Function2b0 - dw Function2c4 - dw Function255 - dw Function278 - dw Function180 - dw Function180 - -Function180:: - ld hl, hVBlankCounter ; 180 - inc [hl] ; 183 - ld a, [rDIV] ; 184 - ld b, a ; 186 - ld a, [hRandomAdd] ; 187 - adc b ; 189 - ld [hRandomAdd], a ; 18a - ld a, [rDIV] ; 18c - ld b, a ; 18e - ld a, [hRandomSub] ; 18f - sbc b ; 191 - ld [hRandomSub], a ; 192 - ld a, [hROMBank] ; 194 - ld [$d155], a ; 196 - ld a, [hSCX] ; 199 - ld [rSCX], a ; 19b - ld a, [hSCY] ; 19d - ld [rSCY], a ; 19f - ld a, [hWY] ; 1a1 - ld [rWY], a ; 1a3 - ld a, [hWX] ; 1a5 - ld [rWX], a ; 1a7 - call Function1458 ; 1a9 - jr c, Function1c2 ; 1ac - call Functionbdf ; 1ae - jr c, Function1c2 ; 1b1 - call Function14bb ; 1b3 - call Function15d0 ; 1b6 - call Function1579 ; 1b9 - call Function162b ; 1bc - call Function1642 ; 1bf -Function1c2:: - ld a, [hOAMUpdate] ; 1c2 - and a ; 1c4 - jr nz, Function1ca ; 1c5 - call hPushOAM ; 1c7 -Function1ca:: - xor a ; 1ca - ld [$ceea], a ; 1cb - ld a, [$cee8] ; 1ce - and a ; 1d1 - jr z, Function1d8 ; 1d2 - dec a ; 1d4 - ld [$cee8], a ; 1d5 -Function1d8:: - ld a, [$cee9] ; 1d8 - and a ; 1db - jr z, Function1e2 ; 1dc - dec a ; 1de - ld [$cee9], a ; 1df -Function1e2:: - call Function8e6 ; 1e2 - ld a, BANK(Functione805c) ; 1e5 - rst Bankswitch ; 1e7 - call Functione805c ; 1e8 - ld a, [$d155] ; 1eb - rst Bankswitch ; 1ee - ld a, [$ff9a] ; 1ef - ld [$ffe5], a ; 1f1 - ret ; 1f3 -; 1f4 - -Function1f4:: - ld a, [hROMBank] ; 1f4 - ld [$d155], a ; 1f6 - ld a, [hSCX] ; 1f9 - ld [rSCX], a ; 1fb - ld a, [hSCY] ; 1fd - ld [rSCY], a ; 1ff - call Function23e ; 201 - jr c, Function20f ; 204 - call Function14bb ; 206 - call Function15d0 ; 209 - call hPushOAM ; 20c -Function20f:: - ld a, [hLCDCPointer] ; 20f - or a ; 211 - jr z, Function219 ; 212 - ld c, a ; 214 - ld a, [$c700] ; 215 - ld [$ff00+c], a ; 218 -Function219:: - xor a ; 219 - ld [$ceea], a ; 21a - ld a, [rIF] ; 21d - ld b, a ; 21f - xor a ; 220 - ld [rIF], a ; 221 - ld a, $2 ; 223 - ld [rIE], a ; 225 - ld a, b ; 227 - and $8 ; 228 - or $2 ; 22a - ld [rIF], a ; 22c - ei ; 22e - ld a, BANK(Functione805c) ; 22f - rst Bankswitch ; 231 - call Functione805c ; 232 - ld a, [$d155] ; 235 - rst Bankswitch ; 238 - ld a, $1f ; 239 - ld [rIE], a ; 23b - ret ; 23d -; 23e - -Function23e:: - ld a, [hCGB] ; 23e - and a ; 240 - jp nz, Functionbe3 ; 241 - ld a, [$cf43] ; 244 - ld [rBGP], a ; 247 - ld a, [$cf44] ; 249 - ld [rOBP0], a ; 24c - ld a, [$cf45] ; 24e - ld [rOBP1], a ; 251 - and a ; 253 - ret ; 254 -; 255 - -Function255:: - ld a, [hROMBank] ; 255 - ld [$d155], a ; 257 - call Function14bb ; 25a - call Function15d0 ; 25d - call hPushOAM ; 260 - call Function8e6 ; 263 - xor a ; 266 - ld [$ceea], a ; 267 - call Function1ebf ; 26a - ld a, BANK(Functione805c) ; 26d - rst Bankswitch ; 26f - call Functione805c ; 270 - ld a, [$d155] ; 273 - rst Bankswitch ; 276 - ret ; 277 -; 278 - -Function278:: - ld a, [hROMBank] ; 278 - ld [$d155], a ; 27a - ld a, [hSCX] ; 27d - ld [rSCX], a ; 27f - call Functionbdf ; 281 - jr c, Function28c ; 284 - call Function14bb ; 286 - call Function15d0 ; 289 -Function28c:: - xor a ; 28c - ld [$ceea], a ; 28d - call Function8e6 ; 290 - xor a ; 293 - ld [rIF], a ; 294 - ld a, $2 ; 296 - ld [rIE], a ; 298 - ld [rIF], a ; 29a - ei ; 29c - ld a, BANK(Functione805c) ; 29d - rst Bankswitch ; 29f - call Functione805c ; 2a0 - ld a, [$d155] ; 2a3 - rst Bankswitch ; 2a6 - di ; 2a7 - xor a ; 2a8 - ld [rIF], a ; 2a9 - ld a, $1f ; 2ab - ld [rIE], a ; 2ad - ret ; 2af -; 2b0 - -Function2b0:: - ld a, [hROMBank] ; 2b0 - ld [$d155], a ; 2b2 - ld a, BANK(Functione805c) ; 2b5 - rst Bankswitch ; 2b7 - call Functione805c ; 2b8 - ld a, [$d155] ; 2bb - rst Bankswitch ; 2be - xor a ; 2bf - ld [$ceea], a ; 2c0 - ret ; 2c3 -; 2c4 - -Function2c4:: - ld a, [hVBlankCounter] ; 2c4 - inc a ; 2c6 - ld [hVBlankCounter], a ; 2c7 - ld a, [rDIV] ; 2c9 - ld b, a ; 2cb - ld a, [hRandomAdd] ; 2cc - adc b ; 2ce - ld [hRandomAdd], a ; 2cf - ld a, [rDIV] ; 2d1 - ld b, a ; 2d3 - ld a, [hRandomSub] ; 2d4 - sbc b ; 2d6 - ld [hRandomSub], a ; 2d7 - call Function8e6 ; 2d9 - ld a, [hROMBank] ; 2dc - ld [$d155], a ; 2de - ld a, [hSCX] ; 2e1 - ld [rSCX], a ; 2e3 - ld a, [hSCY] ; 2e5 - ld [rSCY], a ; 2e7 - ld a, [hWY] ; 2e9 - ld [rWY], a ; 2eb - ld a, [hWX] ; 2ed - ld [rWX], a ; 2ef - call Function14bb ; 2f1 - call Function1458 ; 2f4 - call Function15d0 ; 2f7 - call Function1579 ; 2fa - call Function162b ; 2fd - call hPushOAM ; 300 - xor a ; 303 - ld [$ceea], a ; 304 - ld a, [$cee9] ; 307 - and a ; 30a - jr z, Function311 ; 30b - dec a ; 30d - ld [$cee9], a ; 30e -Function311:: - xor a ; 311 - ld [rIF], a ; 312 - ld a, $2 ; 314 - ld [rIE], a ; 316 - ld [rIF], a ; 318 - ei ; 31a - ld a, BANK(Functione805c) ; 31b - rst Bankswitch ; 31d - call Functione805c ; 31e - ld a, [$d155] ; 321 - rst Bankswitch ; 324 - di ; 325 - xor a ; 326 - ld [rIF], a ; 327 - ld a, $1f ; 329 - ld [rIE], a ; 32b - ret ; 32d -; 32e + dw VBlank0 + dw VBlank1 + dw VBlank2 + dw VBlank3 + dw VBlank4 + dw VBlank5 + dw VBlank0 + dw VBlank0 ; just in case +;180 + +VBlank0:: ; 180 +; normal operation + +; rng +; scx, scy, wy, wx +; bg map buffer +; palettes +; dma transfer +; bg map +; tiles +; oam +; joypad +; sound + + ; inc frame counter + ld hl, hVBlankCounter + inc [hl] + + ; advance random variables + ld a, [rDIV] + ld b, a + ld a, [hRandomAdd] + adc b + ld [hRandomAdd], a + + ld a, [rDIV] + ld b, a + ld a, [hRandomSub] + sbc b + ld [hRandomSub], a + + ld a, [hROMBank] + ld [wROMBankBackup], a + + ld a, [hSCX] + ld [rSCX], a + ld a, [hSCY] + ld [rSCY], a + ld a, [hWY] + ld [rWY], a + ld a, [hWX] + ld [rWX], a + + ; There's only time to call one of these in one vblank. + ; Calls are in order of priority. + + call UpdateBGMapBuffer + jr c, .done + call UpdatePalsIfCGB + jr c, .done + call UpdateBGMap + call Serve2bppRequest + + ; These have their own timing checks. + + call Function1579 + call Function162b + call Function1642 + +.done + + ld a, [hOAMUpdate] + and a + jr nz, .done_oam + call hPushOAM +.done_oam + + + ; vblank-sensitive operations are done + + + xor a + ld [wVBlankOccurred], a + + ld a, [wOverworldDelay] + and a + jr z, .ok + dec a + ld [wOverworldDelay], a +.ok + + ld a, [wTextDelayFrames] + and a + jr z, .ok2 + dec a + ld [wTextDelayFrames], a +.ok2 + + call Joypad + ld a, BANK(_UpdateSound) + rst Bankswitch + call _UpdateSound + ld a, [wROMBankBackup] + rst Bankswitch + ld a, [hSeconds] + ld [hSecondsBackup], a + ret + +VBlank1:: ; 1f4 +; scx, scy +; palettes +; bg map +; tiles +; oam +; sound / lcd stat + ld a, [hROMBank] + ld [wROMBankBackup], a + ld a, [hSCX] + ld [rSCX], a + ld a, [hSCY] + ld [rSCY], a + call UpdatePals + jr c, .done + + call UpdateBGMap + call Serve2bppRequest + + call hPushOAM +.done + ld a, [hLCDCPointer] + or a + jr z, .skip_lcd + ld c, a + ld a, [wc700] + ld [$ff00+c], a +.skip_lcd + xor a + ld [wVBlankOccurred], a + + ; get requested ints + ld a, [rIF] + ld b, a + ; discard requested ints + xor a + ld [rIF], a + ; enable lcd stat + ld a, %10 ; lcd stat + ld [rIE], a + ; rerequest serial int if applicable (still disabled) + ; request lcd stat + ld a, b + and %1000 ; serial + or %10 ; lcd stat + ld [rIF], a + + ei + ld a, BANK(_UpdateSound) + rst Bankswitch + call _UpdateSound + ld a, [wROMBankBackup] + rst Bankswitch + ; enable ints + ld a, %11111 + ld [rIE], a + ret + +UpdatePals:: ; 23e +; update pals for either dmg or cgb + ld a, [hCGB] + and a + jp nz, UpdateCGBPals + + ; update gb pals + ld a, [wBGP] + ld [rBGP], a + ld a, [wOBP0] + ld [rOBP0], a + ld a, [wOPB1] + ld [rOBP1], a + and a + ret + +VBlank4:: ; 255 +; bg map +; tiles +; oam +; joypad +; serial +; sound + + ld a, [hROMBank] + ld [wROMBankBackup], a + + call UpdateBGMap + call Serve2bppRequest + + call hPushOAM + + call Joypad + + xor a + ld [wVBlankOccurred], a + + call AskSerial + + ld a, BANK(_UpdateSound) + rst Bankswitch + call _UpdateSound + + ld a, [wROMBankBackup] + rst Bankswitch + ret + +VBlank5:: ; 278 +; scx +; palettes +; bg map +; tiles +; joypad + + ld a, [hROMBank] + ld [wROMBankBackup], a + + ld a, [hSCX] + ld [rSCX], a + + call UpdatePalsIfCGB + jr c, .done + + call UpdateBGMap + call Serve2bppRequest +.done + + xor a + ld [wVBlankOccurred], a + + call Joypad + + xor a + ld [rIF], a + ld a, %10 ; lcd stat + ld [rIE], a + ; request lcd stat + ld [rIF], a + + ei + ld a, BANK(_UpdateSound) + rst Bankswitch + call _UpdateSound + ld a, [wROMBankBackup] + rst Bankswitch + di + + xor a + ld [rIF], a + ; enable ints + ld a, %11111 + ld [rIE], a + ret + +VBlank2:: ; 2b0 +; sound only + + ld a, [hROMBank] + ld [wROMBankBackup], a + + ld a, BANK(_UpdateSound) + rst Bankswitch + call _UpdateSound + + ld a, [wROMBankBackup] + rst Bankswitch + + xor a + ld [wVBlankOccurred], a + ret + +VBlank3:: ; 2c4 +; scx, scy +; palettes +; bg map +; tiles +; oam +; sound / lcd stat + + ld a, [hVBlankCounter] + inc a + ld [hVBlankCounter], a + + ld a, [rDIV] + ld b, a + ld a, [hRandomAdd] + adc b + ld [hRandomAdd], a + + ld a, [rDIV] + ld b, a + ld a, [hRandomSub] + sbc b + ld [hRandomSub], a + + call Joypad + + ld a, [hROMBank] + ld [wROMBankBackup], a + + ld a, [hSCX] + ld [rSCX], a + ld a, [hSCY] + ld [rSCY], a + + ld a, [hWY] + ld [rWY], a + ld a, [hWX] + ld [rWX], a + + call UpdateBGMap + call UpdateBGMapBuffer + + call Serve2bppRequest + + call Function1579 + call Function162b + + call hPushOAM + + xor a + ld [wVBlankOccurred], a + + ld a, [wTextDelayFrames] + and a + jr z, .okay + dec a + ld [wTextDelayFrames], a +.okay + + xor a + ld [rIF], a + ld a, %10 ; lcd stat + ld [rIE], a + ; request lcd stat + ld [rIF], a + + ei + ld a, BANK(_UpdateSound) + rst Bankswitch + call _UpdateSound + ld a, [wROMBankBackup] + rst Bankswitch + di + + xor a + ld [rIF], a + ; enable ints + ld a, %11111 + ld [rIE], a + ret |