render and polling improvements

main
Clyne 2 weeks ago
parent 1bd0c44fca
commit ca965d766a
Signed by: clyne
GPG Key ID: 3267C8EBF3F9AFC7

@ -10,7 +10,7 @@ with Video;
procedure Ada_Chip is procedure Ada_Chip is
package Random_Byte is new Ada.Numerics.Discrete_Random (Byte); package Random_Byte is new Ada.Numerics.Discrete_Random (Byte);
Steps_Per_Frame : constant := 16; Steps_Per_Frame : constant := 8;
State : CPU.Instance; State : CPU.Instance;
Random_Generator : Random_Byte.Generator; Random_Generator : Random_Byte.Generator;
@ -31,7 +31,10 @@ procedure Ada_Chip is
for J in 0 .. 7 loop for J in 0 .. 7 loop
if Row_Pixels (7 - J) then if Row_Pixels (7 - J) then
if Video.Toggle_Pixel (X + sfUint32 (J), Y + sfUint32 (I)) then if Video.Toggle_Pixel
((X + sfUint32 (J)) mod Video.Width,
(Y + sfUint32 (I)) mod Video.Height)
then
VF := True; VF := True;
end if; end if;
end if; end if;
@ -112,6 +115,8 @@ procedure Ada_Chip is
when Misc => case To_Byte (ins) is when Misc => case To_Byte (ins) is
when 16#07# => when 16#07# =>
State.Registers (X_Register (ins)) := State.Delay_Timer; State.Registers (X_Register (ins)) := State.Delay_Timer;
when 16#0A# =>
State.Registers (X_Register (ins)) := Byte (Video.Next_Key);
when 16#15# => when 16#15# =>
State.Delay_Timer := State.Registers (X_Register (ins)); State.Delay_Timer := State.Registers (X_Register (ins));
when 16#18# => null; -- TODO: sound when 16#18# => null; -- TODO: sound
@ -120,7 +125,7 @@ procedure Ada_Chip is
Address (State.Registers (X_Register (ins))); Address (State.Registers (X_Register (ins)));
when 16#29# => when 16#29# =>
State.Address_Register := State.Address_Register :=
Address (State.Registers (X_Register (ins))) * 5; Address (State.Registers (X_Register (ins)) mod 16) * 5;
when 16#33# => begin when 16#33# => begin
State.Memory (State.Address_Register) := State.Memory (State.Address_Register) :=
State.Registers (X_Register (ins)) / 100; State.Registers (X_Register (ins)) / 100;
@ -158,6 +163,7 @@ begin
while Video.Is_Running loop while Video.Is_Running loop
Video.Display; Video.Display;
Video.Poll_Events;
if State.Delay_Timer > 0 then if State.Delay_Timer > 0 then
State.Delay_Timer := State.Delay_Timer - 1; State.Delay_Timer := State.Delay_Timer - 1;

@ -8,7 +8,7 @@ package CPU is
(Index_Type => Natural, Element_Type => Address); (Index_Type => Natural, Element_Type => Address);
type Instance is record type Instance is record
Memory : Bank := [ Memory : Bank := (
16#F0#, 16#90#, 16#90#, 16#90#, 16#F0#, -- 0 16#F0#, 16#90#, 16#90#, 16#90#, 16#F0#, -- 0
16#20#, 16#60#, 16#20#, 16#20#, 16#70#, -- 1 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#80#, 16#F0#, -- 2
@ -26,7 +26,7 @@ package CPU is
16#F0#, 16#80#, 16#F0#, 16#80#, 16#F0#, -- E 16#F0#, 16#80#, 16#F0#, 16#80#, 16#F0#, -- E
16#F0#, 16#80#, 16#F0#, 16#80#, 16#80#, -- F 16#F0#, 16#80#, 16#F0#, 16#80#, 16#80#, -- F
others => 0 others => 0
]; );
Registers : Register_Bank; Registers : Register_Bank;
Program_Counter : Address := Start_Address; Program_Counter : Address := Start_Address;
Address_Register : Address := 0; Address_Register : Address := 0;

@ -4,20 +4,20 @@ package ISA is
type Register_Index is mod 2 ** 4; type Register_Index is mod 2 ** 4;
type Bank is array (Address) of Byte; type Bank is array (Address) of Byte;
type Register_Bank is array (Register_Index) of Byte; type Register_Bank is array (Register_Index) of Byte;
type Pixel is array (0 .. 7) of Boolean; type Pixel is array (0 .. Byte'Size - 1) of Boolean;
pragma Pack (Pixel); pragma Pack (Pixel);
type Opcode_Value is mod 2 ** 12; type Opcode_Value is mod 2 ** 12;
type Opcode_Raw is mod 2 ** 16;
type Opcode_Class is ( type Opcode_Class is (
Flow, Jump, Call, Equal, Not_Equal, Compare, Set_Register, Add, Math, Flow, Jump, Call, Equal, Not_Equal, Compare, Set_Register, Add, Math,
Not_Compare, Set_Address, Jump_Relative, Random, Draw_Sprite, Input, Misc Not_Compare, Set_Address, Jump_Relative, Random, Draw_Sprite, Input, Misc
) with Size => 4; ) with Size => 4;
type Opcode_Raw is mod 2 ** 16;
type Opcode is record type Opcode is record
Value : Opcode_Value; Value : Opcode_Value;
Class : Opcode_Class; Class : Opcode_Class;
end record with end record with
Size => 16; Size => Opcode_Raw'Size;
for Opcode use record for Opcode use record
Value at 0 range 0 .. 11; Value at 0 range 0 .. 11;

@ -26,7 +26,24 @@ package body Video is
return RenderWindow.isOpen (app) = sfTrue; return RenderWindow.isOpen (app) = sfTrue;
end Is_Running; end Is_Running;
procedure Display is function Next_Key return Key is
begin
while Is_Running loop
Poll_Events;
for I in Key'First .. Key'Last loop
if Keys (I) then
return I;
end if;
end loop;
delay 0.016;
end loop;
return 0; -- Only get here on program exit
end Next_Key;
procedure Poll_Events is
use Sf.Window.Event; use Sf.Window.Event;
use Sf.Window.Keyboard; use Sf.Window.Keyboard;
@ -77,7 +94,10 @@ package body Video is
when others => null; when others => null;
end case; end case;
end loop; end loop;
end Poll_Events;
procedure Display is
begin
RenderWindow.clear (app, Color.sfWhite); RenderWindow.clear (app, Color.sfWhite);
Texture.updateFromImage (Pixels_Texture, Pixels, 0, 0); Texture.updateFromImage (Pixels_Texture, Pixels, 0, 0);
RenderWindow.drawSprite (app, Pixels_Sprite); RenderWindow.drawSprite (app, Pixels_Sprite);
@ -87,9 +107,11 @@ package body Video is
function Toggle_Pixel (X, Y : sfUint32) return Boolean is function Toggle_Pixel (X, Y : sfUint32) return Boolean is
use Color; use Color;
P : constant sfColor := Image.getPixel (Pixels, X, Y); P : sfColor;
R : constant Boolean := P = sfWhite; R : Boolean;
begin begin
P := Image.getPixel (Pixels, X, Y);
R := P = sfWhite;
Image.setPixel (Pixels, X, Y, (if R then sfBlack else sfWhite)); Image.setPixel (Pixels, X, Y, (if R then sfBlack else sfWhite));
return R; return R;
end Toggle_Pixel; end Toggle_Pixel;

@ -21,11 +21,13 @@ package Video is
procedure Initialize; procedure Initialize;
procedure Display; procedure Display;
procedure Finish; procedure Finish;
procedure Poll_Events;
function Key_Down (K : Key) return Boolean; function Key_Down (K : Key) return Boolean;
function Key_Up (K : Key) return Boolean; function Key_Up (K : Key) return Boolean;
function Is_Running return Boolean; function Is_Running return Boolean;
function Toggle_Pixel (X, Y : sfUint32) return Boolean; function Toggle_Pixel (X, Y : sfUint32) return Boolean;
function Next_Key return Key;
private private
Keys : Key_Map; Keys : Key_Map;

Loading…
Cancel
Save