Add int to float conversions

This commit is contained in:
Rikard Nordgren committed 2025-01-28 21:07:33 +01:00
1 parent e41558ce33
commit ee736cfcbc
16 files changed
+139 -56

No files matched your search

+4 -4
View File
@@ -199,8 +199,8 @@ Floating point mathematical routines - not official, but well known and broadly
| `$AF9A` | `compute_ST` | NOT DONE | | | `$AF9A` | `compute_ST` | NOT DONE | |
| `$B1AA` | `FACINX` | NOT DONE | convert FAC1 to 16-bit signed integer | | `$B1AA` | `FACINX` | NOT DONE | convert FAC1 to 16-bit signed integer |
| `$B1BF` | `convert_FAC1_to_s16` | NOT DONE | | | `$B1BF` | `convert_FAC1_to_s16` | NOT DONE | |
| `$B391` | `GIVAYF` | NOT DONE | 16-bit signed integer to FAC1 | | `$B391` | `GIVAYF` | PARTIAL | not fully tested yet |
| `$B3A2` | `convert_Y_to_FAC1` | NOT DONE | | | `$B3A2` | `convert_Y_to_FAC1` | PARTIAL | not fully tested yet |
| `$B794` | `convert_A_to_FAC1` | NOT DONE | | | `$B794` | `convert_A_to_FAC1` | NOT DONE | |
| `$B7B5` | `STRVAL` | NOT DONE | imports string to FAC1 | | `$B7B5` | `STRVAL` | NOT DONE | imports string to FAC1 |
| `$B7F7` | `convert_FAC1_to_ADDR` | NOT DONE | | | `$B7F7` | `convert_FAC1_to_ADDR` | NOT DONE | |
@@ -233,8 +233,8 @@ Floating point mathematical routines - not official, but well known and broadly
| `$BC1B` | `round_FAC1` | PARTIAL | not fully tested yet | | `$BC1B` | `round_FAC1` | PARTIAL | not fully tested yet |
| `$BC2B` | `sgn_FAC1_A` | DONE | | | `$BC2B` | `sgn_FAC1_A` | DONE | |
| `$BC39` | `sgn_FAC1` | NOT DONE | | | `$BC39` | `sgn_FAC1` | NOT DONE | |
| `$BC3C` | `convert_A_to_FAC1` | NOT DONE | | | `$BC3C` | `convert_A_to_FAC1` | PARTIAL | not fully tested yet |
| `$BC44` | `convert_i16_to_FAC1` | NOT DONE | | | `$BC44` | `convert_i16_to_FAC1` | PARTIAL | not fully tested yet |
| `$BC58` | `abs_FAC1` | NOT DONE | | | `$BC58` | `abs_FAC1` | NOT DONE | |
| `$BC5B` | `FCOMP` | NOT DONE | compare FAC1 with RAM location | | `$BC5B` | `FCOMP` | NOT DONE | compare FAC1 with RAM location |
| `$BC9B` | `QINT` | NOT DONE | convert FAC1 to 32 bit signed integer | | `$BC9B` | `QINT` | NOT DONE | convert FAC1 to 32 bit signed integer |
-22
View File
@@ -1,22 +0,0 @@
;; #LAYOUT# STD * #TAKE
;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000
;; #LAYOUT# * BASIC_0 #TAKE
;; #LAYOUT# * * #IGNORE
;
; Math package - 16-bit signed integer to FAC1
;
; Output:
; - .A - address high byte (XXX really, not the opposite?)
; - .Y - address low byte
;
; See also:
; - [CM64] Computes Mapping the Commodore 64 - page 107
; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic
;
; XXX provide implementation
GIVAYF:
+STUB_IMPLEMENTATION
@@ -1,14 +0,0 @@
;; #LAYOUT# STD * #TAKE
;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000
;; #LAYOUT# * BASIC_0 #TAKE
;; #LAYOUT# * * #IGNORE
;
; Math package - XXX
;
; - https://codebase64.org/doku.php?id=base:asm_include_file_for_basic_routines
; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics
;
; XXX add name, label, documentation, implement, test
+STUB_IMPLEMENTATION
@@ -1,13 +0,0 @@
;; #LAYOUT# STD * #TAKE
;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000
;; #LAYOUT# * BASIC_0 #TAKE
;; #LAYOUT# * * #IGNORE
;
; Math package - XXX
;
; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics
;
; XXX add name, label, documentation, implement, test
+STUB_IMPLEMENTATION
+27
View File
@@ -0,0 +1,27 @@
;; #LAYOUT# STD * #TAKE
;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000
;; #LAYOUT# * BASIC_0 #TAKE
;; #LAYOUT# * * #IGNORE
;
; Math package - 16-bit signed integer to FAC1
;
; Output:
; - .A - high byte
; - .Y - low byte
;
; Sets the data type flag at $0D to "numeric", stores the number in the FAC1 mantissa
; then calls convert_i16_to_FAC1
;
; See also:
; - [CM64] Computes Mapping the Commodore 64 - page 107
; - https://www.c64-wiki.com/wiki/GIVAYF
;
GIVAYF:
ldx #$00
stx $0D
sty FAC1_mantissa
sta FAC1_mantissa+1
jmp convert_i16_to_FAC1
File renamed without changes.
@@ -4,13 +4,21 @@
;; #LAYOUT# * * #IGNORE ;; #LAYOUT# * * #IGNORE
; ;
; Math package - XXX ; Math package - convert uint8 in Y to FAC1
;
; Input: Y - uint8 to convert to float
; Result: FAC1
;
; Stores Y into first FAC1 mantissa byte, clears the second and calls convert_i16_to_FAC1
; ;
; - https://www.c64-wiki.com/wiki/BASIC-ROM ; - https://www.c64-wiki.com/wiki/BASIC-ROM
; - https://sta.c64.org/cbm64basconv.html ; - https://sta.c64.org/cbm64basconv.html
; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True ; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True
; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics ; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics
; ;
; XXX add name, label, documentation, implement, test
+STUB_IMPLEMENTATION convert_Y_to_FAC1:
lda #$00
sta FAC1_mantissa+1
sty FAC1_mantissa
jmp convert_i16_to_FAC1
File renamed without changes.
+24
View File
@@ -0,0 +1,24 @@
;; #LAYOUT# STD * #TAKE
;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000
;; #LAYOUT# * BASIC_0 #TAKE
;; #LAYOUT# * * #IGNORE
;
; Math package - convert int8 in A to FAC1
;
; Input: A - int8 to convert to float
; Result: FAC1
;
; Sets first byte of FAC1 to A, sign extends A into tge second byte and falls through to convert_i16_to_FAC1
;
; - https://codebase64.org/doku.php?id=base:asm_include_file_for_basic_routines
; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics
;
convert_A_to_FAC1:
sta FAC1_mantissa
jsr sign_extend_A_to_Y
sty FAC1_mantissa+1
+nop ; To not leave a gap to the fallthrough
; Fall through to convert_i16_to_FAC1
File renamed without changes.
+29
View File
@@ -0,0 +1,29 @@
;; #LAYOUT# STD * #TAKE
;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000
;; #LAYOUT# * BASIC_0 #TAKE
;; #LAYOUT# * * #IGNORE
;
; Math package - Convert signed 16-bit integer to floating point
;
; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics
; - https://www.c64-wiki.com/wiki/GIVAYF (which calls this function)
;
; Convert the signed 16-bit integer in FAC1 mantissa ($62:$63)
; into a floating point number in FAC1
; NOTE:
; According to https://c64os.com/post/floatingpointmath at $BC49
; Assume FAC1_mantissa+0 and +1. X=exponent and C=0 if negative and C=1 if positive
convert_i16_to_FAC1:
ldx #$90
jsr carry
jmp convert_i16_expsign_to_FAC1 ; This should be at $BC49 (see note above)
carry:
lda FAC1_mantissa+1
cmp #$80 ; Copy sign into carry
rts
File renamed without changes.
@@ -0,0 +1,24 @@
;; #LAYOUT# STD * #TAKE
;; #LAYOUT# * BASIC_0 #TAKE
;; #LAYOUT# * * #IGNORE
;
; Math package - convert i16 with exponent in X and sign in C to FAC1
convert_i16_expsign_to_FAC1:
lda #$00
sta FAC1_mantissa+2 ; Clear high bytes of mantissa
sta FAC1_mantissa+3
stx FAC1_exponent
sta FAC1_sign
bcs @1
; Handle signed int
lda FAC1_mantissa+1 ; Clear sign bit of int 16
and #$7F
sta FAC1_mantissa+1
ldy #>CONST_NEG_32768 ; Subtract with 32768 to invert negative number
lda #<CONST_NEG_32768
jsr add_MEM_FAC1
@1: jmp normal_FAC1
+13
View File
@@ -0,0 +1,13 @@
;; #LAYOUT# STD * #TAKE
;; #LAYOUT# * BASIC_0 #TAKE
;; #LAYOUT# * * #IGNORE
;
; Math package - helper function to sign extend accumulator into Y
sign_extend_A_to_Y:
cmp #$80 ; Copy sign into carry
ldy #$00 ; Y = $00
bcc @1 ; Branch if not negative
dey ; Y = $FF
@1: rts
+4
View File
@@ -0,0 +1,4 @@
STA $64 + STA $65
Storing the same number (mostly 0) to the mantissa of FAC1 is a common operation when clearing parts of a floating point number.
This is trivial and not copyrightable.
+3
View File
@@ -0,0 +1,3 @@
TAY + LDA #0 + STA zero page
Saving the accumulator to be able to use it to clear some byte in the zero page. This a common and trivial idea.