4 * PS2 Keyboard to Mac interface module
6 module ps2_kbd( input sysclk,
18 output reg [15:0] debug
44 /* PS2 interface signals */
51 wire [1:0] dbg_lowstate;
53 ps2 ps20(.sysclk(sysclk),
63 .dbg_state(dbg_lowstate));
65 /* --- PS2 side State machine ---
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
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
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
82 * - at state_wait: wait for data byte
83 * * capslock -> send 0xed -> state_led1
84 * * other -> state_wait
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...
90 localparam ps2k_state_init = 0;
91 localparam ps2k_state_led1 = 1;
92 localparam ps2k_state_led2 = 2;
93 localparam ps2k_state_wait = 3;
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
101 * - next : next state
102 * - obyte : next byte to send
104 always@(timeout or state or istrobe or ibyte or capslock) begin
109 if (istrobe || timeout)
111 ps2k_state_init: begin
112 if (istrobe && ibyte == 8'haa) begin
115 next = ps2k_state_led1;
116 end else if (ibyte != 8'hfa)
119 ps2k_state_led1: begin
121 if (istrobe && ibyte == 8'hfa) begin
122 nbyte = { 5'b00000, capslock, 1'b1, 1'b0 };
123 next = ps2k_state_led2;
125 next = ps2k_state_init;
127 ps2k_state_led2: begin
128 if (istrobe && ibyte == 8'hfa)
129 next = ps2k_state_wait;
132 next = ps2k_state_init;
135 ps2k_state_wait: begin
137 if (istrobe && ibyte == 8'h58) begin
140 next = ps2k_state_led1;
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
150 always@(posedge sysclk or posedge reset)
152 state <= ps2k_state_init;
155 always@(posedge sysclk or posedge reset)
160 always@(posedge sysclk or posedge reset)
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;
170 /* Latch key info from PS2, handle capslock state */
171 always@(posedge sysclk or posedge reset)
176 end else if (got_key) begin
185 /* Capslock handling */
186 if (ibyte == 8'h58 && !keybreak)
187 capslock <= ~capslock;
191 /* --- Mac side --- */
193 /* Latch commands from Mac */
194 always@(posedge sysclk or posedge reset)
201 if (strobe_out) begin
207 8'h10: cmd_inquiry <= 1;
208 8'h14: cmd_instant <= 1;
209 8'h16: cmd_model <= 1;
210 8'h36: cmd_test <= 1;
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
219 always@(posedge sysclk or posedge reset)
223 /* reset counter on command from Mac */
227 pacetimer <= pacetimer + 1;
229 assign tick_long = pacetimer == 22'h3fffff;
230 assign tick_short = pacetimer == 22'h000fff;
232 /* Delay inquiry responses to after tick_short */
233 always@(posedge sysclk or posedge reset)
237 if (strobe_out | strobe_in)
240 inquiry_active <= cmd_inquiry;
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);
249 assign strobe_in = ((cmd_model | cmd_test) & tick_short) | pop_key;
251 /* Latch key_pending */
252 always @(posedge sysclk or posedge reset)
256 if (pop_key | cmd_model | cmd_test)
258 else if (!key_pending & got_key && !got_break && !got_extend)
262 /* Data to Mac ... XXX: Handle keypad and special case capslock */
263 assign data_in = cmd_test ? 8'h7d :
265 key_pending ? keymac[7:0] : 8'h7b;
267 /* Keymap. XXX add option to assign ctrl/alt/windows to cmd/option
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;
789 /* Some debug signals for my own sanity */
790 always@(posedge sysclk or posedge reset) begin
795 debug[15:8] <= ibyte;
796 debug[7:0] <= { ps2clk, ps2dat, dbg_lowstate, 2'b0,