// Copyright 2006, 2007 Dennis van Weeren // // This file is part of Minimig // // Minimig is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // Minimig is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // // // This is the Minimig PS/2 keyboard handler // // 19-11-2006 -started coding // 20-11-2006 -more coding // 21-11-2006 -finished PS/2 state machine, added keymap // 29-11-2006 -keymap is now blockram, saves almost 80 slices! // 04-12-2006 -added keyack signal // 05-12-2006 -more work; cleaning up, optimizing // -added on-screen-display control // 01-01-2007 -added extra key for on-screen-display control // 11-02-2007 -reset is now ctrl-alt-alt (as in Amiga OS4) instead of ctrl-lgui-rgui // this is the ps2 keyboard module itself // every time a new key is decoded, keystrobe is asserted. // keydat is only valid when keystrobe is asserted // after keystrobe, keyboard controller waits for keyack or timeout // kbdrst is asserted when the control, left gui and right gui keys are hold down together // leda and ledb control the numlock and scrolllock leds module ps2keyboard(clk,reset,ps2kdat,ps2kclk,leda,ledb,kbdrst,keydat,keystrobe,keyack,osdctrl); input clk; //bus clock input reset; //reset (system reset in) inout ps2kdat; //keyboard PS/2 data inout ps2kclk; //keyboard PS/2 clk input leda; //keyboard led a in input ledb; //keyboard led b in output kbdrst; //keyboard reset out output [7:0]keydat; //keyboard data out output keystrobe; //keyboard data out strobe input keyack; //keyboard data out acknowledge output [3:0]osdctrl; //on-screen-display controll //local signals reg keystrobe; //see above reg pclkout; //ps2 clk out wire pdatout; //ps2 data out wire pclkneg; //negative edge of ps2 clock strobe reg pdatb,pclkb,pclkc; //input synchronization reg [11:0]preceive; //ps2 receive register reg [11:0]psend; //ps2 send register reg [19:0]ptimer; //ps2 timer reg [2:0]kstate; //keyboard controller current state reg [2:0]knext; //keyboard controller next state reg capslock; //capslock status reg prreset; //ps2 receive reset wire prbusy; //ps2 receive busy reg ptreset; //ps2 reset timer wire pto1; //ps2 timer timeout 1 wire pto2; //ps2 timer timeout 2 reg psled1; //ps2 send led code 1 reg psled2; //ps2 send led code 2 wire psready; //ps2 send ready wire valid; //valid amiga key code at keymap output //bidirectional open collector IO buffers assign ps2kclk=(pclkout)?1'bz:1'b0; assign ps2kdat=(pdatout)?1'bz:1'b0; //input synchronization of external signals always @(posedge clk) begin pdatb<=ps2kdat; pclkb<=ps2kclk; pclkc<=pclkb; end //detect ps2 clock negative edge assign pclkneg=pclkc&(~pclkb); //PS2 input shifter wire prready; always @(posedge clk) if(prreset||prready) preceive[11:0]<=12'b111111111111; else if(pclkneg) preceive[11:0]<={1'b0,pdatb,preceive[10:1]}; assign prready=~preceive[0]; assign prbusy=~preceive[11]; //PS2 timer always @(posedge clk) if(ptreset) ptimer[19:0]<=0; else if(!pto2) ptimer[19:0]<=ptimer[19:0]+1; assign pto1=ptimer[15];//4.6ms @ 7.09Mhz assign pto2=ptimer[19];//74ms @ 7.09Mhz //PS2 send shifter always @(posedge clk) if(psled1) psend[11:0]<=12'b111111011010;//$ED else if(psled2) psend[11:0]<={2'b11,~(capslock^leda^ledb),5'b00000,capslock,leda,ledb,1'b0};//led status else if(!psready && pclkneg) psend[11:0]<={1'b0,psend[11:1]}; assign psready=(psend[11:0]==12'b000000000001)?1:0; assign pdatout=psend[0]; //keyboard state machine always @(posedge clk) if(reset)//master reset kstate<=0; else kstate<=knext; always @(kstate or pto2 or psready or prready or prbusy or keystrobe or keyack) begin case(kstate) 0://reset timer begin prreset=1; ptreset=1; pclkout=0; psled1=0; psled2=0; knext=1; end 1://"request-to-send" for led2 code begin prreset=1; ptreset=0; pclkout=0; psled1=0; psled2=1; if(pto2) knext=2; else knext=1; end 2://wait for led2 code to be sent and acknowledge received begin prreset=~psready; ptreset=1; pclkout=1; psled1=0; psled2=0; if(prready) knext=3; else knext=2; end 3://wait for valid amiga key code begin prreset=0; ptreset=keystrobe; pclkout=1; psled1=0; psled2=0; if(keystrobe)//valid amiga key decoded knext=6; else if(!prbusy && pto2)//timeout, update leds knext=0; else//stay here knext=3; end 6://hold of ps2 keyboard and wait for keyack or timeout begin prreset=0; ptreset=keyack; pclkout=0; psled1=0; psled2=0; if(keyack || pto2)//keyack or timeout knext=5; else//stay here knext=6; end default://we should never come here begin prreset=0;//ps2 receiver reset ptreset=0;//ps2 timer reset pclkout=1;//ps2 clock override psled1=0;//ps2 send led code 1 psled2=0;//ps2 send led code 2 knext=0;//go to reset state end endcase end //instantiate keymap to convert ps2 scan codes to amiga raw key codes wire ctrl,aleft,aright,caps; ps2keyboardmap km1( .clk(clk), .reset(reset), .enable(prready), .ps2key(preceive[8:1]), .valid(valid), .akey(keydat[7:0]), .ctrl(ctrl), .aleft(aleft), .aright(aright), .caps(caps), .osdctrl(osdctrl) ); //Duplicate key filter and caps lock handling. //A ps/2 keyboard has a future called "typematic". //This means that the last key downstroke event //is repeated (at approx 2Hz default). //An Amiga keyboard does not do this so this filter removes //all duplicate downstroke events: //When a duplicate downstroke event is detected, keystrobe is not asserted. //When the event is unique (no duplicate), keystrobe is asserted when valid is asserted. // //Capslock on amiga is "remembered" by keyboard. A ps/2 keyboard doesn't do this //therefore, amiga-like caps lock behaviour is simulated here wire keyequal; reg [7:0]keydat2; assign keyequal=(keydat2[6:0]==keydat[6:0])?1:0;//detect if latched key equals new key //latch last key downstroke event always @(posedge clk) if(reset) keydat2[7:0]<=0; else if(valid && !keydat[7])//latch downstroke event for last key pressed keydat2[7:0]<=keydat[7:0]; else if (valid && keydat[7] && keyequal)//upstroke event for latched key received keydat2[7:0]<=keydat[7:0]; //toggle capslock status on capslock downstroke event always @(posedge clk) if(reset) capslock<=0; else if(valid && !keydat[7] && caps && !(keyequal && (keydat[7]==keydat2[7]))) capslock<=~capslock; //generate keystrobe to indicate valid keycode //assign keystrobe=(keyequal && (keydat[7]==keydatlatch[7]))?0:keyok; always @(capslock or caps or keyequal or keydat or keydat2 or valid) if(capslock && caps)//filter out capslock downstroke && capslock upstroke events if capslock is set keystrobe=0; else if(keyequal && (keydat[7]==keydat2[7]))//filter out duplicate events keystrobe=0; else if(valid)//valid amiga keycode, assert strobe keystrobe=1; else keystrobe=0; //Keyboard reset detector. //Reset is accomplished by holding down the //ctrl, left alt en right alt keys all at the same time reg [2:0]kbdrststatus; always @(posedge clk) begin //latch status of control key if(reset) kbdrststatus[2]<=1; else if (valid && ctrl) kbdrststatus[2]<=keydat[7]; //latch status of left alt key if(reset) kbdrststatus[1]<=1; else if (valid && aleft) kbdrststatus[1]<=keydat[7]; //latch status of right alt key if(reset) kbdrststatus[0]<=1; else if (valid && aright) kbdrststatus[0]<=keydat[7]; end assign kbdrst=~(kbdrststatus[2]|kbdrststatus[1]|kbdrststatus[0]);//reset if all 3 keys down endmodule //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- //ps2 key to amiga key mapper using blockram //this module also handles the osdctrl signals module ps2keyboardmap(clk,reset,enable,ps2key,valid,akey,ctrl,aleft,aright,caps,osdctrl); input clk; //clock input reset; //reset input enable; //enable input [7:0]ps2key; //ps2 key code input output valid; //amiga key code valid (strobed when new valid keycode at output) output [7:0]akey; //amiga key code output output ctrl; //amiga control key output aleft; //amiga left alt key output aright; //amiga right alt key output caps; //amiga capslock key output [3:0]osdctrl; //osd menu control //local signals reg [3:0]osdctrl; //see above reg [15:0]keyrom; //rom output reg enable2; //enable signal delayed by one clock reg upstroke; //upstroke key status reg extended; //extended key status //generate delayed enable signal (needed because of blockram pipelining) always @(posedge clk) enable2<=enable; //latch special ps2 keycodes //keyrom[7] is used together with [0], [1] and [2] for ps2 special codes decoding //these are needed for complete decoding of the ps2 codes always @(posedge clk) if(reset)//reset begin upstroke<=0; extended<=0; end else if(enable2 && keyrom[7] && keyrom[0])//extended key identifier found extended<=1; else if(enable2 && keyrom[7] && keyrom[1])//upstroke identifier found upstroke<=1; else if(enable2 && !(keyrom[7]&&keyrom[2]))//other key found and it was not an ack, reset both status bits begin upstroke<=0; extended<=0; end //assign all output signals //keyrom[6:0]=amiga keycode assign valid=keyrom[15]&enable2; assign ctrl=keyrom[14]; assign aleft=keyrom[13]; assign aright=keyrom[12]; assign caps=keyrom[11]; assign akey[7:0]={upstroke,keyrom[6:0]}; //osd control handling //keyrom[8] is used together with [0],[1],[2] and [3] for osd key decoding always @(posedge clk) begin if(reset) osdctrl[3:0]<=0; else if(enable2 && keyrom[8]) osdctrl[3:0]<=keyrom[3:0]&{~upstroke,~upstroke,~upstroke,~upstroke}; end //------------------------------------------------------------------------------------------------- //here follows the ps2 to Amiga key romtable: //standard decodes //[6:0]=amiga key code //[15]=valid amiga key (present in rom) //decodes for special function keys : //[14]=control key //[13]=left alt key //[12]=right alt key //[11]=capslock key //PS2 specific decodes: //[7]&[0]=PS2 EXTENDED KEY //[7]&[1]=PS2 UPSTROKE IDENTIFIER //[7]&[2]=PS2 ACKNOWLEDGE //OSD control decodes //[8]&([0] or [1] or [2] or [3]) always @(posedge clk) begin if(enable) begin case({extended,ps2key[7:0]}) 9'h000: keyrom[15:0]<=16'h0000; 9'h001: keyrom[15:0]<=16'h8058;//F9 9'h002: keyrom[15:0]<=16'h0000; 9'h003: keyrom[15:0]<=16'h8054;//F5 9'h004: keyrom[15:0]<=16'h8052;//F3 9'h005: keyrom[15:0]<=16'h8050;//F1 9'h006: keyrom[15:0]<=16'h8051;//F2 9'h007: keyrom[15:0]<=16'h0108;// MENU 9'h008: keyrom[15:0]<=16'h0000; 9'h009: keyrom[15:0]<=16'h8059;//F10 9'h00a: keyrom[15:0]<=16'h8057;//F8 9'h00b: keyrom[15:0]<=16'h8055;//F6 9'h00c: keyrom[15:0]<=16'h8053;//F4 9'h00d: keyrom[15:0]<=16'h8042;//TAB 9'h00e: keyrom[15:0]<=16'h8000;//~ 9'h00f: keyrom[15:0]<=16'h0000; 9'h010: keyrom[15:0]<=16'h0000; 9'h011: keyrom[15:0]<=16'ha064;//LEFT ALT 9'h012: keyrom[15:0]<=16'h8060;//LEFT SHIFT 9'h013: keyrom[15:0]<=16'h0000; 9'h014: keyrom[15:0]<=16'hc063;//CTRL 9'h015: keyrom[15:0]<=16'h8010;//q 9'h016: keyrom[15:0]<=16'h8001;//1 9'h017: keyrom[15:0]<=16'h0000; 9'h018: keyrom[15:0]<=16'h0000; 9'h019: keyrom[15:0]<=16'h0000; 9'h01a: keyrom[15:0]<=16'h8031;//z 9'h01b: keyrom[15:0]<=16'h8021;//s 9'h01c: keyrom[15:0]<=16'h8020;//a 9'h01d: keyrom[15:0]<=16'h8011;//w 9'h01e: keyrom[15:0]<=16'h8002;//2 9'h01f: keyrom[15:0]<=16'h0000; 9'h020: keyrom[15:0]<=16'h0000; 9'h021: keyrom[15:0]<=16'h8033;//c 9'h022: keyrom[15:0]<=16'h8032;//x 9'h023: keyrom[15:0]<=16'h8022;//d 9'h024: keyrom[15:0]<=16'h8012;//e 9'h025: keyrom[15:0]<=16'h8004;//4 9'h026: keyrom[15:0]<=16'h8003;//3 9'h027: keyrom[15:0]<=16'h0000; 9'h028: keyrom[15:0]<=16'h0000; 9'h029: keyrom[15:0]<=16'h8040;//SPACE 9'h02a: keyrom[15:0]<=16'h8034;//v 9'h02b: keyrom[15:0]<=16'h8023;//f 9'h02c: keyrom[15:0]<=16'h8014;//t 9'h02d: keyrom[15:0]<=16'h8013;//t 9'h02e: keyrom[15:0]<=16'h8005;//5 9'h02f: keyrom[15:0]<=16'h0000; 9'h030: keyrom[15:0]<=16'h0000; 9'h031: keyrom[15:0]<=16'h8036;//n 9'h032: keyrom[15:0]<=16'h8035;//b 9'h033: keyrom[15:0]<=16'h8025;//h 9'h034: keyrom[15:0]<=16'h8024;//g 9'h035: keyrom[15:0]<=16'h8015;//y 9'h036: keyrom[15:0]<=16'h8006;//6 9'h037: keyrom[15:0]<=16'h0000; 9'h038: keyrom[15:0]<=16'h0000; 9'h039: keyrom[15:0]<=16'h0000; 9'h03a: keyrom[15:0]<=16'h8037;//m 9'h03b: keyrom[15:0]<=16'h8026;//j 9'h03c: keyrom[15:0]<=16'h8016;//u 9'h03d: keyrom[15:0]<=16'h8007;//7 9'h03e: keyrom[15:0]<=16'h8008;//8 9'h03f: keyrom[15:0]<=16'h0000; 9'h040: keyrom[15:0]<=16'h0000; 9'h041: keyrom[15:0]<=16'h8038;//< 9'h042: keyrom[15:0]<=16'h8027;//k 9'h043: keyrom[15:0]<=16'h8017;//i 9'h044: keyrom[15:0]<=16'h8018;//o 9'h045: keyrom[15:0]<=16'h800a;//0 9'h046: keyrom[15:0]<=16'h8009;//9 9'h047: keyrom[15:0]<=16'h0000; 9'h048: keyrom[15:0]<=16'h0000; 9'h049: keyrom[15:0]<=16'h8039;//> 9'h04a: keyrom[15:0]<=16'h803a;//FORWARD SLASH 9'h04b: keyrom[15:0]<=16'h8028;//l 9'h04c: keyrom[15:0]<=16'h8029;//; 9'h04d: keyrom[15:0]<=16'h8019;//p 9'h04e: keyrom[15:0]<=16'h800b;//- 9'h04f: keyrom[15:0]<=16'h0000; 9'h050: keyrom[15:0]<=16'h0000; 9'h051: keyrom[15:0]<=16'h0000; 9'h052: keyrom[15:0]<=16'h802a;//" 9'h053: keyrom[15:0]<=16'h0000; 9'h054: keyrom[15:0]<=16'h801a;//[ 9'h055: keyrom[15:0]<=16'h800c;//= 9'h056: keyrom[15:0]<=16'h0000; 9'h057: keyrom[15:0]<=16'h0000; 9'h058: keyrom[15:0]<=16'h8862;//CAPSLOCK 9'h059: keyrom[15:0]<=16'h8061;//RIGHT SHIFT 9'h05a: keyrom[15:0]<=16'h8044;//ENTER 9'h05b: keyrom[15:0]<=16'h801b;//] 9'h05c: keyrom[15:0]<=16'h0000; 9'h05d: keyrom[15:0]<=16'h800d;//BACKSLASH 9'h05e: keyrom[15:0]<=16'h0000; 9'h05f: keyrom[15:0]<=16'h0000; 9'h060: keyrom[15:0]<=16'h0000; 9'h061: keyrom[15:0]<=16'h0000; 9'h062: keyrom[15:0]<=16'h0000; 9'h063: keyrom[15:0]<=16'h0000; 9'h064: keyrom[15:0]<=16'h0000; 9'h065: keyrom[15:0]<=16'h0000; 9'h066: keyrom[15:0]<=16'h8041;//BACKSPACE 9'h067: keyrom[15:0]<=16'h0000; 9'h068: keyrom[15:0]<=16'h0000; 9'h069: keyrom[15:0]<=16'h801d;//KP 1 9'h06a: keyrom[15:0]<=16'h0000; 9'h06b: keyrom[15:0]<=16'h802d;//KP 4 9'h06c: keyrom[15:0]<=16'h803d;//KP 7 9'h06d: keyrom[15:0]<=16'h0000; 9'h06e: keyrom[15:0]<=16'h0000; 9'h06f: keyrom[15:0]<=16'h0000; 9'h070: keyrom[15:0]<=16'h800f;//KP 0 9'h071: keyrom[15:0]<=16'h803c;//KP . 9'h072: keyrom[15:0]<=16'h801e;//KP 2 9'h073: keyrom[15:0]<=16'h802e;//KP 5 9'h074: keyrom[15:0]<=16'h802f;//KP 6 9'h075: keyrom[15:0]<=16'h803e;//KP 8 9'h076: keyrom[15:0]<=16'h8045;//ESCAPE 9'h077: keyrom[15:0]<=16'h805a;//NUM LOCK / KP ( 9'h078: keyrom[15:0]<=16'h805f;//HELP (F11) 9'h079: keyrom[15:0]<=16'h805e;//KP + 9'h07a: keyrom[15:0]<=16'h801f;//KP 3 9'h07b: keyrom[15:0]<=16'h804a;//KP - 9'h07c: keyrom[15:0]<=16'h805d;//KP * 9'h07d: keyrom[15:0]<=16'h803f;//KP 9 9'h07e: keyrom[15:0]<=16'h805b;//SCROLL LOCK / KP ) 9'h07f: keyrom[15:0]<=16'h0000; 9'h080: keyrom[15:0]<=16'h0000; 9'h081: keyrom[15:0]<=16'h0000; 9'h082: keyrom[15:0]<=16'h0000; 9'h083: keyrom[15:0]<=16'h8056;//F7 9'h084: keyrom[15:0]<=16'h0000; 9'h085: keyrom[15:0]<=16'h0000; 9'h086: keyrom[15:0]<=16'h0000; 9'h087: keyrom[15:0]<=16'h0000; 9'h088: keyrom[15:0]<=16'h0000; 9'h089: keyrom[15:0]<=16'h0000; 9'h08a: keyrom[15:0]<=16'h0000; 9'h08b: keyrom[15:0]<=16'h0000; 9'h08c: keyrom[15:0]<=16'h0000; 9'h08d: keyrom[15:0]<=16'h0000; 9'h08e: keyrom[15:0]<=16'h0000; 9'h08f: keyrom[15:0]<=16'h0000; 9'h090: keyrom[15:0]<=16'h0000; 9'h091: keyrom[15:0]<=16'h0000; 9'h092: keyrom[15:0]<=16'h0000; 9'h093: keyrom[15:0]<=16'h0000; 9'h094: keyrom[15:0]<=16'h0000; 9'h095: keyrom[15:0]<=16'h0000; 9'h096: keyrom[15:0]<=16'h0000; 9'h097: keyrom[15:0]<=16'h0000; 9'h098: keyrom[15:0]<=16'h0000; 9'h099: keyrom[15:0]<=16'h0000; 9'h09a: keyrom[15:0]<=16'h0000; 9'h09b: keyrom[15:0]<=16'h0000; 9'h09c: keyrom[15:0]<=16'h0000; 9'h09d: keyrom[15:0]<=16'h0000; 9'h09e: keyrom[15:0]<=16'h0000; 9'h09f: keyrom[15:0]<=16'h0000; 9'h0a0: keyrom[15:0]<=16'h0000; 9'h0a1: keyrom[15:0]<=16'h0000; 9'h0a2: keyrom[15:0]<=16'h0000; 9'h0a3: keyrom[15:0]<=16'h0000; 9'h0a4: keyrom[15:0]<=16'h0000; 9'h0a5: keyrom[15:0]<=16'h0000; 9'h0a6: keyrom[15:0]<=16'h0000; 9'h0a7: keyrom[15:0]<=16'h0000; 9'h0a8: keyrom[15:0]<=16'h0000; 9'h0a9: keyrom[15:0]<=16'h0000; 9'h0aa: keyrom[15:0]<=16'h0000; 9'h0ab: keyrom[15:0]<=16'h0000; 9'h0ac: keyrom[15:0]<=16'h0000; 9'h0ad: keyrom[15:0]<=16'h0000; 9'h0ae: keyrom[15:0]<=16'h0000; 9'h0af: keyrom[15:0]<=16'h0000; 9'h0b0: keyrom[15:0]<=16'h0000; 9'h0b1: keyrom[15:0]<=16'h0000; 9'h0b2: keyrom[15:0]<=16'h0000; 9'h0b3: keyrom[15:0]<=16'h0000; 9'h0b4: keyrom[15:0]<=16'h0000; 9'h0b5: keyrom[15:0]<=16'h0000; 9'h0b6: keyrom[15:0]<=16'h0000; 9'h0b7: keyrom[15:0]<=16'h0000; 9'h0b8: keyrom[15:0]<=16'h0000; 9'h0b9: keyrom[15:0]<=16'h0000; 9'h0ba: keyrom[15:0]<=16'h0000; 9'h0bb: keyrom[15:0]<=16'h0000; 9'h0bc: keyrom[15:0]<=16'h0000; 9'h0bd: keyrom[15:0]<=16'h0000; 9'h0be: keyrom[15:0]<=16'h0000; 9'h0bf: keyrom[15:0]<=16'h0000; 9'h0c0: keyrom[15:0]<=16'h0000; 9'h0c1: keyrom[15:0]<=16'h0000; 9'h0c2: keyrom[15:0]<=16'h0000; 9'h0c3: keyrom[15:0]<=16'h0000; 9'h0c4: keyrom[15:0]<=16'h0000; 9'h0c5: keyrom[15:0]<=16'h0000; 9'h0c6: keyrom[15:0]<=16'h0000; 9'h0c7: keyrom[15:0]<=16'h0000; 9'h0c8: keyrom[15:0]<=16'h0000; 9'h0c9: keyrom[15:0]<=16'h0000; 9'h0ca: keyrom[15:0]<=16'h0000; 9'h0cb: keyrom[15:0]<=16'h0000; 9'h0cc: keyrom[15:0]<=16'h0000; 9'h0cd: keyrom[15:0]<=16'h0000; 9'h0ce: keyrom[15:0]<=16'h0000; 9'h0cf: keyrom[15:0]<=16'h0000; 9'h0d0: keyrom[15:0]<=16'h0000; 9'h0d1: keyrom[15:0]<=16'h0000; 9'h0d2: keyrom[15:0]<=16'h0000; 9'h0d3: keyrom[15:0]<=16'h0000; 9'h0d4: keyrom[15:0]<=16'h0000; 9'h0d5: keyrom[15:0]<=16'h0000; 9'h0d6: keyrom[15:0]<=16'h0000; 9'h0d7: keyrom[15:0]<=16'h0000; 9'h0d8: keyrom[15:0]<=16'h0000; 9'h0d9: keyrom[15:0]<=16'h0000; 9'h0da: keyrom[15:0]<=16'h0000; 9'h0db: keyrom[15:0]<=16'h0000; 9'h0dc: keyrom[15:0]<=16'h0000; 9'h0dd: keyrom[15:0]<=16'h0000; 9'h0de: keyrom[15:0]<=16'h0000; 9'h0df: keyrom[15:0]<=16'h0000; 9'h0e0: keyrom[15:0]<=16'h0081;//ps2 extended key 9'h0e1: keyrom[15:0]<=16'h0000; 9'h0e2: keyrom[15:0]<=16'h0000; 9'h0e3: keyrom[15:0]<=16'h0000; 9'h0e4: keyrom[15:0]<=16'h0000; 9'h0e5: keyrom[15:0]<=16'h0000; 9'h0e6: keyrom[15:0]<=16'h0000; 9'h0e7: keyrom[15:0]<=16'h0000; 9'h0e8: keyrom[15:0]<=16'h0000; 9'h0e9: keyrom[15:0]<=16'h0000; 9'h0ea: keyrom[15:0]<=16'h0000; 9'h0eb: keyrom[15:0]<=16'h0000; 9'h0ec: keyrom[15:0]<=16'h0000; 9'h0ed: keyrom[15:0]<=16'h0000; 9'h0ee: keyrom[15:0]<=16'h0000; 9'h0ef: keyrom[15:0]<=16'h0000; 9'h0f0: keyrom[15:0]<=16'h0082;//ps2 release code 9'h0f1: keyrom[15:0]<=16'h0000; 9'h0f2: keyrom[15:0]<=16'h0000; 9'h0f3: keyrom[15:0]<=16'h0000; 9'h0f4: keyrom[15:0]<=16'h0000; 9'h0f5: keyrom[15:0]<=16'h0000; 9'h0f6: keyrom[15:0]<=16'h0000; 9'h0f7: keyrom[15:0]<=16'h0000; 9'h0f8: keyrom[15:0]<=16'h0000; 9'h0f9: keyrom[15:0]<=16'h0000; 9'h0fa: keyrom[15:0]<=16'h0084;//ps2 ack code 9'h0fb: keyrom[15:0]<=16'h0000; 9'h0fc: keyrom[15:0]<=16'h0000; 9'h0fd: keyrom[15:0]<=16'h0000; 9'h0fe: keyrom[15:0]<=16'h0000; 9'h0ff: keyrom[15:0]<=16'h0000; 9'h100: keyrom[15:0]<=16'h0000; 9'h101: keyrom[15:0]<=16'h0000; 9'h102: keyrom[15:0]<=16'h0000; 9'h103: keyrom[15:0]<=16'h0000; 9'h104: keyrom[15:0]<=16'h0000; 9'h105: keyrom[15:0]<=16'h0000; 9'h106: keyrom[15:0]<=16'h0000; 9'h107: keyrom[15:0]<=16'h0000; 9'h108: keyrom[15:0]<=16'h0000; 9'h109: keyrom[15:0]<=16'h0000; 9'h10a: keyrom[15:0]<=16'h0000; 9'h10b: keyrom[15:0]<=16'h0000; 9'h10c: keyrom[15:0]<=16'h0000; 9'h10d: keyrom[15:0]<=16'h0000; 9'h10e: keyrom[15:0]<=16'h0000; 9'h10f: keyrom[15:0]<=16'h0000; 9'h110: keyrom[15:0]<=16'h0000; 9'h111: keyrom[15:0]<=16'h9065;//RIGHT ALT 9'h112: keyrom[15:0]<=16'h0000; 9'h113: keyrom[15:0]<=16'h0000; 9'h114: keyrom[15:0]<=16'h0000; 9'h115: keyrom[15:0]<=16'h0000; 9'h116: keyrom[15:0]<=16'h0000; 9'h117: keyrom[15:0]<=16'h0000; 9'h118: keyrom[15:0]<=16'h0000; 9'h119: keyrom[15:0]<=16'h0000; 9'h11a: keyrom[15:0]<=16'h0000; 9'h11b: keyrom[15:0]<=16'h0000; 9'h11c: keyrom[15:0]<=16'h0000; 9'h11d: keyrom[15:0]<=16'h0000; 9'h11e: keyrom[15:0]<=16'h0000; 9'h11f: keyrom[15:0]<=16'h8066;//LEFT AMIGA (LEFT GUI) 9'h120: keyrom[15:0]<=16'h0000; 9'h121: keyrom[15:0]<=16'h0000; 9'h122: keyrom[15:0]<=16'h0000; 9'h123: keyrom[15:0]<=16'h0000; 9'h124: keyrom[15:0]<=16'h0000; 9'h125: keyrom[15:0]<=16'h0000; 9'h126: keyrom[15:0]<=16'h0000; 9'h127: keyrom[15:0]<=16'h8067;//RIGHT AMIGA (RIGHT GUI) 9'h128: keyrom[15:0]<=16'h0000; 9'h129: keyrom[15:0]<=16'h0000; 9'h12a: keyrom[15:0]<=16'h0000; 9'h12b: keyrom[15:0]<=16'h0000; 9'h12c: keyrom[15:0]<=16'h0000; 9'h12d: keyrom[15:0]<=16'h0000; 9'h12e: keyrom[15:0]<=16'h0000; 9'h12f: keyrom[15:0]<=16'h0000; 9'h130: keyrom[15:0]<=16'h0000; 9'h131: keyrom[15:0]<=16'h0000; 9'h132: keyrom[15:0]<=16'h0000; 9'h133: keyrom[15:0]<=16'h0000; 9'h134: keyrom[15:0]<=16'h0000; 9'h135: keyrom[15:0]<=16'h0000; 9'h136: keyrom[15:0]<=16'h0000; 9'h137: keyrom[15:0]<=16'h0000; 9'h138: keyrom[15:0]<=16'h0000; 9'h139: keyrom[15:0]<=16'h0000; 9'h13a: keyrom[15:0]<=16'h0000; 9'h13b: keyrom[15:0]<=16'h0000; 9'h13c: keyrom[15:0]<=16'h0000; 9'h13d: keyrom[15:0]<=16'h0000; 9'h13e: keyrom[15:0]<=16'h0000; 9'h13f: keyrom[15:0]<=16'h0000; 9'h140: keyrom[15:0]<=16'h0000; 9'h141: keyrom[15:0]<=16'h0000; 9'h142: keyrom[15:0]<=16'h0000; 9'h143: keyrom[15:0]<=16'h0000; 9'h144: keyrom[15:0]<=16'h0000; 9'h145: keyrom[15:0]<=16'h0000; 9'h146: keyrom[15:0]<=16'h0000; 9'h147: keyrom[15:0]<=16'h0000; 9'h148: keyrom[15:0]<=16'h0000; 9'h149: keyrom[15:0]<=16'h0000; 9'h14a: keyrom[15:0]<=16'h805c;//KP / 9'h14b: keyrom[15:0]<=16'h0000; 9'h14c: keyrom[15:0]<=16'h0000; 9'h14d: keyrom[15:0]<=16'h0000; 9'h14e: keyrom[15:0]<=16'h0000; 9'h14f: keyrom[15:0]<=16'h0000; 9'h150: keyrom[15:0]<=16'h0000; 9'h151: keyrom[15:0]<=16'h0000; 9'h152: keyrom[15:0]<=16'h0000; 9'h153: keyrom[15:0]<=16'h0000; 9'h154: keyrom[15:0]<=16'h0000; 9'h155: keyrom[15:0]<=16'h0000; 9'h156: keyrom[15:0]<=16'h0000; 9'h157: keyrom[15:0]<=16'h0000; 9'h158: keyrom[15:0]<=16'h0000; 9'h159: keyrom[15:0]<=16'h0000; 9'h15a: keyrom[15:0]<=16'h8043;//KP ENTER 9'h15b: keyrom[15:0]<=16'h0000; 9'h15c: keyrom[15:0]<=16'h0000; 9'h15d: keyrom[15:0]<=16'h0000; 9'h15e: keyrom[15:0]<=16'h0000; 9'h15f: keyrom[15:0]<=16'h0000; 9'h160: keyrom[15:0]<=16'h0000; 9'h161: keyrom[15:0]<=16'h0000; 9'h162: keyrom[15:0]<=16'h0000; 9'h163: keyrom[15:0]<=16'h0000; 9'h164: keyrom[15:0]<=16'h0000; 9'h165: keyrom[15:0]<=16'h0000; 9'h166: keyrom[15:0]<=16'h0000; 9'h167: keyrom[15:0]<=16'h0000; 9'h168: keyrom[15:0]<=16'h0000; 9'h169: keyrom[15:0]<=16'h0000; 9'h16a: keyrom[15:0]<=16'h0000; 9'h16b: keyrom[15:0]<=16'h804f;//ARROW LEFT 9'h16c: keyrom[15:0]<=16'h0104;// SELECT 9'h16d: keyrom[15:0]<=16'h0000; 9'h16e: keyrom[15:0]<=16'h0000; 9'h16f: keyrom[15:0]<=16'h0000; 9'h170: keyrom[15:0]<=16'h0000; 9'h171: keyrom[15:0]<=16'h8046;//DELETE 9'h172: keyrom[15:0]<=16'h804d;//ARROW DOWN 9'h173: keyrom[15:0]<=16'h0000; 9'h174: keyrom[15:0]<=16'h804e;//ARROW RIGHT 9'h175: keyrom[15:0]<=16'h804c;//ARROW UP 9'h176: keyrom[15:0]<=16'h0000; 9'h177: keyrom[15:0]<=16'h0000; 9'h178: keyrom[15:0]<=16'h0000; 9'h179: keyrom[15:0]<=16'h0000; 9'h17a: keyrom[15:0]<=16'h0102;// DOWN 9'h17b: keyrom[15:0]<=16'h0000; 9'h17c: keyrom[15:0]<=16'h0000; 9'h17d: keyrom[15:0]<=16'h0101;// UP 9'h17e: keyrom[15:0]<=16'h0000; 9'h17f: keyrom[15:0]<=16'h0000; 9'h180: keyrom[15:0]<=16'h0000; 9'h181: keyrom[15:0]<=16'h0000; 9'h182: keyrom[15:0]<=16'h0000; 9'h183: keyrom[15:0]<=16'h0000; 9'h184: keyrom[15:0]<=16'h0000; 9'h185: keyrom[15:0]<=16'h0000; 9'h186: keyrom[15:0]<=16'h0000; 9'h187: keyrom[15:0]<=16'h0000; 9'h188: keyrom[15:0]<=16'h0000; 9'h189: keyrom[15:0]<=16'h0000; 9'h18a: keyrom[15:0]<=16'h0000; 9'h18b: keyrom[15:0]<=16'h0000; 9'h18c: keyrom[15:0]<=16'h0000; 9'h18d: keyrom[15:0]<=16'h0000; 9'h18e: keyrom[15:0]<=16'h0000; 9'h18f: keyrom[15:0]<=16'h0000; 9'h190: keyrom[15:0]<=16'h0000; 9'h191: keyrom[15:0]<=16'h0000; 9'h192: keyrom[15:0]<=16'h0000; 9'h193: keyrom[15:0]<=16'h0000; 9'h194: keyrom[15:0]<=16'h0000; 9'h195: keyrom[15:0]<=16'h0000; 9'h196: keyrom[15:0]<=16'h0000; 9'h197: keyrom[15:0]<=16'h0000; 9'h198: keyrom[15:0]<=16'h0000; 9'h199: keyrom[15:0]<=16'h0000; 9'h19a: keyrom[15:0]<=16'h0000; 9'h19b: keyrom[15:0]<=16'h0000; 9'h19c: keyrom[15:0]<=16'h0000; 9'h19d: keyrom[15:0]<=16'h0000; 9'h19e: keyrom[15:0]<=16'h0000; 9'h19f: keyrom[15:0]<=16'h0000; 9'h1a0: keyrom[15:0]<=16'h0000; 9'h1a1: keyrom[15:0]<=16'h0000; 9'h1a2: keyrom[15:0]<=16'h0000; 9'h1a3: keyrom[15:0]<=16'h0000; 9'h1a4: keyrom[15:0]<=16'h0000; 9'h1a5: keyrom[15:0]<=16'h0000; 9'h1a6: keyrom[15:0]<=16'h0000; 9'h1a7: keyrom[15:0]<=16'h0000; 9'h1a8: keyrom[15:0]<=16'h0000; 9'h1a9: keyrom[15:0]<=16'h0000; 9'h1aa: keyrom[15:0]<=16'h0000; 9'h1ab: keyrom[15:0]<=16'h0000; 9'h1ac: keyrom[15:0]<=16'h0000; 9'h1ad: keyrom[15:0]<=16'h0000; 9'h1ae: keyrom[15:0]<=16'h0000; 9'h1af: keyrom[15:0]<=16'h0000; 9'h1b0: keyrom[15:0]<=16'h0000; 9'h1b1: keyrom[15:0]<=16'h0000; 9'h1b2: keyrom[15:0]<=16'h0000; 9'h1b3: keyrom[15:0]<=16'h0000; 9'h1b4: keyrom[15:0]<=16'h0000; 9'h1b5: keyrom[15:0]<=16'h0000; 9'h1b6: keyrom[15:0]<=16'h0000; 9'h1b7: keyrom[15:0]<=16'h0000; 9'h1b8: keyrom[15:0]<=16'h0000; 9'h1b9: keyrom[15:0]<=16'h0000; 9'h1ba: keyrom[15:0]<=16'h0000; 9'h1bb: keyrom[15:0]<=16'h0000; 9'h1bc: keyrom[15:0]<=16'h0000; 9'h1bd: keyrom[15:0]<=16'h0000; 9'h1be: keyrom[15:0]<=16'h0000; 9'h1bf: keyrom[15:0]<=16'h0000; 9'h1c0: keyrom[15:0]<=16'h0000; 9'h1c1: keyrom[15:0]<=16'h0000; 9'h1c2: keyrom[15:0]<=16'h0000; 9'h1c3: keyrom[15:0]<=16'h0000; 9'h1c4: keyrom[15:0]<=16'h0000; 9'h1c5: keyrom[15:0]<=16'h0000; 9'h1c6: keyrom[15:0]<=16'h0000; 9'h1c7: keyrom[15:0]<=16'h0000; 9'h1c8: keyrom[15:0]<=16'h0000; 9'h1c9: keyrom[15:0]<=16'h0000; 9'h1ca: keyrom[15:0]<=16'h0000; 9'h1cb: keyrom[15:0]<=16'h0000; 9'h1cc: keyrom[15:0]<=16'h0000; 9'h1cd: keyrom[15:0]<=16'h0000; 9'h1ce: keyrom[15:0]<=16'h0000; 9'h1cf: keyrom[15:0]<=16'h0000; 9'h1d0: keyrom[15:0]<=16'h0000; 9'h1d1: keyrom[15:0]<=16'h0000; 9'h1d2: keyrom[15:0]<=16'h0000; 9'h1d3: keyrom[15:0]<=16'h0000; 9'h1d4: keyrom[15:0]<=16'h0000; 9'h1d5: keyrom[15:0]<=16'h0000; 9'h1d6: keyrom[15:0]<=16'h0000; 9'h1d7: keyrom[15:0]<=16'h0000; 9'h1d8: keyrom[15:0]<=16'h0000; 9'h1d9: keyrom[15:0]<=16'h0000; 9'h1da: keyrom[15:0]<=16'h0000; 9'h1db: keyrom[15:0]<=16'h0000; 9'h1dc: keyrom[15:0]<=16'h0000; 9'h1dd: keyrom[15:0]<=16'h0000; 9'h1de: keyrom[15:0]<=16'h0000; 9'h1df: keyrom[15:0]<=16'h0000; 9'h1e0: keyrom[15:0]<=16'h0081;//ps2 extended key(duplicate, see $e0) 9'h1e1: keyrom[15:0]<=16'h0000; 9'h1e2: keyrom[15:0]<=16'h0000; 9'h1e3: keyrom[15:0]<=16'h0000; 9'h1e4: keyrom[15:0]<=16'h0000; 9'h1e5: keyrom[15:0]<=16'h0000; 9'h1e6: keyrom[15:0]<=16'h0000; 9'h1e7: keyrom[15:0]<=16'h0000; 9'h1e8: keyrom[15:0]<=16'h0000; 9'h1e9: keyrom[15:0]<=16'h0000; 9'h1ea: keyrom[15:0]<=16'h0000; 9'h1eb: keyrom[15:0]<=16'h0000; 9'h1ec: keyrom[15:0]<=16'h0000; 9'h1ed: keyrom[15:0]<=16'h0000; 9'h1ee: keyrom[15:0]<=16'h0000; 9'h1ef: keyrom[15:0]<=16'h0000; 9'h1f0: keyrom[15:0]<=16'h0082;//ps2 release code(duplicate, see $f0) 9'h1f1: keyrom[15:0]<=16'h0000; 9'h1f2: keyrom[15:0]<=16'h0000; 9'h1f3: keyrom[15:0]<=16'h0000; 9'h1f4: keyrom[15:0]<=16'h0000; 9'h1f5: keyrom[15:0]<=16'h0000; 9'h1f6: keyrom[15:0]<=16'h0000; 9'h1f7: keyrom[15:0]<=16'h0000; 9'h1f8: keyrom[15:0]<=16'h0000; 9'h1f9: keyrom[15:0]<=16'h0000; 9'h1fa: keyrom[15:0]<=16'h0084;//ps2 ack code(duplicate see $fa) 9'h1fb: keyrom[15:0]<=16'h0000; 9'h1fc: keyrom[15:0]<=16'h0000; 9'h1fd: keyrom[15:0]<=16'h0000; 9'h1fe: keyrom[15:0]<=16'h0000; 9'h1ff: keyrom[15:0]<=16'h0000; endcase end end endmodule