nes-mapper 72 fixed and misc bookkeeping

This commit is contained in:
zeromus 2012-06-11 07:59:30 +00:00
parent 6462d84ac9
commit b240c675ce
5 changed files with 56 additions and 25 deletions

View File

@ -52,14 +52,14 @@ Open bus and bus conflict emulation is not considered complete or thorough in an
061 Multicart Junk
062 Multicart Junk
064 Tengen Good
065 Misc (J) Nothing
065 Misc (J) Decent
066 GxROM Complete
067 Sunsoft-3 Complete
068 Sunsoft-4 Complete
069 FME7 Minimal (missing sound)
070 Misc Complete
071 Camerica Complete
072 Misc (J) Nothing
072 Misc (J) Complete
073 VRC3 Good
074 Pirate (CN) Junk
075 VRC1 Complete

View File

@ -146,6 +146,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
byte old_value = value;
value &= ReadPRG(addr);
Debug.Assert(old_value == value, "Found a test case of bus conflict. please report.");
//report: pinball quest (J)
return value;
}

View File

@ -52,8 +52,6 @@ namespace BizHawk.Emulation.Consoles.Nintendo
case "IREM-H3001":
AssertPrg(128, 256); AssertChr(128, 256); AssertVram(0); AssertWram(0);
break;
case "IREM-H3001-FLEX":
break;
default:
return false;
}

View File

@ -12,12 +12,22 @@ namespace BizHawk.Emulation.Consoles.Nintendo
//Moero!! Pro Tennis
//Moero!! Juudou Warriors
//based on the chips on the pcb (3x 4bit registers and some OR gates) i'm gonna speculate something a little different about how this works.
//there isnt enough memory for 2 bank registers, a latched bank, and a latched command. so i think the bank isnt latched--the command is latched.
//when the top 2 bits are 0, then the low 4 bits are written to the register specified by the latch
//when the top 2 bits arent 0, theyre written to the latch
//interestingly, this works (for pinball quest) only when bus conflicts are applied, otherwise the game cant get past the title
class JALECO_JF_17 : NES.NESBoardBase
{
int command;
//configuration
int prg_bank_mask_16k;
byte prg_bank_16k;
int chr_bank_mask_8k;
//state
int latch;
ByteBuffer prg_banks_16k = new ByteBuffer(2);
ByteBuffer chr_banks_8k = new ByteBuffer(1);
public override bool Configure(NES.EDetectionOrigin origin)
{
@ -30,12 +40,25 @@ namespace BizHawk.Emulation.Consoles.Nintendo
default:
return false;
}
SetMirrorType(Cart.pad_h, Cart.pad_v);
prg_bank_mask_16k = (Cart.prg_size / 16) - 1;
chr_bank_mask_8k = (Cart.chr_size / 8) - 1;
SetMirrorType(Cart.pad_h, Cart.pad_v);
prg_banks_16k[1] = 0xFF;
chr_banks_8k[0] = 0;
SyncMap();
return true;
}
void SyncMap()
{
ApplyMemoryMapMask(prg_bank_mask_16k, prg_banks_16k);
ApplyMemoryMapMask(chr_bank_mask_8k, chr_banks_8k);
}
public override void Dispose()
{
prg_banks_16k.Dispose();
@ -45,38 +68,47 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("prg_bank_mask_16k", ref prg_bank_mask_16k);
ser.Sync("prg_bank_16k", ref prg_bank_16k);
ser.Sync("latch", ref latch);
ser.Sync("prg_banks_16k", ref prg_banks_16k);
ser.Sync("command", ref command);
ser.Sync("chr_banks_8k", ref chr_banks_8k);
}
public override void WritePRG(int addr, byte value)
{
//Console.WriteLine("MAP {0:X4} = {1:X2}", addr, value);
value = HandleNormalPRGConflict(addr, value);
int command = value >> 6;
switch (command)
{
case 0:
if (latch == 1)
chr_banks_8k[0] = (byte)(value & 0xF);
else if (latch == 2)
prg_banks_16k[0] = (byte)(value & 0xF);
SyncMap();
break;
case 1:
break;
case 2:
prg_bank_16k = (byte)(value & 15);
break;
case 3:
default:
latch = command;
break;
}
command = value >> 6;
}
public override byte ReadPRG(int addr)
{
int bank_16k = addr >> 14;
int ofs = addr & ((1 << 14) - 1);
bank_16k = prg_banks_16k[bank_16k];
bank_16k &= prg_bank_mask_16k;
addr = (bank_16k << 14) | ofs;
addr = ApplyMemoryMap(14, prg_banks_16k, addr);
return ROM[addr];
}
public override byte ReadPPU(int addr)
{
if (addr < 0x2000)
{
addr = ApplyMemoryMap(13, chr_banks_8k, addr);
return base.ReadPPUChr(addr);
}
else return base.ReadPPU(addr);
}
}
}

View File

@ -112,7 +112,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
}
void ClockClock()
void ClockCPU()
{
if (!irq_enable) return;
if (irq_counter == 0)
@ -148,7 +148,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
if (clock_counter == 3)
{
clock_counter = 0;
ClockClock();
ClockCPU();
}
}
}