From 47fa7a393cebb562a80dc6c3779c80df2854e3bb Mon Sep 17 00:00:00 2001 From: Rikard Nordgren Date: Mon, 17 Mar 2025 20:59:44 +0100 Subject: [PATCH] Add STRVAL --- STATUS.md | 2 +- src/basic/,stubs_math/b7b5.STRVAL.s | 20 -------- src/basic/math/b7b5.STRVAL.s | 53 ++++++++++++++++++++ src/basic/{,stubs_math => math}/b7b5.interop | 0 strings/18608100000000 | 3 ++ strings/208CB64C | 3 ++ strings/85248425 | 3 ++ testsuite/unit/math.vs | 12 +++++ 8 files changed, 75 insertions(+), 21 deletions(-) delete mode 100644 src/basic/,stubs_math/b7b5.STRVAL.s create mode 100644 src/basic/math/b7b5.STRVAL.s rename src/basic/{,stubs_math => math}/b7b5.interop (100%) create mode 100644 strings/18608100000000 create mode 100644 strings/208CB64C create mode 100644 strings/85248425 diff --git a/STATUS.md b/STATUS.md index 7d0716b9..422b7e4c 100644 --- a/STATUS.md +++ b/STATUS.md @@ -202,7 +202,7 @@ Floating point mathematical routines - not official, but well known and broadly | `$B391` | `GIVAYF` | PARTIAL | not fully tested yet | | `$B3A2` | `convert_Y_to_FAC1` | DONE | | | `$B794` | `convert_u8_A_to_FAC1` | DONE | | -| `$B7B5` | `STRVAL` | NOT DONE | imports string to FAC1 | +| `$B7B5` | `STRVAL` | PARTIAL | Only for 38k memory model | | `$B7F7` | `convert_FAC1_to_ADDR` | NOT DONE | | | `$B849` | `add_HALF_FAC1` | DONE | | | `$B850` | `sub_MEM_FAC1` | DONE | | diff --git a/src/basic/,stubs_math/b7b5.STRVAL.s b/src/basic/,stubs_math/b7b5.STRVAL.s deleted file mode 100644 index 69acf4cc..00000000 --- a/src/basic/,stubs_math/b7b5.STRVAL.s +++ /dev/null @@ -1,20 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -;; #LAYOUT# * BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Math package - imports string to FAC1 - XXX: what about spaces? -; -; Input: -; - .A needs to be loaded with string length -; - string address in $22/$23 -; -; See also: -; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -; - -; XXX provide implementation - -STRVAL: - +STUB_IMPLEMENTATION diff --git a/src/basic/math/b7b5.STRVAL.s b/src/basic/math/b7b5.STRVAL.s new file mode 100644 index 00000000..49ebe76c --- /dev/null +++ b/src/basic/math/b7b5.STRVAL.s @@ -0,0 +1,53 @@ +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Math package - converts string to FAC1 +; +; Input: +; - .A needs to be loaded with string length +; - string address in $22/$23 +; +; See also: +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://www.c64-wiki.com/wiki/STRVAL +; + +!ifdef CONFIG_MEMORY_MODEL_38K { +; Only supported model for now since needs CHRGOT and FIN + +STRVAL: + + ldx TXTPTR ; Save TXTPTR + stx FBUFPT + ldx TXTPTR+1 + stx FBUFPT+1 + + ldx INDEX ; Move string address into TXTPTR + stx TXTPTR + ldx INDEX+1 + stx TXTPTR+1 + + pha ; Save string length + tay + lda (INDEX),Y + sta TEMPF1 ; Save byte after string + lda #0 + sta (INDEX),Y ; NULL terminate string + + jsr CHRGOT + jsr FIN + + pla ; Retrieve string length + tay + lda TEMPF1 + sta (INDEX),Y ; Restore byte after string + + ldx FBUFPT ; Restore TXTPTR + stx TXTPTR + ldx FBUFPT+1 + stx TXTPTR+1 + rts +} diff --git a/src/basic/,stubs_math/b7b5.interop b/src/basic/math/b7b5.interop similarity index 100% rename from src/basic/,stubs_math/b7b5.interop rename to src/basic/math/b7b5.interop diff --git a/strings/18608100000000 b/strings/18608100000000 new file mode 100644 index 00000000..a7d8683d --- /dev/null +++ b/strings/18608100000000 @@ -0,0 +1,3 @@ +18 60 81 00 00 00 00 + +CLC + RTS + Floating point number 1.0 diff --git a/strings/208CB64C b/strings/208CB64C new file mode 100644 index 00000000..1a314d5f --- /dev/null +++ b/strings/208CB64C @@ -0,0 +1,3 @@ +JSR $B68C + JMP fragment + +Call some place in ROM + jump fragment diff --git a/strings/85248425 b/strings/85248425 new file mode 100644 index 00000000..872787af --- /dev/null +++ b/strings/85248425 @@ -0,0 +1,3 @@ +STA $24 + STY $25 + +Store YA to well known zero page vector diff --git a/testsuite/unit/math.vs b/testsuite/unit/math.vs index 7f14b74e..410aa3cb 100644 --- a/testsuite/unit/math.vs +++ b/testsuite/unit/math.vs @@ -530,5 +530,17 @@ print "COMPARE" compare $61 $66 $1001 print "END" +print "TEST: STRVAL 200E-1" +fill $61 $66 FF FF FF FF FF CC +fill $22 $23 $00 $05 +fill $500 $507 32 30 30 45 2D 31 31 +r A=6 +r PC=$B7B5 +ret +fill $1001 $1006 88 C8 00 00 00 00 +print "COMPARE" +compare $61 $61 $1001 +print "END" + q