第6章 パッド入力
パッドI/Oレジスタ
十字キーやボタンを読み取るには、$4016(1コン)、$4017(2コン)にアクセスします。
(以下は1コントローラーを前提として説明します)
ボタンが押されれば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
条件分岐
すでに第5章で使用してますが、アセンブラには条件分岐命令があります。
直前の演算結果によりステータスレジスタのフラグが変化して、指定されたラベルにジャンプすることが出来ます。以下は例です。
; どこかにloopToというラベルがあるとして・・・
beq loopTo ; 直前の比較結果が等しいか、演算結果がゼロの場合にLooptoにジャンプする
bne loopTo ; 直前の比較結果が等しくないか、演算結果がゼロでない場合にLooptoにジャンプする
beq,bneはステータスレジスタのZ(ゼロ)フラグの結果で分岐します。
分岐命令は他にもたくさんありますが、ここでは省略します。
キー読み取りプログラムの例
キー入力を読み取るプログラムは、以下のようになります。
andというAND演算を行うための命令がありますが、これはC言語がわかる人には説明不要でしょう。
わからない人は、Aレジスタの最下位1ビットを見て、その結果で何かしようとしていると理解してください。
; パッドI/Oレジスタの準備
lda #$01
sta $4016
lda #$00
sta $4016
lda $4016 ; まずAボタンを読み取る
and #1 ; Aレジスタ AND 1
bne ADown ; 上の結果がゼロで無い場合はAボタンが押されてるのでADownへジャンプ
lda $4016 ; 次はBボタンを読み取って飛ばす
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しながら処理を行うのではなく、パットを1ビットずつreadしながら
ビットシフトして一箇所にためていって、後で好きなときに利用するというやり方のほうが一般的だと思います。
トップページ
前のページ
次のページ