aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMiquel Sabaté Solà <mssola@mssola.com>2026-08-26 08:26:01 +0200
committerMiquel Sabaté Solà <mssola@mssola.com>2026-08-27 07:09:03 +0200
commit1c4e8eff6849ce35c31f189f9a07519a89c48ef4 (patch)
tree0bd0244e69da8a72b8f75e2179c5fd57f9b19c8d /lib
parent2df68007e5e3640c02ada107851c7b5bb96072da (diff)
downloadtools.nes-1c4e8eff6849ce35c31f189f9a07519a89c48ef4.tar.gz
tools.nes-1c4e8eff6849ce35c31f189f9a07519a89c48ef4.zip
vnf: don't report stack push/pop twice in verbose
On situations like jsr or rts, we perform two pushes/pops, but this is not to be reported in verbose mode as it's not that clear. Instead, let's report the full address in a single stack line. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/vnf/src/lib.rs22
1 files changed, 12 insertions, 10 deletions
diff --git a/lib/vnf/src/lib.rs b/lib/vnf/src/lib.rs
index 4ba04c1..f2524cd 100644
--- a/lib/vnf/src/lib.rs
+++ b/lib/vnf/src/lib.rs
@@ -613,8 +613,9 @@ impl Machine {
println!();
}
- // Push the given 'value' to the stack.
- fn push_stack(&mut self, value: u8) -> Result<(), String> {
+ // Push the given 'value' to the stack. Set 'report' to true if you want the
+ // output from verbose mode.
+ fn push_stack(&mut self, value: u8, report: bool) -> Result<(), String> {
// Write the given value onto the stack.
let address = 0x200 + self.s as u16;
self.write_memory(address, value)?;
@@ -625,22 +626,23 @@ impl Machine {
return Err("stack underflow!".to_string());
}
- if self.verbose {
+ if self.verbose && report {
self.put_stack();
}
Ok(())
}
- // Pop the stack once and return the value that was found.
- fn pop_stack(&mut self, account_read: bool) -> Result<u8, String> {
+ // Pop the stack once and return the value that was found. Set 'report' to
+ // true if you want the output from verbose mode.
+ fn pop_stack(&mut self, account_read: bool, report: bool) -> Result<u8, String> {
if self.s == self.initial_stack_value {
return Err("stack overflow!".to_string());
}
self.s += 1;
- if self.verbose {
+ if self.verbose && report {
self.put_stack();
}
@@ -908,8 +910,8 @@ impl Machine {
let low = (next_address as u16 & 0x00FF) as u8;
let high = ((next_address as u16 & 0xFF00) >> 8) as u8;
- self.push_stack(high)?;
- self.push_stack(low)?;
+ self.push_stack(high, false)?;
+ self.push_stack(low, true)?;
self.pc = address;
self.skip_pc = true;
@@ -969,8 +971,8 @@ impl Machine {
// stack was the next instruction before the call, but the size
// of the 'rts/rti' should also be accounted. Hence the + 1 to
// the resulting PC.
- let low = self.pop_stack(false)? as u16;
- let high = (self.pop_stack(false)? as u16) << 8;
+ let low = self.pop_stack(false, false)? as u16;
+ let high = (self.pop_stack(false, true)? as u16) << 8;
self.pc = (high + low) as usize + 1;
self.skip_pc = true;
}