2016-04-15 10 views
2

私は、2人のプレーヤーを含むアセンブリでゲームを構築しています。同時に2つのキーを取得します - アセンブリ8086

mov ah, 01h 
int 16h 

このコードは、私のスキャンコードと押されたキー 問題のASCIIコードを与える2人のプレイヤーが2つの異なるキーを押すかもしれないということです: は、だから私は押された現在のキーを取得するには、次のコードを使用しています同じ時間に。 同時に2つのキーを受信するにはどうすればよいですか?

私はこれを達成するためにいくつかの方法を試しました。私はal,060hを使って直接入力を取得しようとしました。私もint 9hを試しましたが、それでも動作しませんでした。メモリは、数字上で自分自身をリフレッシュするためにグーグルのタッチで、提供している場合

答えて

5

...

BIOSは、あなたが望むものを提供していません。それはテキスト文字の入力ストリームを管理しています。これはキーダウンイベントを捕捉することに強く関連していますが、現在どのキーが押されているかを知ることはできません。

int 21h、機能25hを使用してint 9hの独自のハンドラをインストールする必要があります。そうすれば、ハードウェアからキーアップイベントとキーダウンイベントを直接取得できます。

割り込みが発生した理由を調べるには、ハンドラ内でポート60hを読み込みます。下位7ビットはキーコードです。最上位ビットがクリアされている場合、キーは押された状態に移行しています。トップビットが設定されている場合、キーは非押下に移行しています。

割り込みを受け付けるには、20hにポートするには、20hを送信する必要があります。

したがって、すべて80hとして初期化された128バイトのテーブルを保持することができます。あなたのハンドラでは、valuevalue&7hを保存してください。

実際のゲームコードでは、その時点でnキーが押されているかどうかを知りたい場合は、テーブルからn番目の値を読み取り、符号に分岐します。ポジティブ=プレス、ネガティブ=プレス、

(補遺:あなたも、あなたが起動したときに、既存のベクトルを取得し、あなたが終了する前にそれを復元、または他のあなただけの誤っおそらくSRの一部を行わず、TSRのフック部分を書いている必要があります)

+0

OMG ...この答えは、そのような懐かしい旅行を引き起こしました... – timday

+0

ありがとう、驚くべきアイデア! – morha13

+0

*ダブルコメントをおかけして申し訳ありません。先生、あなたは天才です!私はこの問題を解決しようと数時間を費やすつもりですが、あなたは私の人生を救っただけです!私がしたことは、128バイトのテーブルを作成することでした。各バイトはキーボードのキーを表しています。キーが押されているときは、テーブル内の位置(スキャンコードはオフセットとして使用されています)が1に設定されています。キーが離されると、0に設定されます。 – morha13

関連する問題