pokecrystal/home/vblank.asm

422 lines
5.3 KiB
NASM
Raw Normal View History

2013-02-05 20:33:57 +00:00
; 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.
2018-06-24 14:09:41 +00:00
VBlank::
2013-02-05 20:33:57 +00:00
push af
push bc
push de
push hl
2015-01-20 05:31:29 +00:00
ld a, [hVBlank]
and 7
2013-02-05 20:33:57 +00:00
ld e, a
2015-01-20 05:31:29 +00:00
ld d, 0
2013-02-05 20:33:57 +00:00
ld hl, .VBlanks
add hl, de
add hl, de
2013-02-05 20:33:57 +00:00
ld a, [hli]
ld h, [hl]
ld l, a
2015-01-20 05:31:29 +00:00
call _hl_
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
call GameTimer
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
pop hl
pop de
pop bc
pop af
reti
2018-06-24 14:09:41 +00:00
.VBlanks:
2015-01-20 05:31:29 +00:00
dw VBlank0
dw VBlank1
dw VBlank2
dw VBlank3
dw VBlank4
dw VBlank5
dw VBlank6
dw VBlank0 ; just in case
2013-02-05 20:33:57 +00:00
2018-06-24 14:09:41 +00:00
VBlank0::
2013-02-05 20:33:57 +00:00
; normal operation
; rng
; scx, scy, wy, wx
; bg map buffer
; palettes
; dma transfer
; bg map
; tiles
; oam
; joypad
; sound
2015-01-20 05:31:29 +00:00
; inc frame counter
ld hl, hVBlankCounter
2013-02-05 20:33:57 +00:00
inc [hl]
2015-01-20 05:31:29 +00:00
; advance random variables
2013-02-20 07:46:40 +00:00
ld a, [rDIV]
2013-02-05 20:33:57 +00:00
ld b, a
ld a, [hRandomAdd]
2013-02-05 20:33:57 +00:00
adc b
ld [hRandomAdd], a
2015-01-20 05:31:29 +00:00
2013-02-20 07:46:40 +00:00
ld a, [rDIV]
2013-02-05 20:33:57 +00:00
ld b, a
ld a, [hRandomSub]
2013-02-05 20:33:57 +00:00
sbc b
ld [hRandomSub], a
2015-01-20 05:31:29 +00:00
ld a, [hROMBank]
ld [hROMBankBackup], a
2013-08-19 22:46:56 +00:00
ld a, [hSCX]
2013-02-20 07:46:40 +00:00
ld [rSCX], a
2013-08-19 22:46:56 +00:00
ld a, [hSCY]
2013-02-20 07:46:40 +00:00
ld [rSCY], a
2013-08-19 22:42:26 +00:00
ld a, [hWY]
2013-02-20 07:46:40 +00:00
ld [rWY], a
2013-08-19 22:42:26 +00:00
ld a, [hWX]
2013-02-20 07:46:40 +00:00
ld [rWX], a
2015-01-20 05:31:29 +00:00
; There's only time to call one of these in one vblank.
; Calls are in order of priority.
2013-02-05 20:33:57 +00:00
call UpdateBGMapBuffer
2015-01-20 05:31:29 +00:00
jr c, .done
2013-02-05 20:33:57 +00:00
call UpdatePalsIfCGB
2015-01-20 05:31:29 +00:00
jr c, .done
2013-02-05 20:33:57 +00:00
call DMATransfer
2015-01-20 05:31:29 +00:00
jr c, .done
2013-02-05 20:33:57 +00:00
call UpdateBGMap
2015-01-20 05:31:29 +00:00
; These have their own timing checks.
call Serve2bppRequest
call Serve1bppRequest
call AnimateTileset
2015-01-20 05:31:29 +00:00
.done
ld a, [hOAMUpdate]
2013-02-05 20:33:57 +00:00
and a
2015-01-20 05:31:29 +00:00
jr nz, .done_oam
2018-01-30 19:47:14 +00:00
call hTransferVirtualOAM
2015-01-20 05:31:29 +00:00
.done_oam
; vblank-sensitive operations are done
2013-02-05 20:33:57 +00:00
xor a
2018-01-23 22:39:09 +00:00
ld [wVBlankOccurred], a
2015-01-20 05:31:29 +00:00
2018-01-23 22:39:09 +00:00
ld a, [wOverworldDelay]
2013-02-05 20:33:57 +00:00
and a
2015-01-20 05:31:29 +00:00
jr z, .ok
2013-02-05 20:33:57 +00:00
dec a
2018-01-23 22:39:09 +00:00
ld [wOverworldDelay], a
2015-01-20 05:31:29 +00:00
.ok
2018-01-23 22:39:09 +00:00
ld a, [wTextDelayFrames]
2013-02-05 20:33:57 +00:00
and a
2015-01-20 05:31:29 +00:00
jr z, .ok2
2013-02-05 20:33:57 +00:00
dec a
2018-01-23 22:39:09 +00:00
ld [wTextDelayFrames], a
2015-01-20 05:31:29 +00:00
.ok2
2013-02-05 20:33:57 +00:00
call Joypad
2015-01-20 05:31:29 +00:00
ld a, BANK(_UpdateSound)
2015-01-20 05:31:29 +00:00
rst Bankswitch
call _UpdateSound
2015-01-20 05:31:29 +00:00
ld a, [hROMBankBackup]
rst Bankswitch
ld a, [hSeconds]
2015-10-16 17:35:43 +00:00
ld [hSecondsBackup], a
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
ret
2018-06-24 14:09:41 +00:00
VBlank2::
2013-02-05 20:33:57 +00:00
; sound only
ld a, [hROMBank]
2015-01-20 05:31:29 +00:00
ld [hROMBankBackup], a
ld a, BANK(_UpdateSound)
2015-01-20 05:31:29 +00:00
rst Bankswitch
call _UpdateSound
2015-01-20 05:31:29 +00:00
ld a, [hROMBankBackup]
2013-02-05 20:33:57 +00:00
rst Bankswitch
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
xor a
2018-01-23 22:39:09 +00:00
ld [wVBlankOccurred], a
2013-02-05 20:33:57 +00:00
ret
2018-06-24 14:09:41 +00:00
VBlank1::
2013-02-05 20:33:57 +00:00
; scx, scy
; palettes
; bg map
; tiles
; oam
; sound / lcd stat
ld a, [hROMBank]
2015-01-20 05:31:29 +00:00
ld [hROMBankBackup], a
2013-08-19 22:46:56 +00:00
ld a, [hSCX]
2013-02-20 07:46:40 +00:00
ld [rSCX], a
2013-08-19 22:46:56 +00:00
ld a, [hSCY]
2013-02-20 07:46:40 +00:00
ld [rSCY], a
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
call UpdatePals
2015-01-20 05:31:29 +00:00
jr c, .done
2013-02-05 20:33:57 +00:00
call UpdateBGMap
call Serve2bppRequest_VBlank
2015-01-20 05:31:29 +00:00
2018-01-30 19:47:14 +00:00
call hTransferVirtualOAM
2015-01-20 05:31:29 +00:00
.done
2013-02-05 20:33:57 +00:00
xor a
2018-01-23 22:39:09 +00:00
ld [wVBlankOccurred], a
2015-01-20 05:31:29 +00:00
; get requested ints
2013-02-20 07:46:40 +00:00
ld a, [rIF]
2013-02-05 20:33:57 +00:00
ld b, a
2015-01-20 05:31:29 +00:00
; discard requested ints
2013-02-05 20:33:57 +00:00
xor a
2013-02-20 07:46:40 +00:00
ld [rIF], a
2015-01-20 05:31:29 +00:00
; enable lcd stat
2013-02-05 20:33:57 +00:00
ld a, %10 ; lcd stat
2013-02-20 07:46:40 +00:00
ld [rIE], a
2015-01-20 05:31:29 +00:00
; rerequest serial int if applicable (still disabled)
; request lcd stat
2013-02-05 20:33:57 +00:00
ld a, b
and %1000 ; serial
or %10 ; lcd stat
2013-02-20 07:46:40 +00:00
ld [rIF], a
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
ei
ld a, BANK(_UpdateSound)
2015-01-20 05:31:29 +00:00
rst Bankswitch
call _UpdateSound
2015-01-20 05:31:29 +00:00
ld a, [hROMBankBackup]
2013-02-05 20:33:57 +00:00
rst Bankswitch
di
2015-01-20 05:31:29 +00:00
; get requested ints
2013-02-20 07:46:40 +00:00
ld a, [rIF]
2013-02-05 20:33:57 +00:00
ld b, a
2015-01-20 05:31:29 +00:00
; discard requested ints
2013-02-05 20:33:57 +00:00
xor a
2013-02-20 07:46:40 +00:00
ld [rIF], a
2015-01-20 05:31:29 +00:00
; enable ints besides joypad
2013-02-05 20:33:57 +00:00
ld a, %1111 ; serial timer lcdstat vblank
2013-02-20 07:46:40 +00:00
ld [rIE], a
2015-01-20 05:31:29 +00:00
; rerequest ints
2013-02-05 20:33:57 +00:00
ld a, b
2013-02-20 07:46:40 +00:00
ld [rIF], a
2013-02-05 20:33:57 +00:00
ret
2018-06-24 14:09:41 +00:00
UpdatePals::
2013-02-05 20:33:57 +00:00
; update pals for either dmg or cgb
ld a, [hCGB]
2013-02-05 20:33:57 +00:00
and a
jp nz, UpdateCGBPals
2015-01-20 05:31:29 +00:00
; update gb pals
2015-12-23 19:00:29 +00:00
ld a, [wBGP]
2013-02-20 07:46:40 +00:00
ld [rBGP], a
2015-12-23 19:00:29 +00:00
ld a, [wOBP0]
2013-02-20 07:46:40 +00:00
ld [rOBP0], a
2015-12-23 19:00:29 +00:00
ld a, [wOBP1]
2013-02-20 07:46:40 +00:00
ld [rOBP1], a
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
and a
ret
2018-06-24 14:09:41 +00:00
VBlank3::
2013-02-05 20:33:57 +00:00
; scx, scy
; palettes
; bg map
; tiles
; oam
; sound / lcd stat
ld a, [hROMBank]
2015-01-20 05:31:29 +00:00
ld [hROMBankBackup], a
2013-08-19 22:46:56 +00:00
ld a, [hSCX]
2013-02-20 07:46:40 +00:00
ld [rSCX], a
2013-08-19 22:46:56 +00:00
ld a, [hSCY]
2013-02-20 07:46:40 +00:00
ld [rSCY], a
2015-01-20 05:31:29 +00:00
ld a, [hCGBPalUpdate]
2013-02-05 20:33:57 +00:00
and a
call nz, ForceUpdateCGBPals
2015-01-20 05:31:29 +00:00
jr c, .done
2013-02-05 20:33:57 +00:00
call UpdateBGMap
call Serve2bppRequest_VBlank
2015-01-20 05:31:29 +00:00
2018-01-30 19:47:14 +00:00
call hTransferVirtualOAM
2015-01-20 05:31:29 +00:00
.done
2013-02-05 20:33:57 +00:00
xor a
2018-01-23 22:39:09 +00:00
ld [wVBlankOccurred], a
2015-01-20 05:31:29 +00:00
2013-02-20 07:46:40 +00:00
ld a, [rIF]
2013-02-05 20:33:57 +00:00
push af
xor a
2013-02-20 07:46:40 +00:00
ld [rIF], a
2013-02-05 20:33:57 +00:00
ld a, %10 ; lcd stat
2013-02-20 07:46:40 +00:00
ld [rIE], a
ld [rIF], a
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
ei
ld a, BANK(_UpdateSound)
2015-01-20 05:31:29 +00:00
rst Bankswitch
call _UpdateSound
2015-01-20 05:31:29 +00:00
ld a, [hROMBankBackup]
2013-02-05 20:33:57 +00:00
rst Bankswitch
di
2015-01-20 05:31:29 +00:00
; request lcdstat
2013-02-20 07:46:40 +00:00
ld a, [rIF]
2013-02-05 20:33:57 +00:00
ld b, a
2015-01-20 05:31:29 +00:00
; and any other ints
2013-02-05 20:33:57 +00:00
pop af
or b
ld b, a
2015-01-20 05:31:29 +00:00
; reset ints
2013-02-05 20:33:57 +00:00
xor a
2013-02-20 07:46:40 +00:00
ld [rIF], a
2015-01-20 05:31:29 +00:00
; enable ints besides joypad
2013-02-05 20:33:57 +00:00
ld a, %1111 ; serial timer lcdstat vblank
2013-02-20 07:46:40 +00:00
ld [rIE], a
2015-01-20 05:31:29 +00:00
; request ints
2013-02-05 20:33:57 +00:00
ld a, b
2013-02-20 07:46:40 +00:00
ld [rIF], a
2013-02-05 20:33:57 +00:00
ret
2018-06-24 14:09:41 +00:00
VBlank4::
2013-02-05 20:33:57 +00:00
; bg map
; tiles
; oam
; joypad
; serial
; sound
ld a, [hROMBank]
2015-01-20 05:31:29 +00:00
ld [hROMBankBackup], a
2013-02-05 20:33:57 +00:00
call UpdateBGMap
call Serve2bppRequest
2015-01-20 05:31:29 +00:00
2018-01-30 19:47:14 +00:00
call hTransferVirtualOAM
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
call Joypad
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
xor a
2018-01-23 22:39:09 +00:00
ld [wVBlankOccurred], a
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
call AskSerial
2015-01-20 05:31:29 +00:00
ld a, BANK(_UpdateSound)
2015-01-20 05:31:29 +00:00
rst Bankswitch
call _UpdateSound
2015-01-20 05:31:29 +00:00
ld a, [hROMBankBackup]
2013-02-05 20:33:57 +00:00
rst Bankswitch
ret
2018-06-24 14:09:41 +00:00
VBlank5::
2013-02-05 20:33:57 +00:00
; scx
; palettes
; bg map
; tiles
; joypad
;
2013-02-05 20:33:57 +00:00
ld a, [hROMBank]
2015-01-20 05:31:29 +00:00
ld [hROMBankBackup], a
2013-08-19 22:46:56 +00:00
ld a, [hSCX]
2013-02-20 07:46:40 +00:00
ld [rSCX], a
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
call UpdatePalsIfCGB
2015-01-20 05:31:29 +00:00
jr c, .done
2013-02-05 20:33:57 +00:00
call UpdateBGMap
call Serve2bppRequest
2015-01-20 05:31:29 +00:00
.done
2013-02-05 20:33:57 +00:00
xor a
2018-01-23 22:39:09 +00:00
ld [wVBlankOccurred], a
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
call Joypad
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
xor a
2013-02-20 07:46:40 +00:00
ld [rIF], a
2013-02-05 20:33:57 +00:00
ld a, %10 ; lcd stat
2013-02-20 07:46:40 +00:00
ld [rIE], a
2015-01-20 05:31:29 +00:00
; request lcd stat
2013-02-20 07:46:40 +00:00
ld [rIF], a
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
ei
ld a, BANK(_UpdateSound)
2015-01-20 05:31:29 +00:00
rst Bankswitch
call _UpdateSound
2015-01-20 05:31:29 +00:00
ld a, [hROMBankBackup]
2013-02-05 20:33:57 +00:00
rst Bankswitch
di
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
xor a
2013-02-20 07:46:40 +00:00
ld [rIF], a
2015-01-20 05:31:29 +00:00
; enable ints besides joypad
2013-02-05 20:33:57 +00:00
ld a, %1111 ; serial timer lcdstat vblank
2013-02-20 07:46:40 +00:00
ld [rIE], a
2013-02-05 20:33:57 +00:00
ret
2018-06-24 14:09:41 +00:00
VBlank6::
2013-02-05 20:33:57 +00:00
; palettes
; tiles
; dma transfer
; sound
ld a, [hROMBank]
2015-01-20 05:31:29 +00:00
ld [hROMBankBackup], a
; inc frame counter
ld hl, hVBlankCounter
2013-02-05 20:33:57 +00:00
inc [hl]
2015-01-20 05:31:29 +00:00
2013-02-05 20:33:57 +00:00
call UpdateCGBPals
2015-01-20 05:31:29 +00:00
jr c, .done
call Serve2bppRequest
call Serve1bppRequest
2013-02-05 20:33:57 +00:00
call DMATransfer
2015-01-20 05:31:29 +00:00
.done
2013-02-05 20:33:57 +00:00
xor a
2018-01-23 22:39:09 +00:00
ld [wVBlankOccurred], a
2015-01-20 05:31:29 +00:00
ld a, BANK(_UpdateSound)
2015-01-20 05:31:29 +00:00
rst Bankswitch
call _UpdateSound
2015-01-20 05:31:29 +00:00
ld a, [hROMBankBackup]
2013-02-05 20:33:57 +00:00
rst Bankswitch
ret