2022-04-23 00:15:51 +00:00
|
|
|
; Prog8 definitions for floating point handling on the VirtualMachine
|
|
|
|
|
|
|
|
%option enable_floats
|
|
|
|
|
|
|
|
floats {
|
|
|
|
|
|
|
|
const float PI = 3.141592653589793
|
|
|
|
const float TWOPI = 6.283185307179586
|
|
|
|
|
|
|
|
sub print_f(float value) {
|
|
|
|
; ---- prints the floating point value (without a newline).
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2023-04-10 14:59:08 +00:00
|
|
|
loadm.f fr65535,floats.print_f.value
|
2023-04-13 21:45:02 +00:00
|
|
|
setparam.f fr65535,0
|
2022-05-04 18:47:48 +00:00
|
|
|
syscall 25
|
2022-04-29 22:10:07 +00:00
|
|
|
return
|
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub pow(float value, float power) -> float {
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2022-09-15 21:08:41 +00:00
|
|
|
loadm.f fr0,floats.pow.value
|
|
|
|
loadm.f fr1,floats.pow.power
|
2022-05-11 20:09:46 +00:00
|
|
|
fpow.f fr0,fr1
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-30 22:09:03 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub fabs(float value) -> float {
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2022-09-15 21:08:41 +00:00
|
|
|
loadm.f fr0,floats.fabs.value
|
2022-04-30 22:09:03 +00:00
|
|
|
fabs.f fr0,fr0
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-30 22:09:03 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub sin(float angle) -> float {
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2022-09-15 21:08:41 +00:00
|
|
|
loadm.f fr0,floats.sin.angle
|
2022-04-30 22:09:03 +00:00
|
|
|
fsin.f fr0,fr0
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-29 22:10:07 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub cos(float angle) -> float {
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2022-09-15 21:08:41 +00:00
|
|
|
loadm.f fr0,floats.cos.angle
|
2022-04-30 22:09:03 +00:00
|
|
|
fcos.f fr0,fr0
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-30 22:09:03 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub tan(float value) -> float {
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2022-09-15 21:08:41 +00:00
|
|
|
loadm.f fr0,floats.tan.value
|
2022-04-30 22:09:03 +00:00
|
|
|
ftan.f fr0,fr0
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-30 22:09:03 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub atan(float value) -> float {
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2022-09-15 21:08:41 +00:00
|
|
|
loadm.f fr0,floats.atan.value
|
2022-04-30 22:09:03 +00:00
|
|
|
fatan.f fr0,fr0
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-30 22:09:03 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub ln(float value) -> float {
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2022-09-15 21:08:41 +00:00
|
|
|
loadm.f fr0,floats.ln.value
|
2022-04-30 22:09:03 +00:00
|
|
|
fln.f fr0,fr0
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-30 22:09:03 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub log2(float value) -> float {
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2022-09-15 21:08:41 +00:00
|
|
|
loadm.f fr0,floats.log2.value
|
2022-05-02 18:16:45 +00:00
|
|
|
flog.f fr0,fr0
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-30 22:09:03 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub sqrt(float value) -> float {
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2022-09-15 21:08:41 +00:00
|
|
|
loadm.f fr0,floats.sqrt.value
|
2022-08-07 15:43:40 +00:00
|
|
|
sqrt.f fr0,fr0
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-30 22:09:03 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub rad(float angle) -> float {
|
|
|
|
; -- convert degrees to radians (d * pi / 180)
|
2022-04-30 22:09:03 +00:00
|
|
|
return angle * PI / 180.0
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub deg(float angle) -> float {
|
|
|
|
; -- convert radians to degrees (d * (1/ pi * 180))
|
2022-04-30 22:09:03 +00:00
|
|
|
return angle * 180.0 / PI
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub round(float value) -> float {
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2022-09-15 21:08:41 +00:00
|
|
|
loadm.f fr0,floats.round.value
|
2022-04-30 22:09:03 +00:00
|
|
|
fround.f fr0,fr0
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-30 22:09:03 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub floor(float value) -> float {
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2022-09-15 21:08:41 +00:00
|
|
|
loadm.f fr0,floats.floor.value
|
2022-04-30 22:09:03 +00:00
|
|
|
ffloor.f fr0,fr0
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-30 22:09:03 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub ceil(float value) -> float {
|
|
|
|
; -- ceil: tr = int(f); if tr==f -> return else return tr+1
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2022-09-15 21:08:41 +00:00
|
|
|
loadm.f fr0,floats.ceil.value
|
2022-04-30 22:09:03 +00:00
|
|
|
fceil.f fr0,fr0
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-30 22:09:03 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub rndf() -> float {
|
2022-09-30 12:05:11 +00:00
|
|
|
%ir {{
|
2023-04-10 14:16:35 +00:00
|
|
|
syscall 35
|
|
|
|
pop.f fr0
|
2023-04-11 20:28:19 +00:00
|
|
|
returnr.f fr0
|
2022-04-30 22:09:03 +00:00
|
|
|
}}
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|
2022-10-22 11:33:35 +00:00
|
|
|
|
2022-11-06 21:41:23 +00:00
|
|
|
sub rndseedf(float seed) {
|
2022-10-22 11:33:35 +00:00
|
|
|
%ir {{
|
2023-04-10 14:59:08 +00:00
|
|
|
loadm.f fr65535,floats.rndseedf.seed
|
2023-04-13 21:45:02 +00:00
|
|
|
setparam.f fr65535,0
|
2022-10-22 11:33:35 +00:00
|
|
|
syscall 32
|
|
|
|
}}
|
|
|
|
}
|
|
|
|
|
2022-04-23 00:15:51 +00:00
|
|
|
}
|