mirror of
https://github.com/FranLMSP/rmg-001.git
synced 2024-11-23 10:12:11 +00:00
Fix RST instruction
This commit is contained in:
parent
a4659dc147
commit
82fafad9cc
10
src/bus.rs
10
src/bus.rs
@ -77,6 +77,12 @@ impl Bus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn write(&mut self, address: u16, data: u8) {
|
pub fn write(&mut self, address: u16, data: u8) {
|
||||||
|
if address == 0xFF01 {
|
||||||
|
print!("{}", data as char);
|
||||||
|
}
|
||||||
|
if address == 0xDF7C {
|
||||||
|
// aaa
|
||||||
|
}
|
||||||
match MemoryMap::get_map(address) {
|
match MemoryMap::get_map(address) {
|
||||||
MemoryMap::BankZero | MemoryMap::BankSwitchable => {
|
MemoryMap::BankZero | MemoryMap::BankSwitchable => {
|
||||||
// println!("WRITING TO ROM");
|
// println!("WRITING TO ROM");
|
||||||
@ -85,12 +91,12 @@ impl Bus {
|
|||||||
self.data[address as usize] = data;
|
self.data[address as usize] = data;
|
||||||
// Copy to the ECHO RAM
|
// Copy to the ECHO RAM
|
||||||
if address <= 0xDDFF {
|
if address <= 0xDDFF {
|
||||||
self.data[(0xE000 + (address - 0xC000)) as usize] = data;
|
// self.data[(0xE000 + (address - 0xC000)) as usize] = data;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
MemoryMap::EchoRAM => {
|
MemoryMap::EchoRAM => {
|
||||||
self.data[address as usize] = data;
|
self.data[address as usize] = data;
|
||||||
self.data[(0xC000 + (address - 0xE000)) as usize] = data; // Copy to the working RAM
|
// self.data[(0xC000 + (address - 0xE000)) as usize] = data; // Copy to the working RAM
|
||||||
},
|
},
|
||||||
_ => self.data[address as usize] = data,
|
_ => self.data[address as usize] = data,
|
||||||
};
|
};
|
||||||
|
@ -31,7 +31,7 @@ impl Console {
|
|||||||
// exit = self.cpu.get_exec_calls_count() >= 1763388; // log 5
|
// exit = self.cpu.get_exec_calls_count() >= 1763388; // log 5
|
||||||
// exit = self.cpu.get_exec_calls_count() >= 1763388; // log 5
|
// exit = self.cpu.get_exec_calls_count() >= 1763388; // log 5
|
||||||
// exit = self.cpu.get_exec_calls_count() >= 243272; // log 6
|
// exit = self.cpu.get_exec_calls_count() >= 243272; // log 6
|
||||||
exit = self.cpu.get_exec_calls_count() >= 287416; // log 7
|
// exit = self.cpu.get_exec_calls_count() >= 287416; // log 7
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
26
src/cpu.rs
26
src/cpu.rs
@ -298,7 +298,7 @@ impl CPU {
|
|||||||
let parameter_bytes = CPU::read_parameter_bytes(program_counter, bus);
|
let parameter_bytes = CPU::read_parameter_bytes(program_counter, bus);
|
||||||
let opcode = CPU::parse_opcode(parameter_bytes);
|
let opcode = CPU::parse_opcode(parameter_bytes);
|
||||||
// println!("Opcode: {:02X?} | PC: {:04X?} | Params: {:02X?}", opcode, self.registers.get(Register::PC), ¶meter_bytes);
|
// println!("Opcode: {:02X?} | PC: {:04X?} | Params: {:02X?}", opcode, self.registers.get(Register::PC), ¶meter_bytes);
|
||||||
println!("A: {:02X} F: {:02X} B: {:02X} C: {:02X} D: {:02X} E: {:02X} H: {:02X} L: {:02X} SP: {:04X} PC: 00:{:04X} ({:02X} {:02X} {:02X} {:02X})",
|
/* println!("A: {:02X} F: {:02X} B: {:02X} C: {:02X} D: {:02X} E: {:02X} H: {:02X} L: {:02X} SP: {:04X} PC: 00:{:04X} ({:02X} {:02X} {:02X} {:02X})",
|
||||||
self.registers.get(Register::A),
|
self.registers.get(Register::A),
|
||||||
self.registers.get(Register::F),
|
self.registers.get(Register::F),
|
||||||
self.registers.get(Register::B),
|
self.registers.get(Register::B),
|
||||||
@ -313,7 +313,7 @@ impl CPU {
|
|||||||
parameter_bytes.1,
|
parameter_bytes.1,
|
||||||
parameter_bytes.2,
|
parameter_bytes.2,
|
||||||
parameter_bytes.3,
|
parameter_bytes.3,
|
||||||
);
|
); */
|
||||||
self.exec(opcode, bus);
|
self.exec(opcode, bus);
|
||||||
self.increment_exec_calls_count();
|
self.increment_exec_calls_count();
|
||||||
}
|
}
|
||||||
@ -356,7 +356,7 @@ impl CPU {
|
|||||||
match register.is_8bit() {
|
match register.is_8bit() {
|
||||||
true => bus.write(address, bytes[1]),
|
true => bus.write(address, bytes[1]),
|
||||||
false => bus.write_16bit(address, value),
|
false => bus.write_16bit(address, value),
|
||||||
}
|
};
|
||||||
},
|
},
|
||||||
OpcodeParameter::Register_FF00plusU8(register, val) => {
|
OpcodeParameter::Register_FF00plusU8(register, val) => {
|
||||||
self.registers.increment(Register::PC, 2);
|
self.registers.increment(Register::PC, 2);
|
||||||
@ -837,7 +837,10 @@ impl CPU {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
// RST, same as Call
|
// RST, same as Call
|
||||||
Opcode::RST(address) => self.exec(Opcode::CALL(OpcodeParameter::U16(address as u16)), bus),
|
Opcode::RST(address) => {
|
||||||
|
self.registers.decrement(Register::PC, 2);
|
||||||
|
self.exec(Opcode::CALL(OpcodeParameter::U16(address as u16)), bus);
|
||||||
|
},
|
||||||
// PUSH onto the stack
|
// PUSH onto the stack
|
||||||
Opcode::PUSH(register) => {
|
Opcode::PUSH(register) => {
|
||||||
self.registers.increment(Register::PC, 1);
|
self.registers.increment(Register::PC, 1);
|
||||||
@ -1140,7 +1143,8 @@ impl CPU {
|
|||||||
},
|
},
|
||||||
Opcode::NOP => self.registers.increment(Register::PC, 1),
|
Opcode::NOP => self.registers.increment(Register::PC, 1),
|
||||||
// _ => println!("Illegal instruction"),
|
// _ => println!("Illegal instruction"),
|
||||||
_ => {},
|
Opcode::IllegalInstruction => {panic!("Illegal instruction");},
|
||||||
|
_ => {panic!("Illegal instruction");},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1231,7 +1235,7 @@ impl CPU {
|
|||||||
0x36 => Opcode::LD(OpcodeParameter::Register_U8(Register::HL, params.1)),
|
0x36 => Opcode::LD(OpcodeParameter::Register_U8(Register::HL, params.1)),
|
||||||
0x0A => Opcode::LD(OpcodeParameter::Register_Register(Register::A, Register::BC)),
|
0x0A => Opcode::LD(OpcodeParameter::Register_Register(Register::A, Register::BC)),
|
||||||
0x1A => Opcode::LD(OpcodeParameter::Register_Register(Register::A, Register::DE)),
|
0x1A => Opcode::LD(OpcodeParameter::Register_Register(Register::A, Register::DE)),
|
||||||
0xFA => Opcode::LD(OpcodeParameter::Register_U16(Register::A, two_byte_param)), // Receives 16 bit value, but lower bit is ignored
|
0xFA => Opcode::LD(OpcodeParameter::Register_U16(Register::A, two_byte_param)),
|
||||||
0x3E => Opcode::LD(OpcodeParameter::Register_U8(Register::A, params.1)),
|
0x3E => Opcode::LD(OpcodeParameter::Register_U8(Register::A, params.1)),
|
||||||
0xEA => Opcode::LD(OpcodeParameter::U16_Register(two_byte_param, Register::A)),
|
0xEA => Opcode::LD(OpcodeParameter::U16_Register(two_byte_param, Register::A)),
|
||||||
0xF2 => Opcode::LD(OpcodeParameter::Register_FF00plusRegister(Register::A, Register::C)),
|
0xF2 => Opcode::LD(OpcodeParameter::Register_FF00plusRegister(Register::A, Register::C)),
|
||||||
@ -1770,6 +1774,14 @@ mod tests {
|
|||||||
assert_eq!(bus.read_16bit(0xF0F0), 0x1234);
|
assert_eq!(bus.read_16bit(0xF0F0), 0x1234);
|
||||||
assert_eq!(cpu.registers.get(Register::PC), 0x103);
|
assert_eq!(cpu.registers.get(Register::PC), 0x103);
|
||||||
|
|
||||||
|
let mut cpu = CPU::new();
|
||||||
|
let mut bus = Bus::new();
|
||||||
|
let addr = 0xC000;
|
||||||
|
cpu.registers.set(Register::A, 0x12);
|
||||||
|
cpu.exec(Opcode::LD(OpcodeParameter::U16_Register(addr, Register::A)), &mut bus);
|
||||||
|
assert_eq!(bus.read(addr), 0x12);
|
||||||
|
assert_eq!(cpu.registers.get(Register::PC), 0x103);
|
||||||
|
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new();
|
||||||
let mut bus = Bus::new();
|
let mut bus = Bus::new();
|
||||||
let addr = 0xC000;
|
let addr = 0xC000;
|
||||||
@ -2068,7 +2080,7 @@ mod tests {
|
|||||||
cpu.registers.set(Register::SP, sp);
|
cpu.registers.set(Register::SP, sp);
|
||||||
cpu.registers.set(Register::PC, 0x1234);
|
cpu.registers.set(Register::PC, 0x1234);
|
||||||
cpu.exec(Opcode::RST(0xF0), &mut bus);
|
cpu.exec(Opcode::RST(0xF0), &mut bus);
|
||||||
assert_eq!(bus.read_16bit(sp - 2), 0x1234 + 3);
|
assert_eq!(bus.read_16bit(sp - 2), 0x1234 + 1);
|
||||||
assert_eq!(cpu.registers.get(Register::SP), sp - 2);
|
assert_eq!(cpu.registers.get(Register::SP), sp - 2);
|
||||||
assert_eq!(cpu.registers.get(Register::PC), 0x00F0);
|
assert_eq!(cpu.registers.get(Register::PC), 0x00F0);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user