サブページ
$DFF096

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との間でデータを転送する。

$DFF096

バスサイクルの割当て

Amigaのバスタイミングはビデオラスタに同期している。1本の水平ラスタラインは約63.5マイクロ秒で、227.5バスサイクルから構成される。各バスサイクルは約280ナノ秒――この間に1回のメモリアクセスが可能である。

奇数サイクルと偶数サイクル

Amigaのバスアーキテクチャの要は、サイクルの奇数偶数への分割である:

  • 奇数サイクルはDMA専用。68000は使用できない。
  • 偶数サイクルはCPU、Copper、Blitterで共有。DMAが常に優先される。

68000はそのクロック周波数により560nsに1回しかメモリアクセスできない――ちょうどバスサイクル2つ分である。そのため偶数サイクルのみを使用できる。つまり、奇数サイクルのDMAチャネル(スプライト、オーディオ、ディスク、リフレッシュ)はプロセッサを全く遅延させずに動作する。

DMA優先度とサイクル割当て

各ラスタライン内でDMAスロットは固定順序で割り当てられる:

DMAサイクル割当て(ラスタラインごと)
$00–$03リフレッシュDMA — DRAMリフレッシュ用4サイクル(奇数サイクル)
$04–$06ディスクDMA — 3サイクル(奇数サイクル)
$07–$0EオーディオDMA — チャネル0〜3(奇数サイクル)
$0F–$26スプライトDMA — スプライト0〜7、各2サイクル(奇数サイクル)
DDFSTRT–DDFSTOPビットプレーンDMA — 可変位置、奇数サイクル(lores最大4プレーン/hires最大2プレーン)と偶数サイクル(lores 5〜6プレーン/hires 3〜4プレーン)を使用
偶数サイクルCopper DMA — 空いている偶数サイクルを使用、BlitterとCPUより高優先度
偶数サイクルBlitter DMA — 空いている偶数サイクルを使用、CPUより高優先度
偶数サイクル68000 CPU — 残った偶数サイクルを使用

低解像度で4プレーン以下の場合、すべてのビットプレーンデータは奇数サイクルに収まり、偶数サイクルはCPUに開放される。loresで5〜6プレーンの場合、8サイクルグループごとに2つの偶数サイクルがビットプレーンDMAに消費され、CPUの帯域幅が減少する。高解像度では2プレーンは奇数サイクルに収まるが、hiresで3〜4プレーンになると偶数サイクルを奪い取り、CPUはバス時間の半分以上を失う可能性がある。

Fast RAMKickstart ROMから実行されるプログラムはDMA競合の影響を受けない。それらのバスはChip RAMバスとは独立しているためである。

$DFF096

画面構造とラスタ

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はこのカウンタを読むことで、フレーム内の正確な位置を判定できる。

ビーム位置レジスタ
$DFF006VHPOSR — 垂直(V7–V0)・水平(H8–H1)位置(読み取り)
$DFF004VPOSR — LOFフラグ(ビット15)とV8(ビット0)(読み取り)
$DFF02CVHPOSW — ビーム位置(書き込み)
$DFF02AVPOSW — LOFとV8(書き込み)
レジスタ ビット 名前 機能
VHPOS15–8V7–V0垂直位置(ライン番号、下位8ビット)
VHPOS7–0H8–H1水平位置(バスサイクル番号、0–$E3)
VPOS15LOFロングフレームフラグ(1 = ロングフレーム/奇数ライン)
VPOS0V8垂直位置ビット8(ライン256〜312用)

水平位置は$00から$E3(0〜227)の範囲で、$0F〜$35が水平帰線消去期間に対応する。垂直ライン0〜25が垂直帰線消去期間で、可視領域はライン26からライン312まで。

LOFビットは現在どちらのフィールドタイプが表示されているかを示す――ロングフレーム(奇数ライン)でセット、ショートフレーム(偶数ライン)でクリア。ノンインターレースモードではLOFは常に1。

$DFF096

DMACONレジスタ

DMACONレジスタはすべてのDMAチャネルの中央スイッチである。SET/CLR機構を使用し、直接書き込みはできず、個々のビットのセットまたはクリアのみ可能。

DMACONレジスタアドレス
$DFF096DMACON — DMA制御(書き込み)
$DFF002DMACONR — DMA制御(読み取り)
ビット 名前 機能 詳細
15SET/CLRセット/クリア制御1 = リストされたビットをセット; 0 = クリア
14BBUSYBlitterビジー読み取り専用: Blitter動作中に1
13BZEROBlitterゼロ読み取り専用: Blitter出力がすべてゼロの場合1
12–11未使用
10BLTPRIBlitter優先度1 = BlitterがCPUに対して絶対優先
9DMAENマスタDMAイネーブルいずれかのDMAチャネル(ビット0–8)が動作するにはセット必須
8BPLENビットプレーンDMAビットプレーン表示DMAを有効化
7COPENCopper DMACopperコプロセッサDMAを有効化
6BLTENBlitter DMABlitter DMAを有効化
5SPRENスプライトDMAスプライトDMAを有効化
4DSKENディスクDMAディスクDMAを有効化
3AUD3ENオーディオch. 3オーディオチャネル3 DMAを有効化
2AUD2ENオーディオch. 2オーディオチャネル2 DMAを有効化
1AUD1ENオーディオch. 1オーディオチャネル1 DMAを有効化
0AUD0ENオーディオch. 0オーディオチャネル0 DMAを有効化

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データ構造にアクセスする必要がある場合に重要である。

$DFF096

割り込みシステム

Amigaの割り込みシステムはPAULAが管理し、すべてのソースからの割り込み要求を収集して適切な68000割り込みレベル信号を生成する。14の割り込みソースが6つの優先度レベルに構成されている(レベル7/NMIは使用されない)。

2つのレジスタがシステムを制御し、いずれもDMACONと同じSET/CLR機構を使用する:

割り込みレジスタ
$DFF09CINTREQ — 割り込み要求(書き込み)
$DFF01EINTREQR — 割り込み要求(読み取り)
$DFF09AINTENA — 割り込みイネーブル(書き込み)
$DFF01CINTENAR — 割り込みイネーブル(読み取り)

INTREQとINTENAは同じビットレイアウトを共有する:

ビット 名前 レベル 機能
15SET/CLRセット/クリア制御ビット
14INTEN(6)マスタ割り込みイネーブル(割り込みが発生するにはセット必須)
13EXTER6CIA-B割り込みまたは拡張ポート
12DSKSYN5ディスク同期ワード一致検出
11RBF5シリアルポート受信バッファフル
10AUD34オーディオチャネル3データ送信完了
9AUD24オーディオチャネル2データ送信完了
8AUD14オーディオチャネル1データ送信完了
7AUD04オーディオチャネル0データ送信完了
6BLIT3Blitter操作完了
5VERTB3垂直帰線消去 — 各フレーム開始時(ライン0、50Hz)
4COPER3Copper生成割り込み
3PORTS2CIA-A割り込みまたは拡張ポート
2SOFT1ソフトウェア割り込み(INTREQへの書き込みでトリガー)
1DSKBLK1ディスクDMA転送完了
0TBE1シリアルポート送信バッファ空

割り込みの発生条件

割り込みが68000に到達するには、3つの条件を満たす必要がある:

  1. INTREQの対応するビットがセットされている(ハードウェアソースがサービスを要求)
  2. INTENAの対応するビットがセットされている(ソースが有効化されている)
  3. INTENAのINTENビット(ビット14)がセットされている(マスタイネーブルがオン)

3つの条件すべてが真のとき、PAULAは68000のIPLピンに適切な割り込みレベルをアサートする。

割り込みの確認応答

割り込みの処理後、ハンドラはINTREQの対応するビットを書き込みで必ずクリアしなければならない。ハードウェアはリクエストビットを自動クリアしない。CIA割り込みについては、CIAのICRレジスタを読むとCIA側のフラグはクリアされるが、対応するINTREQビット(CIA-Aはビット3、CIA-Bはビット13)は明示的にクリアする必要がある。

$DFF096

割り込みベクタ

68000はAmiga上で自動ベクタ割り込みを使用する。各優先度レベルは固定のベクタアドレスにマッピングされる:

68000割り込みベクタ
$064 (Vec 25)レベル1 — TBE, DSKBLK, SOFT
$068 (Vec 26)レベル2 — PORTS(CIA-A、拡張)
$06C (Vec 27)レベル3 — COPER, VERTB, BLIT
$070 (Vec 28)レベル4 — AUD0, AUD1, AUD2, AUD3
$074 (Vec 29)レベル5 — RBF, DSKSYN
$078 (Vec 30)レベル6 — EXTER(CIA-B、拡張)、INTEN
$07C (Vec 31)レベル7 — NMI(Amigaハードウェアでは未使用)

レベル番号が大きいほど優先度が高い。レベル6の割り込みはレベル3のハンドラを先取りできるが、逆は不可。複数のソースが同一レベルを共有するため、割り込みハンドラはINTREQRを読んでどのソースがトリガーしたかを判定する必要がある。

CIA割り込みのルーティング

2つのCIAはPAULAを介して異なる方法で割り込みをルーティングする:

  • CIA-APORTS割り込み(ビット3、レベル2)をトリガーする。具体的なCIA-Aソースは、CIA-AのICRレジスタを読んで特定する。
  • CIA-BEXTER割り込み(ビット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によるビットプレーンポインタの再初期化に使用される。