diff --git a/src/interpreter/interpreter.rs b/src/interpreter/interpreter.rs index 9648796..fe43ed5 100644 --- a/src/interpreter/interpreter.rs +++ b/src/interpreter/interpreter.rs @@ -130,7 +130,9 @@ impl Interpreter { Mnemonic::PUSH_Mod(target) => self .computer .push_stack(self.computer.read_modrm(target)?)?, - Mnemonic::PUSH_S(_) => todo!(), + Mnemonic::PUSH_S(sreg) => self + .computer + .push_stack(self.computer.sregs.read(sreg).into())?, /* * POP @@ -550,15 +552,21 @@ impl Interpreter { .computer .regs .write(reg, self.computer.read_modrm(target)?), - Mnemonic::MOV_FromSReg(_, _) => todo!(), + Mnemonic::MOV_FromSReg(target, sreg) => self + .computer + .write_modrm(target, self.computer.sregs.read(sreg).into())?, Mnemonic::MOV_ToSReg(_, _) => todo!(), Mnemonic::MOV_Ib(target, val) => self.computer.write_modrm(target, val.into())?, Mnemonic::MOV_Iv(target, val) => self.computer.write_modrm(target, val.into())?, Mnemonic::MOV_AL0b(val) => self.computer.regs.ax.lower = val, Mnemonic::MOV_AX0v(val) => self.computer.regs.ax.write(val), - Mnemonic::MOV_0bAL(_) => todo!(), - Mnemonic::MOV_0vAX(_) => todo!(), + Mnemonic::MOV_0bAL(b) => self + .computer + .write(self.computer.regs.ax.lower.into(), b.into())?, + Mnemonic::MOV_0vAX(w) => self + .computer + .write(self.computer.regs.ax.read().into(), w.into())?, Mnemonic::MOV_ALIb(val) => self.computer.regs.ax.lower = val, Mnemonic::MOV_CLIb(val) => self.computer.regs.cx.lower = val, diff --git a/src/interpreter/register.rs b/src/interpreter/register.rs index a39c77c..f74179d 100644 --- a/src/interpreter/register.rs +++ b/src/interpreter/register.rs @@ -161,6 +161,32 @@ impl SegmentRegister { cs: 0, } } + + pub fn read(&self, sreg: crate::register::SegmentRegister) -> Word { + match sreg { + crate::register::SegmentRegister::DS => self.ds, + crate::register::SegmentRegister::ES => self.es, + crate::register::SegmentRegister::SS => self.ss, + crate::register::SegmentRegister::CS => self.cs, + } + } + + pub fn write(&mut self, sreg: crate::register::SegmentRegister, val: ImmediateOperand) { + match val { + ImmediateOperand::Byte(b) => match sreg { + crate::register::SegmentRegister::DS => self.ds = Word::from_le_bytes([b, 0x0]), + crate::register::SegmentRegister::ES => self.es = Word::from_le_bytes([b, 0x0]), + crate::register::SegmentRegister::SS => self.ss = Word::from_le_bytes([b, 0x0]), + crate::register::SegmentRegister::CS => self.cs = Word::from_le_bytes([b, 0x0]), + }, + ImmediateOperand::Word(w) => match sreg { + crate::register::SegmentRegister::DS => self.ds = w, + crate::register::SegmentRegister::ES => self.es = w, + crate::register::SegmentRegister::SS => self.ss = w, + crate::register::SegmentRegister::CS => self.cs = w, + }, + } + } } impl fmt::Display for SegmentRegister { diff --git a/src/operands.rs b/src/operands.rs index 04dbffe..fe7b4c3 100644 --- a/src/operands.rs +++ b/src/operands.rs @@ -576,7 +576,17 @@ pub struct MemoryIndex { pub displacement: Option, } -impl Into for u16 { +impl Into for Word { + fn into(self) -> MemoryIndex { + MemoryIndex { + base: None, + index: None, + displacement: Some(self.into()), + } + } +} + +impl Into for Byte { fn into(self) -> MemoryIndex { MemoryIndex { base: None,