diff --git a/lua/wire/cpulib.lua b/lua/wire/cpulib.lua index 0dce233..2e8690d 100644 --- a/lua/wire/cpulib.lua +++ b/lua/wire/cpulib.lua @@ -1000,6 +1000,8 @@ CPU(137, "EXTRETP", 1, 10.00, R0, "PTBL", "", "Set PTBL, CPU(140, "EXTRETA", 0, 11.00, R0, "", "", "Return from an external interrupt and restore R0-R31 registers") CPU(141, "EXTRETPA", 1, 11.00, R0, "PTBL", "", "Set PTBL, then return from an external interrupt with restoring R0-R31 registers") ---- Dec 15 -- UNDEFINED ------------------------------------------------------------------------------------------------------------------------ +CPU(150, "STERR", 2, 3.00, R0, "X", "Y", "Output an external error where X is error number and Y is error parameter") +CPU(151, "CLERR", 0, 1.00, R0, "", "", "Clear the external error output") ---- Dec 16 -- UNDEFINED ------------------------------------------------------------------------------------------------------------------------ ---- Dec 17 -- UNDEFINED ------------------------------------------------------------------------------------------------------------------------ ---- Dec 18 -- UNDEFINED ------------------------------------------------------------------------------------------------------------------------ diff --git a/lua/wire/zvm/zvm_features.lua b/lua/wire/zvm/zvm_features.lua index 8efa252..e7032c0 100644 --- a/lua/wire/zvm/zvm_features.lua +++ b/lua/wire/zvm/zvm_features.lua @@ -645,7 +645,9 @@ function ZVM:ExternalInterrupt(interruptNo) end - +function ZVM:MakeErrorCode(code,param) + return code+(param * (10^math.floor(-math.log10(math.abs(param)+1e-12)-1))) +end -------------------------------------------------------------------------------- function ZVM:Interrupt(interruptNo,interruptParameter,isExternal,cascadeInterrupt) @@ -660,8 +662,7 @@ function ZVM:Interrupt(interruptNo,interruptParameter,isExternal,cascadeInterrup self.LADD = interruptParameter or self.XEIP -- Output an error externally - local fractionalParameter = self.LADD * (10^math.floor(-math.log10(math.abs(self.LADD)+1e-12)-1)) - self:SignalError(fractionalParameter+interruptNo) + self:SignalError(self:MakeErrorCode(interruptNo,self.LADD)) -- Check if interrupts handling is enabled if self.IF == 1 then diff --git a/lua/wire/zvm/zvm_opcodes.lua b/lua/wire/zvm/zvm_opcodes.lua index 28a44ce..069aea8 100644 --- a/lua/wire/zvm/zvm_opcodes.lua +++ b/lua/wire/zvm/zvm_opcodes.lua @@ -1221,6 +1221,14 @@ ZVM.OpcodeTable[141] = function(self) --EXTRETPA end +ZVM.OpcodeTable[150] = function(self) -- STERR + self:Dyn_Emit("VM:SignalError(VM:MakeErrorCode($1,$2))") +end + +ZVM.OpcodeTable[151] = function(self) -- CLERR + self:Dyn_Emit("VM:SignalError(0)") +end + -------------------------------------------------------------------------------- ZVM.OpcodeTable[250] = function(self) --VADD self:Dyn_Emit("if VM.VMODE == 2 then")