ft: abstract and implement ADD::* interpretation
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
use crate::operands::{Byte, Word};
|
||||
use crate::operands::{Byte, Operand, Word};
|
||||
use core::fmt;
|
||||
|
||||
use super::flags::Flags;
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct Register {
|
||||
pub ax: AX,
|
||||
@@ -26,6 +28,73 @@ impl Register {
|
||||
di: 0,
|
||||
}
|
||||
}
|
||||
|
||||
/// Read value from a [`crate::register::Register`].
|
||||
pub fn read(&self, reg: crate::register::Register) -> Operand {
|
||||
match reg {
|
||||
crate::register::Register::AX => Operand::Word(self.ax.read()),
|
||||
crate::register::Register::BX => Operand::Word(self.bx.read()),
|
||||
crate::register::Register::CX => Operand::Word(self.cx.read()),
|
||||
crate::register::Register::DX => Operand::Word(self.dx.read()),
|
||||
crate::register::Register::AH => Operand::Byte(self.ax.upper),
|
||||
crate::register::Register::AL => Operand::Byte(self.ax.lower),
|
||||
crate::register::Register::BH => Operand::Byte(self.bx.upper),
|
||||
crate::register::Register::BL => Operand::Byte(self.bx.lower),
|
||||
crate::register::Register::CH => Operand::Byte(self.cx.upper),
|
||||
crate::register::Register::CL => Operand::Byte(self.cx.lower),
|
||||
crate::register::Register::DH => Operand::Byte(self.dx.upper),
|
||||
crate::register::Register::DL => Operand::Byte(self.dx.lower),
|
||||
crate::register::Register::DI => Operand::Word(self.di),
|
||||
crate::register::Register::SI => Operand::Word(self.si),
|
||||
crate::register::Register::BP => Operand::Word(self.bp),
|
||||
crate::register::Register::SP => Operand::Word(self.sp),
|
||||
}
|
||||
}
|
||||
|
||||
/// Write an [`Operand`] to a [`crate::register::Register`].
|
||||
pub fn write(&mut self, reg: crate::register::Register, op: Operand) {
|
||||
match op {
|
||||
Operand::Byte(byte) => match reg {
|
||||
crate::register::Register::AX => self.ax.lower = byte,
|
||||
crate::register::Register::BX => self.bx.lower = byte,
|
||||
crate::register::Register::CX => self.cx.lower = byte,
|
||||
crate::register::Register::DX => self.dx.lower = byte,
|
||||
crate::register::Register::AH => self.ax.upper = byte,
|
||||
crate::register::Register::AL => self.ax.lower = byte,
|
||||
crate::register::Register::BH => self.bx.upper = byte,
|
||||
crate::register::Register::BL => self.bx.lower = byte,
|
||||
crate::register::Register::CH => self.cx.upper = byte,
|
||||
crate::register::Register::CL => self.cx.lower = byte,
|
||||
crate::register::Register::DH => self.dx.upper = byte,
|
||||
crate::register::Register::DL => self.dx.lower = byte,
|
||||
crate::register::Register::DI => self.di = Word::from_le_bytes([0x0, byte]),
|
||||
crate::register::Register::SI => self.si = Word::from_le_bytes([0x0, byte]),
|
||||
crate::register::Register::BP => self.bp = Word::from_le_bytes([0x0, byte]),
|
||||
crate::register::Register::SP => self.sp = Word::from_le_bytes([0x0, byte]),
|
||||
},
|
||||
Operand::Word(word) => {
|
||||
match reg {
|
||||
crate::register::Register::AX => self.ax.write(word),
|
||||
crate::register::Register::BX => self.bx.write(word),
|
||||
crate::register::Register::CX => self.cx.write(word),
|
||||
crate::register::Register::DX => self.dx.write(word),
|
||||
// crate::register::Register::AH => {}
|
||||
// crate::register::Register::AL => {}
|
||||
// crate::register::Register::BL => {}
|
||||
// crate::register::Register::BH => {}
|
||||
// crate::register::Register::CH => {}
|
||||
// crate::register::Register::CL => {}
|
||||
// crate::register::Register::DH => {}
|
||||
// crate::register::Register::DL => {}
|
||||
crate::register::Register::DI => self.di = word,
|
||||
crate::register::Register::SI => self.si = word,
|
||||
crate::register::Register::BP => self.bp = word,
|
||||
crate::register::Register::SP => self.sp = word,
|
||||
_ => panic!("Tried writing Word to Byte-sized register"),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for Register {
|
||||
|
||||
Reference in New Issue
Block a user