diff options
Diffstat (limited to 'nes/nes.go')
| -rw-r--r-- | nes/nes.go | 20 |
1 files changed, 4 insertions, 16 deletions
@@ -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() } } |