diff --git a/src/libvm/src/inst.rs b/src/libvm/src/inst.rs index 90f27ad..41c831e 100644 --- a/src/libvm/src/inst.rs +++ b/src/libvm/src/inst.rs @@ -23,33 +23,35 @@ macro_rules! instructions { pub type InstOp = u16; instructions! { - ADD = 0x0000, - SUB = 0x0001, - MUL = 0x0002, - DIV = 0x0003, - IDIV = 0x0004, - MOD = 0x0005, - AND = 0x0006, - OR = 0x0007, - XOR = 0x0008, - SHL = 0x0009, - SHR = 0x000a, - INEG = 0x000b, - INV = 0x000c, - NOT = 0x000d, - CMPEQ = 0x1000, - CMPLT = 0x1001, - JMP = 0x1002, - JZ = 0x1003, - JNZ = 0x1004, - CALL = 0x2000, - RET = 0x2001, - PUSH = 0x2002, - POP = 0x2003, - MOV = 0x3000, - HALT = 0xF000, - NOP = 0xF001, - DUMP = 0xF002, + ADD = 0x0000, + SUB = 0x0001, + MUL = 0x0002, + DIV = 0x0003, + IDIV = 0x0004, + MOD = 0x0005, + AND = 0x0006, + OR = 0x0007, + XOR = 0x0008, + SHL = 0x0009, + SHR = 0x000a, + INEG = 0x000b, + INV = 0x000c, + NOT = 0x000d, + CMPEQ = 0x1000, + CMPLT = 0x1001, + JMP = 0x1002, + JZ = 0x1003, + JNZ = 0x1004, + CALL = 0x2000, + RET = 0x2001, + PUSH = 0x2002, + POP = 0x2003, + INT = 0x2004, + IRET = 0x2005, + MOV = 0x3000, + HALT = 0xF000, + NOP = 0xF001, + DUMP = 0xF002, } #[derive(Debug, Clone, Copy)] @@ -77,6 +79,8 @@ pub enum Inst { Ret, Push(Source), Pop(Dest), + Int(Source, Source), + IRet, Mov(Dest, Source), Halt, Nop, @@ -110,6 +114,8 @@ impl Inst { Inst::Ret => RET, Inst::Push(_) => PUSH, Inst::Pop(_) => POP, + Inst::Int(_, _) => INT, + Inst::IRet => IRET, Inst::Halt => HALT, Inst::Nop => NOP, Inst::Dump => DUMP, @@ -134,7 +140,8 @@ impl Inst { | Inst::Not(dest, source) | Inst::Mov(dest, source) => { 3 + dest.len() + source.len() } Inst::CmpEq(s1, s2) - | Inst::CmpLt(s1, s2) => { 3 + s1.len() + s2.len() } + | Inst::CmpLt(s1, s2) + | Inst::Int(s1, s2) => { 3 + s1.len() + s2.len() } Inst::Jmp(v) | Inst::Jz(v) | Inst::Jnz(v) @@ -144,7 +151,8 @@ impl Inst { Inst::Ret | Inst::Halt | Inst::Nop - | Inst::Dump => { 2 } + | Inst::Dump + | Inst::IRet => { 2 } } } } diff --git a/src/libvm/src/mem.rs b/src/libvm/src/mem.rs index 2a0e15f..02f9ec2 100644 --- a/src/libvm/src/mem.rs +++ b/src/libvm/src/mem.rs @@ -121,6 +121,8 @@ impl MemCursor RET => Ok(Inst::Ret), PUSH => source!(Push), POP => dest!(Pop), + INT => { todo!("INT decode") }, + IRET => { todo!("IRET decode") }, MOV => dest_source!(Mov), HALT => Ok(Inst::Halt), NOP => Ok(Inst::Nop), diff --git a/src/libvm/src/state.rs b/src/libvm/src/state.rs index 803f79d..07b2bad 100644 --- a/src/libvm/src/state.rs +++ b/src/libvm/src/state.rs @@ -356,6 +356,16 @@ impl State { Inst::Pop(d) => { self.pop(d)?; } + Inst::Int(v, a) => { + let vector = self.load_source(v)?; + let aux = self.load_source(a)?; + // this method immediately jumps, so don't let the next_ip be set below + return self.interrupt(next_ip, vector as usize, aux); + } + Inst::IRet => { + // this method immediately jumps, so don't let the next_ip be set below + return self.exit_interrupt(); + } Inst::Mov(d, s) => { let value = self.load_source(s)?; self.store_dest(d, value)?;