aboutsummaryrefslogtreecommitdiff
path: root/lib/vnf/src
diff options
context:
space:
mode:
authorMiquel Sabaté Solà <mssola@mssola.com>2026-09-08 17:32:08 +0200
committerMiquel Sabaté Solà <mssola@mssola.com>2026-09-08 17:32:08 +0200
commit1601d0353342230a2a93baa6f008bc16a10137a1 (patch)
tree694a754ea4b33a046e639bcd02d35eec1ca86644 /lib/vnf/src
parent37c9824cd7674aa9b8b9f094cf3a93e6da2c1f99 (diff)
downloadtools.nes-1601d0353342230a2a93baa6f008bc16a10137a1.tar.gz
tools.nes-1601d0353342230a2a93baa6f008bc16a10137a1.zip
Add an option for setting a cycle limit
This can be quite handy when it comes to checking that a piece of code doesn't exceed a given amount of cycles, or when you are tuning a block of code in order to make it go beyond the current amount of cycles. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
Diffstat (limited to 'lib/vnf/src')
-rw-r--r--lib/vnf/src/lib.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/vnf/src/lib.rs b/lib/vnf/src/lib.rs
index 0b15d6a..e5e280a 100644
--- a/lib/vnf/src/lib.rs
+++ b/lib/vnf/src/lib.rs
@@ -31,6 +31,20 @@ use std::path::Path;
use xixanta::opcodes::AddressingMode;
use xixanta::opcodes::{Instruction, InstructionIdentifier, OPCODES};
+/// Number of cycles from an NMI to the start of rendering on an NTSC system
+/// (round down).
+pub const NMI_NTSC_CYCLES: usize = 2273;
+
+/// Number of cycles to render a full frame on an NTSC system (round down).
+pub const FRAME_NTSC_CYCLES: usize = 29780;
+
+/// Number of cycles from an NMI to the start of rendering on a PAL system
+/// (round down).
+pub const NMI_PAL_CYCLES: usize = 7459;
+
+/// Number of cycles to render a full frame on a PAL system (round down).
+pub const FRAME_PAL_CYCLES: usize = 33247;
+
/// The 'status' register from the CPU. All flags are set as booleans for easier
/// use, and the 'break_mark' byte contains the break mark from the last 'brk'
/// instruction.
@@ -382,6 +396,10 @@ pub struct Machine {
/// Whether execution should be halted _after_ a 'brk' instruction no matter
/// what. The break mark will be set accordingly.
pub halt_on_brk: bool,
+
+ /// The maximum amount of cycles that the machine should reach before
+ /// halting.
+ pub cycle_limit: Option<usize>,
}
// On success, returns a vector of MemoryCell representing the RAM for a
@@ -497,6 +515,7 @@ impl Machine {
policy,
joypads: [Joypad::default(), Joypad::default()],
halt_on_brk: true,
+ cycle_limit: None,
})
}
@@ -699,6 +718,17 @@ impl Machine {
self.report();
}
+ // Did we reach the cycle limits?
+ if let Some(cl) = self.cycle_limit
+ && cl < self.cycles
+ {
+ self.active = false;
+ if self.verbose {
+ return Err("reached the limit of cycles available".to_string());
+ }
+ return Ok(());
+ }
+
// After moving the PC, is it out of bounds?
if self.pc < 0x8000 {
return Err("out of bounds: program counter is pointing below ROM space".to_string());