diff options
-rw-r--r-- | src/core.rs | 85 |
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), |