/* PS/2 キーボードを SHARP X1 につなぐ キーコード変換処理 2014年7月23日作成 佐藤恭一 http://kyoutan.jpn.org/ 無保証です。 佐藤恭一が作成した部分は用途に制限を設けません。商用・非商用にかかわらず自由に使用して頂いて構いません。 勝手に複製したり、改造したり、配布したり、売ったりしても良いということです。 連絡不要です。 */ #include "keyconv.h" #include "keytable.h" #include "ps2.h" #include "x1key.h" volatile unsigned short x1shift=0xFF; // X1 シフト状態保存 0で有効 #define TENKEY ((unsigned char)(1<<7)) #define PRESS ((unsigned char)(1<<6)) #define REPEAT ((unsigned char)(1<<5)) #define GRAPH ((unsigned char)(1<<4)) #define CAPS ((unsigned char)(1<<3)) #define KANA ((unsigned char)(1<<2)) #define SHIFT ((unsigned char)(1<<1)) #define CTRL ((unsigned char)(1<<0)) volatile unsigned char ps2ex=0; // PS2キーボード 拡張キーフラグ #define EXKEY ((unsigned char)(1<<0)) #define RELEASE ((unsigned char)(1<<1)) #define PAUSE_BREAK ((unsigned char)(1<<2)) unsigned char codeconv(unsigned char data); unsigned char checkbreak(void); unsigned char x1code(unsigned char data); void x1trans(unsigned char data); void keyconv(void) { unsigned char data; data=ps2get(); // PS/2キーボードから受信するまで待って、1バイト読み込む switch(data) { case 0xE0: // 拡張キー ps2ex|=EXKEY; // 拡張キーフラグセット break; case 0xF0: // 離した ps2ex|=RELEASE; // 離したフラグセット break; default: // PS/2 のコードから内部コードに変換 if(0xE1==data) data=checkbreak(); // PAUSE/BREAK キーの判別 if(0==(ps2ex & EXKEY)) { // 通常キー if(0x8Fdata))||(0x5A ret)) ret-=0x20; // アルファベット大文字に return ret; } if((KANA | GRAPH | CTRL )==status) // CAPS+SHIFT { unsigned char ret; ret=CHR_TBL1[data]; if((0x40 < ret)&&(0x5b > ret)) ret+=0x20; // アルファベット小文字に return ret; } status&=(GRAPH | KANA | SHIFT | CTRL); if((GRAPH | KANA | CTRL )==status) return CHR_TBL1[data]; // SHIFT if((GRAPH | KANA | SHIFT)==status) return CHR_TBL3[data]; // CTRL if((KANA | SHIFT | CTRL )==status) return CHR_TBL2[data]; // GRAPH if(( SHIFT | CTRL )==status) return CHR_TBL2[data]; // GRAPH+KANA if((GRAPH | SHIFT | CTRL )==status) return CHR_TBL4[data]; // KANA if((GRAPH | CTRL )==status) return CHR_TBL5[data]; // KANA+SHIFT return CHR_TBL0[data]; // シフトなし }