mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.7 KiB
104 lines
2.7 KiB
;;
|
|
;; make a bcd number from a binary number
|
|
;; 32 bit binary number in hl:bc, result stored at (de)
|
|
;; de is preserved, all other regs destroyed
|
|
;;
|
|
;bin2bcd:
|
|
; push ix ; save ix
|
|
; push bc ; move bc
|
|
; pop ix ; ... to ix
|
|
; ld c,32 ; loop for 32 bits of binary dword
|
|
;;
|
|
;bin2bcd0:
|
|
; ; outer loop (once for each bit in binary number)
|
|
; ld b,5 ; loop for 5 bytes of result
|
|
; push de ; save de
|
|
; add ix,ix ; left shift next bit from hl:ix
|
|
; adc hl,hl ; ... into carry
|
|
;;
|
|
;bin2bcd1:
|
|
; ; inner loop (once for each byte of bcd number)
|
|
; ld a,(de) ; get it
|
|
; adc a,a ; double it w/ carry
|
|
; daa ; decimal adjust
|
|
; ld (de),a ; save it
|
|
; inc de ; point to next bcd byte
|
|
; djnz bin2bcd1 ; loop thru all bcd bytes
|
|
;;
|
|
; ; remainder of outer loop
|
|
; pop de ; recover de
|
|
; dec c ; dec bit counter
|
|
; jr nz,bin2bcd0 ; loop till done with all bits
|
|
; pop ix ; restore ix
|
|
;
|
|
; make a bcd number from a binary number
|
|
; 32 bit binary number in de:hl, result stored at (bc)
|
|
; on output hl = bcd buf adr
|
|
;
|
|
bin2bcd:
|
|
push ix ; save ix
|
|
; convert from de:hl -> (bc) to hl:ix -> (de)
|
|
; hl -> ix, de -> hl, bc -> de
|
|
ex de,hl
|
|
push de
|
|
pop ix
|
|
push bc
|
|
pop de
|
|
;
|
|
ld c,32 ; loop for 32 bits of binary dword
|
|
;
|
|
bin2bcd0:
|
|
; outer loop (once for each bit in binary number)
|
|
ld b,5 ; loop for 5 bytes of result
|
|
push de ; save de
|
|
add ix,ix ; left shift next bit from hl:ix
|
|
adc hl,hl ; ... into carry
|
|
;
|
|
bin2bcd1:
|
|
; inner loop (once for each byte of bcd number)
|
|
ld a,(de) ; get it
|
|
adc a,a ; double it w/ carry
|
|
daa ; decimal adjust
|
|
ld (de),a ; save it
|
|
inc de ; point to next bcd byte
|
|
djnz bin2bcd1 ; loop thru all bcd bytes
|
|
;
|
|
; remainder of outer loop
|
|
pop de ; recover de
|
|
dec c ; dec bit counter
|
|
jr nz,bin2bcd0 ; loop till done with all bits
|
|
ex de,hl ; hl -> bcd buf
|
|
pop ix ; restore ix
|
|
ret
|
|
;
|
|
; print contents of 5 byte bcd number at (hl)
|
|
; with leading zero suppression
|
|
; all regs destroyed
|
|
;
|
|
prtbcd:
|
|
inc hl ; bump hl to point to
|
|
inc hl ; ...
|
|
inc hl ; ...
|
|
inc hl ; ... last byte of bcd
|
|
ld b,5 ; loop for 5 bytes
|
|
ld c,0 ; start by suppressing leading zeroes
|
|
;
|
|
prtbcd1:
|
|
; loop to print one bcd byte (two digits)
|
|
xor a ; clear accum
|
|
rld ; rotate first nibble into a
|
|
call prtbcd2 ; print it
|
|
xor a ; clear accum
|
|
rld ; rotate second nibble into a
|
|
call prtbcd2 ; print it
|
|
dec hl ; point to prior byte
|
|
djnz prtbcd1 ; loop till done
|
|
ret ; return
|
|
;
|
|
prtbcd2:
|
|
; subroutine to print a digit in a
|
|
cp c ; compare incoming to c
|
|
ret z ; if equal, suppressing, abort
|
|
dec c ; make c negative to stop suppression
|
|
add a,'0' ; offset to printable value
|
|
jp prtchr ; exit via character out
|
|
|