pokecrystal/home/vblank.asm

443 lines
5.4 KiB
NASM

; VBlank is the interrupt responsible for updating VRAM.
; In Pokemon Crystal, VBlank has been hijacked to act as the
; main loop. After time-sensitive graphics operations have been
; performed, joypad input and sound functions are executed.
; This prevents the display and audio output from lagging.
VBlank:: ; 283
push af
push bc
push de
push hl
ld a, [hVBlank]
and 7
ld e, a
ld d, 0
ld hl, .VBlanks
rept 2
add hl, de
endr
ld a, [hli]
ld h, [hl]
ld l, a
call _hl_
call GameTimer
pop hl
pop de
pop bc
pop af
reti
; 2a1
.VBlanks ; 2a1
dw VBlank0
dw VBlank1
dw VBlank2
dw VBlank3
dw VBlank4
dw VBlank5
dw VBlank6
dw VBlank0 ; just in case
; 2b1
VBlank0:: ; 2b1
; normal operation
; rng
; scx, scy, wy, wx
; bg map buffer
; palettes
; dma transfer
; bg map
; tiles
; oam
; joypad
; sound
; inc frame counter
ld hl, $ff9b
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 [hROMBankBackup], 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 DMATransfer
jr c, .done
call UpdateBGMap
; These have their own timing checks.
call Serve2bppRequest
call Serve1bppRequest
call AnimateTileset
.done
ld a, [hOAMUpdate]
and a
jr nz, .done_oam
call hPushOAM
.done_oam
; vblank-sensitive operations are done
xor a
ld [VBlankOccurred], a
ld a, [OverworldDelay]
and a
jr z, .ok
dec a
ld [OverworldDelay], a
.ok
ld a, [TextDelayFrames]
and a
jr z, .ok2
dec a
ld [TextDelayFrames], a
.ok2
call Joypad
ld a, BANK(_UpdateSound)
rst Bankswitch
call _UpdateSound
ld a, [hROMBankBackup]
rst Bankswitch
ld a, [hSeconds]
ld [$ffe3], a
ret
; 325
VBlank2:: ; 325
; sound only
ld a, [hROMBank]
ld [hROMBankBackup], a
ld a, BANK(_UpdateSound)
rst Bankswitch
call _UpdateSound
ld a, [hROMBankBackup]
rst Bankswitch
xor a
ld [VBlankOccurred], a
ret
; 337
VBlank1:: ; 337
; scx, scy
; palettes
; bg map
; tiles
; oam
; sound / lcd stat
ld a, [hROMBank]
ld [hROMBankBackup], a
ld a, [hSCX]
ld [rSCX], a
ld a, [hSCY]
ld [rSCY], a
call UpdatePals
jr c, .done
call UpdateBGMap
call Serve2bppRequest@VBlank
call hPushOAM
.done
xor a
ld [VBlankOccurred], 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, [hROMBankBackup]
rst Bankswitch
di
; get requested ints
ld a, [rIF]
ld b, a
; discard requested ints
xor a
ld [rIF], a
; enable ints besides joypad
ld a, %1111 ; serial timer lcdstat vblank
ld [rIE], a
; rerequest ints
ld a, b
ld [rIF], a
ret
; 37f
UpdatePals:: ; 37f
; update pals for either dmg or cgb
ld a, [hCGB]
and a
jp nz, UpdateCGBPals
; update gb pals
ld a, [wcfc7]
ld [rBGP], a
ld a, [wcfc8]
ld [rOBP0], a
ld a, [wcfc9]
ld [rOBP1], a
and a
ret
; 396
VBlank3:: ; 396
; scx, scy
; palettes
; bg map
; tiles
; oam
; sound / lcd stat
ld a, [hROMBank]
ld [hROMBankBackup], a
ld a, [hSCX]
ld [rSCX], a
ld a, [hSCY]
ld [rSCY], a
ld a, [hCGBPalUpdate]
and a
call nz, ForceUpdateCGBPals
jr c, .done
call UpdateBGMap
call Serve2bppRequest@VBlank
call hPushOAM
.done
xor a
ld [VBlankOccurred], a
ld a, [rIF]
push af
xor a
ld [rIF], a
ld a, %10 ; lcd stat
ld [rIE], a
ld [rIF], a
ei
ld a, BANK(_UpdateSound)
rst Bankswitch
call _UpdateSound
ld a, [hROMBankBackup]
rst Bankswitch
di
; request lcdstat
ld a, [rIF]
ld b, a
; and any other ints
pop af
or b
ld b, a
; reset ints
xor a
ld [rIF], a
; enable ints besides joypad
ld a, %1111 ; serial timer lcdstat vblank
ld [rIE], a
; request ints
ld a, b
ld [rIF], a
ret
; 3df
VBlank4:: ; 3df
; bg map
; tiles
; oam
; joypad
; serial
; sound
ld a, [hROMBank]
ld [hROMBankBackup], a
call UpdateBGMap
call Serve2bppRequest
call hPushOAM
call Joypad
xor a
ld [VBlankOccurred], a
call AskSerial
ld a, BANK(_UpdateSound)
rst Bankswitch
call _UpdateSound
ld a, [hROMBankBackup]
rst Bankswitch
ret
; 400
VBlank5:: ; 400
; scx
; palettes
; bg map
; tiles
; joypad
;
ld a, [hROMBank]
ld [hROMBankBackup], a
ld a, [hSCX]
ld [rSCX], a
call UpdatePalsIfCGB
jr c, .done
call UpdateBGMap
call Serve2bppRequest
.done
xor a
ld [VBlankOccurred], 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, [hROMBankBackup]
rst Bankswitch
di
xor a
ld [rIF], a
; enable ints besides joypad
ld a, %1111 ; serial timer lcdstat vblank
ld [rIE], a
ret
; 436
VBlank6:: ; 436
; palettes
; tiles
; dma transfer
; sound
ld a, [hROMBank]
ld [hROMBankBackup], a
; inc frame counter
ld hl, $ff9b
inc [hl]
call UpdateCGBPals
jr c, .done
call Serve2bppRequest
call Serve1bppRequest
call DMATransfer
.done
xor a
ld [VBlankOccurred], a
ld a, BANK(_UpdateSound)
rst Bankswitch
call _UpdateSound
ld a, [hROMBankBackup]
rst Bankswitch
ret
; 45a