diff --git a/source/Cosmos.sln b/source/Cosmos.sln index aaced7f8e..86df74153 100644 --- a/source/Cosmos.sln +++ b/source/Cosmos.sln @@ -88,6 +88,7 @@ Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "Docs", "..\Docs", "{67E7DEF Release.AspNetCompiler.ForceOverwrite = "true" Release.AspNetCompiler.FixedNames = "false" Release.AspNetCompiler.Debug = "False" + VWDPort = "4516" EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Compiler.Debug", "..\source2\IL2CPU\Cosmos.IL2CPU.Debug\Cosmos.Compiler.Debug.csproj", "{9998B4EA-385E-4DA2-8905-2BBEB5B2C6E2}" @@ -1172,9 +1173,9 @@ Global {C5519AC3-218A-4211-9D40-B23AA80FB35E} = {D95021E1-A2C9-4829-819E-ED433AF13162} {AB24E403-54F3-4F67-B5E0-119A7227AAC1} = {FF5BAFDE-AE9D-438D-935A-86B33EE0A758} {6D2688FE-6FD8-44A8-B96A-6037457F72A7} = {FF5BAFDE-AE9D-438D-935A-86B33EE0A758} + {35CABD9D-5C85-419A-B6C9-561EAD97A553} = {FF5BAFDE-AE9D-438D-935A-86B33EE0A758} {4266FA56-F6FE-4E9B-BAE3-B6910183884C} = {FF5BAFDE-AE9D-438D-935A-86B33EE0A758} {3370FC04-B669-46A4-A4AA-A89540318F8D} = {FF5BAFDE-AE9D-438D-935A-86B33EE0A758} - {35CABD9D-5C85-419A-B6C9-561EAD97A553} = {FF5BAFDE-AE9D-438D-935A-86B33EE0A758} {C4941654-3D7A-484B-9F5C-3D331AB8F585} = {1698DD83-72A3-44CD-B088-4320A4014A95} {9D82B35C-7133-4ADE-AA5C-0FFB2BFA8BA6} = {A4478219-065D-4928-BB4D-4358CAD39A03} {2DF5F17F-4890-4856-ADFD-4DE23282C3B7} = {A4478219-065D-4928-BB4D-4358CAD39A03} @@ -1190,8 +1191,8 @@ Global {63F7BFB9-419E-4965-B580-304B9C9FA7D8} = {6A15C540-8278-4B9C-B890-FA57FB6AE6A6} {52BF0A64-EBEF-420A-9F27-6C5226A4B77B} = {6A15C540-8278-4B9C-B890-FA57FB6AE6A6} {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E} = {6A15C540-8278-4B9C-B890-FA57FB6AE6A6} - {239E33A7-F0C3-4801-85CA-4D8F89A31DC0} = {6A15C540-8278-4B9C-B890-FA57FB6AE6A6} {576C3D3B-A3EA-44FA-8E39-AFD3E6F3FE23} = {6A15C540-8278-4B9C-B890-FA57FB6AE6A6} + {239E33A7-F0C3-4801-85CA-4D8F89A31DC0} = {6A15C540-8278-4B9C-B890-FA57FB6AE6A6} {6658FCE0-7032-4B7B-BD95-F2765C393442} = {2DF5F17F-4890-4856-ADFD-4DE23282C3B7} {6882C74B-3ED2-4D76-9E7B-67B6A28808BC} = {0CF14D0F-6054-4D3D-9062-E3D2EB064A4E} {23476FAD-3712-4A4B-90C0-CCCC9AC8D953} = {0CF14D0F-6054-4D3D-9062-E3D2EB064A4E} diff --git a/source2/Compiler/Cosmos.Compiler.DebugStub/DebugStub.cs b/source2/Compiler/Cosmos.Compiler.DebugStub/DebugStub.cs index 7b7a21c63..3a36f104e 100644 --- a/source2/Compiler/Cosmos.Compiler.DebugStub/DebugStub.cs +++ b/source2/Compiler/Cosmos.Compiler.DebugStub/DebugStub.cs @@ -106,6 +106,8 @@ namespace Cosmos.Compiler.DebugStub { static protected DataMember32 DebugTraceMode; // enum Status static protected DataMember32 DebugStatus; + // Nesting control for non steppable routines + static protected DataMember32 DebugSuspendLevel; public DebugStub(int aComNo) { mComNo = aComNo; @@ -114,8 +116,6 @@ namespace Cosmos.Compiler.DebugStub { // Old method, need to convert to fields mAsm.DataMembers.AddRange(new DataMember[]{ - // Nesting control for non steppable routines - new DataMember("DebugSuspendLevel", 0), // Nesting control for non steppable routines new DataMember("DebugResumeLevel", 0), // Ptr to the push all data. It points to the "bottom" after a PushAll op. @@ -908,7 +908,7 @@ namespace Cosmos.Compiler.DebugStub { // IRQ's are disabled between Compare and JumpIf so an IRQ cant // happen in between them which could also cause double entry. DisableInterrupts(); - Memory["DebugSuspendLevel", 32].Compare(0); + DebugSuspendLevel.Value.Compare(0); JumpIf(Flags.Equal, "DebugStub_Running"); // DebugStub is already running, so exit. // But we need to see if IRQs are disabled. @@ -981,18 +981,15 @@ namespace Cosmos.Compiler.DebugStub { } } - } - - public class DebugPoint : CodeGroup { public class DebugSuspend : CodeBlock { public override void Assemble() { - Memory["DebugSuspendLevel", 32]++; + DebugSuspendLevel.Value++; } } public class DebugResume : CodeBlock { public override void Assemble() { - Memory["DebugSuspendLevel", 32]--; + DebugSuspendLevel.Value--; } } } diff --git a/source2/Compiler/Cosmos.Compiler.XSharp/DataMember32.cs b/source2/Compiler/Cosmos.Compiler.XSharp/DataMember32.cs index e0d434f61..30bb5ac37 100644 --- a/source2/Compiler/Cosmos.Compiler.XSharp/DataMember32.cs +++ b/source2/Compiler/Cosmos.Compiler.XSharp/DataMember32.cs @@ -19,9 +19,18 @@ namespace Cosmos.Compiler.XSharp { return new MemoryAction(ElementReference.New(Name)) { IsIndirect = true, Size = 32 }; } set { - new Move { - DestinationRef = ElementReference.New(Name), DestinationIsIndirect = true - , SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect }; + // For DataMember32 value will be null with ++ and --, this is important and purposeful. + // ++ and -- try to set again, but for us we dont want that. + if (value != null) { + new Move { + DestinationRef = ElementReference.New(Name), + DestinationIsIndirect = true, + SourceValue = value.Value.GetValueOrDefault(), + SourceRef = value.Reference, + SourceReg = value.Register, + SourceIsIndirect = value.IsIndirect + }; + } } } } diff --git a/source2/Compiler/Cosmos.Compiler.XSharp/MemoryAction.cs b/source2/Compiler/Cosmos.Compiler.XSharp/MemoryAction.cs index 53c54e968..fb2b6a5d0 100644 --- a/source2/Compiler/Cosmos.Compiler.XSharp/MemoryAction.cs +++ b/source2/Compiler/Cosmos.Compiler.XSharp/MemoryAction.cs @@ -33,11 +33,13 @@ namespace Cosmos.Compiler.XSharp { public static MemoryAction operator ++(MemoryAction aTarget) { aTarget.ApplyToDest(new INC()); + // Must return null, see DataMember.this[] comment return null; } public static MemoryAction operator --(MemoryAction aTarget) { aTarget.ApplyToDest(new Dec()); + // Must return null, see DataMember.this[] comment return null; } diff --git a/source2/IL2CPU/Cosmos.IL2CPU.X86/CosmosAssembler.cs b/source2/IL2CPU/Cosmos.IL2CPU.X86/CosmosAssembler.cs index 90b9b4adb..bfb0140eb 100644 --- a/source2/IL2CPU/Cosmos.IL2CPU.X86/CosmosAssembler.cs +++ b/source2/IL2CPU/Cosmos.IL2CPU.X86/CosmosAssembler.cs @@ -258,9 +258,6 @@ namespace Cosmos.IL2CPU.X86 { if (mComNumber > 0) { var xStub = new DebugStub(mComNumber); xStub.Assemble(); - - var xStub2 = new DebugPoint(); - xStub2.Assemble(); } else { new Label("DebugStub_Step"); new Return(); @@ -271,12 +268,9 @@ namespace Cosmos.IL2CPU.X86 { #if !LFB_1024_8 DataMembers.Add(new DataIfNotDefined("ELF_COMPILATION")); uint xFlags = 0x10003; - DataMembers.Add(new DataMember("MultibootSignature", - new uint[] { 0x1BADB002 })); - DataMembers.Add(new DataMember("MultibootFlags", - xFlags)); - DataMembers.Add(new DataMember("MultibootChecksum", - (int)(0 - (xFlags + 0x1BADB002)))); + DataMembers.Add(new DataMember("MultibootSignature", new uint[] { 0x1BADB002 })); + DataMembers.Add(new DataMember("MultibootFlags", xFlags)); + DataMembers.Add(new DataMember("MultibootChecksum", (int)(0 - (xFlags + 0x1BADB002)))); DataMembers.Add(new DataMember("MultibootHeaderAddr", ElementReference.New("MultibootSignature"))); DataMembers.Add(new DataMember("MultibootLoadAddr", ElementReference.New("MultibootSignature"))); DataMembers.Add(new DataMember("MultibootLoadEndAddr", ElementReference.New("_end_code"))); @@ -285,12 +279,9 @@ namespace Cosmos.IL2CPU.X86 { DataMembers.Add(new DataEndIfDefined()); DataMembers.Add(new DataIfDefined("ELF_COMPILATION")); xFlags = 0x00003; - DataMembers.Add(new DataMember("MultibootSignature", - new uint[] { 0x1BADB002 })); - DataMembers.Add(new DataMember("MultibootFlags", - xFlags)); - DataMembers.Add(new DataMember("MultibootChecksum", - (int)(0 - (xFlags + 0x1BADB002)))); + DataMembers.Add(new DataMember("MultibootSignature", new uint[] { 0x1BADB002 })); + DataMembers.Add(new DataMember("MultibootFlags", xFlags)); + DataMembers.Add(new DataMember("MultibootChecksum", (int)(0 - (xFlags + 0x1BADB002)))); DataMembers.Add(new DataEndIfDefined()); #else DataMembers.Add(new DataIfNotDefined("ELF_COMPILATION")); @@ -330,10 +321,8 @@ namespace Cosmos.IL2CPU.X86 { // memory DataMembers.Add(new DataMember("MultiBootInfo_Memory_High", 0)); DataMembers.Add(new DataMember("MultiBootInfo_Memory_Low", 0)); - DataMembers.Add(new DataMember("Before_Kernel_Stack", - new byte[0x50000])); - DataMembers.Add(new DataMember("Kernel_Stack", - new byte[0])); + DataMembers.Add(new DataMember("Before_Kernel_Stack", new byte[0x50000])); + DataMembers.Add(new DataMember("Kernel_Stack", new byte[0])); DataMembers.Add(new DataMember("MultiBootInfo_Structure", new uint[1])); }