BizHawk/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs

182 lines
4.1 KiB
C#
Raw Normal View History

2017-05-25 00:40:02 +00:00
using System;
using BizHawk.Common.BufferExtensions;
using BizHawk.Emulation.Common;
// X = don't care
/*
1. TIA 0000 00XX 0000 0000 - 0000 00XX 0001 1111
2. MARIA 0000 00XX 0010 0000 - 0000 00XX 0011 1111
3. 6532 0000 0010 1000 0000 - 0000 0010 1111 1111
PORTS
4. 6532 0000 010X 1000 0000 - 0000 010X 1111 1111
RAM(DON'T USE)
5. RAM 0001 1000 0000 0000 - 0010 0111 1111 1111
6. RAM 00X0 000A 0100 0000 - 00X0 000A 1111 1111
SHADOW
7. RAM 001X X000 0000 0000 - 001X X111 1111 1111
*/
2017-05-25 00:40:02 +00:00
namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
{
public partial class A7800Hawk
{
2017-05-28 00:40:13 +00:00
public byte ReadMemory(ushort addr)
2017-05-25 00:40:02 +00:00
{
MemoryCallbacks.CallReads(addr);
if ((addr & 0xFCE0) == 0)
{
// return TIA registers or control register if it is still unlocked
if ((A7800_control_register & 0x1) == 0)
2017-05-25 00:40:02 +00:00
{
return 0xFF; // TODO: what to return here?
2017-05-25 00:40:02 +00:00
}
else
2017-05-25 00:40:02 +00:00
{
return tia.ReadMemory((ushort)(addr & 0x1F), false);
2017-05-25 00:40:02 +00:00
}
}
else if ((addr & 0xFCE0) == 0x20)
{
if ((A7800_control_register & 0x2) > 0)
2017-05-25 00:40:02 +00:00
{
return Maria_regs[addr & 0x1F];
2017-05-25 00:40:02 +00:00
}
else
{
return 0xFF; // TODO: What if Maria is off?
2017-05-25 00:40:02 +00:00
}
}
else if ((addr & 0xFF80) == 0x280)
2017-05-25 00:40:02 +00:00
{
//return regs_6532[addr & 0x1F];
return m6532.ReadMemory(addr, false);
2017-05-25 00:40:02 +00:00
}
else if ((addr & 0xFE80) == 0x480)
2017-05-25 00:40:02 +00:00
{
return RAM_6532[addr & 0x7F];
2017-05-25 00:40:02 +00:00
}
else if ((addr >= 0x1800) && (addr < 0x2800))
2017-05-25 00:40:02 +00:00
{
return RAM[addr -0x1800];
}
else if ((addr >= 0x40) && (addr < 0x100))
{
// RAM block 0
return RAM[addr - 0x40 + 0x840];
2017-05-25 00:40:02 +00:00
}
else if ((addr >= 0x140) && (addr < 0x200))
2017-05-25 00:40:02 +00:00
{
// RAM block 1
return RAM[addr - 0x140 + 0x940];
2017-05-25 00:40:02 +00:00
}
else if ((addr >= 0x2800) && (addr < 0x3000))
{
return RAM[(addr & 0x7FF) + 0x800];
}
else if ((addr >= 0x3000) && (addr < 0x4000))
2017-05-25 00:40:02 +00:00
{
2017-06-11 22:06:50 +00:00
// could be either RAM mirror or ROM
return mapper.ReadMemory(addr);
2017-05-25 00:40:02 +00:00
}
else if ((addr >= 0x400) && (addr < 0x480))
{
// cartridge space available
return mapper.ReadMemory(addr);
}
else if ((addr >= 0x500) && (addr < 0x1800))
{
// cartridge space available
return mapper.ReadMemory(addr);
}
2017-05-25 00:40:02 +00:00
else
{
2017-06-11 22:06:50 +00:00
return mapper.ReadMemory(addr);
2017-05-25 00:40:02 +00:00
}
}
2017-05-28 00:40:13 +00:00
public void WriteMemory(ushort addr, byte value)
2017-05-25 00:40:02 +00:00
{
MemoryCallbacks.CallWrites(addr);
if ((addr & 0xFCE0) == 0)
2017-05-25 00:40:02 +00:00
{
// return TIA registers or control register if it is still unlocked
if ((A7800_control_register & 0x1) == 0)
2017-05-25 00:40:02 +00:00
{
A7800_control_register = value;
2017-05-25 00:40:02 +00:00
}
else
2017-05-25 00:40:02 +00:00
{
tia.WriteMemory((ushort)(addr & 0x1F), value, false);
2017-05-25 00:40:02 +00:00
}
}
else if ((addr & 0xFCE0) == 0x20)
{
if ((A7800_control_register & 0x2) > 0)
2017-05-25 00:40:02 +00:00
{
// register 8 is read only and controlled by Maria
var temp = addr & 0x1F;
2017-07-19 18:55:50 +00:00
if (temp != 8)
Maria_regs[temp] = value;
if (temp == 4) // WSYNC
cpu.RDY = false;
2017-05-25 00:40:02 +00:00
}
else
{
// TODO: What if Maria is off?
2017-05-25 00:40:02 +00:00
}
}
else if ((addr & 0xFF80) == 0x280)
2017-05-25 00:40:02 +00:00
{
m6532.WriteMemory(addr, value);
2017-05-25 00:40:02 +00:00
}
else if ((addr & 0xFE80) == 0x480)
2017-05-25 00:40:02 +00:00
{
RAM_6532[addr & 0x7F] = value;
2017-05-25 00:40:02 +00:00
}
else if ((addr >= 0x1800) && (addr < 0x2800))
2017-05-25 00:40:02 +00:00
{
RAM[addr - 0x1800] = value;
2017-05-25 00:40:02 +00:00
}
else if ((addr >= 0x40) && (addr < 0x100))
2017-05-25 00:40:02 +00:00
{
// RAM block 0
RAM[addr - 0x40 + 0x840] = value;
2017-05-25 00:40:02 +00:00
}
else if ((addr >= 0x140) && (addr < 0x200))
{
// RAM block 1
RAM[addr - 0x140 + 0x940] = value;
}
else if ((addr >= 0x2800) && (addr < 0x3000))
{
RAM[(addr & 0x7FF) + 0x800] = value;
}
else if ((addr >= 0x3000) && (addr < 0x4000))
2017-05-25 00:40:02 +00:00
{
2017-06-11 22:06:50 +00:00
// could be either RAM mirror or ROM
mapper.WriteMemory(addr, value);
2017-05-25 00:40:02 +00:00
}
else if ((addr >= 0x400) && (addr < 0x480))
{
// cartridge space available
mapper.WriteMemory(addr, value);
}
else if ((addr >= 0x500) && (addr < 0x1800))
{
// cartridge space available
mapper.WriteMemory(addr, value);
}
2017-05-25 00:40:02 +00:00
else
{
2017-06-11 22:06:50 +00:00
mapper.WriteMemory(addr, value);
2017-05-25 00:40:02 +00:00
}
}
}
}