第６章

## 第６章　パッド入力

### パッドI/Oレジスタ

十字キーやボタンを読み取るには、$4016(１コン)、$4017(２コン)にアクセスします。 （以下は１コントローラーを前提として説明します） ボタンが押されれば1になりますが、押されないと変わらないので、一度押されたら1のままです。 なので毎回自分で初期化する必要があります。初期化するには以下のようにI/Oレジスタに1、0の順で書き込みます。

    	lda #$01
    	sta $4016
    	lda #$00
    	sta $4016

パッド入力は以下の順で、lda $4016を何度も繰り返して読み取ります。

    	     1. A
    	     2. B
    	     3. SELECT
    	     4. START
    	     5. UP
    	     6. DOWN
    	     7. LEFT
    	     8. RIGHT

### 条件分岐

すでに第５章で使用してますが、アセンブラには条件分岐命令があります。 直前の演算結果によりステータスレジスタのフラグが変化して、指定されたラベルにジャンプすることが出来ます。以下は例です。

    	; どこかにloopToというラベルがあるとして・・・
    	beq loopTo  ; 直前の比較結果が等しいか、演算結果がゼロの場合にLooptoにジャンプする

    	bne loopTo  ; 直前の比較結果が等しくないか、演算結果がゼロでない場合にLooptoにジャンプする

beq,bneはステータスレジスタのZ(ゼロ)フラグの結果で分岐します。 　分岐命令は他にもたくさんありますが、ここでは省略します。

### キー読み取りプログラムの例

キー入力を読み取るプログラムは、以下のような感じになります。 andというAND演算を行うための命令がありますが、これはC言語をやっている人には説明不要とは思います。 わからない人は、Aレジスタの最下位１ﾋﾞｯﾄを見て、その結果で何かしようとしていると理解してください。

    	; パッドI/Oレジスタの準備
    	lda #$01
    	sta $4016
    	lda #$00
    	sta $4016

    	lda $4016  ; まずＡボタンを読み取る
    	and #1     ; Aレジスタ AND 1
    	bne ADown  ; 上の結果がゼロで無い場合はAボタンが押されてるのでADownへジャンプ

    	lda $4016  ; 次はＢボタンを読み取って飛ばす
    	lda $4016  ; SELECTボタンを読み取って飛ばす
    	lda $4016  ; STARTボタンを読み取る
    	and #1     ; Aレジスタ AND 1
    	bne StartDown  ; 上の結果がゼロで無い場合はSTARTボタンが押されてるのでWasDownへジャンプ

    	lda $4016  ; 上ボタンを読み取って飛ばす
    	lda $4016  ; 下ボタンを読み取って飛ばす
    	lda $4016  ; 左ボタンを読み取って飛ばす
    	lda $4016  ; 右ボタンを読み取って飛ばす

    	jmp NothingDown  ; 何も押されていない処理へジャンプ

    StartDown:
    	; スタートボタンが押された時の処理をここに記述する

    ADown:
    	; Aボタンが押された時の処理をここに記述する

    NothingDown:
    	; 何も押されていない時の処理をここに記述する

なお、このようにreadしながら処理を行うのではなく、パットを１ビットずつreadしながら ビットシフトして一箇所にためていって、後で好きなときに利用するというやり方のほうが一般的だと思います。

トップページ 前のページ 次のページ

FC2 |  | キャッシング 花 | 無料 掲示板 無料ホームページ