From 1c36c69738268d099e49467482fda040fd4495d2 Mon Sep 17 00:00:00 2001 From: Creeper Lv Date: Fri, 15 Aug 2025 05:19:49 +1000 Subject: [PATCH] Made $2=$CF, $3=$SP. Implemented Call and Return. --- src/SVM.Advanced/BSDStyleVM/BSDLikeWrapper.cs | 2 +- src/SVM.Core/SimpleVirtualMachine.cs | 63 +++++++++++++++---- 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/SVM.Advanced/BSDStyleVM/BSDLikeWrapper.cs b/src/SVM.Advanced/BSDStyleVM/BSDLikeWrapper.cs index 8d07f28..0f7a919 100644 --- a/src/SVM.Advanced/BSDStyleVM/BSDLikeWrapper.cs +++ b/src/SVM.Advanced/BSDStyleVM/BSDLikeWrapper.cs @@ -36,7 +36,7 @@ namespace SVM.Advanced.BSDStyleVM { var config = new SVMConfig(); config.PCRegisterID = 1; - config.SPRegisterID = 2; + config.CFRegisterID = 2; SetupSyscall(config); return config; diff --git a/src/SVM.Core/SimpleVirtualMachine.cs b/src/SVM.Core/SimpleVirtualMachine.cs index 12a2f3f..f3ada2c 100644 --- a/src/SVM.Core/SimpleVirtualMachine.cs +++ b/src/SVM.Core/SimpleVirtualMachine.cs @@ -31,10 +31,11 @@ namespace SVM.Core { registers.Init(RegisterSize); - uint SPOffset = 2; + uint CFOffset = 2; + uint SPOffset = 3; if (Config != null) { - SPOffset = Config.SPRegisterID; + CFOffset = Config.CFRegisterID; } if (GPMemory == 0) { @@ -49,32 +50,59 @@ namespace SVM.Core MemoryBlock block = new MemoryBlock(); block.Init(GPMemory); SetMemory(1, block); - registers.SetData((int)SPOffset, new SVMPointer() { index = 1, offset = 0 }); + registers.SetData((int)CFOffset, new SVMPointer() { index = 1, offset = 0 }); + registers.SetData((int)SPOffset, new SVMPointer() { index = 1, offset = StackSize }); } } public bool isReachBinaryEnd() { - uint SPOffset = 2; uint PCOffset = 1; - uint ErrorIDOffset = 3; if (Config != null) { - SPOffset = Config.SPRegisterID; PCOffset = Config.PCRegisterID; - ErrorIDOffset = Config.EIDRegisterID; } var PC = registers.GetData((int)PCOffset); return PC >= Program->InstructionCount; } + public void WriteCallFrameRegister(ulong value) + { + uint CFOffset = 2; + + if (Config != null) + { + CFOffset = Config.CFRegisterID; + } + registers.SetDataInRegister((int)CFOffset, value); + } + public ulong ReadCallFrameRegister() + { + uint CFOffset = 2; + + if (Config != null) + { + CFOffset = Config.CFRegisterID; + } + return registers.GetData((int)CFOffset); + } + public SVMPointer ReadCallFrameRegisterAsPtr() + { + uint CFOffset = 2; + + if (Config != null) + { + CFOffset = Config.CFRegisterID; + } + return registers.GetData((int)CFOffset); + } public void Step() { - uint SPOffset = 2; + uint CFOffset = 2; uint PCOffset = 1; uint ErrorIDOffset = 3; if (Config != null) { - SPOffset = Config.SPRegisterID; + CFOffset = Config.CFRegisterID; PCOffset = Config.PCRegisterID; ErrorIDOffset = Config.EIDRegisterID; } @@ -193,8 +221,19 @@ namespace SVM.Core } break; case PrimaryInstruction.Call: + WriteCallFrameRegister(ReadCallFrameRegister() + 1); + { + var cfPtr = GetPointer(ReadCallFrameRegisterAsPtr()); + cfPtr.SetData(PC + 1); + } break; case PrimaryInstruction.Return: + { + + var cfPtr = GetPointer(ReadCallFrameRegisterAsPtr()); + PC = cfPtr.GetData(); + PC -= 1; + } break; case PrimaryInstruction.System: if (Config != null) @@ -222,7 +261,7 @@ namespace SVM.Core } PC++; registers.SetData((int)PCOffset, PC); - PC = registers.GetData((int)PCOffset); + //PC = registers.GetData((int)PCOffset); } private void Convert(SVMInstruction Instruction) @@ -381,8 +420,10 @@ namespace SVM.Core public class SVMConfig { public Dictionary FuncCalls = new Dictionary(); - public uint SPRegisterID; + //Call Frame ID + public uint CFRegisterID; public uint PCRegisterID; + public uint SPRegisterID; /// /// Error ID Register. ///