2012-08-08 23:05:55 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace BizHawk.Emulation.Consoles.Intellivision
|
|
|
|
|
{
|
|
|
|
|
public sealed class STIC
|
|
|
|
|
{
|
2012-08-10 20:40:34 +00:00
|
|
|
|
private bool Sr1, Sr2, Fgbg = false;
|
|
|
|
|
private ushort[] Register = new ushort[64];
|
2012-08-08 23:05:55 +00:00
|
|
|
|
|
|
|
|
|
public ushort? ReadSTIC(ushort addr)
|
|
|
|
|
{
|
|
|
|
|
switch (addr & 0xF000)
|
|
|
|
|
{
|
|
|
|
|
case 0x0000:
|
|
|
|
|
if (addr <= 0x003F)
|
|
|
|
|
{
|
|
|
|
|
// TODO: OK only during VBlank Period 1.
|
|
|
|
|
if (addr == 0x0021)
|
2012-08-10 20:40:34 +00:00
|
|
|
|
Fgbg = false;
|
|
|
|
|
return Register[addr];
|
2012-08-08 23:05:55 +00:00
|
|
|
|
}
|
|
|
|
|
else if (addr <= 0x007F)
|
|
|
|
|
// TODO: OK only during VBlank Period 2.
|
2012-08-10 20:40:34 +00:00
|
|
|
|
return Register[addr - 0x0040];
|
2012-08-08 23:05:55 +00:00
|
|
|
|
break;
|
|
|
|
|
case 0x4000:
|
|
|
|
|
if (addr <= 0x403F)
|
|
|
|
|
{
|
|
|
|
|
// TODO: OK only during VBlank Period 1.
|
|
|
|
|
if (addr == 0x4021)
|
2012-08-10 20:40:34 +00:00
|
|
|
|
Fgbg = false;
|
2012-08-08 23:05:55 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 0x8000:
|
|
|
|
|
if (addr <= 0x803F)
|
|
|
|
|
{
|
|
|
|
|
// TODO: OK only during VBlank Period 1.
|
|
|
|
|
if (addr == 0x8021)
|
2012-08-10 20:40:34 +00:00
|
|
|
|
Fgbg = false;
|
2012-08-08 23:05:55 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 0xC000:
|
|
|
|
|
if (addr <= 0xC03F)
|
|
|
|
|
{
|
|
|
|
|
// TODO: OK only during VBlank Period 1.
|
|
|
|
|
if (addr == 0xC021)
|
2012-08-10 20:40:34 +00:00
|
|
|
|
Fgbg = false;
|
2012-08-08 23:05:55 +00:00
|
|
|
|
}
|
|
|
|
|
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)
|
2012-08-10 20:40:34 +00:00
|
|
|
|
Fgbg = true;
|
|
|
|
|
Register[addr] = value;
|
2012-08-08 23:05:55 +00:00
|
|
|
|
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)
|
2012-08-10 20:40:34 +00:00
|
|
|
|
Fgbg = true;
|
|
|
|
|
Register[addr - 0x4000] = value;
|
2012-08-08 23:05:55 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 0x8000:
|
|
|
|
|
if (addr <= 0x803F)
|
|
|
|
|
{
|
|
|
|
|
// TODO: OK only during VBlank Period 1.
|
|
|
|
|
if (addr == 0x8021)
|
2012-08-10 20:40:34 +00:00
|
|
|
|
Fgbg = true;
|
|
|
|
|
Register[addr & 0x003F] = value;
|
2012-08-08 23:05:55 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 0xC000:
|
|
|
|
|
if (addr <= 0xC03F)
|
|
|
|
|
{
|
|
|
|
|
// TODO: OK only during VBlank Period 1.
|
|
|
|
|
if (addr == 0xC021)
|
2012-08-10 20:40:34 +00:00
|
|
|
|
Fgbg = true;
|
|
|
|
|
Register[addr - 0xC000] = value;
|
2012-08-08 23:05:55 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|