Fixed bug with register bound checking.
Simplified fault test program slightly.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user