MSX 入出力の仕組みを学ぶ
前回まででスプライトの表示を説明しました。もうそろそろVRAMについても理解が進んだのではないでしょうか?さて、スプライトを動かそうと思ったのですが、いったん基礎に戻って入出力について説明します。
入力と出力
ありとあらゆるコンピューターは、入力→演算→出力。これだけで成立しています。入力は現代であればマウスだったりタッチパッドだったり通信回線だったりといろいろあります。出力もそうですね。画面に表示するだけが出力にあらずで3Dプリンタとか、これまた通信回線だったりします。
ちなみにRAMからデータを読み込むのも入力だし、RAMのメモリー内にデータを入れることも出力なのですが今回は周辺機器に対する操作だけを入出力とします。
さて、MSXの基本的な入出力構成は次のようになっています。
入力
キーボード、ジョイスティック、ジョイパッド
出力
画面(CRT)、スピーカー
え?「そんなの知ってるよ」って言う声が聞こえてきそうですが、それではその仕組みについて説明できますか?
と、いうことで今回は入出力、そのなかでも(出力はVDP、VRAMでさんざやってるので)キーボード入力とジョイスティック入力について説明したいと思いますね。
MSXの入出力概要図は以下のとおりです。
YAMAHA YM2149は音を出力するためのユニットですが、このユニットには入出力用のポートがいくつもついていて、そのうちの一部をジョイスティックの入力用のポートとしてMSXは使用しています。
ジョイスティックの状態を取得する:GTSTCK(00D5H)
ジョイスティックの状態を取得するためには、GTSTCK(00D5H)というBIOSサブルーチンを呼び出すことで実現できます。MSXはキーボードのカーソルキーもジョイスティック扱いです。SONYのHITBITなんかはカーソルキーにニョキっとスティックが付いてました。ダサいですか?当時はカッコよかったんだけどなあ・・。
GTSTCKの使い方は以下のとおりです。
GTSTCK:equ $00D5
; Aレジスタに値をセットしてGTSTCKを呼び出すとそれぞれのジョイスティックの状態が取得できる
; 0: キーボード
; 1: 外付けジョイスティック1
; 2: 外付けジョイスティック2
; コーディング例
ld a, 0 ; キーボードのジョイスティックの状態を取得する
call GTSTCK ; BIOSサブルーチン呼び出し
; Aレジスタに押された方向がセットされる
;
; 0: 押されてない
; 1: 上
; 2: 右上
; 3: 右
; 4: 右下
; 5: 下
; 6: 左下
; 7: 左
; 8: 左上
トリガーの状態を取得する:GTTRIG(00D8H)
トリガー(ジョイスティックのAボタン、Bボタン)の状態を取得するためにはGTTRIG(00D8H)というBIOSサブルーチンを呼び出します。
GTTRIGの使い方は以下のとおりです。
GTTRIG:equ $00D8
; Aレジスタに値をセットしてGTTRIGを呼び出すとそれぞれのトリガーの状態が取得できる
; 0: スペースキー
; 1: ジョイスティック1のAボタン
; 2: ジョイスティック2のAボタン
; 3: ジョイスティック1のBボタン
; 4: ジョイスティック2のBボタン
; コーディング例
ld a, 0 ; スペースキーが押されているか確認する
call GTTRIG
; Aレジスタにトリガが押されているか否かの状態が格納される
; 0: 押されていない
; $FF: 押されている
キーボードの状態を取得する:SNSMAT(0141H)
キーボードの状態を取得するにはいくつか方法があるのですが、さくっと知る目的であればSNSMAT(0141H)が一番便利だと思います。
キーが押されていることをスキャンする機能なのですが
これ、そうとうクセ強めです。
まず、MSXではキーマトリクスという表の概念があります。
キーボード上のそれぞれのキーを表としてあらわしているものです。
このキーマトリクスの行を指定してSNSMATを呼び出すと、押されたキーに該当するビットがOFFになってAレジスタに格納されて戻ってくる仕組みです。OFFですから0です。1じゃあないんです。
例えば、XとZが押されたか否かを調べたい場合は以下のような順序でSNSMATを呼び出します。
1. XとZはマトリクス行番号5(Y5)にあるので、5をAレジスタにセット
2. SNSMATのBIOSサブルーチンを呼び出す
3. AレジスタにX0-X7までのビットが並んだ1バイトがセットされる
Xが押されていたらAレジスタには 11011111B がセットされる
Zが押されていたらAレジスタには 01111111B がセットされる
XとZが同時に押されていたらAレジスタには 01011111B がセットされる
イメージできますか??
SNSMAT:equ $0141
; コーディング例
; キーボードの行番号5に対応するキーが押されているか調べる
; マトリクス表の行番号5にあるため、5をAレジスタに格納する
ld a, 5
call SNSMAT
; Aレジスタには行番号5(Y5)の、X0-X7 のキーに対応するビット列が
; 格納される
; キーが押されている場合、そのキーに該当するビットは0になる
;
; 例) Sキーが押されている場合
; Aレジスタには 11111110B がセットされる
; 例) Aキーが押されている場合
; Aキーは行番号5に該当しないため、Aレジスタには
; 11111111B がセットされる
まあ、なかなかクセ強めですがいっぺんにキーの状態を知ることができる機能なので便利です。使っていきましょう。
今回の記事で、ジョイスティックの入力状態、トリガ入力状態、キー入力状態を知ることができるようになりました。
次回は、今回のGTSTCKを使用してスプライトを動かしたいと思います。
では、また!