From 0afa446b9b79962f1bc7ddd9cecaa717a5144a0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Szostak?= Date: Thu, 2 May 2024 15:13:49 +0200 Subject: [PATCH] Moved some instructions around --- src/shardware.adb | 103 ++++++++++++++++++++++++++++++++++--------- src/shardware.ads | 23 +++++++--- src/sillymachine.adb | 58 ++++++++++++------------ 3 files changed, 126 insertions(+), 58 deletions(-) diff --git a/src/shardware.adb b/src/shardware.adb index 85f8c41..3ee9ffa 100644 --- a/src/shardware.adb +++ b/src/shardware.adb @@ -77,6 +77,14 @@ package body Shardware is return Unsigned_32(Shift_Left(Unsigned_128(Value), Amount)); end MyShiftU; + function BytesToU (TheBytes : ByteArr) return Unsigned_32 is + begin + return Unsigned_32(MyShiftU(TheBytes (1), 24) + + MyShiftU(TheBytes (2), 16) + + MyShiftU(TheBytes (3), 8) + + Unsigned_32(TheBytes (4))); + end BytesToU; + function BytesToI (TheBytes : ByteArr) return Integer is begin return UnToSignedInt(BytesToU(TheBytes)); @@ -88,7 +96,6 @@ package body Shardware is TheBits : BitArr (1 .. 32); BitBuff : BitArr (1 .. 32); Mantissa : Float := 0.0; - PowerOfTen : Integer := 0; Exponent : Natural := 0; Sign : Float := 1.0; begin @@ -134,43 +141,95 @@ package body Shardware is return Result; end BytesToF; - function BytesToU (TheBytes : ByteArr) return Unsigned_32 is + procedure MovU (Register : in out Unsigned_32; Value : Unsigned_32) is begin - return Unsigned_32(MyShiftU(TheBytes (1), 24) - + MyShiftU(TheBytes (2), 16) - + MyShiftU(TheBytes (3), 8) - + Unsigned_32(TheBytes (4))); - end BytesToU; + Register := Value; + end MovU; procedure MovI (Register : in out Integer; Value : Integer) is begin Register := Value; end MovI; - procedure AddI (Register : in out Integer; Value : Integer) is - begin - Register := Register + Value; - end AddI; - procedure MovF (Register : in out Float; Value : Float) is begin Register := Value; end MovF; - procedure AddF (Register : in out Float; Value : Float) is - begin - Register := Register + Value; - end AddF; - - procedure MovU (Register : in out Unsigned_32; Value : Unsigned_32) is - begin - Register := Value; - end MovU; - procedure AddU (Register : in out Unsigned_32; Value : Unsigned_32) is begin Register := Register + Value; end AddU; + procedure AddI (Register : in out Integer; Value : Integer) is + begin + Register := Register + Value; + end AddI; + + procedure AddF (Register : in out Float; Value : Float) is + begin + Register := Register + Value; + end AddF; + + procedure SubU (Register : in out Unsigned_32; Value : Unsigned_32) is + begin + if Value > Register then + raise Constraint_Error with "Unsigned value can't be lower than 0."; + else + Register := Register - Value; + end if; + end SubU; + + procedure SubI (Register : in out Integer; Value : Integer) is + begin + Register := Register - Value; + end SubI; + + procedure SubF (Register : in out Float; Value : Float) is + begin + Register := Register - Value; + end SubF; + + procedure MulU (Register : in out Unsigned_32; Value : Unsigned_32) is + begin + Register := Register * Value; + end MulU; + + procedure MulI (Register : in out Integer; Value : Integer) is + begin + Register := Register * Value; + end MulI; + + procedure MulF (Register : in out Float; Value : Float) is + begin + Register := Register * Value; + end MulF; + + procedure DivU (Register : in out Unsigned_32; Value : Unsigned_32) is + begin + if Value = 0 then + raise Constraint_Error with "Please do not divide by 0."; + else + Register := Register / Value; + end if; + end DivU; + + procedure DivI (Register : in out Integer; Value : Integer) is + begin + if Value = 0 then + raise Constraint_Error with "Please do not divide by 0."; + else + Register := Register / Value; + end if; + end DivI; + + procedure DivF (Register : in out Float; Value : Float) is + begin + if Value = 0.0 then + raise Constraint_Error with "Please do not divide by 0."; + else + Register := Register / Value; + end if; + end DivF; end Shardware; diff --git a/src/shardware.ads b/src/shardware.ads index 9a1d814..23c7fa1 100644 --- a/src/shardware.ads +++ b/src/shardware.ads @@ -22,15 +22,28 @@ package Shardware is function MyShiftU (Value : Byte; Amount : Integer) return Unsigned_32; + function BytesToU (TheBytes : ByteArr) return Unsigned_32; function BytesToI (TheBytes : ByteArr) return Integer; function BytesToF (TheBytes : ByteArr) return Float; - function BytesToU (TheBytes : ByteArr) return Unsigned_32; - procedure MovI (Register : in out Integer; Value : Integer); - procedure AddI (Register : in out Integer; Value : Integer); - procedure MovF (Register : in out Float; Value : Float); - procedure AddF (Register : in out Float; Value : Float); procedure MovU (Register : in out Unsigned_32; Value : Unsigned_32); + procedure MovI (Register : in out Integer; Value : Integer); + procedure MovF (Register : in out Float; Value : Float); + procedure AddU (Register : in out Unsigned_32; Value : Unsigned_32); + procedure AddI (Register : in out Integer; Value : Integer); + procedure AddF (Register : in out Float; Value : Float); + + procedure SubU (Register : in out Unsigned_32; Value : Unsigned_32); + procedure SubI (Register : in out Integer; Value : Integer); + procedure SubF (Register : in out Float; Value : Float); + + procedure MulU (Register : in out Unsigned_32; Value : Unsigned_32); + procedure MulI (Register : in out Integer; Value : Integer); + procedure MulF (Register : in out Float; Value : Float); + + procedure DivU (Register : in out Unsigned_32; Value : Unsigned_32); + procedure DivI (Register : in out Integer; Value : Integer); + procedure DivF (Register : in out Float; Value : Float); end Shardware; diff --git a/src/sillymachine.adb b/src/sillymachine.adb index e3eca53..dc28f58 100644 --- a/src/sillymachine.adb +++ b/src/sillymachine.adb @@ -17,14 +17,14 @@ procedure sillymachine is Value : Byte; ExecSize : Integer := 0; - MemorySize : Integer := 1048576; -- default memory is 1 mb (TODO: figure out why 8 mb produces STORAGE_ERROR) + MemorySize : Integer := 0; PC : Integer := 0; -- Program Counter Instruction : ByteArr (0 .. 15); + RegisterU : RegArrU (0 .. 27); RegisterI : RegArrI (0 .. 27); RegisterF : RegArrF (0 .. 27); - RegisterU : RegArrU (0 .. 27); begin @@ -48,7 +48,7 @@ begin if Argument_Count = 0 then New_Line(1); - Put_Line("Usage: sillymachine "); + Put_Line("Usage: sillymachine "); New_Line(1); goto THE_END; end if; @@ -78,12 +78,8 @@ begin Bin_IO.Close(F); Put_Line("Header passed"); - if Argument_Count > 1 then - MemorySize := 1048576 * Integer'Value(Argument (2)); - end if; - ExecSize := Integer(Ada.Directories.Size(FileName)); - MemorySize := MemorySize + ExecSize; + MemorySize := ExecSize; declare MemoryArr : ByteArr (0 .. MemorySize); @@ -116,43 +112,43 @@ begin case MyShiftU(Instruction (0), 8) + Unsigned_32(Instruction (1)) is -- execute the instruction when 0 => null; -- NOP when 1 => null; -- TODO: TRAP - when 2 => MovU(RegisterU(Integer(Instruction (2))), - BytesToU(TempBytes(Instruction))); -- Move Unsigned_32 to Register + when 2 => MovU(RegisterU(Integer(Instruction (2))), -- Move Unsigned_32 to Register + BytesToU(TempBytes(Instruction))); when 3 => MovU(RegisterU(Integer(Instruction (2))), -- Move Register to Register (Unsigned_32) RegisterU(Integer(Instruction (3)))); - when 4 => null; -- TODO: Move Memory to Register - when 5 => AddU(RegisterU(Integer(Instruction (2))), -- Add Unsigned_32 to Register (Only positive values for now) - BytesToU(TempBytes(Instruction))); - when 6 => AddU(RegisterU(Integer(Instruction (2))), -- Add Register to Register (Unsigned_32) - RegisterU(Integer(Instruction (3)))); - when 7 => MovI(RegisterI(Integer(Instruction (2))), -- Move Int to Register + when 4 => null; -- TODO: Move Memory to Register (Unsigned_32) + when 5 => MovI(RegisterI(Integer(Instruction (2))), -- Move Int to Register BytesToI(TempBytes(Instruction))); - when 8 => MovI(RegisterI(Integer(Instruction (2))), -- Move Register to Register (Int) + when 6 => MovI(RegisterI(Integer(Instruction (2))), -- Move Register to Register (Int) RegisterI(Integer(Instruction (3)))); - when 9 => null; -- TODO: Move Memory to Register - when 10 => AddI(RegisterI(Integer(Instruction (2))), -- Add Int to Register - BytesToI(TempBytes(Instruction))); - when 11 => AddI(RegisterI(Integer(Instruction (2))), -- Add Register to Register (Int) - RegisterI(Integer(Instruction (3)))); - when 12 => MovF(RegisterF(Integer(Instruction (2))), -- Move Float to Register + when 7 => null; -- TODO: Move Memory to Register + when 8 => MovF(RegisterF(Integer(Instruction (2))), -- Move Float to Register BytesToF(TempBytes(Instruction))); - when 14 => MovF(RegisterF(Integer(Instruction (2))), -- Move Register to Register (Float) + when 9 => MovF(RegisterF(Integer(Instruction (2))), -- Move Register to Register (Float) RegisterF(Integer(Instruction (3)))); - when 15 => null; -- TODO: Move Memory to Register (Float) - when 16 => AddF(RegisterF(Integer(Instruction (2))), -- Add Float to Register + when 10 => null; -- TODO: Move Memory to Register (Float) + when 11 => AddU(RegisterU(Integer(Instruction (2))), -- Add Unsigned_32 to Register + BytesToU(TempBytes(Instruction))); + when 12 => AddU(RegisterU(Integer(Instruction (2))), -- Add Register to Register (Unsigned_32) + RegisterU(Integer(Instruction (3)))); + when 13 => AddI(RegisterI(Integer(Instruction (2))), -- Add Int to Register + BytesToI(TempBytes(Instruction))); + when 14 => AddI(RegisterI(Integer(Instruction (2))), -- Add Register to Register (Int) + RegisterI(Integer(Instruction (3)))); + when 15 => AddF(RegisterF(Integer(Instruction (2))), -- Add Float to Register BytesToF(TempBytes(Instruction))); - when 17 => AddF(RegisterF(Integer(Instruction (2))), -- Add Register to Register (Float) + when 16 => AddF(RegisterF(Integer(Instruction (2))), -- Add Register to Register (Float) RegisterF(Integer(Instruction (3)))); when 65535 => goto THE_END; -- exit opcode when others => null; end case; - --Put_Line(Unsigned_32'Image(RegisterU(0))); - --Put_Line(Unsigned_32'Image(RegisterU(1))); + 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))); + --Put_Line(Float'Image(RegisterF(0))); + --Put_Line(Float'Image(RegisterF(1))); PC := PC + 16; -- increment program counter to next instruction end loop;