summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Farebrother <nintendo.joe.farebrother@gmail.com>2017-03-19 21:09:24 +0000
committerJoe Farebrother <nintendo.joe.farebrother@gmail.com>2017-03-19 21:09:24 +0000
commit39d31cecb263498e286c1fba3b8e0c6d439244b9 (patch)
treebda229723204144e7837e2a3f967051c1bfd2f47
parentce35f2f7a1d72c3404e3c7953cdaa10a0cff00e8 (diff)
Gave names to the functions and labels and adresses used in DivideBCD
and added a few comments
-rw-r--r--engine/bcd.asm146
-rw-r--r--hram.asm1
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::
diff --git a/hram.asm b/hram.asm
index f5817fa4..9c13e5a1 100644
--- a/hram.asm
+++ b/hram.asm
@@ -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