Fixed bug with register bound checking.

Simplified fault test program slightly.
This commit is contained in:
2017-12-31 23:35:30 +00:00
parent a972b10981
commit 1e8439934f
9 changed files with 14 additions and 14 deletions

View File

@@ -34,7 +34,7 @@ namespace SVM.Instructions
{
Debug.Assert(vars.Length > 1);
var reg = vars[0];
if (reg <= VM.REGISTERS)
if (reg > VM.REGISTERS)
{
throw new Fault(FaultType.IllegalOp);
}

View File

@@ -27,7 +27,7 @@ namespace SVM.Instructions
{
Debug.Assert(vars.Length == 1);
byte reg = vars[0];
if (reg <= VM.REGISTERS)
if (reg > VM.REGISTERS)
{
throw new Fault(FaultType.IllegalOp);
}

View File

@@ -73,7 +73,7 @@ namespace SVM.Instructions
{
Debug.Assert(vars.Length == 4);
byte reg = vars[0];
if (reg <= VM.REGISTERS)
if (reg > VM.REGISTERS)
{
throw new Fault(FaultType.IllegalOp);
}

View File

@@ -47,7 +47,7 @@ namespace SVM.Instructions
{
Debug.Assert(vars.Length == 3);
byte reg = vars[0];
if (reg <= VM.REGISTERS)
if (reg > VM.REGISTERS)
{
throw new Fault(FaultType.IllegalOp);
}

View File

@@ -47,7 +47,7 @@ namespace SVM.Instructions
{
Debug.Assert(vars.Length > 1);
var reg = vars[0];
if (reg <= VM.REGISTERS)
if (reg > VM.REGISTERS)
{
throw new Fault(FaultType.IllegalOp);
}

View File

@@ -29,7 +29,7 @@ namespace SVM.Instructions
{
Debug.Assert(vars.Length == 1);
var reg = vars[0];
if (reg <= VM.REGISTERS)
if (reg > VM.REGISTERS)
{
throw new Fault(FaultType.IllegalOp);
}

View File

@@ -35,7 +35,7 @@ namespace SVM.Instructions
byte reg = vars[0];
byte bit = vars[1];
if (reg <= VM.REGISTERS)
if (reg > VM.REGISTERS)
{
throw new Fault(FaultType.IllegalOp);
}

View File

@@ -20,10 +20,9 @@ ORIGIN 0x10
CALL :WRNL
RET
:MAIN LOAD A I0x0 # Set fault handler to 0x10
SAVE A F_FLTJH
LOAD A I0x10
SAVE A F_FLTJL
:MAIN LOAD A I0x10 # Set fault handler to 0x10
SAVEH A F_FLTJH
SAVEL A F_FLTJL
CLR A
BTS A 1
SAVE A F_FLTSTS # Enable fault handler

View File

@@ -82,6 +82,7 @@ namespace SVM
{
if (RUN)
{
var nextPC = PC++;
try
{
InstructionCount++;
@@ -89,8 +90,7 @@ namespace SVM
{
throw new Fault(FaultType.MemoryOverflow);
}
var pc = PC;
var op = MEM[PC++];
var op = MEM[nextPC];
if (!instructions.ContainsKey(op))
{
throw new Fault(FaultType.UndefinedOp);
@@ -107,8 +107,9 @@ namespace SVM
if (!faultStatus.Trip(flt))
{
//Halt system as trip failed (already tripped or not enabled)
var nextBytes = BitConverter.ToString(MEM.Subset(nextPC, 4)).Replace("-", " ");
Ports[0].Write(Encoding.ASCII.GetBytes(
string.Format("Unhandled Fault [{0}] at 0x{1:X2}", flt.Type, PC)
string.Format("Unhandled Fault [{0}] at 0x{1:X2}: next bytes {2}.", flt.Type, nextPC, nextBytes)
));
RUN = false;
} else