cloud-game/nes/mapper7.go
2019-03-31 23:54:02 +08:00

64 lines
1.2 KiB
Go

package nes
import (
"encoding/gob"
"log"
)
type Mapper7 struct {
*Cartridge
prgBank int
}
func NewMapper7(cartridge *Cartridge) Mapper {
return &Mapper7{cartridge, 0}
}
func (m *Mapper7) Save(encoder *gob.Encoder) error {
encoder.Encode(m.prgBank)
return nil
}
func (m *Mapper7) Load(decoder *gob.Decoder) error {
decoder.Decode(&m.prgBank)
return nil
}
func (m *Mapper7) Step() {
}
func (m *Mapper7) Read(address uint16) byte {
switch {
case address < 0x2000:
return m.CHR[address]
case address >= 0x8000:
index := m.prgBank*0x8000 + int(address-0x8000)
return m.PRG[index]
case address >= 0x6000:
index := int(address) - 0x6000
return m.SRAM[index]
default:
log.Fatalf("unhandled mapper7 read at address: 0x%04X", address)
}
return 0
}
func (m *Mapper7) Write(address uint16, value byte) {
switch {
case address < 0x2000:
m.CHR[address] = value
case address >= 0x8000:
m.prgBank = int(value & 7)
switch value & 0x10 {
case 0x00:
m.Cartridge.Mirror = MirrorSingle0
case 0x10:
m.Cartridge.Mirror = MirrorSingle1
}
case address >= 0x6000:
index := int(address) - 0x6000
m.SRAM[index] = value
default:
log.Fatalf("unhandled mapper7 write at address: 0x%04X", address)
}
}