view src/print.s @ 85:663d8e77b579

Implmement BCD floating point and update number parsing and printing Implements a BCD floating point system with 10 decimal digits of precistion and an exponent range of -63 to +63. Also include parsing integer and floating point values and printing them out.
author William Astle <lost@l-w.ca>
date Sun, 15 Oct 2023 22:15:36 -0600
parents bb50ac9fdf37
children
line wrap: on
line source

                *pragmapush list
                *pragma list
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Print out an unsigned 16 bit value in D to the selected output stream
print_uint16d   pshs d,x,y,u                    ; save number and make some temporaries on the stack
                leay 2,s                        ; point to start of buffer
                ldu #10000                      ; do the 10000s digit
                bsr print_uint16d4
                ldu #1000                       ; do the 1000s digit
                bsr print_uint16d4
                ldu #100                        ; do the 100s digit
                bsr print_uint16d4
                ldu #10                         ; do the 10s digit
                bsr print_uint16d4
                puls d                          ; get back number residue and clean up stack
                addb #0x30                      ; convert 1s digit to number
                stb ,y                          ; stash it
                clr 1,y                         ; NUL terminate it
                leay ,s                         ; point to start of converted number
print_uint16d0  lda ,y                          ; get digit at start
                cmpa #0x30                      ; zero digit?
                bne print_uint16d1              ; brif not - we can just show the number from here
                ldb 1,y                         ; end of number?
                beq print_uint16d1              ; brif so - show the zero anyway
                leay 1,y                        ; move past the zero
                bra print_uint16d0              ; see if we have more zeroes to skip
print_uint16d1  lda ,y+                         ; get number digit
                beq print_uint16d2              ; brif end of number
                jsr writechr                    ; output the digit
                bra print_uint16d1              ; handle next digit
print_uint16d2  leas 6,s                        ; clean up the stack
                rts
print_uint16d4  lda #0x30-1                     ; init digit value
                pshs a,u                        ; save the digit position and digit value
                ldd 5,s                         ; get back residue
print_uint16d5  inc ,s                          ; bump digit
                subd 1,s                        ; subtract out place value
                bcc print_uint16d5              ; brif we haven't got the right digit yet
                addd 1,s                        ; restore residue
                std 5,s                         ; save new residue
                puls a,u                        ; get back digit and place value off stack
                sta ,y+                         ; save digit in buffer
                rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PRINT command
cmd_print       beq cmd_printeol                ; brif no argument - do a newline
cmd_print0      cmpa #';                        ; semicolon?
                bne cmd_print1                  ; brif not
                jsr nextchar                    ; skip the semicolon
                bne cmd_print0                  ; brif not end of the statement
                rts
cmd_print1      jsr eval_expr                   ; evaluate the expression
                ldb val0+val.type               ; get value type
                cmpb #valtype_int               ; integer?
                beq cmd_printint                ; brif so - print integer
                cmpb #valtype_float             ; floatingp point?
                beq cmd_printfps                ; brif so - print floating point
                lda #'!                         ; flag unknown expression type
                jsr console_outchr
                jsr console_outchr
                jsr console_outchr
cmd_printnext   jsr curchar                     ; see what we have here
                bra cmd_print                   ; and go process
cmd_printeol    jmp console_outnl               ; do a newline and return
cmd_printint    jsr int_toascii                 ; convert val0 to string
cmd_printstrb   ldx #strbuff                    ; point to resulting string
                jsr console_outstr              ; output the string
                bra cmd_printnext               ; go handle next stuff
cmd_printfps    jsr fps_toascii                 ; convert val0 to string
                bra cmd_printstrb               ; go output the resulting string
                *pragmapop list