zxuno-git/cores/KypSpectrum/keyboard.vhd

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;