83 lines
3.4 KiB
Rust
83 lines
3.4 KiB
Rust
use crate::constants::constants_system::{OFFSET_INT_VECTOR, OFFSET_RESET_VECTOR};
|
|
use crate::mos6502cpu::cpu::Mos6502Cpu;
|
|
|
|
|
|
|
|
impl Mos6502Cpu {
|
|
/// AccurateTick
|
|
///
|
|
/// In: address_bus > Address of data operationm
|
|
/// data_bus > Data read or written
|
|
/// State:
|
|
/// read_bus > Flag for if cpu is reading or writing the data bus
|
|
/// cycle_step > Index for what step of the Decode->Load->Execute cycle we are in
|
|
/// Out: address_bus > address for operation
|
|
/// data_bus > data for the operation
|
|
/// read_bus > lets rest of the computer know if the CPU is reading from the address
|
|
/// provided or if we are writing to the address
|
|
pub fn tick2(&mut self, address_bus: u16, data_bus: u8) -> (u16, u8, bool) {
|
|
if self.has_reset {
|
|
// we have completed the reset cycle
|
|
if self.read_signal {
|
|
// we should see new data in the data_bus for us
|
|
let read_data = data_bus;
|
|
println!("READ 0x{read_data:02x} from data bus.");
|
|
self.data_bus = read_data;
|
|
} else {
|
|
// we are writing to the bus.
|
|
}
|
|
} else {
|
|
println!("Reset microstep {}", self.microcode_step);
|
|
// we need to do the reset steps
|
|
// reduce the number of remaining microsteps
|
|
self.read_signal = true;
|
|
match self.microcode_step {
|
|
6 => {
|
|
// NMI High byte
|
|
}
|
|
5 => {
|
|
// NMI low byte
|
|
}
|
|
4 => {
|
|
// read first byte of reset vector
|
|
self.address_bus = OFFSET_RESET_VECTOR;
|
|
}
|
|
3 => {
|
|
// at this point data holds the upper byte of our reset vector
|
|
self.reset_vector = (data_bus as u16) << 8;
|
|
println!("Loaded reset vector of 0x{:04x}", self.reset_vector);
|
|
// read secondd byte of reset vector
|
|
self.address_bus = OFFSET_RESET_VECTOR + 1;
|
|
}
|
|
2 => {
|
|
self.reset_vector |= data_bus as u16;
|
|
println!("Loaded reset vector of 0x{:04x}", self.reset_vector);
|
|
// read first byte of interrupt vector
|
|
self.address_bus = OFFSET_INT_VECTOR;
|
|
}
|
|
1 => {
|
|
// read second byte of interrupt vector
|
|
self.address_bus = OFFSET_INT_VECTOR + 1;
|
|
}
|
|
0 => {
|
|
self.int_vector |= data_bus as u16;
|
|
println!("Loaded interrupt vector of 0x{:04x}", self.int_vector);
|
|
self.pc = self.reset_vector;
|
|
println!("Set PC to Reset Vector. Giddy-up!");
|
|
println!("START HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK");
|
|
// the KIM-1 uses 0x0000 for its initial PC
|
|
self.pc = 0x0000;
|
|
println!("END HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK");
|
|
self.has_reset = true;
|
|
}
|
|
_ => {
|
|
}
|
|
}
|
|
if self.microcode_step > 0 {
|
|
self.microcode_step -= 1;
|
|
}
|
|
}
|
|
(self.address_bus, self.data_bus, self.read_signal)
|
|
}
|
|
}
|