mirror of
https://github.com/giongto35/cloud-game.git
synced 2026-01-24 02:55:45 +00:00
85 lines
1.7 KiB
Go
85 lines
1.7 KiB
Go
package nes
|
|
|
|
import (
|
|
"encoding/gob"
|
|
"log"
|
|
)
|
|
|
|
// https://github.com/asfdfdfd/fceux/blob/master/src/boards/225.cpp
|
|
// https://wiki.nesdev.com/w/index.php/INES_Mapper_225
|
|
|
|
type Mapper225 struct {
|
|
*Cartridge
|
|
chrBank int
|
|
prgBank1 int
|
|
prgBank2 int
|
|
}
|
|
|
|
func NewMapper225(cartridge *Cartridge) Mapper {
|
|
prgBanks := len(cartridge.PRG) / 0x4000
|
|
return &Mapper225{cartridge, 0, 0, prgBanks - 1}
|
|
}
|
|
|
|
func (m *Mapper225) Save(encoder *gob.Encoder) error {
|
|
encoder.Encode(m.chrBank)
|
|
encoder.Encode(m.prgBank1)
|
|
encoder.Encode(m.prgBank2)
|
|
return nil
|
|
}
|
|
|
|
func (m *Mapper225) Load(decoder *gob.Decoder) error {
|
|
decoder.Decode(&m.chrBank)
|
|
decoder.Decode(&m.prgBank1)
|
|
decoder.Decode(&m.prgBank2)
|
|
return nil
|
|
}
|
|
|
|
func (m *Mapper225) Step() {
|
|
}
|
|
|
|
func (m *Mapper225) 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("unhandled Mapper225 read at address: 0x%04X", address)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func (m *Mapper225) Write(address uint16, value byte) {
|
|
if (address < 0x8000) {
|
|
return
|
|
}
|
|
|
|
A := int(address)
|
|
bank := (A >> 14) & 1
|
|
m.chrBank = (A & 0x3f) | (bank << 6)
|
|
prg := ((A >> 6) & 0x3f) | (bank << 6)
|
|
mode := (A >> 12) & 1;
|
|
if (mode == 1) {
|
|
m.prgBank1 = prg
|
|
m.prgBank2 = prg
|
|
} else {
|
|
m.prgBank1 = prg
|
|
m.prgBank2 = prg + 1
|
|
}
|
|
mirr := (A >> 13) & 1
|
|
if (mirr == 1) {
|
|
m.Cartridge.Mirror = MirrorHorizontal
|
|
} else {
|
|
m.Cartridge.Mirror = MirrorVertical
|
|
}
|
|
|
|
// fmt.Println(address, mirr, mode, prg)
|
|
}
|