Implement mapper 243

This commit is contained in:
adelikat 2012-07-21 19:23:05 +00:00
parent f16a44d4e6
commit b8a16f93fa
1 changed files with 30 additions and 34 deletions

View File

@ -56,6 +56,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
int reg_addr; int reg_addr;
ByteBuffer regs = new ByteBuffer(8); ByteBuffer regs = new ByteBuffer(8);
int chr_bank_mask_8k, prg_bank_mask_32k;
public override bool Configure(NES.EDetectionOrigin origin) public override bool Configure(NES.EDetectionOrigin origin)
{ {
@ -66,7 +67,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo
default: default:
return false; return false;
} }
chr_bank_mask_8k = Cart.chr_size / 8 - 1;
prg_bank_mask_32k = Cart.prg_size / 32 - 1;
return true; return true;
} }
@ -79,49 +81,43 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public override void WriteEXP(int addr, byte value) public override void WriteEXP(int addr, byte value)
{ {
switch (addr & 0x101) switch (addr & 0x01)
{ {
case 0x0000: case 0x0000:
reg_addr = addr & 0x07; reg_addr = value & 0x07;
break; break;
case 0x0001: case 0x0001:
switch (reg_addr) switch (reg_addr)
{ {
case 0:
regs[0] = 0; regs[1] = 3; //FCEUX does this
break;
case 2: case 2:
regs[3] = (byte)((value & 0x01) << 3);
break;
case 4:
regs[1] = (byte)((regs[1] & 0x06) | (value & 0x03));
break;
case 5:
regs[0] = (byte)(value & 0x01);
break;
case 6:
regs[1] = (byte)((regs[1] & 0x01) | (regs[3] | (value & 0x03) << 1));
break;
case 7:
regs[2] = (byte)(value & 0x01); regs[2] = (byte)(value & 0x01);
break; break;
case 4:
} regs[4] = (byte)(value & 0x01);
int mirror = (value >> 1) & 0x03;
switch (mirror)
{
case 0:
SetMirrorType(EMirrorType.Horizontal);
break; break;
case 1: case 5:
SetMirrorType(EMirrorType.Vertical); regs[5] = (byte)(value & 0x07);
break; break;
case 2: case 6:
SetMirroring(0, 1, 1, 1); regs[6] = (byte)(value & 0x03);
break; break;
case 3: case 7:
SetMirrorType(EMirrorType.OneScreenB); int mirror = (value >> 1) & 0x03;
switch (mirror)
{
case 0:
SetMirrorType(EMirrorType.Horizontal);
break;
case 1:
SetMirrorType(EMirrorType.Vertical);
break;
case 2:
SetMirroring(0, 1, 1, 1);
break;
case 3:
SetMirrorType(EMirrorType.OneScreenB);
break;
}
break; break;
} }
break; break;
@ -133,7 +129,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
if (addr < 0x2000) if (addr < 0x2000)
{ {
int chr_bank = regs[4] | (regs[6] << 1) | (regs[2] << 3); int chr_bank = regs[4] | (regs[6] << 1) | (regs[2] << 3);
return VROM[(chr_bank * 0x2000) + addr]; return VROM[((chr_bank & chr_bank_mask_8k) * 0x2000) + addr];
} }
else else
{ {
@ -143,7 +139,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public override byte ReadPRG(int addr) public override byte ReadPRG(int addr)
{ {
return ROM[(regs[5] * 0x8000) + addr]; return ROM[((regs[5] & prg_bank_mask_32k) * 0x8000) + addr];
} }
} }
} }