summaryrefslogtreecommitdiff
path: root/src/core.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/core.rs')
-rw-r--r--src/core.rs85
1 files changed, 48 insertions, 37 deletions
diff --git a/src/core.rs b/src/core.rs
index edbfecc..ef3c115 100644
--- a/src/core.rs
+++ b/src/core.rs
@@ -78,7 +78,7 @@ pub struct Op {
pub struct Core {
pc: u16,
ram: [u8; u8::max_value() as usize + 1],
- rom: Rom,
+ progmem: Rom,
extmem: [u8; u16::max_value() as usize + 1],
}
@@ -364,7 +364,7 @@ impl Core {
let mut ram: [u8; u8::max_value() as usize + 1] = [0; u8::max_value() as usize + 1];
ram[RAM_OFFSET_SP as usize] = RESET_VALUE_SP;
ram[RAM_OFFSET_ACC as usize] = RESET_VALUE_ACC;
- let rom = match Rom::from_hex(hex) {
+ let progmem = match Rom::from_hex(hex) {
Ok(value) => value,
Err(err_string) => return Err(err_string),
};
@@ -372,7 +372,7 @@ impl Core {
Ok(Self {
pc: 0,
ram,
- rom,
+ progmem,
extmem,
})
}
@@ -391,14 +391,14 @@ impl Core {
/// Get current instruction
pub fn op(&self) -> Op {
- let op = IncompleteOp::from_u8(self.rom.array[self.pc as usize]);
+ let op = IncompleteOp::from_u8(self.progmem.array[self.pc as usize]);
let operand1 = if let Some(incomplete_operand) = op.operand1 {
Some(self.fetch_operand(incomplete_operand, 1))
} else {
None
};
let operand2_offset = match &operand1 {
- Some(o) => o.size(),
+ Some(operand) => operand.size(),
_ => 0,
};
let operand2 = if let Some(incomplete_operand) = op.operand2 {
@@ -456,27 +456,32 @@ impl Core {
match operand {
IncompleteOperand::Acc => Operand::Acc,
IncompleteOperand::Direct => {
- Operand::Direct(self.rom.array[(self.pc as usize + offset)])
+ Operand::Direct(self.progmem.array[(self.pc as usize + offset)])
}
- IncompleteOperand::Data => Operand::Data(self.rom.array[(self.pc as usize + offset)]),
- IncompleteOperand::Data16 => Operand::Data16(
- (u16::from(self.rom.array[(self.pc as usize + offset)]) << 8)
- + u16::from(self.rom.array[(self.pc as usize + offset + 1)]),
- ),
+ IncompleteOperand::Data => {
+ Operand::Data(self.progmem.array[(self.pc as usize + offset)])
+ }
+ IncompleteOperand::Data16 => Operand::Data16({
+ let high = self.progmem.array[(self.pc as usize + offset)];
+ let low = self.progmem.array[(self.pc as usize + offset + 1)];
+ u16::from(high) << 8 & u16::from(low)
+ }),
IncompleteOperand::Dptr => Operand::Dptr,
IncompleteOperand::AtDptr => Operand::AtDptr,
IncompleteOperand::Indirect(r) => Operand::Indirect(r),
IncompleteOperand::Register(r) => Operand::Register(r),
IncompleteOperand::Reladdr => {
- Operand::Reladdr(self.rom.array[(self.pc as usize + offset)] as i8)
+ Operand::Reladdr(self.progmem.array[(self.pc as usize + offset)] as i8)
}
- IncompleteOperand::Addr11(high) => Operand::Addr11(
- u16::from(self.rom.array[(self.pc as usize + offset)]) + (u16::from(high) << 8),
- ),
- IncompleteOperand::Addr16 => Operand::Addr16(
- (u16::from(self.rom.array[(self.pc as usize + offset)]) << 8)
- + u16::from(self.rom.array[(self.pc as usize + offset + 1)]),
- ),
+ IncompleteOperand::Addr11(high) => Operand::Addr11({
+ let low = self.progmem.array[(self.pc as usize + offset)];
+ u16::from(high) << 8 & u16::from(low)
+ }),
+ IncompleteOperand::Addr16 => Operand::Addr16({
+ let high = self.progmem.array[(self.pc as usize + offset)];
+ let low = self.progmem.array[(self.pc as usize + offset + 1)];
+ u16::from(high) << 8 & u16::from(low)
+ }),
}
}
@@ -518,8 +523,9 @@ impl Core {
fn movx_to(&mut self, o1: Operand, o2: Operand) {
let dest = match o1 {
Operand::AtDptr => {
- (u16::from(self.ram[RAM_OFFSET_DPH as usize]) << 8)
- + u16::from(self.ram[RAM_OFFSET_DPL as usize])
+ let dph = self.ram[RAM_OFFSET_DPH as usize];
+ let dpl = self.ram[RAM_OFFSET_DPL as usize];
+ u16::from(dph) << 8 & u16::from(dpl)
}
other => panic!(
"MOVX (MovxTo) got incompatible first operand \"{:?}\"",
@@ -559,35 +565,40 @@ impl Core {
self.extmem[dest as usize] = value;
}
- fn push(&mut self, o: Operand) {
- match o {
+ fn push(&mut self, operand: Operand) {
+ match operand {
Operand::Direct(offset) => {
self.ram[RAM_OFFSET_SP as usize] += 1;
- self.ram[self.ram[RAM_OFFSET_SP as usize] as usize] = self.ram[offset as usize];
+ let value = self.ram[offset as usize];
+ let sp = self.ram[RAM_OFFSET_SP as usize];
+ self.ram[sp as usize] = value;
}
other => panic!("PUSH got incompatible operand \"{:?}\"", other),
}
}
- fn pop(&mut self, o: Operand) {
- match o {
+ fn pop(&mut self, operand: Operand) {
+ match operand {
Operand::Direct(offset) => {
- self.ram[offset as usize] = self.ram[self.ram[RAM_OFFSET_SP as usize] as usize];
+ let sp = self.ram[RAM_OFFSET_SP as usize];
+ self.ram[offset as usize] = self.ram[sp as usize];
self.ram[RAM_OFFSET_SP as usize] -= 1;
}
other => panic!("POP got incompatible operand \"{:?}\"", other),
}
}
- fn sjmp(&mut self, o: Operand) {
- match o {
- Operand::Reladdr(reladdr) => self.pc = (self.pc as i16 + i16::from(reladdr)) as u16,
+ fn sjmp(&mut self, operand: Operand) {
+ match operand {
+ Operand::Reladdr(reladdr) => {
+ self.pc = (self.pc as i16 + i16::from(reladdr)) as u16;
+ }
_ => panic!("SJMP got incompatible operand"),
}
}
- fn ajmp(&mut self, o: Operand) {
- match o {
+ fn ajmp(&mut self, operand: Operand) {
+ match operand {
Operand::Addr11(addr11) => {
assert!(addr11 <= 0x4FFu16);
// Clear 11 low bits of PC and add address, that is within these 11 bits
@@ -597,15 +608,15 @@ impl Core {
}
}
- fn ljmp(&mut self, o: Operand) {
- match o {
+ fn ljmp(&mut self, operand: Operand) {
+ match operand {
Operand::Addr16(addr) => self.pc = addr,
_ => panic!("LJMP got incompatible operand"),
}
}
- fn jnz(&mut self, o: Operand) {
- match o {
+ fn jnz(&mut self, operand: Operand) {
+ match operand {
Operand::Reladdr(reladdr) => {
if self.ram[usize::from(RAM_OFFSET_ACC)] != 0 {
self.pc = (self.pc as i16 + i16::from(reladdr)) as u16;
@@ -623,7 +634,7 @@ impl fmt::Display for Operand {
"{}",
match self {
Operand::Acc => "A".to_string(),
- Operand::Direct(dir) => format!("{:x}h", dir),
+ Operand::Direct(dir) => format!("{:X}h", dir),
Operand::Indirect(r) => format!("@{:?}", r),
Operand::Data(data) => format!("#{}", data),
Operand::Data16(data) => format!("#{}", data),