aboutsummaryrefslogtreecommitdiff
path: root/cart/nrom.go
blob: 3828c16d699f47af599bb34727d1a44d6a234bfa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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 }