ハードウェア概要
1984年に英Amstrad社から発売されたZ80ベースのパソコン。Sinclair社のZX Spectrumと共に、80年代のイギリスや西欧でヒットしたパソコンである。標準のフロッピーディスクは3インチ1であり、おそらくはこのディスクの最大消費アーキテクチャである。
- 1
日立による規格で、3.5インチディスクと違いシャッターはついていない。日本では1983年に発売されたX1Dに採用されたことで知られる。
コントローラ端子の特徴
本機はコントローラ端子を1つもっている。かつてGrimwareに掲載されていた図面(リンク先はミラー。オリジナルのURLはhttp://www.grimware.org/doku.php/documentations/hardware/amstrad.cpc464)や、CPCWikiの説明によれば、回路及びピンアウトは以下の通り。

pin# |
Function |
---|---|
1 |
Digital in / Digital out |
2 |
Digital in / Digital out |
3 |
Digital in / Digital out |
4 |
Digital in / Digital out |
5 |
Digital in / Digital out |
6 |
Digital in / Digital out |
7 |
Digital in / Digital out |
8 |
COMMON 1 |
9 |
COMMON 2 |
コモン端子が2つあるが、ジョイスティックを2つ接続するために利用される。Amstrad純正のジョイスティックには2台目のジョイスティックを接続するための増設コネクタがついている。この増設コネクタは本体側コネクタに対してピン8と9がクロス結線となっており、ここに(ピン8をコモン端子とする)別のジョイスティックを接続すると、本体側は2台のジョイスティックを読みとることができるようになる23。したがって、CPCで使用可能なジョイスティックはピン8のみをコモン端子として利用するもののみである。
- 2
ジョイスティック1の検出を行うときはピン8をL、ピン9をHにし、ジョイスティック2の検出を行うときは逆にピン8をH、ピン9をLにする。
- 3
ただ、CPCWikiのジョイスティック修理のページによれば、純正ジョイスティックは1ボタンのみのサポート(2ボタンのモデルもあるが両ボタンはどちらもピン6)で、増設ジョイスティック用のコネクタもサポートされるのは1ボタンジョイスティックのみのようだ。
信号ピンの数は7つであり、2ボタンジョイスティックのボタンはピン6と7を使用する。
ハードウェア実装
本機のジョイスティック端子は、PSGコントローラであるAY-3-8912のI/Oポートと、3chパラレルI/Oコントローラのインテル8255を利用して実装されている(AY-3-8912自体もi8255経由で制御される)。AY-3-8912のI/Oポートの制御方法は「PSG音源の利用」を参照のこと。i8255のI/OポートAはZ80のI/Oアドレス$F4**に、I/OポートCはZ80のI/Oアドレス$F6**にアサインされている。
上記回路図の通り、コントローラ端子からの読み取りは以下の通りキーボード読み取りと同じやりかたで行う4。
I/Oアドレス$F7**に$82を書き込み、ポートAとCを出力設定にする
I/Oアドレス$F4**に$0Eを書き込み、ポートA経由でAY-3-8912のデータバスに値$0Eを送る
I/Oアドレス$F6**に$C0を書き込み、AY-3-8912のBC1およびBDIRの双方をHにする。この結果、2.でAY-3-8912のデータバスに入力された値$0EがAY-3-8912のレジスタとして処理される。
I/Oアドレス$F6**に$00を書き込み、AY-3-8912のデータバスをハイインピーダンスにする
I/Oアドレス$F7**に$92を書き込み、ポートAを入力設定にし、ポートCを出力設定にする
I/Oアドレス$F6**に$49(2番目のジョイスティックを読み取るときは$46)を出力する。これにより、ポートAの読み取りによってジョイスティックの状態を知ることができるようになる
I/Oアドレス$F4**を読み取る
I/Oアドレス$F7**に$82を書き込み、ポートAとCを出力設定にする
I/Oアドレス$F6**に$00を書き込み、AY-3-8912のデータバスをハイインピーダンスにする
で読み取った8ビットのデータのうち下位7ビットから以下のように各ピンの状態を判断することができる。(L=0、H=1)
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
---|---|---|---|---|---|---|
Pin5 |
Pin7 |
Pin6 |
Pin4 |
Pin3 |
Pin2 |
Pin1 |
コントローラ端子の出力については、以下の通りとなる(たぶん)。
I/Oアドレス$F7**に$82を書き込み、ポートAとCを出力設定にする
I/Oアドレス$F4**に$0Eを書き込み、ポートA経由でAY-3-8912のデータバスに値$0Eを送る
I/Oアドレス$F6**に$C0を書き込み、AY-3-8912のBC1およびBDIRの双方をHにする。この結果、2.でAY-3-8912のデータバスに入力された値$0EがAY-3-8912のレジスタとして処理される。
I/Oアドレス$F6**に$00を書き込み、AY-3-8912のデータバスをハイインピーダンスにする
I/Oアドレス$F6**に$8A~$8Fのいずれかを出力する。これにより、ポートA経由でピン1~7にデータを送信することができるようになる
I/Oアドレス$F4**に送信するデータを書き込む。各ビットとピンとの対応は上記表の通り。ビット7は多分Hにしておいた方がよさそう。
I/Oアドレス$F6**に$00を書き込み、AY-3-8912のデータバスをハイインピーダンスにする