diff options
author | dannye <33dannye@gmail.com> | 2020-11-04 00:06:44 -0600 |
---|---|---|
committer | dannye <33dannye@gmail.com> | 2020-11-04 00:06:44 -0600 |
commit | 5647ca687b92954dcf37a6ea6bfbc9a341c32de4 (patch) | |
tree | dde1937a1bfdb3a835f4155e1c2eb8f1aaf86f63 /home/print_num.asm | |
parent | 53fcd05aa24693093d8af1dc8ec4fedd3957decc (diff) |
Sync with pokered
Diffstat (limited to 'home/print_num.asm')
-rw-r--r-- | home/print_num.asm | 219 |
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 |