aboutsummaryrefslogtreecommitdiff
path: root/nes/nes.go
diff options
context:
space:
mode:
Diffstat (limited to 'nes/nes.go')
-rw-r--r--nes/nes.go20
1 files changed, 4 insertions, 16 deletions
diff --git a/nes/nes.go b/nes/nes.go
index e3845f6..79580b6 100644
--- a/nes/nes.go
+++ b/nes/nes.go
@@ -23,15 +23,6 @@ func New(c *cart.Cartridge) *Console {
return n
}
-// Step runs one CPU instruction and the PPU dots (3 per CPU cycle) that
-// elapse alongside it, firing NMI on a PPUCTRL/vblank edge. PPU state seen
-// by bus accesses mid-instruction still lags behind by up to one
-// instruction's worth of dots, since the CPU isn't cycle-stepped yet (see
-// README: "CPU stall hook and proper IRQ/NMI line (polled between
-// instructions)") - timing-sensitive register logic (the $2002 race window,
-// NMI edge detection) is implemented to the real dot granularity and is
-// exercised directly in the ppu package's tests, but end-to-end precision
-// against real games/test ROMs needs that CPU work to land too.
func (n *Console) Step() int {
cycles := n.CPU.Step()
n.cycles += uint64(cycles)
@@ -44,13 +35,10 @@ func (n *Console) Step() int {
return cycles
}
+// runs until the PPU finishes a frame, the framebuffer then holds a full picture
func (n *Console) StepFrame() {
- // 29780 is roughly one frame:
- // ~ 1789773 cycles per sec
- // ~ 60.1 fps
- // 1789773 / 60.1 = 29779.916...
- const cyclesPerFrame = 29780
- for done := 0; done < cyclesPerFrame; {
- done += n.Step()
+ frame := n.PPU.Frame
+ for n.PPU.Frame == frame {
+ n.Step()
}
}