サブページ
DMAの概要
カスタムチップとChip RAM間のすべてのデータ転送は、Agnusが制御するDMA(Direct Memory Access)チャネルを通じて行われる。68000 CPUはメモリへのアクセスを競合する多くのバスマスタの一つに過ぎない。各カスタムチップサブシステム――ビットプレーン、スプライト、ディスク、オーディオ、Copper、Blitter――は、プロセッサとは独立してChip RAMの読み書きができる専用のDMAチャネルを持つ。
DMA転送は、各I/Oユニットの3種類のレジスタを通じて動作する:
- 制御レジスタ — CPUがパラメータ(解像度、音量、ディスクトラックなど)を設定するために使用
- データレジスタ — ユニットとChip RAM間で転送される実際のデータを保持
- アドレスレジスタ(ポインタ) — Chip RAMのどこから読み書きするかをDMAコントローラに指示
中央DMA制御レジスタDMACONが、各チャネルを個別に有効化・無効化する。いずれのチャネルも動作するにはマスタイネーブルビットもセットされている必要がある。
6つのDMAチャネル
ビットプレーンDMA — 画面表示データをChip RAMからビットプレーンデータレジスタに読み込み、Deniseのビデオシーケンサに供給して画面出力を行う。
スプライトDMA — スプライト画像データをChip RAMからスプライトデータレジスタに転送する。
ディスクDMA — フロッピーディスクデータをディスクコントローラとChip RAM間で双方向に転送する。
オーディオDMA — デジタル化されたサウンドサンプルデータをChip RAMからオーディオチャネルデータレジスタに読み込む。
Copper DMA — CopperコプロセッサのプログラムをChip RAMからフェッチする。
Blitter DMA — エリアフィル、ライン描画、ブロックコピー操作のためにBlitterとの間でデータを転送する。
バスサイクルの割当て
Amigaのバスタイミングはビデオラスタに同期している。1本の水平ラスタラインは約63.5マイクロ秒で、227.5バスサイクルから構成される。各バスサイクルは約280ナノ秒――この間に1回のメモリアクセスが可能である。
奇数サイクルと偶数サイクル
Amigaのバスアーキテクチャの要は、サイクルの奇数と偶数への分割である:
- 奇数サイクルはDMA専用。68000は使用できない。
- 偶数サイクルはCPU、Copper、Blitterで共有。DMAが常に優先される。
68000はそのクロック周波数により560nsに1回しかメモリアクセスできない――ちょうどバスサイクル2つ分である。そのため偶数サイクルのみを使用できる。つまり、奇数サイクルのDMAチャネル(スプライト、オーディオ、ディスク、リフレッシュ)はプロセッサを全く遅延させずに動作する。
DMA優先度とサイクル割当て
各ラスタライン内でDMAスロットは固定順序で割り当てられる:
低解像度で4プレーン以下の場合、すべてのビットプレーンデータは奇数サイクルに収まり、偶数サイクルはCPUに開放される。loresで5〜6プレーンの場合、8サイクルグループごとに2つの偶数サイクルがビットプレーンDMAに消費され、CPUの帯域幅が減少する。高解像度では2プレーンは奇数サイクルに収まるが、hiresで3〜4プレーンになると偶数サイクルを奪い取り、CPUはバス時間の半分以上を失う可能性がある。
Fast RAMやKickstart ROMから実行されるプログラムはDMA競合の影響を受けない。それらのバスはChip RAMバスとは独立しているためである。
画面構造とラスタ
Amigaのビデオ出力はPAL標準に準拠する(北米モデルではNTSC)。すべてのDMAタイミングはラスタから導出されるため、ラスタの理解は不可欠である。
PALタイミング
PALフレームは625ラインで構成され、毎秒50フィールドである。フリッカーを避けつつライン周波数を管理可能な範囲(15,625Hz)に保つため、画像は2つのインターレースフィールドに分割される:
- ロングフレーム(奇数ライン:1, 3, 5, ... 625)— 313ライン
- ショートフレーム(偶数ライン:2, 4, 6, ... 624)— 312ライン
Amigaのデフォルトのノンインターレースモードでは、両方のフィールドが同じ313ラインを50Hzで表示し、ライン間隔が見える安定した画像を生成する。インターレースモードを有効にすると垂直解像度が625ラインに倍増するが、高コントラストの水平エッジでフリッカーが発生する。
ビーム位置レジスタ
Agnusは電子ビームの位置を追跡する内部カウンタを持つ。CPUはこのカウンタを読むことで、フレーム内の正確な位置を判定できる。
水平位置は$00から$E3(0〜227)の範囲で、$0F〜$35が水平帰線消去期間に対応する。垂直ライン0〜25が垂直帰線消去期間で、可視領域はライン26からライン312まで。
LOFビットは現在どちらのフィールドタイプが表示されているかを示す――ロングフレーム(奇数ライン)でセット、ショートフレーム(偶数ライン)でクリア。ノンインターレースモードではLOFは常に1。
DMACONレジスタ
DMACONレジスタはすべてのDMAチャネルの中央スイッチである。SET/CLR機構を使用し、直接書き込みはできず、個々のビットのセットまたはクリアのみ可能。
SET/CLR機構
DMACONは通常のレジスタのように書き込むことはできない。ビット15が操作を決定する:
- ビット15 = 1: 書き込み値で1にセットされたすべてのビットがDMACONでセットされる。他のビットは変更されない。
- ビット15 = 0: 書き込み値で1にセットされたすべてのビットがDMACONでクリアされる。他のビットは変更されない。
DMAチャネルは個別イネーブルビットとマスタDMAENビット(ビット9)の両方がセットされている場合のみアクティブになる。
; ビットプレーンとCopper DMAを有効化:
MOVE.W #$8380,$DFF096 ; SET/CLR=1, DMAEN=1, BPLEN=1, COPEN=1
; Blitter DMAのみ無効化:
MOVE.W #$0040,$DFF096 ; SET/CLR=0, BLTEN=1 → BLTENをクリア
Blitter優先度(BLTPRI)
BLTPRIがセットされると、Blitterは68000に対して絶対優先権を持ち、Blitter操作中CPUは偶数サイクルのバスアクセスを一切得られない。クリアの場合、CPUは偶数バスサイクル4回に1回を付与され、長時間のロックアウトが防止される。これはCPUがタイムクリティカルな割り込みを処理したり、Chip RAM内のOSデータ構造にアクセスする必要がある場合に重要である。
割り込みシステム
Amigaの割り込みシステムはPAULAが管理し、すべてのソースからの割り込み要求を収集して適切な68000割り込みレベル信号を生成する。14の割り込みソースが6つの優先度レベルに構成されている(レベル7/NMIは使用されない)。
2つのレジスタがシステムを制御し、いずれもDMACONと同じSET/CLR機構を使用する:
INTREQとINTENAは同じビットレイアウトを共有する:
割り込みの発生条件
割り込みが68000に到達するには、3つの条件を満たす必要がある:
- INTREQの対応するビットがセットされている(ハードウェアソースがサービスを要求)
- INTENAの対応するビットがセットされている(ソースが有効化されている)
- INTENAのINTENビット(ビット14)がセットされている(マスタイネーブルがオン)
3つの条件すべてが真のとき、PAULAは68000のIPLピンに適切な割り込みレベルをアサートする。
割り込みの確認応答
割り込みの処理後、ハンドラはINTREQの対応するビットを書き込みで必ずクリアしなければならない。ハードウェアはリクエストビットを自動クリアしない。CIA割り込みについては、CIAのICRレジスタを読むとCIA側のフラグはクリアされるが、対応するINTREQビット(CIA-Aはビット3、CIA-Bはビット13)は明示的にクリアする必要がある。
割り込みベクタ
68000はAmiga上で自動ベクタ割り込みを使用する。各優先度レベルは固定のベクタアドレスにマッピングされる:
レベル番号が大きいほど優先度が高い。レベル6の割り込みはレベル3のハンドラを先取りできるが、逆は不可。複数のソースが同一レベルを共有するため、割り込みハンドラはINTREQRを読んでどのソースがトリガーしたかを判定する必要がある。
CIA割り込みのルーティング
2つのCIAはPAULAを介して異なる方法で割り込みをルーティングする:
- CIA-AはPORTS割り込み(ビット3、レベル2)をトリガーする。具体的なCIA-Aソースは、CIA-AのICRレジスタを読んで特定する。
- CIA-BはEXTER割り込み(ビット13、レベル6)をトリガーする。具体的なCIA-Bソースは、CIA-BのICRレジスタを読んで特定する。
PORTSとEXTERはどちらもZorroバス上の拡張カードからトリガーすることも可能。
ソフトウェア割り込みとCopper割り込み
SOFTビット(ビット2)により、INTREQに書き込むことでソフトウェアがレベル1割り込みを生成できる。CopperもMOVE操作のみを実行できるため、INTREQに適切な値を書き込むことでCOPER割り込み(ビット4、レベル3)をトリガーする:
; 割り込みをトリガーするCopper命令:
MOVE #$8010,INTREQ ; INTREQのビット4(COPER)をセット
VERTB割り込み(ビット5、レベル3)は毎回の垂直帰線消去期間の開始時(ライン0)、PALでは毎秒50回発生する。これはフレーム同期操作の主要なタイミング基準であり、アニメーション更新、入力読み取り、Copperによるビットプレーンポインタの再初期化に使用される。