summaryrefslogtreecommitdiff
path: root/home/print_num.asm
diff options
context:
space:
mode:
authordannye <33dannye@gmail.com>2020-11-04 00:06:44 -0600
committerdannye <33dannye@gmail.com>2020-11-04 00:06:44 -0600
commit5647ca687b92954dcf37a6ea6bfbc9a341c32de4 (patch)
treedde1937a1bfdb3a835f4155e1c2eb8f1aaf86f63 /home/print_num.asm
parent53fcd05aa24693093d8af1dc8ec4fedd3957decc (diff)
Sync with pokered
Diffstat (limited to 'home/print_num.asm')
-rw-r--r--home/print_num.asm219
1 files changed, 219 insertions, 0 deletions
diff --git a/home/print_num.asm b/home/print_num.asm
new file mode 100644
index 00000000..e2628b1f
--- /dev/null
+++ b/home/print_num.asm
@@ -0,0 +1,219 @@
+PrintNumber::
+; Print the c-digit, b-byte value at de.
+; Allows 2 to 7 digits. For 1-digit numbers, add
+; the value to char "0" instead of calling PrintNumber.
+; Flags LEADING_ZEROES and LEFT_ALIGN can be given
+; in bits 7 and 6 of b respectively.
+ push bc
+ xor a
+ ldh [hPastLeadingZeros], a
+ ldh [hNumToPrint], a
+ ldh [hNumToPrint + 1], a
+ ld a, b
+ and $f
+ cp 1
+ jr z, .byte
+ cp 2
+ jr z, .word
+.long
+ ld a, [de]
+ ldh [hNumToPrint], a
+ inc de
+ ld a, [de]
+ ldh [hNumToPrint + 1], a
+ inc de
+ ld a, [de]
+ ldh [hNumToPrint + 2], a
+ jr .start
+
+.word
+ ld a, [de]
+ ldh [hNumToPrint + 1], a
+ inc de
+ ld a, [de]
+ ldh [hNumToPrint + 2], a
+ jr .start
+
+.byte
+ ld a, [de]
+ ldh [hNumToPrint + 2], a
+
+.start
+ push de
+
+ ld d, b
+ ld a, c
+ ld b, a
+ xor a
+ ld c, a
+ ld a, b
+
+ cp 2
+ jr z, .tens
+ cp 3
+ jr z, .hundreds
+ cp 4
+ jr z, .thousands
+ cp 5
+ jr z, .ten_thousands
+ cp 6
+ jr z, .hundred_thousands
+
+print_digit: MACRO
+
+IF (\1) / $10000
+ ld a, \1 / $10000 % $100
+ELSE
+ xor a
+ENDC
+ ldh [hPowerOf10 + 0], a
+
+IF (\1) / $100
+ ld a, \1 / $100 % $100
+ELSE
+ xor a
+ENDC
+ ldh [hPowerOf10 + 1], a
+
+ ld a, \1 / $1 % $100
+ ldh [hPowerOf10 + 2], a
+
+ call .PrintDigit
+ call .NextDigit
+ENDM
+
+.millions print_digit 1000000
+.hundred_thousands print_digit 100000
+.ten_thousands print_digit 10000
+.thousands print_digit 1000
+.hundreds print_digit 100
+
+.tens
+ ld c, 0
+ ldh a, [hNumToPrint + 2]
+.mod
+ cp 10
+ jr c, .ok
+ sub 10
+ inc c
+ jr .mod
+.ok
+
+ ld b, a
+ ldh a, [hPastLeadingZeros]
+ or c
+ ldh [hPastLeadingZeros], a
+ jr nz, .past
+ call .PrintLeadingZero
+ jr .next
+.past
+ ld a, "0"
+ add c
+ ld [hl], a
+.next
+
+ call .NextDigit
+.ones
+ ld a, "0"
+ add b
+ ld [hli], a
+ pop de
+ dec de
+ pop bc
+ ret
+
+.PrintDigit:
+; Divide by the current decimal place.
+; Print the quotient, and keep the modulus.
+ ld c, 0
+.loop
+ ldh a, [hPowerOf10]
+ ld b, a
+ ldh a, [hNumToPrint]
+ ldh [hSavedNumToPrint], a
+ cp b
+ jr c, .underflow0
+ sub b
+ ldh [hNumToPrint], a
+ ldh a, [hPowerOf10 + 1]
+ ld b, a
+ ldh a, [hNumToPrint + 1]
+ ldh [hSavedNumToPrint + 1], a
+ cp b
+ jr nc, .noborrow1
+
+ ldh a, [hNumToPrint]
+ or 0
+ jr z, .underflow1
+ dec a
+ ldh [hNumToPrint], a
+ ldh a, [hNumToPrint + 1]
+.noborrow1
+
+ sub b
+ ldh [hNumToPrint + 1], a
+ ldh a, [hPowerOf10 + 2]
+ ld b, a
+ ldh a, [hNumToPrint + 2]
+ ldh [hSavedNumToPrint + 2], a
+ cp b
+ jr nc, .noborrow2
+
+ ldh a, [hNumToPrint + 1]
+ and a
+ jr nz, .borrowed
+
+ ldh a, [hNumToPrint]
+ and a
+ jr z, .underflow2
+ dec a
+ ldh [hNumToPrint], a
+ xor a
+.borrowed
+
+ dec a
+ ldh [hNumToPrint + 1], a
+ ldh a, [hNumToPrint + 2]
+.noborrow2
+ sub b
+ ldh [hNumToPrint + 2], a
+ inc c
+ jr .loop
+
+.underflow2
+ ldh a, [hSavedNumToPrint + 1]
+ ldh [hNumToPrint + 1], a
+.underflow1
+ ldh a, [hSavedNumToPrint]
+ ldh [hNumToPrint], a
+.underflow0
+ ldh a, [hPastLeadingZeros]
+ or c
+ jr z, .PrintLeadingZero
+
+ ld a, "0"
+ add c
+ ld [hl], a
+ ldh [hPastLeadingZeros], a
+ ret
+
+.PrintLeadingZero:
+ bit BIT_LEADING_ZEROES, d
+ ret z
+ ld [hl], "0"
+ ret
+
+.NextDigit:
+; Increment unless the number is left-aligned,
+; leading zeroes are not printed, and no digits
+; have been printed yet.
+ bit BIT_LEADING_ZEROES, d
+ jr nz, .inc
+ bit BIT_LEFT_ALIGN, d
+ jr z, .inc
+ ldh a, [hPastLeadingZeros]
+ and a
+ ret z
+.inc
+ inc hl
+ ret