9

Commodore 64 でカーネル ルーチンを使用してゲーム コントロールを実装しようとしています。

以下のコードは、1 つの例外を除いて機能します。各キー ストロークは 1 回の入力としてカウントされます。例:ボタンを押し続けても効果はありません。移動するたびに離してもう一度押す必要がありました。この動作を変更するにはどうすればよいですか? キーが押されている限り、アクションを繰り返したいだけです。

    GETIN  =  $FFE4
    SCNKEY =  $FF9F

keyScan:
    jsr SCNKEY  ;get key
    jsr GETIN   ;put key in A

    cmp #65
    beq left

    cmp #68
    beq right

    jmp keyScan 
4

2 に答える 2

10

SCNKEY複数同時キー入力が必要なゲームには不向きです。これはステートレスで、現在押されている「その」キーを返すだけです。つまり、2 つ押された場合は 1 つだけが表示され、公式にはどちらが押されているかは保証されません。SCNKEYあなたができる最善のことは、他の何かが押されているか、何も押されていないことが報告されるまで、キーがまだ押されていると見なすことです.

あなたのプログラムが、押された「その」キーだけが存在するという正統性に適合しない場合は、自分でハードウェアを叩かなければなりません。Codebase64では、いくつかのサンプル コードを提供しています。私の要約バージョンは次のとおりです(CIAを正しくセットアップしましたが、すでに適切に構成されている可能性があります):

  1. 同時にスキャンする行ごとに 0 を含むバイトを DC00 に書き込みます。
  2. DC01 から 1 バイトを読み取り、上位 4 ビットをチェックして、選択した行のどのキーが押されたかを調べます。

一般的なルーチンでは、シャドーイングを回避するために各行を個別にテストする必要があります — DC00 のビット 3 と 4 に 0 を格納することにより、行 4 と 5 を同時に読み取るように要求し、返された結果の最上位ビットがクリアであったとします。 v、n、または両方が押されたかどうかはわかりませんが、少なくともどちらかが押されているだけです。

英語キーボードの行と列の表については、上記と同じリンクの一番下を参照してください。これらは物理的なキー レイアウトの結果であるため、他の言語でもキーボードと同じように異なります。ゲームを作成していて、キーの記号よりもキーのレイアウトに関心がある場合は、言語について心配する必要はありません。

于 2016-12-21T14:46:32.600 に答える