aboutsummaryrefslogtreecommitdiff
path: root/src/mos6502.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mos6502.rs')
-rw-r--r--src/mos6502.rs17
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);