mirror of
https://github.com/thornAvery/kep-hack.git
synced 2025-11-14 09:06:41 +13:00
add V-blank handler and some associated functions, replace some addresses with labels, fix rWX and rWY
hg-commit-id: 2eaa734dd9dd
This commit is contained in:
parent
4f17919fba
commit
a4fe74fa23
|
|
@ -89,6 +89,9 @@ TX_RAM: MACRO
|
||||||
|
|
||||||
; wram locations
|
; wram locations
|
||||||
|
|
||||||
|
; the tiles of the row or column to be redrawn by RedrawExposedScreenEdge
|
||||||
|
W_SCREENEDGETILES EQU $CBFC
|
||||||
|
|
||||||
; coordinates of the position of the cursor for the top menu item (id 0)
|
; coordinates of the position of the cursor for the top menu item (id 0)
|
||||||
W_TOPMENUITEMY EQU $CC24
|
W_TOPMENUITEMY EQU $CC24
|
||||||
W_TOPMENUITEMX EQU $CC25
|
W_TOPMENUITEMX EQU $CC25
|
||||||
|
|
@ -742,20 +745,92 @@ H_DIVISOR EQU $FF99 ; 1 byte
|
||||||
H_QUOTIENT EQU $FF95 ; 4 bytes, big endian order
|
H_QUOTIENT EQU $FF95 ; 4 bytes, big endian order
|
||||||
H_REMAINDER EQU $FF99 ; 1 byte
|
H_REMAINDER EQU $FF99 ; 1 byte
|
||||||
|
|
||||||
|
; is automatic background transfer during V-blank enabled?
|
||||||
|
; if nonzero, yes
|
||||||
|
; if zero, no
|
||||||
|
H_AUTOBGTRANSFERENABLED EQU $FFBA
|
||||||
|
|
||||||
|
TRANSFERTOP EQU 0
|
||||||
|
TRANSFERMIDDLE EQU 1
|
||||||
|
TRANSFERBOTTOM EQU 2
|
||||||
|
|
||||||
|
; 00 = top third of background
|
||||||
|
; 01 = middle third of background
|
||||||
|
; 02 = bottom third of background
|
||||||
|
H_AUTOBGTRANSFERPORTION EQU $FFBB
|
||||||
|
|
||||||
|
; the destination address of the automatic background transfer
|
||||||
|
H_AUTOBGTRANSFERDEST EQU $FFBC ; 2 bytes
|
||||||
|
|
||||||
|
; temporary storage for stack pointer during memory transfers that use pop
|
||||||
|
; to increase speed
|
||||||
|
H_SPTEMP EQU $FFBF ; 2 bytes
|
||||||
|
|
||||||
|
; source address for VBlankCopyBgMap function
|
||||||
|
; the first byte doubles as the byte that enabled the transfer.
|
||||||
|
; if it is 0, the transfer is disabled
|
||||||
|
; if it is not 0, the transfer is enabled
|
||||||
|
; this means that XX00 is not a valid source address
|
||||||
|
H_VBCOPYBGSRC EQU $FFC1 ; 2 bytes
|
||||||
|
|
||||||
|
; destination address for VBlankCopyBgMap function
|
||||||
|
H_VBCOPYBGDEST EQU $FFC3 ; 2 bytes
|
||||||
|
|
||||||
|
; number of rows for VBlankCopyBgMap to copy
|
||||||
|
H_VBCOPYBGNUMROWS EQU $FFC5
|
||||||
|
|
||||||
|
; size of VBlankCopy transfer in 8-byte units
|
||||||
|
H_VBCOPYSIZE EQU $FFC6
|
||||||
|
|
||||||
|
; source address for VBlankCopy function
|
||||||
|
H_VBCOPYSRC EQU $FFC7
|
||||||
|
|
||||||
|
; destination address for VBlankCopy function
|
||||||
|
H_VBCOPYDEST EQU $FFC9
|
||||||
|
|
||||||
|
; size of source data for VBlankCopyDouble in 4-byte units
|
||||||
|
H_VBCOPYDOUBLESIZE EQU $FFCB
|
||||||
|
|
||||||
|
; source address for VBlankCopyDouble function
|
||||||
|
H_VBCOPYDOUBLESRC EQU $FFCC
|
||||||
|
|
||||||
|
; destination address for VBlankCopyDouble function
|
||||||
|
H_VBCOPYDOUBLEDEST EQU $FFCE
|
||||||
|
|
||||||
|
; controls whether a row or column of 2x2 tile blocks is redrawn in V-blank
|
||||||
|
; 00 = no redraw
|
||||||
|
; 01 = redraw column
|
||||||
|
; 02 = redraw row
|
||||||
|
H_SCREENEDGEREDRAW EQU $FFD0
|
||||||
|
|
||||||
|
REDRAWCOL EQU 1
|
||||||
|
REDRAWROW EQU 2
|
||||||
|
|
||||||
|
H_SCREENEDGEREDRAWADDR EQU $FFD1
|
||||||
|
|
||||||
H_RAND1 EQU $FFD3
|
H_RAND1 EQU $FFD3
|
||||||
H_RAND2 EQU $FFD4
|
H_RAND2 EQU $FFD4
|
||||||
|
|
||||||
|
H_FRAMECOUNTER EQU $FFD5 ; decremented every V-blank (used for delays)
|
||||||
|
|
||||||
|
; V-blank sets this to 0 each time it runs.
|
||||||
|
; So, by setting it to a nonzero value and waiting for it to become 0 again,
|
||||||
|
; you can detect that the V-blank handler has run since then.
|
||||||
|
H_VBLANKOCCURRED EQU $FFD6
|
||||||
|
|
||||||
H_WHOSETURN EQU $FFF3 ; 0 on player’s turn, 1 on enemy’s turn
|
H_WHOSETURN EQU $FFF3 ; 0 on player’s turn, 1 on enemy’s turn
|
||||||
|
|
||||||
; hardware registers, from the pandocs http://nocash.emubase.de/pandocs.htm
|
; hardware registers, from the pandocs http://nocash.emubase.de/pandocs.htm
|
||||||
rJOYP EQU $FF00
|
rJOYP EQU $FF00
|
||||||
rDIV EQU $FF04
|
rDIV EQU $FF04
|
||||||
rLCDC EQU $FF40
|
rLCDC EQU $FF40
|
||||||
|
rSCY EQU $FF42
|
||||||
|
rSCX EQU $FF43
|
||||||
rBGP EQU $FF47
|
rBGP EQU $FF47
|
||||||
rOBP0 EQU $FF48
|
rOBP0 EQU $FF48
|
||||||
rOBP1 EQU $FF49
|
rOBP1 EQU $FF49
|
||||||
rWX EQU $FF4A
|
rWY EQU $FF4A
|
||||||
rWY EQU $FF4B
|
rWX EQU $FF4B
|
||||||
rIE EQU $FFFF
|
rIE EQU $FFFF
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
645
main.asm
645
main.asm
|
|
@ -20,7 +20,7 @@ SECTION "rst38",HOME[$38]
|
||||||
|
|
||||||
; interrupts
|
; interrupts
|
||||||
SECTION "vblank",HOME[$40]
|
SECTION "vblank",HOME[$40]
|
||||||
jp $2024
|
jp VBlankHandler
|
||||||
SECTION "lcdc",HOME[$48]
|
SECTION "lcdc",HOME[$48]
|
||||||
db $FF
|
db $FF
|
||||||
SECTION "timer",HOME[$50]
|
SECTION "timer",HOME[$50]
|
||||||
|
|
@ -2139,18 +2139,19 @@ MoveTileBlockMapPointerNorth: ; E85
|
||||||
; the portion of the map that was newly exposed due to the player's movement
|
; the portion of the map that was newly exposed due to the player's movement
|
||||||
|
|
||||||
ScheduleNorthRowRedraw: ; E91
|
ScheduleNorthRowRedraw: ; E91
|
||||||
ld hl,$c3a0
|
FuncCoord 0,0
|
||||||
|
ld hl,Coord
|
||||||
call ScheduleRowRedrawHelper
|
call ScheduleRowRedrawHelper
|
||||||
ld a,[$d526]
|
ld a,[$d526]
|
||||||
ld [$ffd1],a
|
ld [H_SCREENEDGEREDRAWADDR],a
|
||||||
ld a,[$d527]
|
ld a,[$d527]
|
||||||
ld [$ffd2],a
|
ld [H_SCREENEDGEREDRAWADDR + 1],a
|
||||||
ld a,$02
|
ld a,REDRAWROW
|
||||||
ld [$ffd0],a
|
ld [H_SCREENEDGEREDRAW],a
|
||||||
ret
|
ret
|
||||||
|
|
||||||
ScheduleRowRedrawHelper: ; EA6
|
ScheduleRowRedrawHelper: ; EA6
|
||||||
ld de,$cbfc
|
ld de,W_SCREENEDGETILES
|
||||||
ld c,$28
|
ld c,$28
|
||||||
.loop\@
|
.loop\@
|
||||||
ld a,[hli]
|
ld a,[hli]
|
||||||
|
|
@ -2161,8 +2162,9 @@ ScheduleRowRedrawHelper: ; EA6
|
||||||
ret
|
ret
|
||||||
|
|
||||||
ScheduleSouthRowRedraw: ; EB2
|
ScheduleSouthRowRedraw: ; EB2
|
||||||
ld hl,$c4e0
|
FuncCoord 0,16
|
||||||
call $0ea6
|
ld hl,Coord
|
||||||
|
call ScheduleRowRedrawHelper
|
||||||
ld a,[$d526]
|
ld a,[$d526]
|
||||||
ld l,a
|
ld l,a
|
||||||
ld a,[$d527]
|
ld a,[$d527]
|
||||||
|
|
@ -2172,33 +2174,34 @@ ScheduleSouthRowRedraw: ; EB2
|
||||||
ld a,h
|
ld a,h
|
||||||
and a,$03
|
and a,$03
|
||||||
or a,$98
|
or a,$98
|
||||||
ld [$ffd2],a
|
ld [H_SCREENEDGEREDRAWADDR + 1],a
|
||||||
ld a,l
|
ld a,l
|
||||||
ld [$ffd1],a
|
ld [H_SCREENEDGEREDRAWADDR],a
|
||||||
ld a,$02
|
ld a,REDRAWROW
|
||||||
ld [$ffd0],a
|
ld [H_SCREENEDGEREDRAW],a
|
||||||
ret
|
ret
|
||||||
|
|
||||||
ScheduleEastColumnRedraw: ; ED3
|
ScheduleEastColumnRedraw: ; ED3
|
||||||
ld hl,$c3b2
|
FuncCoord 18,0
|
||||||
|
ld hl,Coord
|
||||||
call ScheduleColumnRedrawHelper
|
call ScheduleColumnRedrawHelper
|
||||||
ld a,[$d526]
|
ld a,[$d526]
|
||||||
ld c,a
|
ld c,a
|
||||||
and a,$e0
|
and a,$e0
|
||||||
ld b,a
|
ld b,a
|
||||||
ld a,c
|
ld a,c
|
||||||
add a,$12
|
add a,18
|
||||||
and a,$1f
|
and a,$1f
|
||||||
or b
|
or b
|
||||||
ld [$ffd1],a
|
ld [H_SCREENEDGEREDRAWADDR],a
|
||||||
ld a,[$d527]
|
ld a,[$d527]
|
||||||
ld [$ffd2],a
|
ld [H_SCREENEDGEREDRAWADDR + 1],a
|
||||||
ld a,$01
|
ld a,REDRAWCOL
|
||||||
ld [$ffd0],a
|
ld [H_SCREENEDGEREDRAW],a
|
||||||
ret
|
ret
|
||||||
|
|
||||||
ScheduleColumnRedrawHelper: ; EF2
|
ScheduleColumnRedrawHelper: ; EF2
|
||||||
ld de,$cbfc
|
ld de,W_SCREENEDGETILES
|
||||||
ld c,$12
|
ld c,$12
|
||||||
.loop\@
|
.loop\@
|
||||||
ld a,[hli]
|
ld a,[hli]
|
||||||
|
|
@ -2207,7 +2210,7 @@ ScheduleColumnRedrawHelper: ; EF2
|
||||||
ld a,[hl]
|
ld a,[hl]
|
||||||
ld [de],a
|
ld [de],a
|
||||||
inc de
|
inc de
|
||||||
ld a,$13
|
ld a,19
|
||||||
add l
|
add l
|
||||||
ld l,a
|
ld l,a
|
||||||
jr nc,.noCarry\@
|
jr nc,.noCarry\@
|
||||||
|
|
@ -2218,14 +2221,15 @@ ScheduleColumnRedrawHelper: ; EF2
|
||||||
ret
|
ret
|
||||||
|
|
||||||
ScheduleWestColumnRedraw: ; F08
|
ScheduleWestColumnRedraw: ; F08
|
||||||
ld hl,$c3a0
|
FuncCoord 0,0
|
||||||
|
ld hl,Coord
|
||||||
call ScheduleColumnRedrawHelper
|
call ScheduleColumnRedrawHelper
|
||||||
ld a,[$d526]
|
ld a,[$d526]
|
||||||
ld [$ffd1],a
|
ld [H_SCREENEDGEREDRAWADDR],a
|
||||||
ld a,[$d527]
|
ld a,[$d527]
|
||||||
ld [$ffd2],a
|
ld [H_SCREENEDGEREDRAWADDR + 1],a
|
||||||
ld a,$01
|
ld a,REDRAWCOL
|
||||||
ld [$ffd0],a
|
ld [H_SCREENEDGEREDRAW],a
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; function to write the tiles that make up a tile block to memory
|
; function to write the tiles that make up a tile block to memory
|
||||||
|
|
@ -3705,7 +3709,469 @@ ClearBgMap: ; 1CF0
|
||||||
jr nz,.loop\@
|
jr nz,.loop\@
|
||||||
ret
|
ret
|
||||||
|
|
||||||
INCBIN "baserom.gbc",$1D01,$1F54 - $1D01
|
; When the player takes a step, a row or column of 2x2 tile blocks at the edge
|
||||||
|
; of the screen toward which they moved is exposed and has to be redrawn.
|
||||||
|
; This function does the redrawing.
|
||||||
|
RedrawExposedScreenEdge: ; 1D01
|
||||||
|
ld a,[H_SCREENEDGEREDRAW]
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
ld b,a
|
||||||
|
xor a
|
||||||
|
ld [H_SCREENEDGEREDRAW],a
|
||||||
|
dec b
|
||||||
|
jr nz,.redrawRow\@
|
||||||
|
.redrawColumn\@
|
||||||
|
ld hl,W_SCREENEDGETILES
|
||||||
|
ld a,[H_SCREENEDGEREDRAWADDR]
|
||||||
|
ld e,a
|
||||||
|
ld a,[H_SCREENEDGEREDRAWADDR + 1]
|
||||||
|
ld d,a
|
||||||
|
ld c,18 ; screen height
|
||||||
|
.loop1\@
|
||||||
|
ld a,[hli]
|
||||||
|
ld [de],a
|
||||||
|
inc de
|
||||||
|
ld a,[hli]
|
||||||
|
ld [de],a
|
||||||
|
ld a,31
|
||||||
|
add e
|
||||||
|
ld e,a
|
||||||
|
jr nc,.noCarry\@
|
||||||
|
inc d
|
||||||
|
.noCarry\@
|
||||||
|
; the following 4 lines wrap us from bottom to top if necessary
|
||||||
|
ld a,d
|
||||||
|
and a,$03
|
||||||
|
or a,$98
|
||||||
|
ld d,a
|
||||||
|
dec c
|
||||||
|
jr nz,.loop1\@
|
||||||
|
xor a
|
||||||
|
ld [H_SCREENEDGEREDRAW],a
|
||||||
|
ret
|
||||||
|
.redrawRow\@
|
||||||
|
ld hl,W_SCREENEDGETILES
|
||||||
|
ld a,[H_SCREENEDGEREDRAWADDR]
|
||||||
|
ld e,a
|
||||||
|
ld a,[H_SCREENEDGEREDRAWADDR + 1]
|
||||||
|
ld d,a
|
||||||
|
push de
|
||||||
|
call .drawHalf\@ ; draw upper half
|
||||||
|
pop de
|
||||||
|
ld a,32 ; width of VRAM background map
|
||||||
|
add e
|
||||||
|
ld e,a
|
||||||
|
; draw lower half
|
||||||
|
.drawHalf\@
|
||||||
|
ld c,10
|
||||||
|
.loop2\@
|
||||||
|
ld a,[hli]
|
||||||
|
ld [de],a
|
||||||
|
inc de
|
||||||
|
ld a,[hli]
|
||||||
|
ld [de],a
|
||||||
|
ld a,e
|
||||||
|
inc a
|
||||||
|
; the following 6 lines wrap us from the right edge to the left edge if necessary
|
||||||
|
and a,$1f
|
||||||
|
ld b,a
|
||||||
|
ld a,e
|
||||||
|
and a,$e0
|
||||||
|
or b
|
||||||
|
ld e,a
|
||||||
|
dec c
|
||||||
|
jr nz,.loop2\@
|
||||||
|
ret
|
||||||
|
|
||||||
|
; This function automatically transfers tile number data from the tile map at
|
||||||
|
; C3A0 to VRAM during V-blank. Note that it only transfers one third of the
|
||||||
|
; background per V-blank. It cycles through which third it draws.
|
||||||
|
; This transfer is turned off when walking around the map, but is turned
|
||||||
|
; on when talking to sprites, battling, using menus, etc. This is because
|
||||||
|
; the above function, RedrawExposedScreenEdge, is used when walking to
|
||||||
|
; improve efficiency.
|
||||||
|
AutoBgMapTransfer: ; 1D57
|
||||||
|
ld a,[H_AUTOBGTRANSFERENABLED]
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
ld hl,[sp + 0]
|
||||||
|
ld a,h
|
||||||
|
ld [H_SPTEMP],a
|
||||||
|
ld a,l
|
||||||
|
ld [H_SPTEMP + 1],a ; save stack pinter
|
||||||
|
ld a,[H_AUTOBGTRANSFERPORTION]
|
||||||
|
and a
|
||||||
|
jr z,.transferTopThird\@
|
||||||
|
dec a
|
||||||
|
jr z,.transferMiddleThird\@
|
||||||
|
.transferBottomThird\@
|
||||||
|
FuncCoord 0,12
|
||||||
|
ld hl,Coord
|
||||||
|
ld sp,hl
|
||||||
|
ld a,[H_AUTOBGTRANSFERDEST + 1]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_AUTOBGTRANSFERDEST]
|
||||||
|
ld l,a
|
||||||
|
ld de,(12 * 32)
|
||||||
|
add hl,de
|
||||||
|
xor a ; TRANSFERTOP
|
||||||
|
jr .doTransfer\@
|
||||||
|
.transferTopThird\@
|
||||||
|
FuncCoord 0,0
|
||||||
|
ld hl,Coord
|
||||||
|
ld sp,hl
|
||||||
|
ld a,[H_AUTOBGTRANSFERDEST + 1]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_AUTOBGTRANSFERDEST]
|
||||||
|
ld l,a
|
||||||
|
ld a,TRANSFERMIDDLE
|
||||||
|
jr .doTransfer\@
|
||||||
|
.transferMiddleThird\@
|
||||||
|
FuncCoord 0,6
|
||||||
|
ld hl,Coord
|
||||||
|
ld sp,hl
|
||||||
|
ld a,[H_AUTOBGTRANSFERDEST + 1]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_AUTOBGTRANSFERDEST]
|
||||||
|
ld l,a
|
||||||
|
ld de,(6 * 32)
|
||||||
|
add hl,de
|
||||||
|
ld a,TRANSFERBOTTOM
|
||||||
|
.doTransfer\@
|
||||||
|
ld [H_AUTOBGTRANSFERPORTION],a ; store next portion
|
||||||
|
ld b,6
|
||||||
|
|
||||||
|
; unrolled loop and using pop for speed
|
||||||
|
TransferBgRows: ; 1D9E
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
ld a,13
|
||||||
|
add l
|
||||||
|
ld l,a
|
||||||
|
jr nc,.noCarry\@
|
||||||
|
inc h
|
||||||
|
.noCarry\@
|
||||||
|
dec b
|
||||||
|
jr nz,TransferBgRows
|
||||||
|
ld a,[H_SPTEMP]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_SPTEMP + 1]
|
||||||
|
ld l,a
|
||||||
|
ld sp,hl ; restore stack pointer
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Copies [H_VBCOPYBGNUMROWS] rows from H_VBCOPYBGSRC to H_VBCOPYBGDEST.
|
||||||
|
; If H_VBCOPYBGSRC is XX00, the transfer is disabled.
|
||||||
|
VBlankCopyBgMap: ; 1DE1
|
||||||
|
ld a,[H_VBCOPYBGSRC] ; doubles as enabling byte
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
ld hl,[sp + 0]
|
||||||
|
ld a,h
|
||||||
|
ld [H_SPTEMP],a
|
||||||
|
ld a,l
|
||||||
|
ld [H_SPTEMP + 1],a ; save stack pointer
|
||||||
|
ld a,[H_VBCOPYBGSRC]
|
||||||
|
ld l,a
|
||||||
|
ld a,[H_VBCOPYBGSRC + 1]
|
||||||
|
ld h,a
|
||||||
|
ld sp,hl
|
||||||
|
ld a,[H_VBCOPYBGDEST]
|
||||||
|
ld l,a
|
||||||
|
ld a,[H_VBCOPYBGDEST + 1]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_VBCOPYBGNUMROWS]
|
||||||
|
ld b,a
|
||||||
|
xor a
|
||||||
|
ld [H_VBCOPYBGSRC],a ; disable transfer so it doesn't continue next V-blank
|
||||||
|
jr TransferBgRows
|
||||||
|
|
||||||
|
; This function copies ([H_VBCOPYDOUBLESIZE] * 4) source bytes
|
||||||
|
; from H_VBCOPYDOUBLESRC to H_VBCOPYDOUBLEDEST.
|
||||||
|
; It copies each source byte to the destination twice (next to each other).
|
||||||
|
; The function updates the source and destination addresses, so the transfer
|
||||||
|
; can be continued easily by repeatingly calling this function.
|
||||||
|
VBlankCopyDouble: ; 1E02
|
||||||
|
ld a,[H_VBCOPYDOUBLESIZE]
|
||||||
|
and a ; are there any bytes to copy?
|
||||||
|
ret z
|
||||||
|
ld hl,[sp + 0]
|
||||||
|
ld a,h
|
||||||
|
ld [H_SPTEMP],a
|
||||||
|
ld a,l
|
||||||
|
ld [H_SPTEMP + 1],a ; save stack pointer
|
||||||
|
ld a,[H_VBCOPYDOUBLESRC]
|
||||||
|
ld l,a
|
||||||
|
ld a,[H_VBCOPYDOUBLESRC + 1]
|
||||||
|
ld h,a
|
||||||
|
ld sp,hl
|
||||||
|
ld a,[H_VBCOPYDOUBLEDEST]
|
||||||
|
ld l,a
|
||||||
|
ld a,[H_VBCOPYDOUBLEDEST + 1]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_VBCOPYDOUBLESIZE]
|
||||||
|
ld b,a
|
||||||
|
xor a
|
||||||
|
ld [H_VBCOPYDOUBLESIZE],a ; disable transfer so it doesn't continue next V-blank
|
||||||
|
.loop\@
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc hl
|
||||||
|
dec b
|
||||||
|
jr nz,.loop\@
|
||||||
|
ld a,l
|
||||||
|
ld [H_VBCOPYDOUBLEDEST],a
|
||||||
|
ld a,h
|
||||||
|
ld [H_VBCOPYDOUBLEDEST + 1],a ; update destination address
|
||||||
|
ld hl,[sp + 0]
|
||||||
|
ld a,l
|
||||||
|
ld [H_VBCOPYDOUBLESRC],a
|
||||||
|
ld a,h
|
||||||
|
ld [H_VBCOPYDOUBLESRC + 1],a ; update source address
|
||||||
|
ld a,[H_SPTEMP]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_SPTEMP + 1]
|
||||||
|
ld l,a
|
||||||
|
ld sp,hl ; restore stack pointer
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Copies ([H_VBCOPYSIZE] * 8) bytes from H_VBCOPYSRC to H_VBCOPYDEST.
|
||||||
|
; The function updates the source and destination addresses, so the transfer
|
||||||
|
; can be continued easily by repeatingly calling this function.
|
||||||
|
VBlankCopy: ; 1E5E
|
||||||
|
ld a,[H_VBCOPYSIZE]
|
||||||
|
and a ; are there any bytes to copy?
|
||||||
|
ret z
|
||||||
|
ld hl,[sp + 0]
|
||||||
|
ld a,h
|
||||||
|
ld [H_SPTEMP],a
|
||||||
|
ld a,l
|
||||||
|
ld [H_SPTEMP + 1],a ; save stack pointer
|
||||||
|
ld a,[H_VBCOPYSRC]
|
||||||
|
ld l,a
|
||||||
|
ld a,[H_VBCOPYSRC + 1]
|
||||||
|
ld h,a
|
||||||
|
ld sp,hl
|
||||||
|
ld a,[H_VBCOPYDEST]
|
||||||
|
ld l,a
|
||||||
|
ld a,[H_VBCOPYDEST + 1]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_VBCOPYSIZE]
|
||||||
|
ld b,a
|
||||||
|
xor a
|
||||||
|
ld [H_VBCOPYSIZE],a ; disable transfer so it doesn't continue next V-blank
|
||||||
|
.loop\@
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc l
|
||||||
|
pop de
|
||||||
|
ld [hl],e
|
||||||
|
inc l
|
||||||
|
ld [hl],d
|
||||||
|
inc hl
|
||||||
|
dec b
|
||||||
|
jr nz,.loop\@
|
||||||
|
ld a,l
|
||||||
|
ld [H_VBCOPYDEST],a
|
||||||
|
ld a,h
|
||||||
|
ld [H_VBCOPYDEST + 1],a
|
||||||
|
ld hl,[sp + 0]
|
||||||
|
ld a,l
|
||||||
|
ld [H_VBCOPYSRC],a
|
||||||
|
ld a,h
|
||||||
|
ld [H_VBCOPYSRC + 1],a
|
||||||
|
ld a,[H_SPTEMP]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_SPTEMP + 1]
|
||||||
|
ld l,a
|
||||||
|
ld sp,hl ; restore stack pointer
|
||||||
|
ret
|
||||||
|
|
||||||
|
; This function updates the moving water and flower background tiles.
|
||||||
|
UpdateMovingBgTiles: ; 1EBE
|
||||||
|
ld a,[$ffd7]
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
ld a,[$ffd8]
|
||||||
|
inc a
|
||||||
|
ld [$ffd8],a
|
||||||
|
cp a,20
|
||||||
|
ret c
|
||||||
|
cp a,21
|
||||||
|
jr z,.updateFlowerTile\@
|
||||||
|
ld hl,$9140 ; water tile pattern VRAM location
|
||||||
|
ld c,16 ; number of bytes in a tile pattern
|
||||||
|
ld a,[$d085]
|
||||||
|
inc a
|
||||||
|
and a,$07
|
||||||
|
ld [$d085],a
|
||||||
|
and a,$04
|
||||||
|
jr nz,.rotateWaterLeftLoop\@
|
||||||
|
.rotateWaterRightloop\@
|
||||||
|
ld a,[hl]
|
||||||
|
rrca
|
||||||
|
ld [hli],a
|
||||||
|
dec c
|
||||||
|
jr nz,.rotateWaterRightloop\@
|
||||||
|
jr .done\@
|
||||||
|
.rotateWaterLeftLoop\@
|
||||||
|
ld a,[hl]
|
||||||
|
rlca
|
||||||
|
ld [hli],a
|
||||||
|
dec c
|
||||||
|
jr nz,.rotateWaterLeftLoop\@
|
||||||
|
.done\@
|
||||||
|
ld a,[$ffd7]
|
||||||
|
rrca
|
||||||
|
ret nc
|
||||||
|
xor a
|
||||||
|
ld [$ffd8],a
|
||||||
|
ret
|
||||||
|
.updateFlowerTile\@
|
||||||
|
xor a
|
||||||
|
ld [$ffd8],a
|
||||||
|
ld a,[$d085]
|
||||||
|
and a,$03
|
||||||
|
cp a,2
|
||||||
|
ld hl,FlowerTilePattern1
|
||||||
|
jr c,.writeTilePatternToVram\@
|
||||||
|
ld hl,FlowerTilePattern2
|
||||||
|
jr z,.writeTilePatternToVram\@
|
||||||
|
ld hl,FlowerTilePattern3
|
||||||
|
.writeTilePatternToVram\@
|
||||||
|
ld de,$9030 ; flower tile pattern VRAM location
|
||||||
|
ld c,16 ; number of bytes in a tile pattern
|
||||||
|
.flowerTileLoop\@
|
||||||
|
ld a,[hli]
|
||||||
|
ld [de],a
|
||||||
|
inc de
|
||||||
|
dec c
|
||||||
|
jr nz,.flowerTileLoop\@
|
||||||
|
ret
|
||||||
|
|
||||||
|
FlowerTilePattern1: ; 1F19
|
||||||
|
INCBIN "baserom.gbc",$1f19,16
|
||||||
|
|
||||||
|
FlowerTilePattern2: ; 1F29
|
||||||
|
INCBIN "baserom.gbc",$1f29,16
|
||||||
|
|
||||||
|
FlowerTilePattern3: ; 1F39
|
||||||
|
INCBIN "baserom.gbc",$1f39,16
|
||||||
|
|
||||||
|
INCBIN "baserom.gbc",$1F49,$1F54 - $1F49
|
||||||
|
|
||||||
; initialization code
|
; initialization code
|
||||||
; explanation for %11100011 (value stored in rLCDC)
|
; explanation for %11100011 (value stored in rLCDC)
|
||||||
|
|
@ -3766,9 +4232,9 @@ InitGame: ; 1F54
|
||||||
ld [rIE],a
|
ld [rIE],a
|
||||||
ld a,$90 ; put the window off the screen
|
ld a,$90 ; put the window off the screen
|
||||||
ld [$ffb0],a
|
ld [$ffb0],a
|
||||||
ld [rWX],a
|
|
||||||
ld a,$07
|
|
||||||
ld [rWY],a
|
ld [rWY],a
|
||||||
|
ld a,$07
|
||||||
|
ld [rWX],a
|
||||||
ld a,$ff
|
ld a,$ff
|
||||||
ld [$ffaa],a
|
ld [$ffaa],a
|
||||||
ld h,$98
|
ld h,$98
|
||||||
|
|
@ -3809,17 +4275,92 @@ ZeroVram: ; 2004
|
||||||
xor a
|
xor a
|
||||||
jp $36e0
|
jp $36e0
|
||||||
|
|
||||||
INCBIN "baserom.gbc",$200E,$20AF - $200E
|
INCBIN "baserom.gbc",$200E,$2024 - $200E
|
||||||
|
|
||||||
|
VBlankHandler: ; 2024
|
||||||
|
push af
|
||||||
|
push bc
|
||||||
|
push de
|
||||||
|
push hl
|
||||||
|
ld a,[$ffb8] ; current ROM bank
|
||||||
|
ld [$d122],a
|
||||||
|
ld a,[$ffae]
|
||||||
|
ld [rSCX],a
|
||||||
|
ld a,[$ffaf]
|
||||||
|
ld [rSCY],a
|
||||||
|
ld a,[$d0a0]
|
||||||
|
and a
|
||||||
|
jr nz,.doVramTransfers\@
|
||||||
|
ld a,[$ffb0]
|
||||||
|
ld [rWY],a
|
||||||
|
.doVramTransfers\@
|
||||||
|
call AutoBgMapTransfer
|
||||||
|
call VBlankCopyBgMap
|
||||||
|
call RedrawExposedScreenEdge
|
||||||
|
call VBlankCopy
|
||||||
|
call VBlankCopyDouble
|
||||||
|
call UpdateMovingBgTiles
|
||||||
|
call $ff80 ; OAM DMA
|
||||||
|
ld a,$01
|
||||||
|
ld [$ffb8],a
|
||||||
|
ld [$2000],a
|
||||||
|
call $4b0f ; update OAM buffer with current sprite data
|
||||||
|
call GenRandom
|
||||||
|
ld a,[H_VBLANKOCCURRED]
|
||||||
|
and a
|
||||||
|
jr z,.next\@
|
||||||
|
xor a
|
||||||
|
ld [H_VBLANKOCCURRED],a
|
||||||
|
.next\@
|
||||||
|
ld a,[H_FRAMECOUNTER]
|
||||||
|
and a
|
||||||
|
jr z,.handleMusic\@
|
||||||
|
dec a
|
||||||
|
ld [H_FRAMECOUNTER],a
|
||||||
|
.handleMusic\@
|
||||||
|
call $28cb
|
||||||
|
ld a,[$c0ef] ; music ROM bank
|
||||||
|
ld [$ffb8],a
|
||||||
|
ld [$2000],a
|
||||||
|
cp a,$02
|
||||||
|
jr nz,.checkIfBank08\@
|
||||||
|
.bank02\@
|
||||||
|
call $5103
|
||||||
|
jr .afterMusic\@
|
||||||
|
.checkIfBank08\@
|
||||||
|
cp a,$08
|
||||||
|
jr nz,.bank1F\@
|
||||||
|
.bank08\@
|
||||||
|
call $536e
|
||||||
|
call $5879
|
||||||
|
jr .afterMusic\@
|
||||||
|
.bank1F\@
|
||||||
|
call $5177
|
||||||
|
.afterMusic\@
|
||||||
|
ld b,$06
|
||||||
|
ld hl,$4dee
|
||||||
|
call Bankswitch ; keep track of time played
|
||||||
|
ld a,[$fff9]
|
||||||
|
and a
|
||||||
|
call z,ReadJoypadRegister
|
||||||
|
ld a,[$d122]
|
||||||
|
ld [$ffb8],a
|
||||||
|
ld [$2000],a
|
||||||
|
pop hl
|
||||||
|
pop de
|
||||||
|
pop bc
|
||||||
|
pop af
|
||||||
|
reti
|
||||||
|
|
||||||
DelayFrame: ; 20AF
|
DelayFrame: ; 20AF
|
||||||
; delay for one frame
|
; delay for one frame
|
||||||
ld a,1
|
ld a,1
|
||||||
ld [$FFD6],a
|
ld [H_VBLANKOCCURRED],a
|
||||||
|
|
||||||
; wait for the next Vblank, halting to conserve battery
|
; wait for the next Vblank, halting to conserve battery
|
||||||
.halt\@
|
.halt\@
|
||||||
db $76 ; XXX this is a hack--rgbasm adds a nop after this instr even when ints are enabled
|
db $76 ; XXX this is a hack--rgbasm adds a nop after this instr even when ints are enabled
|
||||||
ld a,[$FFD6]
|
ld a,[H_VBLANKOCCURRED]
|
||||||
and a
|
and a
|
||||||
jr nz,.halt\@
|
jr nz,.halt\@
|
||||||
|
|
||||||
|
|
@ -4198,8 +4739,8 @@ DisplayTextID: ; 2920
|
||||||
ld a,[W_CURMAP]
|
ld a,[W_CURMAP]
|
||||||
call SwitchToMapRomBank
|
call SwitchToMapRomBank
|
||||||
.skipSwitchToMapBank\@
|
.skipSwitchToMapBank\@
|
||||||
ld a,$1e
|
ld a,30 ; half a second
|
||||||
ld [$ffd5],a ; joypad poll timer
|
ld [H_FRAMECOUNTER],a ; used as joypad poll timer
|
||||||
ld hl,W_MAPTEXTPTR
|
ld hl,W_MAPTEXTPTR
|
||||||
ld a,[hli]
|
ld a,[hli]
|
||||||
ld h,[hl]
|
ld h,[hl]
|
||||||
|
|
@ -4796,10 +5337,10 @@ GetJoypadStateLowSensitivity: ; 3831
|
||||||
jr z,.noNewlyPressedButtons\@
|
jr z,.noNewlyPressedButtons\@
|
||||||
.newlyPressedButtons\@
|
.newlyPressedButtons\@
|
||||||
ld a,30 ; half a second delay
|
ld a,30 ; half a second delay
|
||||||
ld [$ffd5],a ; frame counter
|
ld [H_FRAMECOUNTER],a
|
||||||
ret
|
ret
|
||||||
.noNewlyPressedButtons\@
|
.noNewlyPressedButtons\@
|
||||||
ld a,[$ffd5] ; frame counter
|
ld a,[H_FRAMECOUNTER]
|
||||||
and a ; is the delay over?
|
and a ; is the delay over?
|
||||||
jr z,.delayOver\@
|
jr z,.delayOver\@
|
||||||
.delayNotOver\@
|
.delayNotOver\@
|
||||||
|
|
@ -4818,7 +5359,7 @@ GetJoypadStateLowSensitivity: ; 3831
|
||||||
ld [$ffb5],a
|
ld [$ffb5],a
|
||||||
.setShortDelay\@
|
.setShortDelay\@
|
||||||
ld a,5 ; 1/12 of a second delay
|
ld a,5 ; 1/12 of a second delay
|
||||||
ld [$ffd5],a ; frame counter
|
ld [H_FRAMECOUNTER],a
|
||||||
ret
|
ret
|
||||||
|
|
||||||
INCBIN "baserom.gbc",$3865,$38AC - $3865
|
INCBIN "baserom.gbc",$3865,$38AC - $3865
|
||||||
|
|
@ -4886,11 +5427,11 @@ PrintLetterDelay: ; 38D3
|
||||||
jr z,.waitOneFrame\@
|
jr z,.waitOneFrame\@
|
||||||
ld a,[$d355]
|
ld a,[$d355]
|
||||||
and a,$0f
|
and a,$0f
|
||||||
ld [$ffd5],a ; frame counter
|
ld [H_FRAMECOUNTER],a
|
||||||
jr .checkButtons\@
|
jr .checkButtons\@
|
||||||
.waitOneFrame\@
|
.waitOneFrame\@
|
||||||
ld a,1
|
ld a,1
|
||||||
ld [$ffd5],a ; frame counter
|
ld [H_FRAMECOUNTER],a
|
||||||
.checkButtons\@
|
.checkButtons\@
|
||||||
call GetJoypadState
|
call GetJoypadState
|
||||||
ld a,[$ffb4]
|
ld a,[$ffb4]
|
||||||
|
|
@ -4905,7 +5446,7 @@ PrintLetterDelay: ; 38D3
|
||||||
call DelayFrame
|
call DelayFrame
|
||||||
jr .done\@
|
jr .done\@
|
||||||
.buttonsNotPressed\@ ; if neither A nor B is pressed
|
.buttonsNotPressed\@ ; if neither A nor B is pressed
|
||||||
ld a,[$ffd5] ; frame counter
|
ld a,[H_FRAMECOUNTER]
|
||||||
and a
|
and a
|
||||||
jr nz,.checkButtons\@
|
jr nz,.checkButtons\@
|
||||||
.done\@
|
.done\@
|
||||||
|
|
@ -12100,7 +12641,7 @@ ItemUseBall: ; 03:5687
|
||||||
ld [H_MULTIPLICAND + 2],a
|
ld [H_MULTIPLICAND + 2],a
|
||||||
ld a,255
|
ld a,255
|
||||||
ld [H_MULTIPLIER],a
|
ld [H_MULTIPLIER],a
|
||||||
call $38ac ;Multiply: MaxHP * 255
|
call Multiply ; MaxHP * 255
|
||||||
ld a,[$cf91]
|
ld a,[$cf91]
|
||||||
cp a,GREAT_BALL
|
cp a,GREAT_BALL
|
||||||
ld a,12 ;any other BallFactor
|
ld a,12 ;any other BallFactor
|
||||||
|
|
@ -12109,7 +12650,7 @@ ItemUseBall: ; 03:5687
|
||||||
.next7\@ ;$574d
|
.next7\@ ;$574d
|
||||||
ld [H_DIVISOR],a
|
ld [H_DIVISOR],a
|
||||||
ld b,4 ;number of significant bytes
|
ld b,4 ;number of significant bytes
|
||||||
call $38b9 ;Divide
|
call Divide
|
||||||
ld hl,W_ENEMYMONCURHP
|
ld hl,W_ENEMYMONCURHP
|
||||||
ld a,[hli]
|
ld a,[hli]
|
||||||
ld b,a
|
ld b,a
|
||||||
|
|
@ -12128,7 +12669,7 @@ ItemUseBall: ; 03:5687
|
||||||
.next8\@ ;$5766
|
.next8\@ ;$5766
|
||||||
ld [H_DIVISOR],a
|
ld [H_DIVISOR],a
|
||||||
ld b,4
|
ld b,4
|
||||||
call $38b9 ; Divide: ((MaxHP * 255) / BallFactor) / (CurHP / 4)
|
call Divide ; ((MaxHP * 255) / BallFactor) / (CurHP / 4)
|
||||||
ld a,[H_QUOTIENT + 2]
|
ld a,[H_QUOTIENT + 2]
|
||||||
and a
|
and a
|
||||||
jr z,.next9\@
|
jr z,.next9\@
|
||||||
|
|
@ -12159,7 +12700,7 @@ ItemUseBall: ; 03:5687
|
||||||
ld [H_MULTIPLICAND + 2],a
|
ld [H_MULTIPLICAND + 2],a
|
||||||
ld a,100
|
ld a,100
|
||||||
ld [H_MULTIPLIER],a
|
ld [H_MULTIPLIER],a
|
||||||
call $38ac ;Multiply: CatchRate * 100
|
call Multiply ; CatchRate * 100
|
||||||
ld a,[$cf91]
|
ld a,[$cf91]
|
||||||
ld b,255
|
ld b,255
|
||||||
cp a,POKE_BALL
|
cp a,POKE_BALL
|
||||||
|
|
@ -12174,18 +12715,18 @@ ItemUseBall: ; 03:5687
|
||||||
ld a,b
|
ld a,b
|
||||||
ld [H_DIVISOR],a
|
ld [H_DIVISOR],a
|
||||||
ld b,4
|
ld b,4
|
||||||
call $38b9 ;Divide
|
call Divide
|
||||||
ld a,[H_QUOTIENT + 2]
|
ld a,[H_QUOTIENT + 2]
|
||||||
and a
|
and a
|
||||||
ld b,$63
|
ld b,$63
|
||||||
jr nz,.next12\@
|
jr nz,.next12\@
|
||||||
ld a,[$d11e]
|
ld a,[$d11e]
|
||||||
ld [H_MULTIPLIER],a
|
ld [H_MULTIPLIER],a
|
||||||
call $38ac
|
call Multiply
|
||||||
ld a,255
|
ld a,255
|
||||||
ld [H_DIVISOR],a
|
ld [H_DIVISOR],a
|
||||||
ld b,4
|
ld b,4
|
||||||
call $38b9
|
call Divide
|
||||||
ld a,[W_ENEMYMONSTATUS] ;status ailments
|
ld a,[W_ENEMYMONSTATUS] ;status ailments
|
||||||
and a
|
and a
|
||||||
jr z,.next13\@
|
jr z,.next13\@
|
||||||
|
|
@ -22723,7 +23264,7 @@ Function67CF: ; 0x3a7cf 67CF
|
||||||
ld a,[hl]
|
ld a,[hl]
|
||||||
ld [H_DIVIDEND + 1],a
|
ld [H_DIVIDEND + 1],a
|
||||||
ld b,2
|
ld b,2
|
||||||
call $38B9
|
call Divide
|
||||||
ld a,[H_QUOTIENT + 3]
|
ld a,[H_QUOTIENT + 3]
|
||||||
ld c,a
|
ld c,a
|
||||||
ld a,[H_QUOTIENT + 2]
|
ld a,[H_QUOTIENT + 2]
|
||||||
|
|
@ -26630,11 +27171,11 @@ AdjustDamageForMoveType: ; 63A5
|
||||||
ld [H_MULTIPLICAND + 1],a
|
ld [H_MULTIPLICAND + 1],a
|
||||||
ld a,[hld]
|
ld a,[hld]
|
||||||
ld [H_MULTIPLICAND + 2],a
|
ld [H_MULTIPLICAND + 2],a
|
||||||
call $38ac ; multiply
|
call Multiply
|
||||||
ld a,10
|
ld a,10
|
||||||
ld [H_DIVISOR],a
|
ld [H_DIVISOR],a
|
||||||
ld b,$04
|
ld b,$04
|
||||||
call $38b9 ; divide
|
call Divide
|
||||||
ld a,[H_QUOTIENT + 2]
|
ld a,[H_QUOTIENT + 2]
|
||||||
ld [hli],a
|
ld [hli],a
|
||||||
ld b,a
|
ld b,a
|
||||||
|
|
@ -26945,11 +27486,11 @@ CalcHitChance: ; 6624
|
||||||
pop bc
|
pop bc
|
||||||
ld a,[hli]
|
ld a,[hli]
|
||||||
ld [H_MULTIPLIER],a ; set multiplier to the numerator of the ratio
|
ld [H_MULTIPLIER],a ; set multiplier to the numerator of the ratio
|
||||||
call $38ac ; multiply
|
call Multiply
|
||||||
ld a,[hl]
|
ld a,[hl]
|
||||||
ld [H_DIVISOR],a ; set divisor to the the denominator of the ratio (the dividend is the product of the previous multiplication)
|
ld [H_DIVISOR],a ; set divisor to the the denominator of the ratio (the dividend is the product of the previous multiplication)
|
||||||
ld b,$04 ; number of significant bytes in the dividend
|
ld b,$04 ; number of significant bytes in the dividend
|
||||||
call $38b9 ; divide
|
call Divide
|
||||||
ld a,[H_QUOTIENT + 3]
|
ld a,[H_QUOTIENT + 3]
|
||||||
ld b,a
|
ld b,a
|
||||||
ld a,[H_QUOTIENT + 2]
|
ld a,[H_QUOTIENT + 2]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue