たまりば

  パソコン・インターネット パソコン・インターネット  三鷹市 三鷹市

Atari2600詳細
2015年04月13日 01:20

アタリショックで有名なAtari2600。
フェアチャイルドチャンネルFに続くカートリッジ交換式ゲーム機であり、ファミコンの前世代機としてアメリカで流行していたらしい。
日本では流行らなかったため日本語での情報が少ないのが残念だ。とりあえず日本語で一番詳しくなるくらいに仕様をまとめてみる。
性能が分かりやすいよう、日本人に馴染みの深いファミコンとの比較を各所に入れた。

スペック

・CPU
6507、1.19MHz
この6507というCPUは6502の機能削減版で、割り込みが存在しないことと、メモリ領域が6502の64KBに対し8KBしかない点が違いである。
ファミコンのCPUもBCD演算が無い他は機能は6502と同一なので単純に比較すると、ファミコンは1.79MHzなので、演算性能はファミコンの2/3と言えそうだ。
が、Atari2600はファミコンと違い画面の描画にCPUを使うため、実質的に使用できるCPU時間は非表示期間中のみである。
Atari2600の一般的な解像度は縦192pxなので、262-192=70と、1/4程度の時間しか演算に使えない。
ファミコンは単純な(ラスタスクロールなどしない)静止画を表示する分にはCPUを使わないので、これと比較すると演算性能はファミコンの1/6程度とも言える。
なおAtari2600も画面の描画を止めればCPU時間を演算に割くことができる。
例えば「Vedeo Chess」ではAIの思考中は画面がチカチカする単色になる。
https://www.youtube.com/watch?v=wdpRDYQgm84

・メモリ
ワーキングRAM128バイト、VRAM数バイト
ファミコンはワーキングRAMが2KB、VRAMが2KBである。
ワーキングRAMが6502の高速なゼロページ領域に収まっているのでちょっと嬉しい。
なおワーキングRAMは6502のスタック用の1ページにも重複してマッピングされているという面白い構造。
128バイトでは少ないということでカートリッジ側に128バイトや256バイトのRAMを積むこともあったようだ。

画面表示

・解像度
横解像度は回路で決まっており、160ドットである。
問題は縦で、(NTSCでは)192pxという値がよく見られるが、これはこの値が多くのゲームで使われているとか、この値が推奨されている程度の意味だろう。
Atari2600の画面描画の特徴として、メモリには常に走査線1ライン分の情報しか持っていない。
そこで、1ラインごとに、HBLANKの間にメモリ上の情報を書き換えて画面を作るのが基本の操作となる。描画中に何もしなければ縦線しか描けない。
つまり、縦方向にどれだけの長さ描画するかはプログラムによって決まる。
これより、NTSCの規格上許されている最大値をAtari2600の縦解像度の値とするのが妥当だろう。
(規格外の走査線数を出力することすら可能だが、さすがにそれは考えないことにする)
NTSCの規格上、映像信号を入れられるのは1フィールドあたり242.5ラインだが、NTSCの規格は2フィールドを半ラインずらすことになっているのをAtari2600などのゲーム機はずらしていないので、242pxとなる。

なおこの192pxというのは242の約79%にあたる。
横方向の160pxは44.7μ秒ほどで、描画期間約53.4μ秒の83.5%ほど。
当時のTVで画面内に表示できる範囲はこの程度だったのであろう。

さてではこの160×242ドットに自由に絵が描けるかというとそうではない。
画面構成は後述するが、1ドット単位で絵を作れる構成要素は「オブジェクト」という、今で言うスプライトのみである。
ファミコンのスプライトに横8枚制限があるのと同様、Atari2600もオブジェクトだけで画面全体を覆うことはまず不可能である。(たぶん本当に不可能だと思うが自信がない。後述)
もう1つの構成要素としてPlayFieldという今で言う背景面のようなものがあるが、こちらは横解像度が40px、つまり160pxの画面に対し4pxごとにしか絵を描けない。
これにより、Atari2600の画面はやけに解像度の低い背景の上にキャラクターがぽつぽつと置かれている独特な見た目になる。
ただし、横は4ドット単位だが縦方向には1ドットごとに絵を書き換えられるため、上手いプログラムでは巧妙に横方向の解像度の低さを感じさせない絵柄を作っている。
例えば「Pitfall!」の穴や木の表現が上手い。
Atari2600 Pitfall!

・画面構成
BackGround:
以降の全てが無い部分の色

PlayField:
今で言う背景面
単色。(Scoreモードでない場合)
横解像度40px。
拡大縮小やスクロールなどの機能は無い。
「Scoreモード」では左右それぞれがPlayer0/1と同色で表示される。

オブジェクト:
今で言うスプライト。3種類5個のオブジェクトがある。
Player0 / Player1
横8px、それぞれ単色。
一定間隔の2個または3個に増殖したり横幅2倍・4倍で表示する機能あり。
具体的には、以下の8通り。2倍幅2個などといった自由な組み合わせはできない。
Atari2600 Playerの表示パターン
4倍幅モードでは横32pxと画面横幅の1/5。2つのPlayerで計2/5。ファミコンではスプライト上限横8個で画面の1/4なので、巨大キャラを動かすことについてはファミコンに優っていると言えなくもない。
(まあファミコンなら背景面を使うところだが)

Missile0 / Missile1
横1px
横幅2・4・8倍表示が可能
対応するPlayerと同色
個数・間隔もそれぞれのPlayerと同じ

Ball
横1px
横幅2・4・8倍表示が可能
色はPlayFieldと同色
増殖はしない

・発色数
扱える色は、オリジナルのNTSC版では
(15色相+無彩色)×明度(?)8段階 = 128色
PAL版では色信号の周波数が約15/12倍である関係か、
(12+無)×8=104色
と少々少ないが、どちらもファミコンの54色と比較すると多い。
SECAMでは仕組みが全く違い明度に対応したデジタル8色のみ。

なお「明度」と書いたが、彩度も連動して変わるかもしれない。(ファミコンがそうであるように)

同時発色数は、1ライン中に同時に出せる色は基本的には以下の4色である。
・BackGround
・PlayField・Ball
・Player0・Missile0
・Player1・Missile1
ただしライン中にレジスタを書き換えればこの限りではない。
例えばAcidDropというゲームがあり、横1列に色違いの7区画+両端の色を表示している。
https://www.youtube.com/watch?v=5Po47y0ALpU
また、頑張れば下図のように横15色も可能である。
Atari2600 1列に15色

なお縦方向には制限はないので、ファミコンと違い画面中同時発色数は扱える全ての色128色が出力可能。縦方向のグラデーションはAtari2600の特徴である。

・オブジェクトの横位置の指定
現代の感覚で考えれば、オブジェクトのX座標をレジスタに指定するとその位置に書いてくれる仕組みがあると思うだろう。
否、そんな軟弱な仕組みではない。
走査線を描画中にここぞというタイミングで各オブジェクトのリセットレジスタに書き込むことで、その地点のX座標に(次ラインから)オブジェクトが表示されるようになるのである。

とはいえCPUの1クロックは画面上の3ドットに相当する。また時間調整のためのループは最短で1周に5クロックが必要であり、都合15ドットごとにしか書込みができない。
そこで微調整機能が用意されている。
5種のオブジェクト(Player0, Player1, Missile0, Missile1, Ball)それぞれについて横位置の差分を登録し、HMOVEレジスタに書き込むことで次ラインでの表示位置がその値だけずらせる。
これが+7~-8まで設定できるので、任意の位置にオブジェクトを表示することが可能となる。
またBallやMissileを表示したままラインごとにHMOVEをすることで斜めの線が表示できる。上のPitfall!の画像にもある。ファミコンにはできない芸当だ。
なおこのHMOVEへの書込みを行うと、次ラインの左端8ドットが黒になるという妙な仕様があり、これによる櫛状の横線がAtari2600の画像の特徴となっている。

高等技術

プログラミング技術が成熟するにつれ、走査線の描画中にレジスタ内容を書き換えることで同時表示内容の限界を超えるテクニックが使われるようになる。

・PlayField内容の書き換え
実は上で横40pxと言ったもののデータは20px分しか無く、1ライン中何もしなければ右半分が左半分と同じか、あるいは左半分を左右反転させたもので表示される。
横40pxをフルに使うにはライン中の書き換えが必須である。
なおこれは最初から想定されていた操作だろう。PlayFieldのScoreモードはライン中書き換えを前提としている。

・Player内容の書き換え
Playerを複数表示モードにした状態で、1つ表示された後に内容を書き換えると、2つ目に別の内容を表示できる。
これを最大限に駆使すると、Player0/1を3つづつ交互に並ぶようにして横48pxに自由に絵が描ける。
ただし、このためにはメモリ(レジスタ)へ4回の書込みが必要になる。(CPUのレジスタとメモリにマップされたレジスタが紛らわしいな…)
6502では(CPUの)レジスタからメモリへの書込みが最速で3クロック掛かる。画面のドット数で言うと9ドット分である。
[--P0--][--P1--][--P0--][--P1--][--P0--][--P1--]
        ^P0      ^P1      ^P0      ^P1
このように、猶予は4ドット分しか無く、書込み以外の操作を入れる余裕は無い。
かつ、6502での最速の書込みはレジスタが3つしか無いため3連続が限度である。
よって普通にはこの表示はできないことになる。

この状況を打破するためには裏レジスタを使う必要がある。
裏レジスタを理解するには、Vertical Delay(垂直遅延)機能の理解が必要である。
この機能を有効にすると、Player0/1の書き込みはそれぞれの裏レジスタになされ、他方への書き込みを契機に表レジスタに移される。
つまり、Player0/1の内容の書込みを他方への書込みまで遅延させるという動作をする。
「Vertical」Delayの名は、1ラインごとにPlayer0と1へ交互に書き込む場合に1ライン分縦に遅延することになることによる。
通常の使い道としては、Player0と1を両方1ラインごとに書き換えるのは処理が重いため、1ライン置きで交互に書き換えるようにしたとき、縦位置がずれないように使うものだろう。

これを利用して、P0,P1両方の遅延を有効にし、非表示期間中にPlayer0,1に加えPlayer0の裏レジスタに表示内容を入れておく。
すると、
非表示期間:
lda A
sta P0 ;      P0裏=A
lda B
sta P1 ;P0=A, P1裏=B
lda C
sta P0 ;P1=B, P0裏=C
lda D
ldx E
ldy F
描画中:
sta P1 ;P0=C, P1裏=D
stx P0 ;P1=D, P0裏=E
sty P1 ;P0=E, P1裏=F
sta P0 ;P1=F, P0裏=D(表示されないのでstxでもstyでもよい)
このように最速での4連続書込みが可能となる。

・オブジェクト増殖
通常はリセットレジスタに書き込んだ次のラインからオブジェクトが表示されるのだが、Playerの2個・3個表示モードでは頭の1つを除いて同ラインに表示できる。またBallも同ラインから表示される。
これを利用して、ライン中に複数回リセットをすることで1ライン中に複数個のPlayerを表示できる…らしい。
これを使えばひょっとして画面を完全にオブジェクトで覆うこともできたりするのだろうか。恐らくは処理時間が足りず不可能だと思うが、この動作についてはいまいち仕様が理解できていないため自信がない。仮にできても意味のある絵を表示するのは困難だろう。
この動作については下記「TIA Hardware Notes」が詳しいので気になる人はこれにあたってほしい。

その他機能

・音源
数種類のノイズと中途半端な音程の矩形波を出せるチャンネルが2チャンネル。
あまり興味が無いので説明は割愛する。
「Tone Toy」というHomebrewなソフトがあるので試してみると楽しいだろう。
https://www.youtube.com/watch?v=Zco1hnyDiVI

・衝突検知
ファミコンにも0番スプライトと背景面の衝突判定があるが、Atari2600ではPlayField, Ball, Player0/1, Missile0/1の6つの物体の全ての組合せ15通りについて衝突判定ができる。
6502の「BIT」命令で読みやすいよう6,7bit目が立つ。

・タイマー
ファミコンにもあれば良かったのに…。

参考文献

ネット上でいろいろと探した気がするが、結果的に以下の2つにだいたい全てまとまっていた。
Atari 2600 Specifications http://problemkaputt.de/2k6specs.htm
Atari 2600 TIA Hardware Notes http://www.atarihq.com/danb/files/TIA_HW_Notes.txt

  • 同じカテゴリー(ゲーム機)の記事画像
    ゲームボーイの吸い出し機を作った (後編)
    ファミコンで全画面に任意の画像(ただしモノクロ)を表示
    ゲームボーイ始めました。
    Atari2600はじめました。
    GBAはじめました。
    Cボタンユニット七変化
    同じカテゴリー(ゲーム機)の記事
     ゲームボーイの吸い出し機を作った (後編) (2017-01-16 22:44)
     ファミコンで全画面に任意の画像(ただしモノクロ)を表示 (2017-01-14 00:00)
     ゲームボーイ始めました。 (2015-03-28 13:04)
     Atari2600はじめました。 (2015-03-24 01:19)
     GBAはじめました。 (2015-03-23 02:04)
     Cボタンユニット七変化 (2015-03-19 01:56)
    Post time : 2015年04月13日 01:20│Comments(0)ゲーム機
    URL欄を実験的に消してる間に廃止されてしまいました。まあいいか。
     
    <ご注意>
    書き込まれた内容は公開され、ブログの持ち主だけが削除できます。
    削除
    Atari2600詳細
      コメント(0)