pokeyellow/engine/bcd.asm
luckytyphlosion bb97b63af1 Complete documentation of bank3
Also: split out bcd predefs from yellow/main.asm, start removing traces
of W_
2015-10-18 15:37:40 -04:00

215 lines
3.2 KiB
NASM

; divide hMoney by hDivideBCDDivisor
; return output in hDivideBCDQuotient (same as hDivideBCDDivisor)
; used only to halve player money upon losing a fight
DivideBCDPredef:: ; f5a4 (3:75a4)
DivideBCDPredef2::
DivideBCDPredef3:: ; only used function
DivideBCDPredef4::
call GetPredefRegisters
DivideBCD:: ; f5a8 (3:75a8)
xor a
ld [hDivideBCDBuffer], a
ld [hDivideBCDBuffer + 1], a
ld [hDivideBCDBuffer + 2], a
ld d, $1
.asm_f5b0
ld a, [hDivideBCDDivisor]
and $f0
jr nz, .asm_f5e1
inc d
ld a, [hDivideBCDDivisor]
swap a
and $f0
ld b, a
ld a, [hDivideBCDDivisor + 1]
swap a
ld [hDivideBCDDivisor + 1], a
and $f
or b
ld [hDivideBCDDivisor], a
ld a, [hDivideBCDDivisor + 1]
and $f0
ld b, a
ld a, [hDivideBCDDivisor + 2]
swap a
ld [hDivideBCDDivisor + 2], a
and $f
or b
ld [hDivideBCDDivisor + 1], a
ld a, [hDivideBCDDivisor + 2]
and $f0
ld [hDivideBCDDivisor + 2], a
jr .asm_f5b0
.asm_f5e1
push de
push de
call DivideBCD_f686
pop de
ld a, b
swap a
and $f0
ld [hDivideBCDBuffer], a
dec d
jr z, .asm_f642
push de
call DivideBCD_f65d
call DivideBCD_f686
pop de
ld a, [hDivideBCDBuffer]
or b
ld [hDivideBCDBuffer], a
dec d
jr z, .asm_f642
push de
call DivideBCD_f65d
call DivideBCD_f686
pop de
ld a, b
swap a
and $f0
ld [hDivideBCDBuffer + 1], a
dec d
jr z, .asm_f642
push de
call DivideBCD_f65d
call DivideBCD_f686
pop de
ld a, [hDivideBCDBuffer + 1]
or b
ld [hDivideBCDBuffer + 1], a
dec d
jr z, .asm_f642
push de
call DivideBCD_f65d
call DivideBCD_f686
pop de
ld a, b
swap a
and $f0
ld [hDivideBCDBuffer + 2], a
dec d
jr z, .asm_f642
push de
call DivideBCD_f65d
call DivideBCD_f686
pop de
ld a, [hDivideBCDBuffer + 2]
or b
ld [hDivideBCDBuffer + 2], a
.asm_f642
ld a, [hDivideBCDBuffer]
ld [hDivideBCDQuotient], a
ld a, [hDivideBCDBuffer + 1]
ld [hDivideBCDQuotient + 1], a
ld a, [hDivideBCDBuffer + 2]
ld [hDivideBCDQuotient + 2], a
pop de
ld a, $6
sub d
and a
ret z
.asm_f654
push af
call DivideBCD_f65d
pop af
dec a
jr nz, .asm_f654
ret
DivideBCD_f65d: ; f65d (3:765d)
ld a, [hDivideBCDDivisor + 2]
swap a
and $f
ld b, a
ld a, [hDivideBCDDivisor + 1]
swap a
ld [hDivideBCDDivisor + 1], a
and $f0
or b
ld [hDivideBCDDivisor + 2], a
ld a, [hDivideBCDDivisor + 1]
and $f
ld b, a
ld a, [hDivideBCDDivisor]
swap a
ld [hDivideBCDDivisor], a
and $f0
or b
ld [hDivideBCDDivisor + 1], a
ld a, [hDivideBCDDivisor]
and $f
ld [hDivideBCDDivisor], a
ret
DivideBCD_f686: ; f686 (3:7686)
ld bc, $3
.asm_f689
ld de, hMoney
ld hl, hDivideBCDDivisor
push bc
call StringCmp
pop bc
ret c
inc b
ld de, hMoney + 2
ld hl, hDivideBCDDivisor + 2
push bc
call SubBCD
pop bc
jr .asm_f689
AddBCDPredef:: ; f6a3 (3:76a3)
call GetPredefRegisters
AddBCD:: ; f6a6 (3:76a6)
and a
ld b, c
.add
ld a, [de]
adc [hl]
daa
ld [de], a
dec de
dec hl
dec c
jr nz, .add
jr nc, .done
ld a, $99
inc de
.fill
ld [de], a
inc de
dec b
jr nz, .fill
.done
ret
SubBCDPredef:: ; f6bc (3:76bc)
call GetPredefRegisters
SubBCD:: ; f6bf (3:76bf)
and a
ld b, c
.sub
ld a, [de]
sbc [hl]
daa
ld [de], a
dec de
dec hl
dec c
jr nz, .sub
jr nc, .done
ld a, $00
inc de
.fill
ld [de], a
inc de
dec b
jr nz, .fill
scf
.done
ret