[NES] update savestates

This commit is contained in:
zeromus 2011-06-09 22:59:54 +00:00
parent 72100bd304
commit f72be10bd1
7 changed files with 94 additions and 32 deletions

View File

@ -13,21 +13,14 @@ using System.Diagnostics;
//TODO - tweak nametable / chr viewer to be more useful //TODO - tweak nametable / chr viewer to be more useful
//FUTURE - we may need to split this into a separate MMC5 class. but for now it is just a pain.
namespace BizHawk.Emulation.Consoles.Nintendo namespace BizHawk.Emulation.Consoles.Nintendo
{ {
class MMC5
{
NES.NESBoardBase board;
public MMC5(NES.NESBoardBase board)
{
this.board = board;
}
}
public class ExROM : NES.NESBoardBase public class ExROM : NES.NESBoardBase
{ {
//configuraton //configuraton
int prg_bank_mask_8k, chr_bank_mask_1k; //board setup (to be isolated from ExROM later into mmc5 class) int prg_bank_mask_8k, chr_bank_mask_1k; //board setup (to be isolated from mmc5 code later, when we need the separate mmc5 class)
//state //state
int irq_target, irq_counter; int irq_target, irq_counter;
@ -51,6 +44,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public override void SyncState(Serializer ser) public override void SyncState(Serializer ser)
{ {
base.SyncState(ser);
ser.Sync("irq_target", ref irq_target); ser.Sync("irq_target", ref irq_target);
ser.Sync("irq_counter", ref irq_counter); ser.Sync("irq_counter", ref irq_counter);
ser.Sync("irq_enabled", ref irq_enabled); ser.Sync("irq_enabled", ref irq_enabled);

View File

@ -27,6 +27,15 @@ namespace BizHawk.Emulation.Consoles.Nintendo
chr_regs_1k.Dispose(); chr_regs_1k.Dispose();
} }
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("prg_regs_8k", ref prg_regs_8k);
ser.Sync("chr_regs_1k", ref chr_regs_1k);
ser.Sync("prg_mode", ref chr_regs_1k);
ser.Sync("mirror_mode", ref chr_regs_1k);
}
public override bool Configure(NES.EDetectionOrigin origin) public override bool Configure(NES.EDetectionOrigin origin)
{ {
//configure //configure

View File

@ -30,6 +30,18 @@ namespace BizHawk.Emulation.Consoles.Nintendo
chr_regs_1k.Dispose(); chr_regs_1k.Dispose();
} }
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("prg_regs_8k", ref prg_regs_8k);
ser.Sync("chr_regs_1k", ref chr_regs_1k);
ser.Sync("irq_counter_enabled", ref irq_counter_enabled);
ser.Sync("irq_asserted", ref irq_asserted);
ser.Sync("irq_counter", ref irq_counter);
ser.Sync("irq_reload", ref irq_reload);
ser.Sync("clock_counter", ref clock_counter);
}
public override bool Configure(NES.EDetectionOrigin origin) public override bool Configure(NES.EDetectionOrigin origin)
{ {
//configure //configure

View File

@ -20,8 +20,14 @@ using System.Diagnostics;
namespace BizHawk.Emulation.Consoles.Nintendo namespace BizHawk.Emulation.Consoles.Nintendo
{ {
// this is the base class for the MMC3 mapper
public class Namcot109 : IDisposable public class Namcot109 : IDisposable
{ {
//state
public int chr_mode, prg_mode, reg_addr;
ByteBuffer chr_regs_1k = new ByteBuffer(8);
ByteBuffer prg_regs_8k = new ByteBuffer(8);
protected NES.NESBoardBase board; protected NES.NESBoardBase board;
public Namcot109(NES.NESBoardBase board) public Namcot109(NES.NESBoardBase board)
{ {
@ -52,11 +58,14 @@ namespace BizHawk.Emulation.Consoles.Nintendo
prg_regs_8k.Dispose(); prg_regs_8k.Dispose();
} }
//state public virtual void SyncState(Serializer ser)
public int chr_mode, prg_mode, reg_addr; {
ser.Sync("chr_mode", ref chr_mode);
ByteBuffer chr_regs_1k = new ByteBuffer(8); ser.Sync("prg_mode", ref prg_mode);
ByteBuffer prg_regs_8k = new ByteBuffer(8); ser.Sync("reg_addr", ref reg_addr);
ser.Sync("chr_regs_1k", ref chr_regs_1k);
ser.Sync("prg_regs_8k", ref prg_regs_8k);
}
public virtual void WritePRG(int addr, byte value) public virtual void WritePRG(int addr, byte value)
{ {
@ -106,16 +115,38 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public class MMC3 : Namcot109 public class MMC3 : Namcot109
{ {
//state
public byte mirror;
int a12_old;
byte irq_reload, irq_counter;
bool irq_pending, irq_enable;
//it really seems like these should be the same but i cant seem to unify them.
//theres no sense in delaying the IRQ, so its logic must be tied to the separator.
//the hint, of course, is that the countdown value is the same.
//will someone else try to unify them?
int separator_counter;
int irq_countdown;
public NES.NESBoardBase.EMirrorType MirrorType { get { return mirror == 0 ? NES.NESBoardBase.EMirrorType.Vertical : NES.NESBoardBase.EMirrorType.Horizontal; } }
public MMC3(NES.NESBoardBase board, int num_prg_banks) public MMC3(NES.NESBoardBase board, int num_prg_banks)
: base(board) : base(board)
{ {
} }
//state public override void SyncState(Serializer ser)
public NES.NESBoardBase.EMirrorType mirror; {
int a12_old; base.SyncState(ser);
byte irq_reload, irq_counter; ser.Sync("mirror", ref mirror);
bool irq_pending, irq_enable; ser.Sync("mirror", ref a12_old);
ser.Sync("irq_reload", ref irq_reload);
ser.Sync("irq_counter", ref irq_counter);
ser.Sync("irq_pending", ref irq_pending);
ser.Sync("irq_enable", ref irq_enable);
ser.Sync("separator_counter", ref separator_counter);
ser.Sync("irq_countdown", ref irq_countdown);
}
void SyncIRQ() void SyncIRQ()
{ {
@ -132,9 +163,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo
break; break;
case 0x2000: //$A000 case 0x2000: //$A000
//mirroring //mirroring
if ((value & 1) == 0) mirror = NES.NESBoardBase.EMirrorType.Vertical; mirror = (byte)(value & 1);
else mirror = NES.NESBoardBase.EMirrorType.Horizontal; board.SetMirrorType(MirrorType);
board.SetMirrorType(mirror);
break; break;
case 0x2001: //$A001 case 0x2001: //$A001
//wram enable/protect //wram enable/protect
@ -189,13 +219,6 @@ namespace BizHawk.Emulation.Consoles.Nintendo
} }
} }
//it really seems like these should be the same but i cant seem to unify them.
//theres no sense in delaying the IRQ, so its logic must be tied to the separator.
//the hint, of course, is that the countdown value is the same.
//will someone else try to unify them?
int separator_counter;
int irq_countdown;
public void ClockPPU() public void ClockPPU()
{ {
if (separator_counter > 0) if (separator_counter > 0)
@ -237,6 +260,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public abstract class MMC3_Family_Board_Base : NES.NESBoardBase public abstract class MMC3_Family_Board_Base : NES.NESBoardBase
{ {
protected Namcot109 mapper;
//configuration //configuration
protected int prg_mask, chr_mask; protected int prg_mask, chr_mask;
@ -245,7 +270,11 @@ namespace BizHawk.Emulation.Consoles.Nintendo
mapper.Dispose(); mapper.Dispose();
} }
protected Namcot109 mapper; public override void SyncState(Serializer ser)
{
base.SyncState(ser);
mapper.SyncState(ser);
}
int MapCHR(int addr) int MapCHR(int addr)
{ {

View File

@ -12,7 +12,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public override void WritePRG(int addr, byte value) public override void WritePRG(int addr, byte value)
{ {
base.WritePRG(addr, value); base.WritePRG(addr, value);
SetMirrorType(mmc3.mirror); //often redundant, but gets the job done SetMirrorType(mmc3.MirrorType); //often redundant, but gets the job done
} }
public override byte[] SaveRam public override byte[] SaveRam

View File

@ -28,6 +28,16 @@ namespace BizHawk.Emulation.Consoles.Nintendo
prg_regs_16k.Dispose(); prg_regs_16k.Dispose();
} }
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("chr_regs_2k", ref chr_regs_2k);
ser.Sync("nt_regs", ref nt_regs);
ser.Sync("prg_regs_16k", ref prg_regs_16k);
ser.Sync("flag_m", ref flag_m);
ser.Sync("flag_r", ref flag_r);
}
public override bool Configure(NES.EDetectionOrigin origin) public override bool Configure(NES.EDetectionOrigin origin)
{ {
//configure //configure

View File

@ -28,6 +28,14 @@ namespace BizHawk.Emulation.Consoles.Nintendo
chr_regs_1k.Dispose(); chr_regs_1k.Dispose();
} }
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("prg_regs_8k", ref prg_regs_8k);
ser.Sync("chr_regs_1k", ref chr_regs_1k);
ser.Sync("mirror_mode", ref mirror_mode);
}
public override bool Configure(NES.EDetectionOrigin origin) public override bool Configure(NES.EDetectionOrigin origin)
{ {
//configure //configure