Project

General

Profile

« Previous | Next » 

Revision 295

Added by markw over 10 years ago

Direct mode for control by usb firmware. Added mapping for 2nd, 3rd and 4th keypads. 2nd is on f4 to f6 etc, 3rd is as 1st but with control. 4th is as 2nd but with control.

View differences:

common/a8core/ps2_to_atari5200.vhdl
ENTITY ps2_to_atari5200 IS
GENERIC
(
ps2_enable : integer := 1;
direct_enable : integer := 0
);
PORT
(
CLK : IN STD_LOGIC;
RESET_N : IN STD_LOGIC;
PS2_CLK : IN STD_LOGIC;
PS2_DAT : IN STD_LOGIC;
PS2_CLK : IN STD_LOGIC := '1';
PS2_DAT : IN STD_LOGIC := '1';
INPUT : IN STD_LOGIC_VECTOR(31 downto 0) := (others=>'0');
KEYBOARD_SCAN : IN STD_LOGIC_VECTOR(5 downto 0);
KEYBOARD_RESPONSE : OUT STD_LOGIC_VECTOR(1 downto 0);
......
signal ps2_keys_next : std_logic_vector(511 downto 0);
signal ps2_keys_reg : std_logic_vector(511 downto 0);
signal ps2_key_event : std_logic;
signal ps2_key_value : std_logic_vector(7 downto 0);
signal ps2_key_extended : std_logic;
signal ps2_key_up : std_logic;
signal direct_key_event : std_logic;
signal direct_key_value : std_logic_vector(7 downto 0);
signal direct_key_extended : std_logic;
signal direct_key_up : std_logic;
signal key_event : std_logic;
signal key_value : std_logic_vector(7 downto 0);
signal key_extended : std_logic;
......
signal fire_pressed_sel : std_logic;
BEGIN
process(clk,reset_n)
begin
if (reset_n='0') then
ps2_keys_reg <= (others=>'0');
elsif (clk'event and clk='1') then
ps2_keys_reg <= ps2_keys_next;
end if;
end process;
gen_ps2_on : if ps2_enable=1 generate
keyboard1: entity work.ps2_keyboard
PORT MAP
(
......
PS2_CLK => PS2_CLK,
PS2_DAT => PS2_DAT,
KEY_EVENT => KEY_EVENT,
KEY_VALUE => KEY_VALUE,
KEY_EXTENDED => KEY_EXTENDED,
KEY_UP => KEY_UP
KEY_EVENT => PS2_KEY_EVENT,
KEY_VALUE => PS2_KEY_VALUE,
KEY_EXTENDED => PS2_KEY_EXTENDED,
KEY_UP => PS2_KEY_UP
-- KEY_EVENT : OUT STD_LOGIC; -- high for 1 cycle on new key pressed(or repeated)/released
-- KEY_VALUE : OUT STD_LOGIC_VECTOR(7 downto 0); -- valid on event, raw scan code
-- KEY_EXTENDED : OUT STD_LOGIC; -- valid on event, if scan code extended
-- KEY_UP : OUT STD_LOGIC -- value on event, if key released
);
end generate;
process(clk,reset_n)
begin
if (reset_n='0') then
ps2_keys_reg <= (others=>'0');
elsif (clk'event and clk='1') then
ps2_keys_reg <= ps2_keys_next;
end if;
end process;
gen_ps2_off : if ps2_enable=0 generate
PS2_KEY_EVENT <= '0';
PS2_KEY_VALUE <= (others=>'0');
PS2_KEY_EXTENDED <= '0';
PS2_KEY_UP <= '0';
end generate;
-- 1 bit per PS2 key
gen_direct_on : if direct_enable=1 generate
direct_key_value <= input(7 downto 0);
direct_key_extended <= input(12);
direct_key_up <= not(input(16));
direct_key_event <= '1';
end generate;
gen_direct_off : if direct_enable=0 generate
DIRECT_KEY_EVENT <= '0';
DIRECT_KEY_VALUE <= (others=>'0');
DIRECT_KEY_EXTENDED <= '0';
DIRECT_KEY_UP <= '0';
end generate;
KEY_EVENT <= DIRECT_KEY_EVENT or PS2_KEY_EVENT;
KEY_VALUE <= PS2_KEY_VALUE when PS2_KEY_EVENT='1' else DIRECT_KEY_VALUE;
KEY_EXTENDED <= PS2_KEY_EXTENDED when PS2_KEY_EVENT='1' else DIRECT_KEY_EXTENDED;
KEY_UP <= PS2_KEY_UP when PS2_KEY_EVENT='1' else DIRECT_KEY_UP;
process(KEY_EVENT, KEY_VALUE, KEY_EXTENDED, KEY_UP, ps2_keys_reg)
begin
ps2_keys_next <= ps2_keys_reg;
......
case controller_select is
when "00" =>
-- todo change order to match keycode! check with petes test
atari_keyboard(12)<=ps2_keys_reg(16#05#); --f1
atari_keyboard(8)<=ps2_keys_reg(16#06#); --f2
atari_keyboard(4)<=ps2_keys_reg(16#04#); --f3
atari_keyboard(15)<=ps2_keys_reg(16#16#); --1
atari_keyboard(14)<=ps2_keys_reg(16#1E#); --2
atari_keyboard(13)<=ps2_keys_reg(16#26#); --3
atari_keyboard(11)<=ps2_keys_reg(16#15#); --q
atari_keyboard(10)<=ps2_keys_reg(16#1D#); --w
atari_keyboard(9)<=ps2_keys_reg(16#24#); --e
atari_keyboard(7)<=ps2_keys_reg(16#1c#); --a
atari_keyboard(6)<=ps2_keys_reg(16#1b#); --s
atari_keyboard(5)<=ps2_keys_reg(16#23#); --d
atari_keyboard(3)<=ps2_keys_reg(16#1a#); --z
atari_keyboard(2)<=ps2_keys_reg(16#22#); --x
atari_keyboard(1)<=ps2_keys_reg(16#21#); --c
atari_keyboard(12)<=ps2_keys_reg(16#05#) and not(ps2_keys_reg(16#14#)); --f1
atari_keyboard(8)<=ps2_keys_reg(16#06#) and not(ps2_keys_reg(16#14#)); --f2
atari_keyboard(4)<=ps2_keys_reg(16#04#) and not(ps2_keys_reg(16#14#)); --f3
atari_keyboard(15)<=ps2_keys_reg(16#16#) and not(ps2_keys_reg(16#14#)); --1
atari_keyboard(14)<=ps2_keys_reg(16#1E#) and not(ps2_keys_reg(16#14#)); --2
atari_keyboard(13)<=ps2_keys_reg(16#26#) and not(ps2_keys_reg(16#14#)); --3
atari_keyboard(11)<=ps2_keys_reg(16#15#) and not(ps2_keys_reg(16#14#)); --q
atari_keyboard(10)<=ps2_keys_reg(16#1D#) and not(ps2_keys_reg(16#14#)); --w
atari_keyboard(9)<=ps2_keys_reg(16#24#) and not(ps2_keys_reg(16#14#)); --e
atari_keyboard(7)<=ps2_keys_reg(16#1c#) and not(ps2_keys_reg(16#14#)); --a
atari_keyboard(6)<=ps2_keys_reg(16#1b#) and not(ps2_keys_reg(16#14#)); --s
atari_keyboard(5)<=ps2_keys_reg(16#23#) and not(ps2_keys_reg(16#14#)); --d
atari_keyboard(3)<=ps2_keys_reg(16#1a#) and not(ps2_keys_reg(16#14#)); --z
atari_keyboard(2)<=ps2_keys_reg(16#22#) and not(ps2_keys_reg(16#14#)); --x
atari_keyboard(1)<=ps2_keys_reg(16#21#) and not(ps2_keys_reg(16#14#)); --c
fire_pressed_sel <= fire2(0);
when "01" =>
atari_keyboard(12)<=ps2_keys_reg(16#29#);
atari_keyboard(8)<=ps2_keys_reg(16#29#);
atari_keyboard(4)<=ps2_keys_reg(16#29#);
atari_keyboard(15)<=ps2_keys_reg(16#29#);
atari_keyboard(14)<=ps2_keys_reg(16#29#);
atari_keyboard(13)<=ps2_keys_reg(16#29#);
atari_keyboard(11)<=ps2_keys_reg(16#29#);
atari_keyboard(10)<=ps2_keys_reg(16#29#);
atari_keyboard(9)<=ps2_keys_reg(16#29#);
atari_keyboard(7)<=ps2_keys_reg(16#29#);
atari_keyboard(6)<=ps2_keys_reg(16#29#);
atari_keyboard(5)<=ps2_keys_reg(16#29#);
atari_keyboard(3)<=ps2_keys_reg(16#29#);
atari_keyboard(2)<=ps2_keys_reg(16#29#);
atari_keyboard(1)<=ps2_keys_reg(16#29#);
atari_keyboard(12)<=ps2_keys_reg(16#0c#) and not(ps2_keys_reg(16#14#)); -- f4
atari_keyboard(8)<=ps2_keys_reg(16#03#) and not(ps2_keys_reg(16#14#)); -- f5
atari_keyboard(4)<=ps2_keys_reg(16#0b#) and not(ps2_keys_reg(16#14#)); -- f6
atari_keyboard(15)<=ps2_keys_reg(16#25#) and not(ps2_keys_reg(16#14#)); -- 4
atari_keyboard(14)<=ps2_keys_reg(16#2e#) and not(ps2_keys_reg(16#14#)); -- 5
atari_keyboard(13)<=ps2_keys_reg(16#36#) and not(ps2_keys_reg(16#14#)); -- 6
atari_keyboard(11)<=ps2_keys_reg(16#2d#) and not(ps2_keys_reg(16#14#)); -- r
atari_keyboard(10)<=ps2_keys_reg(16#2c#) and not(ps2_keys_reg(16#14#)); -- t
atari_keyboard(9)<=ps2_keys_reg(16#35#) and not(ps2_keys_reg(16#14#)); -- y
atari_keyboard(7)<=ps2_keys_reg(16#2b#) and not(ps2_keys_reg(16#14#)); -- f
atari_keyboard(6)<=ps2_keys_reg(16#34#) and not(ps2_keys_reg(16#14#)); -- g
atari_keyboard(5)<=ps2_keys_reg(16#33#) and not(ps2_keys_reg(16#14#)); -- h
atari_keyboard(3)<=ps2_keys_reg(16#2a#) and not(ps2_keys_reg(16#14#)); -- v
atari_keyboard(2)<=ps2_keys_reg(16#32#) and not(ps2_keys_reg(16#14#)); -- b
atari_keyboard(1)<=ps2_keys_reg(16#31#) and not(ps2_keys_reg(16#14#)); -- n
fire_pressed_sel <= fire2(1);
when "10" =>
atari_keyboard(12)<=ps2_keys_reg(16#29#);
atari_keyboard(8)<=ps2_keys_reg(16#29#);
atari_keyboard(4)<=ps2_keys_reg(16#29#);
atari_keyboard(15)<=ps2_keys_reg(16#29#);
atari_keyboard(14)<=ps2_keys_reg(16#29#);
atari_keyboard(13)<=ps2_keys_reg(16#29#);
atari_keyboard(11)<=ps2_keys_reg(16#29#);
atari_keyboard(10)<=ps2_keys_reg(16#29#);
atari_keyboard(9)<=ps2_keys_reg(16#29#);
atari_keyboard(7)<=ps2_keys_reg(16#29#);
atari_keyboard(6)<=ps2_keys_reg(16#29#);
atari_keyboard(5)<=ps2_keys_reg(16#29#);
atari_keyboard(3)<=ps2_keys_reg(16#29#);
atari_keyboard(2)<=ps2_keys_reg(16#29#);
atari_keyboard(1)<=ps2_keys_reg(16#29#);
atari_keyboard(12)<=ps2_keys_reg(16#05#) and ps2_keys_reg(16#14#); --f1
atari_keyboard(8)<=ps2_keys_reg(16#06#) and ps2_keys_reg(16#14#); --f2
atari_keyboard(4)<=ps2_keys_reg(16#04#) and ps2_keys_reg(16#14#); --f3
atari_keyboard(15)<=ps2_keys_reg(16#16#) and ps2_keys_reg(16#14#); --1
atari_keyboard(14)<=ps2_keys_reg(16#1E#) and ps2_keys_reg(16#14#); --2
atari_keyboard(13)<=ps2_keys_reg(16#26#) and ps2_keys_reg(16#14#); --3
atari_keyboard(11)<=ps2_keys_reg(16#15#) and ps2_keys_reg(16#14#); --q
atari_keyboard(10)<=ps2_keys_reg(16#1D#) and ps2_keys_reg(16#14#); --w
atari_keyboard(9)<=ps2_keys_reg(16#24#) and ps2_keys_reg(16#14#); --e
atari_keyboard(7)<=ps2_keys_reg(16#1c#) and ps2_keys_reg(16#14#); --a
atari_keyboard(6)<=ps2_keys_reg(16#1b#) and ps2_keys_reg(16#14#); --s
atari_keyboard(5)<=ps2_keys_reg(16#23#) and ps2_keys_reg(16#14#); --d
atari_keyboard(3)<=ps2_keys_reg(16#1a#) and ps2_keys_reg(16#14#); --z
atari_keyboard(2)<=ps2_keys_reg(16#22#) and ps2_keys_reg(16#14#); --x
atari_keyboard(1)<=ps2_keys_reg(16#21#) and ps2_keys_reg(16#14#); --c
fire_pressed_sel <= fire2(2);
when "11" =>
atari_keyboard(12)<=ps2_keys_reg(16#29#);
atari_keyboard(8)<=ps2_keys_reg(16#29#);
atari_keyboard(4)<=ps2_keys_reg(16#29#);
atari_keyboard(15)<=ps2_keys_reg(16#29#);
atari_keyboard(14)<=ps2_keys_reg(16#29#);
atari_keyboard(13)<=ps2_keys_reg(16#29#);
atari_keyboard(11)<=ps2_keys_reg(16#29#);
atari_keyboard(10)<=ps2_keys_reg(16#29#);
atari_keyboard(9)<=ps2_keys_reg(16#29#);
atari_keyboard(7)<=ps2_keys_reg(16#29#);
atari_keyboard(6)<=ps2_keys_reg(16#29#);
atari_keyboard(5)<=ps2_keys_reg(16#29#);
atari_keyboard(3)<=ps2_keys_reg(16#29#);
atari_keyboard(2)<=ps2_keys_reg(16#29#);
atari_keyboard(1)<=ps2_keys_reg(16#29#);
atari_keyboard(12)<=ps2_keys_reg(16#0c#) and ps2_keys_reg(16#14#); -- f4
atari_keyboard(8)<=ps2_keys_reg(16#03#) and ps2_keys_reg(16#14#); -- f5
atari_keyboard(4)<=ps2_keys_reg(16#0b#) and ps2_keys_reg(16#14#); -- f6
atari_keyboard(15)<=ps2_keys_reg(16#25#) and ps2_keys_reg(16#14#); -- 4
atari_keyboard(14)<=ps2_keys_reg(16#2e#) and ps2_keys_reg(16#14#); -- 5
atari_keyboard(13)<=ps2_keys_reg(16#36#) and ps2_keys_reg(16#14#); -- 6
atari_keyboard(11)<=ps2_keys_reg(16#2d#) and ps2_keys_reg(16#14#); -- r
atari_keyboard(10)<=ps2_keys_reg(16#2c#) and ps2_keys_reg(16#14#); -- t
atari_keyboard(9)<=ps2_keys_reg(16#35#) and ps2_keys_reg(16#14#); -- y
atari_keyboard(7)<=ps2_keys_reg(16#2b#) and ps2_keys_reg(16#14#); -- f
atari_keyboard(6)<=ps2_keys_reg(16#34#) and ps2_keys_reg(16#14#); -- g
atari_keyboard(5)<=ps2_keys_reg(16#33#) and ps2_keys_reg(16#14#); -- h
atari_keyboard(3)<=ps2_keys_reg(16#2a#) and ps2_keys_reg(16#14#); -- v
atari_keyboard(2)<=ps2_keys_reg(16#32#) and ps2_keys_reg(16#14#); -- b
atari_keyboard(1)<=ps2_keys_reg(16#31#) and ps2_keys_reg(16#14#); -- n
fire_pressed_sel <= fire2(3);
when others =>
end case;

Also available in: Unified diff