From ec36f1cbb07f290ede5dd1f1ccf19b86001effac Mon Sep 17 00:00:00 2001 From: Quajak Date: Fri, 4 Sep 2020 22:53:12 +0200 Subject: [PATCH 01/14] Merge remote-tracking branch 'origin/master' From e62eae14145ed1fbed92ca013fafdaa27133f5e6 Mon Sep 17 00:00:00 2001 From: Quajak Date: Mon, 7 Sep 2020 00:23:27 +0200 Subject: [PATCH 02/14] Added plugs for Convert.ToString Fixed int.ToString("x") --- .../Cosmos.Compiler.Tests.Bcl/Kernel.cs | 1 + .../System/ConvertTests.cs | 23 +++++++ .../Cosmos.System2_Plugs/System/Int32Impl.cs | 5 ++ .../System/ParseNumbersImpl.cs | 68 +++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ConvertTests.cs create mode 100644 source/Cosmos.System2_Plugs/System/ParseNumbersImpl.cs diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Kernel.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Kernel.cs index a566becf6..a1e35d8ca 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Kernel.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Kernel.cs @@ -39,6 +39,7 @@ namespace Cosmos.Compiler.Tests.Bcl DelegatesTest.Execute(); EventsTest.Execute(); RandomTests.Execute(); + ConvertTests.Execute(); // System.Collections HashtableTest.Execute(); diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ConvertTests.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ConvertTests.cs new file mode 100644 index 000000000..09ab43962 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ConvertTests.cs @@ -0,0 +1,23 @@ +using Cosmos.TestRunner; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + public static class ConvertTests + { + public static void Execute() + { + Assert.AreEqual("1010", Convert.ToString(10, 2), "Convert.ToString(int, 2) works"); + Assert.AreEqual("12", Convert.ToString(10, 8), "Convert.ToString(int, 8) works"); + Assert.AreEqual("10", Convert.ToString(10, 10), "Convert.ToString(int, 10) works"); + Assert.AreEqual("A", Convert.ToString(10, 16), "Convert.ToString(int, 16) works"); + Assert.AreEqual("11000100000", Convert.ToString(1568, 2), "Convert.ToString(int, 2) works"); + Assert.AreEqual("3040", Convert.ToString(1568, 8), "Convert.ToString(int, 8) works"); + Assert.AreEqual("1568", Convert.ToString(1568, 10), "Convert.ToString(int, 10) works"); + Assert.AreEqual("620", Convert.ToString(1568, 16), "Convert.ToString(int, 16) works"); + + } + } +} diff --git a/source/Cosmos.System2_Plugs/System/Int32Impl.cs b/source/Cosmos.System2_Plugs/System/Int32Impl.cs index 0c65a0b35..b9ccbce72 100644 --- a/source/Cosmos.System2_Plugs/System/Int32Impl.cs +++ b/source/Cosmos.System2_Plugs/System/Int32Impl.cs @@ -20,6 +20,11 @@ namespace Cosmos.System_Plugs.System { string result = ""; + if(aThis == 0) + { + result = "0"; + } + while (aThis != 0) { if ((aThis % 16) < 10) diff --git a/source/Cosmos.System2_Plugs/System/ParseNumbersImpl.cs b/source/Cosmos.System2_Plugs/System/ParseNumbersImpl.cs new file mode 100644 index 000000000..1b712789f --- /dev/null +++ b/source/Cosmos.System2_Plugs/System/ParseNumbersImpl.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Cosmos.Common.Extensions; +using IL2CPU.API.Attribs; + +namespace Cosmos.System_Plugs.System +{ + [Plug(TargetName = "System.ParseNumbers, System.Private.CoreLib")] + class ParseNumbersImpl + { + public static string IntToString(int value, int radix, int width, char paddingChar, int flags) + { + if (flags != 0) + { + throw new NotImplementedException("IntToString with non-zero flags is not supported"); + } + string valueString = ""; + + if (radix == 2 || radix == 8 || radix == 16) + { + int shiftRightAmount = 1; + if (radix == 8) + { + shiftRightAmount = 3; + } + else if (radix == 16) + { + shiftRightAmount = 4; + } + if (value < 0) + { + throw new NotImplementedException(); + } + while (value > 0) + { + valueString = (value % radix).ToString("X") + valueString; + value >>= shiftRightAmount; + } + } + else if (radix == 10) + { + valueString = value.ToString(); + } + else + { + throw new ArgumentException(nameof(radix)); + } + + if (width == -1) + { + return valueString; + } + + if (valueString.Length > width) + { + throw new NotImplementedException("IntToString Case not handled when value is longer than width"); + } + + int count = width - valueString.Length; + for (int i = 0; i < count; i++) + { + valueString = paddingChar + valueString; + } + return valueString; + } + } +} From b322e1eafa1cbbcc3e96e13a16fc7f14281bf94a Mon Sep 17 00:00:00 2001 From: Quajak Date: Mon, 7 Sep 2020 16:09:06 +0200 Subject: [PATCH 03/14] Added new issue templates Proposed new issue template --- .github/ISSUE_TEMPLATE/bug_report.md | 22 ++++++++++++++ .../build-error-and-visual-studio-problems.md | 29 +++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 22 ++++++++++++++ .github/ISSUE_TEMPLATE/installation-error.md | 28 ++++++++++++++++++ .../ISSUE_TEMPLATE/installation-problem.md | 28 ++++++++++++++++++ .github/ISSUE_TEMPLATE/plug-request.md | 20 +++++++++++++ 6 files changed, 149 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/build-error-and-visual-studio-problems.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/installation-error.md create mode 100644 .github/ISSUE_TEMPLATE/installation-problem.md create mode 100644 .github/ISSUE_TEMPLATE/plug-request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..aa359040c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,22 @@ +--- +name: Bug report +about: For bugs in Cosmos +title: '' +labels: Bug +assignees: '' + +--- + +#### Area of Cosmos - What area of Cosmos are we dealing with? + + +#### Expected Behaviour - What do you think that should happen? + + +#### Actual Behaviour - What unexpectedly happens? + + +#### Reproduction - How did you get this error to appear? + + +#### Version - Were you using the User Kit or Dev Kit? And what User Kit version or Dev Kit commit (Cosmos, IL2CPU, X#)? diff --git a/.github/ISSUE_TEMPLATE/build-error-and-visual-studio-problems.md b/.github/ISSUE_TEMPLATE/build-error-and-visual-studio-problems.md new file mode 100644 index 000000000..8125653cb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/build-error-and-visual-studio-problems.md @@ -0,0 +1,29 @@ +--- +name: Build Error and Visual Studio Problems +about: For errors when trying to build a Cosmos Kernel or use VS +title: '' +labels: '' +assignees: '' + +--- + +Have you checked Github Issues for similar errors? + +**Exception** +Post the exception returned by Visual Studio + +** VS Output Logs ** +Post the entire output log given by Visual Studio for the build + +**To Reproduce** +Describe any changes done to a clean kernel for this error to occur. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Context** +Before posting please confirm that the following are in order +[ ] Both Cosmos VS Extensions are installed +[ ] The Cosmos nuget packages are installed + +Add any other context about the problem which might be helpful. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..5c6c65b4d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,22 @@ +--- +name: Feature request +about: Suggest an idea for Cosmos +title: '' +labels: Question +assignees: '' + +--- + +Have you checked for similar suggestions? + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/installation-error.md b/.github/ISSUE_TEMPLATE/installation-error.md new file mode 100644 index 000000000..a88743776 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/installation-error.md @@ -0,0 +1,28 @@ +--- +name: Installation Error +about: For errors while trying to install Cosmos +title: '' +labels: 'Area: Installer' +assignees: '' + +--- + +**Describe the problem** +A clear and concise description of where the installation is going wrong. + +**Steps of installation up to now** +Steps to reproduce the behavior: + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Logs** +Please post the entire log given by Cosmos. For long logs please use pastebin. + +**Steup (please complete the following information):** + - Cosmos Version (Userkit/Devkit) + - Are you using an admin account? + - VS Version if applicable + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/installation-problem.md b/.github/ISSUE_TEMPLATE/installation-problem.md new file mode 100644 index 000000000..10e737726 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/installation-problem.md @@ -0,0 +1,28 @@ +--- +name: Installation Problem +about: Create a report to help us improve +title: '' +labels: 'Area: Installer' +assignees: '' + +--- + +**Describe the problem** +A clear and concise description of where the installation is going wrong. + +**Steps of installation up to now** +Steps to reproduce the behavior: + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Logs** +Please post the entire log given by Cosmos. For long logs please use pastebin. + +**Steup (please complete the following information):** + - Cosmos Version (Userkit/Devkit) + - Are you using an admin account? + - VS Version if applicable + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/plug-request.md b/.github/ISSUE_TEMPLATE/plug-request.md new file mode 100644 index 000000000..f073317d1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/plug-request.md @@ -0,0 +1,20 @@ +--- +name: Plug request +about: Suggest that a certain method should be plugged +title: '' +labels: '' +assignees: '' + +--- + +**What is the usecase for this plug** +A clear and concise description of where the plug is needed + +** Complexity of plug ** +Can this plug be added without requiring new drivers or a lot of work? (Methods requiring Linq, Reflection or Networking etc. are too complex for this request) + +**Describe alternatives you've considered** +Are there ways to work around this plug not existing? + +**Additional context** +Add any other context about the plug request here. From 9d59f91e40de2fdb776592b8653487a69635061b Mon Sep 17 00:00:00 2001 From: Quajak Date: Mon, 7 Sep 2020 20:36:52 +0200 Subject: [PATCH 04/14] Fixed typo and reworded a few points --- .github/ISSUE_TEMPLATE/installation-problem.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/installation-problem.md b/.github/ISSUE_TEMPLATE/installation-problem.md index 10e737726..daceee95c 100644 --- a/.github/ISSUE_TEMPLATE/installation-problem.md +++ b/.github/ISSUE_TEMPLATE/installation-problem.md @@ -8,10 +8,10 @@ assignees: '' --- **Describe the problem** -A clear and concise description of where the installation is going wrong. +A clear and concise description of where the installation is going wrong/what error messages you got. **Steps of installation up to now** -Steps to reproduce the behavior: +What steps of the installation have you done up to now: **Expected behavior** A clear and concise description of what you expected to happen. @@ -19,7 +19,7 @@ A clear and concise description of what you expected to happen. **Logs** Please post the entire log given by Cosmos. For long logs please use pastebin. -**Steup (please complete the following information):** +**Setup (please complete the following information):** - Cosmos Version (Userkit/Devkit) - Are you using an admin account? - VS Version if applicable From e1bda335ab68db0b64f82e903fc77a4f86a06ce5 Mon Sep 17 00:00:00 2001 From: Quajak Date: Sat, 19 Sep 2020 21:44:28 +0200 Subject: [PATCH 05/14] Fix deleting of directories with small offset (most commonly subdirectories) --- .../System.IO/DirectoryTest.cs | 23 ++++++++----------- .../FAT/Listing/FatDiretoryEntry.cs | 23 +++++++++++++++---- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DirectoryTest.cs b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DirectoryTest.cs index c77b509b5..465dbb173 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DirectoryTest.cs +++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DirectoryTest.cs @@ -12,7 +12,6 @@ namespace Cosmos.Kernel.Tests.Fat.System.IO /// public static void Execute(Debugger mDebugger) { - mDebugger.Send("START TEST: Delete a directory:"); Directory.CreateDirectory(@"0:\TestDir1"); Assert.IsTrue(Directory.Exists(@"0:\TestDir1"), "TestDir1 wasn't created!"); @@ -97,22 +96,20 @@ namespace Cosmos.Kernel.Tests.Fat.System.IO mDebugger.Send(""); -#if false - mDebugger.Send("START TEST: Delete a file with Directory.Delete:"); - File.Create(@"0:\file1.txt"); + mDebugger.Send("START TEST: Creating a subdirecty with Directory.CreateDirectory:"); - try - { - Directory.Delete(@"0:\file1.txt"); - } - catch (Exception e) - { - Assert.IsTrue(File.Exists(@"0:\file1.txt"), "The file was deleted by Directory.Delete."); - } + Directory.CreateDirectory(@"0:\TestDir1"); + Assert.IsTrue(Directory.Exists(@"0:\TestDir1"), "TestDir1 was created!"); + Directory.CreateDirectory(@"0:\TestDir1\test"); + Assert.IsTrue(Directory.Exists(@"0:\TestDir1\test"), "test subdirectory was created!"); + Directory.Delete(@"0:\TestDir1\test"); + Assert.IsFalse(Directory.Exists(@"0:\TestDir1\test"), "test subdirectory was deleted!"); + Directory.Delete(@"0:\TestDir1"); + Assert.IsFalse(Directory.Exists(@"0:\TestDir1"), "TestDir1 was deleted!"); mDebugger.Send("END TEST"); mDebugger.Send(""); -#endif + mDebugger.Send("START TEST: Create a directory with a Long Filename:"); Directory.CreateDirectory(@"0:\TestDir1"); diff --git a/source/Cosmos.System2/FileSystem/FAT/Listing/FatDiretoryEntry.cs b/source/Cosmos.System2/FileSystem/FAT/Listing/FatDiretoryEntry.cs index 55c1da0fc..c66dcb93d 100644 --- a/source/Cosmos.System2/FileSystem/FAT/Listing/FatDiretoryEntry.cs +++ b/source/Cosmos.System2/FileSystem/FAT/Listing/FatDiretoryEntry.cs @@ -512,6 +512,8 @@ namespace Cosmos.System.FileSystem.FAT.Listing /// Thrown when FAT type is unknown. public void DeleteDirectoryEntry() { + Global.mFileSystemDebugger.SendInternal("-- FatDirectoryEntry.DeleteDirectoryEntry --"); + if (mEntryType == DirectoryEntryTypeEnum.Unknown) { throw new NotImplementedException(); @@ -524,12 +526,17 @@ namespace Cosmos.System.FileSystem.FAT.Listing var xData = ((FatDirectoryEntry)mParent).GetDirectoryEntryData(); - var xEntryOffset = mEntryHeaderDataOffset - 32; - - while (xData[xEntryOffset + 11] == FatDirectoryEntryAttributeConsts.LongName) + if(mEntryHeaderDataOffset > 32) { - xData[xEntryOffset] = FatDirectoryEntryAttributeConsts.UnusedOrDeletedEntry; - xEntryOffset -= 32; + var xEntryOffset = mEntryHeaderDataOffset - 32; + + Global.mFileSystemDebugger.SendInternal("xEntryOffset: " + xEntryOffset); + + while (xData[xEntryOffset + 11] == FatDirectoryEntryAttributeConsts.LongName) + { + xData[xEntryOffset] = FatDirectoryEntryAttributeConsts.UnusedOrDeletedEntry; + xEntryOffset -= 32; + } } ((FatDirectoryEntry)mParent).SetDirectoryEntryData(xData); @@ -988,6 +995,7 @@ namespace Cosmos.System.FileSystem.FAT.Listing internal void SetDirectoryEntryMetadataValue(FatDirectoryEntryMetadata aEntryMetadata, byte aValue) { Global.mFileSystemDebugger.SendInternal(" -- FatDirectoryEntry.SetDirectoryEntryMetadataValue(uint) --"); + Global.mFileSystemDebugger.SendInternal("aEntryMetadata = " + aEntryMetadata.DataOffset); Global.mFileSystemDebugger.SendInternal("aValue = " + aValue); if (IsRootDirectory()) @@ -1043,6 +1051,7 @@ namespace Cosmos.System.FileSystem.FAT.Listing internal void SetDirectoryEntryMetadataValue(FatDirectoryEntryMetadata aEntryMetadata, ushort aValue) { Global.mFileSystemDebugger.SendInternal(" -- FatDirectoryEntry.SetDirectoryEntryMetadataValue(uint) --"); + Global.mFileSystemDebugger.SendInternal("aEntryMetadata = " + aEntryMetadata.DataOffset); Global.mFileSystemDebugger.SendInternal("aValue = " + aValue); if (IsRootDirectory()) @@ -1054,6 +1063,7 @@ namespace Cosmos.System.FileSystem.FAT.Listing if (xData.Length > 0) { + Global.mFileSystemDebugger.SendInternal("mEntryHeaderDataOffset = " + mEntryHeaderDataOffset); var xValue = new byte[aEntryMetadata.DataLength]; xValue.SetUInt16(0, aValue); uint offset = mEntryHeaderDataOffset + aEntryMetadata.DataOffset; @@ -1100,6 +1110,7 @@ namespace Cosmos.System.FileSystem.FAT.Listing internal void SetDirectoryEntryMetadataValue(FatDirectoryEntryMetadata aEntryMetadata, uint aValue) { Global.mFileSystemDebugger.SendInternal(" -- FatDirectoryEntry.SetDirectoryEntryMetadataValue(uint) --"); + Global.mFileSystemDebugger.SendInternal("aEntryMetadata = " + aEntryMetadata.DataOffset); Global.mFileSystemDebugger.SendInternal("aValue = " + aValue); if (IsRootDirectory()) @@ -1157,6 +1168,7 @@ namespace Cosmos.System.FileSystem.FAT.Listing internal void SetDirectoryEntryMetadataValue(FatDirectoryEntryMetadata aEntryMetadata, long aValue) { Global.mFileSystemDebugger.SendInternal("-- FatDirectoryEntry.SetDirectoryEntryMetadataValue(long) --"); + Global.mFileSystemDebugger.SendInternal("aEntryMetadata = " + aEntryMetadata.DataOffset); Global.mFileSystemDebugger.SendInternal("aValue ="); Global.mFileSystemDebugger.SendInternal(aValue); @@ -1218,6 +1230,7 @@ namespace Cosmos.System.FileSystem.FAT.Listing internal void SetDirectoryEntryMetadataValue(FatDirectoryEntryMetadata aEntryMetadata, string aValue) { Global.mFileSystemDebugger.SendInternal("-- FatDirectoryEntry.SetDirectoryEntryMetadataValue(string) --"); + Global.mFileSystemDebugger.SendInternal("aEntryMetadata = " + aEntryMetadata.DataOffset); Global.mFileSystemDebugger.SendInternal($"aValue = {aValue}"); if (IsRootDirectory()) From 0d426695acd1d7bce3d60ccae7a980aa1f2e7988 Mon Sep 17 00:00:00 2001 From: Quajak Date: Sun, 20 Sep 2020 17:41:35 +0200 Subject: [PATCH 06/14] Added plug for Multiboot.GetMBIAddress() --- Tests/Kernels/ProcessorTests/Kernel.cs | 6 ++++++ source/Cosmos.Core_Asm/MultibootImpl.cs | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Tests/Kernels/ProcessorTests/Kernel.cs b/Tests/Kernels/ProcessorTests/Kernel.cs index 93f9588cc..a4e195ff5 100644 --- a/Tests/Kernels/ProcessorTests/Kernel.cs +++ b/Tests/Kernels/ProcessorTests/Kernel.cs @@ -25,6 +25,7 @@ namespace ProcessorTests TestVendorNameIsNotBlank(); TestCycleCount(); TestCycleRateIsNotZero(); + TestMultiboot(); TestController.Completed(); } @@ -36,6 +37,11 @@ namespace ProcessorTests } } + public void TestMultiboot() + { + Assert.IsTrue(Multiboot.GetMBIAddress() != 0, $"Multiboot.GetMBIAddress works {Multiboot.GetMBIAddress()}"); + } + public void TestVendorNameIsNotBlank() { string vendorName = CPU.GetCPUVendorName(); diff --git a/source/Cosmos.Core_Asm/MultibootImpl.cs b/source/Cosmos.Core_Asm/MultibootImpl.cs index d3c9226ac..c2203981f 100644 --- a/source/Cosmos.Core_Asm/MultibootImpl.cs +++ b/source/Cosmos.Core_Asm/MultibootImpl.cs @@ -1,12 +1,25 @@ using Cosmos.Core; using IL2CPU.API.Attribs; +using XSharp; +using XSharp.Assembler; namespace Cosmos.Core_Asm { [Plug(Target = typeof(Multiboot))] public class MultibootImpl { - [PlugMethod(Assembler = typeof(MultibootAsm))] - public static uint GetMBIAddress() => throw null; + [PlugMethod(Assembler = typeof(MultibootImplAsm))] + public static uint GetMBIAddress() + { + return 0; + } + } + + public class MultibootImplAsm : AssemblerMethod + { + public override void AssembleNew(Assembler aAssembler, object aMethodInfo) + { + XS.Push("MultibootSignature"); + } } } From a4d0befbe1cb86052ae11cd3a1a4205b45169df2 Mon Sep 17 00:00:00 2001 From: Quajak Date: Sun, 27 Sep 2020 15:22:14 +0200 Subject: [PATCH 07/14] Made ReadCPUID public Made `ReadCPUID` and `CanReadCPUID` public. --- source/Cosmos.Core/CPU.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Cosmos.Core/CPU.cs b/source/Cosmos.Core/CPU.cs index cda877076..28c849a94 100644 --- a/source/Cosmos.Core/CPU.cs +++ b/source/Cosmos.Core/CPU.cs @@ -252,7 +252,7 @@ namespace Cosmos.Core /// /// non-zero if can read. /// Thrown on fatal error, contact support. - internal static int CanReadCPUID() => throw new NotImplementedException(); + public static int CanReadCPUID() => throw new NotImplementedException(); /// /// Read CPU ID. Plugged. @@ -263,7 +263,7 @@ namespace Cosmos.Core /// ecx. /// edx. /// Thrown on fatal error, contact support. - internal static void ReadCPUID(uint type, ref int eax, ref int ebx, ref int ecx, ref int edx) => throw new NotImplementedException(); + public static void ReadCPUID(uint type, ref int eax, ref int ebx, ref int ecx, ref int edx) => throw new NotImplementedException(); /// /// Read timestamp counter. Plugged. From 980e06453eba12ccd0eb8cecef00ae1848c29a56 Mon Sep 17 00:00:00 2001 From: Charles Betros Date: Mon, 28 Sep 2020 12:19:14 -0500 Subject: [PATCH 08/14] Remove ProcessorInformation Closes #1487 --- source/Cosmos.Core/ProcessorInformation.cs | 64 ------ .../ProcessorInformationImpl.cs | 212 ------------------ .../System/Diagnostics/StopwatchImpl.cs | 2 +- .../System/Threading/ThreadImpl.cs | 6 +- 4 files changed, 4 insertions(+), 280 deletions(-) delete mode 100644 source/Cosmos.Core/ProcessorInformation.cs delete mode 100644 source/Cosmos.Core_Asm/ProcessorInformationImpl.cs diff --git a/source/Cosmos.Core/ProcessorInformation.cs b/source/Cosmos.Core/ProcessorInformation.cs deleted file mode 100644 index 68c2be024..000000000 --- a/source/Cosmos.Core/ProcessorInformation.cs +++ /dev/null @@ -1,64 +0,0 @@ -namespace Cosmos.Core -{ - /// - /// ProcessorInformation class. Used to get vendor information from the CPU. - /// - public unsafe class ProcessorInformation - { - /// - /// Returns the Processor's vendor name - /// - /// CPU Vendor name - public static string GetVendorName() - { - if (CanReadCPUID() > 0) - { - int[] raw = new int[3]; - - fixed (int* ptr = raw) - FetchCPUVendor(ptr); - - return new string(new char[] { - (char)(raw[0] >> 24), - (char)((raw[0] >> 16) & 0xff), - (char)((raw[0] >> 8) & 0xff), - (char)(raw[0] & 0xff), - (char)(raw[1] >> 24), - (char)((raw[1] >> 16) & 0xff), - (char)((raw[1] >> 8) & 0xff), - (char)(raw[1] & 0xff), - (char)(raw[2] >> 24), - (char)((raw[2] >> 16) & 0xff), - (char)((raw[2] >> 8) & 0xff), - (char)(raw[2] & 0xff), - }); - } - else - return "\0"; - } - - /// - /// Check if can read CPU ID. - /// - /// int value. - internal static int CanReadCPUID() => 0; //plugged - - /// - /// Fetch CPU vendor. - /// - /// pointer to target. - internal static void FetchCPUVendor(int* target) { } //plugged - - /// - /// Returns the number of CPU cycles since startup of the current CPU core - /// - /// Number of CPU cycles since startup - public static long GetCycleCount() => 0; //plugged - - /// - /// Returns the number of CPU cycles per seconds - /// - /// Number of CPU cycles per seconds - public static long GetCycleRate() => 0; //plugged - } -} diff --git a/source/Cosmos.Core_Asm/ProcessorInformationImpl.cs b/source/Cosmos.Core_Asm/ProcessorInformationImpl.cs deleted file mode 100644 index 2bd7d4c4a..000000000 --- a/source/Cosmos.Core_Asm/ProcessorInformationImpl.cs +++ /dev/null @@ -1,212 +0,0 @@ -using Cosmos.Core; - -using IL2CPU.API; -using IL2CPU.API.Attribs; - -using XSharp; - -namespace Cosmos.Core_Asm -{ - [Plug(Target = typeof(ProcessorInformation))] - public unsafe class ProcessorInformationImpl - { - /* The following three int*-pointers are needed for the lea instruction due to the following reason: - * When comiling, the IL-code will be translated into x86-ASM, which has specific and unique names for local variables. - * To access these local variables, I have to pass their excat name to the instruction in question. This is rather - * difficult with reflection, if these variables reside in the local function scope. For this reason, I move the - * pointer to class scope to access them quicker and more easily - */ - private static int* __cyclesrdtscptr, __raterdmsrptr, __vendortargetptr; - private static long __ticktate = -1; - - /// - /// Returns the number of CPU cycles since startup - /// - /// Number of CPU cycles - public static long GetCycleCount() - { - int[] val = new int[2]; - - fixed (int* ptr = val) - { - __cyclesrdtsc(ptr); - } - - return ((long)val[0] << 32) | (uint)val[1]; - } - - /// - /// Returns the CPU cycle rate (in cycles/µs) - /// - /// CPU cycle rate - public static long GetCycleRate() - { - if (__ticktate == -1) - { - int[] raw = new int[4]; - - fixed (int* ptr = raw) - { - __raterdmsr(ptr); - } - - ulong l1 = (ulong)__maxrate(); - ulong l2 = ((ulong)raw[0] << 32) | (uint)raw[1]; - ulong l3 = ((ulong)raw[2] << 32) | (uint)raw[3]; - - __ticktate = (long)l2; // (long)((double)l1 * l3 / l2); - } - - return __ticktate; - } - - /// - /// Copies the maximum cpu rate set by the bios at startup to the given int pointer - /// - [Inline] - private static int __maxrate() - { - /* - * mov eax, 16h - * cpuid - * and eax, ffffh - * ret - */ - - XS.Set(XSRegisters.EAX, 0x00000016); - XS.Cpuid(); - XS.And(XSRegisters.EAX, 0x0000ffff); - XS.Return(); - - return 0; - } - - /// - /// Copies the cycle count to the given int pointer - /// - [Inline] - private static void __cyclesrdtsc(int* target) - { - /* - * push eax - * push ecx - * push edx - * lea esi, target - * rdtsc - * mov [esi+4], eax - * mov [esi], edx - * pop edx - * pop ecx - * pop eax - * ret - */ - __cyclesrdtscptr = target; - - string intname = LabelName.GetStaticFieldName(typeof(CPUImpl).GetField(nameof(__cyclesrdtscptr))); - - XS.Push(XSRegisters.EAX); - XS.Push(XSRegisters.ECX); - XS.Push(XSRegisters.EDX); - XS.Lea(XSRegisters.ESI, intname); - XS.Rdtsc(); - XS.Set(XSRegisters.ESI, XSRegisters.EAX, destinationIsIndirect: true, destinationDisplacement: 4); - XS.Set(XSRegisters.ESI, XSRegisters.EDX, destinationIsIndirect: true); - XS.Push(XSRegisters.EDX); - XS.Push(XSRegisters.ECX); - XS.Push(XSRegisters.EAX); - XS.Return(); - } - - /// - /// Copies the cycle rate to the given int pointer - /// - [Inline] - private static void __raterdmsr(int* target) - { - /* - * ; esi register layout: (mperf_hi, mperf_lo, aperf_hi, aperf_lo) - * ; - * ; int* ptr = new int[4]; - * ; - * lea esi, ptr ;equivalent with `mov esi, &ptr` - * mov ecx, e7h - * rdmsr - * mov [esi + 4], eax - * mov [esi], edx - * mov ecx, e8h - * rdmsr - * mov [esi + 12], eax - * mov [esi + 8], edx - * xor eax, eax - * ret - */ - __raterdmsrptr = target; - - string intname = LabelName.GetStaticFieldName(typeof(CPUImpl).GetField(nameof(__raterdmsrptr))); - - XS.Lea(XSRegisters.ESI, intname); - XS.Set(XSRegisters.ECX, 0xe7); - XS.Rdmsr(); - XS.Set(XSRegisters.EAX, XSRegisters.ESI, destinationIsIndirect: true, destinationDisplacement: 4); - XS.Set(XSRegisters.EDX, XSRegisters.ESI, destinationIsIndirect: true, destinationDisplacement: 0); - XS.Set(XSRegisters.ECX, 0xe8); - XS.Rdmsr(); - XS.Set(XSRegisters.EAX, XSRegisters.ESI, destinationIsIndirect: true, destinationDisplacement: 12); - XS.Set(XSRegisters.EDX, XSRegisters.ESI, destinationIsIndirect: true, destinationDisplacement: 8); - XS.Xor(XSRegisters.EAX, XSRegisters.EAX); // XS.Set(XSRegisters.EAX, 0); - XS.Return(); - } - - [Inline] - internal static void FetchCPUVendor(int* target) - { - /* - * lea esi, target - * xor eax, eax - * cpuid - * mov [esi], ebx - * mov [esi + 4], edx - * mov [esi + 8], ecx - * ret - */ - __vendortargetptr = target; - - string intname = LabelName.GetStaticFieldName(typeof(CPUImpl).GetField(nameof(__vendortargetptr))); - - XS.Lea(XSRegisters.ESI, intname); // new Lea { DestinationReg = RegistersEnum.ESI, SourceRef = ElementReference.New(intname) }; - XS.Cpuid(); - XS.Set(XSRegisters.ESI, XSRegisters.EBX, destinationIsIndirect: true); - XS.Set(XSRegisters.ESI, XSRegisters.EDX, destinationIsIndirect: true, destinationDisplacement: 4); - XS.Set(XSRegisters.ESI, XSRegisters.ECX, destinationIsIndirect: true, destinationDisplacement: 8); - XS.Return(); - } - - [Inline] - internal static int CanReadCPUID() - { - /* - * pushfd - * pushfd - * xor dword [esp], 00200000h - * popfd - * pushfd - * pop eax - * xor eax, [esp] - * and eax, 00200000h - * ret - */ - XS.Pushfd(); - XS.Pushfd(); - XS.Xor(XSRegisters.ESP, 0x00200000, destinationIsIndirect: true); - XS.Popfd(); - XS.Pushfd(); - XS.Pop(XSRegisters.EAX); - XS.Xor(XSRegisters.EAX, XSRegisters.ESP, destinationIsIndirect: true); - XS.Popfd(); - XS.And(XSRegisters.EAX, 0x00200000); - XS.Return(); - - return 0; // should be ignored by the compiler - } - } -} diff --git a/source/Cosmos.Core_Plugs/System/Diagnostics/StopwatchImpl.cs b/source/Cosmos.Core_Plugs/System/Diagnostics/StopwatchImpl.cs index c2f117ac2..19f86361b 100644 --- a/source/Cosmos.Core_Plugs/System/Diagnostics/StopwatchImpl.cs +++ b/source/Cosmos.Core_Plugs/System/Diagnostics/StopwatchImpl.cs @@ -13,7 +13,7 @@ namespace Cosmos.Core_Plugs.System.Diagnostics { if (Stopwatch.IsHighResolution) // see https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx for more details - return (long)(ProcessorInformation.GetCycleCount() / (double)ProcessorInformation.GetCycleRate() * 1000000d); + return (long)(CPU.GetCPUUptime() / (double)CPU.GetCPUUptime() * 1000000d); else return DateTime.UtcNow.Ticks; } diff --git a/source/Cosmos.Core_Plugs/System/Threading/ThreadImpl.cs b/source/Cosmos.Core_Plugs/System/Threading/ThreadImpl.cs index 383dd9505..9c28ca3ef 100644 --- a/source/Cosmos.Core_Plugs/System/Threading/ThreadImpl.cs +++ b/source/Cosmos.Core_Plugs/System/Threading/ThreadImpl.cs @@ -23,10 +23,10 @@ namespace Cosmos.Core_Plugs.System.Threading // if ((ms > 0) && (ms != Timeout.Infinite)) // { - // double fac = ProcessorInformation.GetCycleRate() / 1000d; - // double ticks = ms / 1000d * Stopwatch.Frequency + ProcessorInformation.GetCycleCount() * fac; + // double fac = CPU.GetCycleRate() / 1000d; + // double ticks = ms / 1000d * Stopwatch.Frequency + CPU.GetCycleCount() * fac; - // while (ticks < ProcessorInformation.GetCycleCount() * fac) + // while (ticks < CPU.GetCycleCount() * fac) // new Action(() => { }).Invoke(); // execute an empty operation // } // else if (ms < 0) From 93e32b02046cf86c6745a1fcd6d512079dce33b2 Mon Sep 17 00:00:00 2001 From: KM198912 <55886806+KM198912@users.noreply.github.com> Date: Fri, 16 Oct 2020 23:04:42 +0200 Subject: [PATCH 09/14] [WiP] Color.FromName Plug --- .../System/Drawing/ColorImpl.cs | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs diff --git a/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs b/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs new file mode 100644 index 000000000..d1ea660f4 --- /dev/null +++ b/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs @@ -0,0 +1,184 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using IL2CPU.API.Attribs; + +namespace Cosmos.System_Plugs.System.Drawing +{ + [Plug(Target = typeof(global::System.Drawing.Color))] + class ColorImpl + { + public static Color FromName(string name) + { + switch(name) + { + case "AliceBlue": + return Color.AliceBlue; + break; + case "AntiqueWhite": + return Color.AntiqueWhite; + break; + case "Aqua": + return Color.Aqua; + break; + case "Aquamarine": + return Color.Aquamarine; + break; + case "Azure": + return Color.Azure; + break; + case "Beige": + return Color.Beige; + break; + case "Bisque": + return Color.Bisque; + break; + case "Black": + return Color.Black; + break; + case "BlueViolet": + return Color.BlueViolet; + break; + case "Brown": + return Color.Brown; + break; + case "BurlyWood": + return Color.BurlyWood; + break; + case "CadetBlue": + return Color.CadetBlue; + break; + case "Chartreuse": + return Color.Chartreuse; + break; + case "Chocolate": + return Color.Chocolate; + break; + case "Coral": + return Color.Coral; + break; + case "CornflowerBlue": + return Color.CornflowerBlue; + break; + case "Cornsilk": + return Color.Cornsilk; + break; + case "Crimson": + return Color.Crimson; + break; + case "Cyan": + return Color.Cyan; + break; + case "DarkBlue": + return Color.DarkBlue; + break; + case "DarkCyan": + return Color.DarkCyan; + break; + case "DarkGoldenrod": + return Color.DarkGoldenrod; + break; + case "DarkGray": + return Color.DarkGray; + break; + case "DarkGreen": + return Color.DarkGreen; + break; + case "DarkKhaki": + return Color.DarkKhaki; + break; + case "DarkMagenta": + return Color.DarkMagenta; + break; + case "DarkOliveGreen": + return Color.DarkOliveGreen; + break; + case "AliceOrange": + return Color.DarkOrange; + break; + case "DarkOrchid": + return Color.DarkOrchid; + break; + case "DarkRed": + return Color.DarkRed; + break; + case "DarkSalmon": + return Color.DarkSalmon; + break; + case "DarkSeaGreen": + return Color.DarkSeaGreen; + break; + case "DarkSlateBlue": + return Color.DarkSlateBlue; + break; + case "DarkSlateGray": + return Color.DarkSlateGray; + break; + case "DarkTurquoise": + return Color.DarkTurquoise; + break; + case "DarkViolet": + return Color.DarkViolet; + break; + case "DeepPink": + return Color.DeepPink; + break; + case "DeepSkyBlue": + return Color.DeepSkyBlue; + break; + case "DimGray": + return Color.DimGray; + break; + case "DodgerBlue": + return Color.DodgerBlue; + break; + case "Firebrick": + return Color.Firebrick; + break; + case "FloralWhite": + return Color.FloralWhite; + break; + case "ForestGreen": + return Color.ForestGreen; + break; + case "Fuchsia": + return Color.Fuchsia; + break; + case "Gainsboro": + return Color.Gainsboro; + break; + case "GhostWhite": + return Color.GhostWhite; + break; + case "Gold": + return Color.Gold; + break; + case "Goldenrod": + return Color.Goldenrod; + break; + case "Gray": + return Color.Gray; + break; + case "Green": + return Color.Green; + break; + case "GreenYellow": + return Color.GreenYellow; + break; + case "Honeydew": + return Color.Honeydew; + break; + case "HotPink": + return Color.HotPink; + break; + case "": + throw new Exception("Color Name must be passed to FromName"); + break; + default: + return Color.Black; + break; + } + } + } +} From f783dace2e10d0a067a9486b4db99ef11dc2815d Mon Sep 17 00:00:00 2001 From: KM198912 <55886806+KM198912@users.noreply.github.com> Date: Sat, 17 Oct 2020 20:28:43 +0200 Subject: [PATCH 10/14] Update ColorImpl.cs Change Exception to ArgumentException --- source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs b/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs index d1ea660f4..319019234 100644 --- a/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs +++ b/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs @@ -173,7 +173,7 @@ namespace Cosmos.System_Plugs.System.Drawing return Color.HotPink; break; case "": - throw new Exception("Color Name must be passed to FromName"); + throw new ArgumentException("Color Name must be passed to FromName"); break; default: return Color.Black; From 7fd9abf515d1825c8fa03a61881cb6a84da72fd9 Mon Sep 17 00:00:00 2001 From: KM198912 <55886806+KM198912@users.noreply.github.com> Date: Sun, 18 Oct 2020 13:18:07 +0200 Subject: [PATCH 11/14] Finish Plug Add Remainig Colors, also throw a exception on Invalid Color Name instead or returning Black --- .../System/Drawing/ColorImpl.cs | 258 +++++++++++++++++- 1 file changed, 257 insertions(+), 1 deletion(-) diff --git a/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs b/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs index 319019234..8e88577ac 100644 --- a/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs +++ b/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs @@ -1,3 +1,4 @@ +//#define COSMOSDEBUG using System; using System.Collections.Generic; using System.Drawing; @@ -9,6 +10,9 @@ namespace Cosmos.System_Plugs.System.Drawing [Plug(Target = typeof(global::System.Drawing.Color))] class ColorImpl { + /// Implements System.Drawing.Color.FromName + /// See https://docs.microsoft.com/de-de/dotnet/api/system.drawing.color.fromname?view=netcore-3.1 for Usage Explanation + /// public static Color FromName(string name) { switch(name) @@ -172,11 +176,263 @@ namespace Cosmos.System_Plugs.System.Drawing case "HotPink": return Color.HotPink; break; + case "IndianRed": + return Color.IndianRed; + break; + case "Indigo": + return Color.Indigo; + break; + case "Ivory": + return Color.Ivory; + break; + case "Khaki": + return Color.Khaki; + break; + case "Lavender": + return Color.Lavender; + break; + case "LavenderBlush": + return Color.LavenderBlush; + break; + case "LawnGreen": + return Color.LawnGreen; + break; + case "LemonChiffon": + return Color.LemonChiffon; + break; + case "LightBlue": + return Color.LightBlue; + break; + case "LightCoral": + return Color.LightCoral; + break; + case "LightCyan": + return Color.LightCyan; + break; + case "LightGoldenrodYellow": + return Color.LightGoldenrodYellow; + break; + case "LightGreen": + return Color.LightGreen; + break; + case "LightGray": + return Color.LightGray; + break; + case "LightPink": + return Color.LightPink; + break; + case "LightSalmon": + return Color.LightSalmon; + break; + case "LightSeaGreen": + return Color.LightSeaGreen; + break; + case "LightSkyBlue": + return Color.LightSkyBlue; + break; + case "LightSlateGray": + return Color.LightSlateGray; + break; + case "LightSteelBlue": + return Color.LightSteelBlue; + break; + case "LightYellow": + return Color.LightYellow; + break; + case "Lime": + return Color.Lime; + break; + case "LimeGreen": + return Color.LimeGreen; + break; + case "Linen": + return Color.Linen; + break; + case "Magenta": + return Color.Magenta; + break; + case "Maroon": + return Color.Maroon; + break; + case "MediumAquamarine": + return Color.MediumAquamarine ; + break; + case "MediumBlue": + return Color.MediumBlue; + break; + case "MediumOrchid": + return Color.MediumOrchid; + break; + case "MediumPurple": + return Color.MediumPurple; + break; + case "MediumSeaGreen": + return Color.MediumSeaGreen; + break; + case "MediumSlateBlue": + return Color.MediumSlateBlue; + break; + case "MediumSpringGreen": + return Color.MediumSpringGreen; + break; + case "MediumTurquoise": + return Color.MediumTurquoise; + break; + case "MediumVioletRed": + return Color.MediumVioletRed; + break; + case "MidnightBlue": + return Color.MidnightBlue; + break; + case "MintCream": + return Color.MintCream; + break; + case "MistyRose": + return Color.MistyRose; + break; + case "Moccasin": + return Color.Moccasin; + break; + case "NavajoWhite": + return Color.NavajoWhite; + break; + case "Navy": + return Color.Navy; + break; + case "OldLace": + return Color.OldLace; + break; + case "Olive": + return Color.Olive; + break; + case "OliveDrab": + return Color.OliveDrab; + break; + case "Orange": + return Color.Orange; + break; + case "OrangeRed": + return Color.OrangeRed; + break; + case "Orchid": + return Color.Orchid; + break; + case "PaleGoldenrod": + return Color.PaleGoldenrod; + break; + case "PaleGreen": + return Color.PaleGreen; + break; + case "PaleTurquoise": + return Color.PaleTurquoise; + break; + case "PaleVioletRed": + return Color.PaleVioletRed; + break; + case "PapayaWhip": + return Color.PapayaWhip; + break; + case "PeachPuff": + return Color.PeachPuff; + break; + case "Peru": + return Color.Peru; + break; + case "Pink": + return Color.Pink; + break; + case "Plum": + return Color.Plum; + break; + case "PowderBlue": + return Color.PowderBlue; + break; + case "Purple": + return Color.Purple; + break; + case "Red": + return Color.Red; + break; + case "RosyBrown": + return Color.RosyBrown; + break; + case "RoyalBlue": + return Color.RoyalBlue; + break; + case "SaddleBrown": + return Color.SaddleBrown; + break; + case "Salmon": + return Color.Salmon; + break; + case "SandyBrown": + return Color.SandyBrown; + break; + case "SeaGreen": + return Color.SeaGreen; + break; + case "Sienna": + return Color.Sienna; + break; + case "Silver": + return Color.Silver; + break; + case "SkyBlue": + return Color.SkyBlue; + break; + case "SlateBlue": + return Color.SlateBlue; + break; + case "SlateGray": + return Color.SlateGray; + break; + case "Snow": + return Color.Snow; + break; + case "SpringGreen": + return Color.SpringGreen; + break; + case "SteelBlue": + return Color.SteelBlue; + break; + case "Tan": + return Color.Tan; + break; + case "Thistle": + return Color.Thistle; + break; + case "Tomato": + return Color.Tomato; + break; + case "Transparent": + return Color.Transparent; + break; + case "Turquoise": + return Color.Turquoise; + break; + case "Violet": + return Color.Violet; + break; + case "Wheat": + return Color.Wheat; + break; + case "White": + return Color.White; + break; + case "WhiteSmoke": + return Color.WhiteSmoke; + break; + case "Yellow": + return Color.Yellow; + break; + case "YellowGreen": + return Color.YellowGreen; + break; case "": throw new ArgumentException("Color Name must be passed to FromName"); break; default: - return Color.Black; + throw new ArgumentException("{0} is not a valid Color Name", name); break; } } From 3a0c3884bb4690a8681b1a2afe85d1ec794d2176 Mon Sep 17 00:00:00 2001 From: KM198912 <55886806+KM198912@users.noreply.github.com> Date: Sun, 18 Oct 2020 16:23:09 +0200 Subject: [PATCH 12/14] Update ColorImpl.cs Remove break Statements since we have return values --- .../System/Drawing/ColorImpl.cs | 278 +++++++++--------- 1 file changed, 139 insertions(+), 139 deletions(-) diff --git a/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs b/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs index 8e88577ac..4a005b644 100644 --- a/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs +++ b/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs @@ -19,421 +19,421 @@ namespace Cosmos.System_Plugs.System.Drawing { case "AliceBlue": return Color.AliceBlue; - break; + case "AntiqueWhite": return Color.AntiqueWhite; - break; + case "Aqua": return Color.Aqua; - break; + case "Aquamarine": return Color.Aquamarine; - break; + case "Azure": return Color.Azure; - break; + case "Beige": return Color.Beige; - break; + case "Bisque": return Color.Bisque; - break; + case "Black": return Color.Black; - break; + case "BlueViolet": return Color.BlueViolet; - break; + case "Brown": return Color.Brown; - break; + case "BurlyWood": return Color.BurlyWood; - break; + case "CadetBlue": return Color.CadetBlue; - break; + case "Chartreuse": return Color.Chartreuse; - break; + case "Chocolate": return Color.Chocolate; - break; + case "Coral": return Color.Coral; - break; + case "CornflowerBlue": return Color.CornflowerBlue; - break; + case "Cornsilk": return Color.Cornsilk; - break; + case "Crimson": return Color.Crimson; - break; + case "Cyan": return Color.Cyan; - break; + case "DarkBlue": return Color.DarkBlue; - break; + case "DarkCyan": return Color.DarkCyan; - break; + case "DarkGoldenrod": return Color.DarkGoldenrod; - break; + case "DarkGray": return Color.DarkGray; - break; + case "DarkGreen": return Color.DarkGreen; - break; + case "DarkKhaki": return Color.DarkKhaki; - break; + case "DarkMagenta": return Color.DarkMagenta; - break; + case "DarkOliveGreen": return Color.DarkOliveGreen; - break; + case "AliceOrange": return Color.DarkOrange; - break; + case "DarkOrchid": return Color.DarkOrchid; - break; + case "DarkRed": return Color.DarkRed; - break; + case "DarkSalmon": return Color.DarkSalmon; - break; + case "DarkSeaGreen": return Color.DarkSeaGreen; - break; + case "DarkSlateBlue": return Color.DarkSlateBlue; - break; + case "DarkSlateGray": return Color.DarkSlateGray; - break; + case "DarkTurquoise": return Color.DarkTurquoise; - break; + case "DarkViolet": return Color.DarkViolet; - break; + case "DeepPink": return Color.DeepPink; - break; + case "DeepSkyBlue": return Color.DeepSkyBlue; - break; + case "DimGray": return Color.DimGray; - break; + case "DodgerBlue": return Color.DodgerBlue; - break; + case "Firebrick": return Color.Firebrick; - break; + case "FloralWhite": return Color.FloralWhite; - break; + case "ForestGreen": return Color.ForestGreen; - break; + case "Fuchsia": return Color.Fuchsia; - break; + case "Gainsboro": return Color.Gainsboro; - break; + case "GhostWhite": return Color.GhostWhite; - break; + case "Gold": return Color.Gold; - break; + case "Goldenrod": return Color.Goldenrod; - break; + case "Gray": return Color.Gray; - break; + case "Green": return Color.Green; - break; + case "GreenYellow": return Color.GreenYellow; - break; + case "Honeydew": return Color.Honeydew; - break; + case "HotPink": return Color.HotPink; - break; + case "IndianRed": return Color.IndianRed; - break; + case "Indigo": return Color.Indigo; - break; + case "Ivory": return Color.Ivory; - break; + case "Khaki": return Color.Khaki; - break; + case "Lavender": return Color.Lavender; - break; + case "LavenderBlush": return Color.LavenderBlush; - break; + case "LawnGreen": return Color.LawnGreen; - break; + case "LemonChiffon": return Color.LemonChiffon; - break; + case "LightBlue": return Color.LightBlue; - break; + case "LightCoral": return Color.LightCoral; - break; + case "LightCyan": return Color.LightCyan; - break; + case "LightGoldenrodYellow": return Color.LightGoldenrodYellow; - break; + case "LightGreen": return Color.LightGreen; - break; + case "LightGray": return Color.LightGray; - break; + case "LightPink": return Color.LightPink; - break; + case "LightSalmon": return Color.LightSalmon; - break; + case "LightSeaGreen": return Color.LightSeaGreen; - break; + case "LightSkyBlue": return Color.LightSkyBlue; - break; + case "LightSlateGray": return Color.LightSlateGray; - break; + case "LightSteelBlue": return Color.LightSteelBlue; - break; + case "LightYellow": return Color.LightYellow; - break; + case "Lime": return Color.Lime; - break; + case "LimeGreen": return Color.LimeGreen; - break; + case "Linen": return Color.Linen; - break; + case "Magenta": return Color.Magenta; - break; + case "Maroon": return Color.Maroon; - break; + case "MediumAquamarine": return Color.MediumAquamarine ; - break; + case "MediumBlue": return Color.MediumBlue; - break; + case "MediumOrchid": return Color.MediumOrchid; - break; + case "MediumPurple": return Color.MediumPurple; - break; + case "MediumSeaGreen": return Color.MediumSeaGreen; - break; + case "MediumSlateBlue": return Color.MediumSlateBlue; - break; + case "MediumSpringGreen": return Color.MediumSpringGreen; - break; + case "MediumTurquoise": return Color.MediumTurquoise; - break; + case "MediumVioletRed": return Color.MediumVioletRed; - break; + case "MidnightBlue": return Color.MidnightBlue; - break; + case "MintCream": return Color.MintCream; - break; + case "MistyRose": return Color.MistyRose; - break; + case "Moccasin": return Color.Moccasin; - break; + case "NavajoWhite": return Color.NavajoWhite; - break; + case "Navy": return Color.Navy; - break; + case "OldLace": return Color.OldLace; - break; + case "Olive": return Color.Olive; - break; + case "OliveDrab": return Color.OliveDrab; - break; + case "Orange": return Color.Orange; - break; + case "OrangeRed": return Color.OrangeRed; - break; + case "Orchid": return Color.Orchid; - break; + case "PaleGoldenrod": return Color.PaleGoldenrod; - break; + case "PaleGreen": return Color.PaleGreen; - break; + case "PaleTurquoise": return Color.PaleTurquoise; - break; + case "PaleVioletRed": return Color.PaleVioletRed; - break; + case "PapayaWhip": return Color.PapayaWhip; - break; + case "PeachPuff": return Color.PeachPuff; - break; + case "Peru": return Color.Peru; - break; + case "Pink": return Color.Pink; - break; + case "Plum": return Color.Plum; - break; + case "PowderBlue": return Color.PowderBlue; - break; + case "Purple": return Color.Purple; - break; + case "Red": return Color.Red; - break; + case "RosyBrown": return Color.RosyBrown; - break; + case "RoyalBlue": return Color.RoyalBlue; - break; + case "SaddleBrown": return Color.SaddleBrown; - break; + case "Salmon": return Color.Salmon; - break; + case "SandyBrown": return Color.SandyBrown; - break; + case "SeaGreen": return Color.SeaGreen; - break; + case "Sienna": return Color.Sienna; - break; + case "Silver": return Color.Silver; - break; + case "SkyBlue": return Color.SkyBlue; - break; + case "SlateBlue": return Color.SlateBlue; - break; + case "SlateGray": return Color.SlateGray; - break; + case "Snow": return Color.Snow; - break; + case "SpringGreen": return Color.SpringGreen; - break; + case "SteelBlue": return Color.SteelBlue; - break; + case "Tan": return Color.Tan; - break; + case "Thistle": return Color.Thistle; - break; + case "Tomato": return Color.Tomato; - break; + case "Transparent": return Color.Transparent; - break; + case "Turquoise": return Color.Turquoise; - break; + case "Violet": return Color.Violet; - break; + case "Wheat": return Color.Wheat; - break; + case "White": return Color.White; - break; + case "WhiteSmoke": return Color.WhiteSmoke; - break; + case "Yellow": return Color.Yellow; - break; + case "YellowGreen": return Color.YellowGreen; - break; + case "": throw new ArgumentException("Color Name must be passed to FromName"); - break; + default: throw new ArgumentException("{0} is not a valid Color Name", name); - break; + } } } From 784eb4477416684d0201a53147bd7083ab2ecb4d Mon Sep 17 00:00:00 2001 From: KM198912 <55886806+KM198912@users.noreply.github.com> Date: Sun, 18 Oct 2020 16:45:49 +0200 Subject: [PATCH 13/14] Update Kernel.cs Test Color.FromName --- Tests/Kernels/GraphicTest/Kernel.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/Kernels/GraphicTest/Kernel.cs b/Tests/Kernels/GraphicTest/Kernel.cs index 94ddbbe4e..d6a6a4351 100644 --- a/Tests/Kernels/GraphicTest/Kernel.cs +++ b/Tests/Kernels/GraphicTest/Kernel.cs @@ -83,6 +83,9 @@ namespace GraphicTest pen.Color = Color.MediumPurple; aCanvas.DrawPolygon(pen, new Point(200, 250), new Point(250, 300), new Point(220, 350), new Point(210, 275)); + /* Color.FromName */ + aCanvas.Clear(Color.FromName("Navy")); + /* A LimeGreen rectangle */ pen.Color = Color.LimeGreen; aCanvas.DrawRectangle(pen, 450, 300, 80, 60); From 3e3144a362c8db81a26e3a7bbd5d5646f827f3eb Mon Sep 17 00:00:00 2001 From: KM198912 <55886806+KM198912@users.noreply.github.com> Date: Sun, 18 Oct 2020 16:53:21 +0200 Subject: [PATCH 14/14] Fix Laptop Touchpads Tested this on 3 Different Laptops from different brands, all touchpads worked without any issues --- source/Cosmos.HAL2/PS2Controller.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/Cosmos.HAL2/PS2Controller.cs b/source/Cosmos.HAL2/PS2Controller.cs index 83584df81..ab450a56e 100644 --- a/source/Cosmos.HAL2/PS2Controller.cs +++ b/source/Cosmos.HAL2/PS2Controller.cs @@ -176,8 +176,10 @@ namespace Cosmos.HAL * |--------|---------------------------| * | 0x04 | 5-button mouse | * |--------|---------------------------| + * | 0x50 | Laptop Touchpad | + * |--------|---------------------------| */ - if (xFirstByte == 0x00 || xFirstByte == 0x03 || xFirstByte == 0x04) + if (xFirstByte == 0x00 || xFirstByte == 0x03 || xFirstByte == 0x04 || xFirstByte == 0x50) { var xDevice = new PS2Mouse(aPort, xFirstByte); xDevice.Initialize();