diff --git a/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/ASIC.cs b/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/ASIC.cs
index b4b14421fa..5f9f3d14ec 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/ASIC.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/ASIC.cs
@@ -61,7 +61,7 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
public int LINE_HEIGHT => _regs[R_LCD_Y_SIZE];
private SuperVision _sv;
- private byte[] _regs = new byte[0x30];
+ private byte[] _regs = new byte[0x2000];
///
/// The inbuilt LCD screen
@@ -114,8 +114,8 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
_sv._cpu.RDY = true;
bool lineEnd = _byteCounter == CLOCK_WIDTH - 1;
- bool fieldEnd = _lineCounter == LINE_HEIGHT && lineEnd && _field == 0;
- bool frameEnd = _lineCounter == LINE_HEIGHT && lineEnd && _field == 1;
+ bool fieldEnd = _lineCounter == LINE_HEIGHT - 1 && lineEnd && _field == 0;
+ bool frameEnd = _lineCounter == LINE_HEIGHT - 1 && lineEnd && _field == 1;
// vram pointer
if (fieldEnd)
@@ -180,12 +180,13 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
break;
default:
+
+ _sv._cpu.RDY = !_dmaInProgress;
+
if (_dmaInProgress)
{
// perform DMA transfer
DoDMA();
-
- _sv._cpu.RDY = !_dmaInProgress;
}
break;
}
@@ -231,12 +232,16 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
// prescaler reset
_intTimer = 0;
+ }
+ if (_intTimerEnabled)
+ {
if (_regs[R_IRQ_TIMER] == 0)
{
if (_regs[R_SYSTEM_CONTROL].Bit(1))
{
- // instant IRQ
+ // raise IRQ
+ // this handles IRQ after timer countdown AND instant IRQ when timer is set to 0
_intFlag = true;
_intTimerEnabled = false;
@@ -244,35 +249,23 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
_regs[R_IRQ_STATUS] = (byte) (_regs[R_IRQ_STATUS] | 2);
}
}
- }
- else if (_regs[R_IRQ_TIMER] > 0)
- {
- // timer will be counting down clocked by the prescaler
- if (_intTimer++ == IntPrescaler)
+ else
{
- // prescaler clock
- _intTimer = 0;
+ // timer should be counting down clocked by the prescaler
+ if (_intTimer++ == IntPrescaler)
+ {
+ // prescaler clock
+ _intTimer = 0;
- // decrement timer
- _regs[R_IRQ_TIMER]--;
- }
- }
- else
- {
- // timer has expired
- if (_intTimerEnabled)
- {
- _intFlag = true;
- _intTimerEnabled = false;
-
- // set IRQ Timer expired bit
- _regs[R_IRQ_STATUS] = (byte) (_regs[R_IRQ_STATUS] | 2);
+ // decrement timer
+ _regs[R_IRQ_TIMER]--;
+ }
}
}
if (_intFlag && _regs[R_SYSTEM_CONTROL].Bit(1))
{
- // IRQ enabled
+ // fire IRQ
_sv._cpu.IRQ = true;
_intFlag = false;
}
@@ -399,12 +392,7 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
// 8bits
_regs[R_IRQ_TIMER] = value;
- _intTimerEnabled = true;
-
- // reset prescaler?
- //_regs[R_SYSTEM_CONTROL] = (byte)(_regs[R_SYSTEM_CONTROL] & ~(1 << 4)); // Reset bit 4
-
- _intTimer = value * IntPrescaler;
+ _intTimerChanged = true;
// Writing 00h to the IRQ Timer register results in an instant IRQ. It does not wrap to FFh and continue counting; it just stays at 00h and fires off an IRQ.
@@ -425,6 +413,7 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
Screen.DisplayEnable = value.Bit(3);
// banking
+ var bank = value >> 5;
_sv.BankSelect = (value >> 5);
// writing to this register resets the LCD rendering system and makes it start rendering from the upper left corner, regardless of the bit pattern.
@@ -446,6 +435,11 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
case 0x1E:
case 0x1F:
case 0x2B:
+ _regs[regIndex] = value;
+ break;
+
+ default:
+ _regs[regIndex] = value;
break;
}
}
@@ -548,6 +542,7 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
break;
default:
+ result = _regs[regIndex];
break;
}
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/LCD.cs b/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/LCD.cs
index 86d9655bbf..2aa69e12dd 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/LCD.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/LCD.cs
@@ -25,6 +25,14 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
Colors.ARGB(0x36, 0x4E, 0x54), // FULL DARK
];
+ public static readonly int[] Palette_AM =
+ [
+ Colors.ARGB(0xFC, 0xFE, 0x00), // OFF
+ Colors.ARGB(0xA8, 0x66, 0x00), // 1/3 DARKNESS
+ Colors.ARGB(0x54, 0x33, 0x00), // 2/3 DARKNESS
+ Colors.ARGB(0x00, 0x00, 0x00), // FULL DARK
+ ];
+
private readonly int[] _palette = new int[4];
public const int PEN_BUFFER_WIDTH = 160 * 2;
@@ -52,10 +60,13 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
case SuperVision.ScreenType.Green:
_palette = Palette_GR;
break;
- case SuperVision.ScreenType.Monochrome:
+ case SuperVision.ScreenType.BlackAndWhite:
default:
_palette = Palette_BW;
break;
+ case SuperVision.ScreenType.Amber:
+ _palette = Palette_AM;
+ break;
}
}
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/Memory.cs b/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/Memory.cs
index 1827582c4d..c2e6f7ab2a 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/Memory.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/Memory.cs
@@ -18,11 +18,13 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
///
public int BankSelect
{
- get { return _bankSelect % (_cartridge.CartROMSize / 0x4000); }
+ get { return _bankSelect; }
set { _bankSelect = value; }
}
private int _bankSelect;
+ private int _bankOffset => BankSelect << 14;
+
///
/// True when the CPU is accessing memory
@@ -70,7 +72,7 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
// 1: 2nd 16k
// 2: 3rd 16k
// etc..
- result = _cartridge.ReadByte((ushort) ((address % 0x4000) + (BankSelect * 0x4000)));
+ result = _cartridge.ReadByte((ushort) ((address % 0x4000) + (_bankOffset % _cartridge.CartROMSize)));
break;
// 0xC000 - 0xFFFF
@@ -131,7 +133,7 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
case 6:
case 7:
// fixed to the last 16K in the cart address space
- _cartridge.WriteByte((ushort) ((address % 0x4000) + (_cartridge.CartROMSize - 0x4000)), value);
+ _cartridge.WriteByte((ushort) ((address % 0x4000) + (_bankOffset % _cartridge.CartROMSize)), value);
break;
}
}
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/SuperVision.ISettable.cs b/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/SuperVision.ISettable.cs
index 29221fd02b..2005242623 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/SuperVision.ISettable.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Watara/SuperVision/SuperVision.ISettable.cs
@@ -26,9 +26,9 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
public enum ScreenType
{
- Monochrome,
- Green,
- TVLinkColor
+ BlackAndWhite,
+ Amber,
+ Green
}
[CoreSettings]
@@ -36,7 +36,7 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
{
[DisplayName("ScreenType")]
[Description("Color of LCD screen")]
- [DefaultValue(ScreenType.Green)]
+ [DefaultValue(ScreenType.BlackAndWhite)]
public ScreenType ScreenType { get; set; }
public SuperVisionSyncSettings Clone()