mirror of https://github.com/zxdos/zxuno.git
159 lines
6.1 KiB
VHDL
159 lines
6.1 KiB
VHDL
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
|
|
entity keyboard is
|
|
port
|
|
(
|
|
sw : in std_logic_vector(7 downto 0);
|
|
col : in std_logic_vector(4 downto 0);
|
|
boot : out std_logic;
|
|
reset : out std_logic;
|
|
nmi : out std_logic;
|
|
received : in std_logic;
|
|
scancode : in std_logic_vector(7 downto 0);
|
|
rows : in std_logic_vector(7 downto 0);
|
|
cols : out std_logic_vector(4 downto 0)
|
|
);
|
|
end;
|
|
|
|
architecture behavioral of keyboard is
|
|
|
|
type matrix is array (7 downto 0) of std_logic_vector(4 downto 0);
|
|
signal keys, mikeys : matrix;
|
|
signal isalt : std_logic;
|
|
signal pressed : std_logic;
|
|
|
|
begin
|
|
process(received, scancode)
|
|
begin
|
|
if falling_edge(received) then
|
|
nmi <= '0';
|
|
boot <= '0';
|
|
reset <= '0';
|
|
pressed <= '1';
|
|
case scancode is
|
|
when X"f0" => pressed <= '0';
|
|
when X"12" |
|
|
X"59" => keys(0)(0) <= pressed; -- Left or Right shift (CAPS SHIFT)
|
|
when X"1a" => keys(0)(1) <= pressed; -- Z
|
|
when X"22" => keys(0)(2) <= pressed; -- X
|
|
when X"21" => keys(0)(3) <= pressed; -- C
|
|
when X"2a" => keys(0)(4) <= pressed; -- V
|
|
when X"1c" => keys(1)(0) <= pressed; -- A
|
|
when X"1b" => keys(1)(1) <= pressed; -- S
|
|
when X"23" => keys(1)(2) <= pressed; -- D
|
|
when X"2b" => keys(1)(3) <= pressed; -- F
|
|
when X"34" => keys(1)(4) <= pressed; -- G
|
|
when X"15" => keys(2)(0) <= pressed; -- Q
|
|
when X"1d" => keys(2)(1) <= pressed; -- W
|
|
when X"24" => keys(2)(2) <= pressed; -- E
|
|
when X"2d" => keys(2)(3) <= pressed; -- R
|
|
when X"2c" => keys(2)(4) <= pressed; -- T
|
|
when X"16" => keys(3)(0) <= pressed; -- 1
|
|
when X"1e" => keys(3)(1) <= pressed; -- 2
|
|
when X"26" => keys(3)(2) <= pressed; -- 3
|
|
when X"25" => keys(3)(3) <= pressed; -- 4
|
|
when X"2e" => keys(3)(4) <= pressed; -- 5
|
|
when X"45" => keys(4)(0) <= pressed; -- 0
|
|
when X"46" => keys(4)(1) <= pressed; -- 9
|
|
when X"3e" => keys(4)(2) <= pressed; -- 8
|
|
when X"3d" => keys(4)(3) <= pressed; -- 7
|
|
when X"36" => keys(4)(4) <= pressed; -- 6
|
|
when X"4d" => keys(5)(0) <= pressed; -- P
|
|
when X"44" => keys(5)(1) <= pressed; -- O
|
|
when X"43" => keys(5)(2) <= pressed; -- I
|
|
when X"3c" => keys(5)(3) <= pressed; -- U
|
|
when X"35" => keys(5)(4) <= pressed; -- Y
|
|
when X"5a" => keys(6)(0) <= pressed; -- ENTER
|
|
when X"4b" => keys(6)(1) <= pressed; -- L
|
|
when X"42" => keys(6)(2) <= pressed; -- K
|
|
when X"3b" => keys(6)(3) <= pressed; -- J
|
|
when X"33" => keys(6)(4) <= pressed; -- H
|
|
when X"29" => keys(7)(0) <= pressed; -- SPACE
|
|
when X"14" => keys(7)(1) <= pressed; -- CTRL (Symbol Shift)
|
|
when X"3a" => keys(7)(2) <= pressed; -- M
|
|
when X"31" => keys(7)(3) <= pressed; -- N
|
|
when X"32" => keys(7)(4) <= pressed; -- B
|
|
when X"76" => keys(0)(0) <= pressed; -- Break (Caps Space)
|
|
keys(7)(0) <= pressed;
|
|
when X"0e" |
|
|
X"06" => keys(0)(0) <= pressed; -- Edit (Caps 1)
|
|
keys(3)(0) <= pressed;
|
|
when X"4e" |
|
|
X"09" => keys(0)(0) <= pressed; -- Graph (Caps 9)
|
|
keys(4)(1) <= pressed;
|
|
when X"66" => keys(0)(0) <= pressed; -- Backspace (Caps 0)
|
|
keys(4)(0) <= pressed;
|
|
if keys(7)(1)='1' and isalt='1' then
|
|
boot <= '1'; -- Master Reset
|
|
end if;
|
|
when X"0d" => keys(0)(0) <= pressed; -- Extend
|
|
keys(7)(1) <= pressed;
|
|
when X"54" => keys(0)(0) <= pressed; -- True Video (Caps 3)
|
|
keys(3)(2) <= pressed;
|
|
when X"5b" => keys(0)(0) <= pressed; -- Inv. Video (Caps 4)
|
|
keys(3)(3) <= pressed;
|
|
when X"58" => keys(0)(0) <= pressed; -- Caps lock (Caps 2)
|
|
keys(3)(1) <= pressed;
|
|
when X"6b" => keys(0)(0) <= pressed; -- Left (Caps 5)
|
|
keys(3)(4) <= pressed;
|
|
when X"72" => keys(0)(0) <= pressed; -- Down (Caps 6)
|
|
keys(4)(4) <= pressed;
|
|
when X"75" => keys(0)(0) <= pressed; -- Up (Caps 7)
|
|
keys(4)(3) <= pressed;
|
|
when X"74" => keys(0)(0) <= pressed; -- Right (Caps 8)
|
|
keys(4)(2) <= pressed;
|
|
when X"55" => keys(7)(1) <= pressed; -- = (Symb L)
|
|
keys(6)(1) <= pressed;
|
|
when X"4a" => keys(7)(1) <= pressed; -- / (Symb V)
|
|
keys(0)(4) <= pressed;
|
|
when X"7c" => keys(7)(1) <= pressed; -- * (Symb B)
|
|
keys(7)(4) <= pressed;
|
|
when X"7b" => keys(7)(1) <= pressed; -- - (Symb J)
|
|
keys(6)(3) <= pressed;
|
|
when X"79" => keys(7)(1) <= pressed; -- + (Symb K)
|
|
keys(6)(2) <= pressed;
|
|
when X"4c" => keys(7)(1) <= pressed; -- ; (Symb O)
|
|
keys(5)(1) <= pressed;
|
|
when X"52" => keys(7)(1) <= pressed; -- " (Symb P)
|
|
keys(5)(0) <= pressed;
|
|
when X"41" => keys(7)(1) <= pressed; -- , (Symb N)
|
|
keys(7)(3) <= pressed;
|
|
when X"49" => keys(7)(1) <= pressed; -- , (Symb M)
|
|
keys(7)(2) <= pressed;
|
|
when X"71" => if keys(7)(1)='1' and isalt='1' then
|
|
reset <= '1'; -- Reset
|
|
end if;
|
|
when X"11" => isalt <= pressed;
|
|
when X"03" => if keys(7)(1)='1' and isalt='1' then
|
|
nmi <= '1'; -- NMI
|
|
end if;
|
|
when others => null;
|
|
end case;
|
|
end if;
|
|
end process;
|
|
|
|
process (col)
|
|
begin
|
|
for i in 0 to 4 loop
|
|
if col(i)='0' then
|
|
for j in 0 to 7 loop
|
|
mikeys(j)(i)<= sw(j);
|
|
end loop;
|
|
end if;
|
|
end loop;
|
|
end process;
|
|
|
|
process (keys, rows)
|
|
variable tmp: std_logic;
|
|
begin
|
|
for i in 0 to 4 loop
|
|
tmp:= '1';
|
|
for j in 0 to 7 loop
|
|
tmp:= tmp and (not keys(j)(i) or not mikeys(j)(i) or rows(j));
|
|
end loop;
|
|
cols(i) <= tmp;
|
|
end loop;
|
|
end process;
|
|
end;
|