some fixes

This commit is contained in:
2023-12-30 16:14:34 -05:00
parent c6bd426503
commit 385dffe11b
106 changed files with 53 additions and 3140 deletions
+41 -7
View File
@@ -1,19 +1,53 @@
use super::registers::Registers; use super::{registers::Registers, bus::Bus, cycles, dma, instructions::mapper::map_opcode_to_instruction};
pub struct CPU { pub struct CPU {
pub registers: Registers, pub registers: Registers,
pub cycles: usize, // TODO: remove cycles from here
pub is_stopped: bool, // TODO: remove from here
pub is_waiting_interrupt: bool,
} }
impl CPU { impl CPU {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
registers: Registers::new(), registers: Registers::new(),
cycles: 0,
is_stopped: false,
is_waiting_interrupt: false,
} }
} }
fn check_running_state(&mut self, bus: &mut Bus) -> bool {
// Each byte in a DMA transfer takes 8 master cycles.
// And each CPU can take either 6, 8 or 12 master cycles depending
// on what's being read from memory. So this won't be accurate.
if bus.dma.is_active() {
let pending_bus_writes = bus.dma.tick();
for (src, dst) in pending_bus_writes {
let byte = bus.read(src);
bus.write(dst, byte);
let (bytes, cycles) = cycles::increment_cycles_while_stopped();
self.registers.increment_pc(bytes); self.registers.cycles += cycles;
}
if !bus.dma.is_active() {
bus.write(dma::MDMAEN as u32, 0x00)
}
return false;
}
if self.registers.is_cpu_stopped {
let (bytes, cycles) = cycles::increment_cycles_while_stopped();
self.registers.increment_pc(bytes); self.registers.cycles += cycles;
return false;
}
if self.registers.is_cpu_waiting_interrupt {
// TODO: check for interrupts here
let (bytes, cycles) = cycles::increment_cycles_while_stopped();
self.registers.increment_pc(bytes); self.registers.cycles += cycles;
return false;
}
return true;
}
pub fn tick(&mut self, bus: &mut Bus) {
if !self.check_running_state(bus) {
return;
}
let opcode = bus.read(self.registers.get_pc_address());
let instruction = map_opcode_to_instruction(opcode);
instruction.execute(&mut self.registers, bus);
}
} }
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,4 @@
use crate::{utils::addressing::{AddressingMode, IndexRegister}, cpu::instructionstemp::{adc::ADC, and::AND, asl::ASL, bcc::BCC, bcs::BCS, beq::BEQ, bne::BNE, bmi::BMI, bpl::BPL, bra::BRA, brk::BRK, brl::BRL, bvc::BVC, bvs::BVS, bit::BIT, clc::CLC, cld::CLD, cli::CLI, clv::CLV, cmp::CMP, cop::COP, cpx::CPX, cpy::CPY, dec::DEC, dex::DEX, dey::DEY, eor::EOR, inc::INC, iny::INY, inx::INX, jmp::JMP, jsr::JSR, lda::LDA, ldx::LDX, ldy::LDY, lsr::LSR, mvn::MVN, mvp::MVP, nop::NOP, ora::ORA, pea::PEA, pei::PEI, per::PER, pha::PHA, phb::PHB, phd::PHD, phk::PHK, php::PHP, phx::PHX, phy::PHY, pla::PLA, plb::PLB, pld::PLD, plp::PLP, plx::PLX, ply::PLY, rep::REP, rol::ROL, ror::ROR, rti::RTI, rtl::RTL, rts::RTS, sbc::SBC, sec::SEC, sed::SED, sei::SEI, sep::SEP, sta::STA, stp::STP, stx::STX, sty::STY, stz::STZ, tax::TAX, tay::TAY, tcd::TCD, tcs::TCS, trb::TRB, tsb::TSB, tdc::TDC, tsc::TSC, tsx::TSX, txa::TXA, txs::TXS, txy::TXY, tya::TYA, tyx::TYX, wai::WAI, wdm::WDM, xba::XBA, xce::XCE}}; use crate::{utils::addressing::{AddressingMode, IndexRegister}, cpu::instructions::{adc::ADC, and::AND, asl::ASL, bcc::BCC, bcs::BCS, beq::BEQ, bne::BNE, bmi::BMI, bpl::BPL, bra::BRA, brk::BRK, brl::BRL, bvc::BVC, bvs::BVS, bit::BIT, clc::CLC, cld::CLD, cli::CLI, clv::CLV, cmp::CMP, cop::COP, cpx::CPX, cpy::CPY, dec::DEC, dex::DEX, dey::DEY, eor::EOR, inc::INC, iny::INY, inx::INX, jmp::JMP, jsr::JSR, lda::LDA, ldx::LDX, ldy::LDY, lsr::LSR, mvn::MVN, mvp::MVP, nop::NOP, ora::ORA, pea::PEA, pei::PEI, per::PER, pha::PHA, phb::PHB, phd::PHD, phk::PHK, php::PHP, phx::PHX, phy::PHY, pla::PLA, plb::PLB, pld::PLD, plp::PLP, plx::PLX, ply::PLY, rep::REP, rol::ROL, ror::ROR, rti::RTI, rtl::RTL, rts::RTS, sbc::SBC, sec::SEC, sed::SED, sei::SEI, sep::SEP, sta::STA, stp::STP, stx::STX, sty::STY, stz::STZ, tax::TAX, tay::TAY, tcd::TCD, tcs::TCS, trb::TRB, tsb::TSB, tdc::TDC, tsc::TSC, tsx::TSX, txa::TXA, txs::TXS, txy::TXY, tya::TYA, tyx::TYX, wai::WAI, wdm::WDM, xba::XBA, xce::XCE}};
use super::CPUInstruction; use super::CPUInstruction;

Some files were not shown because too many files have changed in this diff Show More