diff --git a/Assets/Scripts/Description/Helpers/ChipTypeHelper.cs b/Assets/Scripts/Description/Helpers/ChipTypeHelper.cs index 3d1e60d0..c77452e3 100644 --- a/Assets/Scripts/Description/Helpers/ChipTypeHelper.cs +++ b/Assets/Scripts/Description/Helpers/ChipTypeHelper.cs @@ -16,20 +16,30 @@ public static class ChipTypeHelper { ChipType.TriStateBuffer, "3-STATE BUFFER" }, // ---- Memory ---- { ChipType.dev_Ram_8Bit, "dev.RAM-8" }, + { ChipType.Rom_256x2x8, $"ROM 256{mulSymbol}x2x8" }, { ChipType.Rom_256x16, $"ROM 256{mulSymbol}16" }, + { ChipType.Rom_256x32, $"ROM 256{mulSymbol}32" }, // ---- Split / Merge ---- { ChipType.Split_4To1Bit, "4-1BIT" }, { ChipType.Split_8To1Bit, "8-1BIT" }, { ChipType.Split_8To4Bit, "8-4BIT" }, + { ChipType.Split_16To1Bit, "16-1BIT" }, + { ChipType.Split_16To4Bit, "16-4BIT" }, + { ChipType.Split_16To8Bit, "16-8BIT" }, { ChipType.Merge_4To8Bit, "4-8BIT" }, { ChipType.Merge_1To8Bit, "1-8BIT" }, { ChipType.Merge_1To4Bit, "1-4BIT" }, + { ChipType.Merge_1To16Bit, "1-16BIT" }, + { ChipType.Merge_4To16Bit, "4-16BIT" }, + { ChipType.Merge_8To16Bit, "8-16BIT" }, // ---- Displays ----- { ChipType.DisplayRGB, "RGB DISPLAY" }, { ChipType.DisplayDot, "DOT DISPLAY" }, { ChipType.SevenSegmentDisplay, "7-SEGMENT" }, { ChipType.DisplayLED, "LED" }, + { ChipType.DisplayRGBLED, "RGBLED" }, + { ChipType.DisplayAscii_8Bit, "A"}, { ChipType.Buzzer, "BUZZER" }, @@ -39,28 +49,32 @@ public static class ChipTypeHelper { ChipType.In_1Bit, "IN-1" }, { ChipType.In_4Bit, "IN-4" }, { ChipType.In_8Bit, "IN-8" }, + { ChipType.In_16Bit, "IN-16" }, { ChipType.Out_1Bit, "OUT-1" }, { ChipType.Out_4Bit, "OUT-4" }, { ChipType.Out_8Bit, "OUT-8" }, + { ChipType.Out_16Bit, "OUT-16" }, { ChipType.Key, "KEY" }, // ---- Buses ---- { ChipType.Bus_1Bit, "BUS-1" }, { ChipType.Bus_4Bit, "BUS-4" }, { ChipType.Bus_8Bit, "BUS-8" }, + { ChipType.Bus_16Bit, "BUS-16" }, { ChipType.BusTerminus_1Bit, "BUS-TERMINUS-1" }, { ChipType.BusTerminus_4Bit, "BUS-TERMINUS-4" }, - { ChipType.BusTerminus_8Bit, "BUS-TERMINUS-8" } + { ChipType.BusTerminus_8Bit, "BUS-TERMINUS-8" }, + { ChipType.BusTerminus_16Bit, "BUS-TERMINUS-16" } }; public static string GetName(ChipType type) => Names[type]; public static bool IsBusType(ChipType type) => IsBusOriginType(type) || IsBusTerminusType(type); - public static bool IsBusOriginType(ChipType type) => type is ChipType.Bus_1Bit or ChipType.Bus_4Bit or ChipType.Bus_8Bit; + public static bool IsBusOriginType(ChipType type) => type is ChipType.Bus_1Bit or ChipType.Bus_4Bit or ChipType.Bus_8Bit or ChipType.Bus_16Bit; - public static bool IsBusTerminusType(ChipType type) => type is ChipType.BusTerminus_1Bit or ChipType.BusTerminus_4Bit or ChipType.BusTerminus_8Bit; + public static bool IsBusTerminusType(ChipType type) => type is ChipType.BusTerminus_1Bit or ChipType.BusTerminus_4Bit or ChipType.BusTerminus_8Bit or ChipType.BusTerminus_16Bit; - public static bool IsRomType(ChipType type) => type == ChipType.Rom_256x16; + public static bool IsRomType(ChipType type) => type is ChipType.Rom_256x2x8 or ChipType.Rom_256x16 or ChipType.Rom_256x32; public static ChipType GetCorrespondingBusTerminusType(ChipType type) { @@ -69,6 +83,7 @@ public static ChipType GetCorrespondingBusTerminusType(ChipType type) ChipType.Bus_1Bit => ChipType.BusTerminus_1Bit, ChipType.Bus_4Bit => ChipType.BusTerminus_4Bit, ChipType.Bus_8Bit => ChipType.BusTerminus_8Bit, + ChipType.Bus_16Bit => ChipType.BusTerminus_16Bit, _ => throw new Exception("No corresponding bus terminus found for type: " + type) }; } @@ -82,6 +97,7 @@ public static ChipType GetPinType(bool isInput, PinBitCount numBits) PinBitCount.Bit1 => ChipType.In_1Bit, PinBitCount.Bit4 => ChipType.In_4Bit, PinBitCount.Bit8 => ChipType.In_8Bit, + PinBitCount.Bit16 => ChipType.In_16Bit, _ => throw new Exception("No input pin type found for bitcount: " + numBits) }; } @@ -91,6 +107,7 @@ public static ChipType GetPinType(bool isInput, PinBitCount numBits) PinBitCount.Bit1 => ChipType.Out_1Bit, PinBitCount.Bit4 => ChipType.Out_4Bit, PinBitCount.Bit8 => ChipType.Out_8Bit, + PinBitCount.Bit16 => ChipType.Out_16Bit, _ => throw new Exception("No output pin type found for bitcount: " + numBits) }; } @@ -105,6 +122,8 @@ public static (bool isInput, bool isOutput, PinBitCount numBits) IsInputOrOutput ChipType.Out_4Bit => (false, true, PinBitCount.Bit4), ChipType.In_8Bit => (true, false, PinBitCount.Bit8), ChipType.Out_8Bit => (false, true, PinBitCount.Bit8), + ChipType.In_16Bit => (true, false, PinBitCount.Bit16), + ChipType.Out_16Bit => (false, true, PinBitCount.Bit16), _ => (false, false, PinBitCount.Bit1) }; } diff --git a/Assets/Scripts/Description/Types/SubTypes/ChipTypes.cs b/Assets/Scripts/Description/Types/SubTypes/ChipTypes.cs index 610f0298..aa438361 100644 --- a/Assets/Scripts/Description/Types/SubTypes/ChipTypes.cs +++ b/Assets/Scripts/Description/Types/SubTypes/ChipTypes.cs @@ -12,29 +12,41 @@ public enum ChipType // ---- Memory ---- dev_Ram_8Bit, + Rom_256x2x8, Rom_256x16, + Rom_256x32, // ---- Displays ---- SevenSegmentDisplay, DisplayRGB, DisplayDot, DisplayLED, + DisplayRGBLED, + DisplayAscii_8Bit, // ---- Merge / Split ---- Merge_1To4Bit, Merge_1To8Bit, Merge_4To8Bit, + Merge_1To16Bit, + Merge_4To16Bit, + Merge_8To16Bit, Split_4To1Bit, Split_8To4Bit, Split_8To1Bit, + Split_16To1Bit, + Split_16To4Bit, + Split_16To8Bit, // ---- In / Out Pins ---- In_1Bit, In_4Bit, In_8Bit, + In_16Bit, Out_1Bit, Out_4Bit, Out_8Bit, + Out_16Bit, Key, @@ -45,9 +57,10 @@ public enum ChipType BusTerminus_4Bit, Bus_8Bit, BusTerminus_8Bit, + Bus_16Bit, + BusTerminus_16Bit, // ---- Audio ---- Buzzer - } } \ No newline at end of file diff --git a/Assets/Scripts/Description/Types/SubTypes/PinDescription.cs b/Assets/Scripts/Description/Types/SubTypes/PinDescription.cs index 62745260..065e93be 100644 --- a/Assets/Scripts/Description/Types/SubTypes/PinDescription.cs +++ b/Assets/Scripts/Description/Types/SubTypes/PinDescription.cs @@ -26,7 +26,8 @@ public enum PinBitCount { Bit1 = 1, Bit4 = 4, - Bit8 = 8 + Bit8 = 8, + Bit16 = 16 } public enum PinColour diff --git a/Assets/Scripts/Game/Elements/DevPinInstance.cs b/Assets/Scripts/Game/Elements/DevPinInstance.cs index 7827e687..9333c83c 100644 --- a/Assets/Scripts/Game/Elements/DevPinInstance.cs +++ b/Assets/Scripts/Game/Elements/DevPinInstance.cs @@ -42,6 +42,7 @@ public DevPinInstance(PinDescription pinDescription, bool isInput) PinBitCount.Bit1 => new Vector2Int(1, 1), PinBitCount.Bit4 => new Vector2Int(2, 2), PinBitCount.Bit8 => new Vector2Int(4, 2), + PinBitCount.Bit16 => new Vector2Int(4, 4), _ => throw new Exception("Bit count not implemented") }; StateGridSize = BitCount switch diff --git a/Assets/Scripts/Game/Elements/SubChipInstance.cs b/Assets/Scripts/Game/Elements/SubChipInstance.cs index d85725ee..80b8af6c 100644 --- a/Assets/Scripts/Game/Elements/SubChipInstance.cs +++ b/Assets/Scripts/Game/Elements/SubChipInstance.cs @@ -309,6 +309,7 @@ public static float PinHeightFromBitCount(PinBitCount bitCount) PinBitCount.Bit1 => DrawSettings.PinRadius * 2, PinBitCount.Bit4 => DrawSettings.PinHeight4Bit, PinBitCount.Bit8 => DrawSettings.PinHeight8Bit, + PinBitCount.Bit16 => DrawSettings.PinHeight16Bit, _ => throw new Exception("Bit count not implemented " + bitCount) }; } diff --git a/Assets/Scripts/Game/Project/BuiltinChipCreator.cs b/Assets/Scripts/Game/Project/BuiltinChipCreator.cs index c757f1e1..05637351 100644 --- a/Assets/Scripts/Game/Project/BuiltinChipCreator.cs +++ b/Assets/Scripts/Game/Project/BuiltinChipCreator.cs @@ -21,6 +21,8 @@ public static ChipDescription[] CreateAllBuiltinChipDescriptions() CreateInputOrOutputPin(ChipType.Out_4Bit), CreateInputOrOutputPin(ChipType.In_8Bit), CreateInputOrOutputPin(ChipType.Out_8Bit), + CreateInputOrOutputPin(ChipType.In_16Bit), + CreateInputOrOutputPin(ChipType.Out_16Bit), CreateInputKeyChip(), // ---- Basic Chips ---- CreateNand(), @@ -29,20 +31,31 @@ public static ChipDescription[] CreateAllBuiltinChipDescriptions() CreatePulse(), // ---- Memory ---- dev_CreateRAM_8(), - CreateROM_8(), + CreateROM(ChipType.Rom_256x2x8), + CreateROM(ChipType.Rom_256x16), + CreateROM(ChipType.Rom_256x32), // ---- Merge / Split ---- CreateBitConversionChip(ChipType.Split_4To1Bit, PinBitCount.Bit4, PinBitCount.Bit1, 1, 4), CreateBitConversionChip(ChipType.Split_8To4Bit, PinBitCount.Bit8, PinBitCount.Bit4, 1, 2), CreateBitConversionChip(ChipType.Split_8To1Bit, PinBitCount.Bit8, PinBitCount.Bit1, 1, 8), + CreateBitConversionChip(ChipType.Split_16To1Bit, PinBitCount.Bit16, PinBitCount.Bit1, 1, 16), + CreateBitConversionChip(ChipType.Split_16To4Bit, PinBitCount.Bit16, PinBitCount.Bit4, 1, 4), + CreateBitConversionChip(ChipType.Split_16To8Bit, PinBitCount.Bit16, PinBitCount.Bit8, 1, 2), CreateBitConversionChip(ChipType.Merge_1To8Bit, PinBitCount.Bit1, PinBitCount.Bit8, 8, 1), CreateBitConversionChip(ChipType.Merge_1To4Bit, PinBitCount.Bit1, PinBitCount.Bit4, 4, 1), CreateBitConversionChip(ChipType.Merge_4To8Bit, PinBitCount.Bit4, PinBitCount.Bit8, 2, 1), + CreateBitConversionChip(ChipType.Merge_1To16Bit, PinBitCount.Bit1, PinBitCount.Bit16, 16, 1), + CreateBitConversionChip(ChipType.Merge_4To16Bit, PinBitCount.Bit4, PinBitCount.Bit16, 4, 1), + CreateBitConversionChip(ChipType.Merge_8To16Bit, PinBitCount.Bit8, PinBitCount.Bit16, 2, 1), + // ---- Displays ---- CreateDisplay7Seg(), CreateDisplayRGB(), CreateDisplayDot(), CreateDisplayLED(), + CreateDisplayRGBLED(), + CreateDisplayAscii8Bit(), // ---- Bus ---- CreateBus(PinBitCount.Bit1), CreateBusTerminus(PinBitCount.Bit1), @@ -50,6 +63,8 @@ public static ChipDescription[] CreateAllBuiltinChipDescriptions() CreateBusTerminus(PinBitCount.Bit4), CreateBus(PinBitCount.Bit8), CreateBusTerminus(PinBitCount.Bit8), + CreateBus(PinBitCount.Bit16), + CreateBusTerminus(PinBitCount.Bit16), // ---- Audio ---- CreateBuzzer() }; @@ -100,22 +115,76 @@ static ChipDescription dev_CreateRAM_8() return CreateBuiltinChipDescription(ChipType.dev_Ram_8Bit, size, col, inputPins, outputPins); } - static ChipDescription CreateROM_8() + static ChipDescription CreateROM(ChipType type) { - PinDescription[] inputPins = - { - CreatePinDescription("ADDRESS", 0, PinBitCount.Bit8) - }; - PinDescription[] outputPins = - { - CreatePinDescription("OUT B", 1, PinBitCount.Bit8), - CreatePinDescription("OUT A", 2, PinBitCount.Bit8) - }; + switch(type){ + case ChipType.Rom_256x2x8: + { + PinDescription[] inputPins = + { + CreatePinDescription("ADDRESS", 0, PinBitCount.Bit8) + }; + PinDescription[] outputPins = + { + CreatePinDescription("OUT B", 1, PinBitCount.Bit8), + CreatePinDescription("OUT A", 2, PinBitCount.Bit8) + }; + + Color col = new(0.25f, 0.35f, 0.5f); + Vector2 size = new(GridSize * 12, SubChipInstance.MinChipHeightForPins(inputPins, outputPins)); - Color col = new(0.25f, 0.35f, 0.5f); - Vector2 size = new(GridSize * 12, SubChipInstance.MinChipHeightForPins(inputPins, outputPins)); + return CreateBuiltinChipDescription(ChipType.Rom_256x2x8, size, col, inputPins, outputPins); + } + case ChipType.Rom_256x16: + { + PinDescription[] inputPins = + { + CreatePinDescription("ADDRESS", 0, PinBitCount.Bit8) + }; + PinDescription[] outputPins = + { + CreatePinDescription("OUT A", 1, PinBitCount.Bit16) + }; + + Color col = new(0.25f, 0.35f, 0.5f); + Vector2 size = new(GridSize * 12, SubChipInstance.MinChipHeightForPins(inputPins, outputPins)); + + return CreateBuiltinChipDescription(ChipType.Rom_256x16, size, col, inputPins, outputPins); + } + case ChipType.Rom_256x32: + { + PinDescription[] inputPins = + { + CreatePinDescription("ADDRESS", 0, PinBitCount.Bit8) + }; + PinDescription[] outputPins = + { + CreatePinDescription("OUT B", 1, PinBitCount.Bit16), + CreatePinDescription("OUT A", 2, PinBitCount.Bit16) + }; - return CreateBuiltinChipDescription(ChipType.Rom_256x16, size, col, inputPins, outputPins); + Color col = new(0.25f, 0.35f, 0.5f); + Vector2 size = new(GridSize * 12, SubChipInstance.MinChipHeightForPins(inputPins, outputPins)); + + return CreateBuiltinChipDescription(ChipType.Rom_256x32, size, col, inputPins, outputPins); + } + default: + { + PinDescription[] inputPins = + { + CreatePinDescription("ADDRESS", 0, PinBitCount.Bit8) + }; + PinDescription[] outputPins = + { + CreatePinDescription("OUT A", 1, PinBitCount.Bit16) + }; + + Color col = new(0.25f, 0.35f, 0.5f); + Vector2 size = new(GridSize * 12, SubChipInstance.MinChipHeightForPins(inputPins, outputPins)); + + return CreateBuiltinChipDescription(ChipType.Rom_256x16, size, col, inputPins, outputPins); + } + } } static ChipDescription CreateInputKeyChip() @@ -222,30 +291,30 @@ static ChipDescription CreateDisplay7Seg() static ChipDescription CreateDisplayRGB() { - float height = GridSize * 21; - float width = height; - float displayWidth = height - GridSize * 2; + float displayWidth = GridSize * 19; Color col = new(0.1f, 0.1f, 0.1f); - Vector2 size = new(width, height); PinDescription[] inputPins = { CreatePinDescription("ADDRESS", 0, PinBitCount.Bit8), - CreatePinDescription("RED", 1, PinBitCount.Bit4), - CreatePinDescription("GREEN", 2, PinBitCount.Bit4), - CreatePinDescription("BLUE", 3, PinBitCount.Bit4), + CreatePinDescription("RED", 1, PinBitCount.Bit8), + CreatePinDescription("GREEN", 2, PinBitCount.Bit8), + CreatePinDescription("BLUE", 3, PinBitCount.Bit8), CreatePinDescription("RESET", 4), CreatePinDescription("WRITE", 5), CreatePinDescription("REFRESH", 6), CreatePinDescription("CLOCK", 7) }; + float height = SubChipInstance.MinChipHeightForPins(inputPins, null); + float width = height; + Vector2 size = new(width, height); PinDescription[] outputPins = { - CreatePinDescription("R OUT", 8, PinBitCount.Bit4), - CreatePinDescription("G OUT", 9, PinBitCount.Bit4), - CreatePinDescription("B OUT", 10, PinBitCount.Bit4) + CreatePinDescription("R OUT", 8, PinBitCount.Bit8), + CreatePinDescription("G OUT", 9, PinBitCount.Bit8), + CreatePinDescription("B OUT", 10, PinBitCount.Bit8) }; DisplayDescription[] displays = @@ -319,6 +388,7 @@ static Vector2 BusChipSize(PinBitCount bitCount) PinBitCount.Bit1 => new Vector2(GridSize * 2, GridSize * 2), PinBitCount.Bit4 => new Vector2(GridSize * 2, GridSize * 3), PinBitCount.Bit8 => new Vector2(GridSize * 2, GridSize * 4), + PinBitCount.Bit16 => new Vector2(GridSize * 2, GridSize * 5), _ => throw new Exception("Bus bit count not implemented") }; } @@ -330,6 +400,7 @@ static ChipDescription CreateBus(PinBitCount bitCount) PinBitCount.Bit1 => ChipType.Bus_1Bit, PinBitCount.Bit4 => ChipType.Bus_4Bit, PinBitCount.Bit8 => ChipType.Bus_8Bit, + PinBitCount.Bit16 => ChipType.Bus_16Bit, _ => throw new Exception("Bus bit count not implemented") }; @@ -342,7 +413,64 @@ static ChipDescription CreateBus(PinBitCount bitCount) return CreateBuiltinChipDescription(type, BusChipSize(bitCount), col, inputs, outputs, null, NameDisplayLocation.Hidden); } + static ChipDescription CreateDisplayRGBLED() + { + PinDescription[] inputPins = + { + CreatePinDescription("IN", 0), + CreatePinDescription("RED", 1, PinBitCount.Bit8), + CreatePinDescription("GREEN", 2, PinBitCount.Bit8), + CreatePinDescription("BLUE", 3, PinBitCount.Bit8), + }; + + float height = SubChipInstance.MinChipHeightForPins(inputPins, null); + float width = height; + float displayWidth = height - GridSize * 0.5f; + + Color col = new(0.1f, 0.1f, 0.1f); + Vector2 size = new(width, height); + + + DisplayDescription[] displays = + { + new() + { + Position = Vector2.zero, + Scale = displayWidth, + SubChipID = -1 + } + }; + + return CreateBuiltinChipDescription(ChipType.DisplayRGBLED, size, col, inputPins, null, displays, NameDisplayLocation.Hidden); + } + static ChipDescription CreateDisplayAscii8Bit() + { + PinDescription[] inputPins = + { + CreatePinDescription("ON", 0), + CreatePinDescription("Letter", 1, PinBitCount.Bit8) + }; + float height = SubChipInstance.MinChipHeightForPins(inputPins, null); + float width = height; + float displayWidth = height - GridSize * 0.5f; + + Color col = new(0f, 0f, 0f); + Vector2 size = new(width, height); + + + DisplayDescription[] displays = + { + new() + { + Position = Vector2.zero, + Scale = displayWidth, + SubChipID = -1 + } + }; + + return CreateBuiltinChipDescription(ChipType.DisplayAscii_8Bit, size, col, inputPins, null, displays, NameDisplayLocation.Centre); + } static ChipDescription CreateDisplayLED() { PinDescription[] inputPins = @@ -379,6 +507,7 @@ static ChipDescription CreateBusTerminus(PinBitCount bitCount) PinBitCount.Bit1 => ChipType.BusTerminus_1Bit, PinBitCount.Bit4 => ChipType.BusTerminus_4Bit, PinBitCount.Bit8 => ChipType.BusTerminus_8Bit, + PinBitCount.Bit16 => ChipType.BusTerminus_16Bit, _ => throw new Exception("Bus bit count not implemented") }; diff --git a/Assets/Scripts/Game/Project/BuiltinCollectionCreator.cs b/Assets/Scripts/Game/Project/BuiltinCollectionCreator.cs index f7e6508a..6bfa280d 100644 --- a/Assets/Scripts/Game/Project/BuiltinCollectionCreator.cs +++ b/Assets/Scripts/Game/Project/BuiltinCollectionCreator.cs @@ -29,31 +29,44 @@ public static ChipCollection[] CreateDefaultChipCollections() ChipType.In_1Bit, ChipType.In_4Bit, ChipType.In_8Bit, + ChipType.In_16Bit, ChipType.Out_1Bit, ChipType.Out_4Bit, - ChipType.Out_8Bit + ChipType.Out_8Bit, + ChipType.Out_16Bit ), CreateChipCollection("MERGE/SPLIT", ChipType.Merge_1To4Bit, ChipType.Merge_1To8Bit, ChipType.Merge_4To8Bit, + ChipType.Merge_1To16Bit, + ChipType.Merge_4To16Bit, + ChipType.Merge_8To16Bit, ChipType.Split_4To1Bit, ChipType.Split_8To4Bit, - ChipType.Split_8To1Bit + ChipType.Split_8To1Bit, + ChipType.Split_16To1Bit, + ChipType.Split_16To4Bit, + ChipType.Split_16To8Bit ), CreateChipCollection("BUS", ChipType.Bus_1Bit, ChipType.Bus_4Bit, - ChipType.Bus_8Bit + ChipType.Bus_8Bit, + ChipType.Bus_16Bit ), CreateChipCollection("DISPLAY", ChipType.SevenSegmentDisplay, ChipType.DisplayDot, ChipType.DisplayRGB, - ChipType.DisplayLED + ChipType.DisplayLED, + ChipType.DisplayRGBLED, + ChipType.DisplayAscii_8Bit ), CreateChipCollection("MEMORY", - ChipType.Rom_256x16 + ChipType.Rom_256x2x8, + ChipType.Rom_256x16, + ChipType.Rom_256x32 ) }; } diff --git a/Assets/Scripts/Graphics/DrawSettings.cs b/Assets/Scripts/Graphics/DrawSettings.cs index 3f3ff864..d18651ac 100644 --- a/Assets/Scripts/Graphics/DrawSettings.cs +++ b/Assets/Scripts/Graphics/DrawSettings.cs @@ -13,11 +13,14 @@ public static class DrawSettings public const float PinHeight1Bit = 0.185f; public const float PinHeight4Bit = 0.3f; public const float PinHeight8Bit = 0.43f; + public const float PinHeight16Bit = 0.56f; public const float PinRadius = PinHeight1Bit / 2; public const FontType FontBold = FontType.JetbrainsMonoBold; public const FontType FontRegular = FontType.JetbrainsMonoRegular; + public const FontType FontAscii = FontType.Symbola; + public const float FontSizeChipName = 0.25f; public const float FontSizePinLabel = 0.2f; diff --git a/Assets/Scripts/Graphics/UI/Menus/RomEditMenu.cs b/Assets/Scripts/Graphics/UI/Menus/RomEditMenu.cs index 7cb9c60b..412cce12 100644 --- a/Assets/Scripts/Graphics/UI/Menus/RomEditMenu.cs +++ b/Assets/Scripts/Graphics/UI/Menus/RomEditMenu.cs @@ -1,6 +1,7 @@ using System; using System.Text; using DLS.Game; +using DLS.Description; using Seb.Helpers; using Seb.Types; using Seb.Vis; @@ -210,7 +211,7 @@ static bool ValidateInputString(string text) // Convert from uint to display string with given display mode static string UIntToDisplayString(uint raw, DataDisplayMode displayFormat, int bitCount) { - return displayFormat switch + string data = displayFormat switch { DataDisplayMode.Binary => Convert.ToString(raw, 2).PadLeft(bitCount, '0'), DataDisplayMode.DecimalSigned => Maths.TwosComplement(raw, bitCount) + "", @@ -218,70 +219,91 @@ static string UIntToDisplayString(uint raw, DataDisplayMode displayFormat, int b DataDisplayMode.HEX => raw.ToString("X").PadLeft(bitCount / 4, '0'), _ => throw new NotImplementedException("Unsupported display format: " + displayFormat) }; + Debug.Log("Loaded "+data); + return data; } // Convert string with given format to uint static uint DisplayStringToUInt(string displayString, DataDisplayMode stringFormat, int bitCount) { displayString = displayString.Replace(" ", string.Empty); + Debug.Log("Display " + displayString); uint uintVal; + try{ + switch (stringFormat) + { + case DataDisplayMode.Binary: + uintVal = Convert.ToUInt32(displayString, 2); + break; + case DataDisplayMode.DecimalSigned: + { + int signedValue = int.Parse(displayString); + uint unsignedRange = 1u << bitCount; + if (signedValue < 0) + { + uintVal = (uint)(signedValue + unsignedRange); + } + else + { + uintVal = (uint)signedValue; + } - switch (stringFormat) - { - case DataDisplayMode.Binary: - uintVal = Convert.ToUInt32(displayString, 2); - break; - case DataDisplayMode.DecimalSigned: + break; + } + case DataDisplayMode.DecimalUnsigned: + uintVal = uint.Parse(displayString); + break; + case DataDisplayMode.HEX: + int value = Convert.ToInt32(displayString, 16); + uintVal = (uint)value; + break; + default: + throw new NotImplementedException("Unsupported display format: " + stringFormat); + } + }catch (Exception e){ + Debug.Log(e); + if (stringFormat is DataDisplayMode.Binary) { - int signedValue = int.Parse(displayString); - uint unsignedRange = 1u << bitCount; - if (signedValue < 0) + uintVal =(uint) ((ulong) (Convert.ToInt64(displayString, 2))& 0xFFFFFFFF); + } + uintVal = 0; + switch (stringFormat){ + case DataDisplayMode.DecimalUnsigned: { - uintVal = (uint)(signedValue + unsignedRange); + uintVal = uint.Parse(displayString); + break; } - else + case DataDisplayMode.HEX: { - uintVal = (uint)signedValue; + int value = Convert.ToInt32(displayString, 16); + uintVal = (uint)value; + break; + } + default: + { + throw new NotImplementedException("Unsupported display format: " + stringFormat); } - - break; } - case DataDisplayMode.DecimalUnsigned: - uintVal = uint.Parse(displayString); - break; - case DataDisplayMode.HEX: - int value = Convert.ToInt32(displayString, 16); - uintVal = (uint)value; - break; - default: - throw new NotImplementedException("Unsupported display format: " + stringFormat); } - + Debug.Log(uintVal); return uintVal; } static bool TryParseDisplayStringToUInt(string displayString, DataDisplayMode stringFormat, int bitCount, out uint raw) { - try - { - raw = DisplayStringToUInt(displayString, stringFormat, bitCount); - uint maxVal = (1u << bitCount) - 1; - - // If value is too large to fit in given bit-count, clamp the result and return failure - // (note: maybe makes more sense to wrap the result, but I think it's more obvious to player what happened if it just clamps) - if (raw > maxVal) - { - raw = maxVal; - return false; - } + raw = DisplayStringToUInt(displayString, stringFormat, bitCount); + long maxVal = (long) Math.Pow(2,bitCount) - 1; + uint max = (uint) maxVal; - return true; - } - catch (Exception) + // If value is too large to fit in given bit-count, clamp the result and return failure + // (note: maybe makes more sense to wrap the result, but I think it's more obvious to player what happened if it just clamps) + if (raw > max) { - raw = 0; + raw = max; return false; } + + return true; } static void SaveChangesToROM() @@ -341,7 +363,14 @@ public static void OnMenuOpened() { romChip = (SubChipInstance)ContextMenu.interactionContext; RowCount = romChip.InternalData.Length; - ActiveRomDataBitCount = 16; // + ActiveRomDataBitCount = romChip.ChipType switch + { + ChipType.Rom_256x2x8 => 16, + ChipType.Rom_256x16 => 16, + ChipType.Rom_256x32 => 32, + _ => 16 + }; + ID_DataDisplayMode = new UIHandle("ROM_DataDisplayMode", romChip.ID); ID_scrollbar = new UIHandle("ROM_EditScrollbar", romChip.ID); diff --git a/Assets/Scripts/Graphics/World/DevSceneDrawer.cs b/Assets/Scripts/Graphics/World/DevSceneDrawer.cs index eefb8307..b28a3914 100644 --- a/Assets/Scripts/Graphics/World/DevSceneDrawer.cs +++ b/Assets/Scripts/Graphics/World/DevSceneDrawer.cs @@ -314,6 +314,10 @@ public static void DrawSubChip(SubChipInstance subchip) { displayName = subchip.Description.Name; } + if(subchip.ChipType == ChipType.DisplayAscii_8Bit) + { + displayName = ""; + } bool nameCentre = desc.NameLocation == NameDisplayLocation.Centre || isKeyChip; Anchor textAnchor = nameCentre ? Anchor.TextCentre : Anchor.CentreTop; @@ -377,7 +381,6 @@ public static Bounds2D DrawDisplayWithBackground(DisplayInstance display, Vector Bounds2D bounds = DrawDisplay(display, pos, 1, rootChip, sim); // Border colour around display - Draw.ModifyQuad(displayBorderID, bounds.Centre, bounds.Size + Vector2.one * 0.03f, borderCol); // Black background behind display to fill any gaps Draw.ModifyQuad(displayBackingID, bounds.Centre, bounds.Size, Color.black); @@ -441,6 +444,19 @@ public static Bounds2D DrawDisplay(DisplayInstance display, Vector2 posParent, f bounds = DrawDisplay_LED(posWorld, scaleWorld, col); } + else if (display.DisplayType == ChipType.DisplayRGBLED) + { + bool simActive = sim != null; + bool isOn = simActive && sim.InputPins[0].FirstBitHigh; + bounds = DrawDisplay_DisplayRGBLED(posWorld, scaleWorld, isOn, sim); + } + else if (display.DisplayType == ChipType.DisplayAscii_8Bit) + { + bool simActive = sim != null; + bool isOn = simActive && sim.InputPins[0].FirstBitHigh; + bounds = DrawDisplay_DisplayAscii8_Bit(posWorld, scaleWorld, isOn, sim); + } + display.LastDrawBounds = bounds; return bounds; } @@ -451,9 +467,10 @@ public static Bounds2D DrawDisplay(DisplayInstance display, Vector2 posParent, f public static Bounds2D DrawDisplay_RGB(Vector2 centre, float scale, SimChip simSource) { const int pixelsPerRow = 16; - const float borderFrac = 0.95f; - const float pixelSizeT = 0.925f; + const float borderFrac = 1f; + const float pixelSizeT = 1f; // Draw background + Debug.Log(scale); Draw.Quad(centre, Vector2.one * scale, Color.black); float size = scale * borderFrac; @@ -472,9 +489,9 @@ public static Bounds2D DrawDisplay_RGB(Vector2 centre, float scale, SimChip simS { int address = y * 16 + x; uint pixelState = simSource.InternalState[address]; - float red = Unpack4BitColChannel(pixelState); - float green = Unpack4BitColChannel(pixelState >> 4); - float blue = Unpack4BitColChannel(pixelState >> 8); + float red = Unpack8BitColChannel(pixelState); + float green = Unpack8BitColChannel(pixelState >> 8); + float blue = Unpack8BitColChannel(pixelState >> 16); col = new Color(red, green, blue); } @@ -484,11 +501,6 @@ public static Bounds2D DrawDisplay_RGB(Vector2 centre, float scale, SimChip simS } return Bounds2D.CreateFromCentreAndSize(centre, Vector2.one * scale); - - float Unpack4BitColChannel(uint raw) - { - return (raw & 0b1111) / 15f; - } } public static Bounds2D DrawDisplay_Dot(Vector2 centre, float scale, SimChip simSource) @@ -571,6 +583,47 @@ public static Bounds2D DrawDisplay_SevenSegment(Vector2 centre, float scale, int return Bounds2D.CreateFromCentreAndSize(centre, boundsSize); } + public static Bounds2D DrawDisplay_DisplayAscii8_Bit(Vector2 centre, float scale, bool isOn, SimChip sim) + { + if(isOn){ + string tmp = PinState.GetBitStates(sim.InputPins[1].State).ToString("X").PadLeft(4, '0'); + ushort codeUnit = Convert.ToUInt16(tmp, 16); + string displayName = ((char)codeUnit).ToString(); + Debug.Log("Name: " + displayName); + Anchor textAnchor = Anchor.TextCentre; + Vector2 textPos = centre; + + Draw.Text(FontBold, displayName, FontSizeChipName, textPos, textAnchor, Color.white, ChipNameLineSpacing); + } + return Bounds2D.CreateFromCentreAndSize(centre, Vector2.one * scale); + } + public static Bounds2D DrawDisplay_DisplayRGBLED(Vector2 centre, float scale, bool isOn, SimChip sim) + { + const float pixelSizeT = 0.975f; + float pixelSize = scale; + + // Draw background + Draw.Quad(centre, Vector2.one * scale, Color.black); + Vector2 pixelDrawSize = Vector2.one * (scale * pixelSizeT); + Color onColor; + if (sim == null) + { + onColor = Color.white; // default fallback + } + else + { + onColor = new Color( + Unpack8BitColChannel(sim.InternalState[0]), + Unpack8BitColChannel(sim.InternalState[1]), + Unpack8BitColChannel(sim.InternalState[2]), + 1 + ); + } + Color col = isOn ? onColor : new Color(0,0,0,1); + Draw.Quad(centre, pixelDrawSize, col); + return Bounds2D.CreateFromCentreAndSize(centre, Vector2.one * scale); + } + public static Bounds2D DrawDisplay_LED(Vector2 centre, float scale, Color col) { const float pixelSizeT = 0.975f; @@ -582,6 +635,11 @@ public static Bounds2D DrawDisplay_LED(Vector2 centre, float scale, Color col) return Bounds2D.CreateFromCentreAndSize(centre, Vector2.one * scale); } + static float Unpack8BitColChannel(uint raw) + { + return (raw & 0b11111111) / 255f; + } + public static void DrawDevPin(DevPinInstance devPin) { if (devPin.BitCount == PinBitCount.Bit1) diff --git a/Assets/Scripts/SaveSystem/DescriptionCreator.cs b/Assets/Scripts/SaveSystem/DescriptionCreator.cs index 196e0ea1..c9bf1536 100644 --- a/Assets/Scripts/SaveSystem/DescriptionCreator.cs +++ b/Assets/Scripts/SaveSystem/DescriptionCreator.cs @@ -69,6 +69,16 @@ public static SubChipDescription CreateSubChipDescription(SubChipInstance subChi public static SubChipDescription CreateBuiltinSubChipDescriptionForPlacement(ChipType type, string name, int id, Vector2 position) { + int ROMStorage = 256; + uint[] internalData = type switch + { + ChipType.Rom_256x2x8 => new uint[ROMStorage], + ChipType.Rom_256x16 => new uint[ROMStorage], + ChipType.Rom_256x32 => new uint[ROMStorage], + ChipType.Key => new uint[] { 'K' }, + ChipType.Pulse => new uint[] { 50, 0, 0 }, + _ => ChipTypeHelper.IsBusType(type) ? new uint[2] : null + }; return new SubChipDescription ( name, diff --git a/Assets/Scripts/Seb/Helpers/Maths.cs b/Assets/Scripts/Seb/Helpers/Maths.cs index c0e40fea..78fe3c5d 100644 --- a/Assets/Scripts/Seb/Helpers/Maths.cs +++ b/Assets/Scripts/Seb/Helpers/Maths.cs @@ -882,7 +882,7 @@ public static int IntLog2(int value) public static int TwosComplement(uint unsignedValue, int numBits) { - if (numBits < 32) + if (numBits <= 32) { uint unsignedRange = 1u << numBits; uint firstNegativeValue = unsignedRange >> 1; diff --git a/Assets/Scripts/Seb/SebVis/Internal/FontMap.cs b/Assets/Scripts/Seb/SebVis/Internal/FontMap.cs index fb94116b..0df4d049 100644 --- a/Assets/Scripts/Seb/SebVis/Internal/FontMap.cs +++ b/Assets/Scripts/Seb/SebVis/Internal/FontMap.cs @@ -19,7 +19,8 @@ public enum FontType DepartureMono, // -- Pixel -- - Born2bSporty // + Born2bSporty, + Symbola // } } @@ -43,7 +44,8 @@ public static readonly (FontType font, string path)[] map = (FontType.JetbrainsMonoSemiBold, "JetbrainsMono/JetBrainsMonoNL-SemiBold"), (FontType.JetbrainsMonoRegular, "JetbrainsMono/JetBrainsMonoNL-Regular"), (FontType.DepartureMono, "DepartureMono/DepartureMono-Regular"), - (FontType.Born2bSporty, "Born2bSporty/Born2bSportyV2") // + (FontType.Born2bSporty, "Born2bSporty/Born2bSportyV2"), + (FontType.Symbola, "symbola/symbola") // }; } } \ No newline at end of file diff --git a/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola.meta b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola.meta new file mode 100644 index 00000000..96efb8aa --- /dev/null +++ b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ba6e0cb08afca4322a3b1f6c94cc2078 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/info.txt b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/info.txt new file mode 100644 index 00000000..0819872c --- /dev/null +++ b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/info.txt @@ -0,0 +1,2 @@ +license: Public Domain +link: https://www.fontspace.com/symbola-font-f22021 \ No newline at end of file diff --git a/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/info.txt.meta b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/info.txt.meta new file mode 100644 index 00000000..c6d2d6f6 --- /dev/null +++ b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/info.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c07a2d98cce4140f2910d4bbec9cf1f3 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/misc.meta b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/misc.meta new file mode 100644 index 00000000..b4b7f4b7 --- /dev/null +++ b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/misc.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6e877e9e97de64609b3fd014f5271fe0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/misc/Symbola-4114.docx b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/misc/Symbola-4114.docx new file mode 100644 index 00000000..29ef5cfc Binary files /dev/null and b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/misc/Symbola-4114.docx differ diff --git a/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/misc/Symbola-4114.docx.meta b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/misc/Symbola-4114.docx.meta new file mode 100644 index 00000000..26a9c4b7 --- /dev/null +++ b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/misc/Symbola-4114.docx.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ad8ccfc7764b64f538a51cee1329200e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/misc/Symbola-fec7.htm b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/misc/Symbola-fec7.htm new file mode 100644 index 00000000..7d5582ae --- /dev/null +++ b/Assets/Scripts/Seb/SebVis/Internal/Resources/Fonts/symbola/misc/Symbola-fec7.htm @@ -0,0 +1,1565 @@ + + +
+ + + + + + + +Letters
+in Symbola
+an aid in choosing between hinted and unhinted versions
+ +
0 +1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e +f g h i j k l m n o p q r s t u v w x y z Α Β Γ Δ Ε +Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π +Ρ Σ Τ Υ Φ Χ Ψ Ω α β γ +δ ε ζ η θ ι κ λ μ ν ξ +ο π ρ ς σ τ υ φ χ ψ ω ϐ +ϑ ϕ ϖ ϗ ϙ ϛ ϝ ϟ ϡ А Б +В Г Д Е Ж З И Й К Л +М Н О П Р С Т У Ф Х +Ц Ч Ш Щ Ъ Ы Ь Э Ю Я +а б в г д е ж з и й +к л м н о п р с т у +ф х ц ч ш щ ъ ы ь э +ю я 𝐀 𝐁 𝐂 𝐃 𝐄 𝐅 𝐆 +𝐇 𝐈 𝐉 𝐊 𝐋 𝐌 𝐍 𝐎 +𝐏 𝐐 𝐑 𝐒 𝐓 𝐔 𝐕 𝐖 +𝐗 𝐘 𝐙 𝐚 𝐛 𝐜 𝐝 𝐞 +𝐟 𝐠 𝐡 𝐢 𝐣 𝐤 𝐥 𝐦 +𝐧 𝐨 𝐩 𝐪 𝐫 𝐬 𝐭 𝐮 +𝐯 𝐰 𝐱 𝐲 𝐳 𝐴 𝐵 𝐶 +𝐷 𝐸 𝐹 𝐺 𝐻 𝐼 𝐽 𝐾 +𝐿 𝑀 𝑁 𝑂 𝑃 𝑄 𝑅 𝑆 +𝑇 𝑈 𝑉 𝑊 𝑋 𝑌 𝑍 𝑎 +𝑏 𝑐 𝑑 𝑒 𝑓 𝑔 𝑖 𝑗 +𝑘 𝑙 𝑚 𝑛 𝑜 𝑝 𝑞 𝑟 +𝑠 𝑡 𝑢 𝑣 𝑤 𝑥 𝑦 𝑧 +𝑨 𝑩 𝑪 𝑫 𝑬 𝑭 𝑮 𝑯 +𝑰 𝑱 𝑲 𝑳 𝑴 𝑵 𝑶 𝑷 +𝑸 𝑹 𝑺 𝑻 𝑼 𝑽 𝑾 𝑿 +𝒀 𝒁 𝒂 𝒃 𝒄 𝒅 𝒆 𝒇 +𝒈 𝒉 𝒊 𝒋 𝒌 𝒍 𝒎 𝒏 +𝒐 𝒑 𝒒 𝒓 𝒔 𝒕 𝒖 𝒗 +𝒘 𝒙 𝒚 𝒛 𝒜 𝒞 𝒟 𝒢 +𝒥 𝒦 𝒩 𝒪 𝒫 𝒬 𝒮 𝒯 +𝒰 𝒱 𝒲 𝒳 𝒴 𝒵 𝒶 𝒷 +𝒸 𝒹 𝒻 𝒽 𝒾 𝒿 𝓀 𝓁 +𝓂 𝓃 𝓅 𝓆 𝓇 𝓈 𝓉 𝓊 +𝓋 𝓌 𝓍 𝓎 𝓏 𝓐 𝓑 𝓒 +𝓓 𝓔 𝓕 𝓖 𝓗 𝓘 𝓙 𝓚 +𝓛 𝓜 𝓝 𝓞 𝓟 𝓠 𝓡 𝓢 +𝓣 𝓤 𝓥 𝓦 𝓧 𝓨 𝓩 𝓪 +𝓫 𝓬 𝓭 𝓮 𝓯 𝓰 𝓱 𝓲 +𝓳 𝓴 𝓵 𝓶 𝓷 𝓸 𝓹 𝓺 +𝓻 𝓼 𝓽 𝓾 𝓿 𝔀 𝔁 𝔂 +𝔃 𝔄 𝔅 𝔇 𝔈 𝔉 𝔊 𝔍 +𝔎 𝔏 𝔐 𝔑 𝔒 𝔓 𝔔 𝔖 +𝔗 𝔘 𝔙 𝔚 𝔛 𝔜 𝔞 𝔟 +𝔠 𝔡 𝔢 𝔣 𝔤 𝔥 𝔦 𝔧 +𝔨 𝔩 𝔪 𝔫 𝔬 𝔭 𝔮 𝔯 +𝔰 𝔱 𝔲 𝔳 𝔴 𝔵 𝔶 𝔷 +𝔸 𝔹 𝔻 𝔼 𝔽 𝔾 𝕀 𝕁 +𝕂 𝕃 𝕄 𝕆 𝕊 𝕋 𝕌 𝕍 +𝕎 𝕏 𝕐 𝕒 𝕓 𝕔 𝕕 𝕖 +𝕗 𝕘 𝕙 𝕚 𝕛 𝕜 𝕝 𝕞 +𝕟 𝕠 𝕡 𝕢 𝕣 𝕤 𝕥 𝕦 +𝕧 𝕨 𝕩 𝕪 𝕫 𝕬 𝕭 𝕮 +𝕯 𝕰 𝕱 𝕲 𝕳 𝕴 𝕵 𝕶 +𝕷 𝕸 𝕹 𝕺 𝕻 𝕼 𝕽 𝕾 +𝕿 𝖀 𝖁 𝖂 𝖃 𝖄 𝖅 𝖆 +𝖇 𝖈 𝖉 𝖊 𝖋 𝖌 𝖍 𝖎 +𝖏 𝖐 𝖑 𝖒 𝖓 𝖔 𝖕 𝖖 +𝖗 𝖘 𝖙 𝖚 𝖛 𝖜 𝖝 𝖞 +𝖟 𝖠 𝖡 𝖢 𝖣 𝖤 𝖥 𝖦 +𝖧 𝖨 𝖩 𝖪 𝖫 𝖬 𝖭 𝖮 +𝖯 𝖰 𝖱 𝖲 𝖳 𝖴 𝖵 𝖶 +𝖷 𝖸 𝖹 𝖺 𝖻 𝖼 𝖽 𝖾 +𝖿 𝗀 𝗁 𝗂 𝗃 𝗄 𝗅 𝗆 +𝗇 𝗈 𝗉 𝗊 𝗋 𝗌 𝗍 𝗎 +𝗏 𝗐 𝗑 𝗒 𝗓 𝗔 𝗕 𝗖 +𝗗 𝗘 𝗙 𝗚 𝗛 𝗜 𝗝 𝗞 +𝗟 𝗠 𝗡 𝗢 𝗣 𝗤 𝗥 𝗦 +𝗧 𝗨 𝗩 𝗪 𝗫 𝗬 𝗭 𝗮 +𝗯 𝗰 𝗱 𝗲 𝗳 𝗴 𝗵 𝗶 +𝗷 𝗸 𝗹 𝗺 𝗻 𝗼 𝗽 𝗾 +𝗿 𝘀 𝘁 𝘂 𝘃 𝘄 𝘅 𝘆 +𝘇 𝘈 𝘉 𝘊 𝘋 𝘌 𝘍 𝘎 +𝘏 𝘐 𝘑 𝘒 𝘓 𝘔 𝘕 𝘖 +𝘗 𝘘 𝘙 𝘚 𝘛 𝘜 𝘝 𝘞 +𝘟 𝘠 𝘡 𝘢 𝘣 𝘤 𝘥 𝘦 +𝘧 𝘨 𝘩 𝘪 𝘫 𝘬 𝘭 𝘮 +𝘯 𝘰 𝘱 𝘲 𝘳 𝘴 𝘵 𝘶 +𝘷 𝘸 𝘹 𝘺 𝘻 𝘼 𝘽 𝘾 +𝘿 𝙀 𝙁 𝙂 𝙃 𝙄 𝙅 𝙆 +𝙇 𝙈 𝙉 𝙊 𝙋 𝙌 𝙍 𝙎 +𝙏 𝙐 𝙑 𝙒 𝙓 𝙔 𝙕 𝙖 +𝙗 𝙘 𝙙 𝙚 𝙛 𝙜 𝙝 𝙞 +𝙟 𝙠 𝙡 𝙢 𝙣 𝙤 𝙥 𝙦 +𝙧 𝙨 𝙩 𝙪 𝙫 𝙬 𝙭 𝙮 +𝙯 𝙰 𝙱 𝙲 𝙳 𝙴 𝙵 𝙶 +𝙷 𝙸 𝙹 𝙺 𝙻 𝙼 𝙽 𝙾 +𝙿 𝚀 𝚁 𝚂 𝚃 𝚄 𝚅 𝚆 +𝚇 𝚈 𝚉 𝚊 𝚋 𝚌 𝚍 𝚎 +𝚏 𝚐 𝚑 𝚒 𝚓 𝚔 𝚕 𝚖 +𝚗 𝚘 𝚙 𝚚 𝚛 𝚜 𝚝 𝚞 +𝚟 𝚠 𝚡 𝚢 𝚣 𝚤 𝚥 𝚨 +𝚩 𝚪 𝚫 𝚬 𝚭 𝚮 𝚯 𝚰 +𝚱 𝚲 𝚳 𝚴 𝚵 𝚶 𝚷 𝚸 +𝚹 𝚺 𝚻 𝚼 𝚽 𝚾 𝚿 𝛀 +𝛁 𝛂 𝛃 𝛄 𝛅 𝛆 𝛇 𝛈 +𝛉 𝛊 𝛋 𝛌 𝛍 𝛎 𝛏 𝛐 +𝛑 𝛒 𝛓 𝛔 𝛕 𝛖 𝛗 𝛘 +𝛙 𝛚 𝛛 𝛜 𝛝 𝛞 𝛟 𝛠 +𝛡 𝛢 𝛣 𝛤 𝛥 𝛦 𝛧 𝛨 +𝛩 𝛪 𝛫 𝛬 𝛭 𝛮 𝛯 𝛰 +𝛱 𝛲 𝛳 𝛴 𝛵 𝛶 𝛷 𝛸 +𝛹 𝛺 𝛻 𝛼 𝛽 𝛾 𝛿 𝜀 +𝜁 𝜂 𝜃 𝜄 𝜅 𝜆 𝜇 𝜈 +𝜉 𝜊 𝜋 𝜌 𝜍 𝜎 𝜏 𝜐 +𝜑 𝜒 𝜓 𝜔 𝜕 𝜖 𝜗 𝜘 +𝜙 𝜚 𝜛 𝜜 𝜝 𝜞 𝜟 𝜠 +𝜡 𝜢 𝜣 𝜤 𝜥 𝜦 𝜧 𝜨 +𝜩 𝜪 𝜫 𝜬 𝜭 𝜮 𝜯 𝜰 +𝜱 𝜲 𝜳 𝜴 𝜵 𝜶 𝜷 𝜸 +𝜹 𝜺 𝜻 𝜼 𝜽 𝜾 𝜿 𝝀 +𝝁 𝝂 𝝃 𝝄 𝝅 𝝆 𝝇 𝝈 +𝝉 𝝊 𝝋 𝝌 𝝍 𝝎 𝝏 𝝐 +𝝑 𝝒 𝝓 𝝔 𝝕 𝝖 𝝗 𝝘 +𝝙 𝝚 𝝛 𝝜 𝝝 𝝞 𝝟 𝝠 +𝝡 𝝢 𝝣 𝝤 𝝥 𝝦 𝝧 𝝨 +𝝩 𝝪 𝝫 𝝬 𝝭 𝝮 𝝯 𝝰 +𝝱 𝝲 𝝳 𝝴 𝝵 𝝶 𝝷 𝝸 +𝝹 𝝺 𝝻 𝝼 𝝽 𝝾 𝝿 𝞀 +𝞁 𝞂 𝞃 𝞄 𝞅 𝞆 𝞇 𝞈 +𝞉 𝞊 𝞋 𝞌 𝞍 𝞎 𝞏 𝞐 +𝞑 𝞒 𝞓 𝞔 𝞕 𝞖 𝞗 𝞘 +𝞙 𝞚 𝞛 𝞜 𝞝 𝞞 𝞟 𝞠 +𝞡 𝞢 𝞣 𝞤 𝞥 𝞦 𝞧 𝞨 +𝞩 𝞪 𝞫 𝞬 𝞭 𝞮 𝞯 𝞰 +𝞱 𝞲 𝞳 𝞴 𝞵 𝞶 𝞷 𝞸 +𝞹 𝞺 𝞻 𝞼 𝞽 𝞾 𝞿 𝟀 +𝟁 𝟂 𝟃 𝟄 𝟅 𝟆 𝟇 𝟈 +𝟉 𝟊 𝟋 𝟎 𝟏 𝟐 𝟑 𝟒 +𝟓 𝟔 𝟕 𝟖 𝟗 𝟘 𝟙 𝟚 +𝟛 𝟜 𝟝 𝟞 𝟟 𝟠 𝟡 𝟢 +𝟣 𝟤 𝟥 𝟦 𝟧 𝟨 𝟩 𝟪 +𝟫 𝟬 𝟭 𝟮 𝟯 𝟰 𝟱 𝟲 +𝟳 𝟴 𝟵 𝟶 𝟷 𝟸 𝟹 𝟺 +𝟻 𝟼 𝟽 𝟾 𝟿
+ ++ +
0 +1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e +f g h i j k l m n o p q r s t u v w x y z Α Β Γ Δ Ε +Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π +Ρ Σ Τ Υ Φ Χ Ψ Ω α β γ +δ ε ζ η θ ι κ λ μ ν ξ +ο π ρ ς σ τ υ φ χ ψ ω ϐ +ϑ ϕ ϖ ϗ ϙ ϛ ϝ ϟ ϡ А Б +В Г Д Е Ж З И Й К Л +М Н О П Р С Т У Ф Х +Ц Ч Ш Щ Ъ Ы Ь Э Ю Я +а б в г д е ж з и й +к л м н о п р с т у +ф х ц ч ш щ ъ ы ь э +ю я 𝐀 𝐁 𝐂 𝐃 𝐄 𝐅 𝐆 +𝐇 𝐈 𝐉 𝐊 𝐋 𝐌 𝐍 𝐎 +𝐏 𝐐 𝐑 𝐒 𝐓 𝐔 𝐕 𝐖 +𝐗 𝐘 𝐙 𝐚 𝐛 𝐜 𝐝 𝐞 +𝐟 𝐠 𝐡 𝐢 𝐣 𝐤 𝐥 𝐦 +𝐧 𝐨 𝐩 𝐪 𝐫 𝐬 𝐭 𝐮 +𝐯 𝐰 𝐱 𝐲 𝐳 𝐴 𝐵 𝐶 +𝐷 𝐸 𝐹 𝐺 𝐻 𝐼 𝐽 𝐾 +𝐿 𝑀 𝑁 𝑂 𝑃 𝑄 𝑅 𝑆 +𝑇 𝑈 𝑉 𝑊 𝑋 𝑌 𝑍 𝑎 +𝑏 𝑐 𝑑 𝑒 𝑓 𝑔 𝑖 𝑗 +𝑘 𝑙 𝑚 𝑛 𝑜 𝑝 𝑞 𝑟 +𝑠 𝑡 𝑢 𝑣 𝑤 𝑥 𝑦 𝑧 +𝑨 𝑩 𝑪 𝑫 𝑬 𝑭 𝑮 𝑯 +𝑰 𝑱 𝑲 𝑳 𝑴 𝑵 𝑶 𝑷 +𝑸 𝑹 𝑺 𝑻 𝑼 𝑽 𝑾 𝑿 +𝒀 𝒁 𝒂 𝒃 𝒄 𝒅 𝒆 𝒇 +𝒈 𝒉 𝒊 𝒋 𝒌 𝒍 𝒎 𝒏 +𝒐 𝒑 𝒒 𝒓 𝒔 𝒕 𝒖 𝒗 +𝒘 𝒙 𝒚 𝒛 𝒜 𝒞 𝒟 𝒢 +𝒥 𝒦 𝒩 𝒪 𝒫 𝒬 𝒮 𝒯 +𝒰 𝒱 𝒲 𝒳 𝒴 𝒵 𝒶 𝒷 +𝒸 𝒹 𝒻 𝒽 𝒾 𝒿 𝓀 𝓁 +𝓂 𝓃 𝓅 𝓆 𝓇 𝓈 𝓉 𝓊 +𝓋 𝓌 𝓍 𝓎 𝓏 𝓐 𝓑 𝓒 +𝓓 𝓔 𝓕 𝓖 𝓗 𝓘 𝓙 𝓚 +𝓛 𝓜 𝓝 𝓞 𝓟 𝓠 𝓡 𝓢 +𝓣 𝓤 𝓥 𝓦 𝓧 𝓨 𝓩 𝓪 +𝓫 𝓬 𝓭 𝓮 𝓯 𝓰 𝓱 𝓲 +𝓳 𝓴 𝓵 𝓶 𝓷 𝓸 𝓹 𝓺 +𝓻 𝓼 𝓽 𝓾 𝓿 𝔀 𝔁 𝔂 +𝔃 𝔄 𝔅 𝔇 𝔈 𝔉 𝔊 𝔍 +𝔎 𝔏 𝔐 𝔑 𝔒 𝔓 𝔔 𝔖 +𝔗 𝔘 𝔙 𝔚 𝔛 𝔜 𝔞 𝔟 +𝔠 𝔡 𝔢 𝔣 𝔤 𝔥 𝔦 𝔧 +𝔨 𝔩 𝔪 𝔫 𝔬 𝔭 𝔮 𝔯 +𝔰 𝔱 𝔲 𝔳 𝔴 𝔵 𝔶 𝔷 +𝔸 𝔹 𝔻 𝔼 𝔽 𝔾 𝕀 𝕁 +𝕂 𝕃 𝕄 𝕆 𝕊 𝕋 𝕌 𝕍 +𝕎 𝕏 𝕐 𝕒 𝕓 𝕔 𝕕 𝕖 +𝕗 𝕘 𝕙 𝕚 𝕛 𝕜 𝕝 𝕞 +𝕟 𝕠 𝕡 𝕢 𝕣 𝕤 𝕥 𝕦 +𝕧 𝕨 𝕩 𝕪 𝕫 𝕬 𝕭 𝕮 +𝕯 𝕰 𝕱 𝕲 𝕳 𝕴 𝕵 𝕶 +𝕷 𝕸 𝕹 𝕺 𝕻 𝕼 𝕽 𝕾 +𝕿 𝖀 𝖁 𝖂 𝖃 𝖄 𝖅 𝖆 +𝖇 𝖈 𝖉 𝖊 𝖋 𝖌 𝖍 𝖎 +𝖏 𝖐 𝖑 𝖒 𝖓 𝖔 𝖕 𝖖 +𝖗 𝖘 𝖙 𝖚 𝖛 𝖜 𝖝 𝖞 +𝖟 𝖠 𝖡 𝖢 𝖣 𝖤 𝖥 𝖦 +𝖧 𝖨 𝖩 𝖪 𝖫 𝖬 𝖭 𝖮 +𝖯 𝖰 𝖱 𝖲 𝖳 𝖴 𝖵 𝖶 +𝖷 𝖸 𝖹 𝖺 𝖻 𝖼 𝖽 𝖾 +𝖿 𝗀 𝗁 𝗂 𝗃 𝗄 𝗅 𝗆 +𝗇 𝗈 𝗉 𝗊 𝗋 𝗌 𝗍 𝗎 +𝗏 𝗐 𝗑 𝗒 𝗓 𝗔 𝗕 𝗖 +𝗗 𝗘 𝗙 𝗚 𝗛 𝗜 𝗝 𝗞 +𝗟 𝗠 𝗡 𝗢 𝗣 𝗤 𝗥 𝗦 +𝗧 𝗨 𝗩 𝗪 𝗫 𝗬 𝗭 𝗮 +𝗯 𝗰 𝗱 𝗲 𝗳 𝗴 𝗵 𝗶 +𝗷 𝗸 𝗹 𝗺 𝗻 𝗼 𝗽 𝗾 +𝗿 𝘀 𝘁 𝘂 𝘃 𝘄 𝘅 𝘆 +𝘇 𝘈 𝘉 𝘊 𝘋 𝘌 𝘍 𝘎 +𝘏 𝘐 𝘑 𝘒 𝘓 𝘔 𝘕 𝘖 +𝘗 𝘘 𝘙 𝘚 𝘛 𝘜 𝘝 𝘞 +𝘟 𝘠 𝘡 𝘢 𝘣 𝘤 𝘥 𝘦 +𝘧 𝘨 𝘩 𝘪 𝘫 𝘬 𝘭 𝘮 +𝘯 𝘰 𝘱 𝘲 𝘳 𝘴 𝘵 𝘶 +𝘷 𝘸 𝘹 𝘺 𝘻 𝘼 𝘽 𝘾 +𝘿 𝙀 𝙁 𝙂 𝙃 𝙄 𝙅 𝙆 +𝙇 𝙈 𝙉 𝙊 𝙋 𝙌 𝙍 𝙎 +𝙏 𝙐 𝙑 𝙒 𝙓 𝙔 𝙕 𝙖 +𝙗 𝙘 𝙙 𝙚 𝙛 𝙜 𝙝 𝙞 +𝙟 𝙠 𝙡 𝙢 𝙣 𝙤 𝙥 𝙦 +𝙧 𝙨 𝙩 𝙪 𝙫 𝙬 𝙭 𝙮 +𝙯 𝙰 𝙱 𝙲 𝙳 𝙴 𝙵 𝙶 +𝙷 𝙸 𝙹 𝙺 𝙻 𝙼 𝙽 𝙾 +𝙿 𝚀 𝚁 𝚂 𝚃 𝚄 𝚅 𝚆 +𝚇 𝚈 𝚉 𝚊 𝚋 𝚌 𝚍 𝚎 +𝚏 𝚐 𝚑 𝚒 𝚓 𝚔 𝚕 𝚖 +𝚗 𝚘 𝚙 𝚚 𝚛 𝚜 𝚝 𝚞 +𝚟 𝚠 𝚡 𝚢 𝚣 𝚤 𝚥 𝚨 +𝚩 𝚪 𝚫 𝚬 𝚭 𝚮 𝚯 𝚰 +𝚱 𝚲 𝚳 𝚴 𝚵 𝚶 𝚷 𝚸 +𝚹 𝚺 𝚻 𝚼 𝚽 𝚾 𝚿 𝛀 +𝛁 𝛂 𝛃 𝛄 𝛅 𝛆 𝛇 𝛈 +𝛉 𝛊 𝛋 𝛌 𝛍 𝛎 𝛏 𝛐 +𝛑 𝛒 𝛓 𝛔 𝛕 𝛖 𝛗 𝛘 +𝛙 𝛚 𝛛 𝛜 𝛝 𝛞 𝛟 𝛠 +𝛡 𝛢 𝛣 𝛤 𝛥 𝛦 𝛧 𝛨 +𝛩 𝛪 𝛫 𝛬 𝛭 𝛮 𝛯 𝛰 +𝛱 𝛲 𝛳 𝛴 𝛵 𝛶 𝛷 𝛸 +𝛹 𝛺 𝛻 𝛼 𝛽 𝛾 𝛿 𝜀 +𝜁 𝜂 𝜃 𝜄 𝜅 𝜆 𝜇 𝜈 +𝜉 𝜊 𝜋 𝜌 𝜍 𝜎 𝜏 𝜐 +𝜑 𝜒 𝜓 𝜔 𝜕 𝜖 𝜗 𝜘 +𝜙 𝜚 𝜛 𝜜 𝜝 𝜞 𝜟 𝜠 +𝜡 𝜢 𝜣 𝜤 𝜥 𝜦 𝜧 𝜨 +𝜩 𝜪 𝜫 𝜬 𝜭 𝜮 𝜯 𝜰 +𝜱 𝜲 𝜳 𝜴 𝜵 𝜶 𝜷 𝜸 +𝜹 𝜺 𝜻 𝜼 𝜽 𝜾 𝜿 𝝀 +𝝁 𝝂 𝝃 𝝄 𝝅 𝝆 𝝇 𝝈 +𝝉 𝝊 𝝋 𝝌 𝝍 𝝎 𝝏 𝝐 +𝝑 𝝒 𝝓 𝝔 𝝕 𝝖 𝝗 𝝘 +𝝙 𝝚 𝝛 𝝜 𝝝 𝝞 𝝟 𝝠 +𝝡 𝝢 𝝣 𝝤 𝝥 𝝦 𝝧 𝝨 +𝝩 𝝪 𝝫 𝝬 𝝭 𝝮 𝝯 𝝰 +𝝱 𝝲 𝝳 𝝴 𝝵 𝝶 𝝷 𝝸 +𝝹 𝝺 𝝻 𝝼 𝝽 𝝾 𝝿 𝞀 +𝞁 𝞂 𝞃 𝞄 𝞅 𝞆 𝞇 𝞈 +𝞉 𝞊 𝞋 𝞌 𝞍 𝞎 𝞏 𝞐 +𝞑 𝞒 𝞓 𝞔 𝞕 𝞖 𝞗 𝞘 +𝞙 𝞚 𝞛 𝞜 𝞝 𝞞 𝞟 𝞠 +𝞡 𝞢 𝞣 𝞤 𝞥 𝞦 𝞧 𝞨 +𝞩 𝞪 𝞫 𝞬 𝞭 𝞮 𝞯 𝞰 +𝞱 𝞲 𝞳 𝞴 𝞵 𝞶 𝞷 𝞸 +𝞹 𝞺 𝞻 𝞼 𝞽 𝞾 𝞿 𝟀 +𝟁 𝟂 𝟃 𝟄 𝟅 𝟆 𝟇 𝟈 +𝟉 𝟊 𝟋 𝟎 𝟏 𝟐 𝟑 𝟒 +𝟓 𝟔 𝟕 𝟖 𝟗 𝟘 𝟙 𝟚 +𝟛 𝟜 𝟝 𝟞 𝟟 𝟠 𝟡 𝟢 +𝟣 𝟤 𝟥 𝟦 𝟧 𝟨 𝟩 𝟪 +𝟫 𝟬 𝟭 𝟮 𝟯 𝟰 𝟱 𝟲 +𝟳 𝟴 𝟵 𝟶 𝟷 𝟸 𝟹 𝟺 +𝟻 𝟼 𝟽 𝟾 𝟿
+ ++ +
0 +1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e +f g h i j k l m n o p q r s t u v w x y z Α Β Γ Δ Ε +Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π +Ρ Σ Τ Υ Φ Χ Ψ Ω α β γ +δ ε ζ η θ ι κ λ μ ν ξ +ο π ρ ς σ τ υ φ χ ψ ω ϐ +ϑ ϕ ϖ ϗ ϙ ϛ ϝ ϟ ϡ А Б +В Г Д Е Ж З И Й К Л +М Н О П Р С Т У Ф Х +Ц Ч Ш Щ Ъ Ы Ь Э Ю Я +а б в г д е ж з и й +к л м н о п р с т у +ф х ц ч ш щ ъ ы ь э +ю я 𝐀 𝐁 𝐂 𝐃 𝐄 𝐅 𝐆 +𝐇 𝐈 𝐉 𝐊 𝐋 𝐌 𝐍 𝐎 +𝐏 𝐐 𝐑 𝐒 𝐓 𝐔 𝐕 𝐖 +𝐗 𝐘 𝐙 𝐚 𝐛 𝐜 𝐝 𝐞 +𝐟 𝐠 𝐡 𝐢 𝐣 𝐤 𝐥 𝐦 +𝐧 𝐨 𝐩 𝐪 𝐫 𝐬 𝐭 𝐮 +𝐯 𝐰 𝐱 𝐲 𝐳 𝐴 𝐵 𝐶 +𝐷 𝐸 𝐹 𝐺 𝐻 𝐼 𝐽 𝐾 +𝐿 𝑀 𝑁 𝑂 𝑃 𝑄 𝑅 𝑆 +𝑇 𝑈 𝑉 𝑊 𝑋 𝑌 𝑍 𝑎 +𝑏 𝑐 𝑑 𝑒 𝑓 𝑔 𝑖 𝑗 +𝑘 𝑙 𝑚 𝑛 𝑜 𝑝 𝑞 𝑟 +𝑠 𝑡 𝑢 𝑣 𝑤 𝑥 𝑦 𝑧 +𝑨 𝑩 𝑪 𝑫 𝑬 𝑭 𝑮 𝑯 +𝑰 𝑱 𝑲 𝑳 𝑴 𝑵 𝑶 𝑷 +𝑸 𝑹 𝑺 𝑻 𝑼 𝑽 𝑾 𝑿 +𝒀 𝒁 𝒂 𝒃 𝒄 𝒅 𝒆 𝒇 +𝒈 𝒉 𝒊 𝒋 𝒌 𝒍 𝒎 𝒏 +𝒐 𝒑 𝒒 𝒓 𝒔 𝒕 𝒖 𝒗 +𝒘 𝒙 𝒚 𝒛 𝒜 𝒞 𝒟 𝒢 +𝒥 𝒦 𝒩 𝒪 𝒫 𝒬 𝒮 𝒯 +𝒰 𝒱 𝒲 𝒳 𝒴 𝒵 𝒶 𝒷 +𝒸 𝒹 𝒻 𝒽 𝒾 𝒿 𝓀 𝓁 +𝓂 𝓃 𝓅 𝓆 𝓇 𝓈 𝓉 𝓊 +𝓋 𝓌 𝓍 𝓎 𝓏 𝓐 𝓑 𝓒 +𝓓 𝓔 𝓕 𝓖 𝓗 𝓘 𝓙 𝓚 +𝓛 𝓜 𝓝 𝓞 𝓟 𝓠 𝓡 𝓢 +𝓣 𝓤 𝓥 𝓦 𝓧 𝓨 𝓩 𝓪 +𝓫 𝓬 𝓭 𝓮 𝓯 𝓰 𝓱 𝓲 +𝓳 𝓴 𝓵 𝓶 𝓷 𝓸 𝓹 𝓺 +𝓻 𝓼 𝓽 𝓾 𝓿 𝔀 𝔁 𝔂 +𝔃 𝔄 𝔅 𝔇 𝔈 𝔉 𝔊 𝔍 +𝔎 𝔏 𝔐 𝔑 𝔒 𝔓 𝔔 𝔖 +𝔗 𝔘 𝔙 𝔚 𝔛 𝔜 𝔞 𝔟 +𝔠 𝔡 𝔢 𝔣 𝔤 𝔥 𝔦 𝔧 +𝔨 𝔩 𝔪 𝔫 𝔬 𝔭 𝔮 𝔯 +𝔰 𝔱 𝔲 𝔳 𝔴 𝔵 𝔶 𝔷 +𝔸 𝔹 𝔻 𝔼 𝔽 𝔾 𝕀 𝕁 +𝕂 𝕃 𝕄 𝕆 𝕊 𝕋 𝕌 𝕍 +𝕎 𝕏 𝕐 𝕒 𝕓 𝕔 𝕕 𝕖 +𝕗 𝕘 𝕙 𝕚 𝕛 𝕜 𝕝 𝕞 +𝕟 𝕠 𝕡 𝕢 𝕣 𝕤 𝕥 𝕦 +𝕧 𝕨 𝕩 𝕪 𝕫 𝕬 𝕭 𝕮 +𝕯 𝕰 𝕱 𝕲 𝕳 𝕴 𝕵 𝕶 +𝕷 𝕸 𝕹 𝕺 𝕻 𝕼 𝕽 𝕾 +𝕿 𝖀 𝖁 𝖂 𝖃 𝖄 𝖅 𝖆 +𝖇 𝖈 𝖉 𝖊 𝖋 𝖌 𝖍 𝖎 +𝖏 𝖐 𝖑 𝖒 𝖓 𝖔 𝖕 𝖖 +𝖗 𝖘 𝖙 𝖚 𝖛 𝖜 𝖝 𝖞 +𝖟 𝖠 𝖡 𝖢 𝖣 𝖤 𝖥 𝖦 +𝖧 𝖨 𝖩 𝖪 𝖫 𝖬 𝖭 𝖮 +𝖯 𝖰 𝖱 𝖲 𝖳 𝖴 𝖵 𝖶 +𝖷 𝖸 𝖹 𝖺 𝖻 𝖼 𝖽 𝖾 +𝖿 𝗀 𝗁 𝗂 𝗃 𝗄 𝗅 𝗆 +𝗇 𝗈 𝗉 𝗊 𝗋 𝗌 𝗍 𝗎 +𝗏 𝗐 𝗑 𝗒 𝗓 𝗔 𝗕 𝗖 +𝗗 𝗘 𝗙 𝗚 𝗛 𝗜 𝗝 𝗞 +𝗟 𝗠 𝗡 𝗢 𝗣 𝗤 𝗥 𝗦 +𝗧 𝗨 𝗩 𝗪 𝗫 𝗬 𝗭 𝗮 +𝗯 𝗰 𝗱 𝗲 𝗳 𝗴 𝗵 𝗶 +𝗷 𝗸 𝗹 𝗺 𝗻 𝗼 𝗽 𝗾 +𝗿 𝘀 𝘁 𝘂 𝘃 𝘄 𝘅 𝘆 +𝘇 𝘈 𝘉 𝘊 𝘋 𝘌 𝘍 𝘎 +𝘏 𝘐 𝘑 𝘒 𝘓 𝘔 𝘕 𝘖 +𝘗 𝘘 𝘙 𝘚 𝘛 𝘜 𝘝 𝘞 +𝘟 𝘠 𝘡 𝘢 𝘣 𝘤 𝘥 𝘦 +𝘧 𝘨 𝘩 𝘪 𝘫 𝘬 𝘭 𝘮 +𝘯 𝘰 𝘱 𝘲 𝘳 𝘴 𝘵 𝘶 +𝘷 𝘸 𝘹 𝘺 𝘻 𝘼 𝘽 𝘾 +𝘿 𝙀 𝙁 𝙂 𝙃 𝙄 𝙅 𝙆 +𝙇 𝙈 𝙉 𝙊 𝙋 𝙌 𝙍 𝙎 +𝙏 𝙐 𝙑 𝙒 𝙓 𝙔 𝙕 𝙖 +𝙗 𝙘 𝙙 𝙚 𝙛 𝙜 𝙝 𝙞 +𝙟 𝙠 𝙡 𝙢 𝙣 𝙤 𝙥 𝙦 +𝙧 𝙨 𝙩 𝙪 𝙫 𝙬 𝙭 𝙮 +𝙯 𝙰 𝙱 𝙲 𝙳 𝙴 𝙵 𝙶 +𝙷 𝙸 𝙹 𝙺 𝙻 𝙼 𝙽 𝙾 +𝙿 𝚀 𝚁 𝚂 𝚃 𝚄 𝚅 𝚆 +𝚇 𝚈 𝚉 𝚊 𝚋 𝚌 𝚍 𝚎 +𝚏 𝚐 𝚑 𝚒 𝚓 𝚔 𝚕 𝚖 +𝚗 𝚘 𝚙 𝚚 𝚛 𝚜 𝚝 𝚞 +𝚟 𝚠 𝚡 𝚢 𝚣 𝚤 𝚥 𝚨 +𝚩 𝚪 𝚫 𝚬 𝚭 𝚮 𝚯 𝚰 +𝚱 𝚲 𝚳 𝚴 𝚵 𝚶 𝚷 𝚸 +𝚹 𝚺 𝚻 𝚼 𝚽 𝚾 𝚿 𝛀 +𝛁 𝛂 𝛃 𝛄 𝛅 𝛆 𝛇 𝛈 +𝛉 𝛊 𝛋 𝛌 𝛍 𝛎 𝛏 𝛐 +𝛑 𝛒 𝛓 𝛔 𝛕 𝛖 𝛗 𝛘 +𝛙 𝛚 𝛛 𝛜 𝛝 𝛞 𝛟 𝛠 +𝛡 𝛢 𝛣 𝛤 𝛥 𝛦 𝛧 𝛨 +𝛩 𝛪 𝛫 𝛬 𝛭 𝛮 𝛯 𝛰 +𝛱 𝛲 𝛳 𝛴 𝛵 𝛶 𝛷 𝛸 +𝛹 𝛺 𝛻 𝛼 𝛽 𝛾 𝛿 𝜀 +𝜁 𝜂 𝜃 𝜄 𝜅 𝜆 𝜇 𝜈 +𝜉 𝜊 𝜋 𝜌 𝜍 𝜎 𝜏 𝜐 +𝜑 𝜒 𝜓 𝜔 𝜕 𝜖 𝜗 𝜘 +𝜙 𝜚 𝜛 𝜜 𝜝 𝜞 𝜟 𝜠 +𝜡 𝜢 𝜣 𝜤 𝜥 𝜦 𝜧 𝜨 +𝜩 𝜪 𝜫 𝜬 𝜭 𝜮 𝜯 𝜰 +𝜱 𝜲 𝜳 𝜴 𝜵 𝜶 𝜷 𝜸 +𝜹 𝜺 𝜻 𝜼 𝜽 𝜾 𝜿 𝝀 +𝝁 𝝂 𝝃 𝝄 𝝅 𝝆 𝝇 𝝈 +𝝉 𝝊 𝝋 𝝌 𝝍 𝝎 𝝏 𝝐 +𝝑 𝝒 𝝓 𝝔 𝝕 𝝖 𝝗 𝝘 +𝝙 𝝚 𝝛 𝝜 𝝝 𝝞 𝝟 𝝠 +𝝡 𝝢 𝝣 𝝤 𝝥 𝝦 𝝧 𝝨 +𝝩 𝝪 𝝫 𝝬 𝝭 𝝮 𝝯 𝝰 +𝝱 𝝲 𝝳 𝝴 𝝵 𝝶 𝝷 𝝸 +𝝹 𝝺 𝝻 𝝼 𝝽 𝝾 𝝿 𝞀 +𝞁 𝞂 𝞃 𝞄 𝞅 𝞆 𝞇 𝞈 +𝞉 𝞊 𝞋 𝞌 𝞍 𝞎 𝞏 𝞐 +𝞑 𝞒 𝞓 𝞔 𝞕 𝞖 𝞗 𝞘 +𝞙 𝞚 𝞛 𝞜 𝞝 𝞞 𝞟 𝞠 +𝞡 𝞢 𝞣 𝞤 𝞥 𝞦 𝞧 𝞨 +𝞩 𝞪 𝞫 𝞬 𝞭 𝞮 𝞯 𝞰 +𝞱 𝞲 𝞳 𝞴 𝞵 𝞶 𝞷 𝞸 +𝞹 𝞺 𝞻 𝞼 𝞽 𝞾 𝞿 𝟀 +𝟁 𝟂 𝟃 𝟄 𝟅 𝟆 𝟇 𝟈 +𝟉 𝟊 𝟋 𝟎 𝟏 𝟐 𝟑 𝟒 +𝟓 𝟔 𝟕 𝟖 𝟗 𝟘 𝟙 𝟚 +𝟛 𝟜 𝟝 𝟞 𝟟 𝟠 𝟡 𝟢 +𝟣 𝟤 𝟥 𝟦 𝟧 𝟨 𝟩 𝟪 +𝟫 𝟬 𝟭 𝟮 𝟯 𝟰 𝟱 𝟲 +𝟳 𝟴 𝟵 𝟶 𝟷 𝟸 𝟹 𝟺 +𝟻 𝟼 𝟽 𝟾 𝟿
+ +