diff --git a/STATUS.md b/STATUS.md index daa3c350..ccb89dec 100644 --- a/STATUS.md +++ b/STATUS.md @@ -216,7 +216,7 @@ Floating point mathematical routines - not official, but well known and broadly | `$BA28` | `mul_MEM_FAC1` | DONE | | | `$BA2B` | `mul_FAC2_FAC1` | DONE | | | `$BA8C` | `mov_MEM_FAC2` | DONE | | -| `$BA90` | `get_FAC2_via_INDEX` | NOT DONE | | +| `$BA90` | `get_FAC2_via_INDEX` | DONE | | | `$BAE2` | `mul10_FAC1` | DONE | | | `$BAFE` | `div10_FAC1_p` | DONE | | | `$BB0F` | `div_MEM_FAC1` | DONE | | diff --git a/src/basic/,stubs_math/ba90.get_FAC2_via_INDEX.s b/src/basic/,stubs_math/ba90.get_FAC2_via_INDEX.s deleted file mode 100644 index 4c2bfcaa..00000000 --- a/src/basic/,stubs_math/ba90.get_FAC2_via_INDEX.s +++ /dev/null @@ -1,17 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -;; #LAYOUT# * BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Math package - XXX -; -; See also: -; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True -; - -; XXX implement, test - -get_FAC2_via_INDEX: - - +STUB_IMPLEMENTATION diff --git a/src/basic/math/ba8c.mov_MEM_FAC2.jmp.s b/src/basic/math/ba8c.mov_MEM_FAC2.jmp.s deleted file mode 100644 index 2238045e..00000000 --- a/src/basic/math/ba8c.mov_MEM_FAC2.jmp.s +++ /dev/null @@ -1,8 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -;; #LAYOUT# * BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; Just a compatibility jump - our routine is longer than original one - - jmp mov_MEM_FAC2 diff --git a/src/basic/math/ba8c.interop b/src/basic/math_mov/ba8c.interop similarity index 100% rename from src/basic/math/ba8c.interop rename to src/basic/math_mov/ba8c.interop diff --git a/src/basic/math_mov/ba8c.mov_MEM_FAC2.s b/src/basic/math_mov/ba8c.mov_MEM_FAC2.s new file mode 100644 index 00000000..d6692529 --- /dev/null +++ b/src/basic/math_mov/ba8c.mov_MEM_FAC2.s @@ -0,0 +1,30 @@ +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE +; +; Math package - fetch FAC2 from memory location +; +; Input: +; - .A - address low byte +; - .Y - address high byte +; +; Output: +; - .A - FAC1 exponent (yes, really - Codebase64 is right) +; - .Y - 0 (experimentation with original ROM) +; +; Preserves: +; - .X - (experimentation with original ROM) +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 114 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; + + +mov_MEM_FAC2: + sty INDEX+1 + sta INDEX+0 + + ; FALLTHROUGH to get_FAC2_via_INDEX diff --git a/src/basic/math_mov/mov_MEM_FAC2.s b/src/basic/math_mov/ba90.get_FAC2_via_INDEX.s similarity index 54% rename from src/basic/math_mov/mov_MEM_FAC2.s rename to src/basic/math_mov/ba90.get_FAC2_via_INDEX.s index 4cce1956..508005f3 100644 --- a/src/basic/math_mov/mov_MEM_FAC2.s +++ b/src/basic/math_mov/ba90.get_FAC2_via_INDEX.s @@ -1,36 +1,18 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 ;; #LAYOUT# * BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE ; -; Math package - fetch FAC2 from memory location -; -; Input: -; - .A - address low byte -; - .Y - address high byte -; -; Output: -; - .A - FAC1 exponent (yes, really - Codebase64 is right) -; - .Y - 0 (experimentation with original ROM) -; -; Preserves: -; - .X - (experimentation with original ROM) +; Math package - Mov MEM to FAC2 with address in INDEX zero page register ; ; See also: -; - [CM64] Computes Mapping the Commodore 64 - page 114 -; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True ; -; XXX test this +; XXX implement, test -mov_MEM_FAC2: - - ; Original routines use $22/$23 location for a vector too, see here: - ; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics - - sty INDEX+1 - sta INDEX+0 +get_FAC2_via_INDEX: ; Now copy the data from RAM to FAC2, for the format description see: ; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic#Representation_in_the_C-64 diff --git a/src/basic/,stubs_math/ba90.interop b/src/basic/math_mov/ba90.interop similarity index 100% rename from src/basic/,stubs_math/ba90.interop rename to src/basic/math_mov/ba90.interop diff --git a/strings/208CBAA5 b/strings/208CBAA5 new file mode 100644 index 00000000..c33e1766 --- /dev/null +++ b/strings/208CBAA5 @@ -0,0 +1,3 @@ +JSR $BA8C + LDA fragment + +Call to well known floating point function + fragment diff --git a/strings/3C208CBA b/strings/3C208CBA new file mode 100644 index 00000000..104dac4d --- /dev/null +++ b/strings/3C208CBA @@ -0,0 +1,3 @@ +$3C + JSR $BA8C + +Fragment and call to well known floating point function. diff --git a/strings/4C67B8208CBAA56649FF8566 b/strings/4C67B8208CBAA56649FF8566 new file mode 100644 index 00000000..6557aeb9 --- /dev/null +++ b/strings/4C67B8208CBAA56649FF8566 @@ -0,0 +1,5 @@ +4C 67 B8 20 8C BA A5 66 49 FF 85 66 + +JMP $B867 + JSR $BA8C + LDA $66 + EOR #$FF + STA $66 + +Call two well known floating point functions and invert sign of FAC1 diff --git a/strings/666366646665667060 b/strings/666366646665667060 new file mode 100644 index 00000000..787ba6ea --- /dev/null +++ b/strings/666366646665667060 @@ -0,0 +1,3 @@ +ror $63 + ror $64 + ror $65 + ror $70 + rts + +Shifting of 32 bit value of the FAC1 mantissa in the zero page diff --git a/strings/BCA90085 b/strings/BCA90085 new file mode 100644 index 00000000..59447aac --- /dev/null +++ b/strings/BCA90085 @@ -0,0 +1,3 @@ +$BC + LDA #$00 + STA fragment + +Fragment of clearing variable in zero page diff --git a/testsuite/unit/math.vs b/testsuite/unit/math.vs index 7a4940c7..8418b6c8 100644 --- a/testsuite/unit/math.vs +++ b/testsuite/unit/math.vs @@ -145,6 +145,38 @@ compare $61 $66 $1001 compare $70 $70 $1003 ; FACOV = 0 print "END" +print "TEST: mov MEM FAC2 const 1.0" +fill $69 $6E FF FF FF FF FF AA +r A=$BC +r Y=$B9 +r PC=$BA8C +ret +fill $1001 $1006 81 80 00 00 00 00 +print "COMPARE" +compare $69 $6E $1001 +print "END" + +print "TEST: mov MEM FAC2 const -0.5" +fill $69 $6E FF FF FF FF FF AA +r A=$E0 +r Y=$B9 +r PC=$BA8C +ret +fill $1001 $1006 80 80 00 00 00 FF +print "COMPARE" +compare $69 $6E $1001 +print "END" + +print "TEST: get_FAC2_via_INDEX -0.5" +fill $69 $6E FF FF FF FF FF AA +fill $22 $23 E0 B9 +r PC=$BA90 +ret +fill $1001 $1006 80 80 00 00 00 FF +print "COMPARE" +compare $69 $6E $1001 +print "END" + print "TEST: FCOMP 1.0 == 1.0" r A=$BC r Y=$B9