DOSでプログラミング2回目
キー入力ができないとゲームが遊べません。
DOS/VにおいてはI/Oポートを直接アクセスして入力した値を調べることができます。
0x60ポート
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
f | c | c | c | c | c | c | c |
f=0・・・押した
f=1・・・離した
c・・・・・押されたキーコード(0〜127)
このように7ビット=128のキーが分かります。
しかし、DOS/Vは日本語拡張されているし、特殊なキーも加わっているので
完全に入力状況を調べるにはキー割り込みをフックする必要があります。
そこまでやると面倒なので処理を簡略したのが次のプログラム。
#include<stdio.h> #include<dos.h> char keydata[128]={0}; void KeyTask() { int Key,num; disable();//割り込み禁止 bdos(0x0c,0,0); /* バッファを空にする */ Key = inp(0x60); num =Key &0x7f; if (Key != 0xe0) { /* 拡張キーを示すデータは無視 */ if(!(Key & 0x80)){ keydata[num]=1; }else{ keydata[num]=0; } } enable();//割り込み許可 } #define Locate(x,y) printf("\033[%d;%dH",y+1,x+1); #define Cls() printf("\033[2J"); void main() { Cls(); printf("ESCで終了"); while(1){ KeyTask(); Locate(0,1); for(int a=0;a<32;++a){ int key=keydata[0x20+a]; printf("%d ",key); } if(keydata[0x01]) break; } } |
実行してZXCなどのキーを押すと1になります。
ESCキーで終了。
エスケープシーケンスを使っているのでNT/2000/XPでは正しく表示されないですが・・。
その場合は次の通りにしてみてください。
void main() { while(1){ KeyTask(); for(int a=0;a<4;++a){ int key=keydata[0x2c+a]; printf("%d ",key); } printf("\n"); if(keydata[0x01]) break; } } |
カーソルキーだけは離された情報が正しくないので使えません。
よってゲームではZ,X,Cなどとテンキーを使うことにします。
ライブラリで使っているキーコードは次の通り。
2c | 2d | 2e | 1e | 1f | 20 | 39 | 01 |
Z | X | C | A | S | D | スペース | ESC |
テンキー
4f | 50 | 51 | 4b | 4c | 4d | 47 | 48 | 49 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |