aboutsummaryrefslogtreecommitdiff
path: root/cart/nrom.go
diff options
context:
space:
mode:
Diffstat (limited to 'cart/nrom.go')
-rw-r--r--cart/nrom.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/cart/nrom.go b/cart/nrom.go
new file mode 100644
index 0000000..3828c16
--- /dev/null
+++ b/cart/nrom.go
@@ -0,0 +1,47 @@
+package cart
+
+type nrom struct {
+ prg []uint8
+ chr []uint8
+ chrIsRAM bool
+ prgRAM [8 * 1024]uint8
+ mirroring Mirroring
+}
+
+func newNROM(c *Cartridge) *nrom {
+ return &nrom{
+ prg: c.PRG,
+ chr: c.CHR,
+ chrIsRAM: c.CHRIsRAM,
+ mirroring: c.Mirroring,
+ }
+}
+
+func (m *nrom) CPURead(addr uint16) uint8 {
+ switch {
+ case addr >= 0x8000:
+ return m.prg[int(addr-0x8000)%len(m.prg)]
+ case addr >= 0x6000:
+ return m.prgRAM[addr-0x6000]
+ default:
+ return 0
+ }
+}
+
+func (m *nrom) CPUWrite(addr uint16, v uint8) {
+ if addr >= 0x6000 && addr < 0x8000 {
+ m.prgRAM[addr-0x6000] = v
+ }
+}
+
+func (m *nrom) PPURead(addr uint16) uint8 {
+ return m.chr[int(addr)%len(m.chr)]
+}
+
+func (m *nrom) PPUWrite(addr uint16, v uint8) {
+ if m.chrIsRAM {
+ m.chr[int(addr)%len(m.chr)] = v
+ }
+}
+
+func (m *nrom) Mirroring() Mirroring { return m.mirroring }