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 }