changeset 116:e72cda5e5ee2

Fix logic errors in floating point division
author William Astle <lost@l-w.ca>
date Wed, 27 Dec 2023 15:57:59 -0700
parents 03eb6d6b49b4
children 053fd2fb92e8
files src/fps.s
diffstat 1 files changed, 10 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/fps.s	Wed Dec 27 00:07:05 2023 -0700
+++ b/src/fps.s	Wed Dec 27 15:57:59 2023 -0700
@@ -693,35 +693,29 @@
                 lslb
                 lslb
                 lslb
-                sta fpaextra+8                  ; save it
+                stb fpaextra+8                  ; save it
                 bsr fps_div5                    ; do next digit
                 addb fpaextra+8                 ; combine the two quotient digits
 fps_div4        rts
-fps_div5        ldb fpaextra+6                  ; do we even need to do the division?
-                beq fps_div4                    ; brif not - return 0
-                clrb                            ; initialize quotient digit
+fps_div5        clrb                            ; initialize digit value
 fps_div6        lda fpaextra+7                  ; did we have a carry last time?
                 bne fps_div7                    ; brif so - we know it "goes"
                 lda fpa1+fpa.sig                ; is the divisor less than the dividend residue?
                 cmpa fpa1+fpa.sig+5
-                bhi fps_div8                    ; brif high byte is larger than residue
+                bne fps_div6a                   ; brif high byte is larger than residue
                 lda fpa1+fpa.sig+1              ; and keep going for all 5 bytes
                 cmpa fpa1+fpa.sig+6
-                bhi fps_div8
+                bne fps_div6a
                 lda fpa1+fpa.sig+2
                 cmpa fpa1+fpa.sig+7
-                bhi fps_div8
+                bne fps_div6a
                 lda fpa1+fpa.sig+3
                 cmpa fpa1+fpa.sig+8
-                bhi fps_div8
+                bhi fps_div6a
                 lda fpa1+fpa.sig+4
                 cmpa fpa1+fpa.sig+9
-                bhi fps_div8                    ; brif divisor is greater than the residue
-                bne fps_div7                    ; brif it didn't go exactly
-                incb                            ; bump quotient for this "go"
-                clr fpaextra+6                  ; indicate no more digits needed
-                rts
-fps_div7        coma                            ; set carry to complete 10's complement of divisor
+fps_div6a       bhi fps_div8                    ; brif divisor is greater than the residue
+fps_div7        coma                            ; set carry to complete 10's complement of divisor 
                 lda fpa1+fpa.sig+9              ; do the "subtraction"
                 adca fpaextra+4
                 daa
@@ -744,17 +738,11 @@
                 sta fpa1+fpa.sig+5
                 lda fpaextra+7                  ; and handle the carry byte
                 adca #0x99
+                daa
                 sta fpaextra+7
                 incb                            ; bump digit count
                 bra fps_div6                    ; go see if we need another subtraction
-fps_div8        tstb                            ; nonzero digit?
-                beq fps_div9                    ; brif not
-                lda #1                          ; set nonzero flag
-                sta fpaextra+5
-fps_div9        lda fpaextra+6                  ; adjust digit count
-                suba fpaextra+5
-                sta fpaextra+6
-                lsl fpa1+fpa.sig+9              ; shift residue one decimal digit
+fps_div8        lsl fpa1+fpa.sig+9              ; shift residue one decimal digit
                 rol fpa1+fpa.sig+8
                 rol fpa1+fpa.sig+7
                 rol fpa1+fpa.sig+6