88 lines
2.3 KiB
Ada
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;
|