diff options
-rw-r--r-- | engine/bcd.asm | 146 | ||||
-rw-r--r-- | hram.asm | 1 |
2 files changed, 75 insertions, 72 deletions
diff --git a/engine/bcd.asm b/engine/bcd.asm index 3e693e1f..2d0b43df 100644 --- a/engine/bcd.asm +++ b/engine/bcd.asm @@ -6,155 +6,157 @@ DivideBCDPredef4:: DivideBCD:: xor a - ld [$ffa5], a - ld [$ffa6], a - ld [$ffa7], a + ld [hDivideBCDBuffer], a + ld [hDivideBCDBuffer+1], a + ld [hDivideBCDBuffer+2], a ld d, $1 -.asm_f72a - ld a, [$ffa2] +.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, .asm_f75b + jr nz, .next inc d - ld a, [$ffa2] + ld a, [hDivideBCDDivisor] swap a and $f0 ld b, a - ld a, [$ffa3] + ld a, [hDivideBCDDivisor+1] swap a - ld [$ffa3], a + ld [hDivideBCDDivisor+1], a and $f or b - ld [$ffa2], a - ld a, [$ffa3] + ld [hDivideBCDDivisor], a + ld a, [hDivideBCDDivisor+1] and $f0 ld b, a - ld a, [$ffa4] + ld a, [hDivideBCDDivisor+2] swap a - ld [$ffa4], a + ld [hDivideBCDDivisor+2], a and $f or b - ld [$ffa3], a - ld a, [$ffa4] + ld [hDivideBCDDivisor+1], a + ld a, [hDivideBCDDivisor+2] and $f0 - ld [$ffa4], a - jr .asm_f72a -.asm_f75b + ld [hDivideBCDDivisor+2], a + jr .mulBy10Loop +.next push de push de - call DivideBCD_f800 + call DivideBCD_getNextDigit pop de ld a, b swap a and $f0 - ld [$ffa5], a + ld [hDivideBCDBuffer], a dec d - jr z, .asm_f7bc + jr z, .next2 push de - call DivideBCD_f7d7 - call DivideBCD_f800 + call DivideBCD_divDivisorBy10 + call DivideBCD_getNextDigit pop de - ld a, [$ffa5] + ld a, [hDivideBCDBuffer] or b - ld [$ffa5], a + ld [hDivideBCDBuffer], a dec d - jr z, .asm_f7bc + jr z, .next2 push de - call DivideBCD_f7d7 - call DivideBCD_f800 + call DivideBCD_divDivisorBy10 + call DivideBCD_getNextDigit pop de ld a, b swap a and $f0 - ld [$ffa6], a + ld [hDivideBCDBuffer+1], a dec d - jr z, .asm_f7bc + jr z, .next2 push de - call DivideBCD_f7d7 - call DivideBCD_f800 + call DivideBCD_divDivisorBy10 + call DivideBCD_getNextDigit pop de - ld a, [$ffa6] + ld a, [hDivideBCDBuffer+1] or b - ld [$ffa6], a + ld [hDivideBCDBuffer+1], a dec d - jr z, .asm_f7bc + jr z, .next2 push de - call DivideBCD_f7d7 - call DivideBCD_f800 + call DivideBCD_divDivisorBy10 + call DivideBCD_getNextDigit pop de ld a, b swap a and $f0 - ld [$ffa7], a + ld [hDivideBCDBuffer+2], a dec d - jr z, .asm_f7bc + jr z, .next2 push de - call DivideBCD_f7d7 - call DivideBCD_f800 + call DivideBCD_divDivisorBy10 + call DivideBCD_getNextDigit pop de - ld a, [$ffa7] + ld a, [hDivideBCDBuffer+2] or b - ld [$ffa7], a -.asm_f7bc - ld a, [$ffa5] - ld [$ffa2], a - ld a, [$ffa6] - ld [$ffa3], a - ld a, [$ffa7] - ld [$ffa4], a + 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 + ld a, $6 sub d and a ret z -.asm_f7ce +.divResultBy10loop push af - call DivideBCD_f7d7 + call DivideBCD_divDivisorBy10 pop af dec a - jr nz, .asm_f7ce + jr nz, .divResultBy10loop ret -DivideBCD_f7d7: - ld a, [$ffa4] +DivideBCD_divDivisorBy10: + ld a, [hDivideBCDDivisor+2] swap a and $f ld b, a - ld a, [$ffa3] + ld a, [hDivideBCDDivisor+1] swap a - ld [$ffa3], a + ld [hDivideBCDDivisor+1], a and $f0 or b - ld [$ffa4], a - ld a, [$ffa3] + ld [hDivideBCDDivisor+2], a + ld a, [hDivideBCDDivisor+1] and $f ld b, a - ld a, [$ffa2] + ld a, [hDivideBCDDivisor] swap a - ld [$ffa2], a + ld [hDivideBCDDivisor], a and $f0 or b - ld [$ffa3], a - ld a, [$ffa2] + ld [hDivideBCDDivisor+1], a + ld a, [hDivideBCDDivisor] and $f - ld [$ffa2], a + ld [hDivideBCDDivisor], a ret -DivideBCD_f800: +DivideBCD_getNextDigit: ld bc, $3 -.asm_f803 - ld de, $ff9f - ld hl, $ffa2 +.loop + ld de, hMoney ; the dividend + ld hl, hDivideBCDDivisor push bc call StringCmp pop bc ret c inc b - ld de, $ffa1 - ld hl, $ffa4 + ld de, hMoney+2 ; since SubBCD works starting from the least significant digit + ld hl, hDivideBCDDivisor+2 push bc call SubBCD pop bc - jr .asm_f803 + jr .loop AddBCDPredef:: @@ -155,6 +155,7 @@ hCoins EQU $FFA0 ; 2-byte BCD number hDivideBCDDivisor EQU $FFA2 ; 3-byte BCD number hDivideBCDQuotient EQU $FFA2 ; 3-byte BCD number +hDivideBCDBuffer EQU $FFA5 ; 3-byte BCD number hSerialReceivedNewData EQU $FFA9 |