Implemented conditional jumping
This commit is contained in:
parent
2585629c25
commit
43c2543a95
@ -232,4 +232,40 @@ package body Shardware is
|
||||
end if;
|
||||
end DivF;
|
||||
|
||||
function CmpU (Register : Unsigned_32; Value : Unsigned_32) return Boolean is
|
||||
begin
|
||||
if Register = Value then
|
||||
return True;
|
||||
else
|
||||
return False;
|
||||
end if;
|
||||
end CmpU;
|
||||
|
||||
function CmpI (Register : Integer; Value : Integer) return Boolean is
|
||||
begin
|
||||
if Register = Value then
|
||||
return True;
|
||||
else
|
||||
return False;
|
||||
end if;
|
||||
end CmpI;
|
||||
|
||||
function CmpF (Register : Float; Value : Float) return Boolean is
|
||||
begin
|
||||
if Register = Value then
|
||||
return True;
|
||||
else
|
||||
return False;
|
||||
end if;
|
||||
end CmpF;
|
||||
|
||||
function Jump (Address : Unsigned_32) return Unsigned_32 is
|
||||
begin
|
||||
if Address mod 2 = 0 then
|
||||
return Address;
|
||||
else
|
||||
raise Constraint_Error with "Can only jump to start of the line";
|
||||
end if;
|
||||
end Jump;
|
||||
|
||||
end Shardware;
|
||||
|
@ -46,4 +46,10 @@ package Shardware is
|
||||
procedure DivI (Register : in out Integer; Value : Integer);
|
||||
procedure DivF (Register : in out Float; Value : Float);
|
||||
|
||||
function CmpU (Register : Unsigned_32; Value : Unsigned_32) return Boolean;
|
||||
function CmpI (Register : Integer; Value : Integer) return Boolean;
|
||||
function CmpF (Register : Float; Value : Float) return Boolean;
|
||||
|
||||
function Jump (Address : Unsigned_32) return Unsigned_32;
|
||||
|
||||
end Shardware;
|
||||
|
@ -19,13 +19,15 @@ procedure sillymachine is
|
||||
ExecSize : Integer := 0;
|
||||
MemorySize : Integer := 0;
|
||||
|
||||
PC : Integer := 0; -- Program Counter
|
||||
PC : Unsigned_32 := 0; -- Program Counter
|
||||
Instruction : ByteArr (0 .. 15);
|
||||
|
||||
RegisterU : RegArrU (0 .. 27);
|
||||
RegisterI : RegArrI (0 .. 27);
|
||||
RegisterF : RegArrF (0 .. 27);
|
||||
|
||||
ZeroFlag : Boolean := False;
|
||||
|
||||
begin
|
||||
|
||||
|
||||
@ -106,7 +108,7 @@ begin
|
||||
PC := 64; -- initialise program counter to entry point
|
||||
while True loop
|
||||
for i in 0 .. 15 loop -- load the instruction
|
||||
Instruction (i) := MemoryArr (PC + i);
|
||||
Instruction (i) := MemoryArr (Integer(PC) + i);
|
||||
end loop;
|
||||
|
||||
case MyShiftU(Instruction (0), 8) + Unsigned_32(Instruction (1)) is -- execute the instruction
|
||||
@ -175,6 +177,30 @@ begin
|
||||
BytesToF(TempBytes(Instruction)));
|
||||
when 34 => DivF(RegisterF(Integer(Instruction(2))), -- Divide Register by Register (Float)
|
||||
RegisterF(Integer(Instruction (3))));
|
||||
when 35 => ZeroFlag := CmpU(RegisterU(Integer(Instruction(2))),
|
||||
BytesToU(TempBytes(Instruction)));
|
||||
when 36 => ZeroFlag := CmpU(RegisterU(Integer(Instruction(2))),
|
||||
RegisterU(Integer(Instruction (3))));
|
||||
when 37 => ZeroFlag := CmpI(RegisterI(Integer(Instruction(2))),
|
||||
BytesToI(TempBytes(Instruction)));
|
||||
when 38 => ZeroFlag := CmpI(RegisterI(Integer(Instruction(2))),
|
||||
RegisterI(Integer(Instruction (3))));
|
||||
when 39 => ZeroFlag := CmpF(RegisterF(Integer(Instruction(2))),
|
||||
BytesToF(TempBytes(Instruction)));
|
||||
when 40 => ZeroFlag := CmpF(RegisterF(Integer(Instruction(2))),
|
||||
RegisterF(Integer(Instruction (3))));
|
||||
when 41 =>
|
||||
if ZeroFlag then
|
||||
PC := Jump(BytesToU(TempBytes(Instruction)));
|
||||
else
|
||||
null;
|
||||
end if;
|
||||
when 42 =>
|
||||
if ZeroFlag then
|
||||
null;
|
||||
else
|
||||
PC := Jump(BytesToU(TempBytes(Instruction)));
|
||||
end if;
|
||||
when 65535 => goto THE_END; -- exit opcode
|
||||
when others => null;
|
||||
end case;
|
||||
|
Loading…
x
Reference in New Issue
Block a user