1// https://ru.wikipedia.org/wiki/Скан-код
2module ps2at2ascii
3(
4    input  wire [7:0] at,
5    output reg  [7:0] xt
6);
7
8always @(*) begin
9
10    case (at)
11
12        /* A   */ 8'h1C: xt = 8'h41;
13        /* B   */ 8'h32: xt = 8'h42;
14        /* C   */ 8'h21: xt = 8'h43;
15        /* D   */ 8'h23: xt = 8'h44;
16        /* E   */ 8'h24: xt = 8'h45;
17        /* F   */ 8'h2B: xt = 8'h46;
18        /* G   */ 8'h34: xt = 8'h47;
19        /* H   */ 8'h33: xt = 8'h48;
20        /* I   */ 8'h43: xt = 8'h49;
21        /* J   */ 8'h3B: xt = 8'h4A;
22        /* K   */ 8'h42: xt = 8'h4B;
23        /* L   */ 8'h4B: xt = 8'h4C;
24        /* M   */ 8'h3A: xt = 8'h4D;
25        /* N   */ 8'h31: xt = 8'h4E;
26        /* O   */ 8'h44: xt = 8'h4F;
27        /* P   */ 8'h4D: xt = 8'h50;
28        /* Q   */ 8'h15: xt = 8'h51;
29        /* R   */ 8'h2D: xt = 8'h52;
30        /* S   */ 8'h1B: xt = 8'h53;
31        /* T   */ 8'h2C: xt = 8'h54;
32        /* U   */ 8'h3C: xt = 8'h55;
33        /* V   */ 8'h2A: xt = 8'h56;
34        /* W   */ 8'h1D: xt = 8'h57;
35        /* X   */ 8'h22: xt = 8'h58;
36        /* Y   */ 8'h35: xt = 8'h59;
37        /* Z   */ 8'h1A: xt = 8'h5A;
38
39        /* 0   */ 8'h45: xt = 8'h30;
40        /* 1   */ 8'h16: xt = 8'h31;
41        /* 2   */ 8'h1E: xt = 8'h32;
42        /* 3   */ 8'h26: xt = 8'h33;
43        /* 4   */ 8'h25: xt = 8'h34;
44        /* 5   */ 8'h2E: xt = 8'h35;
45        /* 6   */ 8'h36: xt = 8'h36;
46        /* 7   */ 8'h3D: xt = 8'h37;
47        /* 8   */ 8'h3E: xt = 8'h38;
48        /* 9   */ 8'h46: xt = 8'h39;
49
50        /* `   */ 8'h0E: xt = 8'h60;
51        /* -   */ 8'h4E: xt = 8'h2D;
52        /* =   */ 8'h55: xt = 8'h3D;
53        /* \   */ 8'h5D: xt = 8'h5C;
54        /* [   */ 8'h54: xt = 8'h5B;
55        /* ]   */ 8'h5B: xt = 8'h5D;
56        /* ;   */ 8'h4C: xt = 8'h3B;
57        /* '   */ 8'h52: xt = 8'h27;
58        /* ,   */ 8'h41: xt = 8'h2C;
59        /* .   */ 8'h49: xt = 8'h2E;
60        /* /   */ 8'h4A: xt = 8'h2F;
61        /* SPC */ 8'h29: xt = 8'h20; /* SPACE */
62
63        // Специальные кнопки
64        /* F1  */ 8'h05: xt = 8'h01;
65        /* F2  */ 8'h06: xt = 8'h02;
66        /* F3  */ 8'h04: xt = 8'h03;
67        /* F4  */ 8'h0C: xt = 8'h04;
68        /* F5  */ 8'h03: xt = 8'h05;
69        /* F6  */ 8'h0B: xt = 8'h06;
70        /* F7  */ 8'h83: xt = 8'h07;
71        /* BS  */ 8'h66: xt = 8'h08; /* BACKSPACE */
72        /* TAB */ 8'h0D: xt = 8'h09; /* TAB */
73        /* F8  */ 8'h0A: xt = 8'h0A;
74        /* F9  */ 8'h01: xt = 8'h0B;
75        /* F10 */ 8'h09: xt = 8'h0C;
76        /* ENT */ 8'h5A: xt = 8'h0D; /* ENTER */
77        /* F11 */ 8'h78: xt = 8'h0E;
78        /* F12 */ 8'h07: xt = 8'h0F;
79
80        /* CAP */ 8'h58: xt = 8'h10; /* CAPS LOCK */
81        /* LSH */ 8'h12: xt = 8'h11; /* LEFT SHIFT */
82        /* LCT */ 8'h14: xt = 8'h12; /* LEFT CTRL */
83        /* LAT */ 8'h11: xt = 8'h13; /* LEFT ALT */
84        /* LWI */ 8'h1F: xt = 8'h14; /* LEFT WIN */
85        /* RSH */ 8'h59: xt = 8'h15; /* RIGHT SHIFT */
86        /* RWI */ 8'h27: xt = 8'h16; /* RIGHT WIN */
87        /* MNU */ 8'h2F: xt = 8'h17; /* MENU */
88        /* SCL */ 8'h7E: xt = 8'h18; /* SCROLL LOCK */
89        /* NUM */ 8'h77: xt = 8'h19;
90        /* ESC */ 8'h76: xt = 8'h1B;
91
92        /* Цифровая клавиатура */
93        /* *   */ 8'h7C: xt = 8'h2A;
94        /* -   */ 8'h7B: xt = 8'h2D;
95        /* +   */ 8'h79: xt = 8'h2B;
96        /* .   */ 8'h71: xt = 8'h2E; /* Del */
97        /* 0   */ 8'h70: xt = 8'h30; /* Ins */
98        /* 1   */ 8'h69: xt = 8'h31; /* End */
99        /* 2   */ 8'h72: xt = 8'h32;
100        /* 3   */ 8'h7A: xt = 8'h33; /* PgDn */
101        /* 4   */ 8'h6B: xt = 8'h34;
102        /* 5   */ 8'h73: xt = 8'h35;
103        /* 6   */ 8'h74: xt = 8'h36;
104        /* 7   */ 8'h6C: xt = 8'h37; /* Home */
105        /* 8   */ 8'h75: xt = 8'h38;
106        /* 9   */ 8'h7D: xt = 8'h39; /* PgUp */
107
108        /* F0 (Unpressed Signal), E0, E1, ... */
109        default: xt = at;
110
111    endcase
112
113end
114
115endmodule