From 338e68a1d9ee9885e67bb05a087ac185273f05d0 Mon Sep 17 00:00:00 2001 From: transistor Date: Sun, 3 Oct 2021 09:55:20 -0700 Subject: [PATCH] Fixed some erroneous instruction decodes and added binaries --- binaries/kernel.bin | Bin 0 -> 58320 bytes binaries/monitor.bin | Bin 0 -> 5132 bytes src/cpus/m68k/decode.rs | 4 ++-- src/cpus/m68k/execute.rs | 2 +- src/cpus/m68k/tests.rs | 24 ++++++++++++++++++------ src/main.rs | 18 +++++++++++++----- src/memory.rs | 13 +++++++++++++ todo.txt | 9 +++++++++ 8 files changed, 56 insertions(+), 14 deletions(-) create mode 100755 binaries/kernel.bin create mode 100755 binaries/monitor.bin create mode 100644 todo.txt diff --git a/binaries/kernel.bin b/binaries/kernel.bin new file mode 100755 index 0000000000000000000000000000000000000000..fc35300e5c43d00ba5d2ca79176cb0478bf132fb GIT binary patch literal 58320 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 literal 0 HcmV?d00001 diff --git a/binaries/monitor.bin b/binaries/monitor.bin new file mode 100755 index 0000000000000000000000000000000000000000..c81cdfecf05bc3436e7c3db07f04ce96484eb25b GIT binary patch literal 5132 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 sg^zMijOE8t%)IZ06T0AtJxm=-al-pF literal 0 HcmV?d00001 diff --git a/src/cpus/m68k/decode.rs b/src/cpus/m68k/decode.rs index 73dbaac..bc53897 100644 --- a/src/cpus/m68k/decode.rs +++ b/src/cpus/m68k/decode.rs @@ -222,7 +222,7 @@ impl M68kDecoder { let data = self.read_instruction_word(space)?; match optype { 0b0000 => Ok(Instruction::ORtoSR(data)), - 0b0001 => Ok(Instruction::ANDtoSR(data)), + 0b0010 => Ok(Instruction::ANDtoSR(data)), 0b1010 => Ok(Instruction::EORtoSR(data)), _ => return Err(Error::processor(ERR_ILLEGAL_INSTRUCTION)), } @@ -532,7 +532,7 @@ impl M68kDecoder { if size.is_none() { let sign = if (ins & 0x0100) == 0 { Sign::Unsigned } else { Sign::Signed }; let data_reg = Target::DirectDReg(get_high_reg(ins)); - let effective_addr = self.decode_lower_effective_address(space, ins, size)?; + let effective_addr = self.decode_lower_effective_address(space, ins, Some(Size::Word))?; Ok(Instruction::MUL(effective_addr, data_reg, Size::Word, sign)) } else if (ins & 0b000111110000) == 0b000100000000 { // TODO ABCD or EXG diff --git a/src/cpus/m68k/execute.rs b/src/cpus/m68k/execute.rs index 3642edb..78d6f76 100644 --- a/src/cpus/m68k/execute.rs +++ b/src/cpus/m68k/execute.rs @@ -523,7 +523,7 @@ impl MC68010 { let addr = self.get_a_reg_mut(reg); *addr = new_value; }, - _ => { panic!("Unsupported instruction"); }, + _ => { return Err(Error::new("Unsupported instruction")); }, } Ok(()) diff --git a/src/cpus/m68k/tests.rs b/src/cpus/m68k/tests.rs index d9a0835..7475547 100644 --- a/src/cpus/m68k/tests.rs +++ b/src/cpus/m68k/tests.rs @@ -2,7 +2,7 @@ use crate::memory::{Address, AddressSpace, MemoryBlock}; use super::execute::MC68010; -use super::decode::{Instruction, Target, Size}; +use super::decode::{Instruction, Target, Size, Sign}; const INIT_STACK: Address = 0x00002000; const INIT_ADDR: Address = 0x00000010; @@ -28,7 +28,7 @@ fn init_test() -> (MC68010, AddressSpace) { #[cfg(test)] mod tests { use super::{init_test, INIT_ADDR}; - use super::{Instruction, Target, Size}; + use super::{Instruction, Target, Size, Sign}; #[test] fn instruction_nop() { @@ -97,13 +97,25 @@ mod tests { } #[test] - fn instruction_movel() { + fn instruction_andi_sr() { let (mut cpu, mut space) = init_test(); - space.write_beu16(INIT_ADDR, 0x2F49).unwrap(); - space.write_beu16(INIT_ADDR + 2, 0x0034).unwrap(); + space.write_beu16(INIT_ADDR, 0x027C).unwrap(); + space.write_beu16(INIT_ADDR + 2, 0xF8FF).unwrap(); cpu.decode_next(&mut space).unwrap(); - assert_eq!(cpu.decoder.instruction, Instruction::MOVE(Target::DirectAReg(0x01), Target::IndirectARegOffset(7, 52), Size::Long)); + assert_eq!(cpu.decoder.instruction, Instruction::ANDtoSR(0xF8FF)); + //cpu.execute_current(&mut space).unwrap(); + //assert_eq!(cpu.state.sr & 0x0F, 0x00); + } + + #[test] + fn instruction_muls() { + let (mut cpu, mut space) = init_test(); + + space.write_beu16(INIT_ADDR, 0xC1FC).unwrap(); + space.write_beu16(INIT_ADDR + 2, 0x0276).unwrap(); + cpu.decode_next(&mut space).unwrap(); + assert_eq!(cpu.decoder.instruction, Instruction::MUL(Target::Immediate(0x276), Target::DirectDReg(0), Size::Word, Sign::Signed)); //cpu.execute_current(&mut space).unwrap(); //assert_eq!(cpu.state.sr & 0x0F, 0x00); } diff --git a/src/main.rs b/src/main.rs index 193bcea..b631a51 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,13 +11,14 @@ use crate::devices::mc68681::MC68681; fn main() { let mut space = AddressSpace::new(); - let monitor = MemoryBlock::load("monitor.bin").unwrap(); + let monitor = MemoryBlock::load("binaries/monitor.bin").unwrap(); for byte in monitor.contents.iter() { print!("{:02x} ", byte); } space.insert(0x00000000, Box::new(monitor)); - let ram = MemoryBlock::new(vec![0; 0x00100000]); + let mut ram = MemoryBlock::new(vec![0; 0x00100000]); + ram.load_at(0, "binaries/kernel.bin").unwrap(); space.insert(0x00100000, Box::new(ram)); let mut serial = MC68681::new(); @@ -25,7 +26,7 @@ fn main() { space.insert(0x00700000, Box::new(serial)); let mut cpu = MC68010::new(); - //cpu.enable_tracing(); + cpu.enable_tracing(); //cpu.add_breakpoint(0x0c94); //cpu.add_breakpoint(0x0cf2); @@ -44,9 +45,16 @@ fn main() { /* // TODO I need to add a way to decode and dump the assembly for a section of code, in debugger - cpu.state.pc = 0x0db4; + cpu.state.pc = 0x00100000; + cpu.state.pc = 0x0010c270; while cpu.is_running() { - cpu.decode_next(&mut space).unwrap(); + match cpu.decode_next(&mut space) { + Ok(()) => { }, + Err(err) => { + cpu.dump_state(&mut space); + panic!("{:?}", err); + }, + } } */ } diff --git a/src/memory.rs b/src/memory.rs index 8aefe7a..25c31f0 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -31,6 +31,19 @@ impl MemoryBlock { Err(_) => Err(Error::new(&format!("Error reading contents of {}", filename))), } } + + pub fn load_at(&mut self, mut addr: Address, filename: &str) -> Result<(), Error> { + match fs::read(filename) { + Ok(contents) => { + for byte in contents { + self.contents[addr as usize] = byte; + addr += 1; + } + Ok(()) + }, + Err(_) => Err(Error::new(&format!("Error reading contents of {}", filename))), + } + } } impl Addressable for MemoryBlock { diff --git a/todo.txt b/todo.txt new file mode 100644 index 0000000..1887d2a --- /dev/null +++ b/todo.txt @@ -0,0 +1,9 @@ + +* there's probably a problem with the shift operations flags, they look more complex than what's being done atm + + +* check all instructions in the docs + +* make tests for each instruction + +