ジョイパッドをサポートした話

  • 投稿日:
  • by
  • カテゴリ:

結局、もやっと書いて、詳しく書かなかった、ジョイパッドをサポートした話。わたしは、もう、キー入力に応じて処理を書いちゃってあったので、ジョイパッドからの入力をキー入力のビットマップに合わせる方向で実装しました。

つまりは、キー入力BIOSを呼び出す代わりに、以下の処理を呼び出して、キーまたはジョイパッドのどっちから入力があっても、コンパチなビットマップを返すってことで。

;;; gamekeypad
gamekeypad:
call gamekey
and a
ret nz ; キー入力があったら戻る
ld a,1 ; ジョイパッド#1からの入力をチェック
call joystick
and a
ret z ; 何も入力されてなければ戻る
push bc ; Cレジスタに入力値を入れて、ローテートしながら、Bに値を入れる
ld b,0 ; |-|-|B|A|→|←|↓|↑|
ld c,a
rlc c ; 左に1bitローテートして→だけ残す。
ld a,10h ; |-|-|-|→|-|-|-|-|
and c
ld b,a
rlc c ; 左に1bitローテートして↑↓を残す。
ld a,0ch ; |-|-|-|-|↓|↑|-|-|
and c
or b
ld b,a
rlc c ; 左に1bitローテートして←ABを残す。
ld a,0a3h ; |A|-|←|-|-|-|-|B|
and c
or b ; |A|-|←|→|↓|↑|-|B|
pop bc
ret

上のように、3回ローテートして、マスクとって、BレジスタにORで書き込んでいくって形で、キー入力のビットマップと概ねコンパチになるようにしています。

つか、始めからコンパチになるようにBIOS作っといてくれればよかったのに、というか、用途を考えればそうするでしょうよ?

どうなのよ。