Apple IIのハードウエア(3)
目次
ハイレゾリューショングラフィックス
Apple IIは280(H)×192(V) 、カラー(紫、緑、青、橙、白、黒6色)クラフィックモードを持っている。
ビデオメモリはモノクロ1ページ分しか用意されていないため、6色を出力するため対応するビット毎に出力する色が決まっている。
偶数バイト(D6-D0) | 奇数バイト(D6-D0) | |
---|---|---|
最上位ビット(D7=0) | 紫緑紫緑紫緑紫 | 緑紫緑紫緑紫緑 |
最上位ビット(D7=1) | 青橙青橙青橙青 | 橙青橙青橙青橙 |
隣り合った色を同時にONにすると白、OFFにすると黒になる。色を考慮すると水平方向の解像度は140dotとなる。
Apple IIのハイレゾリューションカラーでは、紫と緑、青と橙が同時にONになると色が混じって白にみえるという説明がなされることがある。
実際に調べてみるとそれは違うようだ。
以下がApple IIのビデオ回路のブロック図。図中のトランジスタQ3のEの先がビデオ出力、BにはVRAMのデータをシフトアウトしたVIDEO DATA、3.5MHz(14MHzのクロック4分周)のCOLOR BURST信号、同期信号のSYNCの合成信号(1つがアクティブのときは他の2つはインアクティブ)が接続されている。この合成信号がコンポジットビデオ信号として出力される。
ブロック図
合成信号(コンポジットビデオ)の出力
COLOR BURST信号は表示開始時に色の基準を決めるため動作する。この信号は配線上でLCによるDelayが追加されている(出力色の調整の為だろう)。
VIDEO DATAはVRAMから読み出されたデータを7MHzでシフトアウトした信号なので2ビット(ドット)でCOLOR BURST信号と同じ周期(3.5MHz)になる。特定の色のビットデータは隣のビットが必ずLになるため、結果としてCOLOR BURST信号と同じ3.5MHz周期のクロックパルス(0-1-0)として出力される。
例えば以下のようにビデオデータ:01010101Bおよび00101010Bは、3クロックのコンポジット信号として出力される。
表示色はコンポジットビデオの規格によりCOLOR BURST信号とVIDEO DATAの遅延差で決まる。
紫色の出力:010Bと緑色の出力:101Bは3.5MHzのパルス半クロック分、COLOR BURSTから遅延する。テレビモニター上ではCOLOR BURSTとの遅延が小さいときは紫、大きくなると緑の色になる。よく言われる出力色が補色になっている理由は2つの色の出力タイミングが半クロック(1周期の半分)ずれているからである。
ビデオデータが01111111Bのように11と続くときは遅延差がない一定の[H]レベルが出力されることで白が表示され、00000000Bのように00と続く時は[L]レベルとなり黒が表示される。
以上の理由でビデオメモリ上の偶数バイトと奇数バイトで出力色の位置がずれているのである。
青、橙の表示は紫、緑のデータを14MHzのフリップフロップで遅延させて(図A11-9)実現している。
青、橙の表示が後から追加された事を考えると基盤上であまったフリップフロップやセレクタを利用する事で表示色が増やせると気がついたのだろう。
COLOR BURSTとの位相差による色の関係
グラフィックスが7ドットの訳
グラフィックスが8ドットでは無く7ドット単位になっているのは、VRAMからのグラフィックスデータ(1Byte=8bit)の読み込みが1MHzのクロックで行われ、ビデオ出力は7MHzのクロックで1bitずつデータをシフトアウトしてるからである。
VRAM Data入力クロック(1Byte) 1 2 1MHz ``|____________________|````````````````````|____________________|````````````````````|___ VRAM Data出力クロック(1bit) 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 7MHz __|``|__|``|__|``|__|``|__|``|__|``|__|``|__|``|__|``|__|``|__|``|__|``|__|``|__|``|__|``|
上の図の様にグラフィックデータを出力するクロックはグラフィックデータを読み出すクロックの7倍なのでビデオデータを連続で処理するには最大7ドット以下となる。(8ドット目を出力する前にシフトアウトするビデオデータが更新されてしまう)
ではApple IIの構成で8ドット出力=横320ドットが出来ないかというとそんな事は無い。
一回のVRAM読み出しで1bit余る訳だから7bit分のバッファを準備すれば良い。7bitのシフトレジスタを14bitのシフトレジスタにして読み出し毎に余ったbitを上書きしないようにラッチする位置を移動させる。そしてバッファ内の余ったbitが7bitになればVRAMの読み出しを停止してバッファ内のデータを出力する制御を追加すれば横320dot出力は実現できる。
それをしなかったのは画面制御(シフト用レジスタの増加や7の倍数アドレス毎にVRAMデータのリードを停止するなど)の為の回路増加を回避したのだろう。
もし、無理やり横320dotを実現していれば奇数、偶数アドレス毎の色処理がいらなくなってソフトウエアはすっきりしますが、表示色は6色から4色に減ってしまってゲームには寂しくなり歴史が変わってしまったかも。
テキストモード
Apple IIはモノクロ40(H)×24(V) のテキスト出力があるが、これも独特なものとなっている。
国産パソコンでは1キャラクタのデータが8×8ドットで構成されその範囲でキャラクタパターンを定義している。そしてテキストVRAMに書かれた8bitのデータから対応する256のキャラクタパターンを画面に出力する。
Apple IIの場合、テキストVRAMの8bitのデータのうち、bit7とbit6は標準、反転、点滅の出力選択に使われる。すなわち画面に出力できるはBit5-Bit0の6bit 64キャラクタである。
さらにキャラクタパターンは7×8ドットのうち左右1ドットを除いた5×8ドットとなる。左右の1ドットは標準で黒、反転で白固定となる。
以下に示すのがキャラクタ出力回り回路。
A5が9word×5bitのキャラクターデータ用ROM。A3が8bitのシフターで7ドットのうち前後1ドットがグランドに落ちているのがわかる。B11とB13で標準、反転、点滅を行う。B13の信号はメモリからのテキストデータが確定しているうちにレジスタでラッチされ出力制御用のB2の13と接続される。B3はタイマーで一定の間隔で標準、反転を繰り返す、すなわち点滅を行う。
B11とB13からテキストVRAMのデータのうち
- Bit7が[H]で標準出力
キャラクタデータ$80-$FF - Bit7が[L]、Bit6が[L]で反転
キャラクタデータ$00-$3F - Bit7が[L]、Bit6が[H]で点滅
キャラクタデータ$40-$7F
となる。
後期(おそらくApple II Plus)のマザーボードではCG ROMが11word×8bitのROMになり7×8ドットの全てを定義できるように回路が変更されている。変更の理由はCG ROMのデリバリーの問題だろうと思ったけどどうやらアルファベットの小文字を出力できるようにする為の変更のような気がする。
キャラクタの指定が64のみだと小文字の出力が不可能なので(大小アルファベット52+数字+記号で64文字を超えてしまう。)テキストデータ中の画面制御bitの2bitのうち未使用のbit6=[H],bit7=[H]で$E0から$FFに小文字を指定する空間を割り当てているのだろう。この場合追加された空間は反転や点滅ができないし、オリジナルのApple IIでは記号が割り当てられていた領域なので互換性が無くなるが小文字が出力できるメリットは大きい。
以下が変更された回路。CG ROMが8bit幅に、シフターの入力7bit全てにCG ROMの出力が接続されている。
色のにじみ
カラーグラフィックで述べたようにカラーモニターではどうしても色のにじみが発生してしまう。
例
ではなぜテキストモードでは色のにじみがないのだろうか?
その解決法は下図の丸囲みにあるCOLOR KILLERとよばれる回路を追加してTEXTを表示するときはCOLOR BURSTのレベルを下げるのである。なお最初の基盤にはこの回路がなかったようでクレームで追加したのかな?
感想
改めてApple IIのハードウエアを見ると1977年当時の制約による妥協もある事が解った。例えばキーボード入力をポーリングにしている所とか、DRAMのリフレッシュアドレスをビデオ信号を利用している所とか。今なら7bitのカウンタをアドレスとして非表示期間にリフレッシュするだろう。そうすれば連続したビデオアドレスにできる。また、システムで最高速の14MHzのクロックを引き回しているので、クロックのなまりとか大丈夫かな。
今日ではEDAツールを使って回路入力を行い、シミュレーションで動作確認をする所を、(おそらく)紙と鉛筆を使用して、頭の中のみでコンピュータシステムを設計したWozはすごいと思う訳です。