Skip to content

Commit

Permalink
feat: Add Simple Font Rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
furesoft committed Oct 22, 2024
1 parent 3d4ffae commit a947d6e
Show file tree
Hide file tree
Showing 3 changed files with 265 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/MimaSim/MimaSim/MIMA/Components/Display.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ public class Display

private DisplayControl _displayControl;

public Font Font = new();

public void SetDisplay(DisplayControl displayControl)
{
_displayControl = displayControl;
Expand All @@ -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
Expand Down
246 changes: 246 additions & 0 deletions src/MimaSim/MimaSim/MIMA/Font.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,246 @@
using System;
using System.Collections.Generic;
using MimaSim.MIMA.Components;

namespace MimaSim.MIMA;

public class Font
{
Dictionary<char, bool[]> _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));
}
}
}
}
}
8 changes: 8 additions & 0 deletions src/MimaSim/MimaSim/ViewModels/MainViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down

0 comments on commit a947d6e

Please sign in to comment.