diff --git a/compiler/res/prog8lib/c64flt.p8 b/compiler/res/prog8lib/c64flt.p8 index c0127f811..8f02ba27c 100644 --- a/compiler/res/prog8lib/c64flt.p8 +++ b/compiler/res/prog8lib/c64flt.p8 @@ -9,11 +9,11 @@ ~ c64flt { ; ---- this block contains C-64 floating point related functions ---- - + const float PI = 3.141592653589793 const float TWOPI = 6.283185307179586 - + ; ---- C64 basic and kernal ROM float constants and functions ---- ; note: the fac1 and fac2 are working registers and take 6 bytes each, @@ -34,6 +34,7 @@ memory float FL_PIHALF = $e2e0 ; PI / 2 memory float FL_TWOPI = $e2e5 ; 2 * PI memory float FL_FR4 = $e2ea ; .25 + float FL_ZERO = 0.0 ; oddly enough 0.0 isn't available in the kernel ; note: fac1/2 might get clobbered even if not mentioned in the function's name. @@ -192,7 +193,7 @@ asmsub GETADRAY () -> clobbers(X) -> (uword @ AY) { } sub print_f (float value) { - ; ---- prints the floating point value (without a newline) using basic rom routines. + ; ---- prints the floating point value (without a newline) using basic rom routines. %asm {{ stx c64.SCRATCH_ZPREGX lda #fmath_float1 jmp c64flt.MOVFM .pend - + pop_float_to_indexed_var .proc ; -- pop the float on the stack, to the memory in the array at A/Y indexed by the byte on stack sta c64.SCRATCH_ZPWORD1 @@ -435,7 +436,7 @@ pop_float_to_indexed_var .proc .pend copy_float .proc - ; -- copies the 5 bytes of the mflt value pointed to by SCRATCH_ZPWORD1, + ; -- 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. sta c64.SCRATCH_ZPWORD2 sty c64.SCRATCH_ZPWORD2+1 @@ -472,7 +473,7 @@ inc_var_f .proc ldx c64.SCRATCH_ZPREGX rts .pend - + dec_var_f .proc ; -- subtract 1 from float pointed to by A/Y sta c64.SCRATCH_ZPWORD1 @@ -490,7 +491,7 @@ dec_var_f .proc ldx c64.SCRATCH_ZPREGX rts .pend - + inc_indexed_var_f .proc ; -- add 1 to float in array pointed to by A/Y, at index X pha @@ -508,7 +509,7 @@ inc_indexed_var_f .proc iny + jmp inc_var_f .pend - + dec_indexed_var_f .proc ; -- subtract 1 to float in array pointed to by A/Y, at index X pha @@ -526,7 +527,7 @@ dec_indexed_var_f .proc iny + jmp dec_var_f .pend - + pop_2_floats_f2_in_fac1 .proc ; -- pop 2 floats from stack, load the second one in FAC1 as well @@ -555,7 +556,7 @@ push_fac1_as_result .proc ldx c64.SCRATCH_ZPREGX jmp push_float .pend - + pow_f .proc ; -- push f1 ** f2 on stack lda #c64.FL_LOG2 + lda #FL_LOG2 jsr c64flt.MOVFM jsr c64flt.FDIVT jmp push_fac1_as_result .pend - + func_sqrt .proc jsr pop_float_fac1 stx c64.SCRATCH_ZPREGX jsr c64flt.SQR jmp push_fac1_as_result .pend - + func_rad .proc ; -- convert degrees to radians (d * pi / 180) jsr pop_float_fac1 @@ -799,7 +800,7 @@ func_rad .proc jmp push_fac1_as_result _pi_div_180 .byte 123, 14, 250, 53, 18 ; pi / 180 .pend - + func_deg .proc ; -- convert radians to degrees (d * (1/ pi * 180)) jsr pop_float_fac1 @@ -810,7 +811,7 @@ func_deg .proc jmp push_fac1_as_result _one_over_pi_div_180 .byte 134, 101, 46, 224, 211 ; 1 / (pi * 180) .pend - + func_round .proc jsr pop_float_fac1 stx c64.SCRATCH_ZPREGX @@ -818,14 +819,14 @@ func_round .proc jsr c64flt.INT jmp push_fac1_as_result .pend - + func_floor .proc jsr pop_float_fac1 stx c64.SCRATCH_ZPREGX jsr c64flt.INT jmp push_fac1_as_result .pend - + func_ceil .proc ; -- ceil: tr = int(f); if tr==f -> return else return tr+1 jsr pop_float_fac1 @@ -853,7 +854,7 @@ func_any_f .proc asl a clc adc c64.SCRATCH_ZPB1 ; times 5 because of float - jmp func_any_b._entry + jmp prog8_lib.func_any_b._entry .pend func_all_f .proc @@ -865,7 +866,7 @@ func_all_f .proc clc adc c64.SCRATCH_ZPB1 ; times 5 because of float sta _cmp_mod+1 ; self-modifying code - jsr peek_address + jsr prog8_lib.peek_address ldy #0 - lda (c64.SCRATCH_ZPWORD1),y bne + @@ -893,53 +894,18 @@ _cmp_mod cpy #255 ; modified .pend func_max_f .proc - lda #<_min_float - ldy #>_min_float - jsr c64flt.MOVFM ; fac1=min(float) - lda #255 - sta _cmp_mod+1 ; compare using 255 so we keep larger values -_minmax_entry jsr pop_array_and_lengthmin1Y - stx c64.SCRATCH_ZPREGX -- sty c64.SCRATCH_ZPREG - lda c64.SCRATCH_ZPWORD1 - ldy c64.SCRATCH_ZPWORD1+1 - jsr c64flt.FCOMP -_cmp_mod cmp #255 ; will be modified - bne + - ; fac1 is smaller/larger, so store the new value instead - lda c64.SCRATCH_ZPWORD1 - ldy c64.SCRATCH_ZPWORD1+1 - jsr c64flt.MOVFM - ldy c64.SCRATCH_ZPREG - dey - cmp #255 - beq + - lda c64.SCRATCH_ZPWORD1 - clc - adc #5 - sta c64.SCRATCH_ZPWORD1 - bcc - - inc c64.SCRATCH_ZPWORD1+1 - bne - -+ jmp push_fac1_as_result -_min_float .byte 255,255,255,255,255 ; -1.7014118345e+38 + .warn "todo: fix func_max_f / func_min_f" ; TODO .pend func_min_f .proc - lda #<_max_float - ldy #>_max_float - jsr c64flt.MOVFM ; fac1=max(float) - lda #1 - sta func_max_f._cmp_mod+1 ; compare using 1 so we keep smaller values - jmp func_max_f._minmax_entry -_max_float .byte 255,127,255,255,255 ; 1.7014118345e+38 + .warn "todo: fix func_max_f / func_min_f" ; TODO .pend func_sum_f .proc - lda #c64.FL_NEGHLF + lda #FL_ZERO jsr c64flt.MOVFM - jsr pop_array_and_lengthmin1Y + jsr prog8_lib.pop_array_and_lengthmin1Y stx c64.SCRATCH_ZPREGX - sty c64.SCRATCH_ZPREG lda c64.SCRATCH_ZPWORD1 @@ -956,8 +922,7 @@ func_sum_f .proc bcc - inc c64.SCRATCH_ZPWORD1+1 bne - -+ jsr c64flt.FADDH - jmp push_fac1_as_result ++ jmp push_fac1_as_result .pend }} diff --git a/compiler/src/prog8/stackvm/StackVm.kt b/compiler/src/prog8/stackvm/StackVm.kt index 328e1c5e5..f4836da89 100644 --- a/compiler/src/prog8/stackvm/StackVm.kt +++ b/compiler/src/prog8/stackvm/StackVm.kt @@ -2090,7 +2090,6 @@ class StackVm(private var traceOutputFile: String?) { Syscall.FUNC_MAX_F -> { val iterable = evalstack.pop() val value = heap.get(iterable.heapId) - // TODO CHECK max(floatarray) correctness val result = value.doubleArray!!.max() ?: 0.0 evalstack.push(Value(DataType.FLOAT, result)) } @@ -2129,7 +2128,6 @@ class StackVm(private var traceOutputFile: String?) { Syscall.FUNC_MIN_F -> { val iterable = evalstack.pop() val value = heap.get(iterable.heapId) - // TODO check min(floatarray) correctness val result = value.doubleArray!!.min() ?: 0.0 evalstack.push(Value(DataType.FLOAT, result)) } @@ -2143,7 +2141,6 @@ class StackVm(private var traceOutputFile: String?) { Syscall.FUNC_AVG_F -> { val iterable = evalstack.pop() val value = heap.get(iterable.heapId) - // TODO check avg(floatarray) correctness evalstack.push(Value(DataType.FLOAT, value.doubleArray!!.average())) } Syscall.FUNC_SUM_UB -> { @@ -2168,7 +2165,6 @@ class StackVm(private var traceOutputFile: String?) { evalstack.push(Value(DataType.FLOAT, value.array.map{it.integer!!}.sum())) } Syscall.FUNC_SUM_F -> { - // TODO check sum(floatarray) correctness val iterable = evalstack.pop() val value = heap.get(iterable.heapId) evalstack.push(Value(DataType.FLOAT, value.doubleArray!!.sum()))