Implemented writing to standard output

This commit is contained in:
Bartłomiej Szostak 2024-05-02 19:31:41 +02:00
parent 43c2543a95
commit d088328294
No known key found for this signature in database
GPG Key ID: 562DACF230A18086
3 changed files with 32 additions and 17 deletions

View File

@ -1,4 +1,5 @@
with Interfaces; use Interfaces; with Interfaces; use Interfaces;
with Ada.Text_IO; use Ada.Text_IO;
package body Shardware is package body Shardware is
@ -34,7 +35,7 @@ package body Shardware is
Buff (i) := False; Buff (i) := False;
end loop; end loop;
for i in 1 .. 4 loop for i in 1 .. 4 loop
CurByte := TheBytes (i); CurByte := TheBytes (Unsigned_32(i));
for j in reverse 1 .. 8 loop for j in reverse 1 .. 8 loop
if CurByte mod 2 > 0 then if CurByte mod 2 > 0 then
Buff (j + Counter) := True; Buff (j + Counter) := True;
@ -67,7 +68,7 @@ package body Shardware is
end if; end if;
end loop; end loop;
Counter := Counter - 8; Counter := Counter - 8;
Buff (i) := CurByte; Buff (Unsigned_32(i)) := CurByte;
end loop; end loop;
return Buff; return Buff;
end BitsToBytes; end BitsToBytes;
@ -141,6 +142,25 @@ package body Shardware is
return Result; return Result;
end BytesToF; end BytesToF;
procedure Trap (Registers : RegArrU; Memory : in out ByteArr; MemorySize : in out Unsigned_32) is
begin
case Registers(0) is
when 0 => null;
when 1 =>
declare
Pointer : Unsigned_32 := Registers (4) - 1;
Length : Integer := Integer(Registers (3));
CharBuff : String (1 .. Length);
begin
for i in 1 .. Length loop
CharBuff (i) := Character'Val(Memory (Pointer + Unsigned_32(i)));
end loop;
Put_Line(CharBuff);
end;
when others => null;
end case;
end Trap;
procedure MovU (Register : in out Unsigned_32; Value : Unsigned_32) is procedure MovU (Register : in out Unsigned_32; Value : Unsigned_32) is
begin begin
Register := Value; Register := Value;

View File

@ -5,7 +5,7 @@ package Shardware is
type Byte is mod 256; type Byte is mod 256;
package Bin_IO is new Ada.Sequential_IO (Byte); package Bin_IO is new Ada.Sequential_IO (Byte);
type ByteArr is array (Integer range <>) of Byte; type ByteArr is array (Unsigned_32 range <>) of Byte;
type BitArr is array (Integer range <>) of Boolean; type BitArr is array (Integer range <>) of Boolean;
@ -26,6 +26,8 @@ package Shardware is
function BytesToI (TheBytes : ByteArr) return Integer; function BytesToI (TheBytes : ByteArr) return Integer;
function BytesToF (TheBytes : ByteArr) return Float; function BytesToF (TheBytes : ByteArr) return Float;
procedure Trap (Registers : RegArrU; Memory : in out ByteArr; MemorySize : in out Unsigned_32);
procedure MovU (Register : in out Unsigned_32; Value : Unsigned_32); procedure MovU (Register : in out Unsigned_32; Value : Unsigned_32);
procedure MovI (Register : in out Integer; Value : Integer); procedure MovI (Register : in out Integer; Value : Integer);
procedure MovF (Register : in out Float; Value : Float); procedure MovF (Register : in out Float; Value : Float);

View File

@ -13,11 +13,11 @@ procedure sillymachine is
FileNameLength : Integer := 0; FileNameLength : Integer := 0;
ValidHeader : ByteArr (0 .. 15); ValidHeader : ByteArr (0 .. 15);
Arr : ByteArr (0 .. 15); Arr : ByteArr (0 .. 15);
I : Integer := 0; I : Unsigned_32 := 0;
Value : Byte; Value : Byte;
ExecSize : Integer := 0; ExecSize : Unsigned_32 := 0;
MemorySize : Integer := 0; MemorySize : Unsigned_32 := 0;
PC : Unsigned_32 := 0; -- Program Counter PC : Unsigned_32 := 0; -- Program Counter
Instruction : ByteArr (0 .. 15); Instruction : ByteArr (0 .. 15);
@ -78,9 +78,9 @@ begin
end loop; end loop;
<< END_VALID >> << END_VALID >>
Bin_IO.Close(F); Bin_IO.Close(F);
Put_Line("Header passed"); --Put_Line("Header passed");
ExecSize := Integer(Ada.Directories.Size(FileName)); ExecSize := Unsigned_32(Ada.Directories.Size(FileName));
MemorySize := ExecSize; MemorySize := ExecSize;
declare declare
@ -108,12 +108,12 @@ begin
PC := 64; -- initialise program counter to entry point PC := 64; -- initialise program counter to entry point
while True loop while True loop
for i in 0 .. 15 loop -- load the instruction for i in 0 .. 15 loop -- load the instruction
Instruction (i) := MemoryArr (Integer(PC) + i); Instruction (Unsigned_32(i)) := MemoryArr (PC + Unsigned_32(i));
end loop; end loop;
case MyShiftU(Instruction (0), 8) + Unsigned_32(Instruction (1)) is -- execute the instruction case MyShiftU(Instruction (0), 8) + Unsigned_32(Instruction (1)) is -- execute the instruction
when 0 => null; -- NOP when 0 => null; -- NOP
when 1 => null; -- TODO: TRAP when 1 => Trap(RegisterU, MemoryArr, MemorySize); -- TRAP
when 2 => MovU(RegisterU(Integer(Instruction (2))), -- Move Unsigned_32 to Register when 2 => MovU(RegisterU(Integer(Instruction (2))), -- Move Unsigned_32 to Register
BytesToU(TempBytes(Instruction))); BytesToU(TempBytes(Instruction)));
when 3 => MovU(RegisterU(Integer(Instruction (2))), -- Move Register to Register (Unsigned_32) when 3 => MovU(RegisterU(Integer(Instruction (2))), -- Move Register to Register (Unsigned_32)
@ -205,13 +205,6 @@ begin
when others => null; when others => null;
end case; end case;
Put_Line(Unsigned_32'Image(RegisterU(0)));
Put_Line(Unsigned_32'Image(RegisterU(1)));
--Put_Line(Integer'Image(RegisterI(0)));
--Put_Line(Integer'Image(RegisterI(1)));
--Put_Line(Float'Image(RegisterF(0)));
--Put_Line(Float'Image(RegisterF(1)));
PC := PC + 16; -- increment program counter to next instruction PC := PC + 16; -- increment program counter to next instruction
end loop; end loop;