scanner: argh... es kommen ja scancodes rein und keine asciicodes!
[hwmod.git] / src / scanner.vhd
index 8506b1bd5882320c6ed1f693a15ab046a1b3c42b..9e1f0bde5b9e8e28fc8e657d587980fa3d0dd2a9 100644 (file)
@@ -58,20 +58,6 @@ begin
 
        -- next state
        process(state_int, new_data, data, finished, s_done)
-               function valid_char (x : std_logic_vector(7 downto 0)) return boolean is
-                       variable y : boolean;
-               begin
-                       case x is
-                               -- 0 - 4
-                               when x"30" | x"31" | x"32" | x"33" | x"34" => y := true;
-                               -- 5 - 9
-                               when x"35" | x"36" | x"37" | x"38" | x"39" => y := true;
-                               -- *, +, -, /
-                               when x"2a" | x"2b" | x"2d" | x"2f" => y := true;
-                               when others => y := false;
-                       end case;
-                       return y;
-               end function;
        begin
                state_next <= state_int;
 
@@ -83,14 +69,20 @@ begin
                        when SREAD =>
                                case data is
                                        when x"e0" => state_next <= SMOD;
-                                       when x"0e" => state_next <= SDEL;
-                                       when x"1c" => state_next <= SENTER;
-                                       when x"20" => state_next <= STAKE;
+                                       when SC_BKSP => state_next <= SDEL;
+                                       when SC_ENTER => state_next <= SENTER;
+                                       when SC_KP_0 | SC_KP_1 | SC_KP_2 | SC_KP_3 |
+                                               SC_KP_4 | SC_KP_5 | SC_KP_6 | SC_KP_7 |
+                                               SC_KP_8 | SC_KP_9 | SC_KP_PLUS |
+                                               SC_KP_MINUS | SC_KP_MUL | SC_SPACE =>
+                                                       state_next <= STAKE;
                                        when others => state_next <= SIDLE;
                                end case;
                        when SMOD =>
                                if new_data = '1' then
-                                       if valid_char(data) then
+                                       if data = SC_KP_ENTER then
+                                               state_next <= SENTER;
+                                       elsif data = SC_KP_DIV then
                                                state_next <= STAKE;
                                        else
                                                state_next <= SIDLE;
@@ -109,6 +101,29 @@ begin
 
        -- out
        process(state_int, data)
+               function sc2ascii (x : hbyte) return hbyte is
+                       variable y : hbyte;
+               begin
+                       case x is
+                               when SC_KP_0 => y := x"30";
+                               when SC_KP_1 => y := x"31";
+                               when SC_KP_2 => y := x"32";
+                               when SC_KP_3 => y := x"33";
+                               when SC_KP_4 => y := x"34";
+                               when SC_KP_5 => y := x"35";
+                               when SC_KP_6 => y := x"36";
+                               when SC_KP_7 => y := x"37";
+                               when SC_KP_8 => y := x"38";
+                               when SC_KP_9 => y := x"39";
+                               when SC_KP_PLUS => y := x"2b";
+                               when SC_KP_MINUS => y := x"2d";
+                               when SC_KP_MUL => y := x"2a";
+                               when SC_KP_DIV => y := x"2f";
+                               when SC_SPACE => y := x"20";
+                               when others => y := x"41";
+                       end case;
+                       return y;
+               end function;
        begin
                s_char_next <= (others => '0');
                s_take_next <= '0';
@@ -124,7 +139,7 @@ begin
                                null;
                        when STAKE =>
                                s_take_next <= '1';
-                               s_char_next <= hbyte(data);
+                               s_char_next <= sc2ascii(hbyte(data));
                        when SDEL =>
                                s_take_next <= '1';
                                s_backspace_next <= '1';