From a947d6e8fe45dac73f27439bc43c6b9a78514ec1 Mon Sep 17 00:00:00 2001 From: Chris Anders Date: Tue, 22 Oct 2024 18:33:46 +0200 Subject: [PATCH] feat: Add Simple Font Rendering --- .../MimaSim/MIMA/Components/Display.cs | 11 + src/MimaSim/MimaSim/MIMA/Font.cs | 246 ++++++++++++++++++ .../MimaSim/ViewModels/MainViewModel.cs | 8 + 3 files changed, 265 insertions(+) create mode 100644 src/MimaSim/MimaSim/MIMA/Font.cs diff --git a/src/MimaSim/MimaSim/MIMA/Components/Display.cs b/src/MimaSim/MimaSim/MIMA/Components/Display.cs index 0cfccb3..2fe3401 100644 --- a/src/MimaSim/MimaSim/MIMA/Components/Display.cs +++ b/src/MimaSim/MimaSim/MIMA/Components/Display.cs @@ -13,6 +13,8 @@ public class Display private DisplayControl _displayControl; + public Font Font = new(); + public void SetDisplay(DisplayControl displayControl) { _displayControl = displayControl; @@ -29,6 +31,15 @@ public void SetPixel() Dispatcher.UIThread.InvokeAsync(() => _displayControl.Pixels[(x, y)].Background = GetBrush(color)); } + public void SetPixel(short x, short y) + { + var colorIndex = DC.GetValueWithoutNotification(); + + var color = (DisplayColor)colorIndex; + + Dispatcher.UIThread.InvokeAsync(() => _displayControl.Pixels[(x, y)].Background = GetBrush(color)); + } + private IBrush GetBrush(DisplayColor color) { return color switch diff --git a/src/MimaSim/MimaSim/MIMA/Font.cs b/src/MimaSim/MimaSim/MIMA/Font.cs new file mode 100644 index 0000000..bd8e24c --- /dev/null +++ b/src/MimaSim/MimaSim/MIMA/Font.cs @@ -0,0 +1,246 @@ +using System; +using System.Collections.Generic; +using MimaSim.MIMA.Components; + +namespace MimaSim.MIMA; + +public class Font +{ + Dictionary _characters = new(); + + public bool[] this[char key] => _characters[key]; + + public Font() + { + _characters.Add('a', [ + false, true, true, true, false, // Zeile 1: .###. + false, false, false, false, true, // Zeile 2: ....# + false, true, true, true, true, // Zeile 3: .#### + true, false, false, false, true, // Zeile 4: #...# + false, true, false, false, true // Zeile 5: .#..# + ]); + + _characters.Add('b', [ + true, true, true, false, false, // Zeile 1: ###.. + true, false, false, true, false, // Zeile 2: #..#. + true, true, true, true, false, // Zeile 3: ####. + true, false, false, false, true, // Zeile 4: #...# + true, true, true, true, false // Zeile 5: ####. + ]); + + _characters.Add('c', [ + false, true, true, true, false, // Zeile 1: .###. + true, false, false, false, true, // Zeile 2: #...# + true, false, false, false, false, // Zeile 3: #.... + true, false, false, false, true, // Zeile 4: #...# + false, true, true, true, false // Zeile 5: .###. + ]); + + _characters.Add('d', [ + false, false, true, true, false, // Zeile 1: ..##. + false, true, false, false, true, // Zeile 2: .#..# + false, true, false, false, true, // Zeile 3: .#..# + false, true, false, false, true, // Zeile 4: .#..# + false, false, true, true, false // Zeile 5: ..##. + ]); + + _characters.Add('e', [ + false, true, true, true, false, // Zeile 1: .###. + true, false, false, false, true, // Zeile 2: #...# + true, true, true, true, false, // Zeile 3: ####. + true, false, false, false, false, // Zeile 4: #.... + false, true, true, true, false // Zeile 5: .###. + ]); + + _characters.Add('f', [ + false, true, true, true, true, // Zeile 1: .#### + true, false, false, false, false, // Zeile 2: #.... + true, true, true, false, false, // Zeile 3: ###.. + true, false, false, false, false, // Zeile 4: #.... + true, false, false, false, false // Zeile 5: #.... + ]); + + _characters.Add('g', [ + false, true, true, true, false, // Zeile 1: .###. + true, false, false, false, true, // Zeile 2: #...# + true, false, false, false, true, // Zeile 3: #...# + false, true, true, true, true, // Zeile 4: .#### + false, false, false, false, true // Zeile 5: ....# + ]); + + _characters.Add('h', [ + true, false, false, false, true, // Zeile 1: #...# + true, false, false, false, true, // Zeile 2: #...# + true, true, true, true, true, // Zeile 3: ##### + true, false, false, false, true, // Zeile 4: #...# + true, false, false, false, true // Zeile 5: #...# + ]); + + _characters.Add('i', [ + false, false, true, false, false, // Zeile 1: ..#.. + false, false, true, false, false, // Zeile 2: ..#.. + false, false, true, false, false, // Zeile 3: ..#.. + false, false, true, false, false, // Zeile 4: ..#.. + false, false, true, false, false // Zeile 5: ..#.. + ]); + + _characters.Add('j', [ + false, false, false, true, false, // Zeile 1: ...#. + false, false, false, true, false, // Zeile 2: ...#. + false, false, false, true, false, // Zeile 3: ...#. + true, false, false, true, false, // Zeile 4: #..#. + false, true, true, false, false // Zeile 5: .##.. + ]); + + _characters.Add('k', [ + true, false, false, false, true, // Zeile 1: #...# + true, false, false, true, false, // Zeile 2: #..#. + true, true, true, false, false, // Zeile 3: ###.. + true, false, false, true, false, // Zeile 4: #..#. + true, false, false, false, true // Zeile 5: #...# + ]); + + _characters.Add('l', [ + true, false, false, false, false, // Zeile 1: #.... + true, false, false, false, false, // Zeile 2: #.... + true, false, false, false, false, // Zeile 3: #.... + true, false, false, false, false, // Zeile 4: #.... + true, true, true, true, false // Zeile 5: ####. + ]); + + _characters.Add('m', [ + true, true, false, true, true, // Zeile 1: ##.## + true, false, true, false, true, // Zeile 2: #.#.# + true, false, false, false, true, // Zeile 3: #...# + true, false, false, false, true, // Zeile 4: #...# + true, false, false, false, true // Zeile 5: #...# + ]); + + _characters.Add('n', [ + true, true, true, false, false, // Zeile 1: ###.. + true, false, false, true, false, // Zeile 2: #..#. + true, false, false, false, true, // Zeile 3: #...# + true, false, false, false, true, // Zeile 4: #...# + true, false, false, false, true // Zeile 5: #...# + ]); + + _characters.Add('o', [ + false, true, true, true, false, // Zeile 1: .###. + true, false, false, false, true, // Zeile 2: #...# + true, false, false, false, true, // Zeile 3: #...# + true, false, false, false, true, // Zeile 4: #...# + false, true, true, true, false // Zeile 5: .###. + ]); + + _characters.Add('p', [ + true, true, true, true, false, // Zeile 1: ####. + true, false, false, false, true, // Zeile 2: #...# + true, true, true, true, false, // Zeile 3: ####. + true, false, false, false, false, // Zeile 4: #.... + true, false, false, false, false // Zeile 5: #.... + ]); + + _characters.Add('q', [ + false, true, true, true, false, // Zeile 1: .###. + true, false, false, false, true, // Zeile 2: #...# + true, false, false, false, true, // Zeile 3: #...# + false, true, true, true, true, // Zeile 4: .#### + false, false, false, false, true // Zeile 5: ....# + ]); + + _characters.Add('r', [ + true, true, true, false, false, // Zeile 1: ###.. + true, false, false, true, false, // Zeile 2: #..#. + true, false, false, false, false, // Zeile 3: #.... + true, false, false, false, false, // Zeile 4: #.... + true, false, false, false, false // Zeile 5: #.... + ]); + + _characters.Add('s', [ + false, true, true, true, false, // Zeile 1: .###. + true, false, false, false, false, // Zeile 2: #.... + false, true, true, true, false, // Zeile 3: .###. + false, false, false, false, true, // Zeile 4: ....# + true, true, true, true, false // Zeile 5: ####. + ]); + + _characters.Add('t', [ + true, true, true, true, true, // Zeile 1: ##### + false, false, true, false, false, // Zeile 2: ..#.. + false, false, true, false, false, // Zeile 3: ..#.. + false, false, true, false, false, // Zeile 4: ..#.. + false, false, true, true, false // Zeile 5: ..##. + ]); + + _characters.Add('u', [ + true, false, false, false, true, // Zeile 1: #...# + true, false, false, false, true, // Zeile 2: #...# + true, false, false, false, true, // Zeile 3: #...# + true, false, false, false, true, // Zeile 4: #...# + false, true, true, true, false // Zeile 5: .###. + ]); + + _characters.Add('v', [ + true, false, false, false, true, // Zeile 1: #...# + true, false, false, false, true, // Zeile 2: #...# + false, true, false, true, false, // Zeile 3: .#.#. + false, true, false, true, false, // Zeile 4: .#.#. + false, false, true, false, false // Zeile 5: ..#.. + ]); + + _characters.Add('w', [ + true, false, false, false, true, // Zeile 1: #...# + true, false, false, false, true, // Zeile 2: #...# + true, false, false, false, true, // Zeile 3: #...# + true, false, true, false, true, // Zeile 4: #.#.# + false, true, false, true, false // Zeile 5: .#.#. + ]); + + _characters.Add('x', [ + true, false, false, false, true, // Zeile 1: #...# + false, true, false, true, false, // Zeile 2: .#.#. + false, false, true, false, false, // Zeile 3: ..#.. + false, true, false, true, false, // Zeile 4: .#.#. + true, false, false, false, true // Zeile 5: #...# + ]); + + _characters.Add('y', [ + true, false, false, false, true, // Zeile 1: #...# + false, true, false, true, false, // Zeile 2: .#.#. + false, false, true, false, false, // Zeile 3: ..#.. + false, false, true, false, false, // Zeile 4: ..#.. + false, true, true, false, false // Zeile 5: .##.. + ]); + + _characters.Add('z', [ + true, true, true, true, true, // Zeile 1: ##### + false, false, false, true, false, // Zeile 2: ...#. + false, false, true, false, false, // Zeile 3: ..#.. + false, true, false, false, false, // Zeile 4: .#... + true, true, true, true, true // Zeile 5: ##### + ]); + } + + public void DrawChar(char ch) + { + int xOffset = CPU.Instance.Display.DX.GetValueWithoutNotification(); + int yOffset = CPU.Instance.Display.DY.GetValueWithoutNotification(); + + if (!_characters.TryGetValue(ch, out var pixels)) + { + throw new NotImplementedException($"unknown character {ch}"); + } + + int width = 5; + for (int y = 0; y < 5; y++) + { + for (int x = 0; x < width; x++) + { + if (pixels[y * width + x]) + { + CPU.Instance.Display.SetPixel((short)(y + xOffset), (short)(x + yOffset)); + } + } + } + } +} \ No newline at end of file diff --git a/src/MimaSim/MimaSim/ViewModels/MainViewModel.cs b/src/MimaSim/MimaSim/ViewModels/MainViewModel.cs index 1de981a..948aabc 100644 --- a/src/MimaSim/MimaSim/ViewModels/MainViewModel.cs +++ b/src/MimaSim/MimaSim/ViewModels/MainViewModel.cs @@ -170,6 +170,14 @@ public MainViewModel() return; } + CPU.Instance.Display.Font.DrawChar('c'); + + CPU.Instance.Display.DY.SetValue(7); + CPU.Instance.Display.Font.DrawChar('h'); + + CPU.Instance.Display.DY.SetValue(13); + CPU.Instance.Display.Font.DrawChar('r'); + var translator = SourceTextTranslatorSelector.Select(SelectedLanguage); diagnostics = new();