VBlank:: 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 pop hl pop de pop bc pop af reti .blanks 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