248 lines
11 KiB
C#
248 lines
11 KiB
C#
using System;
|
|
|
|
namespace VirtualNes.Core
|
|
{
|
|
public abstract class Mapper
|
|
{
|
|
protected NES nes;
|
|
|
|
public Mapper(NES parent)
|
|
{
|
|
nes = parent;
|
|
}
|
|
|
|
public virtual void Dispose() { }
|
|
|
|
public abstract void Reset();
|
|
|
|
// $8000-$FFFF Memory write
|
|
public virtual void Write(ushort addr, byte data) { }
|
|
// $8000-$FFFF Memory read(Dummy)
|
|
public virtual void Read(ushort addr, byte data) { }
|
|
|
|
// $4100-$7FFF Lower Memory read/write
|
|
public virtual byte ReadLow(ushort addr)
|
|
{
|
|
// $6000-$7FFF WRAM
|
|
if (addr >= 0x6000 && addr <= 0x7FFF)
|
|
{
|
|
return MMU.CPU_MEM_BANK[addr >> 13][addr & 0x1FFF];
|
|
}
|
|
|
|
return (byte)(addr >> 8);
|
|
}
|
|
public virtual void WriteLow(ushort addr, byte data)
|
|
{
|
|
if (addr >= 0x6000 && addr <= 0x7FFF)
|
|
{
|
|
MMU.CPU_MEM_BANK[addr >> 13][addr & 0x1FFF] = data;
|
|
}
|
|
}
|
|
|
|
// $4018-$40FF Extention register read/write
|
|
public virtual byte ExRead(ushort addr) { return 0x00; }
|
|
public virtual void ExWrite(ushort addr, byte data) { }
|
|
|
|
public virtual byte ExCmdRead(EXCMDRD cmd) { return 0x00; }
|
|
public virtual void ExCmdWrite(EXCMDWR cmd, byte data) { }
|
|
|
|
// H sync/V sync/Clock sync
|
|
public virtual void HSync(int scanline) { }
|
|
public virtual void VSync() { }
|
|
public virtual void Clock(int cycles) { }
|
|
// PPU address bus latch
|
|
public virtual void PPU_Latch(ushort addr) { }
|
|
// PPU Character latch
|
|
public virtual void PPU_ChrLatch(ushort addr) { }
|
|
// PPU Extension character/palette
|
|
public virtual void PPU_ExtLatchX(int x) { }
|
|
public virtual void PPU_ExtLatch(ushort addr, ref byte chr_l, ref byte chr_h, ref byte attr) { }
|
|
// For State save
|
|
public virtual bool IsStateSave() { return false; }
|
|
public virtual void SaveState(byte[] p) { }
|
|
public virtual void LoadState(byte[] p) { }
|
|
|
|
// Extension commands
|
|
// For ExCmdRead command
|
|
public enum EXCMDRD
|
|
{
|
|
EXCMDRD_NONE = 0,
|
|
EXCMDRD_DISKACCESS,
|
|
}
|
|
// For ExCmdWrite command
|
|
public enum EXCMDWR
|
|
{
|
|
EXCMDWR_NONE = 0,
|
|
EXCMDWR_DISKINSERT,
|
|
EXCMDWR_DISKEJECT,
|
|
}
|
|
|
|
public static Mapper CreateMapper(NES parent, int no)
|
|
{
|
|
//todo : 实现加载mapper
|
|
switch (no)
|
|
{
|
|
case 0: return new Mapper000(parent);
|
|
case 1: return new Mapper001(parent);
|
|
case 2: return new Mapper002(parent);
|
|
case 3: return new Mapper003(parent);
|
|
case 4: return new Mapper004(parent);
|
|
case 5: return new Mapper005(parent);
|
|
case 6: return new Mapper006(parent);
|
|
case 7: return new Mapper007(parent);
|
|
case 8: return new Mapper008(parent);
|
|
case 9: return new Mapper009(parent);
|
|
case 10: return new Mapper010(parent);
|
|
case 11: return new Mapper011(parent);
|
|
case 12: return new Mapper012(parent);
|
|
case 13: return new Mapper013(parent);
|
|
case 15: return new Mapper015(parent);
|
|
case 16: return new Mapper016(parent);
|
|
case 17: return new Mapper017(parent);
|
|
case 18: return new Mapper018(parent);
|
|
case 19: return new Mapper019(parent);
|
|
case 21: return new Mapper021(parent);
|
|
case 22: return new Mapper022(parent);
|
|
case 23: return new Mapper023(parent);
|
|
case 24: return new Mapper024(parent);
|
|
case 25: return new Mapper025(parent);
|
|
case 26: return new Mapper026(parent);
|
|
case 27: return new Mapper027(parent);
|
|
case 32: return new Mapper032(parent);
|
|
case 33: return new Mapper033(parent);
|
|
case 34: return new Mapper034(parent);
|
|
case 35: return new Mapper035(parent);
|
|
case 40: return new Mapper040(parent);
|
|
case 41: return new Mapper041(parent);
|
|
case 42: return new Mapper042(parent);
|
|
case 43: return new Mapper043(parent);
|
|
case 44: return new Mapper044(parent);
|
|
case 45: return new Mapper045(parent);
|
|
case 46: return new Mapper046(parent);
|
|
case 47: return new Mapper047(parent);
|
|
case 48: return new Mapper048(parent);
|
|
case 50: return new Mapper050(parent);
|
|
case 51: return new Mapper051(parent);
|
|
case 57: return new Mapper057(parent);
|
|
case 58: return new Mapper058(parent);
|
|
case 60: return new Mapper060(parent);
|
|
case 61: return new Mapper061(parent);
|
|
case 62: return new Mapper062(parent);
|
|
case 64: return new Mapper064(parent);
|
|
case 65: return new Mapper065(parent);
|
|
case 66: return new Mapper066(parent);
|
|
case 67: return new Mapper067(parent);
|
|
case 68: return new Mapper068(parent);
|
|
case 69: return new Mapper069(parent);
|
|
case 70: return new Mapper070(parent);
|
|
case 71: return new Mapper071(parent);
|
|
case 72: return new Mapper072(parent);
|
|
case 73: return new Mapper073(parent);
|
|
case 74: return new Mapper074(parent);
|
|
case 75: return new Mapper075(parent);
|
|
case 76: return new Mapper076(parent);
|
|
case 77: return new Mapper077(parent);
|
|
case 78: return new Mapper078(parent);
|
|
case 79: return new Mapper079(parent);
|
|
case 80: return new Mapper080(parent);
|
|
case 82: return new Mapper082(parent);
|
|
case 83: return new Mapper083(parent);
|
|
case 85: return new Mapper085(parent);
|
|
case 86: return new Mapper086(parent);
|
|
case 87: return new Mapper087(parent);
|
|
case 88: return new Mapper088(parent);
|
|
case 89: return new Mapper089(parent);
|
|
case 90: return new Mapper090(parent);
|
|
case 91: return new Mapper091(parent);
|
|
case 92: return new Mapper092(parent);
|
|
case 93: return new Mapper093(parent);
|
|
case 94: return new Mapper094(parent);
|
|
case 95: return new Mapper095(parent);
|
|
case 96: return new Mapper096(parent);
|
|
case 97: return new Mapper097(parent);
|
|
case 99: return new Mapper099(parent);
|
|
case 100: return new Mapper100(parent);
|
|
case 101: return new Mapper101(parent);
|
|
case 105: return new Mapper105(parent);
|
|
case 108: return new Mapper108(parent);
|
|
case 109: return new Mapper109(parent);
|
|
case 110: return new Mapper110(parent);
|
|
case 111: return new Mapper111(parent);
|
|
case 112: return new Mapper112(parent);
|
|
case 113: return new Mapper113(parent);
|
|
case 114: return new Mapper114(parent);
|
|
case 115: return new Mapper115(parent);
|
|
case 116: return new Mapper116(parent);
|
|
case 117: return new Mapper117(parent);
|
|
case 118: return new Mapper118(parent);
|
|
case 119: return new Mapper119(parent);
|
|
case 122: return new Mapper122(parent);
|
|
case 133: return new Mapper133(parent);
|
|
case 134: return new Mapper134(parent);
|
|
case 135: return new Mapper135(parent);
|
|
case 140: return new Mapper140(parent);
|
|
case 142: return new Mapper142(parent);
|
|
case 151: return new Mapper151(parent);
|
|
case 160: return new Mapper160(parent);
|
|
case 162: return new Mapper162(parent);
|
|
case 163: return new Mapper163(parent);
|
|
case 164: return new Mapper164(parent);
|
|
case 165: return new Mapper165(parent);
|
|
case 167: return new Mapper167(parent);
|
|
case 175: return new Mapper175(parent);
|
|
case 176: return new Mapper176(parent);
|
|
case 178: return new Mapper178(parent);
|
|
case 180: return new Mapper180(parent);
|
|
case 181: return new Mapper181(parent);
|
|
case 182: return new Mapper182(parent);
|
|
case 183: return new Mapper183(parent);
|
|
case 185: return new Mapper185(parent);
|
|
case 187: return new Mapper187(parent);
|
|
case 188: return new Mapper188(parent);
|
|
case 189: return new Mapper189(parent);
|
|
case 190: return new Mapper190(parent);
|
|
case 191: return new Mapper191(parent);
|
|
case 192: return new Mapper192(parent);
|
|
case 193: return new Mapper193(parent);
|
|
case 194: return new Mapper194(parent);
|
|
case 195: return new Mapper195(parent);
|
|
case 198: return new Mapper198(parent);
|
|
case 199: return new Mapper199(parent);
|
|
case 200: return new Mapper200(parent);
|
|
case 201: return new Mapper201(parent);
|
|
case 202: return new Mapper202(parent);
|
|
case 216: return new Mapper216(parent);
|
|
case 222: return new Mapper222(parent);
|
|
case 225: return new Mapper225(parent);
|
|
case 226: return new Mapper226(parent);
|
|
case 227: return new Mapper227(parent);
|
|
case 228: return new Mapper228(parent);
|
|
case 229: return new Mapper229(parent);
|
|
case 230: return new Mapper230(parent);
|
|
case 231: return new Mapper231(parent);
|
|
case 232: return new Mapper232(parent);
|
|
case 233: return new Mapper233(parent);
|
|
case 234: return new Mapper234(parent);
|
|
case 235: return new Mapper235(parent);
|
|
case 236: return new Mapper236(parent);
|
|
case 240: return new Mapper240(parent);
|
|
case 241: return new Mapper241(parent);
|
|
case 242: return new Mapper242(parent);
|
|
case 243: return new Mapper243(parent);
|
|
case 244: return new Mapper244(parent);
|
|
case 245: return new Mapper245(parent);
|
|
case 246: return new Mapper246(parent);
|
|
case 248: return new Mapper248(parent);
|
|
case 249: return new Mapper249(parent);
|
|
case 251: return new Mapper251(parent);
|
|
case 252: return new Mapper252(parent);
|
|
case 254: return new Mapper254(parent);
|
|
case 255: return new Mapper255(parent);
|
|
|
|
default:
|
|
throw new NotImplementedException($"Mapper#{no:000} is not Impl");
|
|
}
|
|
}
|
|
}
|
|
}
|