2020-03-10 21:03:24 +00:00
|
|
|
; --- low level floating point assembly routines for the C64
|
|
|
|
|
2020-09-05 00:05:28 +00:00
|
|
|
FL_ONE_const .byte 129 ; 1.0
|
|
|
|
FL_ZERO_const .byte 0,0,0,0,0 ; 0.0
|
2020-12-21 22:22:02 +00:00
|
|
|
FL_LOG2_const .byte $80, $31, $72, $17, $f8 ; log(2)
|
|
|
|
|
2020-09-05 00:05:28 +00:00
|
|
|
|
2020-09-13 18:38:50 +00:00
|
|
|
floats_store_reg .byte 0 ; temp storage
|
2023-03-10 03:07:50 +00:00
|
|
|
floats_temp_var .byte 0,0,0,0,0 ; temporary storage for a float
|
2020-08-23 18:25:00 +00:00
|
|
|
|
2020-03-10 21:03:24 +00:00
|
|
|
ub2float .proc
|
|
|
|
; -- convert ubyte in SCRATCH_ZPB1 to float at address A/Y
|
|
|
|
; clobbers A, Y
|
2020-09-13 18:42:55 +00:00
|
|
|
stx P8ZP_SCRATCH_REG
|
2020-08-25 17:44:08 +00:00
|
|
|
sta P8ZP_SCRATCH_W2
|
|
|
|
sty P8ZP_SCRATCH_W2+1
|
|
|
|
ldy P8ZP_SCRATCH_B1
|
2020-08-29 21:55:26 +00:00
|
|
|
lda #0
|
|
|
|
jsr GIVAYF
|
2020-08-25 17:44:08 +00:00
|
|
|
_fac_to_mem ldx P8ZP_SCRATCH_W2
|
|
|
|
ldy P8ZP_SCRATCH_W2+1
|
2020-03-10 21:03:24 +00:00
|
|
|
jsr MOVMF
|
2020-09-13 18:42:55 +00:00
|
|
|
ldx P8ZP_SCRATCH_REG
|
2020-03-10 21:03:24 +00:00
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
|
|
|
b2float .proc
|
|
|
|
; -- convert byte in SCRATCH_ZPB1 to float at address A/Y
|
|
|
|
; clobbers A, Y
|
2020-09-13 18:42:55 +00:00
|
|
|
stx P8ZP_SCRATCH_REG
|
2020-08-25 17:44:08 +00:00
|
|
|
sta P8ZP_SCRATCH_W2
|
|
|
|
sty P8ZP_SCRATCH_W2+1
|
|
|
|
lda P8ZP_SCRATCH_B1
|
2020-03-10 21:03:24 +00:00
|
|
|
jsr FREADSA
|
|
|
|
jmp ub2float._fac_to_mem
|
|
|
|
.pend
|
|
|
|
|
|
|
|
uw2float .proc
|
|
|
|
; -- convert uword in SCRATCH_ZPWORD1 to float at address A/Y
|
2020-09-13 18:42:55 +00:00
|
|
|
stx P8ZP_SCRATCH_REG
|
2020-08-25 17:44:08 +00:00
|
|
|
sta P8ZP_SCRATCH_W2
|
|
|
|
sty P8ZP_SCRATCH_W2+1
|
|
|
|
lda P8ZP_SCRATCH_W1
|
|
|
|
ldy P8ZP_SCRATCH_W1+1
|
2020-03-10 21:03:24 +00:00
|
|
|
jsr GIVUAYFAY
|
|
|
|
jmp ub2float._fac_to_mem
|
|
|
|
.pend
|
|
|
|
|
|
|
|
w2float .proc
|
|
|
|
; -- convert word in SCRATCH_ZPWORD1 to float at address A/Y
|
2020-09-13 18:42:55 +00:00
|
|
|
stx P8ZP_SCRATCH_REG
|
2020-08-25 17:44:08 +00:00
|
|
|
sta P8ZP_SCRATCH_W2
|
|
|
|
sty P8ZP_SCRATCH_W2+1
|
|
|
|
ldy P8ZP_SCRATCH_W1
|
|
|
|
lda P8ZP_SCRATCH_W1+1
|
2020-03-10 21:03:24 +00:00
|
|
|
jsr GIVAYF
|
|
|
|
jmp ub2float._fac_to_mem
|
|
|
|
.pend
|
|
|
|
|
2020-11-19 21:58:38 +00:00
|
|
|
|
|
|
|
cast_from_uw .proc
|
|
|
|
; -- uword in A/Y into float var at (P8ZP_SCRATCH_W2)
|
|
|
|
stx P8ZP_SCRATCH_REG
|
|
|
|
jsr GIVUAYFAY
|
|
|
|
jmp ub2float._fac_to_mem
|
|
|
|
.pend
|
|
|
|
|
|
|
|
|
|
|
|
cast_from_w .proc
|
|
|
|
; -- word in A/Y into float var at (P8ZP_SCRATCH_W2)
|
|
|
|
stx P8ZP_SCRATCH_REG
|
|
|
|
jsr GIVAYFAY
|
|
|
|
jmp ub2float._fac_to_mem
|
|
|
|
.pend
|
|
|
|
|
|
|
|
|
|
|
|
cast_from_ub .proc
|
|
|
|
; -- ubyte in Y into float var at (P8ZP_SCRATCH_W2)
|
|
|
|
stx P8ZP_SCRATCH_REG
|
|
|
|
jsr FREADUY
|
|
|
|
jmp ub2float._fac_to_mem
|
|
|
|
.pend
|
|
|
|
|
|
|
|
|
|
|
|
cast_from_b .proc
|
|
|
|
; -- byte in A into float var at (P8ZP_SCRATCH_W2)
|
|
|
|
stx P8ZP_SCRATCH_REG
|
|
|
|
jsr FREADSA
|
|
|
|
jmp ub2float._fac_to_mem
|
|
|
|
.pend
|
|
|
|
|
|
|
|
cast_as_uw_into_ya .proc ; also used for float 2 ub
|
|
|
|
; -- cast float at A/Y to uword into Y/A
|
|
|
|
jsr MOVFM
|
2020-11-26 00:52:48 +00:00
|
|
|
jmp cast_FAC1_as_uw_into_ya
|
|
|
|
.pend
|
|
|
|
|
|
|
|
cast_as_w_into_ay .proc ; also used for float 2 b
|
|
|
|
; -- cast float at A/Y to word into A/Y
|
|
|
|
jsr MOVFM
|
|
|
|
jmp cast_FAC1_as_w_into_ay
|
|
|
|
.pend
|
|
|
|
|
|
|
|
cast_FAC1_as_uw_into_ya .proc ; also used for float 2 ub
|
|
|
|
; -- cast fac1 to uword into Y/A
|
|
|
|
stx P8ZP_SCRATCH_REG
|
2020-11-19 21:58:38 +00:00
|
|
|
jsr GETADR ; into Y/A
|
|
|
|
ldx P8ZP_SCRATCH_REG
|
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
2020-11-26 00:52:48 +00:00
|
|
|
cast_FAC1_as_w_into_ay .proc ; also used for float 2 b
|
|
|
|
; -- cast fac1 to word into A/Y
|
2020-11-19 21:58:38 +00:00
|
|
|
stx P8ZP_SCRATCH_REG
|
|
|
|
jsr AYINT
|
2022-05-03 21:43:38 +00:00
|
|
|
ldy floats.AYINT_facmo
|
|
|
|
lda floats.AYINT_facmo+1
|
2020-11-19 21:58:38 +00:00
|
|
|
ldx P8ZP_SCRATCH_REG
|
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
|
|
|
|
2020-03-10 21:03:24 +00:00
|
|
|
copy_float .proc
|
2022-01-09 15:18:13 +00:00
|
|
|
; -- copies the 5 bytes of the mflt value pointed to by P8ZP_SCRATCH_W1,
|
2020-03-10 21:03:24 +00:00
|
|
|
; into the 5 bytes pointed to by A/Y. Clobbers A,Y.
|
2022-01-09 15:18:13 +00:00
|
|
|
sta P8ZP_SCRATCH_W2
|
|
|
|
sty P8ZP_SCRATCH_W2+1
|
|
|
|
ldy #0
|
|
|
|
lda (P8ZP_SCRATCH_W1),y
|
|
|
|
sta (P8ZP_SCRATCH_W2),y
|
|
|
|
iny
|
|
|
|
lda (P8ZP_SCRATCH_W1),y
|
|
|
|
sta (P8ZP_SCRATCH_W2),y
|
|
|
|
iny
|
|
|
|
lda (P8ZP_SCRATCH_W1),y
|
|
|
|
sta (P8ZP_SCRATCH_W2),y
|
|
|
|
iny
|
|
|
|
lda (P8ZP_SCRATCH_W1),y
|
|
|
|
sta (P8ZP_SCRATCH_W2),y
|
|
|
|
iny
|
|
|
|
lda (P8ZP_SCRATCH_W1),y
|
|
|
|
sta (P8ZP_SCRATCH_W2),y
|
2020-03-10 21:03:24 +00:00
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
|
|
|
inc_var_f .proc
|
|
|
|
; -- add 1 to float pointed to by A/Y
|
2020-08-25 17:44:08 +00:00
|
|
|
sta P8ZP_SCRATCH_W1
|
|
|
|
sty P8ZP_SCRATCH_W1+1
|
2020-09-13 18:42:55 +00:00
|
|
|
stx P8ZP_SCRATCH_REG
|
2020-03-10 21:03:24 +00:00
|
|
|
jsr MOVFM
|
2020-09-05 00:05:28 +00:00
|
|
|
lda #<FL_ONE_const
|
|
|
|
ldy #>FL_ONE_const
|
2020-03-10 21:03:24 +00:00
|
|
|
jsr FADD
|
2020-08-25 17:44:08 +00:00
|
|
|
ldx P8ZP_SCRATCH_W1
|
|
|
|
ldy P8ZP_SCRATCH_W1+1
|
2020-03-10 21:03:24 +00:00
|
|
|
jsr MOVMF
|
2020-09-13 18:42:55 +00:00
|
|
|
ldx P8ZP_SCRATCH_REG
|
2020-03-10 21:03:24 +00:00
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
|
|
|
dec_var_f .proc
|
|
|
|
; -- subtract 1 from float pointed to by A/Y
|
2020-08-25 17:44:08 +00:00
|
|
|
sta P8ZP_SCRATCH_W1
|
|
|
|
sty P8ZP_SCRATCH_W1+1
|
2020-09-13 18:42:55 +00:00
|
|
|
stx P8ZP_SCRATCH_REG
|
2020-09-05 00:05:28 +00:00
|
|
|
lda #<FL_ONE_const
|
|
|
|
ldy #>FL_ONE_const
|
2020-03-10 21:03:24 +00:00
|
|
|
jsr MOVFM
|
2020-08-25 17:44:08 +00:00
|
|
|
lda P8ZP_SCRATCH_W1
|
|
|
|
ldy P8ZP_SCRATCH_W1+1
|
2020-03-10 21:03:24 +00:00
|
|
|
jsr FSUB
|
2020-08-25 17:44:08 +00:00
|
|
|
ldx P8ZP_SCRATCH_W1
|
|
|
|
ldy P8ZP_SCRATCH_W1+1
|
2020-03-10 21:03:24 +00:00
|
|
|
jsr MOVMF
|
2020-09-13 18:42:55 +00:00
|
|
|
ldx P8ZP_SCRATCH_REG
|
2020-03-10 21:03:24 +00:00
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
|
|
|
|
|
|
|
fmath_float1 .byte 0,0,0,0,0 ; storage for a mflpt5 value
|
|
|
|
fmath_float2 .byte 0,0,0,0,0 ; storage for a mflpt5 value
|
|
|
|
|
2020-10-30 22:02:20 +00:00
|
|
|
|
2020-11-23 23:35:30 +00:00
|
|
|
var_fac1_less_f .proc
|
|
|
|
; -- is the float in FAC1 < the variable AY?
|
|
|
|
stx P8ZP_SCRATCH_REG
|
|
|
|
jsr FCOMP
|
|
|
|
ldx P8ZP_SCRATCH_REG
|
|
|
|
cmp #255
|
|
|
|
beq +
|
|
|
|
lda #0
|
|
|
|
rts
|
|
|
|
+ lda #1
|
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
|
|
|
var_fac1_lesseq_f .proc
|
|
|
|
; -- is the float in FAC1 <= the variable AY?
|
|
|
|
stx P8ZP_SCRATCH_REG
|
|
|
|
jsr FCOMP
|
|
|
|
ldx P8ZP_SCRATCH_REG
|
|
|
|
cmp #0
|
|
|
|
beq +
|
|
|
|
cmp #255
|
|
|
|
beq +
|
|
|
|
lda #0
|
|
|
|
rts
|
|
|
|
+ lda #1
|
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
|
|
|
var_fac1_greater_f .proc
|
|
|
|
; -- is the float in FAC1 > the variable AY?
|
|
|
|
stx P8ZP_SCRATCH_REG
|
|
|
|
jsr FCOMP
|
|
|
|
ldx P8ZP_SCRATCH_REG
|
|
|
|
cmp #1
|
|
|
|
beq +
|
|
|
|
lda #0
|
2021-03-18 00:14:22 +00:00
|
|
|
rts
|
|
|
|
+ lda #1
|
|
|
|
rts
|
2020-11-23 23:35:30 +00:00
|
|
|
.pend
|
|
|
|
|
|
|
|
var_fac1_greatereq_f .proc
|
|
|
|
; -- is the float in FAC1 >= the variable AY?
|
|
|
|
stx P8ZP_SCRATCH_REG
|
|
|
|
jsr FCOMP
|
|
|
|
ldx P8ZP_SCRATCH_REG
|
|
|
|
cmp #0
|
|
|
|
beq +
|
|
|
|
cmp #1
|
|
|
|
beq +
|
|
|
|
lda #0
|
|
|
|
rts
|
|
|
|
+ lda #1
|
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
|
|
|
var_fac1_notequal_f .proc
|
|
|
|
; -- are the floats numbers in FAC1 and the variable AY *not* identical?
|
|
|
|
stx P8ZP_SCRATCH_REG
|
|
|
|
jsr FCOMP
|
|
|
|
ldx P8ZP_SCRATCH_REG
|
|
|
|
and #1
|
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
2020-11-22 12:56:23 +00:00
|
|
|
vars_equal_f .proc
|
|
|
|
; -- are the mflpt5 numbers in P8ZP_SCRATCH_W1 and AY identical?
|
|
|
|
sta P8ZP_SCRATCH_W2
|
|
|
|
sty P8ZP_SCRATCH_W2+1
|
|
|
|
ldy #0
|
|
|
|
lda (P8ZP_SCRATCH_W1),y
|
|
|
|
cmp (P8ZP_SCRATCH_W2),y
|
|
|
|
bne _false
|
|
|
|
iny
|
|
|
|
lda (P8ZP_SCRATCH_W1),y
|
|
|
|
cmp (P8ZP_SCRATCH_W2),y
|
|
|
|
bne _false
|
|
|
|
iny
|
|
|
|
lda (P8ZP_SCRATCH_W1),y
|
|
|
|
cmp (P8ZP_SCRATCH_W2),y
|
|
|
|
bne _false
|
|
|
|
iny
|
|
|
|
lda (P8ZP_SCRATCH_W1),y
|
|
|
|
cmp (P8ZP_SCRATCH_W2),y
|
|
|
|
bne _false
|
|
|
|
iny
|
|
|
|
lda (P8ZP_SCRATCH_W1),y
|
|
|
|
cmp (P8ZP_SCRATCH_W2),y
|
|
|
|
bne _false
|
|
|
|
lda #1
|
|
|
|
rts
|
|
|
|
_false lda #0
|
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
2020-03-10 21:03:24 +00:00
|
|
|
|
2020-11-22 14:05:45 +00:00
|
|
|
vars_less_f .proc
|
|
|
|
; -- is float in AY < float in P8ZP_SCRATCH_W2 ?
|
|
|
|
jsr MOVFM
|
|
|
|
lda P8ZP_SCRATCH_W2
|
|
|
|
ldy P8ZP_SCRATCH_W2+1
|
|
|
|
stx P8ZP_SCRATCH_REG
|
|
|
|
jsr FCOMP
|
|
|
|
ldx P8ZP_SCRATCH_REG
|
|
|
|
cmp #255
|
|
|
|
bne +
|
|
|
|
lda #1
|
|
|
|
rts
|
|
|
|
+ lda #0
|
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
|
|
|
vars_lesseq_f .proc
|
|
|
|
; -- is float in AY <= float in P8ZP_SCRATCH_W2 ?
|
|
|
|
jsr MOVFM
|
|
|
|
lda P8ZP_SCRATCH_W2
|
|
|
|
ldy P8ZP_SCRATCH_W2+1
|
|
|
|
stx P8ZP_SCRATCH_REG
|
|
|
|
jsr FCOMP
|
|
|
|
ldx P8ZP_SCRATCH_REG
|
|
|
|
cmp #255
|
|
|
|
bne +
|
|
|
|
- lda #1
|
|
|
|
rts
|
|
|
|
+ cmp #0
|
|
|
|
beq -
|
|
|
|
lda #0
|
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
2020-03-10 21:03:24 +00:00
|
|
|
less_f .proc
|
|
|
|
; -- is f1 < f2?
|
|
|
|
jsr compare_floats
|
|
|
|
cmp #255
|
|
|
|
beq compare_floats._return_true
|
|
|
|
bne compare_floats._return_false
|
|
|
|
.pend
|
|
|
|
|
|
|
|
|
|
|
|
lesseq_f .proc
|
|
|
|
; -- is f1 <= f2?
|
|
|
|
jsr compare_floats
|
|
|
|
cmp #255
|
|
|
|
beq compare_floats._return_true
|
|
|
|
cmp #0
|
|
|
|
beq compare_floats._return_true
|
|
|
|
bne compare_floats._return_false
|
|
|
|
.pend
|
|
|
|
|
|
|
|
greater_f .proc
|
|
|
|
; -- is f1 > f2?
|
|
|
|
jsr compare_floats
|
|
|
|
cmp #1
|
|
|
|
beq compare_floats._return_true
|
|
|
|
bne compare_floats._return_false
|
|
|
|
.pend
|
|
|
|
|
|
|
|
greatereq_f .proc
|
|
|
|
; -- is f1 >= f2?
|
|
|
|
jsr compare_floats
|
|
|
|
cmp #1
|
|
|
|
beq compare_floats._return_true
|
|
|
|
cmp #0
|
|
|
|
beq compare_floats._return_true
|
|
|
|
bne compare_floats._return_false
|
|
|
|
.pend
|
|
|
|
|
2020-10-30 22:02:20 +00:00
|
|
|
set_array_float_from_fac1 .proc
|
|
|
|
; -- set the float in FAC1 in the array (index in A, array in P8ZP_SCRATCH_W1)
|
|
|
|
sta P8ZP_SCRATCH_B1
|
|
|
|
asl a
|
|
|
|
asl a
|
|
|
|
clc
|
|
|
|
adc P8ZP_SCRATCH_B1
|
|
|
|
ldy P8ZP_SCRATCH_W1+1
|
|
|
|
clc
|
|
|
|
adc P8ZP_SCRATCH_W1
|
|
|
|
bcc +
|
|
|
|
iny
|
|
|
|
+ stx floats_store_reg
|
|
|
|
tax
|
|
|
|
jsr MOVMF
|
|
|
|
ldx floats_store_reg
|
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
2020-04-03 20:44:10 +00:00
|
|
|
|
|
|
|
set_0_array_float .proc
|
2020-10-19 21:57:00 +00:00
|
|
|
; -- set a float in an array to zero (index in A, array in P8ZP_SCRATCH_W1)
|
|
|
|
sta P8ZP_SCRATCH_B1
|
2020-04-03 20:44:10 +00:00
|
|
|
asl a
|
|
|
|
asl a
|
|
|
|
clc
|
2020-10-19 21:57:00 +00:00
|
|
|
adc P8ZP_SCRATCH_B1
|
2020-04-03 20:44:10 +00:00
|
|
|
tay
|
|
|
|
lda #0
|
2020-08-25 17:44:08 +00:00
|
|
|
sta (P8ZP_SCRATCH_W1),y
|
2020-04-03 20:44:10 +00:00
|
|
|
iny
|
2020-08-25 17:44:08 +00:00
|
|
|
sta (P8ZP_SCRATCH_W1),y
|
2020-04-03 20:44:10 +00:00
|
|
|
iny
|
2020-08-25 17:44:08 +00:00
|
|
|
sta (P8ZP_SCRATCH_W1),y
|
2020-04-03 20:44:10 +00:00
|
|
|
iny
|
2020-08-25 17:44:08 +00:00
|
|
|
sta (P8ZP_SCRATCH_W1),y
|
2020-04-03 20:44:10 +00:00
|
|
|
iny
|
2020-08-25 17:44:08 +00:00
|
|
|
sta (P8ZP_SCRATCH_W1),y
|
2020-04-03 20:44:10 +00:00
|
|
|
rts
|
|
|
|
.pend
|
|
|
|
|
|
|
|
|
|
|
|
set_array_float .proc
|
2020-10-19 21:57:00 +00:00
|
|
|
; -- set a float in an array to a value (index in A, float in P8ZP_SCRATCH_W1, array in P8ZP_SCRATCH_W2)
|
|
|
|
sta P8ZP_SCRATCH_B1
|
2020-04-03 20:44:10 +00:00
|
|
|
asl a
|
|
|
|
asl a
|
|
|
|
clc
|
2020-10-19 21:57:00 +00:00
|
|
|
adc P8ZP_SCRATCH_B1
|
2020-08-25 17:44:08 +00:00
|
|
|
adc P8ZP_SCRATCH_W2
|
|
|
|
ldy P8ZP_SCRATCH_W2+1
|
2020-04-03 20:44:10 +00:00
|
|
|
bcc +
|
|
|
|
iny
|
|
|
|
+ jmp copy_float
|
|
|
|
; -- copies the 5 bytes of the mflt value pointed to by SCRATCH_ZPWORD1,
|
|
|
|
; into the 5 bytes pointed to by A/Y. Clobbers A,Y.
|
|
|
|
.pend
|