/
Mapper3.go
54 lines (48 loc) · 1.13 KB
/
Mapper3.go
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
48
49
50
51
52
53
54
package nes
import "log"
type Mapper3 struct {
*Cartridge
chrBank int
prgBank1 int
prgBank2 int
}
func NewMapper3(cartridge *Cartridge) Mapper {
prgBanks := len(cartridge.PRG) / 0x4000
return &Mapper3{cartridge, 0, 0, prgBanks - 1}
}
func (m *Mapper3) Read(address uint16) byte {
switch {
case address < 0x2000:
index := m.chrBank*0x2000 + int(address)
return m.CHR[index]
case address >= 0xC000:
index := m.prgBank2*0x4000 + int(address-0xC000)
return m.PRG[index]
case address >= 0x8000:
index := m.prgBank1*0x4000 + int(address-0x8000)
return m.PRG[index]
case address >= 0x6000:
index := int(address) - 0x6000
return m.SRAM[index]
default:
log.Fatalf("Illegal mapper3 read at address: $%04X", address)
}
return 0
}
func (m *Mapper3) Write(address uint16, val byte) {
switch {
case address < 0x2000:
index := m.chrBank*0x2000 + int(address)
m.CHR[index] = val
case address >= 0x8000:
m.chrBank = int(val & 3)
case address >= 0x6000:
index := int(address) - 0x6000
m.SRAM[index] = val
default:
log.Fatalf("Illegal mapper2 write at address: $%04X", address)
}
}
func (m *Mapper3) Run() {
return
}