ft(interpreter): impl low hanging fruits
This commit is contained in:
@@ -130,7 +130,9 @@ impl Interpreter {
|
|||||||
Mnemonic::PUSH_Mod(target) => self
|
Mnemonic::PUSH_Mod(target) => self
|
||||||
.computer
|
.computer
|
||||||
.push_stack(self.computer.read_modrm(target)?)?,
|
.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
|
* POP
|
||||||
@@ -550,15 +552,21 @@ impl Interpreter {
|
|||||||
.computer
|
.computer
|
||||||
.regs
|
.regs
|
||||||
.write(reg, self.computer.read_modrm(target)?),
|
.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_ToSReg(_, _) => todo!(),
|
||||||
Mnemonic::MOV_Ib(target, val) => self.computer.write_modrm(target, val.into())?,
|
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_Iv(target, val) => self.computer.write_modrm(target, val.into())?,
|
||||||
|
|
||||||
Mnemonic::MOV_AL0b(val) => self.computer.regs.ax.lower = val,
|
Mnemonic::MOV_AL0b(val) => self.computer.regs.ax.lower = val,
|
||||||
Mnemonic::MOV_AX0v(val) => self.computer.regs.ax.write(val),
|
Mnemonic::MOV_AX0v(val) => self.computer.regs.ax.write(val),
|
||||||
Mnemonic::MOV_0bAL(_) => todo!(),
|
Mnemonic::MOV_0bAL(b) => self
|
||||||
Mnemonic::MOV_0vAX(_) => todo!(),
|
.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_ALIb(val) => self.computer.regs.ax.lower = val,
|
||||||
Mnemonic::MOV_CLIb(val) => self.computer.regs.cx.lower = val,
|
Mnemonic::MOV_CLIb(val) => self.computer.regs.cx.lower = val,
|
||||||
|
|||||||
@@ -161,6 +161,32 @@ impl SegmentRegister {
|
|||||||
cs: 0,
|
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 {
|
impl fmt::Display for SegmentRegister {
|
||||||
|
|||||||
@@ -576,7 +576,17 @@ pub struct MemoryIndex {
|
|||||||
pub displacement: Option<ImmediateOperand>,
|
pub displacement: Option<ImmediateOperand>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Into<MemoryIndex> for u16 {
|
impl Into<MemoryIndex> for Word {
|
||||||
|
fn into(self) -> MemoryIndex {
|
||||||
|
MemoryIndex {
|
||||||
|
base: None,
|
||||||
|
index: None,
|
||||||
|
displacement: Some(self.into()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Into<MemoryIndex> for Byte {
|
||||||
fn into(self) -> MemoryIndex {
|
fn into(self) -> MemoryIndex {
|
||||||
MemoryIndex {
|
MemoryIndex {
|
||||||
base: None,
|
base: None,
|
||||||
|
|||||||
Reference in New Issue
Block a user