/ クレア工房 / 電子工作 / 雑記

MSX互換ジョイスティックポート

汎用シンセサイザLSIである AY-3-8910 (PSG), YM2203C (OPN), YM2608B (OPNA) には汎用I/Oポート端子があります。 デバイスメーカは特に使途を限定していませんが、 これらデバイスのI/Oポートは伝統的にジョイスティック用途に使うものとされており、 用途によっては注意を払う必要があります。

ATARI仕様とMSX仕様では電気的特性が異なりポート側に互換性がないこと、 AY-3-8910を採用したポートはおおむねMSX仕様を採用していると考えられること、 等からここではMSX互換ジョイスティックポートと題しています。

画像は1990年代(比較的末期)のメーカ製品における実装例です。 画像の9ピン端子の傍にTTLが実装されていることが判ると思います。 ジョイスティックポートの実装にサウンドチップ (画像の例ではYM2608) のI/Oポート端子がそのまま直結されているわけではなかったのです。 回路図が必要であればMSXテクニカルハンドブック等を参照してください。

MSXパソコンとは何ぞや? という方は、 1980年代に存在したゲーム機の一種だとお考えください。

ピン配置

MSX互換ジョイスティック

D-SUBコネクタを使います。 ジョイスティック側がメス端子、ポート側がオス端子です。 上・下・左・右・A・Bの各ボタン信号は10kΩでプルアップされます。

Pin Dir MSX Joystick Extended Joystick MSX Mouse Description
1 IN UP# UP# C# B0 ジョイスティックの場合は上ボタンが押されるとCOMMONに接続されるか、 またはプルダウンされるようにスイッチを配線します。 SELECTボタンが押された場合はUP#とDOWN#の双方をLとします。 4bit転送モードのときはbit0に対応します。
2 IN DOWN# DOWN# X# B1 ジョイスティックの場合は下ボタンが押されるとCOMMONに接続されるか、 またはプルダウンされるようにスイッチを配線します。 SELECTボタンが押された場合はUP#とDOWN#の双方をLとします。 4bit転送モードのときはbit1に対応します。
3 IN LEFT# LEFT# Y# B2 ジョイスティックの場合は左ボタンが押されるとCOMMONに接続されるか、 またはプルダウンされるようにスイッチを配線します。 RUNまたはSTARTボタンが押された場合はLEFT#とRIGHT#の双方をLとします。 4bit転送モードのときはbit2に対応します。
4 IN RIGHT# RIGHT# Z# B3 ジョイスティックの場合は右ボタンが押されるとCOMMONに接続されるか、 またはプルダウンされるようにスイッチを配線します。 RUNまたはSTARTボタンが押された場合はLEFT#とRIGHT#の双方をLとします。 4bit転送モードのときはbit3に対応します。
5 OUT +5V +5V +5V +5V 電源端子です。 50mAまで引っ張ることができます。 ジョイスティックポートはポリスイッチ等の便利な部品が無かったころの規格であり、 歴史的には過電流保護なんてものはありません。
6 I/O A# A# - TL# ジョイスティックの場合はAボタンが押されるとCOMMONに接続されるか、 またはプルダウンされるようにスイッチを配線します。 オープンドレインの技法を用いてPCから周辺機器に信号を伝えることができ、 PS/2ポートのように相互通信ができます。
7 I/O B# B# - TR# ジョイスティックの場合はBボタンが押されるとCOMMONに接続されるか、 またはプルダウンされるようにスイッチを配線します。 オープンドレインの技法を用いてPCから周辺機器に信号を伝えることができ、 PS/2ポートのように相互通信ができます。
8 OUT COMMON L H STB# ジョイスティックの場合は各ボタンの共通端子として0に固定されますが、 拡張ジョイスティックの場合はL=通常ボタン(UP/DOWN/LEFT/RIGHT)、 H=拡張ボタン(C/X/Y/Z)のように信号を切り替えるのに用いられます。 その他の機器の場合はストローブ信号として用いられ、 PC側から周辺機器側に信号(主にクロック)を伝えるために使われます。
9 GND GND GND GND GND 電源端子であり、基準電位です。

ATARI仕様ジョイスティック

ATARI仕様とMSX仕様は電気的に互換性がありません。 トリガーとして2ボタン以上備える国内製品のパッケージに 「アタリ」の文字がなかったのはそのためです。 参考までに、ATARIのピン配列は次のとおりです。

Pin Dir ATARI Joystick ATARI Paddle Description
1 - UP# - 上ボタンを押すとプルダウンされ、 ポートからは0が読み出されます。 押していないときは1になります。
2 - DOWN# - 下ボタンを押すとプルダウンされ、 ポートからは0が読み出されます。 押していないときは1になります。
3 - LEFT# BUTTON1# 左ボタンを押すとプルダウンされ、 ポートからは0が読み出されます。 押していないときは1になります。
4 - RIGHT# BUTTON2# 右ボタンを押すとプルダウンされ、 ポートからは0が読み出されます。 押していないときは1になります。
5 - - POT1 パドル1のボリュームを結線します。 (MSX互換ではパドル側にワンショットタイマ回路を内蔵する仕様のため、回路が大きく異なります)
6 - FIRE# - ボタンを押すとプルダウンされ、 ポートからは0が読み出されます。 押していないときは1になります。
7 - VCC VCC パドルコントローラのアナログボリュームをプルアップするための電源です。 (MSX互換とは異なります)
8 - GND GND ボタンの基準電位です。 (MSX互換とは異なります)
9 - - POT2 パドル2のボリュームを結線します。 (MSX互換ではパドル側にワンショットタイマ回路を内蔵する仕様のため、回路が大きく異なります)

プロトコル

デジタル・ジョイスティック

MSXジョイスティックを読む場合は単なるパラレルポートですから、 アドレスを指定して読み出しておしまいです。 スイッチ配線だけでは実装できない余計なボタンの付いたジョイスティックが出現したのは FM TOWNSの登場以後のことだと思いますので、 多ボタン系のジョイスティックについてはFM TOWNS系の文献を当たれば良いかと思います。

AボタンとBボタンは双方向性の信号で、 単なる入力ではありませんので注意を要します。 回路として実装する場合は単なる入力でも実用上支障はないと思われるところですが、 SHARP X68000ですら双方向通信機能を実装していたようですので、 当時としてはそれが基本機能だったのかも知れません。

アナログ・ジョイスティック

アナログジョイスティックは、 スティックの値に応じて時定数の変わるワンショットタイマを叩いて、 信号が戻るのにかかった時間を測定することでアナログ値を得ます。

しかしながら、 ジョイスティックポートにおいて時間を計測するのに具合のよい割り込み機構は存在しません。 メインCPUの割り込みを止めてミリ秒単位でスピンするというのは、 FM音源ドライバを設計するという立場から見ると御免こうむりたい相談ではあります。

マウス

MSXマウスを読む場合は、 4bitある入力データ信号とストローブ信号(コモン端子)を使って4bit信号を2つ受け取り、 8bitに合成して-128から+127のsigned charとするのが基本的な考え方です。 ストローブをトグルすることが「次のデータをよこせ」という意味になります。 これをX軸とY軸について適用して相対座標を得ます。

マウスドライバは60Hz程度のタイマ割り込みで間欠的に読み出す実装とするのが通例です。 適当に時間を空けることがプロトコル上のリセット動作になるという仕様で良い訳です。

レジスタ

AY-3-8910の汎用I/OポートA, Bの入出力モードはいずれもソフトウェア制御ですが、 ハードウェアの都合で方向が固定されます。 I/OポートAは常に入力、I/OポートBは常に出力とします。

Port Bit Name Description
A 0 UP# 上ボタンです。データセレクタを介してジョイスティックのピン1に対応します。
A 1 DOWN# 下ボタンです。データセレクタを介してジョイスティックのピン2に対応します。
A 2 LEFT# 左ボタンです。データセレクタを介してジョイスティックのピン3に対応します。
A 3 RIGHT# 右ボタンです。データセレクタを介してジョイスティックのピン4に対応します。
A 4 A# Aボタンです。データセレクタを介してジョイスティックのピン6に対応します。
A 5 B# Bボタンです。データセレクタを介してジョイスティックのピン7に対応します。
A 6 - MSXではキーボードを拡張するために用いられたようです。 MSXを再現するのでない限り無配線(CMOSの場合は外部プルアップ)で良いと考えます。
A 7 - MSXではカセットテープ(CMT)に用いられたようです。 MSXを再現するのでない限り無配線(CMOSの場合は外部プルアップ)で良いと考えます。
B 0 - オープンドレインバッファを介してジョイスティック1のピン6に配線します。 平常時は1(Hi-Z)に固定します。 ハンドシェイク用として定義された信号のようですが、 ジョイスティック用にはまず使いませんので、 実用上は無配線でも支障はないでしょう。
B 1 - オープンドレインバッファを介してジョイスティック1のピン7に配線します。 平常時は1(Hi-Z)に固定します。 ハンドシェイク用として定義された信号のようですが、 ジョイスティック用にはまず使いませんので、 実用上は無配線でも支障はないでしょう。
B 2 - オープンドレインバッファを介してジョイスティック2のピン6に配線します。 平常時は1(Hi-Z)に固定します。 ハンドシェイク用として定義された信号のようですが、 ジョイスティック用にはまず使いませんので、 実用上は無配線でも支障はないでしょう。
B 3 - オープンドレインバッファを介してジョイスティック2のピン7に配線します。 平常時は1(Hi-Z)に固定します。 ハンドシェイク用として定義された信号のようですが、 ジョイスティック用にはまず使いませんので、 実用上は無配線でも支障はないでしょう。
B 4 STB1 ジョイスティック1のピン8に配線します。
  • 旧来のMSXデジタルジョイスティックを読むときは、単に0を出力してプルアップ抵抗から電流を吸い込むために使います。
  • X/Yボタンの付いた拡張ジョイスティックを読むときは、読むボタンを切り替えるために使います。
  • MSXアナログジョイスティックを読むときは、 0から短時間だけ1を与えてジョイスティック側に内蔵された ワンショットタイマ回路を起動し、 入力ポート側で1から0に戻るまでの時間を測ります。 10μsから3msまでの間に制限されています。
B 5 STB2 ジョイスティック2のピン8に配線します。
  • 旧来のMSXデジタルジョイスティックを読むときは、 単に0を出力してプルアップ抵抗から電流を吸い込むために使います。
  • X/Yボタンの付いた拡張ジョイスティックを読むときは、 読むボタンを切り替えるために使います。
  • MSXアナログジョイスティックを読むときは、 0から短時間だけ1を与えてジョイスティック側に内蔵された ワンショットタイマ回路を起動し、 入力ポート側で1から0に戻るまでの時間を測ります。 10μsから3msまでの間に制限されています。
B 6 SEL ポートAで入力の対象とするジョイスティックを選択します。 データセレクタを駆動するのに使用します。 0=ジョイスティック1、1=ジョイスティック2。
B 7 LED# MSXではカナロックLEDを点灯させるのに用いられたようです。

応用

ハードウェア的には完全に廃れてしまった過去の仕様ですが、 なかなか奥が深い設計がされていたことがわかります。

USB OTGを実装するのはそれなりに骨が折れることですから、 マイコンに4bit〜6bit以内の簡易なHIDを外部接続する規格としては MSX互換ジョイスティックの考え方は有用です。 マウスやキーボードの操作は足りないピン数を無理やり使っている感が否めず、 別途専用の規格を使うのが良いと思います。

参考文献


Copyright © 2014, 2018 clare. All rights reserved.