
英数字テレビインターフェースコントローラ[ 1 ](ANTIC)は、テレビ画面やコンピュータディスプレイに表示する2Dコンピュータグラフィックスを生成するためのLSI ASICです。
ジェイ・マイナーの指揮の下、このチップは1977年から1978年にかけてジョー・デキュール、フランソワ・ミシェル、スティーブ・スミスによって設計され[ 2 ] 、1979年に初めて発売されたアタリ8ビットコンピュータに搭載されました。このチップは1981年にアタリ社によって特許が取得されました[ 3 ] 。ANTICは、8ビットコンピュータとほとんど同じハードウェアを共有する1982年のアタリ5200ビデオゲームコンソール にも使用されています。
ANTICは、ビデオの各フレームごとに、プレイフィールドまたは背景グラフィックを定義する命令を読み取り、色を追加してスプライトを重ね合わせる(Atariでは「プレイヤー/ミサイルグラフィック」と呼ばれる)コンパニオンのCTIAまたはGTIAチップにデータストリームを送信します。各ANTIC命令は、空白のスキャンライン、またはディスプレイの水平帯に使用される14種類のグラフィックモードのいずれかに対応します。各帯の高さはモードによって異なります。これらの命令は、Atariの用語でいうところのディスプレイリストを構成し、個々のモードのスタックからディスプレイ全体がどのように構築されるかを指定します。
ディスプレイリストは、各行のデータがどこから来るかを指定します。文字モードの場合、文字ビットマップのベースアドレスはオンチップレジスタに格納され、変更可能です。ディスプレイリスト命令を使用すると、水平方向および垂直方向の細かいスクロールを有効にしたり、割り込みを発生させるように指定したりできます。割り込みが発生すると、任意の6502コードを実行できます。通常は、フレームの途中でディスプレイ関連の設定を変更するために使用されます。
以下のリストは、ANTICの本来のハードウェア機能、つまりハードウェア単体で意図された機能について説明しています。CPUが処理する割り込みや、レジスタ変更を頻繁に引き起こすディスプレイカーネルによって達成される結果は含まれません。
ANTICはDMAを使用して、以下のプレイフィールド機能を指定するディスプレイリストと呼ばれるプログラムを読み取ります。
その他のレジスタベースの関数:
部品番号順に掲載しています。
アタリ社は、アタリ製コンピュータおよび5200コンソールの製造コストを削減するため、ANTICチップとGTIAチップの機能を1つの集積回路に統合することを計画していた。そのような試作回路が2つ開発されていたが、いずれも製品化には至らなかった。

Atari 8ビットコンピュータとAtari 5200コンソールは、ANTICチップを$D4xxの16進数ページにマッピングします。
ANTICは、プレイフィールド表示パラメータ、プレイヤー/ミサイルグラフィック用のDMA、微調整スクロール、ライトペン入力、割り込みを制御する15個の読み書きレジスタを提供します。ハードウェアレジスタは、読み出し時に書き込まれた値を返しません。この問題は、レジスタに最後に書き込まれた値を格納する場所として、通常のRAMに実装されたオペレーティングシステムシャドウレジスタによって解決されます。オペレーティングシステムシャドウレジスタは、垂直ブランキング中にRAMからハードウェアレジスタにコピーされます。したがって、対応するシャドウレジスタを持つハードウェアレジスタへの書き込みは、次の垂直ブランキング中にシャドウレジスタの値によって上書きされます。
一部の書き込み用ハードウェアレジスタには、対応するシャドウレジスタがありません。これらのレジスタは、垂直ブランク期間中に値が上書きされることなく、アプリケーションによって安全に書き込むことができます。アプリケーションがレジスタの最終状態を知る必要がある場合は、書き込んだ内容を記憶しておくのはアプリケーションの責任です。
オペレーティングシステムのシャドウレジスタは、一部の読み取りレジスタにも存在し、表示サイクルの不明な段階でハードウェアから直接値を読み取ると、一貫性のない結果が返される可能性がある。
以下の個々の登録簿一覧には、次の凡例が適用されます。
SHADOW: SDMCTL $022F
ダイレクトメモリアクセス(DMA)制御
DMACTLは、プレイフィールドとプレイヤーミサイル(スプライト)グラフィックスに関するANTICのDMA動作を制御します。
プレイフィールド幅のビット値:
プレイフィールド表示に関する「ディスプレイリストDMAビット」も参照してください。
プレイヤー/ミサイルDMAビット値:
ANTICのプレイヤー/ミサイルDMA機能は、メモリからバイトを読み取り、CTIA/GTIAのGRAFP0、GRAFP1、GRAFP2、GRAFP3、およびGRAFMグラフィックパターンレジスタを更新するデータを配信することで、CPUがプレイヤー/ミサイル(スプライト)グラフィックを作成する負担を軽減します。これらのビットは、ANTICからCTIA/GTIAへのプレイヤーデータとミサイルデータの送信を有効にします。プレイヤー/ミサイルDMAが期待どおりに機能するためには、 CTIA/GTIAもGRACTLレジスタを介してデータを受信するように構成する必要があります。
プレイヤーDMAが有効になっている場合、DMAタイミングを一定に保つためにミサイルDMAが自動的に実行されますが、データはミサイルのGRAFMレジスタには送信されません。
有効にすると、プレイヤー/ミサイルDMAは、表示画面のすべてのスキャンライン(スキャンライン8から247まで)で実行されます。そのため、これらのスキャンライン数より上と下のメモリマップ(ANTICのPMBASEを参照)にあるプレイヤー/ミサイルデータは使用されず、表示されません。
プレイヤー/ミサイル解像度ビット値:
ANTIC DMAとプレイヤー/ミサイルパターンレジスタの更新は、解像度に関係なく、各スキャンラインで行われます。ダブルライン解像度が有効になっている場合、冗長なDMAフェッチの間にプレイヤー/ミサイルメモリが変更される可能性があり、これによりGRAF*レジスタに送信されるパターンが変更され、見かけ上シングルライン解像度のプレイヤー/ミサイルが生成されます。
DMAビット値の一覧を表示します。
プレイフィールドを表示するには、ディスプレイリストDMAが有効になっていること、およびプレイフィールドの幅が指定されていることが必要です。いずれかの値がゼロの場合、プレイフィールドは表示されません。
シャドウ:チャート$02F3
キャラクター操作
CHACTLは文字表示を制御します。
文字制御ビットの値は、以下の動作を行います。
CHACTLのビデオ反転ビットとビデオブランクビットは、ANTICテキストモード2および3において最上位ビットが設定されている文字($80~$FF)の表示に影響します。CHACTLビットの値を切り替えることで、これらの文字をディスプレイ全体で点滅または非表示にすることができます。
ビデオ反転とビデオブランクを同時に有効にすると、反転したビデオ文字が反転した空白として表示されます。ビデオ反転とビデオブランクのビットは、ANTICモード2と3で機能し、その他のテキストモード4、5、6、7には影響しません。
ビデオリフレクトビットは、すべてのテキストモードに影響します。ビデオリフレクトは、新しい文字セットを定義せずにミラーリング効果が必要な場合に役立ちます。理想的な使用例は、スートが逆さまに表示された正確なカードフェイスを表示するカードゲームです。これは、グリフデータが使用される前に垂直方向にミラーリングされるため、グリフバイト6と7がディセンダー領域の下部に表示されるANTICモード3ディセンダーでは、効果が一貫していないように見えます。
SHADOW: SDLSTL/SDLSTH $0230/$0231
表示リストポインタ
ANTIC は、レジスタ DLISTL/DLISTH (16 進数で D402-D403 / 10 進数で 54274-54275) に格納されている 16 ビットのアドレスが指すディスプレイリストの実行を開始します。アドレス レジスタは、ディスプレイ リストの実行中に ANTIC の JMP (ジャンプ) および JVB (ジャンプして垂直ブランクを待機) によって更新されます。アドレスは、オペレーティングシステムの垂直ブランク割り込み (VBI) ルーチンによって、シャドウ レジスタ SDLSTL/SDLSTH (16 進数で0230-0231 / 10 進数で560-561 ) の値を使用して更新されます。
OSの垂直ブランク割り込みが有効になっている場合、CPUまたはANTICジャンプ命令によるANTIC DLISTレジスタへの直接更新は、次の垂直ブランク時にOSによってシャドウレジスタの値で上書きされます。そのため、直列に並んだ次のディスプレイリストを指すディスプレイリストによって実装されるページフリップは、垂直ブランク割り込みが無効になっていない限り、期待どおりに動作しません。
水平細スクロール
このレジスタは、水平方向の細目スクロールにおけるカラークロック単位のシフト量を指定します。下位4ビットのみが有効です。16カラークロックの値範囲により、ANTICはモード2テキストを4文字、モード6テキストを2文字シフトしてから粗スクロールを行うことができます。
モード行で水平スクロールが有効になっている場合、ANTIC は現在の画面幅よりも大きい次のサイズ増分を取得し、水平スクロール制御の対象となるデータのバッファを提供します。狭幅表示の場合、ANTIC は通常幅に必要な画面 RAM を取得します。同様に、通常幅の場合、ANTIC は広幅に必要な画面 RAM を取得します。
ANTIC は、画面メモリから読み取った最初の数バイトをバッファリングします。これは、16 色のクロック範囲の移動をカバーするのに十分な量です。(表示モードによって 2 ~ 4 バイト)。HSCROL 値は、バッファリングされた最後のバイトの最後の (最も右の) カラー クロックから始まり、左に向かって、バッファリングされたデータから出力するカラー クロックの数を指定します。HSCROL が 0 の場合、バッファからカラー クロックは出力されないため、最初に表示される画面バイトは、バッファリングされたデータの次の最初のバイトになります。HSCROL が増加すると、バッファリングされたデータの末尾 (右端) からより多くのカラー クロックがディスプレイの左端に追加され、細かいスクロール シフトによって画面の内容が右に移動します。
ANTICモードF(高解像度、1/2カラークロックピクセル)は、HSCROLがカラークロックを指定するため、一度に2ピクセルずつしかスクロールできません。
代替GTIAカラー解釈を使用するANTICモードでは、スクロールはGTIAピクセル全体(2つのカラークロック)で行う必要があります。正しいスクロールを保証するには、偶数の値のみを使用してください。HSCROLに奇数の値を使用すると、ピクセルストリームが異なる状態に遷移し、GTIAが異なる色として解釈します。
多くのプラットフォームとは異なり、Atariの水平スクロールは視覚的に一貫性があり、正確な色表示に必要なカラークロックのタイミングに合わせてピクセルサイズが調整されているため、色の「ストロボ効果」によるアーティファクトが発生しません。
縦方向の細スクロール
このレジスタは、垂直方向の細かなスクロールの距離をスキャンライン単位で指定します。下位4ビットが有効ですが、垂直スクロール値は0からANTICモードラインのスキャンライン高さ-1の範囲である必要があります 。ANTIC モードのスキャンライン数よりも遠くまでスクロールすると、繰り返しデータ行が発生し、細かなスクロールの連続性が損なわれます(ただし、これは悪用可能な動作としても使用できます)。
垂直スクロール領域は、ディスプレイリスト内のANTICモードラインのVSビット($20)を順番に設定することで定義されます。VSビットが設定されていない最初のモードラインがスクロール領域の終端となり、スクロール領域の下部までスクロールアップするための新しい情報を供給するバッファラインとして使用されます。
垂直スクロール値は、最初のモード行で表示を開始するスキャンライン番号を示し、最後のモード行(VSビットが設定されていない行)で表示を終了するスキャンライン番号としても使用されます。
例: 8 スキャンラインの ANTIC モード (テキスト モード 2、4、または 6) で、隣接する 2 つのモード ラインの VS ビットが設定されている場合、スクロール領域は 3 つのモード ラインで構成されます。スクロール領域の 3 番目のラインは、VS ビットが設定されていない最初のモード ラインです。ディスプレイ リストで垂直スクロールが設定されていない場合、3 つのモード ラインによって、表示されるスキャンラインは自然に 24 行になります。ディスプレイ リストモード命令で説明されているように VS ビットが設定され、VSCROL 値が 2 に設定されている場合、領域内の最初のモード ラインはスキャン ライン 2 からスキャン ライン 2 ~ 7 (6 行、つまり 8 - VSCROL) を表示し始め、2 番目のモード ラインは完全に表示され (8 行)、最後のモード ラインはスキャン ライン 2 で終了し、スキャン ライン 0 ~ 2 (3 行、つまり VSCROL + 1) が表示されます。スクロール領域に表示されるスキャンラインの合計は 6 + 8 + 3 = 17 行になります。
細かいスクロールはピクセル高さではなく走査線に基づいており、スクロール領域の移動は最初のモードラインから走査線をスキップし、最後のモードラインに走査線を追加するだけで行われるため、スクロール領域内で異なるグラフィックモードを使用することが可能です。ただし、スクロール領域内の現在の最初のモードラインと最後のモードラインで、どれだけの走査線を移動できるかを判断する際に、より注意を払う必要があります。
ブランクモードのラインは、スクロール領域内に含められません。これは、ブランクモードのライン命令には垂直スクロール修飾ビットが本来存在しないためです。(ブランクモードのライン命令は、通常のプレイフィールドモード命令のLMS、HS、VS修飾ビットとして機能するビット7~5を使用して、ブランクライン数を指定します。)ただし、ブランクモード命令はスクロール領域を終了するために使用でき、垂直スクロール値に応じて想定されるスキャンラインの高さの変化の影響を受けます。
プレイヤーミサイル基地の住所
これは、プレイヤー/ミサイルグラフィックスのベースアドレスのページを指定します。2行解像度のP/Mグラフィックスが動作している場合、PMBASE値は1K境界から開始する必要があります。1行解像度のP/Mグラフィックスが動作している場合、PMBASE値は2K境界から開始する必要があります。
シャドウ:CHBAS $02F4
文字ベースアドレス
これは、文字セットのベースアドレスのページを指定します。ANTICモード2、3、4、5では、文字セットに128文字を使用するため、CHBASE値は1K境界から開始する必要があります。ANTICモード6と7では64文字を使用するため、CHBASE値は512バイト境界から開始する必要があります。
通常のデフォルト値は、 ROM の $E000 hex /57344 decにある文字セットに対して$E0 hex /224 decです。
水平同期を待っています
このレジスタを使用すると、プログラムがディスプレイと同期できます。このレジスタに書き込むと、6502プログラムは現在のスキャンラインの終了まで停止します。この動作は、ディスプレイリスト割り込み中に、あるスキャンラインから次のスキャンラインへのスムーズな遷移/変更を実現するためによく使用されます。書き込まれる値は重要ではありません。
垂直ラインカウンター
このレジスタは現在生成中の走査線を追跡します。返される値は、実際の走査線を2で割った値です。表示開始時に生成される空白行も含まれます。NTSCの場合、値の範囲は0~130、PALの場合は0~155です。この値は、ディスプレイリスト割り込み時に画面の垂直位置を識別するのに役立ちます。
SHADOW: LPENH $0234
ライトペン水平位置
これは、ライトペン/ライトガンのトリガーが押されたときの水平カラークロック位置を格納します。シャドウレジスタは、垂直ブランク中に更新されるため、一貫性のある信頼性の高い結果が保証されるため、この情報を読み取るための推奨ソースです。プログラムは、レジスタが値が有効であることを保証するタイミングで読み取られることが確実でない限り、ハードウェアレジスタを直接読み取るべきではありません。Atari 用のライトガンは、光学拡大鏡が追加されているため、より遠くから画面を読み取ることができる点を除いて、ライトペンと同じように機能します。ライトペン/ライトガン入力デバイスには、走査電子ビームを使用する従来の CRT が必要です。ライトペン/ライトガンは、最新の LCD テレビやモニターでは動作しません。
SHADOW: LPENV $0235
ライトペン垂直位置
これは、ライトペン/ライトガンのトリガーが押されたときに取得される VCOUNT 値を保持します。シャドウレジスタは、垂直ブランク中に更新されるため、一貫性のある信頼性の高い結果が保証されるため、この情報を読み取るための推奨ソースです。プログラムは、レジスタが値が有効であることが保証されるタイミングで読み取られることが確実でない限り、ハードウェアレジスタを直接読み取ることを避けるべきです。Atari 用のライトガンは、光学拡大鏡が追加されているため、より遠くから画面を読み取ることができる点を除いて、ライトペンと同じように機能します。ライトペン/ライトガン入力デバイスには、走査電子ビームを使用する従来の CRT が必要です。ライトペン/ライトガンは、最新の LCD テレビやモニターでは動作しません。
非マスク可能割り込み(NMI)有効化
NMIENは非マスク割り込みを有効にします。ビット値は次のとおりです。
オペレーティングシステムは、電源投入ルーチン中にNMIENをデフォルト値の$40 (16進数/64(10進数))に設定します。NMIサービスルーチンは、まず$FFFA( 16進数/65530 (10進数))を走査して原因を特定し、その後、割り込みサービスルーチンに制御を移します。
DLI:
ANTICがDLI修飾ビットが設定された表示リスト命令を検出したときにNMIENのDLIビットが設定されている場合、ANTICはその表示リスト命令モード行の最後のスキャン行でDLIをトリガーします。
オペレーティングシステムはDLIを使用しないため、DLIベクタのデフォルトアドレス(VDSLST、$0200 hex / 512 dec)はROM内のRTI命令を指しています。DLIを使用するアプリケーションは、DLIを有効にする前に、VDSLSTを目的のDLIルーチンを指すように変更する必要があります。
6502アキュムレータ、Xレジスタ、Yレジスタの内容は、DLIルーチンに入る前には保持されません。DLIルーチンは、ルーチン中に使用されるレジスタの状態を保存する責任を負い、最後にRTI命令で終了する前にレジスタの元の値を復元します。ルーチンは通常、レジスタの値を6502スタックにプッシュします。
複数のDLIを使用する場合、最初の割り込みによってVDSLSTが次の割り込みのアドレスを指すように更新され、以降の割り込みについても同様の処理が行われます。画面上の最後のディスプレイリスト割り込みルーチンは、VDSLSTを最初のディスプレイリスト割り込みのアドレスに戻します。あるいは、垂直ブランク割り込みルーチンを使用してVDSLSTアドレスをリセットし、DLIが画面と同期するようにすることもできます。
VBI:
NMIENのVBIビットが設定されると、ANTICはディスプレイリストの末尾にあるJVB(ジャンプ垂直ブランク)の処理終了時に垂直ブランク割り込みを発します。オペレーティングシステムはこの垂直ブランクを使用して、さまざまなハウスキーピング処理(タイマーの更新、コントローラ入力値のシャドウレジスタへのコピー、シャドウレジスタの内容のカスタムチップのハードウェアレジスタへのコピーなど)を実行します。
OS は VVBLKI ($0222 hex /546 dec ) を経由して OS VBI サービス ルーチンを開始し、OS VBI ルーチンは VVBLKD ($0224 hex /548 dec ) を経由して終了します。デフォルトでは、VVBLKI は垂直ブランク割り込みを開始するための OS ジャンプ ベクタ SYSVBV ($E45F hex /58463 dec ) を指し、VVBLKD は OS ジャンプ ベクタ XITVBV ($E462 hex /58466 dec ) を指します。
ユーザープログラムは、オペレーティングシステムの垂直ブランク割り込みルーチンの前(即時)または後(遅延)にカスタムコードの実行を挿入できます。OSの垂直ブランク割り込みは、ユーザープログラムがベクタを更新している間に呼び出される可能性があるため、オペレーティングシステムは、VVBLKIまたはVVBLKDベクタを新しいルーチンを指すように安全に更新するルーチンSETVBV($E45C hex /58460 dec)を提供します。
CRITICフラグ($42 16進数/ 66 10進数)がゼロ以外の場合、ベクタのアドレスに関係なく、遅延垂直ブランク割り込みの実行は抑制されます。CRITICのデフォルト値である0では、即時垂直ブランク割り込みと遅延垂直ブランク割り込みの両方の実行が許可されます。
マスク不可割り込み(NMI)リセット
NMIRESに書き込まれた値は、直近の非マスク可能割り込みの原因を示すNMISTのビットをリセットします。これはオペレーティングシステムの割り込みディスパッチコードで使用されるものであり、通常、ユーザープログラムがここに書き込む必要はありません。
マスク不可割り込み (NMI) ステータス
オペレーティングシステムの非マスク可能割り込みディスパッチルーチンは、このレジスタを読み取って割り込みの原因を判断し、どのサービスルーチンを実行するかを決定します。
ビット値:
ディスプレイリストとは、ANTICがディスプレイを生成する方法を指示する命令のリストです。このディスプレイリスト「プログラム」によって処理されるデータは、スクリーンメモリです。出力はグラフィックディスプレイです。出力されるグラフィックの種類(テキストかアドレス指定可能なピクセルか)は、ディスプレイリスト内の命令によって決定されます。
ディスプレイリストとディスプレイデータは、CPUによってRAMに書き込まれます。ANTICは、ダイレクトメモリアクセス(DMA)と呼ばれる手法を用いて、ディスプレイリスト命令、スクリーンメモリ、および文字セット情報をRAMから読み取ります。BASICまたは6502マシン語プログラムの役割は、ディスプレイを初期化することです。つまり、ディスプレイリスト命令を設定し、スクリーンメモリ(および必要に応じて文字セット)を整理し、ANTICにディスプレイの開始を指示します。その後、ANTICは自動的に画面表示を生成します。これにより、Atari 8ビットコンピュータは、CPUの直接的な介入なしに、複雑な混合モード表示を実現できます。他のプラットフォーム、たとえずっと後に設計されたものであっても、1つのディスプレイでグラフィックモードを混合することはできず、また、複雑なCPU割り込みなしに混合することもできません。
ANTIC は、ディスプレイ リストの命令を処理し、画面メモリ (および該当する場合は文字セット データ) を読み取り、この情報をリアルタイムのグラフィック データ ストリームに変換し、このデータ ストリームをCTIA/GTIA チップに送信します。CTIA/GTIA チップは、グラフィック ピクセルに色を適用し、ビデオを出力します。この 2 つのチップは、6 つのテキスト モードと 8 つのグラフィック モード (合計 14) を提供します。より高度なバージョンであるGTIA は、各 ANTIC グラフィック モードに 3 つの代替色解釈を追加し、合計 56 (14 × 4) のグラフィック モードを提供します。ただし、新しい色解釈によって提供される完全なカラー パレットを表現できるのは、ハーフ カラー クロック ピクセルに基づく ANTIC グラフィック モードのみであり、その中で使いやすいのは ANTIC モード 2 (OS グラフィック モード 0 テキスト) と ANTIC モード F (OS グラフィック モード 8) です。したがって、ANTIC + GTIA の固有のハードウェア機能を使用して使用できる適切な数の固有のグラフィック モードは、20 - 14 の ANTIC モード + ANTIC モード 2 と F それぞれに 3 つの追加色解釈です。
Atariのディスプレイは、テキストまたはグラフィックモードの各行を記述するANTIC命令の連続として構築されており、画面の上部から下部へと順に処理され、目的の表示領域が満たされるまで続きます。事実上、画面はANTICモード命令の垂直方向の積み重ねです。モードによって占有する走査線の数や使用するRAMの量が異なります。ディスプレイを設計するには、各モード命令の走査線数を数え、各モード行のメモリを追跡して、ANTICまたはビデオ規格の制限を超えないようにする必要があります(「制限事項」の項を参照)。
1つのディスプレイに複数のグラフィックモードを混在させるには、画面上の目的の位置ごとに異なる文字モードまたはマップモードの指示を与えるだけで済みます。例えば、Atariオペレーティングシステムのグラフィックモード1~8では、全画面表示、または画面下部に4行のテキストウィンドウを表示するオプションが提供されます。この分割画面機能は、CPU割り込みやビデオハードウェアのカスタム操作を一切行わずに、ANTICとそのディスプレイリストの本来の機能を利用して実現されています。
ANTICには4種類の命令があります。
マップモードとキャラクターモードの命令には、以下の命令で有効にできる追加の修飾子があります。
ANTICは、レジスタDLISTL/DLISTH($D402-$D403 16進数/ 54274-54275 10進数)に格納された16ビットアドレスが指すディスプレイリストの実行を開始します。アドレスレジスタは、各命令の実行時にANTICによって自動的にインクリメントされます。自動インクリメント中は、ANTICはアドレスの下位10ビットのみを更新できるため、ディスプレイリストの開始と終了は1Kアドレス範囲内に制限されます。
レジスタは、ANTICのJMP(ジャンプ)命令とJVB(ジャンプして垂直ブランキングを待機)命令によって、ディスプレイリストの実行中にも更新されます。これらの命令はアドレスの16ビット全体をロードするため、1Kディスプレイリストの制限を回避するために使用できます。
アドレスは、オペレーティングシステムの垂直ブランク割り込み (VBI) ルーチンによって、オペレーティングシステムのシャドウレジスタ SDLSTL/SDLSTH ($0230-$0231 hex /560-561 dec ) の値を使用して更新されます。OS VBI ルーチンが有効になっている場合、CPU または ANTIC ジャンプ命令による ANTIC DLIST レジスタへの直接更新は、次の垂直ブランク中に OS によって上書きされます。VBI 処理はシステムの通常の状態であるため、ほとんどのプログラムはこれに依存し、ディスプレイ リストを設定するために OS シャドウレジスタ (SDLSTL/SDLSTH $0230-$0231 hex /560-561 dec ) のみを更新します。
この凡例は、以下の命令ビット図に適用されます。
命令ビット:
ビット7~4は、ビット3~0のプレイフィールドモード命令に対する修飾子です。ビット値が1の場合は修飾子が有効になり、0の場合は無効になります。
モードビットがすべてゼロの場合、ANTICはプレイフィールドDMAを実行せず、背景色の空白スキャンラインを1本以上表示します。通常のカラー解釈モードでは、「背景」はカラーレジスタCOLBK(D01A hex /53274 dec)またはOS Shadow COLOR4(02C8 hex /712 dec)ですが、GTIAカラー解釈モードでは異なります。詳細については、GTIAページのCOLBKに関する説明を参照してください。
空白スキャンラインの数は、ビット4からビット6の値によって指定され、0から7までの範囲をとります。ANTICはこの値に1を加算し、結果として得られるスキャンライン数を表示します。命令値:
空白行は、電子ビームがディスプレイ上部の垂直オーバースキャン領域から完全に離れるまで画面表示の開始を遅らせるのに役立ちます。Atariオペレーティングシステムは、この目的のために、70 16進数/112 10進数命令(または24本の空白スキャンライン)から始まるすべてのグラフィックモードを作成します。空白行は、カスタムディスプレイの一部を異なる用途に分割するためにも役立ちます(たとえば、ステータス表示とメイングラフィックの間の境界など)。
ブランクモードの行は、スクロール領域内に含められません。これは、ブランクモードの行命令には、本来的に微調整スクロール修飾ビットがないためです。ただし、ブランクモードの命令は、垂直スクロール領域を終了するために使用でき、垂直スクロール値に応じたスキャンラインの高さの変化は引き続き適用されます。
DLI修飾ビットは、ブランク行命令で使用できます。DLIビットが有効になっている場合、命令の最後のブランクスキャン行でディスプレイリスト割り込みがトリガーされます。ブランク行ではプレイフィールドDMAは発生しないため(ディスプレイリストDMAとプレイヤー/ミサイルDMA(有効な場合)のみが発生します)、ブランク行はプレイフィールドグラフィックが不要な場合に使用でき、カラーレジスタやプレイヤー/ミサイルの位置を変更するディスプレイリスト割り込みルーチンにより多くの時間を確保できます。
モード値が1の場合、ANTICはプログラム(表示リスト)内でジャンプを実行します。表示リストの次の2バイトがANTICレジスタDLISTL/DLISTH(16進数$D402-$D403、10進数$ 54274-54275 )にロードされ、次の命令の実行位置が変更されます。
ジャンプには2種類あります。
DLISTレジスタは、オペレーティングシステムの垂直ブランク割り込み(VBI)ルーチンによって、シャドウレジスタSDLSTL/SDLSTH(16進数で0230~0231、10進数で560~561 )の値を使用して更新されます。OSのVBIルーチンが有効になっている場合、CPUまたはANTICジャンプ命令によるANTIC DLISTレジスタへの直接更新は、次の垂直ブランク中にOSによって上書きされます。これは、無効なアドレス(またはシャドウSDLST値と異なる有効なアドレス)を指定したANTIC JVB(ジャンプして垂直ブランクを待つ)命令は、ディスプレイに実際には影響を与えないことを意味します。
JVBの引数は通常、同じディスプレイリストの開始位置を指しますが、別のディスプレイリストを指すことも可能です。これにより、連続する垂直ブランクの後にディスプレイリストのチェーンが実行されます。もちろん、ANTICが次のディスプレイリストの開始位置を制御できるようにするには、OSの垂直ブランク割り込みを無効にして、シャドウレジスタの値でANTICハードウェアレジスタが上書きされないようにする必要があります。
以下はANTICグラフィックモードの説明一覧です。各モードの詳細については、「プレイフィールドグラフィックモード」のセクションを参照してください。
モードラインに必要なメモリ容量は、以下の2つの要因によって決まります。
水平細スクロール修飾子は、現在のモード行のメモリ要件を、DMACTLで指定された幅から次に大きい値に変更します。
ビット7~4は、ビット3~0にあるプレイフィールドモード命令の修飾子です。プレイフィールドモード命令の値は$02~$0Fの範囲です。修飾子ビットの値が1の場合は修飾子が有効になり、0の場合は無効になります。
Bit4: 位置値$10、プレイフィールドモードの水平スクロールを制御します。
水平スクロールが有効になっている場合、ANTIC は、行の先頭と末尾に部分的にスクロールされた表示バイトを表示するために、表示されているバイト数よりも多くの画面メモリバイトを取得します。ディスプレイがナローモードの場合、ANTIC はノーマルモードに必要な画面バイト数を取得します。ディスプレイがノーマルモードの場合、ANTIC はワイドスクリーンモードに必要なバイト数を取得します。ワイドスクリーンモードでは、ANTIC は追加の画面バイトを取得しません。ワイドスクリーンでスクロールすると、空白データがスクロール領域に移動します。これは、通常の NTSC/PAL ディスプレイでは表示されないオーバースキャン領域で発生します。
Bit5: 位置値$20、プレイフィールドモードの垂直スクロールを制御します。
ディスプレイの垂直スクロール領域は、ディスプレイリスト内のANTICモードラインのVSビット($20)を順番に設定することで定義されます。VSビットが設定されていない最初のモードラインがスクロール領域の終端となり、スクロール領域の下部までスクロールアップするための新しい情報を供給するバッファラインとして使用されます。
ビット6:位置値$40、現在のプレイフィールドモードラインの画面メモリの開始アドレスをロードします。
LMS オプションは、命令に続く 2 バイトの 16 ビット値を ANTIC のスクリーン メモリ スキャン アドレスにロードします。指定されたキャラクター モードまたはマップ モードは、そのアドレスからバイトの表示を開始します。LMS オプションは、ディスプレイ リストの最初のプレイフィールド モード命令行 (空白行ではない) に記述する必要があり、これにより ANTIC がスクリーン メモリの先頭から読み取りを開始するように初期化されます。オペレーティングシステムによって生成されるほとんどのフルスクリーン モードでは、ディスプレイ リストに LMS 修飾子が 1 回だけ存在します。ANTIC は、次の行に備えて、各モード行の末尾で LMS アドレスを自動的にインクリメントします。スクリーン メモリが 4K 境界を超えない限り、後続のプレイフィールド モード命令で LMS 修飾子は必要ありません。
プレイフィールドマップモードEまたはFを使用したフルスクリーン表示では、画面中央付近のマップ命令にLMS修飾子が2回出現します。これは、フルスクリーン表示には4K以上の画面メモリが必要となるためです。(モードF表示には、高解像度320ピクセルラインとGTIA表示モードが含まれます。)
マップ命令と文字モード命令をLMSビットと組み合わせることで、64Kのアドレス空間内で各表示行ごとに画面メモリのアドレスを自由に設定することが可能になります。つまり、画面メモリは完全に連続したメモリ領域をより高いアドレスに向かって順次スキャンする必要はなく、各モード行に、そのモードの要件、表示幅、およびスクロール機能を満たすのに十分な連続したメモリ領域を確保すればよいのです。
Bit7: 位置値$80 は、ANTIC にプレイフィールドモードの最後のスキャン ラインで CPU 処理割り込みを呼び出すように指示します。
ANTICレジスタNMIEN(D40E hex /54286 dec)のビット7($80 )がセットされている場合、モードラインの最後のスキャンラインで割り込みルーチンがトリガーされ、アドレスVDSLST(200 hex /512 dec )を介してベクタリングされます。
6502のアキュムレータ、Xレジスタ、Yレジスタの内容は、DLIルーチンに入る前には保持されません。DLIルーチンは、DLI中に使用されるレジスタの状態を保存し、RTI命令で終了する前にレジスタの元の値を復元する必要があります。
ANTICチップは、さまざまなプレイフィールドモードと幅に対応しています。しかし、Atari 800/400コンピュータに付属していたオリジナルのAtariオペレーティングシステムでは、これらのグラフィックモードのうち限られたサブセットにしか簡単にアクセスできませんでした。ANTICプレイフィールドモードは、Atari BASICの「GRAPHICS」コマンドを介してユーザーに公開され、他の言語でも同様のシステムコールを介して利用できます。奇妙なことに、オリジナルのOSとBASICで直接サポートされていないモードは、ゲームに最も役立つモードです。Atari 8ビットXL/XEコンピュータで使用されたOSの後のバージョンでは、これらの「欠落していた」グラフィックモードのほとんどがサポートされるようになりました。
ANTICチップは、ディスプレイリストやその他の設定を使用してこれらのモードを作成します。デフォルトのGTIAカラー解釈における任意のグラフィックモードは、ディスプレイリスト内の命令を変更することで、CPUの介入なしに自由に組み合わせることができます。
ANTIC の画面ジオメトリは固定されていません。ハードウェアレジスタによって、ANTIC は狭いプレイフィールド (128 カラークロック/256 高解像度ピクセル幅)、標準幅のプレイフィールド (160 カラークロック/320 高解像度ピクセル幅)、および広いオーバースキャンプレイフィールド (192 カラークロック/384 高解像度ピクセル幅) を表示するように指示できます。オペレーティングシステムのグラフィックモードのデフォルトの高さは 192 スキャンラインですが、Antic はカスタム表示リストを作成することで、最大 240 TV スキャンラインの高さの垂直オーバースキャンを表示できます。
モードFはNTSCアーティファクトを利用して色を生成し、 Apple IIのグラフィックモードと同様の動作をします。ピクセル解像度は横320ですが、色解像度はその半分です。そのため、2つのピクセルのグループごとに「ブレンド」されて単一の色を形成し、この方法で4つのアーティファクトカラーが生成されます。前景と背景の色が黒/白/グレー以外の色に設定されている場合、色は着色されます。この方法で生成される正確な色は、Atari 8ビットモデルの種類やCTIAチップとGTIAチップによって異なるため、モードFを使用するソフトウェアを、開発対象以外のマシンで実行すると、望ましくないアーティファクトカラーが発生する可能性があります。PALマシンではアーティファクトカラーを取得できなかったため、モードFはモノクロになります。
モードFは、メモリ要件が高い(8KB)ことと、アタリ8ビットコンピュータのすべてのモデルで同じように表示されないというアーティファクトカラーの一貫性のなさから、ソフトウェアで広く使用されることはありませんでした。このモードFを利用したゲームには、シエラ社のグラフィックアドベンチャーゲームである『Troll's Tale』や『Wizard and the Princess』、『Lode Runner』、そして『Ultima』シリーズなどがあります。
このビデオ表示システムは、NTSC表示方式とその制約を慎重に考慮して設計されています。システムCPUクロックとビデオハードウェアは、NTSCクロック周波数の半分に同期されています。そのため、すべての表示モードのピクセル出力は、NTSCカラークロックのサイズに基づいています。これは、画面上のピクセルの水平位置に関係なく、正確で一貫した色を保証するために必要な最小時間です。その結果、水平スクロール時に色の「ストロボ」現象が発生しない、正確なピクセルサイズと色再現が実現します。(色のストロボ現象とは、信号の変化がカラークロックと一致しないために、テレビ/モニターハードウェアが正しい色に到達するのに十分な時間が確保されず、水平位置に基づいてピクセルの色相が不自然に変化する現象です。)
すべての文字セットは、文字を表すために8バイトの連続したデータを使用します。これらのバイトの文字/グリフのレンダリングには4つのタイプがあります。各文字モードは、特定のレンダリング方法に関連付けられています。
GTIAモードは、 GTIAレジスタPRIOR($D01B hex /53275 dec )を介して代替カラー解釈オプションが有効になり、GPRIOR($026F hex /623 dec)によってシャドウされるAntic Mode Fディスプレイです。これらのGTIAモードのフルカラー表現は、Anticテキストモード2および3でも使用できますが、これらのモードでは、色を実用的に使用するにはカスタム文字セットも必要になります。詳細については、 GTIAを参照してください。