aboutsummaryrefslogtreecommitdiff
path: root/nes/nes.go
diff options
context:
space:
mode:
authorcrecher <crecher@crecher.net>2026-10-12 04:27:53 +0200
committercrecher <crecher@crecher.net>2026-10-12 04:27:53 +0200
commitfe7ae6e696811a39828dd9727295aa73ae4e5873 (patch)
tree503f3c353cbd9e10714df80999da1738d13eb180 /nes/nes.go
parentbe4d8cb438b1b0f0a66681adc319875b5ee69eed (diff)
downloadgones-fe7ae6e696811a39828dd9727295aa73ae4e5873.tar.gz
gones-fe7ae6e696811a39828dd9727295aa73ae4e5873.zip
nes: add console with cpu bus and step loop
tests: run nestest through nes console
Diffstat (limited to 'nes/nes.go')
-rw-r--r--nes/nes.go34
1 files changed, 34 insertions, 0 deletions
diff --git a/nes/nes.go b/nes/nes.go
new file mode 100644
index 0000000..c4d09a0
--- /dev/null
+++ b/nes/nes.go
@@ -0,0 +1,34 @@
+package nes
+
+import (
+ "crecher.net/gones/v2/cart"
+ "crecher.net/gones/v2/cpu"
+)
+
+type Console struct {
+ CPU *cpu.CPU
+ Cart *cart.Cartridge
+ RAM [0x800]uint8
+ // PPU, APU, controllers once they exist
+ cycles uint64
+}
+
+func New(c *cart.Cartridge) *Console {
+ n := &Console{Cart: c}
+ n.CPU = cpu.NewCPU(n)
+ n.CPU.Reset()
+ return n
+}
+
+func (n *Console) Step() int {
+ cycles := n.CPU.Step()
+ n.cycles += uint64(cycles)
+ return cycles
+}
+
+func (n *Console) StepFrame() {
+ const cyclesPerFrame = 29780 // 29780 ~ 1789773 / 60.1
+ for done := 0; done < cyclesPerFrame; {
+ done += n.Step()
+ }
+} \ No newline at end of file