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); Debug.Assert(vars.Length > 1);
var reg = vars[0]; var reg = vars[0];
if (reg <= VM.REGISTERS) if (reg > VM.REGISTERS)
{ {
throw new Fault(FaultType.IllegalOp); throw new Fault(FaultType.IllegalOp);
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -82,6 +82,7 @@ namespace SVM
{ {
if (RUN) if (RUN)
{ {
var nextPC = PC++;
try try
{ {
InstructionCount++; InstructionCount++;
@@ -89,8 +90,7 @@ namespace SVM
{ {
throw new Fault(FaultType.MemoryOverflow); throw new Fault(FaultType.MemoryOverflow);
} }
var pc = PC; var op = MEM[nextPC];
var op = MEM[PC++];
if (!instructions.ContainsKey(op)) if (!instructions.ContainsKey(op))
{ {
throw new Fault(FaultType.UndefinedOp); throw new Fault(FaultType.UndefinedOp);
@@ -107,8 +107,9 @@ namespace SVM
if (!faultStatus.Trip(flt)) if (!faultStatus.Trip(flt))
{ {
//Halt system as trip failed (already tripped or not enabled) //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( 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; RUN = false;
} else } else