`timescale 1ns / 100ps /* * PS2 Keyboard to Mac interface module */ module ps2_kbd( input sysclk, input reset, inout ps2dat, inout ps2clk, input [7:0] data_out, input strobe_out, output [7:0] data_in, output strobe_in, output reg [15:0] debug ); reg [8:0] keymac; reg key_pending; reg [21:0] pacetimer; reg inquiry_active; reg extended; reg keybreak; reg capslock; reg haskey; wire got_key; wire got_break; wire got_extend; wire tick_short; wire tick_long; wire pop_key; reg cmd_inquiry; reg cmd_instant; reg cmd_model; reg cmd_test; reg[1:0] state; reg[1:0] next; reg nreq; reg[7:0] nbyte; /* PS2 interface signals */ wire istrobe; wire [7:0] ibyte; reg oreq; reg [7:0] obyte; wire oack; wire timeout; wire [1:0] dbg_lowstate; ps2 ps20(.sysclk(sysclk), .reset(reset), .ps2dat(ps2dat), .ps2clk(ps2clk), .istrobe(istrobe), .ibyte(ibyte), .oreq(oreq), .obyte(obyte), .oack(oack), .timeout(timeout), .dbg_state(dbg_lowstate)); /* --- PS2 side State machine --- * * - at state_init: wait for BAT reply * * 0xaa -> send 0xed -> state_led1 * * bad reply -> send 0xff -> state_init * * timeout -> send 0xff -> state_init * * - at state_led1: wait for ack, send LED state * * 0xfa -> send 0xYY -> state_led2 YY=LED * * bad reply -> send 0xff -> state_init * * timeout -> send 0xff -> state_init * * - at state_led2: wait for ack, go wait data * * 0xfa -> state_wait * * bad reply -> send 0xff -> state_init * * timeout -> send 0xff -> state_init * * - at state_wait: wait for data byte * * capslock -> send 0xed -> state_led1 * * other -> state_wait * * Works fine with my logitech USB/PS2 keyboard, but fails * miserably with an old HP PS2 keyboard (which also behaves * oddly with minimig as an amiga). Will eventually investigate... */ localparam ps2k_state_init = 0; localparam ps2k_state_led1 = 1; localparam ps2k_state_led2 = 2; localparam ps2k_state_wait = 3; /* Unlike my other modules, here I'll play with a big fat * combo logic. The outputs are: * - oreq : triggers sending of a byte. Set based on either * timeout or istrobe, and as such only set for a * clock. * - next : next state * - obyte : next byte to send */ always@(timeout or state or istrobe or ibyte or capslock) begin nreq = 0; next = state; nbyte = 8'hff; if (istrobe || timeout) case(state) ps2k_state_init: begin if (istrobe && ibyte == 8'haa) begin nbyte = 8'hed; nreq = 1; next = ps2k_state_led1; end else if (ibyte != 8'hfa) nreq = 1; end ps2k_state_led1: begin nreq = 1; if (istrobe && ibyte == 8'hfa) begin nbyte = { 5'b00000, capslock, 1'b1, 1'b0 }; next = ps2k_state_led2; end else next = ps2k_state_init; end ps2k_state_led2: begin if (istrobe && ibyte == 8'hfa) next = ps2k_state_wait; else begin nreq = 1; next = ps2k_state_init; end end ps2k_state_wait: begin /* Update LEDs */ if (istrobe && ibyte == 8'h58) begin nbyte = 8'hed; nreq = 1; next = ps2k_state_led1; end end endcase end /* State related latches. We latch oreq and obyte, we don't * necessarily have to but that avoids back to back * receive/send at the low level which can upset things */ always@(posedge sysclk or posedge reset) if (reset) state <= ps2k_state_init; else state <= next; always@(posedge sysclk or posedge reset) if (reset) oreq <= 0; else oreq <= nreq; always@(posedge sysclk or posedge reset) if (reset) obyte <= 0; else obyte <= nbyte; assign got_key = (state == ps2k_state_wait) && istrobe; assign got_break = { ibyte[7:1], 1'b0 } == 8'hf0; assign got_extend = { ibyte[7:1], 1'b0 } == 8'he0; /* Latch key info from PS2, handle capslock state */ always@(posedge sysclk or posedge reset) if (reset) begin extended <= 0; keybreak <= 0; capslock <= 0; end else if (got_key) begin if (got_break) keybreak <= 1; else if (got_extend) extended <= 1; else begin keybreak <= 0; extended <= 0; /* Capslock handling */ if (ibyte == 8'h58 && !keybreak) capslock <= ~capslock; end end /* --- Mac side --- */ /* Latch commands from Mac */ always@(posedge sysclk or posedge reset) if (reset) begin cmd_inquiry <= 0; cmd_instant <= 0; cmd_model <= 0; cmd_test <= 0; end else begin if (strobe_out) begin cmd_inquiry <= 0; cmd_instant <= 0; cmd_model <= 0; cmd_test <= 0; case(data_out) 8'h10: cmd_inquiry <= 1; 8'h14: cmd_instant <= 1; 8'h16: cmd_model <= 1; 8'h36: cmd_test <= 1; endcase end end /* Divide our clock to pace our responses to the Mac. tick_short ticks * when we can respond to a command, and tick_long ticks when an inquiry * command shall timeout */ always@(posedge sysclk or posedge reset) if (reset) pacetimer <= 0; else begin /* reset counter on command from Mac */ if (strobe_out) pacetimer <= 0; else if (!tick_long) pacetimer <= pacetimer + 1; end assign tick_long = pacetimer == 22'h3fffff; assign tick_short = pacetimer == 22'h000fff; /* Delay inquiry responses to after tick_short */ always@(posedge sysclk or posedge reset) if (reset) inquiry_active <= 0; else begin if (strobe_out | strobe_in) inquiry_active <= 0; else if (tick_short) inquiry_active <= cmd_inquiry; end /* Key answer to the mac XXX FIXME: keypad */ assign pop_key = (cmd_instant & tick_short) | (inquiry_active & tick_long) | (inquiry_active & key_pending); /* Reply to Mac */ assign strobe_in = ((cmd_model | cmd_test) & tick_short) | pop_key; /* Latch key_pending */ always @(posedge sysclk or posedge reset) if (reset) key_pending <= 0; else begin if (pop_key | cmd_model | cmd_test) key_pending <= 0; else if (!key_pending & got_key && !got_break && !got_extend) key_pending <= 1; end /* Data to Mac ... XXX: Handle keypad and special case capslock */ assign data_in = cmd_test ? 8'h7d : cmd_model ? 8'h03 : key_pending ? keymac[7:0] : 8'h7b; /* Keymap. XXX add option to assign ctrl/alt/windows to cmd/option * differently */ always @(posedge sysclk) if (got_key && !key_pending) begin case({extended,ibyte}) // Scan Code Set 2 9'h000: keymac[8:0] <= 9'h07b; 9'h001: keymac[8:0] <= 9'h07b; //F9 9'h002: keymac[8:0] <= 9'h07b; 9'h003: keymac[8:0] <= 9'h07b; //F5 9'h004: keymac[8:0] <= 9'h07b; //F3 9'h005: keymac[8:0] <= 9'h07b; //F1 9'h006: keymac[8:0] <= 9'h07b; //F2 9'h007: keymac[8:0] <= 9'h07b; //F12 9'h008: keymac[8:0] <= 9'h07b; 9'h009: keymac[8:0] <= 9'h07b; //F10 9'h00a: keymac[8:0] <= 9'h07b; //F8 9'h00b: keymac[8:0] <= 9'h07b; //F6 9'h00c: keymac[8:0] <= 9'h07b; //F4 9'h00d: keymac[8:0] <= 9'h061; //TAB 9'h00e: keymac[8:0] <= 9'h065; //~ (`) 9'h00f: keymac[8:0] <= 9'h07b; 9'h010: keymac[8:0] <= 9'h07b; 9'h011: keymac[8:0] <= 9'h075; //LEFT ALT (option) 9'h012: keymac[8:0] <= 9'h071; //LEFT SHIFT 9'h013: keymac[8:0] <= 9'h07b; 9'h014: keymac[8:0] <= 9'h06f; //CTRL (command) 9'h015: keymac[8:0] <= 9'h019; //q 9'h016: keymac[8:0] <= 9'h025; //1 9'h017: keymac[8:0] <= 9'h07b; 9'h018: keymac[8:0] <= 9'h07b; 9'h019: keymac[8:0] <= 9'h07b; 9'h01a: keymac[8:0] <= 9'h00d; //z 9'h01b: keymac[8:0] <= 9'h003; //s 9'h01c: keymac[8:0] <= 9'h001; //a 9'h01d: keymac[8:0] <= 9'h01b; //w 9'h01e: keymac[8:0] <= 9'h027; //2 9'h01f: keymac[8:0] <= 9'h07b; 9'h020: keymac[8:0] <= 9'h07b; 9'h021: keymac[8:0] <= 9'h011; //c 9'h022: keymac[8:0] <= 9'h00f; //x 9'h023: keymac[8:0] <= 9'h005; //d 9'h024: keymac[8:0] <= 9'h01d; //e 9'h025: keymac[8:0] <= 9'h02b; //4 9'h026: keymac[8:0] <= 9'h029; //3 9'h027: keymac[8:0] <= 9'h07b; 9'h028: keymac[8:0] <= 9'h07b; 9'h029: keymac[8:0] <= 9'h063; //SPACE 9'h02a: keymac[8:0] <= 9'h013; //v 9'h02b: keymac[8:0] <= 9'h007; //f 9'h02c: keymac[8:0] <= 9'h023; //t 9'h02d: keymac[8:0] <= 9'h01f; //r 9'h02e: keymac[8:0] <= 9'h02f; //5 9'h02f: keymac[8:0] <= 9'h07b; 9'h030: keymac[8:0] <= 9'h07b; 9'h031: keymac[8:0] <= 9'h05b; //n 9'h032: keymac[8:0] <= 9'h017; //b 9'h033: keymac[8:0] <= 9'h009; //h 9'h034: keymac[8:0] <= 9'h00b; //g 9'h035: keymac[8:0] <= 9'h021; //y 9'h036: keymac[8:0] <= 9'h02d; //6 9'h037: keymac[8:0] <= 9'h07b; 9'h038: keymac[8:0] <= 9'h07b; 9'h039: keymac[8:0] <= 9'h07b; 9'h03a: keymac[8:0] <= 9'h05d; //m 9'h03b: keymac[8:0] <= 9'h04d; //j 9'h03c: keymac[8:0] <= 9'h041; //u 9'h03d: keymac[8:0] <= 9'h035; //7 9'h03e: keymac[8:0] <= 9'h039; //8 9'h03f: keymac[8:0] <= 9'h07b; 9'h040: keymac[8:0] <= 9'h07b; 9'h041: keymac[8:0] <= 9'h057; //<, 9'h042: keymac[8:0] <= 9'h051; //k 9'h043: keymac[8:0] <= 9'h045; //i 9'h044: keymac[8:0] <= 9'h03f; //o 9'h045: keymac[8:0] <= 9'h03b; //0 9'h046: keymac[8:0] <= 9'h033; //9 9'h047: keymac[8:0] <= 9'h07b; 9'h048: keymac[8:0] <= 9'h07b; 9'h049: keymac[8:0] <= 9'h05f; //>. 9'h04a: keymac[8:0] <= 9'h059; //FORWARD SLASH 9'h04b: keymac[8:0] <= 9'h04b; //l 9'h04c: keymac[8:0] <= 9'h053; //; 9'h04d: keymac[8:0] <= 9'h047; //p 9'h04e: keymac[8:0] <= 9'h037; //- 9'h04f: keymac[8:0] <= 9'h07b; 9'h050: keymac[8:0] <= 9'h07b; 9'h051: keymac[8:0] <= 9'h07b; 9'h052: keymac[8:0] <= 9'h04f; //'" 9'h053: keymac[8:0] <= 9'h07b; 9'h054: keymac[8:0] <= 9'h043; //[ 9'h055: keymac[8:0] <= 9'h031; // = 9'h056: keymac[8:0] <= 9'h07b; 9'h057: keymac[8:0] <= 9'h07b; 9'h058: keymac[8:0] <= 9'h073; //CAPSLOCK 9'h059: keymac[8:0] <= 9'h071; //RIGHT SHIFT 9'h05a: keymac[8:0] <= 9'h049; //ENTER 9'h05b: keymac[8:0] <= 9'h03d; //] 9'h05c: keymac[8:0] <= 9'h07b; 9'h05d: keymac[8:0] <= 9'h055; //BACKSLASH 9'h05e: keymac[8:0] <= 9'h07b; 9'h05f: keymac[8:0] <= 9'h07b; 9'h060: keymac[8:0] <= 9'h07b; 9'h061: keymac[8:0] <= 9'h071; //international left shift cut out (German '<>' key), 0x56 Set#1 code 9'h062: keymac[8:0] <= 9'h07b; 9'h063: keymac[8:0] <= 9'h07b; 9'h064: keymac[8:0] <= 9'h07b; 9'h065: keymac[8:0] <= 9'h07b; 9'h066: keymac[8:0] <= 9'h067; //BACKSPACE 9'h067: keymac[8:0] <= 9'h07b; 9'h068: keymac[8:0] <= 9'h07b; 9'h069: keymac[8:0] <= 9'h127; //KP 1 9'h06a: keymac[8:0] <= 9'h07b; 9'h06b: keymac[8:0] <= 9'h12d; //KP 4 9'h06c: keymac[8:0] <= 9'h133; //KP 7 9'h06d: keymac[8:0] <= 9'h07b; 9'h06e: keymac[8:0] <= 9'h07b; 9'h06f: keymac[8:0] <= 9'h07b; 9'h070: keymac[8:0] <= 9'h125; //KP 0 9'h071: keymac[8:0] <= 9'h103; //KP . 9'h072: keymac[8:0] <= 9'h129; //KP 2 9'h073: keymac[8:0] <= 9'h12f; //KP 5 9'h074: keymac[8:0] <= 9'h131; //KP 6 9'h075: keymac[8:0] <= 9'h137; //KP 8 9'h076: keymac[8:0] <= 9'b000; //ESCAPE 9'h077: keymac[8:0] <= 9'h07b; //NUMLOCK 9'h078: keymac[8:0] <= 9'h07b; //F11 9'h079: keymac[8:0] <= 9'h07b; //KP + 9'h07a: keymac[8:0] <= 9'h12b; //KP 3 9'h07b: keymac[8:0] <= 9'h11d; //KP - 9'h07c: keymac[8:0] <= 9'h07b; //KP * 9'h07d: keymac[8:0] <= 9'h139; //KP 9 9'h07e: keymac[8:0] <= 9'h07b; //SCROLL LOCK / KP ) 9'h07f: keymac[8:0] <= 9'h07b; 9'h080: keymac[8:0] <= 9'h07b; 9'h081: keymac[8:0] <= 9'h07b; 9'h082: keymac[8:0] <= 9'h07b; 9'h083: keymac[8:0] <= 9'h07b; //F7 9'h084: keymac[8:0] <= 9'h07b; 9'h085: keymac[8:0] <= 9'h07b; 9'h086: keymac[8:0] <= 9'h07b; 9'h087: keymac[8:0] <= 9'h07b; 9'h088: keymac[8:0] <= 9'h07b; 9'h089: keymac[8:0] <= 9'h07b; 9'h08a: keymac[8:0] <= 9'h07b; 9'h08b: keymac[8:0] <= 9'h07b; 9'h08c: keymac[8:0] <= 9'h07b; 9'h08d: keymac[8:0] <= 9'h07b; 9'h08e: keymac[8:0] <= 9'h07b; 9'h08f: keymac[8:0] <= 9'h07b; 9'h090: keymac[8:0] <= 9'h07b; 9'h091: keymac[8:0] <= 9'h07b; 9'h092: keymac[8:0] <= 9'h07b; 9'h093: keymac[8:0] <= 9'h07b; 9'h094: keymac[8:0] <= 9'h07b; 9'h095: keymac[8:0] <= 9'h07b; 9'h096: keymac[8:0] <= 9'h07b; 9'h097: keymac[8:0] <= 9'h07b; 9'h098: keymac[8:0] <= 9'h07b; 9'h099: keymac[8:0] <= 9'h07b; 9'h09a: keymac[8:0] <= 9'h07b; 9'h09b: keymac[8:0] <= 9'h07b; 9'h09c: keymac[8:0] <= 9'h07b; 9'h09d: keymac[8:0] <= 9'h07b; 9'h09e: keymac[8:0] <= 9'h07b; 9'h09f: keymac[8:0] <= 9'h07b; 9'h0a0: keymac[8:0] <= 9'h07b; 9'h0a1: keymac[8:0] <= 9'h07b; 9'h0a2: keymac[8:0] <= 9'h07b; 9'h0a3: keymac[8:0] <= 9'h07b; 9'h0a4: keymac[8:0] <= 9'h07b; 9'h0a5: keymac[8:0] <= 9'h07b; 9'h0a6: keymac[8:0] <= 9'h07b; 9'h0a7: keymac[8:0] <= 9'h07b; 9'h0a8: keymac[8:0] <= 9'h07b; 9'h0a9: keymac[8:0] <= 9'h07b; 9'h0aa: keymac[8:0] <= 9'h07b; 9'h0ab: keymac[8:0] <= 9'h07b; 9'h0ac: keymac[8:0] <= 9'h07b; 9'h0ad: keymac[8:0] <= 9'h07b; 9'h0ae: keymac[8:0] <= 9'h07b; 9'h0af: keymac[8:0] <= 9'h07b; 9'h0b0: keymac[8:0] <= 9'h07b; 9'h0b1: keymac[8:0] <= 9'h07b; 9'h0b2: keymac[8:0] <= 9'h07b; 9'h0b3: keymac[8:0] <= 9'h07b; 9'h0b4: keymac[8:0] <= 9'h07b; 9'h0b5: keymac[8:0] <= 9'h07b; 9'h0b6: keymac[8:0] <= 9'h07b; 9'h0b7: keymac[8:0] <= 9'h07b; 9'h0b8: keymac[8:0] <= 9'h07b; 9'h0b9: keymac[8:0] <= 9'h07b; 9'h0ba: keymac[8:0] <= 9'h07b; 9'h0bb: keymac[8:0] <= 9'h07b; 9'h0bc: keymac[8:0] <= 9'h07b; 9'h0bd: keymac[8:0] <= 9'h07b; 9'h0be: keymac[8:0] <= 9'h07b; 9'h0bf: keymac[8:0] <= 9'h07b; 9'h0c0: keymac[8:0] <= 9'h07b; 9'h0c1: keymac[8:0] <= 9'h07b; 9'h0c2: keymac[8:0] <= 9'h07b; 9'h0c3: keymac[8:0] <= 9'h07b; 9'h0c4: keymac[8:0] <= 9'h07b; 9'h0c5: keymac[8:0] <= 9'h07b; 9'h0c6: keymac[8:0] <= 9'h07b; 9'h0c7: keymac[8:0] <= 9'h07b; 9'h0c8: keymac[8:0] <= 9'h07b; 9'h0c9: keymac[8:0] <= 9'h07b; 9'h0ca: keymac[8:0] <= 9'h07b; 9'h0cb: keymac[8:0] <= 9'h07b; 9'h0cc: keymac[8:0] <= 9'h07b; 9'h0cd: keymac[8:0] <= 9'h07b; 9'h0ce: keymac[8:0] <= 9'h07b; 9'h0cf: keymac[8:0] <= 9'h07b; 9'h0d0: keymac[8:0] <= 9'h07b; 9'h0d1: keymac[8:0] <= 9'h07b; 9'h0d2: keymac[8:0] <= 9'h07b; 9'h0d3: keymac[8:0] <= 9'h07b; 9'h0d4: keymac[8:0] <= 9'h07b; 9'h0d5: keymac[8:0] <= 9'h07b; 9'h0d6: keymac[8:0] <= 9'h07b; 9'h0d7: keymac[8:0] <= 9'h07b; 9'h0d8: keymac[8:0] <= 9'h07b; 9'h0d9: keymac[8:0] <= 9'h07b; 9'h0da: keymac[8:0] <= 9'h07b; 9'h0db: keymac[8:0] <= 9'h07b; 9'h0dc: keymac[8:0] <= 9'h07b; 9'h0dd: keymac[8:0] <= 9'h07b; 9'h0de: keymac[8:0] <= 9'h07b; 9'h0df: keymac[8:0] <= 9'h07b; 9'h0e0: keymac[8:0] <= 9'h07b; //ps2 extended key 9'h0e1: keymac[8:0] <= 9'h07b; 9'h0e2: keymac[8:0] <= 9'h07b; 9'h0e3: keymac[8:0] <= 9'h07b; 9'h0e4: keymac[8:0] <= 9'h07b; 9'h0e5: keymac[8:0] <= 9'h07b; 9'h0e6: keymac[8:0] <= 9'h07b; 9'h0e7: keymac[8:0] <= 9'h07b; 9'h0e8: keymac[8:0] <= 9'h07b; 9'h0e9: keymac[8:0] <= 9'h07b; 9'h0ea: keymac[8:0] <= 9'h07b; 9'h0eb: keymac[8:0] <= 9'h07b; 9'h0ec: keymac[8:0] <= 9'h07b; 9'h0ed: keymac[8:0] <= 9'h07b; 9'h0ee: keymac[8:0] <= 9'h07b; 9'h0ef: keymac[8:0] <= 9'h07b; 9'h0f0: keymac[8:0] <= 9'h07b; //ps2 release code 9'h0f1: keymac[8:0] <= 9'h07b; 9'h0f2: keymac[8:0] <= 9'h07b; 9'h0f3: keymac[8:0] <= 9'h07b; 9'h0f4: keymac[8:0] <= 9'h07b; 9'h0f5: keymac[8:0] <= 9'h07b; 9'h0f6: keymac[8:0] <= 9'h07b; 9'h0f7: keymac[8:0] <= 9'h07b; 9'h0f8: keymac[8:0] <= 9'h07b; 9'h0f9: keymac[8:0] <= 9'h07b; 9'h0fa: keymac[8:0] <= 9'h07b; //ps2 ack code 9'h0fb: keymac[8:0] <= 9'h07b; 9'h0fc: keymac[8:0] <= 9'h07b; 9'h0fd: keymac[8:0] <= 9'h07b; 9'h0fe: keymac[8:0] <= 9'h07b; 9'h0ff: keymac[8:0] <= 9'h07b; 9'h100: keymac[8:0] <= 9'h07b; 9'h101: keymac[8:0] <= 9'h07b; 9'h102: keymac[8:0] <= 9'h07b; 9'h103: keymac[8:0] <= 9'h07b; 9'h104: keymac[8:0] <= 9'h07b; 9'h105: keymac[8:0] <= 9'h07b; 9'h106: keymac[8:0] <= 9'h07b; 9'h107: keymac[8:0] <= 9'h07b; 9'h108: keymac[8:0] <= 9'h07b; 9'h109: keymac[8:0] <= 9'h07b; 9'h10a: keymac[8:0] <= 9'h07b; 9'h10b: keymac[8:0] <= 9'h07b; 9'h10c: keymac[8:0] <= 9'h07b; 9'h10d: keymac[8:0] <= 9'h07b; 9'h10e: keymac[8:0] <= 9'h07b; 9'h10f: keymac[8:0] <= 9'h07b; 9'h110: keymac[8:0] <= 9'h07b; 9'h111: keymac[8:0] <= 9'h075; //RIGHT ALT 9'h112: keymac[8:0] <= 9'h07b; 9'h113: keymac[8:0] <= 9'h07b; 9'h114: keymac[8:0] <= 9'h07b; 9'h115: keymac[8:0] <= 9'h07b; 9'h116: keymac[8:0] <= 9'h07b; 9'h117: keymac[8:0] <= 9'h07b; 9'h118: keymac[8:0] <= 9'h07b; 9'h119: keymac[8:0] <= 9'h07b; 9'h11a: keymac[8:0] <= 9'h07b; 9'h11b: keymac[8:0] <= 9'h07b; 9'h11c: keymac[8:0] <= 9'h07b; 9'h11d: keymac[8:0] <= 9'h07b; 9'h11e: keymac[8:0] <= 9'h07b; 9'h11f: keymac[8:0] <= 9'h06f; //LEFT COMMAND (LEFT GUI) 9'h120: keymac[8:0] <= 9'h07b; 9'h121: keymac[8:0] <= 9'h07b; 9'h122: keymac[8:0] <= 9'h07b; 9'h123: keymac[8:0] <= 9'h07b; 9'h124: keymac[8:0] <= 9'h07b; 9'h125: keymac[8:0] <= 9'h07b; 9'h126: keymac[8:0] <= 9'h07b; 9'h127: keymac[8:0] <= 9'h06f; //RIGHT AMIGA (RIGHT GUI) 9'h128: keymac[8:0] <= 9'h07b; 9'h129: keymac[8:0] <= 9'h07b; 9'h12a: keymac[8:0] <= 9'h07b; 9'h12b: keymac[8:0] <= 9'h07b; 9'h12c: keymac[8:0] <= 9'h07b; 9'h12d: keymac[8:0] <= 9'h07b; 9'h12e: keymac[8:0] <= 9'h07b; 9'h12f: keymac[8:0] <= 9'h06f; //RIGHT AMIGA (APPS) 9'h130: keymac[8:0] <= 9'h07b; 9'h131: keymac[8:0] <= 9'h07b; 9'h132: keymac[8:0] <= 9'h07b; 9'h133: keymac[8:0] <= 9'h07b; 9'h134: keymac[8:0] <= 9'h07b; 9'h135: keymac[8:0] <= 9'h07b; 9'h136: keymac[8:0] <= 9'h07b; 9'h137: keymac[8:0] <= 9'h07b; 9'h138: keymac[8:0] <= 9'h07b; 9'h139: keymac[8:0] <= 9'h07b; 9'h13a: keymac[8:0] <= 9'h07b; 9'h13b: keymac[8:0] <= 9'h07b; 9'h13c: keymac[8:0] <= 9'h07b; 9'h13d: keymac[8:0] <= 9'h07b; 9'h13e: keymac[8:0] <= 9'h07b; 9'h13f: keymac[8:0] <= 9'h07b; 9'h140: keymac[8:0] <= 9'h07b; 9'h141: keymac[8:0] <= 9'h07b; 9'h142: keymac[8:0] <= 9'h07b; 9'h143: keymac[8:0] <= 9'h07b; 9'h144: keymac[8:0] <= 9'h07b; 9'h145: keymac[8:0] <= 9'h07b; 9'h146: keymac[8:0] <= 9'h07b; 9'h147: keymac[8:0] <= 9'h07b; 9'h148: keymac[8:0] <= 9'h07b; 9'h149: keymac[8:0] <= 9'h07b; 9'h14a: keymac[8:0] <= 9'h07b; //KP / 9'h14b: keymac[8:0] <= 9'h07b; 9'h14c: keymac[8:0] <= 9'h07b; 9'h14d: keymac[8:0] <= 9'h07b; 9'h14e: keymac[8:0] <= 9'h07b; 9'h14f: keymac[8:0] <= 9'h07b; 9'h150: keymac[8:0] <= 9'h07b; 9'h151: keymac[8:0] <= 9'h07b; 9'h152: keymac[8:0] <= 9'h07b; 9'h153: keymac[8:0] <= 9'h07b; 9'h154: keymac[8:0] <= 9'h07b; 9'h155: keymac[8:0] <= 9'h07b; 9'h156: keymac[8:0] <= 9'h07b; 9'h157: keymac[8:0] <= 9'h07b; 9'h158: keymac[8:0] <= 9'h07b; 9'h159: keymac[8:0] <= 9'h07b; 9'h15a: keymac[8:0] <= 9'h119; //KP ENTER 9'h15b: keymac[8:0] <= 9'h07b; 9'h15c: keymac[8:0] <= 9'h07b; 9'h15d: keymac[8:0] <= 9'h07b; 9'h15e: keymac[8:0] <= 9'h07b; 9'h15f: keymac[8:0] <= 9'h07b; 9'h160: keymac[8:0] <= 9'h07b; 9'h161: keymac[8:0] <= 9'h07b; 9'h162: keymac[8:0] <= 9'h07b; 9'h163: keymac[8:0] <= 9'h07b; 9'h164: keymac[8:0] <= 9'h07b; 9'h165: keymac[8:0] <= 9'h07b; 9'h166: keymac[8:0] <= 9'h07b; 9'h167: keymac[8:0] <= 9'h07b; 9'h168: keymac[8:0] <= 9'h07b; 9'h169: keymac[8:0] <= 9'h07b; //END 9'h16a: keymac[8:0] <= 9'h07b; 9'h16b: keymac[8:0] <= 9'h10d; //ARROW LEFT 9'h16c: keymac[8:0] <= 9'h07b; //HOME 9'h16d: keymac[8:0] <= 9'h07b; 9'h16e: keymac[8:0] <= 9'h07b; 9'h16f: keymac[8:0] <= 9'h07b; 9'h170: keymac[8:0] <= 9'h07b; //INSERT = HELP 9'h171: keymac[8:0] <= 9'h10f; //DELETE 9'h172: keymac[8:0] <= 9'h111; //ARROW DOWN 9'h173: keymac[8:0] <= 9'h07b; 9'h174: keymac[8:0] <= 9'h105; //ARROW RIGHT 9'h175: keymac[8:0] <= 9'h10b; //ARROW UP 9'h176: keymac[8:0] <= 9'h07b; 9'h177: keymac[8:0] <= 9'h07b; 9'h178: keymac[8:0] <= 9'h07b; 9'h179: keymac[8:0] <= 9'h07b; 9'h17a: keymac[8:0] <= 9'h07b; //PGDN 9'h17b: keymac[8:0] <= 9'h07b; 9'h17c: keymac[8:0] <= 9'h07b; //PRTSCR 9'h17d: keymac[8:0] <= 9'h07b; //PGUP 9'h17e: keymac[8:0] <= 9'h07b; //ctrl+break 9'h17f: keymac[8:0] <= 9'h07b; 9'h180: keymac[8:0] <= 9'h07b; 9'h181: keymac[8:0] <= 9'h07b; 9'h182: keymac[8:0] <= 9'h07b; 9'h183: keymac[8:0] <= 9'h07b; 9'h184: keymac[8:0] <= 9'h07b; 9'h185: keymac[8:0] <= 9'h07b; 9'h186: keymac[8:0] <= 9'h07b; 9'h187: keymac[8:0] <= 9'h07b; 9'h188: keymac[8:0] <= 9'h07b; 9'h189: keymac[8:0] <= 9'h07b; 9'h18a: keymac[8:0] <= 9'h07b; 9'h18b: keymac[8:0] <= 9'h07b; 9'h18c: keymac[8:0] <= 9'h07b; 9'h18d: keymac[8:0] <= 9'h07b; 9'h18e: keymac[8:0] <= 9'h07b; 9'h18f: keymac[8:0] <= 9'h07b; 9'h190: keymac[8:0] <= 9'h07b; 9'h191: keymac[8:0] <= 9'h07b; 9'h192: keymac[8:0] <= 9'h07b; 9'h193: keymac[8:0] <= 9'h07b; 9'h194: keymac[8:0] <= 9'h07b; 9'h195: keymac[8:0] <= 9'h07b; 9'h196: keymac[8:0] <= 9'h07b; 9'h197: keymac[8:0] <= 9'h07b; 9'h198: keymac[8:0] <= 9'h07b; 9'h199: keymac[8:0] <= 9'h07b; 9'h19a: keymac[8:0] <= 9'h07b; 9'h19b: keymac[8:0] <= 9'h07b; 9'h19c: keymac[8:0] <= 9'h07b; 9'h19d: keymac[8:0] <= 9'h07b; 9'h19e: keymac[8:0] <= 9'h07b; 9'h19f: keymac[8:0] <= 9'h07b; 9'h1a0: keymac[8:0] <= 9'h07b; 9'h1a1: keymac[8:0] <= 9'h07b; 9'h1a2: keymac[8:0] <= 9'h07b; 9'h1a3: keymac[8:0] <= 9'h07b; 9'h1a4: keymac[8:0] <= 9'h07b; 9'h1a5: keymac[8:0] <= 9'h07b; 9'h1a6: keymac[8:0] <= 9'h07b; 9'h1a7: keymac[8:0] <= 9'h07b; 9'h1a8: keymac[8:0] <= 9'h07b; 9'h1a9: keymac[8:0] <= 9'h07b; 9'h1aa: keymac[8:0] <= 9'h07b; 9'h1ab: keymac[8:0] <= 9'h07b; 9'h1ac: keymac[8:0] <= 9'h07b; 9'h1ad: keymac[8:0] <= 9'h07b; 9'h1ae: keymac[8:0] <= 9'h07b; 9'h1af: keymac[8:0] <= 9'h07b; 9'h1b0: keymac[8:0] <= 9'h07b; 9'h1b1: keymac[8:0] <= 9'h07b; 9'h1b2: keymac[8:0] <= 9'h07b; 9'h1b3: keymac[8:0] <= 9'h07b; 9'h1b4: keymac[8:0] <= 9'h07b; 9'h1b5: keymac[8:0] <= 9'h07b; 9'h1b6: keymac[8:0] <= 9'h07b; 9'h1b7: keymac[8:0] <= 9'h07b; 9'h1b8: keymac[8:0] <= 9'h07b; 9'h1b9: keymac[8:0] <= 9'h07b; 9'h1ba: keymac[8:0] <= 9'h07b; 9'h1bb: keymac[8:0] <= 9'h07b; 9'h1bc: keymac[8:0] <= 9'h07b; 9'h1bd: keymac[8:0] <= 9'h07b; 9'h1be: keymac[8:0] <= 9'h07b; 9'h1bf: keymac[8:0] <= 9'h07b; 9'h1c0: keymac[8:0] <= 9'h07b; 9'h1c1: keymac[8:0] <= 9'h07b; 9'h1c2: keymac[8:0] <= 9'h07b; 9'h1c3: keymac[8:0] <= 9'h07b; 9'h1c4: keymac[8:0] <= 9'h07b; 9'h1c5: keymac[8:0] <= 9'h07b; 9'h1c6: keymac[8:0] <= 9'h07b; 9'h1c7: keymac[8:0] <= 9'h07b; 9'h1c8: keymac[8:0] <= 9'h07b; 9'h1c9: keymac[8:0] <= 9'h07b; 9'h1ca: keymac[8:0] <= 9'h07b; 9'h1cb: keymac[8:0] <= 9'h07b; 9'h1cc: keymac[8:0] <= 9'h07b; 9'h1cd: keymac[8:0] <= 9'h07b; 9'h1ce: keymac[8:0] <= 9'h07b; 9'h1cf: keymac[8:0] <= 9'h07b; 9'h1d0: keymac[8:0] <= 9'h07b; 9'h1d1: keymac[8:0] <= 9'h07b; 9'h1d2: keymac[8:0] <= 9'h07b; 9'h1d3: keymac[8:0] <= 9'h07b; 9'h1d4: keymac[8:0] <= 9'h07b; 9'h1d5: keymac[8:0] <= 9'h07b; 9'h1d6: keymac[8:0] <= 9'h07b; 9'h1d7: keymac[8:0] <= 9'h07b; 9'h1d8: keymac[8:0] <= 9'h07b; 9'h1d9: keymac[8:0] <= 9'h07b; 9'h1da: keymac[8:0] <= 9'h07b; 9'h1db: keymac[8:0] <= 9'h07b; 9'h1dc: keymac[8:0] <= 9'h07b; 9'h1dd: keymac[8:0] <= 9'h07b; 9'h1de: keymac[8:0] <= 9'h07b; 9'h1df: keymac[8:0] <= 9'h07b; 9'h1e0: keymac[8:0] <= 9'h07b; //ps2 extended key(duplicate, see $e0) 9'h1e1: keymac[8:0] <= 9'h07b; 9'h1e2: keymac[8:0] <= 9'h07b; 9'h1e3: keymac[8:0] <= 9'h07b; 9'h1e4: keymac[8:0] <= 9'h07b; 9'h1e5: keymac[8:0] <= 9'h07b; 9'h1e6: keymac[8:0] <= 9'h07b; 9'h1e7: keymac[8:0] <= 9'h07b; 9'h1e8: keymac[8:0] <= 9'h07b; 9'h1e9: keymac[8:0] <= 9'h07b; 9'h1ea: keymac[8:0] <= 9'h07b; 9'h1eb: keymac[8:0] <= 9'h07b; 9'h1ec: keymac[8:0] <= 9'h07b; 9'h1ed: keymac[8:0] <= 9'h07b; 9'h1ee: keymac[8:0] <= 9'h07b; 9'h1ef: keymac[8:0] <= 9'h07b; 9'h1f0: keymac[8:0] <= 9'h07b; //ps2 release code(duplicate, see $f0) 9'h1f1: keymac[8:0] <= 9'h07b; 9'h1f2: keymac[8:0] <= 9'h07b; 9'h1f3: keymac[8:0] <= 9'h07b; 9'h1f4: keymac[8:0] <= 9'h07b; 9'h1f5: keymac[8:0] <= 9'h07b; 9'h1f6: keymac[8:0] <= 9'h07b; 9'h1f7: keymac[8:0] <= 9'h07b; 9'h1f8: keymac[8:0] <= 9'h07b; 9'h1f9: keymac[8:0] <= 9'h07b; 9'h1fa: keymac[8:0] <= 9'h07b; //ps2 ack code(duplicate see $fa) 9'h1fb: keymac[8:0] <= 9'h07b; 9'h1fc: keymac[8:0] <= 9'h07b; 9'h1fd: keymac[8:0] <= 9'h07b; 9'h1fe: keymac[8:0] <= 9'h07b; 9'h1ff: keymac[8:0] <= 9'h07b; endcase // case ({extended,ps2key[7:0]}) keymac[7] <= keybreak; end /* Some debug signals for my own sanity */ always@(posedge sysclk or posedge reset) begin if (reset) debug <= 0; else begin if (istrobe) debug[15:8] <= ibyte; debug[7:0] <= { ps2clk, ps2dat, dbg_lowstate, 2'b0, state }; end end endmodule