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..daceee95c --- /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/what error messages you got. + +**Steps of installation up to now** +What steps of the installation have you done up to now: + +**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. + +**Setup (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. 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/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/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); diff --git a/Tests/Kernels/ProcessorTests/Kernel.cs b/Tests/Kernels/ProcessorTests/Kernel.cs index 9ef432177..2320625f3 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 TestBrandStringBlank() { string brandString = CPU.GetCPUBrandString(); diff --git a/source/Cosmos.Core/CPU.cs b/source/Cosmos.Core/CPU.cs index a2618bcf7..26defb248 100644 --- a/source/Cosmos.Core/CPU.cs +++ b/source/Cosmos.Core/CPU.cs @@ -315,7 +315,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. @@ -326,7 +326,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. 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/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"); + } } } 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) 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(); 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()) 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..4a005b644 --- /dev/null +++ b/source/Cosmos.System2_Plugs/System/Drawing/ColorImpl.cs @@ -0,0 +1,440 @@ +//#define COSMOSDEBUG +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 + { + /// 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) + { + case "AliceBlue": + return Color.AliceBlue; + + case "AntiqueWhite": + return Color.AntiqueWhite; + + case "Aqua": + return Color.Aqua; + + case "Aquamarine": + return Color.Aquamarine; + + case "Azure": + return Color.Azure; + + case "Beige": + return Color.Beige; + + case "Bisque": + return Color.Bisque; + + case "Black": + return Color.Black; + + case "BlueViolet": + return Color.BlueViolet; + + case "Brown": + return Color.Brown; + + case "BurlyWood": + return Color.BurlyWood; + + case "CadetBlue": + return Color.CadetBlue; + + case "Chartreuse": + return Color.Chartreuse; + + case "Chocolate": + return Color.Chocolate; + + case "Coral": + return Color.Coral; + + case "CornflowerBlue": + return Color.CornflowerBlue; + + case "Cornsilk": + return Color.Cornsilk; + + case "Crimson": + return Color.Crimson; + + case "Cyan": + return Color.Cyan; + + case "DarkBlue": + return Color.DarkBlue; + + case "DarkCyan": + return Color.DarkCyan; + + case "DarkGoldenrod": + return Color.DarkGoldenrod; + + case "DarkGray": + return Color.DarkGray; + + case "DarkGreen": + return Color.DarkGreen; + + case "DarkKhaki": + return Color.DarkKhaki; + + case "DarkMagenta": + return Color.DarkMagenta; + + case "DarkOliveGreen": + return Color.DarkOliveGreen; + + case "AliceOrange": + return Color.DarkOrange; + + case "DarkOrchid": + return Color.DarkOrchid; + + case "DarkRed": + return Color.DarkRed; + + case "DarkSalmon": + return Color.DarkSalmon; + + case "DarkSeaGreen": + return Color.DarkSeaGreen; + + case "DarkSlateBlue": + return Color.DarkSlateBlue; + + case "DarkSlateGray": + return Color.DarkSlateGray; + + case "DarkTurquoise": + return Color.DarkTurquoise; + + case "DarkViolet": + return Color.DarkViolet; + + case "DeepPink": + return Color.DeepPink; + + case "DeepSkyBlue": + return Color.DeepSkyBlue; + + case "DimGray": + return Color.DimGray; + + case "DodgerBlue": + return Color.DodgerBlue; + + case "Firebrick": + return Color.Firebrick; + + case "FloralWhite": + return Color.FloralWhite; + + case "ForestGreen": + return Color.ForestGreen; + + case "Fuchsia": + return Color.Fuchsia; + + case "Gainsboro": + return Color.Gainsboro; + + case "GhostWhite": + return Color.GhostWhite; + + case "Gold": + return Color.Gold; + + case "Goldenrod": + return Color.Goldenrod; + + case "Gray": + return Color.Gray; + + case "Green": + return Color.Green; + + case "GreenYellow": + return Color.GreenYellow; + + case "Honeydew": + return Color.Honeydew; + + case "HotPink": + return Color.HotPink; + + case "IndianRed": + return Color.IndianRed; + + case "Indigo": + return Color.Indigo; + + case "Ivory": + return Color.Ivory; + + case "Khaki": + return Color.Khaki; + + case "Lavender": + return Color.Lavender; + + case "LavenderBlush": + return Color.LavenderBlush; + + case "LawnGreen": + return Color.LawnGreen; + + case "LemonChiffon": + return Color.LemonChiffon; + + case "LightBlue": + return Color.LightBlue; + + case "LightCoral": + return Color.LightCoral; + + case "LightCyan": + return Color.LightCyan; + + case "LightGoldenrodYellow": + return Color.LightGoldenrodYellow; + + case "LightGreen": + return Color.LightGreen; + + case "LightGray": + return Color.LightGray; + + case "LightPink": + return Color.LightPink; + + case "LightSalmon": + return Color.LightSalmon; + + case "LightSeaGreen": + return Color.LightSeaGreen; + + case "LightSkyBlue": + return Color.LightSkyBlue; + + case "LightSlateGray": + return Color.LightSlateGray; + + case "LightSteelBlue": + return Color.LightSteelBlue; + + case "LightYellow": + return Color.LightYellow; + + case "Lime": + return Color.Lime; + + case "LimeGreen": + return Color.LimeGreen; + + case "Linen": + return Color.Linen; + + case "Magenta": + return Color.Magenta; + + case "Maroon": + return Color.Maroon; + + case "MediumAquamarine": + return Color.MediumAquamarine ; + + case "MediumBlue": + return Color.MediumBlue; + + case "MediumOrchid": + return Color.MediumOrchid; + + case "MediumPurple": + return Color.MediumPurple; + + case "MediumSeaGreen": + return Color.MediumSeaGreen; + + case "MediumSlateBlue": + return Color.MediumSlateBlue; + + case "MediumSpringGreen": + return Color.MediumSpringGreen; + + case "MediumTurquoise": + return Color.MediumTurquoise; + + case "MediumVioletRed": + return Color.MediumVioletRed; + + case "MidnightBlue": + return Color.MidnightBlue; + + case "MintCream": + return Color.MintCream; + + case "MistyRose": + return Color.MistyRose; + + case "Moccasin": + return Color.Moccasin; + + case "NavajoWhite": + return Color.NavajoWhite; + + case "Navy": + return Color.Navy; + + case "OldLace": + return Color.OldLace; + + case "Olive": + return Color.Olive; + + case "OliveDrab": + return Color.OliveDrab; + + case "Orange": + return Color.Orange; + + case "OrangeRed": + return Color.OrangeRed; + + case "Orchid": + return Color.Orchid; + + case "PaleGoldenrod": + return Color.PaleGoldenrod; + + case "PaleGreen": + return Color.PaleGreen; + + case "PaleTurquoise": + return Color.PaleTurquoise; + + case "PaleVioletRed": + return Color.PaleVioletRed; + + case "PapayaWhip": + return Color.PapayaWhip; + + case "PeachPuff": + return Color.PeachPuff; + + case "Peru": + return Color.Peru; + + case "Pink": + return Color.Pink; + + case "Plum": + return Color.Plum; + + case "PowderBlue": + return Color.PowderBlue; + + case "Purple": + return Color.Purple; + + case "Red": + return Color.Red; + + case "RosyBrown": + return Color.RosyBrown; + + case "RoyalBlue": + return Color.RoyalBlue; + + case "SaddleBrown": + return Color.SaddleBrown; + + case "Salmon": + return Color.Salmon; + + case "SandyBrown": + return Color.SandyBrown; + + case "SeaGreen": + return Color.SeaGreen; + + case "Sienna": + return Color.Sienna; + + case "Silver": + return Color.Silver; + + case "SkyBlue": + return Color.SkyBlue; + + case "SlateBlue": + return Color.SlateBlue; + + case "SlateGray": + return Color.SlateGray; + + case "Snow": + return Color.Snow; + + case "SpringGreen": + return Color.SpringGreen; + + case "SteelBlue": + return Color.SteelBlue; + + case "Tan": + return Color.Tan; + + case "Thistle": + return Color.Thistle; + + case "Tomato": + return Color.Tomato; + + case "Transparent": + return Color.Transparent; + + case "Turquoise": + return Color.Turquoise; + + case "Violet": + return Color.Violet; + + case "Wheat": + return Color.Wheat; + + case "White": + return Color.White; + + case "WhiteSmoke": + return Color.WhiteSmoke; + + case "Yellow": + return Color.Yellow; + + case "YellowGreen": + return Color.YellowGreen; + + case "": + throw new ArgumentException("Color Name must be passed to FromName"); + + default: + throw new ArgumentException("{0} is not a valid Color Name", name); + + } + } + } +} 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; + } + } +}