diff options
| author | Melodi <62381002+Melodi17@users.noreply.github.com> | 2025-08-27 21:22:55 +1000 |
|---|---|---|
| committer | Melodi <62381002+Melodi17@users.noreply.github.com> | 2025-08-27 21:22:55 +1000 |
| commit | 634681ce2bb36cd686943102a0f071cd6a09049f (patch) | |
| tree | 6710047aa231d50f57114bdd54a27c559fb20a73 /Emulator/Chip/DisplayDevice.cs | |
| parent | 94ddc02e03ab942d0c881e29053e8df3d2940c30 (diff) | |
fixed bugs and revolutionized the universe
Diffstat (limited to 'Emulator/Chip/DisplayDevice.cs')
| -rw-r--r-- | Emulator/Chip/DisplayDevice.cs | 50 |
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 |
