AtariHawk - fixes to the E7 mapper, still broken, don't know why, tired of looking at it

This commit is contained in:
adelikat 2012-10-19 00:13:39 +00:00
parent 00934939b0
commit 563065d054
1 changed files with 31 additions and 19 deletions

View File

@ -32,7 +32,7 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
class mE7 : MapperBase class mE7 : MapperBase
{ {
int toggle = 0; int rombank_1k = 0;
int rambank1_toggle = 0; int rambank1_toggle = 0;
ByteBuffer rambank0 = new ByteBuffer(1024); ByteBuffer rambank0 = new ByteBuffer(1024);
ByteBuffer rambank1 = new ByteBuffer(1024); ByteBuffer rambank1 = new ByteBuffer(1024);
@ -40,32 +40,44 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
public override byte ReadMemory(ushort addr) public override byte ReadMemory(ushort addr)
{ {
if (addr < 0x1000)
{
return base.ReadMemory(addr);
}
Address(addr); Address(addr);
if (addr < 0x1000) return base.ReadMemory(addr); if (addr < 0x1800)
else if (addr < 0x1400)
{ {
if (EnableRam0) if (EnableRam0)
{ {
return rambank0[(addr & 1023)]; if (addr < 0x1400) //Reading from the write port
{
return rambank0[addr & 0x3FF] = 0xFF; //Reading from 1k write port triggers an unwanted write
}
else
{
return rambank0[addr & 0x3FF];
}
} }
else else
{ {
return core.rom[toggle * 2 * 1024 + (addr & 0x7FF)]; return core.rom[(rombank_1k * 0x800) + (addr & 0x7FF)];
} }
} }
else if (addr < 0x1800) else if (addr < 0x1900) //Ram 1 Read port
{ {
return core.rom[toggle * 2 * 1024 + (addr & 0x7FF)]; return rambank1[(rambank1_toggle * 0x100) + (addr & 0xFF)];
} }
else if (addr < 0x1A00) else if (addr < 0x1A00) //Ram 1 Write port
{ {
return rambank1[toggle * 256 + (addr & 0x255)]; return rambank1[(rambank1_toggle * 0x100) + (addr & 0xFF)] = 0xFF; //Reading from the 256b write port @1800 riggers an unwanted write
} }
else if (addr < 0x2000) else if (addr < 0x2000)
{ {
addr -= 0x1A00; addr -= 0x1A00;
addr &= 0x5FF; addr &= 0x5FF;
return core.rom[14848 + addr]; //Fixed to last 1.5K int offset = core.rom.Length - 0x0600;
return core.rom[offset + addr]; //Fixed to last 1.5K
} }
else else
{ {
@ -85,14 +97,14 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
} }
else if (addr >= 0x1800 && addr < 0x2000) else if (addr >= 0x1800 && addr < 0x2000)
{ {
rambank0[(addr & 0xFF) + (rambank1_toggle * 0x100)] = value; rambank1[(addr & 0xFF) + (rambank1_toggle * 0x100)] = value;
} }
} }
public override void SyncState(Serializer ser) public override void SyncState(Serializer ser)
{ {
base.SyncState(ser); base.SyncState(ser);
ser.Sync("toggle", ref toggle); ser.Sync("toggle", ref rombank_1k);
ser.Sync("rambank0", ref rambank0); ser.Sync("rambank0", ref rambank0);
ser.Sync("rambank1", ref rambank1); ser.Sync("rambank1", ref rambank1);
ser.Sync("EnableRam0", ref EnableRam0); ser.Sync("EnableRam0", ref EnableRam0);
@ -104,25 +116,25 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
switch (addr) switch (addr)
{ {
case 0x1FE0: case 0x1FE0:
toggle = 0; rombank_1k = 0;
break; break;
case 0x1FE1: case 0x1FE1:
toggle = 1; rombank_1k = 1;
break; break;
case 0x1FE2: case 0x1FE2:
toggle = 2; rombank_1k = 2;
break; break;
case 0x1FE3: case 0x1FE3:
toggle = 3; rombank_1k = 3;
break; break;
case 0x1FE4: case 0x1FE4:
toggle = 4; rombank_1k = 4;
break; break;
case 0x1FE5: case 0x1FE5:
toggle = 5; rombank_1k = 5;
break; break;
case 0x1FE6: case 0x1FE6:
toggle = 6; rombank_1k = 6;
break; break;
case 0x1FE7: case 0x1FE7:
EnableRam0 = true; EnableRam0 = true;