ATARI 8bit Computers(1979)
- 公開日: 2020/07/23
- 更新日: 2020/07/24
ハードウェア概要
Atari社が1979年から80年代に掛けて販売していた8ビットコンピュータ。同時代のAppleIIやCommodore64と同様、CPUにMOS6502を使用している。
当初のモデルはメモリ4KBのATARI 400と8KBのATARI 800。その後1983年にXLシリーズ、1985年にXEシリーズ、1987年にキーボードを外付けにしたXE Game Systemが登場している。初代の400と800はコントローラ端子が4つもついているのが大きな特徴。M.U.L.E.[1]という傑作ゲームを生む土壌となった。XLシリーズ以降はコントローラ端子は2つに減らされている。
コントローラ端子の特徴
本機のコントローラ端子のピンアウトは以下の通り。
pin# |
Function |
---|---|
1 |
Digital in / Digital out |
2 |
Digital in / Digital out |
3 |
Digital in / Digital out |
4 |
Digital in / Digital out |
5 |
Analog in |
6 |
Digital in |
7 |
VCC |
8 |
GND |
9 |
Analog in |
ピン1〜4はピンごとにデジタル入力とデジタル出力を切替可能である。また、ピン1〜4、6は本体内でプルアップされている。ATARI VCSとは異なり、ピン5,9はアナログ入力専用である[2]。ピン6は通常の検出モードとエッジ検出モードのいずれかを選択可能である(後述)。
ただし、コントローラ内部でのプルアップ抵抗の大きさを1MΩよりも十分小さくすることで、デジタル入力を擬似的に検出することも可能である(後述)。
ハードウェア実装
AtariAgeに記載のATARI 800の回路図からコントローラ端子周りを抜粋したものを下図に示す。
コントローラ端子はCPU(MOS6507)の周辺チップであるMOS6520(通称PIA)と、サウンド/キーボードコントローラであるPOKEY(C012294)と、ビデオコントローラであるCTIA(Color Television Interface Adapter, 型番C012295)[3]のI/Oポートを使って実装されている。
XL以降の機種ではCTIAの代わりにGTIA(Graphic Television Interface Adapter)が利用されている。型番はNTSC版がC014805、PAL版がC014889、SECAM(フランス)版がC020120となる。
コントローラ端子1、2のピン1〜4はPIAのI/OポートPA0〜7に接続されている。また、コントローラ端子3、4のピン1〜4はPIAのI/OポートPB0〜7に接続されている。PA0〜7は内部でプルアップされているので、当該ポートとコントローラ端子のピンは直接接続されている。PB0〜7については、PIA内部のプルアップ電圧が2.4Vと低い為[4]別途プルアップ回路を追加している。
コントローラ端子のピン6はCTIAの信号入力ポートT0〜3に接続されている。 また、ピン5、9はPOKEYの信号入力ポートP0〜7にRC回路を介して接続されている。
制御方法
Altirra Hardware Reference Manualによれば、各ピンの制御方法は以下の通りである。
ピン1〜4については、アドレス$D300(PORTA, コントローラ端子1、2)、$D301(PORTB, コントローラ端子3、4)を使用して信号の入出力を行う。ビットはHレベルの時が1、Lレベルの時が0である。
port# |
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
---|---|---|---|---|---|---|---|---|
D300 (R/W) |
Read / Write / Check Direction / Set Direction for PA |
|||||||
PA7 |
PA6 |
PA5 |
PA4 |
PA3 |
PA2 |
PA1 |
PA0 |
|
D301 (R/W) |
Read / Write / Check Direction / Set Direction for PB |
|||||||
PB7 |
PB6 |
PB5 |
PB4 |
PB3 |
PB2 |
PB1 |
PB0 |
信号の出力を行う場合は以下の手順となる。
コントローラ端子1、2であればアドレス$D302(PACTL)、コントローラ端子3、4であればアドレス$D303(PBCTL)のビット2に0を書き込む
アドレス$D300又は$D301に書き込みを行う。0なら入力モード、1なら出力モード。また、このアドレスを読むことで各ピンが入力モードか出力モードかを確認することができる
コントローラ端子1、2であればアドレス$D302、コントローラ端子3、4であればアドレス$D303のビット2に1を書き込む[5]
アドレス$D300又は$D301に出力するデータを書き込む
信号入力受付を開始する前にもこのプロセスを実行する
ピン5、9はPOKEY経由で読み取る。手順は以下の通り。
アドレス$D20F(SKCTL)のビット2に0を書き込む
アドレス$D20B(POTGO)に書き込みを行う
画面の228ライン描画(約14.5ミリ秒)待つ
アドレス$D200(POT0)〜$D207を読み出す。読み出した値は1〜228(xE4)であり、1が最も抵抗値が大きい(パドルホイールを最も反時計回りに回した状態)ことを示し、228が最も抵抗値が小さい(パドルホイールを最も時計回りに回した状態)ことを示す。
1.の前にアドレス$D20F(SKCTL)のビット2に1を書き込むと、高速スキャンモードとなり、2.の待機時間を2ライン分まで減らすことができる。ただしPOT0〜POT7の値は不正確となる。3.、4.の代わりに、周期的にアドレス$D208(ALLPOT)を読み込んで、各ビットが1から0になる時間を計測してもよい。
port# |
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
---|---|---|---|---|---|---|---|---|
D208 (R) |
Status of Port P0-P7 (1: Charge in Pregress, 0: Charge Finished) |
|||||||
P7 |
P6 |
P5 |
P4 |
P3 |
P2 |
P1 |
P0 |
CX-21/23/50キーボード 等、ピン5,9をデジタル入力として想定しているコントローラを使うことも可能である。キーボードの場合、プルアップ抵抗が4.7kΩとパドルのそれ(1MΩ)よりも充分に小さいため、ピン5,9に対応するスイッチがオフの場合はPOT0〜7は大きな値を取る。一方スイッチがオンになってGNDと短絡すると、キャパシタへ電荷が蓄積されないためPOT0〜7は小さな値を取る。
ピン6はアドレス$D010(TRIG0)、$D011(TRIG1)、$D012(TRIG2)、$D013(TRIG3)のビット0を読むことで検出できる。ビット0が1であればHレベル、0であればLレベルである。エッジ検出モードのオン/オフは、アドレス$D01Dのビット2で指定する。通常の検出モードの時は、0、エッジ検出モードの時は1を書き込む。
また、ピン6ではライトペン入力に用いられる。この機能についてはライトペンのページを参照のこと。