]> git.ozlabs.org Git - minimigmac.git/blob - fpga/ps2_kbd.v
Initial commit
[minimigmac.git] / fpga / ps2_kbd.v
1 `timescale 1ns / 100ps
2
3 /*
4  * PS2 Keyboard to Mac interface module
5  */
6 module ps2_kbd( input                   sysclk,
7                 input                   reset,
8
9                 inout                   ps2dat,
10                 inout                   ps2clk,
11                  
12                 input [7:0]             data_out,
13                 input                   strobe_out,
14
15                 output [7:0]            data_in,
16                 output                  strobe_in,
17
18                 output reg [15:0]       debug
19 );
20
21         reg [8:0]               keymac;
22         reg                     key_pending;
23         reg [21:0]              pacetimer;
24         reg                     inquiry_active;
25         reg                     extended;
26         reg                     keybreak;
27         reg                     capslock;
28         reg                     haskey;
29         wire                    got_key;
30         wire                    got_break;
31         wire                    got_extend;
32         wire                    tick_short;
33         wire                    tick_long;
34         wire                    pop_key;        
35         reg                     cmd_inquiry;
36         reg                     cmd_instant;
37         reg                     cmd_model;
38         reg                     cmd_test;
39         reg[1:0]                state;
40         reg[1:0]                next;
41         reg                     nreq;
42         reg[7:0]                nbyte;
43         
44         /* PS2 interface signals */
45         wire                    istrobe;
46         wire [7:0]              ibyte;
47         reg                     oreq;
48         reg [7:0]               obyte;
49         wire                    oack;
50         wire                    timeout;
51         wire [1:0]              dbg_lowstate;
52         
53         ps2 ps20(.sysclk(sysclk),
54                  .reset(reset),
55                  .ps2dat(ps2dat),
56                  .ps2clk(ps2clk),
57                  .istrobe(istrobe),
58                  .ibyte(ibyte),
59                  .oreq(oreq),
60                  .obyte(obyte),
61                  .oack(oack),
62                  .timeout(timeout),
63                  .dbg_state(dbg_lowstate));
64         
65         /* --- PS2 side State machine ---
66          *
67          *  - at state_init: wait for BAT reply
68          *     * 0xaa      -> send 0xed -> state_led1
69          *     * bad reply -> send 0xff -> state_init
70          *     * timeout   -> send 0xff -> state_init
71          * 
72          *  - at state_led1: wait for ack, send LED state
73          *     * 0xfa      -> send 0xYY -> state_led2 YY=LED
74          *     * bad reply -> send 0xff -> state_init
75          *     * timeout   -> send 0xff -> state_init
76          * 
77          *  - at state_led2: wait for ack, go wait data
78          *     * 0xfa                   -> state_wait
79          *     * bad reply -> send 0xff -> state_init
80          *     * timeout   -> send 0xff -> state_init
81          * 
82          *  - at state_wait: wait for data byte
83          *     * capslock  -> send 0xed -> state_led1
84          *     * other                  -> state_wait
85          * 
86          * Works fine with my logitech USB/PS2 keyboard, but fails
87          * miserably with an old HP PS2 keyboard (which also behaves
88          * oddly with minimig as an amiga). Will eventually investigate...
89          */
90         localparam ps2k_state_init      = 0;
91         localparam ps2k_state_led1      = 1;
92         localparam ps2k_state_led2      = 2;
93         localparam ps2k_state_wait      = 3;
94
95
96         /* Unlike my other modules, here I'll play with a big fat
97          * combo logic. The outputs are:
98          *  - oreq   : triggers sending of a byte. Set based on either
99          *             timeout or istrobe, and as such only set for a
100          *             clock.
101          *  - next   : next state
102          *  - obyte  : next byte to send
103          */
104         always@(timeout or state or istrobe or ibyte or capslock) begin
105                 nreq = 0;
106                 next = state;
107                 nbyte = 8'hff;
108
109                 if (istrobe || timeout)
110                   case(state)
111                           ps2k_state_init: begin
112                                   if (istrobe && ibyte == 8'haa) begin
113                                           nbyte = 8'hed;
114                                           nreq = 1;
115                                           next = ps2k_state_led1;
116                                   end else if (ibyte != 8'hfa)
117                                     nreq = 1;
118                           end
119                           ps2k_state_led1: begin
120                                   nreq = 1;
121                                   if (istrobe && ibyte == 8'hfa) begin
122                                           nbyte = { 5'b00000, capslock, 1'b1, 1'b0 };
123                                           next = ps2k_state_led2;
124                                   end else
125                                     next = ps2k_state_init;
126                           end
127                           ps2k_state_led2: begin
128                                   if (istrobe && ibyte == 8'hfa)
129                                     next = ps2k_state_wait;
130                                   else begin
131                                           nreq = 1;
132                                           next = ps2k_state_init;
133                                   end
134                           end
135                           ps2k_state_wait: begin
136                                   /* Update LEDs */
137                                   if (istrobe && ibyte == 8'h58) begin
138                                           nbyte = 8'hed;
139                                           nreq = 1;
140                                           next = ps2k_state_led1;
141                                   end
142                           end                     
143                   endcase
144         end
145
146         /* State related latches. We latch oreq and obyte, we don't
147          * necessarily have to but that avoids back to back
148          * receive/send at the low level which can upset things
149          */
150         always@(posedge sysclk or posedge reset)
151           if (reset)
152             state <= ps2k_state_init;
153           else
154             state <= next;      
155         always@(posedge sysclk or posedge reset)
156           if (reset)
157             oreq <= 0;
158           else
159             oreq <= nreq;
160         always@(posedge sysclk or posedge reset)
161           if (reset)
162             obyte <= 0;
163           else
164             obyte <= nbyte;
165
166         assign got_key = (state == ps2k_state_wait) && istrobe;
167         assign got_break = { ibyte[7:1], 1'b0 } == 8'hf0;
168         assign got_extend = { ibyte[7:1], 1'b0 } == 8'he0;
169
170         /* Latch key info from PS2, handle capslock state */
171         always@(posedge sysclk or posedge reset)
172           if (reset) begin
173                   extended <= 0;
174                   keybreak <= 0;        
175                   capslock <= 0;
176           end else if (got_key) begin
177                   if (got_break)
178                     keybreak <= 1;
179                   else if (got_extend)
180                     extended <= 1;
181                   else begin
182                           keybreak <= 0;
183                           extended <= 0;
184
185                           /* Capslock handling */
186                           if (ibyte == 8'h58 && !keybreak)
187                             capslock <= ~capslock;
188                   end
189           end
190
191         /* --- Mac side --- */
192
193         /* Latch commands from Mac */
194         always@(posedge sysclk or posedge reset)
195           if (reset) begin
196                   cmd_inquiry <= 0;
197                   cmd_instant <= 0;
198                   cmd_model <= 0;
199                   cmd_test <= 0;
200           end else begin
201                   if (strobe_out) begin
202                           cmd_inquiry <= 0;
203                           cmd_instant <= 0;
204                           cmd_model <= 0;
205                           cmd_test <= 0;
206                           case(data_out)
207                                   8'h10: cmd_inquiry <= 1;
208                                   8'h14: cmd_instant <= 1;
209                                   8'h16: cmd_model   <= 1;
210                                   8'h36: cmd_test    <= 1;
211                           endcase
212                   end
213           end
214
215         /* Divide our clock to pace our responses to the Mac. tick_short ticks
216          * when we can respond to a command, and tick_long ticks when an inquiry
217          * command shall timeout
218          */
219         always@(posedge sysclk or posedge reset)
220           if (reset)
221             pacetimer <= 0;
222           else begin
223                   /* reset counter on command from Mac */
224                   if (strobe_out)
225                     pacetimer <= 0;               
226                   else if (!tick_long)
227                     pacetimer <= pacetimer + 1;
228           end
229         assign tick_long  = pacetimer == 22'h3fffff;
230         assign tick_short = pacetimer == 22'h000fff;
231
232         /* Delay inquiry responses to after tick_short */
233         always@(posedge sysclk or posedge reset)
234           if (reset)
235             inquiry_active <= 0;
236           else begin
237                   if (strobe_out | strobe_in)
238                     inquiry_active <= 0;
239                   else if (tick_short)
240                     inquiry_active <= cmd_inquiry;                
241           end   
242
243         /* Key answer to the mac XXX FIXME: keypad */
244         assign pop_key = (cmd_instant & tick_short) |
245                          (inquiry_active & tick_long) |
246                          (inquiry_active & key_pending);
247
248         /* Reply to Mac */
249         assign strobe_in = ((cmd_model | cmd_test) & tick_short) | pop_key;     
250
251         /* Latch key_pending */
252         always @(posedge sysclk or posedge reset)
253           if (reset)
254             key_pending <= 0;
255           else begin
256                   if (pop_key | cmd_model | cmd_test)
257                     key_pending <= 0;            
258                   else if (!key_pending & got_key && !got_break && !got_extend)
259                     key_pending <= 1;
260           end
261
262         /* Data to Mac ... XXX: Handle keypad and special case capslock */
263         assign data_in = cmd_test       ? 8'h7d :
264                          cmd_model      ? 8'h03 :
265                          key_pending    ? keymac[7:0] : 8'h7b;  
266
267         /* Keymap. XXX add option to assign ctrl/alt/windows to cmd/option
268          * differently
269          */
270         always @(posedge sysclk)
271           if (got_key && !key_pending) begin
272                   case({extended,ibyte}) // Scan Code Set 2
273                           9'h000:               keymac[8:0] <= 9'h07b;
274                           9'h001:               keymac[8:0] <= 9'h07b;  //F9
275                           9'h002:               keymac[8:0] <= 9'h07b;
276                           9'h003:               keymac[8:0] <= 9'h07b;  //F5
277                           9'h004:               keymac[8:0] <= 9'h07b;  //F3
278                           9'h005:               keymac[8:0] <= 9'h07b;  //F1
279                           9'h006:               keymac[8:0] <= 9'h07b;  //F2
280                           9'h007:               keymac[8:0] <= 9'h07b;  //F12 <OSD>
281                           9'h008:               keymac[8:0] <= 9'h07b;
282                           9'h009:               keymac[8:0] <= 9'h07b;  //F10
283                           9'h00a:               keymac[8:0] <= 9'h07b;  //F8
284                           9'h00b:               keymac[8:0] <= 9'h07b;  //F6
285                           9'h00c:               keymac[8:0] <= 9'h07b;  //F4
286                           9'h00d:               keymac[8:0] <= 9'h061;  //TAB
287                           9'h00e:               keymac[8:0] <= 9'h065;  //~ (`)
288                           9'h00f:               keymac[8:0] <= 9'h07b;
289                           9'h010:               keymac[8:0] <= 9'h07b;
290                           9'h011:               keymac[8:0] <= 9'h075;  //LEFT ALT (option)
291                           9'h012:               keymac[8:0] <= 9'h071;  //LEFT SHIFT
292                           9'h013:               keymac[8:0] <= 9'h07b;
293                           9'h014:               keymac[8:0] <= 9'h06f;  //CTRL (command)
294                           9'h015:               keymac[8:0] <= 9'h019;  //q
295                           9'h016:               keymac[8:0] <= 9'h025;  //1
296                           9'h017:               keymac[8:0] <= 9'h07b;
297                           9'h018:               keymac[8:0] <= 9'h07b;
298                           9'h019:               keymac[8:0] <= 9'h07b;
299                           9'h01a:               keymac[8:0] <= 9'h00d;  //z
300                           9'h01b:               keymac[8:0] <= 9'h003;  //s
301                           9'h01c:               keymac[8:0] <= 9'h001;  //a
302                           9'h01d:               keymac[8:0] <= 9'h01b;  //w
303                           9'h01e:               keymac[8:0] <= 9'h027;  //2
304                           9'h01f:               keymac[8:0] <= 9'h07b;
305                           9'h020:               keymac[8:0] <= 9'h07b;
306                           9'h021:               keymac[8:0] <= 9'h011;  //c
307                           9'h022:               keymac[8:0] <= 9'h00f;  //x
308                           9'h023:               keymac[8:0] <= 9'h005;  //d
309                           9'h024:               keymac[8:0] <= 9'h01d;  //e
310                           9'h025:               keymac[8:0] <= 9'h02b;  //4
311                           9'h026:               keymac[8:0] <= 9'h029;  //3
312                           9'h027:               keymac[8:0] <= 9'h07b;
313                           9'h028:               keymac[8:0] <= 9'h07b;
314                           9'h029:               keymac[8:0] <= 9'h063;  //SPACE
315                           9'h02a:               keymac[8:0] <= 9'h013;  //v
316                           9'h02b:               keymac[8:0] <= 9'h007;  //f
317                           9'h02c:               keymac[8:0] <= 9'h023;  //t
318                           9'h02d:               keymac[8:0] <= 9'h01f;  //r
319                           9'h02e:               keymac[8:0] <= 9'h02f;  //5
320                           9'h02f:               keymac[8:0] <= 9'h07b;
321                           9'h030:               keymac[8:0] <= 9'h07b;
322                           9'h031:               keymac[8:0] <= 9'h05b;  //n
323                           9'h032:               keymac[8:0] <= 9'h017;  //b
324                           9'h033:               keymac[8:0] <= 9'h009;  //h
325                           9'h034:               keymac[8:0] <= 9'h00b;  //g
326                           9'h035:               keymac[8:0] <= 9'h021;  //y
327                           9'h036:               keymac[8:0] <= 9'h02d;  //6
328                           9'h037:               keymac[8:0] <= 9'h07b;
329                           9'h038:               keymac[8:0] <= 9'h07b;
330                           9'h039:               keymac[8:0] <= 9'h07b;
331                           9'h03a:               keymac[8:0] <= 9'h05d;  //m
332                           9'h03b:               keymac[8:0] <= 9'h04d;  //j
333                           9'h03c:               keymac[8:0] <= 9'h041;  //u
334                           9'h03d:               keymac[8:0] <= 9'h035;  //7
335                           9'h03e:               keymac[8:0] <= 9'h039;  //8
336                           9'h03f:               keymac[8:0] <= 9'h07b;
337                           9'h040:               keymac[8:0] <= 9'h07b;
338                           9'h041:               keymac[8:0] <= 9'h057;  //<,
339                           9'h042:               keymac[8:0] <= 9'h051;  //k
340                           9'h043:               keymac[8:0] <= 9'h045;  //i
341                           9'h044:               keymac[8:0] <= 9'h03f;  //o
342                           9'h045:               keymac[8:0] <= 9'h03b;  //0
343                           9'h046:               keymac[8:0] <= 9'h033;  //9
344                           9'h047:               keymac[8:0] <= 9'h07b;
345                           9'h048:               keymac[8:0] <= 9'h07b;
346                           9'h049:               keymac[8:0] <= 9'h05f;  //>.
347                           9'h04a:               keymac[8:0] <= 9'h059;  //FORWARD SLASH
348                           9'h04b:               keymac[8:0] <= 9'h04b;  //l
349                           9'h04c:               keymac[8:0] <= 9'h053;  //;
350                           9'h04d:               keymac[8:0] <= 9'h047;  //p
351                           9'h04e:               keymac[8:0] <= 9'h037;  //-
352                           9'h04f:               keymac[8:0] <= 9'h07b;
353                           9'h050:               keymac[8:0] <= 9'h07b;
354                           9'h051:               keymac[8:0] <= 9'h07b;
355                           9'h052:               keymac[8:0] <= 9'h04f;  //'"
356                           9'h053:               keymac[8:0] <= 9'h07b;
357                           9'h054:               keymac[8:0] <= 9'h043;  //[
358                           9'h055:               keymac[8:0] <= 9'h031;  // = 
359                           9'h056:               keymac[8:0] <= 9'h07b;
360                           9'h057:               keymac[8:0] <= 9'h07b;
361                           9'h058:               keymac[8:0] <= 9'h073;  //CAPSLOCK
362                           9'h059:               keymac[8:0] <= 9'h071;  //RIGHT SHIFT
363                           9'h05a:               keymac[8:0] <= 9'h049;  //ENTER
364                           9'h05b:               keymac[8:0] <= 9'h03d;  //]
365                           9'h05c:               keymac[8:0] <= 9'h07b;
366                           9'h05d:               keymac[8:0] <= 9'h055;  //BACKSLASH
367                           9'h05e:               keymac[8:0] <= 9'h07b;
368                           9'h05f:               keymac[8:0] <= 9'h07b;
369                           9'h060:               keymac[8:0] <= 9'h07b;
370                           9'h061:               keymac[8:0] <= 9'h071;  //international left shift cut out (German '<>' key), 0x56 Set#1 code
371                           9'h062:               keymac[8:0] <= 9'h07b;
372                           9'h063:               keymac[8:0] <= 9'h07b;
373                           9'h064:               keymac[8:0] <= 9'h07b;
374                           9'h065:               keymac[8:0] <= 9'h07b;
375                           9'h066:               keymac[8:0] <= 9'h067;  //BACKSPACE
376                           9'h067:               keymac[8:0] <= 9'h07b;
377                           9'h068:               keymac[8:0] <= 9'h07b;
378                           9'h069:               keymac[8:0] <= 9'h127;  //KP 1
379                           9'h06a:               keymac[8:0] <= 9'h07b;
380                           9'h06b:               keymac[8:0] <= 9'h12d;  //KP 4
381                           9'h06c:               keymac[8:0] <= 9'h133;  //KP 7
382                           9'h06d:               keymac[8:0] <= 9'h07b;
383                           9'h06e:               keymac[8:0] <= 9'h07b;
384                           9'h06f:               keymac[8:0] <= 9'h07b;
385                           9'h070:               keymac[8:0] <= 9'h125;  //KP 0
386                           9'h071:               keymac[8:0] <= 9'h103;  //KP .
387                           9'h072:               keymac[8:0] <= 9'h129;  //KP 2
388                           9'h073:               keymac[8:0] <= 9'h12f;  //KP 5
389                           9'h074:               keymac[8:0] <= 9'h131;  //KP 6
390                           9'h075:               keymac[8:0] <= 9'h137;  //KP 8
391                           9'h076:               keymac[8:0] <= 9'b000;  //ESCAPE
392                           9'h077:               keymac[8:0] <= 9'h07b;  //NUMLOCK
393                           9'h078:               keymac[8:0] <= 9'h07b;  //F11 <OSD>
394                           9'h079:               keymac[8:0] <= 9'h07b;  //KP +
395                           9'h07a:               keymac[8:0] <= 9'h12b;  //KP 3
396                           9'h07b:               keymac[8:0] <= 9'h11d;  //KP -
397                           9'h07c:               keymac[8:0] <= 9'h07b;  //KP *
398                           9'h07d:               keymac[8:0] <= 9'h139;  //KP 9
399                           9'h07e:               keymac[8:0] <= 9'h07b;  //SCROLL LOCK / KP )
400                           9'h07f:               keymac[8:0] <= 9'h07b;
401                           9'h080:               keymac[8:0] <= 9'h07b;
402                           9'h081:               keymac[8:0] <= 9'h07b;
403                           9'h082:               keymac[8:0] <= 9'h07b;
404                           9'h083:               keymac[8:0] <= 9'h07b;  //F7
405                           9'h084:               keymac[8:0] <= 9'h07b;
406                           9'h085:               keymac[8:0] <= 9'h07b;
407                           9'h086:               keymac[8:0] <= 9'h07b;
408                           9'h087:               keymac[8:0] <= 9'h07b;
409                           9'h088:               keymac[8:0] <= 9'h07b;
410                           9'h089:               keymac[8:0] <= 9'h07b;
411                           9'h08a:               keymac[8:0] <= 9'h07b;
412                           9'h08b:               keymac[8:0] <= 9'h07b;
413                           9'h08c:               keymac[8:0] <= 9'h07b;
414                           9'h08d:               keymac[8:0] <= 9'h07b;
415                           9'h08e:               keymac[8:0] <= 9'h07b;
416                           9'h08f:               keymac[8:0] <= 9'h07b;
417                           9'h090:               keymac[8:0] <= 9'h07b;
418                           9'h091:               keymac[8:0] <= 9'h07b;
419                           9'h092:               keymac[8:0] <= 9'h07b;
420                           9'h093:               keymac[8:0] <= 9'h07b;
421                           9'h094:               keymac[8:0] <= 9'h07b;
422                           9'h095:               keymac[8:0] <= 9'h07b;
423                           9'h096:               keymac[8:0] <= 9'h07b;
424                           9'h097:               keymac[8:0] <= 9'h07b;
425                           9'h098:               keymac[8:0] <= 9'h07b;
426                           9'h099:               keymac[8:0] <= 9'h07b;
427                           9'h09a:               keymac[8:0] <= 9'h07b;
428                           9'h09b:               keymac[8:0] <= 9'h07b;
429                           9'h09c:               keymac[8:0] <= 9'h07b;
430                           9'h09d:               keymac[8:0] <= 9'h07b;
431                           9'h09e:               keymac[8:0] <= 9'h07b;
432                           9'h09f:               keymac[8:0] <= 9'h07b;
433                           9'h0a0:               keymac[8:0] <= 9'h07b;
434                           9'h0a1:               keymac[8:0] <= 9'h07b;
435                           9'h0a2:               keymac[8:0] <= 9'h07b;
436                           9'h0a3:               keymac[8:0] <= 9'h07b;
437                           9'h0a4:               keymac[8:0] <= 9'h07b;
438                           9'h0a5:               keymac[8:0] <= 9'h07b;
439                           9'h0a6:               keymac[8:0] <= 9'h07b;
440                           9'h0a7:               keymac[8:0] <= 9'h07b;
441                           9'h0a8:               keymac[8:0] <= 9'h07b;
442                           9'h0a9:               keymac[8:0] <= 9'h07b;
443                           9'h0aa:               keymac[8:0] <= 9'h07b;
444                           9'h0ab:               keymac[8:0] <= 9'h07b;
445                           9'h0ac:               keymac[8:0] <= 9'h07b;
446                           9'h0ad:               keymac[8:0] <= 9'h07b;
447                           9'h0ae:               keymac[8:0] <= 9'h07b;
448                           9'h0af:               keymac[8:0] <= 9'h07b;
449                           9'h0b0:               keymac[8:0] <= 9'h07b;
450                           9'h0b1:               keymac[8:0] <= 9'h07b;
451                           9'h0b2:               keymac[8:0] <= 9'h07b;
452                           9'h0b3:               keymac[8:0] <= 9'h07b;
453                           9'h0b4:               keymac[8:0] <= 9'h07b;
454                           9'h0b5:               keymac[8:0] <= 9'h07b;
455                           9'h0b6:               keymac[8:0] <= 9'h07b;
456                           9'h0b7:               keymac[8:0] <= 9'h07b;
457                           9'h0b8:               keymac[8:0] <= 9'h07b;
458                           9'h0b9:               keymac[8:0] <= 9'h07b;
459                           9'h0ba:               keymac[8:0] <= 9'h07b;
460                           9'h0bb:               keymac[8:0] <= 9'h07b;
461                           9'h0bc:               keymac[8:0] <= 9'h07b;
462                           9'h0bd:               keymac[8:0] <= 9'h07b;
463                           9'h0be:               keymac[8:0] <= 9'h07b;
464                           9'h0bf:               keymac[8:0] <= 9'h07b;
465                           9'h0c0:               keymac[8:0] <= 9'h07b;
466                           9'h0c1:               keymac[8:0] <= 9'h07b;
467                           9'h0c2:               keymac[8:0] <= 9'h07b;
468                           9'h0c3:               keymac[8:0] <= 9'h07b;
469                           9'h0c4:               keymac[8:0] <= 9'h07b;
470                           9'h0c5:               keymac[8:0] <= 9'h07b;
471                           9'h0c6:               keymac[8:0] <= 9'h07b;
472                           9'h0c7:               keymac[8:0] <= 9'h07b;
473                           9'h0c8:               keymac[8:0] <= 9'h07b;
474                           9'h0c9:               keymac[8:0] <= 9'h07b;
475                           9'h0ca:               keymac[8:0] <= 9'h07b;
476                           9'h0cb:               keymac[8:0] <= 9'h07b;
477                           9'h0cc:               keymac[8:0] <= 9'h07b;
478                           9'h0cd:               keymac[8:0] <= 9'h07b;
479                           9'h0ce:               keymac[8:0] <= 9'h07b;
480                           9'h0cf:               keymac[8:0] <= 9'h07b;
481                           9'h0d0:               keymac[8:0] <= 9'h07b;
482                           9'h0d1:               keymac[8:0] <= 9'h07b;
483                           9'h0d2:               keymac[8:0] <= 9'h07b;
484                           9'h0d3:               keymac[8:0] <= 9'h07b;
485                           9'h0d4:               keymac[8:0] <= 9'h07b;
486                           9'h0d5:               keymac[8:0] <= 9'h07b;
487                           9'h0d6:               keymac[8:0] <= 9'h07b;
488                           9'h0d7:               keymac[8:0] <= 9'h07b;
489                           9'h0d8:               keymac[8:0] <= 9'h07b;
490                           9'h0d9:               keymac[8:0] <= 9'h07b;
491                           9'h0da:               keymac[8:0] <= 9'h07b;
492                           9'h0db:               keymac[8:0] <= 9'h07b;
493                           9'h0dc:               keymac[8:0] <= 9'h07b;
494                           9'h0dd:               keymac[8:0] <= 9'h07b;
495                           9'h0de:               keymac[8:0] <= 9'h07b;
496                           9'h0df:               keymac[8:0] <= 9'h07b;
497                           9'h0e0:               keymac[8:0] <= 9'h07b;  //ps2 extended key
498                           9'h0e1:               keymac[8:0] <= 9'h07b;
499                           9'h0e2:               keymac[8:0] <= 9'h07b;
500                           9'h0e3:               keymac[8:0] <= 9'h07b;
501                           9'h0e4:               keymac[8:0] <= 9'h07b;
502                           9'h0e5:               keymac[8:0] <= 9'h07b;
503                           9'h0e6:               keymac[8:0] <= 9'h07b;
504                           9'h0e7:               keymac[8:0] <= 9'h07b;
505                           9'h0e8:               keymac[8:0] <= 9'h07b;
506                           9'h0e9:               keymac[8:0] <= 9'h07b;
507                           9'h0ea:               keymac[8:0] <= 9'h07b;
508                           9'h0eb:               keymac[8:0] <= 9'h07b;
509                           9'h0ec:               keymac[8:0] <= 9'h07b;
510                           9'h0ed:               keymac[8:0] <= 9'h07b;
511                           9'h0ee:               keymac[8:0] <= 9'h07b;
512                           9'h0ef:               keymac[8:0] <= 9'h07b;
513                           9'h0f0:               keymac[8:0] <= 9'h07b;  //ps2 release code
514                           9'h0f1:               keymac[8:0] <= 9'h07b;
515                           9'h0f2:               keymac[8:0] <= 9'h07b;
516                           9'h0f3:               keymac[8:0] <= 9'h07b;
517                           9'h0f4:               keymac[8:0] <= 9'h07b;
518                           9'h0f5:               keymac[8:0] <= 9'h07b;
519                           9'h0f6:               keymac[8:0] <= 9'h07b;
520                           9'h0f7:               keymac[8:0] <= 9'h07b;
521                           9'h0f8:               keymac[8:0] <= 9'h07b;
522                           9'h0f9:               keymac[8:0] <= 9'h07b;
523                           9'h0fa:               keymac[8:0] <= 9'h07b;  //ps2 ack code
524                           9'h0fb:               keymac[8:0] <= 9'h07b;
525                           9'h0fc:               keymac[8:0] <= 9'h07b;
526                           9'h0fd:               keymac[8:0] <= 9'h07b;
527                           9'h0fe:               keymac[8:0] <= 9'h07b;
528                           9'h0ff:               keymac[8:0] <= 9'h07b;
529                           9'h100:               keymac[8:0] <= 9'h07b;
530                           9'h101:               keymac[8:0] <= 9'h07b;
531                           9'h102:               keymac[8:0] <= 9'h07b;
532                           9'h103:               keymac[8:0] <= 9'h07b;
533                           9'h104:               keymac[8:0] <= 9'h07b;
534                           9'h105:               keymac[8:0] <= 9'h07b;
535                           9'h106:               keymac[8:0] <= 9'h07b;
536                           9'h107:               keymac[8:0] <= 9'h07b;
537                           9'h108:               keymac[8:0] <= 9'h07b;
538                           9'h109:               keymac[8:0] <= 9'h07b;
539                           9'h10a:               keymac[8:0] <= 9'h07b;
540                           9'h10b:               keymac[8:0] <= 9'h07b;
541                           9'h10c:               keymac[8:0] <= 9'h07b;
542                           9'h10d:               keymac[8:0] <= 9'h07b;
543                           9'h10e:               keymac[8:0] <= 9'h07b;
544                           9'h10f:               keymac[8:0] <= 9'h07b;
545                           9'h110:               keymac[8:0] <= 9'h07b;
546                           9'h111:               keymac[8:0] <= 9'h075;  //RIGHT ALT
547                           9'h112:               keymac[8:0] <= 9'h07b;
548                           9'h113:               keymac[8:0] <= 9'h07b;
549                           9'h114:               keymac[8:0] <= 9'h07b;
550                           9'h115:               keymac[8:0] <= 9'h07b;
551                           9'h116:               keymac[8:0] <= 9'h07b;
552                           9'h117:               keymac[8:0] <= 9'h07b;
553                           9'h118:               keymac[8:0] <= 9'h07b;
554                           9'h119:               keymac[8:0] <= 9'h07b;
555                           9'h11a:               keymac[8:0] <= 9'h07b;
556                           9'h11b:               keymac[8:0] <= 9'h07b;
557                           9'h11c:               keymac[8:0] <= 9'h07b;
558                           9'h11d:               keymac[8:0] <= 9'h07b;
559                           9'h11e:               keymac[8:0] <= 9'h07b;
560                           9'h11f:               keymac[8:0] <= 9'h06f;  //LEFT COMMAND (LEFT GUI)
561                           9'h120:               keymac[8:0] <= 9'h07b;
562                           9'h121:               keymac[8:0] <= 9'h07b;
563                           9'h122:               keymac[8:0] <= 9'h07b;
564                           9'h123:               keymac[8:0] <= 9'h07b;
565                           9'h124:               keymac[8:0] <= 9'h07b;
566                           9'h125:               keymac[8:0] <= 9'h07b;
567                           9'h126:               keymac[8:0] <= 9'h07b;
568                           9'h127:               keymac[8:0] <= 9'h06f;  //RIGHT AMIGA (RIGHT GUI)
569                           9'h128:               keymac[8:0] <= 9'h07b;
570                           9'h129:               keymac[8:0] <= 9'h07b;
571                           9'h12a:               keymac[8:0] <= 9'h07b;
572                           9'h12b:               keymac[8:0] <= 9'h07b;
573                           9'h12c:               keymac[8:0] <= 9'h07b;
574                           9'h12d:               keymac[8:0] <= 9'h07b;
575                           9'h12e:               keymac[8:0] <= 9'h07b;
576                           9'h12f:               keymac[8:0] <= 9'h06f;  //RIGHT AMIGA (APPS)
577                           9'h130:               keymac[8:0] <= 9'h07b;
578                           9'h131:               keymac[8:0] <= 9'h07b;
579                           9'h132:               keymac[8:0] <= 9'h07b;
580                           9'h133:               keymac[8:0] <= 9'h07b;
581                           9'h134:               keymac[8:0] <= 9'h07b;
582                           9'h135:               keymac[8:0] <= 9'h07b;
583                           9'h136:               keymac[8:0] <= 9'h07b;
584                           9'h137:               keymac[8:0] <= 9'h07b;
585                           9'h138:               keymac[8:0] <= 9'h07b;
586                           9'h139:               keymac[8:0] <= 9'h07b;
587                           9'h13a:               keymac[8:0] <= 9'h07b;
588                           9'h13b:               keymac[8:0] <= 9'h07b;
589                           9'h13c:               keymac[8:0] <= 9'h07b;
590                           9'h13d:               keymac[8:0] <= 9'h07b;
591                           9'h13e:               keymac[8:0] <= 9'h07b;
592                           9'h13f:               keymac[8:0] <= 9'h07b;
593                           9'h140:               keymac[8:0] <= 9'h07b;
594                           9'h141:               keymac[8:0] <= 9'h07b;
595                           9'h142:               keymac[8:0] <= 9'h07b;
596                           9'h143:               keymac[8:0] <= 9'h07b;
597                           9'h144:               keymac[8:0] <= 9'h07b;
598                           9'h145:               keymac[8:0] <= 9'h07b;
599                           9'h146:               keymac[8:0] <= 9'h07b;
600                           9'h147:               keymac[8:0] <= 9'h07b;
601                           9'h148:               keymac[8:0] <= 9'h07b;
602                           9'h149:               keymac[8:0] <= 9'h07b;
603                           9'h14a:               keymac[8:0] <= 9'h07b;  //KP /
604                           9'h14b:               keymac[8:0] <= 9'h07b;
605                           9'h14c:               keymac[8:0] <= 9'h07b;
606                           9'h14d:               keymac[8:0] <= 9'h07b;
607                           9'h14e:               keymac[8:0] <= 9'h07b;
608                           9'h14f:               keymac[8:0] <= 9'h07b;
609                           9'h150:               keymac[8:0] <= 9'h07b;
610                           9'h151:               keymac[8:0] <= 9'h07b;
611                           9'h152:               keymac[8:0] <= 9'h07b;
612                           9'h153:               keymac[8:0] <= 9'h07b;
613                           9'h154:               keymac[8:0] <= 9'h07b;
614                           9'h155:               keymac[8:0] <= 9'h07b;
615                           9'h156:               keymac[8:0] <= 9'h07b;
616                           9'h157:               keymac[8:0] <= 9'h07b;
617                           9'h158:               keymac[8:0] <= 9'h07b;
618                           9'h159:               keymac[8:0] <= 9'h07b;
619                           9'h15a:               keymac[8:0] <= 9'h119;  //KP ENTER
620                           9'h15b:               keymac[8:0] <= 9'h07b;
621                           9'h15c:               keymac[8:0] <= 9'h07b;
622                           9'h15d:               keymac[8:0] <= 9'h07b;
623                           9'h15e:               keymac[8:0] <= 9'h07b;
624                           9'h15f:               keymac[8:0] <= 9'h07b;
625                           9'h160:               keymac[8:0] <= 9'h07b;
626                           9'h161:               keymac[8:0] <= 9'h07b;
627                           9'h162:               keymac[8:0] <= 9'h07b;
628                           9'h163:               keymac[8:0] <= 9'h07b;
629                           9'h164:               keymac[8:0] <= 9'h07b;
630                           9'h165:               keymac[8:0] <= 9'h07b;
631                           9'h166:               keymac[8:0] <= 9'h07b;
632                           9'h167:               keymac[8:0] <= 9'h07b;
633                           9'h168:               keymac[8:0] <= 9'h07b;
634                           9'h169:               keymac[8:0] <= 9'h07b;  //END
635                           9'h16a:               keymac[8:0] <= 9'h07b;
636                           9'h16b:               keymac[8:0] <= 9'h10d;  //ARROW LEFT
637                           9'h16c:               keymac[8:0] <= 9'h07b;  //HOME
638                           9'h16d:               keymac[8:0] <= 9'h07b;
639                           9'h16e:               keymac[8:0] <= 9'h07b;
640                           9'h16f:               keymac[8:0] <= 9'h07b;
641                           9'h170:               keymac[8:0] <= 9'h07b;  //INSERT = HELP
642                           9'h171:               keymac[8:0] <= 9'h10f;  //DELETE
643                           9'h172:               keymac[8:0] <= 9'h111;  //ARROW DOWN
644                           9'h173:               keymac[8:0] <= 9'h07b;
645                           9'h174:               keymac[8:0] <= 9'h105;  //ARROW RIGHT
646                           9'h175:               keymac[8:0] <= 9'h10b;  //ARROW UP
647                           9'h176:               keymac[8:0] <= 9'h07b;
648                           9'h177:               keymac[8:0] <= 9'h07b;
649                           9'h178:               keymac[8:0] <= 9'h07b;
650                           9'h179:               keymac[8:0] <= 9'h07b;
651                           9'h17a:               keymac[8:0] <= 9'h07b;  //PGDN <OSD>
652                           9'h17b:               keymac[8:0] <= 9'h07b;
653                           9'h17c:               keymac[8:0] <= 9'h07b;  //PRTSCR <OSD>
654                           9'h17d:               keymac[8:0] <= 9'h07b;  //PGUP <OSD>
655                           9'h17e:               keymac[8:0] <= 9'h07b;  //ctrl+break
656                           9'h17f:               keymac[8:0] <= 9'h07b;
657                           9'h180:               keymac[8:0] <= 9'h07b;
658                           9'h181:               keymac[8:0] <= 9'h07b;
659                           9'h182:               keymac[8:0] <= 9'h07b;
660                           9'h183:               keymac[8:0] <= 9'h07b;
661                           9'h184:               keymac[8:0] <= 9'h07b;
662                           9'h185:               keymac[8:0] <= 9'h07b;
663                           9'h186:               keymac[8:0] <= 9'h07b;
664                           9'h187:               keymac[8:0] <= 9'h07b;
665                           9'h188:               keymac[8:0] <= 9'h07b;
666                           9'h189:               keymac[8:0] <= 9'h07b;
667                           9'h18a:               keymac[8:0] <= 9'h07b;
668                           9'h18b:               keymac[8:0] <= 9'h07b;
669                           9'h18c:               keymac[8:0] <= 9'h07b;
670                           9'h18d:               keymac[8:0] <= 9'h07b;
671                           9'h18e:               keymac[8:0] <= 9'h07b;
672                           9'h18f:               keymac[8:0] <= 9'h07b;
673                           9'h190:               keymac[8:0] <= 9'h07b;
674                           9'h191:               keymac[8:0] <= 9'h07b;
675                           9'h192:               keymac[8:0] <= 9'h07b;
676                           9'h193:               keymac[8:0] <= 9'h07b;
677                           9'h194:               keymac[8:0] <= 9'h07b;
678                           9'h195:               keymac[8:0] <= 9'h07b;
679                           9'h196:               keymac[8:0] <= 9'h07b;
680                           9'h197:               keymac[8:0] <= 9'h07b;
681                           9'h198:               keymac[8:0] <= 9'h07b;
682                           9'h199:               keymac[8:0] <= 9'h07b;
683                           9'h19a:               keymac[8:0] <= 9'h07b;
684                           9'h19b:               keymac[8:0] <= 9'h07b;
685                           9'h19c:               keymac[8:0] <= 9'h07b;
686                           9'h19d:               keymac[8:0] <= 9'h07b;
687                           9'h19e:               keymac[8:0] <= 9'h07b;
688                           9'h19f:               keymac[8:0] <= 9'h07b;
689                           9'h1a0:               keymac[8:0] <= 9'h07b;
690                           9'h1a1:               keymac[8:0] <= 9'h07b;
691                           9'h1a2:               keymac[8:0] <= 9'h07b;
692                           9'h1a3:               keymac[8:0] <= 9'h07b;
693                           9'h1a4:               keymac[8:0] <= 9'h07b;
694                           9'h1a5:               keymac[8:0] <= 9'h07b;
695                           9'h1a6:               keymac[8:0] <= 9'h07b;
696                           9'h1a7:               keymac[8:0] <= 9'h07b;
697                           9'h1a8:               keymac[8:0] <= 9'h07b;
698                           9'h1a9:               keymac[8:0] <= 9'h07b;
699                           9'h1aa:               keymac[8:0] <= 9'h07b;
700                           9'h1ab:               keymac[8:0] <= 9'h07b;
701                           9'h1ac:               keymac[8:0] <= 9'h07b;
702                           9'h1ad:               keymac[8:0] <= 9'h07b;
703                           9'h1ae:               keymac[8:0] <= 9'h07b;
704                           9'h1af:               keymac[8:0] <= 9'h07b;
705                           9'h1b0:               keymac[8:0] <= 9'h07b;
706                           9'h1b1:               keymac[8:0] <= 9'h07b;
707                           9'h1b2:               keymac[8:0] <= 9'h07b;
708                           9'h1b3:               keymac[8:0] <= 9'h07b;
709                           9'h1b4:               keymac[8:0] <= 9'h07b;
710                           9'h1b5:               keymac[8:0] <= 9'h07b;
711                           9'h1b6:               keymac[8:0] <= 9'h07b;
712                           9'h1b7:               keymac[8:0] <= 9'h07b;
713                           9'h1b8:               keymac[8:0] <= 9'h07b;
714                           9'h1b9:               keymac[8:0] <= 9'h07b;
715                           9'h1ba:               keymac[8:0] <= 9'h07b;
716                           9'h1bb:               keymac[8:0] <= 9'h07b;
717                           9'h1bc:               keymac[8:0] <= 9'h07b;
718                           9'h1bd:               keymac[8:0] <= 9'h07b;
719                           9'h1be:               keymac[8:0] <= 9'h07b;
720                           9'h1bf:               keymac[8:0] <= 9'h07b;
721                           9'h1c0:               keymac[8:0] <= 9'h07b;
722                           9'h1c1:               keymac[8:0] <= 9'h07b;
723                           9'h1c2:               keymac[8:0] <= 9'h07b;
724                           9'h1c3:               keymac[8:0] <= 9'h07b;
725                           9'h1c4:               keymac[8:0] <= 9'h07b;
726                           9'h1c5:               keymac[8:0] <= 9'h07b;
727                           9'h1c6:               keymac[8:0] <= 9'h07b;
728                           9'h1c7:               keymac[8:0] <= 9'h07b;
729                           9'h1c8:               keymac[8:0] <= 9'h07b;
730                           9'h1c9:               keymac[8:0] <= 9'h07b;
731                           9'h1ca:               keymac[8:0] <= 9'h07b;
732                           9'h1cb:               keymac[8:0] <= 9'h07b;
733                           9'h1cc:               keymac[8:0] <= 9'h07b;
734                           9'h1cd:               keymac[8:0] <= 9'h07b;
735                           9'h1ce:               keymac[8:0] <= 9'h07b;
736                           9'h1cf:               keymac[8:0] <= 9'h07b;
737                           9'h1d0:               keymac[8:0] <= 9'h07b;
738                           9'h1d1:               keymac[8:0] <= 9'h07b;
739                           9'h1d2:               keymac[8:0] <= 9'h07b;
740                           9'h1d3:               keymac[8:0] <= 9'h07b;
741                           9'h1d4:               keymac[8:0] <= 9'h07b;
742                           9'h1d5:               keymac[8:0] <= 9'h07b;
743                           9'h1d6:               keymac[8:0] <= 9'h07b;
744                           9'h1d7:               keymac[8:0] <= 9'h07b;
745                           9'h1d8:               keymac[8:0] <= 9'h07b;
746                           9'h1d9:               keymac[8:0] <= 9'h07b;
747                           9'h1da:               keymac[8:0] <= 9'h07b;
748                           9'h1db:               keymac[8:0] <= 9'h07b;
749                           9'h1dc:               keymac[8:0] <= 9'h07b;
750                           9'h1dd:               keymac[8:0] <= 9'h07b;
751                           9'h1de:               keymac[8:0] <= 9'h07b;
752                           9'h1df:               keymac[8:0] <= 9'h07b;
753                           9'h1e0:               keymac[8:0] <= 9'h07b;  //ps2 extended key(duplicate, see $e0)
754                           9'h1e1:               keymac[8:0] <= 9'h07b;
755                           9'h1e2:               keymac[8:0] <= 9'h07b;
756                           9'h1e3:               keymac[8:0] <= 9'h07b;
757                           9'h1e4:               keymac[8:0] <= 9'h07b;
758                           9'h1e5:               keymac[8:0] <= 9'h07b;
759                           9'h1e6:               keymac[8:0] <= 9'h07b;
760                           9'h1e7:               keymac[8:0] <= 9'h07b;
761                           9'h1e8:               keymac[8:0] <= 9'h07b;
762                           9'h1e9:               keymac[8:0] <= 9'h07b;
763                           9'h1ea:               keymac[8:0] <= 9'h07b;
764                           9'h1eb:               keymac[8:0] <= 9'h07b;
765                           9'h1ec:               keymac[8:0] <= 9'h07b;
766                           9'h1ed:               keymac[8:0] <= 9'h07b;
767                           9'h1ee:               keymac[8:0] <= 9'h07b;
768                           9'h1ef:               keymac[8:0] <= 9'h07b;
769                           9'h1f0:               keymac[8:0] <= 9'h07b;  //ps2 release code(duplicate, see $f0)
770                           9'h1f1:               keymac[8:0] <= 9'h07b;
771                           9'h1f2:               keymac[8:0] <= 9'h07b;
772                           9'h1f3:               keymac[8:0] <= 9'h07b;
773                           9'h1f4:               keymac[8:0] <= 9'h07b;
774                           9'h1f5:               keymac[8:0] <= 9'h07b;
775                           9'h1f6:               keymac[8:0] <= 9'h07b;
776                           9'h1f7:               keymac[8:0] <= 9'h07b;
777                           9'h1f8:               keymac[8:0] <= 9'h07b;
778                           9'h1f9:               keymac[8:0] <= 9'h07b;
779                           9'h1fa:               keymac[8:0] <= 9'h07b;  //ps2 ack code(duplicate see $fa)
780                           9'h1fb:               keymac[8:0] <= 9'h07b;
781                           9'h1fc:               keymac[8:0] <= 9'h07b;
782                           9'h1fd:               keymac[8:0] <= 9'h07b;
783                           9'h1fe:               keymac[8:0] <= 9'h07b;
784                           9'h1ff:               keymac[8:0] <= 9'h07b;
785                   endcase // case ({extended,ps2key[7:0]})
786                   keymac[7] <= keybreak;
787           end
788
789         /* Some debug signals for my own sanity */
790         always@(posedge sysclk or posedge reset) begin
791                 if (reset)
792                   debug <= 0;
793                 else begin
794                         if (istrobe)
795                           debug[15:8] <= ibyte;
796                         debug[7:0] <= { ps2clk, ps2dat, dbg_lowstate, 2'b0,
797                                         state };
798                 end
799         end
800 endmodule