Made $2=$CF, $3=$SP.

Implemented Call and Return.
This commit is contained in:
2025-08-15 05:19:49 +10:00
parent 18ad735a32
commit 1c36c69738
2 changed files with 53 additions and 12 deletions

View File

@@ -36,7 +36,7 @@ namespace SVM.Advanced.BSDStyleVM
{ {
var config = new SVMConfig(); var config = new SVMConfig();
config.PCRegisterID = 1; config.PCRegisterID = 1;
config.SPRegisterID = 2; config.CFRegisterID = 2;
SetupSyscall(config); SetupSyscall(config);
return config; return config;

View File

@@ -31,10 +31,11 @@ namespace SVM.Core
{ {
registers.Init(RegisterSize); registers.Init(RegisterSize);
uint SPOffset = 2; uint CFOffset = 2;
uint SPOffset = 3;
if (Config != null) if (Config != null)
{ {
SPOffset = Config.SPRegisterID; CFOffset = Config.CFRegisterID;
} }
if (GPMemory == 0) if (GPMemory == 0)
{ {
@@ -49,32 +50,59 @@ namespace SVM.Core
MemoryBlock block = new MemoryBlock(); MemoryBlock block = new MemoryBlock();
block.Init(GPMemory); block.Init(GPMemory);
SetMemory(1, block); SetMemory(1, block);
registers.SetData<SVMPointer>((int)SPOffset, new SVMPointer() { index = 1, offset = 0 }); registers.SetData<SVMPointer>((int)CFOffset, new SVMPointer() { index = 1, offset = 0 });
registers.SetData<SVMPointer>((int)SPOffset, new SVMPointer() { index = 1, offset = StackSize });
} }
} }
public bool isReachBinaryEnd() public bool isReachBinaryEnd()
{ {
uint SPOffset = 2;
uint PCOffset = 1; uint PCOffset = 1;
uint ErrorIDOffset = 3;
if (Config != null) if (Config != null)
{ {
SPOffset = Config.SPRegisterID;
PCOffset = Config.PCRegisterID; PCOffset = Config.PCRegisterID;
ErrorIDOffset = Config.EIDRegisterID;
} }
var PC = registers.GetData<ulong>((int)PCOffset); var PC = registers.GetData<ulong>((int)PCOffset);
return PC >= Program->InstructionCount; 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<ulong>((int)CFOffset);
}
public SVMPointer ReadCallFrameRegisterAsPtr()
{
uint CFOffset = 2;
if (Config != null)
{
CFOffset = Config.CFRegisterID;
}
return registers.GetData<SVMPointer>((int)CFOffset);
}
public void Step() public void Step()
{ {
uint SPOffset = 2; uint CFOffset = 2;
uint PCOffset = 1; uint PCOffset = 1;
uint ErrorIDOffset = 3; uint ErrorIDOffset = 3;
if (Config != null) if (Config != null)
{ {
SPOffset = Config.SPRegisterID; CFOffset = Config.CFRegisterID;
PCOffset = Config.PCRegisterID; PCOffset = Config.PCRegisterID;
ErrorIDOffset = Config.EIDRegisterID; ErrorIDOffset = Config.EIDRegisterID;
} }
@@ -193,8 +221,19 @@ namespace SVM.Core
} }
break; break;
case PrimaryInstruction.Call: case PrimaryInstruction.Call:
WriteCallFrameRegister(ReadCallFrameRegister() + 1);
{
var cfPtr = GetPointer(ReadCallFrameRegisterAsPtr());
cfPtr.SetData(PC + 1);
}
break; break;
case PrimaryInstruction.Return: case PrimaryInstruction.Return:
{
var cfPtr = GetPointer(ReadCallFrameRegisterAsPtr());
PC = cfPtr.GetData<ulong>();
PC -= 1;
}
break; break;
case PrimaryInstruction.System: case PrimaryInstruction.System:
if (Config != null) if (Config != null)
@@ -222,7 +261,7 @@ namespace SVM.Core
} }
PC++; PC++;
registers.SetData<ulong>((int)PCOffset, PC); registers.SetData<ulong>((int)PCOffset, PC);
PC = registers.GetData<ulong>((int)PCOffset); //PC = registers.GetData<ulong>((int)PCOffset);
} }
private void Convert(SVMInstruction Instruction) private void Convert(SVMInstruction Instruction)
@@ -381,8 +420,10 @@ namespace SVM.Core
public class SVMConfig public class SVMConfig
{ {
public Dictionary<uint, FuncCall> FuncCalls = new Dictionary<uint, FuncCall>(); public Dictionary<uint, FuncCall> FuncCalls = new Dictionary<uint, FuncCall>();
public uint SPRegisterID; //Call Frame ID
public uint CFRegisterID;
public uint PCRegisterID; public uint PCRegisterID;
public uint SPRegisterID;
/// <summary> /// <summary>
/// Error ID Register. /// Error ID Register.
/// </summary> /// </summary>