summaryrefslogtreecommitdiff
path: root/Emulator/Chip/DisplayDevice.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emulator/Chip/DisplayDevice.cs')
-rw-r--r--Emulator/Chip/DisplayDevice.cs50
1 files changed, 34 insertions, 16 deletions
diff --git a/Emulator/Chip/DisplayDevice.cs b/Emulator/Chip/DisplayDevice.cs
index a18dbd4..c8889ba 100644
--- a/Emulator/Chip/DisplayDevice.cs
+++ b/Emulator/Chip/DisplayDevice.cs
@@ -6,31 +6,39 @@ using Microsoft.Xna.Framework.Graphics;
public class DisplayDevice : RamDevice
{
- public Texture2D? OutputTexture;
- private readonly u16 _paletteSize;
- private readonly u16 _displayWidth;
- private readonly u16 _displayHeight;
- private Color[] textureData;
+ public Texture2D? OutputTexture;
+
+ private readonly u16 _paletteSize;
+ private readonly u16 _displayWidth;
+ private readonly u16 _displayHeight;
+
+ private Color[] textureData;
+ private Color[] palette;
+ private bool _paletteDirty;
public DisplayDevice(u16 paletteSize, u16 displayWidth, u16 displayHeight, u16 addressableStart)
- : base(addressableStart, DisplayDevice.DetermineSize(paletteSize, displayWidth, displayHeight))
+ : base(
+ addressableStart, DisplayDevice.DetermineSize(paletteSize, displayWidth, displayHeight))
{
- this._paletteSize = paletteSize;
- this._displayWidth = displayWidth;
+ this._paletteSize = paletteSize;
+ this._displayWidth = displayWidth;
this._displayHeight = displayHeight;
- this.textureData = new Color[this._displayWidth * this._displayHeight];
+ this.textureData = new Color[this._displayWidth * this._displayHeight];
}
- private static u16 DetermineSize(u16 paletteSize, u16 displayWidth, u16 displayHeight)
+ public static u16 DetermineSize(u16 paletteSize, u16 displayWidth, u16 displayHeight)
{
return (u16) ((paletteSize * 3) + (displayWidth * displayHeight));
}
public override void Clock()
{
- Color[] palette = this.ReadPalette();
- ref8 pixelData = this.Memory.AsSpan((u16) (this._paletteSize * 3), (u16) (this._displayWidth * this._displayHeight));
- // Console.WriteLine($"DisplayDevice.Clock: @{(this.AddressableStart + this._paletteSize * 3):X4} palette size={this._paletteSize} display size={this._displayWidth}x{this._displayHeight}");
+ if (this._paletteDirty)
+ this.ReadPalette();
+
+ ref8 pixelData = this.Memory.AsSpan(
+ (u16) (this._paletteSize * 3), (u16) (this._displayWidth * this._displayHeight));
+
for (u16 i = 0; i < this.textureData.Length; i++)
{
u8 pixelValue = pixelData[i];
@@ -41,7 +49,7 @@ public class DisplayDevice : RamDevice
this.OutputTexture.SetData(this.textureData);
}
- private Color[] ReadPalette()
+ private void ReadPalette()
{
ref8 paletteData = this.Memory.AsSpan(0, (u16) (this._paletteSize * 3));
Color[] colors = new Color[this._paletteSize + 1];
@@ -56,7 +64,8 @@ public class DisplayDevice : RamDevice
colors[(u16) (i + 1)] = new Color(r, g, b);
}
- return colors;
+ this._paletteDirty = false;
+ this.palette = colors;
}
public void SetPalette(Color[] palette)
@@ -68,9 +77,18 @@ public class DisplayDevice : RamDevice
for (u16 i = 0; i < this._paletteSize; i++)
{
u16 offset = (u16) (i * 3);
- paletteData[offset] = palette[i].R;
+ paletteData[offset] = palette[i].R;
paletteData[offset + 1] = palette[i].G;
paletteData[offset + 2] = palette[i].B;
}
+
+ this._paletteDirty = true;
+ }
+
+ public override u8 Read(u16 address) => base.Read(address);
+ public override void Write(u16 address, u8 value)
+ {
+ this._paletteDirty = true;
+ base.Write(address, value);
}
} \ No newline at end of file