NES - Some work on BANDAI-FCG-1 (mappers 16 & 159)

This commit is contained in:
andres.delikat 2011-09-18 16:14:55 +00:00
parent 586b352b37
commit 3c82e4f524
2 changed files with 76 additions and 42 deletions

View File

@ -26,7 +26,7 @@ Open bus and bus conflict emulation is not considered complete or thorough in an
011 Misc Complete 011 Misc Complete
013 CPROM Complete 013 CPROM Complete
015 Multicart Junk 015 Multicart Junk
016 Bandai Nothing (+159) 016 Bandai Started doesn't work(+159)
018 Jaleco* Nothing 018 Jaleco* Nothing
019 Namcot106 Needed (+210) 019 Namcot106 Needed (+210)
021 VRC4 Needed 021 VRC4 Needed

View File

@ -29,13 +29,33 @@ namespace BizHawk.Emulation.Consoles.Nintendo
class BANDAI_FCG_1 : NES.NESBoardBase class BANDAI_FCG_1 : NES.NESBoardBase
{ {
//configuration //configuration
int prg, chr_bank_mask_1k, mirror; int prg_bank_mask_8k, chr_bank_mask_1k;
//state
byte prg_bank_8k, eprom;
ByteBuffer regs = new ByteBuffer(10);
ByteBuffer prg_banks_8k = new ByteBuffer(2);
bool irq_countdown, irq_enabled, irq_asserted; bool irq_countdown, irq_enabled, irq_asserted;
ushort irq_counter; ushort irq_counter;
int clock_counter; int clock_counter;
int addr_reg; public override void SyncState(Serializer ser)
ByteBuffer regs = new ByteBuffer(12); {
base.SyncState(ser);
ser.Sync("chr_bank_mask_1k", ref chr_bank_mask_1k);
ser.Sync("irq_counter", ref irq_counter);
ser.Sync("irq_countdown", ref irq_countdown);
ser.Sync("irq_enabled", ref irq_enabled);
ser.Sync("irq_asserted", ref irq_asserted);
ser.Sync("clock_counter", ref clock_counter);
}
public override void Dispose()
{
base.Dispose();
regs.Dispose();
prg_banks_8k.Dispose();
}
public override bool Configure(NES.EDetectionOrigin origin) public override bool Configure(NES.EDetectionOrigin origin)
{ {
@ -47,34 +67,38 @@ namespace BizHawk.Emulation.Consoles.Nintendo
default: default:
return false; return false;
} }
BaseConfigure();
return true; return true;
} }
protected void BaseConfigure() protected void BaseConfigure()
{ {
chr_bank_mask_1k = Cart.chr_size - 1; chr_bank_mask_1k = Cart.chr_size - 1;
prg_bank_mask_8k = (Cart.prg_size / 8) - 1;
prg_banks_8k[1] = 0xFF;
SetMirrorType(EMirrorType.Vertical); SetMirrorType(EMirrorType.Vertical);
} }
public override byte ReadPRG(int addr) void SyncPRG()
{ {
return ROM[addr + (prg * 0x8000)]; prg_banks_8k[0] = regs[8];
} }
public override void WritePRG(int addr, byte value) public override void WritePRG(int addr, byte value)
{ {
addr &= 0xC000;
switch (addr) switch (addr)
{ {
case 0: case 1: case 2: case 3: case 0: case 1: case 2: case 3:
case 4: case 5: case 6: case 7: case 4: case 5: case 6: case 7:
regs[addr_reg] = value; regs[addr] = value;
break; break;
case 8: case 8:
prg = value; regs[8] = value;
SyncPRG();
break; break;
case 9: case 9:
mirror = value & 0x03; switch (value & 3)
switch (mirror)
{ {
case 0: SetMirrorType(NES.NESBoardBase.EMirrorType.Vertical); break; case 0: SetMirrorType(NES.NESBoardBase.EMirrorType.Vertical); break;
case 1: SetMirrorType(NES.NESBoardBase.EMirrorType.Horizontal); break; case 1: SetMirrorType(NES.NESBoardBase.EMirrorType.Horizontal); break;
@ -84,6 +108,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo
break; break;
case 0xA: case 0xA:
irq_enabled = value.Bit(0); irq_enabled = value.Bit(0);
if (!irq_enabled) irq_asserted = false;
SyncIrq();
break; break;
case 0xB: case 0xB:
irq_counter &= 0xFF00; irq_counter &= 0xFF00;
@ -94,37 +120,16 @@ namespace BizHawk.Emulation.Consoles.Nintendo
irq_counter |= (ushort)(value << 8); irq_counter |= (ushort)(value << 8);
break; break;
case 0xD: case 0xD:
eprom = value;
break; break;
} }
} }
public override byte ReadPPU(int addr)
{
//return VRAM[addr + chr];
return base.ReadPPU(addr);
}
public override void WritePPU(int addr, byte value)
{
//VRAM[addr + chr] = value;
base.WritePPU(addr, value);
}
void SyncIrq() void SyncIrq()
{ {
NES.irq_cart = irq_asserted; NES.irq_cart = irq_asserted;
} }
public override void ClockPPU()
{
clock_counter++;
if (clock_counter == 3)
{
ClockCPU();
clock_counter = 0;
}
}
void ClockCPU() void ClockCPU()
{ {
if (!irq_countdown) return; if (!irq_countdown) return;
@ -136,17 +141,46 @@ namespace BizHawk.Emulation.Consoles.Nintendo
} }
} }
public override void SyncState(Serializer ser) public override void ClockPPU()
{ {
base.SyncState(ser); clock_counter++;
ser.Sync("prg", ref prg); if (clock_counter == 3)
ser.Sync("chr_bank_mask_1k", ref chr_bank_mask_1k); {
ser.Sync("mirror", ref mirror); ClockCPU();
ser.Sync("irq_counter", ref irq_counter); clock_counter = 0;
ser.Sync("irq_countdown", ref irq_countdown); }
ser.Sync("irq_enabled", ref irq_enabled); }
ser.Sync("irq_asserted", ref irq_asserted);
ser.Sync("clock_counter", ref clock_counter); public override byte ReadPRG(int addr)
{
int bank_8k = addr >> 13;
int ofs = addr & ((1 << 13) - 1);
bank_8k = prg_banks_8k[bank_8k];
bank_8k &= prg_bank_mask_8k;
addr = (prg_bank_8k << 13) | ofs;
return ROM[addr];
}
int CalcPPUAddress(int addr)
{
int bank_1k = addr >> 10;
int ofs = addr & ((1 << 10) - 1);
bank_1k = regs[bank_1k];
bank_1k &= chr_bank_mask_1k;
return (bank_1k << 10) | ofs;
}
public override byte ReadPPU(int addr)
{
if (addr < 0x2000)
return VROM[CalcPPUAddress(addr)];
else return base.ReadPPU(addr);
}
public override void WritePPU(int addr, byte value)
{
if (addr < 0x2000) { }
base.WritePPU(addr, value);
} }
} }
} }