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:
YamaArashi 2012-01-26 19:26:08 -08:00
parent 4f17919fba
commit a4fe74fa23
2 changed files with 670 additions and 54 deletions

View file

@ -89,6 +89,9 @@ TX_RAM: MACRO
; 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)
W_TOPMENUITEMY EQU $CC24
W_TOPMENUITEMX EQU $CC25
@ -742,20 +745,92 @@ H_DIVISOR EQU $FF99 ; 1 byte
H_QUOTIENT EQU $FF95 ; 4 bytes, big endian order
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_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 players turn, 1 on enemys turn
; hardware registers, from the pandocs http://nocash.emubase.de/pandocs.htm
rJOYP EQU $FF00
rDIV EQU $FF04
rLCDC EQU $FF40
rSCY EQU $FF42
rSCX EQU $FF43
rBGP EQU $FF47
rOBP0 EQU $FF48
rOBP1 EQU $FF49
rWX EQU $FF4A
rWY EQU $FF4B
rWY EQU $FF4A
rWX EQU $FF4B
rIE EQU $FFFF

645
main.asm
View file

@ -20,7 +20,7 @@ SECTION "rst38",HOME[$38]
; interrupts
SECTION "vblank",HOME[$40]
jp $2024
jp VBlankHandler
SECTION "lcdc",HOME[$48]
db $FF
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
ScheduleNorthRowRedraw: ; E91
ld hl,$c3a0
FuncCoord 0,0
ld hl,Coord
call ScheduleRowRedrawHelper
ld a,[$d526]
ld [$ffd1],a
ld [H_SCREENEDGEREDRAWADDR],a
ld a,[$d527]
ld [$ffd2],a
ld a,$02
ld [$ffd0],a
ld [H_SCREENEDGEREDRAWADDR + 1],a
ld a,REDRAWROW
ld [H_SCREENEDGEREDRAW],a
ret
ScheduleRowRedrawHelper: ; EA6
ld de,$cbfc
ld de,W_SCREENEDGETILES
ld c,$28
.loop\@
ld a,[hli]
@ -2161,8 +2162,9 @@ ScheduleRowRedrawHelper: ; EA6
ret
ScheduleSouthRowRedraw: ; EB2
ld hl,$c4e0
call $0ea6
FuncCoord 0,16
ld hl,Coord
call ScheduleRowRedrawHelper
ld a,[$d526]
ld l,a
ld a,[$d527]
@ -2172,33 +2174,34 @@ ScheduleSouthRowRedraw: ; EB2
ld a,h
and a,$03
or a,$98
ld [$ffd2],a
ld [H_SCREENEDGEREDRAWADDR + 1],a
ld a,l
ld [$ffd1],a
ld a,$02
ld [$ffd0],a
ld [H_SCREENEDGEREDRAWADDR],a
ld a,REDRAWROW
ld [H_SCREENEDGEREDRAW],a
ret
ScheduleEastColumnRedraw: ; ED3
ld hl,$c3b2
FuncCoord 18,0
ld hl,Coord
call ScheduleColumnRedrawHelper
ld a,[$d526]
ld c,a
and a,$e0
ld b,a
ld a,c
add a,$12
add a,18
and a,$1f
or b
ld [$ffd1],a
ld [H_SCREENEDGEREDRAWADDR],a
ld a,[$d527]
ld [$ffd2],a
ld a,$01
ld [$ffd0],a
ld [H_SCREENEDGEREDRAWADDR + 1],a
ld a,REDRAWCOL
ld [H_SCREENEDGEREDRAW],a
ret
ScheduleColumnRedrawHelper: ; EF2
ld de,$cbfc
ld de,W_SCREENEDGETILES
ld c,$12
.loop\@
ld a,[hli]
@ -2207,7 +2210,7 @@ ScheduleColumnRedrawHelper: ; EF2
ld a,[hl]
ld [de],a
inc de
ld a,$13
ld a,19
add l
ld l,a
jr nc,.noCarry\@
@ -2218,14 +2221,15 @@ ScheduleColumnRedrawHelper: ; EF2
ret
ScheduleWestColumnRedraw: ; F08
ld hl,$c3a0
FuncCoord 0,0
ld hl,Coord
call ScheduleColumnRedrawHelper
ld a,[$d526]
ld [$ffd1],a
ld [H_SCREENEDGEREDRAWADDR],a
ld a,[$d527]
ld [$ffd2],a
ld a,$01
ld [$ffd0],a
ld [H_SCREENEDGEREDRAWADDR + 1],a
ld a,REDRAWCOL
ld [H_SCREENEDGEREDRAW],a
ret
; function to write the tiles that make up a tile block to memory
@ -3705,7 +3709,469 @@ ClearBgMap: ; 1CF0
jr nz,.loop\@
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
; explanation for %11100011 (value stored in rLCDC)
@ -3766,9 +4232,9 @@ InitGame: ; 1F54
ld [rIE],a
ld a,$90 ; put the window off the screen
ld [$ffb0],a
ld [rWX],a
ld a,$07
ld [rWY],a
ld a,$07
ld [rWX],a
ld a,$ff
ld [$ffaa],a
ld h,$98
@ -3809,17 +4275,92 @@ ZeroVram: ; 2004
xor a
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
; delay for one frame
ld a,1
ld [$FFD6],a
ld [H_VBLANKOCCURRED],a
; wait for the next Vblank, halting to conserve battery
.halt\@
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
jr nz,.halt\@
@ -4198,8 +4739,8 @@ DisplayTextID: ; 2920
ld a,[W_CURMAP]
call SwitchToMapRomBank
.skipSwitchToMapBank\@
ld a,$1e
ld [$ffd5],a ; joypad poll timer
ld a,30 ; half a second
ld [H_FRAMECOUNTER],a ; used as joypad poll timer
ld hl,W_MAPTEXTPTR
ld a,[hli]
ld h,[hl]
@ -4796,10 +5337,10 @@ GetJoypadStateLowSensitivity: ; 3831
jr z,.noNewlyPressedButtons\@
.newlyPressedButtons\@
ld a,30 ; half a second delay
ld [$ffd5],a ; frame counter
ld [H_FRAMECOUNTER],a
ret
.noNewlyPressedButtons\@
ld a,[$ffd5] ; frame counter
ld a,[H_FRAMECOUNTER]
and a ; is the delay over?
jr z,.delayOver\@
.delayNotOver\@
@ -4818,7 +5359,7 @@ GetJoypadStateLowSensitivity: ; 3831
ld [$ffb5],a
.setShortDelay\@
ld a,5 ; 1/12 of a second delay
ld [$ffd5],a ; frame counter
ld [H_FRAMECOUNTER],a
ret
INCBIN "baserom.gbc",$3865,$38AC - $3865
@ -4886,11 +5427,11 @@ PrintLetterDelay: ; 38D3
jr z,.waitOneFrame\@
ld a,[$d355]
and a,$0f
ld [$ffd5],a ; frame counter
ld [H_FRAMECOUNTER],a
jr .checkButtons\@
.waitOneFrame\@
ld a,1
ld [$ffd5],a ; frame counter
ld [H_FRAMECOUNTER],a
.checkButtons\@
call GetJoypadState
ld a,[$ffb4]
@ -4905,7 +5446,7 @@ PrintLetterDelay: ; 38D3
call DelayFrame
jr .done\@
.buttonsNotPressed\@ ; if neither A nor B is pressed
ld a,[$ffd5] ; frame counter
ld a,[H_FRAMECOUNTER]
and a
jr nz,.checkButtons\@
.done\@
@ -12100,7 +12641,7 @@ ItemUseBall: ; 03:5687
ld [H_MULTIPLICAND + 2],a
ld a,255
ld [H_MULTIPLIER],a
call $38ac ;Multiply: MaxHP * 255
call Multiply ; MaxHP * 255
ld a,[$cf91]
cp a,GREAT_BALL
ld a,12 ;any other BallFactor
@ -12109,7 +12650,7 @@ ItemUseBall: ; 03:5687
.next7\@ ;$574d
ld [H_DIVISOR],a
ld b,4 ;number of significant bytes
call $38b9 ;Divide
call Divide
ld hl,W_ENEMYMONCURHP
ld a,[hli]
ld b,a
@ -12128,7 +12669,7 @@ ItemUseBall: ; 03:5687
.next8\@ ;$5766
ld [H_DIVISOR],a
ld b,4
call $38b9 ; Divide: ((MaxHP * 255) / BallFactor) / (CurHP / 4)
call Divide ; ((MaxHP * 255) / BallFactor) / (CurHP / 4)
ld a,[H_QUOTIENT + 2]
and a
jr z,.next9\@
@ -12159,7 +12700,7 @@ ItemUseBall: ; 03:5687
ld [H_MULTIPLICAND + 2],a
ld a,100
ld [H_MULTIPLIER],a
call $38ac ;Multiply: CatchRate * 100
call Multiply ; CatchRate * 100
ld a,[$cf91]
ld b,255
cp a,POKE_BALL
@ -12174,18 +12715,18 @@ ItemUseBall: ; 03:5687
ld a,b
ld [H_DIVISOR],a
ld b,4
call $38b9 ;Divide
call Divide
ld a,[H_QUOTIENT + 2]
and a
ld b,$63
jr nz,.next12\@
ld a,[$d11e]
ld [H_MULTIPLIER],a
call $38ac
call Multiply
ld a,255
ld [H_DIVISOR],a
ld b,4
call $38b9
call Divide
ld a,[W_ENEMYMONSTATUS] ;status ailments
and a
jr z,.next13\@
@ -22723,7 +23264,7 @@ Function67CF: ; 0x3a7cf 67CF
ld a,[hl]
ld [H_DIVIDEND + 1],a
ld b,2
call $38B9
call Divide
ld a,[H_QUOTIENT + 3]
ld c,a
ld a,[H_QUOTIENT + 2]
@ -26630,11 +27171,11 @@ AdjustDamageForMoveType: ; 63A5
ld [H_MULTIPLICAND + 1],a
ld a,[hld]
ld [H_MULTIPLICAND + 2],a
call $38ac ; multiply
call Multiply
ld a,10
ld [H_DIVISOR],a
ld b,$04
call $38b9 ; divide
call Divide
ld a,[H_QUOTIENT + 2]
ld [hli],a
ld b,a
@ -26945,11 +27486,11 @@ CalcHitChance: ; 6624
pop bc
ld a,[hli]
ld [H_MULTIPLIER],a ; set multiplier to the numerator of the ratio
call $38ac ; multiply
call Multiply
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 b,$04 ; number of significant bytes in the dividend
call $38b9 ; divide
call Divide
ld a,[H_QUOTIENT + 3]
ld b,a
ld a,[H_QUOTIENT + 2]