sillymachine/src/sillymachine.adb
2024-04-20 16:44:04 +02:00

88 lines
2.3 KiB
Ada

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Sequential_IO;
with Ada.Command_Line; use Ada.Command_Line;
with Ada.Directories;
procedure sillymachine is
type Byte is mod 256;
package Bin_IO is new Ada.Sequential_IO (Byte);
type ByteArr is array (Integer range <>) of Byte;
F : Bin_IO.File_Type;
FileName : String (1 .. 255) := (others => ascii.nul);
FileNameLength : Integer := 0;
ValidHeader : ByteArr (0 .. 15);
Arr : ByteArr (0 .. 15);
I : Integer := 0;
Value : Byte;
MemorySize : Integer := 1048576; -- default memory is 1 mb (TODO: figure out why 8 mb produces STORAGE_ERROR)
begin
ValidHeader (0) := 6;
ValidHeader (1) := 148;
ValidHeader (2) := 32;
ValidHeader (3) := 118;
ValidHeader (4) := 101;
ValidHeader (5) := 114;
ValidHeader (6) := 121;
ValidHeader (7) := 95;
ValidHeader (8) := 115;
ValidHeader (9) := 105;
ValidHeader (10) := 108;
ValidHeader (11) := 108;
ValidHeader (12) := 121;
ValidHeader (13) := 0;
ValidHeader (14) := 0;
ValidHeader (15) := 0;
if Argument_Count = 0 then
New_Line(1);
Put_Line("Usage: sillymachine <sm binary file> <number of megabytes for wanted memory (optional)>");
New_Line(1);
goto THE_END;
end if;
FileNameLength := Argument (1)'Length;
FileName(1 .. FileNameLength) := Argument (1);
Bin_IO.Open(F, Bin_IO.In_File, FileName);
while not Bin_IO.End_Of_File (F) loop
Bin_IO.Read(F, Value);
if ValidHeader (I) = Value then
Value := Value; -- useless line so compiler does not complain
else
New_Line(1);
Put_Line("Error: Please use a valid sm binary file");
New_Line(1);
goto THE_END;
end if;
I := I + 1;
end loop;
Put_Line("Header passed");
if Argument_Count > 1 then
MemorySize := 1048576 * Integer'Value(Argument (2));
end if;
declare
MemoryArr : ByteArr (0 .. MemorySize);
begin
for i in 0 .. MemorySize loop -- zero initialise memory
MemoryArr (i) := 0;
end loop;
end;
<< THE_END >>
exception
when Name_Error => New_Line(1); Put("Error: File '"); Put(FileName); Put_Line("' does not exist!"); New_Line(1);
when Constraint_Error => New_Line(1); Put_Line("Error: Memory should be passed as an Integer"); New_Line(1);
when Storage_Error => New_Line(1); Put_Line("Error: Something went silly!"); New_Line(1);
end sillymachine;