printf16.asm 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include once <printnum.asm>
  2. #include once <printi16.asm>
  3. #include once <neg32.asm>
  4. ;
  5. __PRINTF16: ; Prints a 32bit 16.16 fixed point number
  6. PROC
  7. LOCAL __PRINT_FIX_LOOP
  8. LOCAL __PRINTF16_2
  9. ;- bit 7, d
  10. ;- jr z, __PRINTF16_2
  11. jsr __NEG32 ;- call __NEG32
  12. jsr __PRINT_MINUS ;- call __PRINT_MINUS
  13. __PRINTF16_2:
  14. lda z80_l ;- push hl
  15. pha
  16. lda z80_h
  17. pha
  18. lda z80_e ;- ex de,hl
  19. ldx z80_l
  20. stx z80_e
  21. sta z80_l
  22. lda z80_d
  23. ldx z80_h
  24. stx z80_d
  25. sta z80_h
  26. jsr __PRINTU16 ;- call __PRINTU16 ; Prints integer part
  27. pla ;- pop hl
  28. sta z80_h
  29. pla
  30. sta z80_l
  31. lda z80_h ;- ld a,h
  32. sta z80_a
  33. ora z80_l ;- or l
  34. ;- ret z ; Returns if integer
  35. lda z80_l ;- push hl
  36. pha
  37. lda z80_h
  38. pha
  39. ;- ld a, '.'
  40. jsr __PRINT_DIGIT ;- call __PRINT_DIGIT ; Prints decimal point
  41. pla ;- pop hl
  42. sta z80_h
  43. pla
  44. sta z80_l
  45. __PRINT_FIX_LOOP:
  46. lda z80_h ;- ld a,h
  47. sta z80_a
  48. ora z80_l ;- or l
  49. bne *+3 ;- ret z ; Returns if no more decimals
  50. rts
  51. eor z80_a ;- xor a
  52. lda z80_h ;- ld d,h
  53. sta z80_d
  54. lda z80_l ;- ld e,l
  55. sta z80_e
  56. ; Fast NUM * 10 multiplication
  57. asl z80_l ;- add hl,hl
  58. rol z80_h
  59. ;- adc a,a ; AHL = AHL * 2 (= X * 2)
  60. asl z80_l ;- add hl,hl
  61. rol z80_h
  62. ;- adc a,a ; AHL = AHL * 2 (= X * 4)
  63. clc ;- add hl,de
  64. lda z80_l
  65. adc z80_e
  66. sta z80_l
  67. lda z80_h
  68. adc z80_d
  69. sta z80_h
  70. ;- adc a,0 ; AHL = AHL + DE (= X * 5)
  71. asl z80_l ;- add hl,hl
  72. rol z80_h
  73. ;- adc a,a ; AHL = AHL * 2 (= X * 10)
  74. lda z80_l ;- push hl
  75. pha
  76. lda z80_h
  77. pha
  78. ;- or '0'
  79. jsr __PRINT_DIGIT ;- call __PRINT_DIGIT
  80. pla ;- pop hl
  81. sta z80_h
  82. pla
  83. sta z80_l
  84. jmp __PRINT_FIX_LOOP ;- jp __PRINT_FIX_LOOP
  85. ;- ENDP