Implemented conditional jumping

This commit is contained in:
Bartłomiej Szostak 2024-05-02 18:36:36 +02:00
parent 2585629c25
commit 43c2543a95
No known key found for this signature in database
GPG Key ID: 562DACF230A18086
3 changed files with 70 additions and 2 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;