mirror of
https://github.com/irmen/prog8.git
synced 2026-04-26 05:17:54 +00:00
vm: added math.mul16_last_upper()
This commit is contained in:
@@ -53,6 +53,7 @@ SYSCALLS:
|
||||
43 = CLAMP_FLOAT
|
||||
44 = ATAN
|
||||
45 = STR_TO_FLOAT
|
||||
46 = MUL16_LAST_UPPER
|
||||
*/
|
||||
|
||||
enum class Syscall {
|
||||
@@ -101,7 +102,8 @@ enum class Syscall {
|
||||
CLAMP_UWORD,
|
||||
CLAMP_FLOAT,
|
||||
ATAN,
|
||||
STR_TO_FLOAT
|
||||
STR_TO_FLOAT,
|
||||
MUL16_LAST_UPPER
|
||||
;
|
||||
|
||||
companion object {
|
||||
@@ -490,6 +492,9 @@ object SysCalls {
|
||||
val result = floor(radians/2.0/PI*256.0)
|
||||
returnValue(callspec.returns!!, result, vm)
|
||||
}
|
||||
Syscall.MUL16_LAST_UPPER -> {
|
||||
returnValue(callspec.returns!!, vm.mul16_last_upper, vm)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ class VirtualMachine(irProgram: IRProgram) {
|
||||
var statusNegative = false
|
||||
internal var randomGenerator = Random(0xa55a7653)
|
||||
internal var randomGeneratorFloats = Random(0xc0d3dbad)
|
||||
internal var mul16_last_upper = 0u
|
||||
val cx16virtualregsBaseAddress: Int
|
||||
|
||||
init {
|
||||
@@ -1447,10 +1448,14 @@ class VirtualMachine(irProgram: IRProgram) {
|
||||
private fun plusMinusMultAnyWord(operator: String, reg1: Int, reg2: Int) {
|
||||
val left = registers.getUW(reg1)
|
||||
val right = registers.getUW(reg2)
|
||||
val result = when(operator) {
|
||||
"+" -> left + right
|
||||
"-" -> left - right
|
||||
"*" -> left * right
|
||||
val result: UInt
|
||||
when(operator) {
|
||||
"+" -> result = left + right
|
||||
"-" -> result = left - right
|
||||
"*" -> {
|
||||
result = left.toUInt() * right
|
||||
mul16_last_upper = result shr 16
|
||||
}
|
||||
else -> throw IllegalArgumentException("operator word $operator")
|
||||
}
|
||||
registers.setUW(reg1, result.toUShort())
|
||||
@@ -1458,10 +1463,14 @@ class VirtualMachine(irProgram: IRProgram) {
|
||||
|
||||
private fun plusMinusMultConstWord(operator: String, reg1: Int, value: UShort) {
|
||||
val left = registers.getUW(reg1)
|
||||
val result = when(operator) {
|
||||
"+" -> left + value
|
||||
"-" -> left - value
|
||||
"*" -> left * value
|
||||
val result: UInt
|
||||
when(operator) {
|
||||
"+" -> result = left + value
|
||||
"-" -> result = left - value
|
||||
"*" -> {
|
||||
result = left.toUInt() * value
|
||||
mul16_last_upper = result shr 16
|
||||
}
|
||||
else -> throw IllegalArgumentException("operator word $operator")
|
||||
}
|
||||
registers.setUW(reg1, result.toUShort())
|
||||
@@ -1470,10 +1479,14 @@ class VirtualMachine(irProgram: IRProgram) {
|
||||
private fun plusMinusMultAnyWordInplace(operator: String, reg1: Int, address: Int) {
|
||||
val memvalue = memory.getUW(address)
|
||||
val operand = registers.getUW(reg1)
|
||||
val result = when(operator) {
|
||||
"+" -> memvalue + operand
|
||||
"-" -> memvalue - operand
|
||||
"*" -> memvalue * operand
|
||||
val result: UInt
|
||||
when(operator) {
|
||||
"+" -> result = memvalue + operand
|
||||
"-" -> result = memvalue - operand
|
||||
"*" -> {
|
||||
result = memvalue.toUInt() * operand
|
||||
mul16_last_upper = result shr 16
|
||||
}
|
||||
else -> throw IllegalArgumentException("operator word $operator")
|
||||
}
|
||||
memory.setUW(address, result.toUShort())
|
||||
|
||||
Reference in New Issue
Block a user