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;
+ }
+ }
+}