アタリ・ポンの回路

アタリのポンは1972年に発表された。設計者はアラン・アルコーン。

汎用CPUがない時代なので(intelの8008が1972年)TTLロジックで構成されている。

オブジェクトの移動、当たり判定、得点表示、フィールド描画等をすべて論理回路で実現している。

ポンの回路を解析している人がいてその説明からどのようにゲームを実現しているか見てみる。

参考にしたpdfファイル。

http://www1.cs.columbia.edu/~sedwards/papers/edwards2012reconstructing.pdf

ポンは

  • 二人用ゲーム
  • パドルを操作してボールを打ち合い相手がミスをしたら得点

という単純なもの。ゲーム画面は

Wikipediaポンより

画面から

  • 左右にプレイヤーが操作するラケットがあり上下に移動する
  • ボールはラリーによって左右に移動する
  • 画面上部に得点が描画されている
  • 画面中央にセンターラインが引かれている

となっている。

目次

NTSC信号の生成

まず画面表示のため、水平同期信号と垂直同期信号を作成する。

14MHzのオシレーターを分周して7MHzのマスタークロックを作成する。

マスタークロックをカウンターでカウントして1ライン455クロック周期の水平同期信号の元になる信号を作成する。

水平同期信号をカウンターでカウントして1画面262ライン周期の垂直同期信号のもとになる信号を作成する。

これらの回路から生成される信号はオブジェクト表示位置や表示幅にも使用される。

またこれらから水平、垂直ブランキング信号(表示マスク信号)、HSYNC,VSYNCを作成する。

画面中央のネットを描画するタイミング信号を生成する。V4の信号を使っているので縦4ラインの破線が描画される。

 

パドル表示とコントローラーからの入力

プレイヤーが操作しているパドル入力によってパドルの表示と位置を決める信号PAD1(プレイヤー1),PAD2(プレイヤー2)を生成する。

555タイマーはトリガー入力により、RCの時定数により決まるパルス幅のクロックを1クロック出力する。

ユーザーのパドル(コントローラー)の入力による抵抗値の違いでパルス幅が変化し、タイマーの出力パルスが[L]になったタイミングで16ライン幅のパドルが左右に描画される。

画面が256ライン目の描画のタイミングでコントローラの読み込みを開始し、555タイマーの出力が[H]から[L]になるタイミングで555タイマー下の7493 4bitカウンターがカウントを開始し、カウント値1111bになるまで、PAD1,PAD2を[H](パドルの表示)にする。

カウンターが1111bになると、自身のクロック入力をマスクしてカウントを停止し、PAD1,PAD2を[L]にする。なおこの4bitカウンターは衝突後のボールの反発処理にも使用する。

 

パドルの幅は中央右G3cの2NANDより、4ドット幅となる。

またパドルの水平位置は中央右H3aのD-FFにより決定される。

0--------128(PAD1)----------256----------384(PAD2)---------

 

当たり判定

パドルがボールに当たったかを判定するには、PAD1,PAD2が[H]のときの、パドルの水平、垂直位置とボールの水平位置と垂直位置が一致すると当たり(HIT1=[H],HIT2=[H])と判定する。

 

ボールの水平方向の移動

ボールは水平方向に左右に移動する。画面の更新タイミングVRESET=[H]になると、0-3ドットの移動が行われる。

 

ボールの表示タイミング(HVID)と移動

ボールの左右への移動は9ビットのカウンターを使って、水平周期より+1,−1,0の周期の差があるカウントを実行する。

差が+1の場合は水平周期よりもボールの周期が1大きくなるのでボール表示は右に移動する。

差が−1の場合は水平周期よりもボールの周期が1小さくなるのでボール表示は左に移動する。

差が0の場合は水平周期と一致するので移動はおこなわず、停止状態となる。

 

左右の移動を決定する。

ボールのラリーが続くとボールの移動速度が増加する。そのため1フレーム毎の移動を1,2,3ドットと増加させることで移動速度を変化させる。

 

ボールの垂直方向の移動

垂直方向の移動も水平方向と同様の方法でボールを移動させる。カウンターの周期が小さいとボールの表示(VVID=[H])が上に移動し、大きくなると下に移動する。またおなじになると水平移動となる。

画面の上下辺にボールが来たときは方向を反転させ、ボールがラケットに当てたときはラケットに当たった場所により垂直方向の移動を変化させる処理を行う。

 

ボールの垂直方向カウンター

1フレームの水平ラインをカウントする。

 

ボールが画面上下にきたときの反転処理

表示開始時(VBLANK=[L])にボールの表示(VVID=[H])であったとき、方向を反転させる。(上画面に当たったら下方向へ、下画面なら上方向になる)

これはJK-FFのQが[H]のときと[L]のときで移動量は同じで方向のみ変える設定値を2セット用意して実現している。

 

ボールがパドルに当たった場所により上下の移動量を変化させる。パドルに衝突したときの位置(B1,B2,C1,C2,D1,D2)をラッチする。この位置によって上下3段階と水平の上下の移動を行う。B1,B2,C1,C2,D1,D2についてはパドル入力回路でパドルの描画を行うカウンターの出力になる。またATTRACTはデモモードでアクティブになる。

反転用のJK-FF(A2a)やパドルの衝突位置のラッチ(B5a,A5a,A5b)データと水平方向の周期は加算器B4で生成する。

 

加算器B4に入力する反転用のJK-FF(A2a)やパドルの衝突位置のラッチ(B5a,A5a,A5b)データから以下のように垂直方向の周期が決定される。

上下にボールが衝突してA2aの出力が反転するとボールの移動量は同じで増加または減少の量は同じになる。

例:

A2a,B5a,A5a,A5b 0000 ←→ 1000 Range 7-255 ←→ 13-255

A2a,B5a,A5a,A5b 0001 ←→ 1001 Range 8-255 ←→ 12-255


===============================================
A2a B5a A5a A5b A4 A3 A2 A1 B4 B3 B2 B1  Range
-----------------------------------------------
0   0   0   0   0  0  0  0  0  1  1  1   7-255
0   0   0   1   0  0  0  1  0  1  1  1   8-255
0   0   1   0   0  0  1  0  0  1  1  1   9-255
0   0   1   1   0  0  1  1  0  1  1  1  10-255
0   1   0   0   0  1  0  0  0  1  1  0  10-255
0   1   0   1   0  1  0  1  0  1  1  0  11-255
0   1   1   0   0  1  1  0  0  1  1  0  12-255
0   1   1   1   0  1  1  1  0  1  1  0  13-255
1   0   0   0   0  1  1  1  0  1  1  0  13-255
1   0   0   1   0  1  1  0  0  1  1  0  12-255
1   0   1   0   0  1  0  1  0  1  1  0  11-255
1   0   1   1   0  1  0  0  0  1  1  0  10-255
1   1   0   0   0  0  1  1  0  1  1  1  10-255
1   1   0   1   0  0  1  0  0  1  1  1   9-255
1   1   1   0   0  0  0  1  0  1  1  1   8-255
1   1   1   1   0  0  0  0  0  1  1  1   7-255
-----------------------------------------------

スコア記録と画面表示

水平ブランキング期間とボールの水平位置(HVID)が一致したらミスとして得点用カウンターをインクリメントする。どちらのプレイヤーのカウンターをインクリメントするかは水平の移動方向(L,R)で決定する。このカウント値を画面に表示する。

カウンターは4ビットの10進カウンターに2桁目表示用にJK-FFで構成される。

 

画面表示

 

最後に表示するオブジェクトをまとめてVideo Outとして出力する。

スコア表示(SCORE)

ボール(G1b),パドル1,2,ネットの表示(F2b)

感想

ゲーム機側のアルゴリズムも2用にしてユーザーに任せるという、ゲームが成り立つぎりぎりまでシンプルにしたデザインの勝利ですな。あとコレ簡単にコピーされただろう思う。

これを見てCPUとメモリの存在がいかに複雑なゲームを可能するかがわかった。