aboutsummaryrefslogtreecommitdiffstats
path: root/src/cpu.ads
blob: 562402fb66d85097289b527a37eacd9d72d6ca13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
with Ada.Containers.Vectors;
with ISA;

package CPU is
   use ISA;

   package Address_Stack is new Ada.Containers.Vectors
      (Index_Type => Natural, Element_Type => Address);

   type Instance is record
      Memory           : Bank := [
         16#F0#, 16#90#, 16#90#, 16#90#, 16#F0#, -- 0
         16#20#, 16#60#, 16#20#, 16#20#, 16#70#, -- 1
         16#F0#, 16#10#, 16#F0#, 16#80#, 16#F0#, -- 2
         16#F0#, 16#10#, 16#F0#, 16#10#, 16#F0#, -- 3
         16#90#, 16#90#, 16#F0#, 16#10#, 16#10#, -- 4
         16#F0#, 16#80#, 16#F0#, 16#10#, 16#F0#, -- 5
         16#F0#, 16#80#, 16#F0#, 16#90#, 16#F0#, -- 6
         16#F0#, 16#10#, 16#20#, 16#40#, 16#40#, -- 7
         16#F0#, 16#90#, 16#F0#, 16#90#, 16#F0#, -- 8
         16#F0#, 16#90#, 16#F0#, 16#10#, 16#F0#, -- 9
         16#F0#, 16#90#, 16#F0#, 16#90#, 16#90#, -- A
         16#E0#, 16#90#, 16#E0#, 16#90#, 16#E0#, -- B
         16#F0#, 16#80#, 16#80#, 16#80#, 16#F0#, -- C
         16#E0#, 16#90#, 16#90#, 16#90#, 16#E0#, -- D
         16#F0#, 16#80#, 16#F0#, 16#80#, 16#F0#, -- E
         16#F0#, 16#80#, 16#F0#, 16#80#, 16#80#, -- F
         others => 0
      ];
      Registers        : Register_Bank;
      Program_Counter  : Address := Start_Address;
      Address_Register : Address := 0;
      Stack            : Address_Stack.Vector;
      Delay_Timer      : Byte := 0;
   end record;

   procedure Load_File (Inst : in out Instance; File_Name : String);

   function Get_Opcode (Inst : in out Instance) return Opcode;

   procedure Reg_Store (Inst : in out Instance; VX : Register_Index);
   procedure Reg_Load (Inst : in out Instance; VX : Register_Index);
   procedure Ret (Inst : in out Instance);
   procedure Call (Inst : in out Instance; A : Address);
   procedure Jump (Inst : in out Instance; A : Address);
   procedure Skip (Inst : in out Instance);
   procedure Math (Inst : in out Instance; VX, VY : Register_Index; N : Byte);
end CPU;