
VIC -II(ビデオインターフェースチップII)、具体的にはMOSテクノロジー6567/6566/8562/8564(NTSCバージョン)、6569/8565/8566(PAL)として知られるマイクロチップは、 Commodore 64およびCommodore 128ホームコンピュータにおいて、 Y/Cビデオ信号( RF変調器でコンポジットビデオに合成される)とDRAMリフレッシュ信号を生成する役割を担っています。
VIC-20で使用されていたオリジナルのMOS Technology VICの後継として、VIC-IIはCommodore 64の主要なカスタムチップの1つでした(もう1つはMOS Technology 6581サウンドチップです)。
VIC-II チップは、MOS Technology, Inc.のAlbert Charpentier と Charles Winterble [ 1 ]によって、MOS Technology 6560 "VIC"の後継として主に設計されました。MOS Technology のチームは、以前、メモリ速度の制約により、Commodore TOI コンピュータ用のMOS Technology 6562と Color PET 用のMOS Technology 6564という 2 つのグラフィック チップの製造に失敗していました。[ 2 ]
VIC-II を構築するために、シャルパンティエとウィンターブルは、現在の家庭用コンピュータとビデオゲームの市場調査を行い、現在の機能と VIC-II に搭載したい機能をリストアップしました。スプライトを追加するアイデアは、TI-99/4AコンピュータとそのTMS9918グラフィックス コプロセッサから得られました。衝突検出をサポートするアイデアは、マテル インテレビジョンから得られました。アタリ 800も必要な機能、特にビットマップ モードについて調査されました。これは、コモドールの主要な家庭用コンピュータのライバルはすべてビットマップ グラフィックスを備えていたのに対し、VIC-20 は再定義可能な文字しか備えていなかったため、MOS チームの目標でした。[ 3 ] [ 4 ]チップ表面の約 3/4 がスプライト機能に使用されています。[ 5 ]
チップは、一部はApplicon (現在はUGS Corp.の一部)の電子設計自動化ツールを使用してレイアウトされ、一部はベラム紙に手動でレイアウトされた。設計のデバッグは、設計の小さなサブセットを含むチップを製造し、それを個別にテストすることによって部分的に行われた。MOS Technologyは研究開発ラボと半導体工場を同じ場所に持っていたため、これは容易であった。最初のバッチのテストチップは、不良スプライトが1つあっただけで、ほぼ完全に機能した。[ 6 ]チップは5マイクロメートル技術で開発された。[ 3 ]
VIC-IIの開発は1981年11月に完了し、ロバート・ヤネスは同時にSIDチップの開発に取り組んでいた。コモドール64と同様に、両方のチップは1982年1月の最初の週末に開催されるコンシューマー・エレクトロニクス・ショーに間に合うように完成した。[ 7 ]
64のグラフィックモードの中には、本当に奇妙なものがあり、画面全体で文字の色を変更できる機能など、AtariやAppleには類を見ないものがあります。これにより、これまで活用されていなかった多くの色彩表現が可能になりました。
—エピックスのクレイグ・ネルソン、1986年[ 8 ]

以下のレジスタアドレスは、C64のCPUから見たアドレスであることに注意してください。データシートに通常記載されているレジスタ番号(つまり、 0から始まる番号)を取得するには、先頭の「D0」を省略する必要があります。

VIC-IIは、 C64アドレス空間の$D000 ~$D02Eの範囲にメモリマップされた47個の制御レジスタ(VICの16個から増加)を操作することでプログラムされます。これらのレジスタのうち、34個はスプライト制御専用です(スプライトは、VIC-IIのドキュメントでは「Movable Object Blocks」の略でMOBと呼ばれています)。前機種と同様に、VIC-IIはライトペン入力に対応しており、C64の標準文字ROMの助けを借りて、 40桁のPETシリーズと同様のサイズのディスプレイに、1977年のオリジナルのPETSCII文字セットを提供しました。
ラスタ割り込みルーチン(スキャンライン割り込み)にフックされたマシンコードを介してVIC-IIの制御レジスタを再ロードすることで、チップに8個をはるかに超える同時スプライトを生成するようにプログラムすることができ(スプライト多重化と呼ばれるプロセス)、一般的に、プログラムで定義された画面の各スライスに異なるスクロール、解像度、および色特性を与えることができます。スキャンラインあたり8個のスプライトというハードウェア制限は、スプライトを高速で点滅させることでさらに増やすことができます。VIC-IIの能力を最大限に引き出すには、ラスタ割り込みの習熟が不可欠です。多くのデモや後期のゲームでは、CPUとVIC-IIの間で固定の「ロックステップ」を確立し、VICレジスタを正確なタイミングで操作できるようにしていましたが、適切な同期を確保するためのラスタ割り込みへの依存を減らし、そのオーバーヘッドを最小限に抑えることができました。
C64にはPETSCII文字セットが4KB ROMに搭載されて出荷されたが、それ以前のVIC-20と同様に、文字の実際のデータは指定されたメモリ位置から読み込まれた。この位置はVIC-IIレジスタの1つであり、プログラマは適切なデータをメモリに配置することで独自の文字セットを構築することができた。各文字は8x8のグリッドであり、1バイトは水平方向に8ビットを表すため、1文字あたり8バイトが必要となり、したがって256文字の完全なセットでは合計2,048バイトが使用される。理論的には、16KBのビデオメモリ全体を使用すれば、最大8つの文字セットを使用できる。[ 9 ] : 363
VIC-II は文字セットに加えて、1 行あたり 40 文字の 25 行を格納するために 1000 バイトを使用し、各文字に 1 バイトが割り当てられます。電源投入時のデフォルト構成では、これは$400 - $7E8に配置されます。[ 9 ] : 117-119 カラー RAM はビデオ マトリックスのビット 8 から 11 としてアクセスされます。[ 10 ] 64 および 128 では、I/O 空間の$D800 - $DBFFに配置され、その場所から移動することはできません。各文字の色 1 (マルチカラー モードでは色 3) の値が含まれています。
文字ROMは、VIC-IIの4つの「ウィンドウ」のうち、$1000 - $1FFFと$9000 - $9FFFの2つにマッピングされていますが、CPUからは認識できません(文字ROMは、CPUからは認識できるがVIC-IIからは認識できない$D000 - $DFFFに切り替えることができます)。そのため、グラフィックデータやビデオバッファを$1000 - $1FFFまたは$9000 - $9FFFに配置することはできません。なぜなら、VIC-IIは代わりに文字ROMをそこに認識してしまうからです。これらのRAM領域はVIC-IIグラフィックチップでは使用できなかったため、音楽や効果音(SIDチップ)によく使用されました。C64はメモリ内の同じアドレスにRAMとROMを配置できますが、CPUは一方を「認識」し、VIC-IIチップはもう一方を「認識」します。
デフォルトの高解像度文字モードでは、各文字の前景はカラーRAMで個別に設定できます。マルチカラー文字モードでは、カラー3は最初の8つの可能なカラー値に制限されます。4番目のビットは、この文字を高解像度で表示するかマルチカラーで表示するかを示すフラグとして使用され、1つの画面で両方のタイプを混在させることができます。[ 9 ]: 460~462カラー1と2は、 $D022と$D023 のレジスタによって設定され、すべての文字に対してグローバルです。[ 9 ]: 373
拡張背景色モードを使用する場合、文字コードの上位2ビットを使用して、4つの背景色レジスタのいずれかを選択します。これにより、画面上に4種類の異なる背景色を表示できますが、使用できる文字数は256種類ではなく64種類に制限されます。この制限があるため、ゲームではほとんど使用されませんでした。
全ポイントアドレス指定可能なビットマップモードを追加することは、VIC-Iにはそのような機能がなかったため、コモドール設計チームの主要な目標の1つでした。しかし、追加回路をできるだけ少なくするために、文字モードと同じ方法、つまり8x8および4x8タイルで構成しました。ビットマップグラフィックスでは、ピクセルデータ用に8kページが必要で、各バイトは8ピクセルまたは4ピクセルの1行に対応します。次のバイトは、その下の行であり、8行目以降は次のタイルの先頭に戻ります。
高解像度ビットマップでは、スクリーンRAMを使用して各タイルの前景色と背景色(各バイトの上位ニブルと下位ニブル)を保持します。これは、$D800にあるカラーRAMや$D021にある背景色レジスタを一切使用しない唯一のVIC-IIモードです。
マルチカラービットマップモードでは、タイルごとに3色まで使用できます(4色目は$D021で設定された背景色です)。色1と色2はスクリーンRAMのビットによって選択され(高解像度ビットマップと同じ)、色3はカラーRAMから取得されます。
ビットマップモードは、高い色再現性と全点アドレス指定機能を備えているものの、大量のシステムリソース(ピクセルデータに8KB、さらに各タイルを修正するためのCPUサイクルが相当量必要)を消費し、通常はスクロールできないため、ゲーム内グラフィックには一般的に不向きです。そのため、ローディング画面やタイトル画面などでよく見られます。
VIC-II のスプライトは、24x21 のモノクロまたは 12x21 のマルチカラーのいずれかです。キャラクター グラフィックスと同様に、後者は各スプライトに個別の色を 1 つと、グローバルな色を 2 つ割り当てます。VIC-II には 8 つのスプライトがあり、それぞれが 64 バイトのメモリを使用して格納しますが、いくつかの制限はあるものの、より多くのスプライトを表示できます。スプライトの多重化は、画面上に 8 つ以上を表示するための一般的な方法です (ただし、1 スキャン ラインあたり最大 8 つまでです)。VIC-II のスキャン ライン カウンタをポーリングして、画面上の目的の位置に到達するか、特定のスキャン ラインでラスタ割り込みをトリガーするようにプログラムし、その後プログラムがスプライトの座標を素早く変更します。この方法により、画面上に一度に多くのスプライトを追加でき、多くの場合、合計で 16 ~ 24 個以上になります。ただし、デモの場合は、制限はかなり柔軟です。
理論上、同時に表示できる異なるスプライトの最大数は 256 です (VIC-II の 16k ページ全体が使用されている場合)。スプライトは、ビデオ ページ内の位置に応じて、メモリ内の各スプライト パターンを参照するブロック番号 (0 から 255 ($FF)) を使用してアドレス指定されます。(2 番目のビデオ バンク (0、1、2、3 と番号付けされている) を使用する場合、ブロック 0 は$4000に格納されているスプライトを参照し、ブロック 255 は$7FC0に格納されているスプライトを参照します)。
各スプライトは、縦方向、横方向、またはその両方で2倍のサイズにすることができます。これによりスプライトの解像度は向上しません(幅24ピクセル、高さ21ピクセルのままです)が、各ピクセルは幅が2倍、または高さが2倍になります。
各スプライトの水平位置レジスタは1バイトで、最大値が255に制限されているため、それだけではVIC-IIの画面領域全体である320ピクセルをカバーすることができません。そのため、最上位バイトフラグと呼ばれる追加のレジスタが、すべてのスプライトに対して9番目の位置ビットを提供します。
$D01Eと$D01Fには、背景レジスタとスプライト間衝突レジスタが格納されています。前者は、スプライトが接触している特定の背景オブジェクトに関する情報を提供できないため、ほとんど使用されません。
$D01Bには、スプライトが背景グラフィックの後ろまたは前に移動するかどうかを制御するスプライト・トゥ・バックグラウンド優先度レジスタが格納されています。スプライトが別のスプライトと同じ空間に入った場合、番号の小さいスプライトが常に番号の大きいスプライトよりも優先されます。
文字画面をスクロールするには、$D011および$D016レジスタを介してVIC-IIを38桁モードおよび/または24行モードに設定します。これにより、スクロールする文字の行が格納されるオフスクリーンバッファが作成されます。上記のレジスタのスクロールビットを調整することで、1行を画面上に移動させることができ、新しい行がバッファに格納されない限り、同じ行が繰り返されます。カラーRAMは画面RAMと同時にスクロールされ、同様の方法で動作します。
VIC-IIのスクロールは比較的複雑でCPU負荷の高い処理ですが、C64のゲームプログラマーがカラーRAMを静止状態に保つようにグラフィックを設計することでごまかすことも珍しくありません。もう1つの一般的な方法は、画面の一部(おそらく下または上の4行か5行)をゲームステータス領域として使用し、スコアや残機数などを表示することで、スクロール量を減らすことです。最後に、画面のティアリングを防ぐために「ダブルバッファリング」技術を使用する必要があることがよくあります。1KBの画面RAMブロックを2つ予約し、一方を表示している間にもう一方に書き込み、Vブランク中にVIC-IIレジスタを操作して素早く切り替えます。残念ながら、これはカラーRAMでは実行できません。
C64の商用ライフサイクルの終盤に、VSP(可変画面位置調整)と呼ばれる脆弱性が発見されました。これは、$D011の制御ビットを操作することで、標準のスクロールレジスタよりもはるかに低いCPUサイクルコストで高速スクロールを実現するものでしたが、サイクル単位で正確なコーディングが必要で、一部のVIC-IIリビジョンでは確実に動作しませんでした。また、水平スクロールにしか使用できませんでした。この脆弱性は、『Mayhem in Monsterland』で特に使用されています。
ラスタ割り込みの利用は、C64ゲームプログラミングの重要な要素です。コンピュータの電源投入時のデフォルト状態では、最初のMOS Technology製CIAチップが1秒間に60回マスク可能な割り込み(IRQ)を生成し(NTSCでもPALでも、これはビデオのリフレッシュとは無関係です)、CPUを$EA31にあるカーネルIRQハンドラに送ります。ハンドラはCIAのIRQを認識し、クロックを更新し、キーボードをスキャンし、BASICでカーソルを点滅させます。
ゲームでは通常、CIAの割り込みを無効にし、代わりにVIC-IIを設定して、特定の走査線に到達したときに割り込みを生成するようにします。これは、分割画面スクロールや音楽再生に必要な処理です。ゲームは、$0314 / $0315のIRQベクタをラスタハンドラに再マッピングし、ラスタハンドラがこれらの機能を実行します。その後、必要に応じてJMP $EA31命令を実行してカーネルに制御を戻します。
ゲームによっては 1 つの IRQ しか使用しないものもありますが、連鎖 IRQ の方が一般的で、プログラムの安定性が向上します。この設定では、IRQ は 2 番目のルーチンに再マッピングされ、最後のルーチンが最初の IRQ のアドレスに復元するまで、それぞれについて同様に繰り返されます。連鎖 IRQ を使用する場合、チェーンには 1 つの JMP $EA31命令のみが必要で、残りは JMP $EA81で終了できます。これは単にカーネル ハンドラの末尾に移動します。また、ゲームがカーネルを切り替えて独自の IRQ ハンドラを使用することも珍しくありません。NMI は追加の割り込みスレッドに使用できますが、誤って復元キーを押すと NMI がトリガーされるため、望ましくない副作用が発生する可能性があります。
VIC-IIは衝突レジスタからラスタ割り込みを生成することもできますが、ほとんどの場合、プログラムに十分な情報を提供しないため、この機能はほとんど使用されません。
VIC-II は 14 ビットのアドレス バスを備えており、C64 のメモリ空間の 4 つの 16k セグメントのいずれかをビデオ データに使用できます。これを管理するために、CIA のポート ビットによって 2 つの追加のアドレス ビットが提供されます。$0000 - $3FFFは電源投入時のデフォルトです。2 番目のセグメント ( $4000 - $7FFF ) は、ROM や I/O レジスタがマッピングされていない完全に空き RAM である唯一のセグメントであるため、BASIC からのプログラミングには通常最適です。4 番目のセグメント ( $C000 - $FFFF ) も、マシン語を使用する場合は良い選択肢です。CPU による読み取りアクセスを取得するにはカーネル ROM を無効にする必要があり、 $4000 - $7FFFを使用した場合に発生する不連続なプログラム コードとデータが回避されるためです。グラフィックスデータは、 $A000 - $BFFFの BASIC ROM 、 $E000 - $FFFFのカーネル ROM 、または$D000 - $DFFFの I/O レジスタとカラー RAM の下に自由に格納できます。これは、CPU のメモリ マッピングがどのように調整されていても、VIC-II は RAM しか認識しないためです。文字 ROM は最初のセグメントと 3 番目のセグメントでのみ認識されるため、セグメント 2 または 4 を使用する場合は、プログラマが独自の文字データを提供する必要があります。スクリーン RAM、ビットマップ ページ、スプライト、および文字セットはすべて同じセグメント ウィンドウを占有する必要があります (CIA ビットがスキャンライン割り込みによって変更されない場合)。システム メモリの最後の 6 バイト ( $FFFA - $FFFF ) には、IRQ、NMI、およびリセット ベクトルが含まれているため、メモリの最上位が文字セットまたはスプライト データの格納に使用され、カーネル ROM が取り外されて下の RAM が CPU に露出した場合、ベクトルの上書きを避けるために 1 つの文字またはスプライトを犠牲にする必要があります。
VIC-IIには、以下の47個の読み書きレジスタがあります。

マルチカラーキャラクターモード(ほとんどのゲームで使用される 160×200 ピクセル)では、キャラクターは 4×8 ピクセル(ピクセルの幅が 2 倍なので、キャラクターはほぼ正方形のまま)で、16 色のうち 4 色を使用します。3 色は画面全体で同じ(背景色、マルチカラー 1、マルチカラー 2 レジスタ)ですが、残りの色はカラー RAM で定義されているように、4×8 ピクセル領域ごとに個別に設定できます。マルチカラーモード(12×21 ピクセル)のスプライトは、3 色と透明度を持ちます。2 色はすべてのスプライトで共有され、1 色は個別に設定されます。アーティストは、共有色と個別の色の組み合わせによってカラフルな印象になるように共有色を選択します。一部のゲームでは、ラスタ割り込み中に共有色を再読み込みします。たとえば、ゲームTurrican II の水中エリア(垂直方向に区別されている)は、異なる色を使用しています。EpyxのSummer GamesやCOMPUTE!のGazetteのBasketball Sam & Edなど、他のゲームでは、2つの高解像度スプライトを重ね合わせることで、水平解像度を犠牲にすることなく2つの前景色を使用できるようにしている。もちろん、この手法を用いると、使用可能なスプライトの数は半分に減少します。
PAL C64では、モニターやテレビのPAL遅延線は、連続する画面ラインの色相を平均化するが明るさは平均化しないため、同じ明るさの2色を表示する画面ラインを交互に表示することで7つの非標準色を作成できます。VICチップには、そのような色のペアが7つあります。[ 11 ]
C64の開発チームは、16色のカラーパレットを数学的に計算することに多くの時間を費やさなかった。VIC-IIの開発に携わったロバート・ヤネスは次のように述べている。
残念ながら、色の選択にはあなたが考えているほど多くの労力は費やされていません。色相、彩度、輝度を完全に制御できたので、私たちは好きな色を選びました。しかし、チップ上のスペースを節約するために、多くの色は私たちが選んだ色とはカラーホイール上で反対側に位置する色でした。これにより、各色に完全に固有の抵抗値セットを用意するのではなく、既存の抵抗値を再利用することができました。[ 12 ]
PAL C64で使用されている初期バージョンのVIC-IIは、後の改訂版とは異なるカラーパレットを持っています。[ 13 ]
以下に示すように、 YPbPr信号の変動に基づいて、全16色のカラーパレットが生成されます。

Commodore 128に搭載されている 8564/8566 VIC-IIe は、40 ピンではなく 48 ピンを使用しています。これは、追加のZilog Z80 CPU のクロックなど、より多くの信号を生成するためです。また、2 つの追加レジスタも備えています。追加レジスタの 1 つは、追加された数値キーパッドやその他の追加キーにアクセスするためのものです。この機能は、必要な 3 つの追加出力ピンを追加するのにコンピュータ内で最も簡単な場所であることが判明したため、VIC に追加されました。もう 1 つの追加レジスタは、1 MHz と 2 MHz のシステム クロックを切り替えるためのものです。高速の場合、VIC-II のビデオ出力は、コードの 2 バイトごとに黒の高解像度ビット パターンを画面に表示するだけであり、その速度では C128 の 80 桁モード ( 8563 VDC RGB チップ経由) が使用されていることを示唆しています。非公式ながら、2 つの追加レジスタは C128 の C64 モードでも使用可能で、追加キーの一部の使用や、自作の C64 プログラムにおけるCPU 依存コード (集中的な数値計算など)のビデオなし倍速実行が可能になる。 [ 14 ]また、追加レジスタは C128 の C64 モードと実際の C64 との間の軽微な非互換性の原因の一つでもある。いくつかの古い C64 プログラムが意図せず2MHzの トグルビットは、実際のC64では全く何も起こらないが、C64モードのC128ではディスプレイが乱れる結果となる。
VIC-IIeには、あまり知られていない機能として、レジスタを特定の方法で操作することで、チップの他の部分が認識している位相と色信号の位相をずらし、追加の色セットを作成する機能があります。この機能は「Risen from Oblivion」デモで実証されました。[ 15 ]残念ながら、すべてのモニターで動作するわけではありません。正しい色は、Commodore CRTモニターとその同等品で確認されています。
VIC-IIeのテストビットの特定の動作を利用することで、320×400(ハイレゾモード)および160×400(マルチカラーモード)の解像度で実際のインターレース画像を生成することも可能である。[ 16 ]
コモドールはVIC-IIのライフサイクル中に多くの改良を加えました。Compute !'s Gazetteの1983年7月号では、1982年半ばのコモドール64の発売以来、すでに8つの改良が加えられていると報じられています。[ 17 ]
VIC-II の初期バージョンは、1982 年と 1983 年初頭に製造されたマシンで使用されました。熱対策のためセラミック製の筐体を採用し、ラインごとに 64 個の NTSC カラー クロックを生成しました。これらのチップは、クロマ信号と輝度信号を分離して出力することもできませんでした。後のバージョンでは、低コストのプラスチック製筐体を採用し、ラインごとに 65 個のカラー クロック (NTSC 用、PAL 用 63 個) と、クロマ信号と輝度信号を分離して出力することで、初期の S ビデオを実現しました。いくつかのバージョンは、主に初期のユニットでは劣悪だったビデオ出力品質の向上と、画面上にランダムなピクセルが表示されるバグの解消を目的として行われました (初期のゲームの中には、このバグをグラフィック効果に意図的に利用したものがあり、結果として後の C64 では動作しなくなりました)。初期の VIC-II の 64 個のカラー クロックは、Atari 8 ビット コンピュータのように高解像度ビットマップ モードで NTSC アーティファクト カラーを実現することを目的としていましたが、このアイデアはすぐに放棄されました。
コスト上の理由からプラスチック製の筐体に変更せざるを得なかったため、VIC-IIでは過熱が問題になりがちだった。これは、使用されているプロセスに比べてダイの密度が高いことや、内部速度が速いこと(8MHz)など、いくつかの理由によるものだった。コモドールは、アルミニウム製のRFシールドをヒートシンクとして 使用するという即席の解決策を試みた(NTSC方式のマシンで。PAL方式のマシンは、米国よりもRF干渉に関する規制が緩い国で販売されていたため、アルミ蒸着ボール紙のみを使用していた)。しかし、過熱やチップの故障を完全に防ぐことはできなかった。
C64Cに搭載されている85xx VIC-IIは、より新しい3.5μm HMOSプロセスで製造されており、 65xx VIC-IIの12Vと5Vのデュアル電源レールではなく、5Vのシングル電源レールのみを必要とします。これらのチップは動作温度が大幅に低く、65xx VIC-IIで発生する過熱問題もありません。
6569にはいくつかの改訂版が存在する。6569R1(通常は金メッキ)、6569R3、6569R4、6569R5などである。8565で最も一般的なバージョンは8565R2である。