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);
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user