fixed disasm failing on last byte if invalid op
This commit is contained in:
@@ -20,47 +20,77 @@ impl Disasm {
|
|||||||
pub fn disassemble(mem: &MemoryBus, start: Addr, stop: Addr) -> Result<Self, Error> {
|
pub fn disassemble(mem: &MemoryBus, start: Addr, stop: Addr) -> Result<Self, Error> {
|
||||||
let mut instructions = Vec::new();
|
let mut instructions = Vec::new();
|
||||||
let mut addresses = Vec::new();
|
let mut addresses = Vec::new();
|
||||||
let mut mem_iter = ((start as usize) .. (stop as usize)).map({|a| a as Addr});
|
let mut mem_iter = ((start as usize) .. (stop as usize)+1).map({|a| a as Addr});
|
||||||
while let Some(addr) = mem_iter.next() {
|
while let Some(addr) = mem_iter.next() {
|
||||||
|
|
||||||
let opcode = mem.readb(addr);
|
let opcode = mem.readb(addr);
|
||||||
|
|
||||||
|
|
||||||
// Decode opcode, default to NOP/IMP to "skip" the byte
|
// Decode opcode, default to NOP/IMP to "skip" the byte
|
||||||
let i = Instruction::decode_op(opcode)
|
let i = Instruction::decode_op(opcode)
|
||||||
.unwrap_or(Instruction::decode_op(0xeau8).unwrap());
|
.unwrap_or(Instruction::decode_op(0xeau8).unwrap());
|
||||||
|
debug!("Disassembling opcode {:#06x}, {:?}", addr, i);
|
||||||
|
|
||||||
// debug!("{:?}", i);
|
// debug!("{:?}", i);
|
||||||
let args = match i.addr_mode {
|
let args = match i.addr_mode {
|
||||||
AddrMode::IMM => {
|
AddrMode::IMM => {
|
||||||
let val = mem.readb(mem_iter.next().unwrap());
|
match mem_iter.next() {
|
||||||
|
Some(val) => {
|
||||||
|
let val = mem.readb(val);
|
||||||
format!("#{0:02x} ({0})", val)
|
format!("#{0:02x} ({0})", val)
|
||||||
},
|
},
|
||||||
|
None => continue,
|
||||||
|
}
|
||||||
|
},
|
||||||
AddrMode::ZP0 | AddrMode::ZPX | AddrMode::ZPY => {
|
AddrMode::ZP0 | AddrMode::ZPX | AddrMode::ZPY => {
|
||||||
let rel_addr = mem.readb(mem_iter.next().unwrap());
|
match mem_iter.next() {
|
||||||
|
Some(val) => {
|
||||||
|
let rel_addr = mem.readb(val);
|
||||||
format!("{:#04x}", rel_addr)
|
format!("{:#04x}", rel_addr)
|
||||||
|
}
|
||||||
|
None => continue,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
AddrMode::ABS | AddrMode::ABX | AddrMode::ABY => {
|
AddrMode::ABS | AddrMode::ABX | AddrMode::ABY => {
|
||||||
let val = mem.readw(mem_iter.next().unwrap());
|
match mem_iter.next() {
|
||||||
|
Some(val) => {
|
||||||
|
let val = mem.readw(val);
|
||||||
mem_iter.next().unwrap();
|
mem_iter.next().unwrap();
|
||||||
format!("{:#06x}", val)
|
format!("{:#06x}", val)
|
||||||
},
|
},
|
||||||
|
None => continue,
|
||||||
|
}
|
||||||
|
},
|
||||||
AddrMode::REL => {
|
AddrMode::REL => {
|
||||||
let rel_addr = mem.readb(mem_iter.next().unwrap()) as Word;
|
match mem_iter.next() {
|
||||||
|
Some(val) => {
|
||||||
|
let rel_addr = mem.readb(val) as Word;
|
||||||
let jmp_addr = Disasm::get_rel_addr(rel_addr, addr+2);
|
let jmp_addr = Disasm::get_rel_addr(rel_addr, addr+2);
|
||||||
format!("#{:02x} => {:#06x}", rel_addr, jmp_addr)
|
format!("#{:02x} => {:#06x}", rel_addr, jmp_addr)
|
||||||
},
|
},
|
||||||
|
None => continue,
|
||||||
|
}
|
||||||
|
},
|
||||||
AddrMode::IND => {
|
AddrMode::IND => {
|
||||||
let addr = mem.readw(mem_iter.next().unwrap());
|
match mem_iter.next() {
|
||||||
|
Some(val) => {
|
||||||
|
let addr = mem.readw(val);
|
||||||
mem_iter.next().unwrap();
|
mem_iter.next().unwrap();
|
||||||
format!("{:#06x}", addr)
|
format!("{:#06x}", addr)
|
||||||
},
|
},
|
||||||
|
None => continue,
|
||||||
|
}
|
||||||
|
},
|
||||||
AddrMode::IZX | AddrMode::IZY => {
|
AddrMode::IZX | AddrMode::IZY => {
|
||||||
let addr = mem.readb(mem_iter.next().unwrap());
|
match mem_iter.next() {
|
||||||
|
Some(val) => {
|
||||||
|
let addr = mem.readb(val);
|
||||||
format!("{:#06x}", addr)
|
format!("{:#06x}", addr)
|
||||||
|
},
|
||||||
|
None => continue,
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
AddrMode::IMP => String::from(""),
|
AddrMode::IMP => String::from(""),
|
||||||
_ => bail!("Disassembly of {} not implemented", i.addr_mode),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let s = format!("{:#06x}: {} {} ({})", addr, i.operation, args, i.addr_mode);
|
let s = format!("{:#06x}: {} {} ({})", addr, i.operation, args, i.addr_mode);
|
||||||
|
|||||||
Reference in New Issue
Block a user