2017-05-25 00:40:02 +00:00
|
|
|
|
using System;
|
|
|
|
|
|
|
|
|
|
using BizHawk.Common.BufferExtensions;
|
|
|
|
|
using BizHawk.Emulation.Common;
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
{
|
2017-06-16 20:44:57 +00:00
|
|
|
|
MemoryCallbacks.CallReads(addr);
|
|
|
|
|
|
2017-05-25 00:40:02 +00:00
|
|
|
|
if (addr < 0x0400) {
|
|
|
|
|
if ((addr & 0xFF) < 0x20)
|
|
|
|
|
{
|
|
|
|
|
// return TIA registers or control register if it is still unlocked
|
2017-07-02 22:01:36 +00:00
|
|
|
|
if ((A7800_control_register & 0x1) == 0 && (addr < 0x20))
|
2017-05-25 00:40:02 +00:00
|
|
|
|
{
|
|
|
|
|
return 0xFF; // TODO: what to return here?
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-07-01 01:21:09 +00:00
|
|
|
|
return TIA_regs[addr & 0x1F]; // TODO: what to return here?
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if ((addr & 0xFF) < 0x40)
|
|
|
|
|
{
|
2017-05-28 00:40:13 +00:00
|
|
|
|
if ((A7800_control_register & 0x2) > 0)
|
|
|
|
|
{
|
|
|
|
|
return Maria_regs[(addr & 0x3F) - 0x20];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return 0xFF;
|
|
|
|
|
}
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x100)
|
|
|
|
|
{
|
|
|
|
|
// RAM block 0
|
|
|
|
|
return RAM[addr - 0x40 + 0x840];
|
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x200)
|
|
|
|
|
{
|
|
|
|
|
// RAM block 1
|
|
|
|
|
return RAM[addr - 0x140 + 0x940];
|
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x300)
|
|
|
|
|
{
|
2017-07-01 01:21:09 +00:00
|
|
|
|
if (addr > 0x280)
|
|
|
|
|
return regs_6532[addr - 0x280];
|
|
|
|
|
else
|
|
|
|
|
return 0xFF; // unclear what is mapped from 0x240 - 0x280
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return 0xFF; // what is mapped here?
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x480)
|
|
|
|
|
{
|
2017-06-11 22:06:50 +00:00
|
|
|
|
// cartridge space available
|
|
|
|
|
return mapper.ReadMemory(addr);
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x500)
|
|
|
|
|
{
|
|
|
|
|
// this is where RAM for the 6532 resides for use in 2600 mode
|
|
|
|
|
return 0xFF;
|
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x1800)
|
|
|
|
|
{
|
2017-06-11 22:06:50 +00:00
|
|
|
|
// cartridge space available
|
|
|
|
|
return mapper.ReadMemory(addr);
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x2800)
|
|
|
|
|
{
|
|
|
|
|
return RAM[addr - 0x1800];
|
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x4000)
|
|
|
|
|
{
|
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
|
|
|
|
|
{
|
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
|
|
|
|
{
|
2017-06-16 20:44:57 +00:00
|
|
|
|
MemoryCallbacks.CallWrites(addr);
|
|
|
|
|
|
2017-05-25 00:40:02 +00:00
|
|
|
|
if (addr < 0x0400)
|
|
|
|
|
{
|
|
|
|
|
if ((addr & 0xFF) < 0x20)
|
|
|
|
|
{
|
|
|
|
|
// return TIA registers or control register if it is still unlocked
|
2017-07-02 22:01:36 +00:00
|
|
|
|
if ((A7800_control_register & 0x1) == 0 && (addr < 0x20))
|
2017-05-25 00:40:02 +00:00
|
|
|
|
{
|
2017-06-16 20:44:57 +00:00
|
|
|
|
A7800_control_register = value;
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-07-02 22:01:36 +00:00
|
|
|
|
TIA_regs[addr & 0x1F] = value;
|
|
|
|
|
tia.WriteMemory((ushort)(addr & 0x1F), value, false);
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if ((addr & 0xFF) < 0x40)
|
|
|
|
|
{
|
2017-05-28 00:40:13 +00:00
|
|
|
|
if ((A7800_control_register & 0x2) > 0)
|
|
|
|
|
{
|
2017-06-16 20:44:57 +00:00
|
|
|
|
var temp = (addr & 0x3F) - 0x20;
|
|
|
|
|
|
|
|
|
|
// register 8 is read only and controlled by Maria
|
|
|
|
|
if (temp != 8)
|
|
|
|
|
Maria_regs[temp] = value;
|
|
|
|
|
|
|
|
|
|
if (temp==4) // WSYNC
|
|
|
|
|
cpu.RDY = false;
|
2017-07-01 01:21:09 +00:00
|
|
|
|
/*
|
|
|
|
|
Console.WriteLine("Maria Regs: ");
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < 0x20; i++)
|
|
|
|
|
{
|
|
|
|
|
Console.Write(Maria_regs[i]);
|
|
|
|
|
Console.Write(" ");
|
|
|
|
|
}
|
|
|
|
|
Console.WriteLine(" ");
|
|
|
|
|
*/
|
2017-05-28 00:40:13 +00:00
|
|
|
|
}
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x100)
|
|
|
|
|
{
|
|
|
|
|
// RAM block 0
|
|
|
|
|
RAM[addr - 0x40 + 0x840] = value;
|
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x200)
|
|
|
|
|
{
|
|
|
|
|
// RAM block 1
|
|
|
|
|
RAM[addr - 0x140 + 0x940] = value;
|
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x300)
|
|
|
|
|
{
|
2017-07-01 01:21:09 +00:00
|
|
|
|
if (addr > 0x280)
|
|
|
|
|
regs_6532[addr - 0x280] = value;
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// what is mapped here?
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x480)
|
|
|
|
|
{
|
|
|
|
|
// cartridge space available
|
2017-06-11 22:06:50 +00:00
|
|
|
|
mapper.WriteMemory(addr, value);
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x500)
|
|
|
|
|
{
|
|
|
|
|
// this is where RAM for the 6532 resides for use in 2600 mode
|
|
|
|
|
// is it accessible in 7800 mode?
|
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x1800)
|
|
|
|
|
{
|
|
|
|
|
// cartridge space available
|
2017-06-11 22:06:50 +00:00
|
|
|
|
mapper.WriteMemory(addr, value);
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x2800)
|
|
|
|
|
{
|
|
|
|
|
RAM[addr - 0x1800] = value;
|
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x4000)
|
|
|
|
|
{
|
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
|
|
|
|
|
{
|
|
|
|
|
// cartridge and other OPSYS
|
2017-06-11 22:06:50 +00:00
|
|
|
|
mapper.WriteMemory(addr, value);
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-11 22:06:50 +00:00
|
|
|
|
|
2017-05-25 00:40:02 +00:00
|
|
|
|
}
|
|
|
|
|
}
|