Add files via upload
This commit is contained in:
parent
a2ab02f9d9
commit
7ce43e1438
|
@ -24,6 +24,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
_lagcount++;
|
_lagcount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
maria.FrameAdvance();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Frame => _frame;
|
public int Frame => _frame;
|
||||||
|
@ -45,7 +47,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
{
|
{
|
||||||
maria = null;
|
maria = null;
|
||||||
tia = null;
|
tia = null;
|
||||||
|
m6532 = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,12 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
[ServiceNotApplicable(typeof(ISettable<,>), typeof(IDriveLight))]
|
[ServiceNotApplicable(typeof(ISettable<,>), typeof(IDriveLight))]
|
||||||
public partial class A7800Hawk : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable
|
public partial class A7800Hawk : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable
|
||||||
{
|
{
|
||||||
|
// this register selects between 2600 and 7800 mode in the A7800
|
||||||
|
// however, we already have a 2600 emulator so this core will only be loading A7800 games
|
||||||
|
// furthermore, the location of the register is in the same place as TIA registers (0x0-0x1F)
|
||||||
|
// any writes to this location before the register is 'locked' will go to the register and not the TIA
|
||||||
|
public byte A7800_control_register;
|
||||||
|
|
||||||
// memory domains
|
// memory domains
|
||||||
public byte[] TIA_regs = new byte[0x20];
|
public byte[] TIA_regs = new byte[0x20];
|
||||||
public byte[] Maria_regs = new byte[0x20];
|
public byte[] Maria_regs = new byte[0x20];
|
||||||
|
@ -114,9 +120,12 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
|
|
||||||
private void HardReset()
|
private void HardReset()
|
||||||
{
|
{
|
||||||
|
A7800_control_register = 0;
|
||||||
|
|
||||||
|
tia.Reset();
|
||||||
cpu.Reset();
|
cpu.Reset();
|
||||||
|
maria.Reset();
|
||||||
|
m6532 = new M6532();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -25,6 +25,9 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
public int VsyncNumerator => _frameHz;
|
public int VsyncNumerator => _frameHz;
|
||||||
public int VsyncDenominator => 1;
|
public int VsyncDenominator => 1;
|
||||||
|
|
||||||
|
//Maria related variables
|
||||||
|
public int cycle;
|
||||||
|
|
||||||
public void FrameAdvance()
|
public void FrameAdvance()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -32,7 +35,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
|
|
||||||
public void Reset()
|
public void Reset()
|
||||||
{
|
{
|
||||||
|
cycle = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,147 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
using BizHawk.Common.BufferExtensions;
|
||||||
|
using BizHawk.Emulation.Common;
|
||||||
|
using BizHawk.Emulation.Cores.Components.M6502;
|
||||||
|
|
||||||
|
namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
|
{
|
||||||
|
public partial class A7800Hawk
|
||||||
|
{
|
||||||
|
public byte ReadMemory(int addr)
|
||||||
|
{
|
||||||
|
addr &= 0xFFFF;
|
||||||
|
|
||||||
|
if (addr < 0x0400) {
|
||||||
|
if ((addr & 0xFF) < 0x20)
|
||||||
|
{
|
||||||
|
// return TIA registers or control register if it is still unlocked
|
||||||
|
if ((A7800_control_register & 0x1) == 0 && (addr < 0x20))
|
||||||
|
{
|
||||||
|
return 0xFF; // TODO: what to return here?
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return TIA_regs[addr]; // TODO: what to return here?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((addr & 0xFF) < 0x40)
|
||||||
|
{
|
||||||
|
return Maria_regs[(addr & 0x3F) - 0x20];
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
return regs_6532[addr - 0x240];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0xFF; // what is mapped here?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (addr < 0x480)
|
||||||
|
{
|
||||||
|
return 0xFF; // cartridge space available
|
||||||
|
}
|
||||||
|
else if (addr < 0x500)
|
||||||
|
{
|
||||||
|
// this is where RAM for the 6532 resides for use in 2600 mode
|
||||||
|
return 0xFF;
|
||||||
|
}
|
||||||
|
else if (addr < 0x1800)
|
||||||
|
{
|
||||||
|
return 0xFF; // cartridge space available
|
||||||
|
}
|
||||||
|
else if (addr < 0x2800)
|
||||||
|
{
|
||||||
|
return RAM[addr - 0x1800];
|
||||||
|
}
|
||||||
|
else if (addr < 0x4000)
|
||||||
|
{
|
||||||
|
return RAM[addr - 0x2800 + 0x800];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0xFF; // cartridge and other OPSYS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteMemory(int addr, byte value)
|
||||||
|
{
|
||||||
|
addr &= 0xFFFF;
|
||||||
|
|
||||||
|
if (addr < 0x0400)
|
||||||
|
{
|
||||||
|
if ((addr & 0xFF) < 0x20)
|
||||||
|
{
|
||||||
|
// return TIA registers or control register if it is still unlocked
|
||||||
|
if ((A7800_control_register & 0x1) == 0 && (addr < 0x20))
|
||||||
|
{
|
||||||
|
A7800_control_register = value; // TODO: what to return here?
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TIA_regs[addr] = value; // TODO: what to return here?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((addr & 0xFF) < 0x40)
|
||||||
|
{
|
||||||
|
Maria_regs[(addr & 0x3F) - 0x20] = value;
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
regs_6532[addr - 0x240] = value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// what is mapped here?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (addr < 0x480)
|
||||||
|
{
|
||||||
|
// cartridge space available
|
||||||
|
}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
else if (addr < 0x2800)
|
||||||
|
{
|
||||||
|
RAM[addr - 0x1800] = value;
|
||||||
|
}
|
||||||
|
else if (addr < 0x4000)
|
||||||
|
{
|
||||||
|
RAM[addr - 0x2800 + 0x800] = value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// cartridge and other OPSYS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue