diff options
| author | Melodi <62381002+Melodi17@users.noreply.github.com> | 2025-08-06 22:36:34 +1000 |
|---|---|---|
| committer | Melodi <62381002+Melodi17@users.noreply.github.com> | 2025-08-06 22:36:34 +1000 |
| commit | 7a8d2bcd75d88a5429937bf551878c55e1dcf0fd (patch) | |
| tree | 81bc1f259fb8678513aa8b214df4ef72720bb585 /Emulator/Chip/DisplayDevice.cs | |
| parent | 16f3cb74564cf7c19da6e13666c98aca36094716 (diff) | |
moved everything to seperate projects, and started compiler work + push and pop instructions added
Diffstat (limited to 'Emulator/Chip/DisplayDevice.cs')
| -rw-r--r-- | Emulator/Chip/DisplayDevice.cs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/Emulator/Chip/DisplayDevice.cs b/Emulator/Chip/DisplayDevice.cs new file mode 100644 index 0000000..a18dbd4 --- /dev/null +++ b/Emulator/Chip/DisplayDevice.cs @@ -0,0 +1,76 @@ +namespace Q1.Emulator.Chip; + +using System; +using Microsoft.Xna.Framework; +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 DisplayDevice(u16 paletteSize, u16 displayWidth, u16 displayHeight, u16 addressableStart) + : base(addressableStart, DisplayDevice.DetermineSize(paletteSize, displayWidth, displayHeight)) + { + this._paletteSize = paletteSize; + this._displayWidth = displayWidth; + this._displayHeight = displayHeight; + this.textureData = new Color[this._displayWidth * this._displayHeight]; + } + + private 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}"); + for (u16 i = 0; i < this.textureData.Length; i++) + { + u8 pixelValue = pixelData[i]; + this.textureData[i] = palette[pixelValue % this._paletteSize]; + } + + if (this.OutputTexture != null) + this.OutputTexture.SetData(this.textureData); + } + + private Color[] ReadPalette() + { + ref8 paletteData = this.Memory.AsSpan(0, (u16) (this._paletteSize * 3)); + Color[] colors = new Color[this._paletteSize + 1]; + colors[0] = Color.Transparent; + + for (u16 i = 0; i < this._paletteSize; i++) + { + u16 offset = (u16) (i * 3); + byte r = paletteData[offset]; + byte g = paletteData[offset + 1]; + byte b = paletteData[offset + 2]; + colors[(u16) (i + 1)] = new Color(r, g, b); + } + + return colors; + } + + public void SetPalette(Color[] palette) + { + if (palette.Length != this._paletteSize) + throw new ArgumentException($"Palette must have {this._paletteSize} colors."); + + ref8 paletteData = this.Memory.AsSpan(0, (u16) (this._paletteSize * 3)); + for (u16 i = 0; i < this._paletteSize; i++) + { + u16 offset = (u16) (i * 3); + paletteData[offset] = palette[i].R; + paletteData[offset + 1] = palette[i].G; + paletteData[offset + 2] = palette[i].B; + } + } +}
\ No newline at end of file |
