diff options
Diffstat (limited to 'src/mos6502.rs')
-rw-r--r-- | src/mos6502.rs | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/mos6502.rs b/src/mos6502.rs index 6c5a140..a9fac8c 100644 --- a/src/mos6502.rs +++ b/src/mos6502.rs @@ -602,8 +602,10 @@ pub struct CPU<'a> { ea: u16, /* effective address */ imm_val: u8, pub cycle: u32, + pub elapsed: u32, int: Option<IntType>, - pub mem: CPUMemory<'a> + pub mem: CPUMemory<'a>, + sec_callback: &'a mut FnMut(), } macro_rules! make_int { @@ -637,7 +639,7 @@ impl<'a> CPU<'a> { #[inline(always)] pub fn get_over(&self) -> u8 { (self.status >> 6) & 1 } #[inline(always)] pub fn get_neg(&self) -> u8 { (self.status >> 7) & 1 } - pub fn new(mem: CPUMemory<'a>) -> Self { + pub fn new(mem: CPUMemory<'a>, sec_callback: &'a mut FnMut()) -> Self { let pc = 0; /* nes power up state */ let a = 0; @@ -652,7 +654,7 @@ impl<'a> CPU<'a> { opr: 0, ea: 0, imm_val: 0, int: None, acc: false, - mem} + mem, elapsed: 0, sec_callback} } pub fn start(&mut self) { @@ -689,6 +691,15 @@ impl<'a> CPU<'a> { //(self.cycle - cycle0) as u8 } + pub fn tick(&mut self) { + self.cycle -= 1; + self.elapsed += 1; + if self.elapsed == CPU_FREQ { + self.elapsed = 0; + (self.sec_callback)(); + } + } + pub fn reset(&mut self) { self.pc = read16!(self.mem, RESET_VECTOR as u16); self.sp = self.sp.wrapping_sub(3); |