Add int to float conversions
This commit is contained in:
1 parent
e41558ce33
commit
ee736cfcbc
16 files changed
+139
-56
No files matched your search
@@ -199,8 +199,8 @@ Floating point mathematical routines - not official, but well known and broadly
|
||||
| `$AF9A` | `compute_ST` | NOT DONE | |
|
||||
| `$B1AA` | `FACINX` | NOT DONE | convert FAC1 to 16-bit signed integer |
|
||||
| `$B1BF` | `convert_FAC1_to_s16` | NOT DONE | |
|
||||
| `$B391` | `GIVAYF` | NOT DONE | 16-bit signed integer to FAC1 |
|
||||
| `$B3A2` | `convert_Y_to_FAC1` | NOT DONE | |
|
||||
| `$B391` | `GIVAYF` | PARTIAL | not fully tested yet |
|
||||
| `$B3A2` | `convert_Y_to_FAC1` | PARTIAL | not fully tested yet |
|
||||
| `$B794` | `convert_A_to_FAC1` | NOT DONE | |
|
||||
| `$B7B5` | `STRVAL` | NOT DONE | imports string to FAC1 |
|
||||
| `$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 |
|
||||
| `$BC2B` | `sgn_FAC1_A` | DONE | |
|
||||
| `$BC39` | `sgn_FAC1` | NOT DONE | |
|
||||
| `$BC3C` | `convert_A_to_FAC1` | NOT DONE | |
|
||||
| `$BC44` | `convert_i16_to_FAC1` | NOT DONE | |
|
||||
| `$BC3C` | `convert_A_to_FAC1` | PARTIAL | not fully tested yet |
|
||||
| `$BC44` | `convert_i16_to_FAC1` | PARTIAL | not fully tested yet |
|
||||
| `$BC58` | `abs_FAC1` | NOT DONE | |
|
||||
| `$BC5B` | `FCOMP` | NOT DONE | compare FAC1 with RAM location |
|
||||
| `$BC9B` | `QINT` | NOT DONE | convert FAC1 to 32 bit signed integer |
|
||||
|
||||
@@ -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
|
||||
@@ -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.
+11
-3
@@ -4,13 +4,21 @@
|
||||
;; #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://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://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.
@@ -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.
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
Reference in new issue
Block a user