diff options
Diffstat (limited to 'engine/bcd.asm')
-rw-r--r-- | engine/bcd.asm | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/engine/bcd.asm b/engine/bcd.asm new file mode 100644 index 00000000..a5322702 --- /dev/null +++ b/engine/bcd.asm @@ -0,0 +1,215 @@ +; 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
\ No newline at end of file |