MSX Datapack wiki化計画

5章 汎用入出力インターフェイス

 1章でも説明したように、MSXの使用しているPSGは、音声出力の機能とは別にポートAとポートBという2つの8ピット入出力ポートを持っています。MSXはこの2つのポートを汎用入出力インターフェイス(いわゆるジョイスティックポート)に接続して、ジョイスティックやマウスなどの装置とのデータ入出力に利用しています(図6.19)。この汎用入出力インターフェイスに接続される各種の装置は、それぞれ専用のBIOSルーチンが用意されており、手軽にアクセスすることができます。
 ここでは、各入出力装置の機能とBIOSルーチンによるアクセス法について説明します。

図6.19 汎用入出力インターフェイス

 5.1 ポートの機能

 PSGの2つの入出力ポートは、図6.20のように利用されています。

図6.20 PSGのポートAとポートBの機能

 5.2 ジョイスティックの使用法

 ジョイスティックの回路を図6.21に示します。この回路からわかるように、8番端子に「0」を出力し、1〜4、6〜7の端子を読み出せば、スティックとトリガボタンの情報は得られますが、将来に渡る互換性を考慮すると、ジョイスティックのアクセスはやはりBIOSを利用して行う方が安全です。
 ジョイスティックをアクセスするためには、以下に示すBIOSルーチンが用意されています。なお、これらのルーチンはBASICのSTICK関数やSTRIG関数とほぼ等しい機能を持っているもので、ジョイスティック以外にカーソルキーやスペースキーの状態をリアルタイムで読み取ることも可能です。

図6.21 ジョイスティック回路図

GTSTCK(00D5H/MAIN)
機能

ジョイスティックの状態を読み出します。

コール手順

Aジョイスティック番号
0 カーソルキー
1〜2ジョイスティック
戻り値
Aジョイスティックまたはカーソルキーの押された方向
変更レジスタ

すべて

解説

現在のジョイスティックまたはカーソルキーの状態をAレジスタに返します。値はBASICのSTICK関数と同じです。

GTTRIG(00D8H/MAIN)
機能

トリガボタンの状態を読み出します。

コール手順
Aトリガボタン番号
0 スペースキー
1〜2トリガボタン
(マウスの場合は1〜2がポート1、2の左ボタン、3〜4が右ボタン)
戻り値
Aトリガボタンまたはスペースバーの状態
0FFH押す
00H 離す
変更レジスタ

AF

解説
現在のトリガボタン、またはスペースキーの状態をAレジスタに返します。この値はトリガが押されていれば0FFH、押されていなければ0となります。

サンプルプログラム「JOYSTICK.MAC」を参照して下さい。

 5.3 パドルの使用法

 パドルの回路例は図6.22のとおりです。8端子にパルスを送ると単安定マルチバイブレータは、ある時間幅のパルスを発生します。この幅は可変抵抗の値によって10μs〜3msの範囲で変化しますので、パルス長を測定すれば可変抵抗の値、ひいてはその回転角度を知ることができます。

図6.22 パドル回路図

パドルをアクセスするためのBIOSルーチンを次に示します。

GTPDL(00DEH/MAIN)
機能

パドル情報の状態を読み出します。

コール手順

Aパドル番号(1〜12)
戻り値
Aパドルの回転角(0〜255)
変更レジスタ

すべて

解説

Aレジスタで指定したパドルの状態を調べ、結果をAレジスタに返します。

 5.4 タッチパネル、ライトペン、マウス、トラックボールの使用法

 タッチパネル、ライトペン、マウス、トラックボール(キャット)はすべて同一のBIOSを用いてアクセスすることができます。その使い方を以下に示します。

GTPAD(00DBH/MAIN)
機能
各種入出力装置の状態を読み出します。
コール手順

A装置ID(0〜19)
戻り値
A目的の情報
変更レジスタ

すべて

解説
Aレジスタで指定する値によって、表6.7のような各種の情報を得ることができます。これはBASICのPAD関数とまったく同じです。表中「XXX1」は、汎用入出力インターフェイス#1に接続した「XXX」の装置であることを意味します。同様に「XXX2」は汎用入出力インターフェイス#2に接続したものです。
サンプルプログラム「PAD.MAC」、「MOUSE.MAC」を参照して下さい。

表6.7 GTPADのBIOSで得られる情報

装置ID指定される装置返ってくる情報
0 タッチパネル1 パネル面に触っていれば0FFH、いなければ00H
1 X座標(0〜255)
2 Y座標(0〜255)
3 ボタンが押されていれば0FFH、いなければ00H
4 タッチパネル2 同上
5
6
7
8 ライトペン *10FFHであればデータは有効、00Hであれば無効
9 X座標(0〜255)
10 Y座標(0〜255)
11 スイッチが押されていれば0FFH、いなければ00H
12 マウス1、またはトラックボール1
*2 *3 *4
つねに0FFHを返す(入力の要求に使用)
13 X座標(0〜255)
14 Y座標(0〜255)
15 つねに00Hを返す(無意味)
16 マウス2、またはトラックボール2同上
17
18
19
*1ライトペンの座標(A=9、10)とスイッチ(A=11)の情報は、A=8としてBIOSをコールしたとき同時に読み込まれますが、その結果が0FFHのときにのみ、他の値が有効となります。A=8としてBIOSをコールした結果が00Hの場合は、その後に得られる座標値やスイッチの状態は意味を持ちません。
*2マウスとトラックボールは自動的に判別します。
*3マウスやトラックボールの座標値を求める場合、まず入力要求のコール(A=12またはA=16)を行い、その後に実際に座標値を求めるコールを実行する、という手順をふみます。このとき2つのコールの時間間隔はできる限り小さくしなければなりません。入力要求から座標の入力までに必要以上に時間をかけると、得られたデータは保証できません。
*4マウスまたはトラックボールについているトリガボタンの状態を得るためには、GTTRIG(00D8H/MAIN)を使って下さい。