BizHawk/BizHawk.Emulation/Consoles/Intellivision/STIC.cs

109 lines
2.3 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Consoles.Intellivision
{
public sealed class STIC
{
private bool Sr1, Sr2, Fgbg = false;
private ushort[] Register = new ushort[64];
public ushort? ReadSTIC(ushort addr)
{
switch (addr & 0xF000)
{
case 0x0000:
if (addr <= 0x003F)
{
// TODO: OK only during VBlank Period 1.
if (addr == 0x0021)
Fgbg = false;
return Register[addr];
}
else if (addr <= 0x007F)
// TODO: OK only during VBlank Period 2.
return Register[addr - 0x0040];
break;
case 0x4000:
if (addr <= 0x403F)
{
// TODO: OK only during VBlank Period 1.
if (addr == 0x4021)
Fgbg = false;
}
break;
case 0x8000:
if (addr <= 0x803F)
{
// TODO: OK only during VBlank Period 1.
if (addr == 0x8021)
Fgbg = false;
}
break;
case 0xC000:
if (addr <= 0xC03F)
{
// TODO: OK only during VBlank Period 1.
if (addr == 0xC021)
Fgbg = false;
}
break;
}
return null;
}
public bool WriteSTIC(ushort addr, ushort value)
{
switch (addr & 0xF000)
{
case 0x0000:
if (addr <= 0x003F)
{
// TODO: OK only during VBlank Period 1.
if (addr == 0x0021)
Fgbg = true;
Register[addr] = value;
return true;
}
else if (addr <= 0x007F)
// Read-only STIC.
break;
break;
case 0x4000:
if (addr <= 0x403F)
{
// TODO: OK only during VBlank Period 1.
if (addr == 0x4021)
Fgbg = true;
Register[addr - 0x4000] = value;
return true;
}
break;
case 0x8000:
if (addr <= 0x803F)
{
// TODO: OK only during VBlank Period 1.
if (addr == 0x8021)
Fgbg = true;
Register[addr & 0x003F] = value;
return true;
}
break;
case 0xC000:
if (addr <= 0xC03F)
{
// TODO: OK only during VBlank Period 1.
if (addr == 0xC021)
Fgbg = true;
Register[addr - 0xC000] = value;
return true;
}
break;
}
return false;
}
}
}