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

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル