summaryrefslogtreecommitdiff
path: root/engine/bcd.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/bcd.asm')
-rw-r--r--engine/bcd.asm218
1 files changed, 0 insertions, 218 deletions
diff --git a/engine/bcd.asm b/engine/bcd.asm
deleted file mode 100644
index d84e504b..00000000
--- a/engine/bcd.asm
+++ /dev/null
@@ -1,218 +0,0 @@
-; divide hMoney by hDivideBCDDivisor
-; return output in hDivideBCDQuotient (same as hDivideBCDDivisor)
-; used only to halve player money upon losing a fight
-DivideBCDPredef::
-DivideBCDPredef2::
-DivideBCDPredef3:: ; only used function
-DivideBCDPredef4::
- call GetPredefRegisters
-
-DivideBCD::
- xor a
- ld [hDivideBCDBuffer], a
- ld [hDivideBCDBuffer + 1], a
- ld [hDivideBCDBuffer + 2], a
- ld d, $1
-.mulBy10Loop
-; multiply the divisor by 10 until the leading digit is nonzero
-; to set up the standard long division algorithm
- ld a, [hDivideBCDDivisor]
- and $f0
- jr nz, .next
- 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 .mulBy10Loop
-
-.next
- push de
- push de
- call DivideBCD_getNextDigit
- pop de
- ld a, b
- swap a
- and $f0
- ld [hDivideBCDBuffer], a
- dec d
- jr z, .next2
- push de
- call DivideBCD_divDivisorBy10
- call DivideBCD_getNextDigit
- pop de
- ld a, [hDivideBCDBuffer]
- or b
- ld [hDivideBCDBuffer], a
- dec d
- jr z, .next2
- push de
- call DivideBCD_divDivisorBy10
- call DivideBCD_getNextDigit
- pop de
- ld a, b
- swap a
- and $f0
- ld [hDivideBCDBuffer + 1], a
- dec d
- jr z, .next2
- push de
- call DivideBCD_divDivisorBy10
- call DivideBCD_getNextDigit
- pop de
- ld a, [hDivideBCDBuffer + 1]
- or b
- ld [hDivideBCDBuffer + 1], a
- dec d
- jr z, .next2
- push de
- call DivideBCD_divDivisorBy10
- call DivideBCD_getNextDigit
- pop de
- ld a, b
- swap a
- and $f0
- ld [hDivideBCDBuffer + 2], a
- dec d
- jr z, .next2
- push de
- call DivideBCD_divDivisorBy10
- call DivideBCD_getNextDigit
- pop de
- ld a, [hDivideBCDBuffer + 2]
- or b
- ld [hDivideBCDBuffer + 2], a
-.next2
- ld a, [hDivideBCDBuffer]
- ld [hDivideBCDQuotient], a ; the same memory location as hDivideBCDDivisor
- 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
-.divResultBy10loop
- push af
- call DivideBCD_divDivisorBy10
- pop af
- dec a
- jr nz, .divResultBy10loop
- ret
-
-DivideBCD_divDivisorBy10:
- 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_getNextDigit:
- ld bc, $3
-.loop
- ld de, hMoney ; the dividend
- ld hl, hDivideBCDDivisor
- push bc
- call StringCmp
- pop bc
- ret c
- inc b
- ld de, hMoney + 2 ; since SubBCD works starting from the least significant digit
- ld hl, hDivideBCDDivisor + 2
- push bc
- call SubBCD
- pop bc
- jr .loop
-
-
-AddBCDPredef::
- call GetPredefRegisters
-
-AddBCD::
- 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::
- call GetPredefRegisters
-
-SubBCD::
- 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