$DFF000

チップセットアーキテクチャ

Amigaの強さはカスタムチップセットにあった――3つの専用チップが グラフィックス、サウンド、DMAをCPUから独立して処理していた。Motorola 68000が コードを実行する一方で、カスタムチップがマシンを動かしていた。

COMMODORE
AMIGA A500
REV 6A · 1987
68000 CPU
AGNUS 8375
GARY 5719
DENISE 8362
PAULA 8364
CIA-A $BFE001
CIA-B $BFD000
ROM KS 1.3
CHIP
RAM
KEYBOARD
PWR
FDD
JOY 0
JOY 1
SER
PAR
VIDEO
AUD
EXPANSION / TRAPDOOR
コンポーネントにホバーして詳細を表示

Agnus(後にFat Agnus、さらにAlice)はカスタムチップセットの頭脳だった。 DMAを制御し――他のすべてのチップがCPUに負担をかけずにデータを 読み取れるようメモリアクセスを管理していた。Copper(映像ビームに同期して ハードウェアレジスタを書き換えるプログラマブルコプロセッサ)とBlitter (高速メモリコピー、線描画、塗りつぶし操作のためのハードウェアブロック転送 エンジン)を内蔵していた。

Denise(AGAチップセットではLisa)はすべての映像出力を担当していた: ビットプレーングラフィックス、ハードウェアスプライト、衝突検出、カラーパレット。 Amigaはプレーナーグラフィックスモデルを採用していた――ピクセルをパックされた値として 格納するのではなく、ピクセルの色の各ビットが別々のビットプレーンから来ていた。 これによりスクロールや特定のエフェクトが非常に効率的だった。

Paulaは4つの独立した8ビットオーディオチャンネル(ハードウェアボリュームと 周期制御付き)、ディスクドライブアクセス、シリアルI/O、割り込み管理を担当していた。 MOD音楽が機能したのは、PaulaのDMAチャンネルがチップRAMから波形サンプルを 連続的に読み取る一方でCPUが他の処理を行えたからだ――音楽は文字通り 自分自身で演奏していた。

CIA 8520(×2)――Complex Interface Adapter。CIA-Aは$BFE001に配置され、 キーボード、ゲームポートの発射ボタン、電源LED、オーディオローパスフィルタを 担当していた。CIA-Bは$BFD000に配置され、パラレルポート、シリアル制御線、 ディスクドライブ信号を担当していた。各CIAには2つの16ビットタイマーと 24ビット時刻カウンタが内蔵されていた。

$000000

メモリマップ

68000の24ビットアドレスバスは16 MBのアドレス空間を提供していた。すべての ハードウェアには固有の場所があった。メモリアドレスへの書き込みは、マップ上の 位置に応じてデータの格納、グラフィックスの描画、サウンドの再生、 電源LEDの切り替えのいずれかを行った。

$000000
チップRAM
最大 2 MB
CPUとカスタムチップの共有; グラフィックス、オーディオ、ディスクデータ
$200000
ファストRAM / Zorro II
最大 8 MB
CPU専用、DMA競合なし
$A00000
予約領域
$BFD000
CIA-B レジスタ
パラレル、ディスク、シリアル制御
$BFE001
CIA-A レジスタ ★
キーボード、LED、フィルタ、ゲームポート
$C00000
スローRAM
512 KB(A500 トラップドア)
バス共有だがDMAアクセスなし
$D00000
予約 / 拡張
$DFF000
カスタムチップレジスタ
約256レジスタ
Agnus, Denise, Paula — ビットプレーン、スプライト、色、DMA
$E80000
Autoconfig / Zorro II ID
$F80000
Kickstart ROM
256–512 KB
exec.library, intuition, graphics — Amiga OSカーネル全体

電源投入時、CIA-Aのオーバーレイビットがアドレス$000000にROMをマッピングし、 CPUがリセットベクタを読めるようにする。Kickstartが最初に行うことの一つが このビットをクリアすることで、チップRAMを$000000に入れ替え、ROMを$F80000に 戻す。exec.libraryのジャンプテーブルアーキテクチャにより、ライブラリベースからの 固定された負のオフセットでOS関数を呼び出すことができた――何度も夜を費やして 探究した仕組みだ。

$BFE001

CIA-Aレジスタ

このサイトの名前の由来となったレジスタ。CIA-Aは$BFE001から始まる奇数 アドレスに配置されている(2つのCIAは奇数/偶数アドレスデコーディングを使って 同じ領域を競合なく共有している)。

Bit 方向 名前 $BFE001 — PRA — ポートレジスタA
7 入力 /FIR1 ゲームポート1 発射ボタン(アクティブロー)
6 入力 /FIR0 ゲームポート0 発射ボタン(アクティブロー)
5 入力 /RDY ディスクレディ(アクティブロー)
4 入力 /TK0 ディスクトラックゼロ(アクティブロー)
3 入力 /WPRO ディスク書き込み禁止(アクティブロー)
2 入力 /CHNG ディスクチェンジ(アクティブロー)
1 出力 LED 電源LED / オーディオローパスフィルタ
0 出力 OVL オーバーレイ — 1: ROMを$000000に, 0: RAM

ビット1が主役。ローにするとパワーLEDが点灯し、オーディオローパスフィルタが 有効になる。Amiga 500ではハードな切り替えだった。Amiga 2000以降では LEDがディミングし――フィルタは約3.3 kHz以上の周波数を滑らかに減衰させた。 ゲームではトンネルを通過するような効果をシミュレートするために切り替えていた: こもった音はソフトウェア処理ではなく、ハードウェアフィルタによるものだった。

命令MOVE.b #$02,$BFE001はビット1をセットし他のすべてをクリアする ――LEDを消灯し、フィルタを無効にする。他のビットに影響を与えずにLEDだけを 切り替えるには、レジスタを読み取り、ビット1をXORし、書き戻す: BCHG #1,$BFE001

CIA-A その他のレジスタ
$BFE101 PRB — ポートB: パラレルポートデータ
$BFE201 DDRA — データ方向レジスタA(1 = 出力, 0 = 入力)
$BFE301 DDRB — データ方向レジスタB
$BFE401 TALO — タイマーA ローバイト
$BFE501 TAHI — タイマーA ハイバイト
$BFE601 TBLO — タイマーB ローバイト
$BFE701 TBHI — タイマーB ハイバイト
$BFE801 イベントカウンタ(TOD) — ローバイト(1/10秒)
$BFE901 イベントカウンタ(TOD) — ミドルバイト(秒)
$BFEA01 イベントカウンタ(TOD) — ハイバイト(分)
$BFED01 ICR — 割り込み制御レジスタ
$BFEE01 CRA — 制御レジスタA(タイマーAモード、シリアルポート)
$BFEF01 CRB — 制御レジスタB(タイマーBモード、TODアラーム)

キーボードはCIA-Aのシリアルポート機構を通じて読み取られた。キー押下ごとに 8ビットのスキャンコードが生成され、KDAT線を介してシリアルに送信され、 KCLKでクロックされた。CIAがビットをシフトインし、1バイト受信完了時に 割り込みを発生させた。Amigaのキーボードは独自のマイクロコントローラを搭載し、 ハンドシェイクプロトコルを実行していた――ホストは次のキーコードが送信される前に 各キーコードを確認応答する必要があった。

$BFD000

CIA-Bレジスタ

CIA-Bは$BFD000から始まる偶数アドレスに配置されている。CIA-Aがユーザー側 (キーボード、LED、ジョイスティックボタン)を向いていたのに対し、CIA-Bは ペリフェラル側――パラレルポート、フロッピードライブ制御、シリアルハンドシェイク を担当していた。

Bit 方向 名前 $BFD000 — PRA — ポートレジスタA
7 入力 /DTR シリアルDTR(アクティブロー)
6 入力 /RTS シリアルRTS(アクティブロー)
5 入力 /CD シリアルキャリアディテクト(アクティブロー)
4 入力 /CTS シリアルCTS(アクティブロー)
3 入力 /DSR シリアルDSR(アクティブロー)
2 出力 /SEL 外部フロッピードライブ選択(アクティブロー)
1 出力 /SIDE ディスクサイド選択(0 = 上面、1 = 下面)
0 出力 /STEP ディスクステップパルス(アクティブロー)

CIA-BのポートB($BFD100)はパラレルポートの8本のデータ線を搭載していた ――ビットごとに直接マッピングされていた。$BFD300のデータ方向レジスタが 各線の入力/出力を制御し、ポートを完全な双方向に対応させていた。

CIA-B その他のレジスタ
$BFD100 PRB — ポートB: パラレルポートデータ(8本の双方向データ線、直接マッピング)
$BFD200 DDRA — データ方向レジスタA
$BFD300 DDRB — データ方向レジスタB
$BFD400 TALO — タイマーA ローバイト
$BFD500 TAHI — タイマーA ハイバイト
$BFD600 TBLO — タイマーB ローバイト
$BFD700 TBHI — タイマーB ハイバイト
$BFD800 イベントカウンタ(TOD) — ローバイト
$BFD900 イベントカウンタ(TOD) — ミドルバイト
$BFDA00 イベントカウンタ(TOD) — ハイバイト
$BFDD00 ICR — 割り込み制御レジスタ
$BFDE00 CRA — 制御レジスタA
$BFDF00 CRB — 制御レジスタB

2つのCIAはアドレス範囲$A00000$BFFFFFを巧妙なトリックで共有していた: CIA-Aは奇数アドレスのみに応答し(68000の下位データバイトにバイト整列)、 CIA-Bは偶数アドレスのみに応答した。アドレスデコーダのGaryがアドレス線A12を 使って両者を選択し、チップセレクト信号を直接駆動していた。これにより、 両方に同時にアクセスすることは不可能だった。

各CIAの2つの16ビットタイマーは、ワンショットまたは連続モードで動作し、 システムクロックパルスや外部イベントをカウントし、アンダーフロー時に割り込みを 発生させることができた。24ビット時刻カウンタは電源周波数(PAL 50 Hz、 NTSC 60 Hz)でクロックされ、タイマーを消費せずにリアルタイムの計時を提供した。

$DFF096

DMAシステム

AmigaのDMAシステムがその性能の鍵だった。68000は一度に一つのことしかできなかったが、 カスタムチップはCPUの介入なしに25のDMAチャンネルを通じて独立にチップRAMの 読み書きを行えた――すべてAgnusが管理していた。

各走査線は227.5カラークロック(PAL)に分割されていた。各カラークロックには 偶数サイクルと奇数サイクルの2つのバスサイクルが含まれていた。Agnusはこれらの サイクルを固定優先順位で異なるDMAチャンネルに割り当てた。CPUは残りの サイクルを使用した。

DMAチャンネル
ディスク 走査線あたり3サイクル — フロッピーデータの読み書き
オーディオ 4チャンネル、アクティブ時各1サイクル — 波形サンプルの取得
ビットプレーン 最大6チャンネル(ビットプレーンごとに1つ) — 表示データの取得
スプライト 8チャンネル、スプライト行で各2サイクル — スプライト画像データの取得
Copper 命令ワードあたり1サイクル — Copperプログラム命令の取得
Blitter 最大4チャンネル(A、B、C、D) — バルクメモリ操作

優先順位(最高から):ディスク、オーディオ、スプライト、ビットプレーン、 Copper、Blitter、CPU。実際には、通常のロー解像度表示でCPUは約40〜60%の バスサイクルを使用できた。6ビットプレーンのハイレゾ表示は非常に多くのサイクルを 消費し、CPUは事実上枯渇した。

Bit R/W 名前 DMACON $096 (W) / DMACONR $002 (R) — DMA制御
15 W SET/CLR 1 = 指定ビットをセット、0 = 指定ビットをクリア
14 R BBUSY Blitterビジー(読み取り専用)
13 R BZERO Blitterゼロ — 全出力ビットが0(読み取り専用)
10 RW BLTPRI BlitterのCPUに対する優先権(ブリッターナスティ)
9 RW DMAEN マスターDMAイネーブル — クリアで全DMA停止
8 RW BPLEN ビットプレーンDMAイネーブル
7 RW COPEN Copper DMAイネーブル
6 RW BLTEN Blitter DMAイネーブル
5 RW SPREN スプライトDMAイネーブル
4 RW DSKEN ディスクDMAイネーブル
3 RW AUD3EN オーディオチャンネル3 DMAイネーブル
2 RW AUD2EN オーディオチャンネル2 DMAイネーブル
1 RW AUD1EN オーディオチャンネル1 DMAイネーブル
0 RW AUD0EN オーディオチャンネル0 DMAイネーブル

DMAOCONはカスタムチップレジスタ全体で使われるSET/CLR方式を採用していた: ビット15をセットして書き込むと指定ビットがオンになり、ビット15をクリアして 書き込むと指定ビットがオフになった。これにより、先にレジスタを読む必要がある リード・モディファイ・ライトの競合状態を回避できた。例えば、 MOVE.w #$8380,$DFF096はマスターDMA、ビットプレーンDMA、Copper DMAを 他に影響を与えずに有効にした。

$DFF09A

割り込み

Amigaは68000の7つの優先レベルにマッピングされた14の割り込みソースを持っていた。 Paulaが割り込み要求レジスタとイネーブルレジスタを管理し、すべてのソースを CPUのIPL線に統合していた。

Bit Level 名前 INTREQ $09C (W) / INTREQR $01E (R) — 割り込み要求
15 SET/CLR 1 = 指定ビットをセット、0 = 指定ビットをクリア
14 6 INTEN マスター割り込みイネーブル(割り込み発生にはセット必須)
13 6 EXTER CIA-B割り込み(CIA-Bの/INTからアクティブロー)
12 5 DSKSYN ディスク同期ワード一致(DSKSYNCレジスタ)
11 5 RBF シリアルポート受信バッファフル
10 4 AUD3 オーディオチャンネル3ブロック完了
9 4 AUD2 オーディオチャンネル2ブロック完了
8 4 AUD1 オーディオチャンネル1ブロック完了
7 4 AUD0 オーディオチャンネル0ブロック完了
6 3 BLIT Blitter完了
5 3 VERTB 垂直ブランク(フレーム開始)
4 3 COPER Copper(Copperプログラムからトリガー)
3 2 PORTS CIA-A割り込み(キーボード、TOD、タイマー)
2 1 SOFT ソフトウェア割り込み(CPUによりセット)
1 1 DSKBLK ディスクブロック完了(DMA転送完了)
0 1 TBE シリアルポート送信バッファ空

INTENA($09A書き込み、$01C読み取り)も同じレイアウトだった。割り込みが 実際にCPUに届くには、要求ビットイネーブルビットの両方がセットされ、 さらにマスターイネーブル(ビット14)もセットされている必要があった。 割り込みハンドラは復帰前にINTREQの要求ビットをクリアしなければならず、 さもないと割り込みが即座に再トリガーされた。

レベル3(INT3)が主力だった――垂直ブランクは50 Hz(PAL)または60 Hz(NTSC)で 毎フレーム実行され、ゲームロジック、音楽再生、OSスケジューリングの標準的な ハートビートとなった。Copper割り込みはプログラムが画面上の特定位置でコードを トリガーすることを可能にし、分割画面エフェクトに不可欠だった。

$DFF080

Copper

CopperはAgnus内蔵のシンプルだが非常に強力なコプロセッサだった。命令は MOVE、WAIT、SKIPの3つだけで、カスタムチップレジスタへの書き込みしかできなかった。 しかし映像ビームと同期して実行されるため、画面上の任意の位置でハードウェア状態を 変更することができた。

Copper命令(各32ビット)
MOVE カスタムチップレジスタに値を書き込む。第1ワード:レジスタアドレス(下位9ビット、ビット0は常に0)。第2ワード:データ値。
WAIT ビームが指定位置に到達するまで停止。第1ワード:VP[7:0] HP[7:1] 1。第2ワード:VPM[7:0] HPM[7:1] 0。マスクビットが比較精度を定義。
SKIP ビームが指定位置を通過していたら次の命令をスキップ。WAITと同形式だが第2ワードのビット0 = 1。

CopperリストはチップRAMに格納されたプログラムだった。毎フレーム、Copperは COP1LC($080/$082)のアドレスからリスタートした。COPJMP1($088)への 書き込みは強制的に即時リスタートさせた。COP2LC/COPJMP2は第2のエントリポイント を提供し、通常は垂直ブランク割り込みでフレーム間のリスト切り替えに使用された。

典型的なCopperリストはディスプレイを設定した:ビットプレーンポインタのロード、 カラー設定、スクロールレジスタの構成。しかし真の魔法は画面途中の変更にあった。 特定のビーム位置を待ってから新しい値を書き込むことで、Copperは静的な レジスタ設定では不可能なエフェクトを生み出せた――グラデーション空、分割解像度、 走査線ごとのカラーサイクリング、さらにはCPU時間をまったく消費しない ラスターバーまで。

WAIT $FFDFFFFE命令は慣例的なリスト終了マーカーだった。ビーム位置V=255 H=223を待つが、PALでは可視領域を超えていた。Copperはそこで次の垂直ブランクが リスタートさせるまで停滞した。

Copperが$07Fより上のレジスタ(カラーレジスタやスプライトレジスタ)に 書き込むには、COPCON($02E)のビット1――「Copper danger」ビット――をセット する必要があった。これによりCopperがDMACONやディスクポインタなどの重要な レジスタを誤って変更することを防いでいた。

$DFF100

プレイフィールド

Amigaはプレーナーグラフィックスモデルを採用していた。各ピクセルをパックされた カラー値として格納する代わりに、画像は最大6つのビットプレーンに分割された ――各ビットプレーンが各ピクセルのカラーインデックスの1ビットを保持した。 これによりスクロールや特定のBlitter操作が非常に効率的になったが、 ピクセル操作はより複雑になった。

表示モード(BPLCON0 $100)
ロー解像度 320×256(PAL)/ 320×200(NTSC)、最大6ビットプレーン = 64色(HAM)または32色
ハイレゾ 640×256 / 640×200、最大4ビットプレーン = 16色(HIRESビット15 = 1)
HAM Hold-and-Modify — 6ビットプレーン、上位2ビットでhold/modify-R/modify-G/modify-Bを選択、下位4ビット = 値。画面上4096色。
EHB Extra Half-Brite — 6ビットプレーン、プレーン6が32色パレットの半輝度版を選択。64色。
デュアルPF Dual Playfield — 2つの独立した3ビットプレーンレイヤー(奇数プレーン = PF1、偶数プレーン = PF2)。透過付き8+8色。
インターレース フィールド交互により垂直解像度を倍増(PAL 512ライン)。BPLCON0のLACEビット2。

ディスプレイウィンドウが可視領域を定義した。DIWSTRT($08E)が開始位置、 DIWSTOP($090)が終了位置を設定し、両方ともビーム座標で指定した。 標準的なPAL値は320×256表示で$2C81(開始)と$2CC1(終了)だった。

データフェッチタイミングはディスプレイウィンドウとは別だった。DDFSTRT($092) とDDFSTOP($094)がAgnusのビットプレーンデータ読み取り開始・停止を制御した。 標準ロー解像度:DDFSTRT = $0038、DDFSTOP = $00D0。 ハイレゾ:DDFSTRT = $003C、DDFSTOP = $00D4

各ビットプレーンにはポインタペア(BPL1PTH/Lの$0E0/$0E2から BPL6PTH/Lの$0EC/$0EEまで)があり、チップRAM内のデータを指していた。 各走査線の後、ポインタにモジュロ値が加算された――BPL1MOD($108)が 奇数ビットプレーン用、BPL2MOD($10A)が偶数ビットプレーン用。モジュロを 表示幅に設定するとビットプレーンが自然にラップし、より大きな値を設定すると 行をスキップしてスムーズな垂直スクロールが可能になった。

水平スクロールはBPLCON1($102)で実現された。プレイフィールド1と プレイフィールド2に独立した4ビットの遅延値を保持していた。データフェッチ開始と ビットプレーンポインタの調整と組み合わせることで、CPU負荷ゼロのピクセル精度 スムーズスクロールが可能になった――ハードウェアがすべてを処理した。

カラーパレット — COLOR00〜COLOR31($180〜$1BE)
フォーマット 12ビットRGB: ---- RRRR GGGG BBBB。各コンポーネント0〜15。例:$0F00 = 赤、$0FFF = 白。
COLOR00 背景色 — ボーダーおよび全プレイフィールド/スプライトの背後に表示
スプライト色 スプライト0〜1はCOLOR17〜19、スプライト2〜3はCOLOR21〜23、スプライト4〜5はCOLOR25〜27、スプライト6〜7はCOLOR29〜31を使用
$DFF120

スプライト

Amigaには8つのハードウェアスプライトがあり、各スプライトは幅16ピクセル、 高さは任意で、3色+透過をサポートした。プレイフィールドとは完全に独立しており、 DMAが設定されると、ビットプレーン表示の上(または後ろ)にDeniseが描画した ――CPUオーバーヘッドはゼロだった。

各スプライトにはポインタペア(SPR0PTH/Lの$120/$122から SPR7PTH/Lの$13E/$13Fまで)があり、チップRAM内のスプライトデータを指していた。 データフォーマットはシンプルだった:

スプライトデータフォーマット(チップRAM内)
ワード0 SPRxPOS — 垂直開始位置(ハイバイトにV7〜V0)、水平開始位置(ローバイトにH8〜H1)
ワード1 SPRxCTL — 垂直終了位置(ハイバイトにV7〜V0)、制御ビット(attach、V8、H0)がローバイト
ワード2+3 最初の画像ライン:DATAワード(プレーン0)+ DATBワード(プレーン1)。16ピクセル、ピクセルあたり2ビット。
... 追加各ラインごとにDATA/DATBペアを繰り返し
最終ペア 2つのゼロワード($0000 $0000)がスプライトデータの終了を示す

スプライトはペア(0+1、2+3、4+5、6+7)でアタッチできた。アタッチ時、 2つのスプライトのビットプレーンを結合して4ビットプレーンの単一スプライトとなり、 15色+透過を実現した――代わりに8つの独立スプライトが4つに減少した。

プレイフィールドに対するスプライトの優先度はBPLCON2($104)で制御された。 各スプライトペアは2つのプレイフィールドの前面、間、または背面に配置できた。 マウスポインタは伝統的にスプライト0だった。

$DFF040

Blitter

BlitterはAgnus内蔵のハードウェアブロック転送エンジンで、3つの操作のために設計 されていた:バルクメモリコピー(論理演算付き)、エリアフィル、線描画。 チップRAMの矩形領域を68000では不可能な速度で操作した。

Blitterには4つのDMAチャンネルがあった:ABCがデータソース、 Dが出力先。処理される各ワードについて、3つのソース値がプログラマブルな 論理関数(ミンターム)を通じて結合され、出力が生成された。この単一の メカニズムで、単純なコピーからクッキーカットスプライト描画まですべてを処理した。

Bit 名前 BLTCON0 $040 — Blitter制御レジスタ0
15–12 ASH ソースAのシフト値(0〜15ビット右シフト)
11 USEA DMAチャンネルAイネーブル
10 USEB DMAチャンネルBイネーブル
9 USEC DMAチャンネルCイネーブル
8 USED DMAチャンネルDイネーブル(出力)
7–0 LF7–LF0 ミンターム論理関数 — A、B、Cの256通りのブール組み合わせ

ミンタームバイトはブール関数を真理値表としてエンコードした:各ビット位置が A、B、C入力の組み合わせに対応した。例えば、$F0 = Aをコピー(D=A)、 $CA = クッキーカット(D=AC+BC̄、つまりCがセットの箇所はA、クリアの箇所はB)、 $00 = ゼロクリア。

Bit 名前 BLTCON1 $042 — Blitter制御レジスタ1
15–12 BSH ソースBのシフト値(0〜15ビット右シフト)
4 EFE 排他的フィルイネーブル
3 IFE 包含的フィルイネーブル
2 FCI フィルキャリー入力(初期フィル状態)
1 DESC 降順モード(右下から左上へ処理)
0 LINE 線描画モードイネーブル

Blitterのエリアフィルモードはラインごとに右から左へ動作した。キャリービットを 追跡し、入力のセットビットに遭遇するたびにトグルした――境界ピクセルペア間の 空間を塗りつぶした。包含的フィル(IFE)は出力に境界ピクセルを残し、 排他的フィル(EFE)はそれらを除去した。これにより塗りつぶしポリゴンの描画が 簡単になった:線描画モードでアウトラインを描き、単一のBlitterパスで塗りつぶす。

線描画はハードウェアBresenhamアルゴリズムを使用した。画面は8つのオクタント (0〜7)に分割され、プログラマが線がどのオクタントに属するかを計算し、 BLTCON1のSUD/SUL/AULビットを設定した。Blitterは最大1024ピクセルの線を描画でき、 破線やテクスチャ線用の16ビット繰り返しパターンをオプションで使用できた。

BLTSIZE($058)が操作を開始した:ビット15〜6が高さ(行数)、ビット5〜0が 幅(ワード単位)。BLTSIZEへの書き込みがBlitterをトリガーした――Blitter設定 シーケンスで常に最後に書き込むレジスタだった。

$DFF0A0

オーディオ

Paulaは4つの独立した8ビットPCMオーディオチャンネルをハードウェアDMA付きで 提供していた。チャンネル0と3は左スピーカー、チャンネル1と2は右スピーカーに ルーティングされた。各チャンネルはチップRAMから波形サンプルを連続的に読み取り、 DACに供給した――音楽はCPUの介入なしに自動再生された。

オーディオチャンネルレジスタ(×4 — チャンネル0を表示)
AUD0LC $0A0/$0A2 — チップRAM内の波形データポインタ(ハイ/ローワード)
AUD0LEN $0A4 — ワード単位の長さ(DMAがこのワード数を転送後、AUD0LCから再開)
AUD0PER $0A6 — 周期(サンプルレート)。小さいほど高ピッチ。周期 = クロック / (2 × 周波数)。
AUD0VOL $0A8 — ボリューム:0(無音)〜64(最大)。6ビットリニアスケール。
AUD0DAT $0AA — オーディオデータレジスタ(2サンプル、ハイバイトを先に再生)。非DMA再生用。

チャンネル1〜3はオフセット$0B0$0C0$0D0に同じレジスタを持っていた。

周期レジスタが再生レートを設定した。PALシステムクロックは3.546895 MHz。 サンプルレート8000 Hzの場合:周期 = 3546895 / (2 × 8000) ≈ 222。 最小実用周期は約124(28.6 kHz)だった――これ以下ではオーディオDMAが バスサイクルを消費しすぎてディスプレイが枯渇した。

Paulaはチャンネルモジュレーションもサポートしていた:1つのチャンネルが ペア内の次のチャンネルの周期やボリュームを変調できた(0→1、2→3)。 ADKCON($09E)のビット4〜7がこれを制御した。周期変調はFMライクな合成エフェクト を可能にし、ボリューム変調は振幅変調(トレモロ)を可能にした。これらのモードは トラッカー音楽では稀にしか使われなかったが、一部のデモエフェクトで登場した。

チャンネルがバッファの再生を完了すると(AUDxLENワードを使い果たすと)、 オーディオ割り込み(INTREQのAUD0〜AUD3)がトリガーされた。割り込みハンドラは 次のバッファを設定でき、ダブルバッファリングのストリーミングオーディオを可能にした。 MODプレーヤーはこの仕組みを利用していた:各チャンネルの割り込みが次のサンプルセット を指し、CPUはミキシングとエフェクトの適用に時間を費やした。

$DFF030

シリアルポート

PaulaにはシリアルLI通信用のUART(Universal Asynchronous Receiver/Transmitter) が内蔵されていた。DB25 RS-232コネクタがデータ線を搬送し、CIA-Bがハンドシェイク 信号(DTR、RTS、CTS、DSR、CD)を処理した。

UARTレジスタ
SERDAT $030 送信データ(書き込み)。下位8ビットまたは9ビット = データ、上位ビット = ストップビット(1にセット)。
SERDATR $018 受信データ(読み取り)。ビット14: RBF(バッファフル)、ビット13: TBE(送信空)、ビット12: TSRE(シフトレジスタ空)、ビット11: RXDレベル、ビット0〜7: 受信データ。
SERPER $032 ボーレートとモード。ビット15: LONG(1 = 9ビットデータ)。ビット14〜0: 周期値。

ボーレートはSERPERを使って以下の式で設定された:

SERPER = (clock / baud_rate) − 1、ここでclock = 3,579,545 Hz。

9600ボー:SERPER = (3579545 / 9600) − 1 ≈ 372 = $0174。 4800ボー:SERPER ≈ 745 = $02E9

UARTは2つの割り込みを生成した:TBE(送信バッファ空、INTREQビット0、レベル1)は 次のバイトの準備完了時、RBF(受信バッファフル、INTREQビット11、レベル5)は バイト到着時に発生した。rawモード(ハンドシェイク無視)では、Amigaは約292 Kbaud に達することができた――標準RS-232レートをはるかに超えていた。

$DFF020

ディスクコントローラ

Paulaのディスクコントローラは、DMAを使ってチップRAMとフロッピードライブ間で 生のMFMエンコードデータを転送した。CIA-Bが機械的信号(モーター、ステップ、方向、 サイド選択)を制御し、Paulaがデータストリームを処理した。

ディスクレジスタ
DSKPTH/L $020/$022 — チップRAM内のディスクDMAバッファポインタ
DSKLEN $024 ビット15: DMAEN(DMA開始)、ビット14: WRITE(1 = 書き込みモード)、ビット13〜0: ワード単位の転送長
DSKSYNC $07E 同期ワード — DMAは転送前にこのパターンを待つ(AmigaDOSでは通常$4489)
DSKBYTR $01A ディスクバイトとステータス(読み取り)。ビット15: BYTEREADY、ビット14: DMAON、ビット13: DSKWRITE、ビット12: WORDEQUAL、ビット7〜0: 生データバイト。
DSKDAT $026 ディスクDMA書き込みデータレジスタ
DSKDAT $008 ディスクDMA読み取りデータレジスタ(先読み、CPUアクセス不可)

トラックを読むためのプログラミングシーケンス:

  1. 書き込み操作が進行中でないことを確認(DSKLENを確認)
  2. DSKPTH/Lをバッファアドレスに設定
  3. DSKLENに転送長とDMAENセットを書き込む
  4. DSKLENに再度書き込む(安全策:DMA開始に2回の書き込みが必要)
  5. DSKBLK割り込み(INTREQビット1)を待つ
  6. DSKLENをクリアしてDMAを停止

書き込みシーケンスにはさらなる安全策があった:WRITEビットをセットしたDSKLENを 2回書き込まないと書き込みが始まらなかった。これにより、1回の誤書き込みによる ディスク破壊を防いだ。

ADKCON($09E)はMFM/GCRエンコーディング選択、プリコンペンセーションタイミング、 およびDSKSYNC内の同期ワードを待ってから転送を開始するWORDSYNCモードを制御した。 標準Amiga 3.5インチDDドライブはディスクあたり880 KBを格納:80トラック × 2面 × 11セクタ × 512バイト。

$KBD001

キーボード

Amiga 500のキーボードには独自の6500/1マイクロコントローラが内蔵されていた。 キーマトリックスを独立にスキャンし、2線プロトコルでCIA-Aに8ビットスキャンコードを シリアル送信した:KDAT(データ)とKCLK(クロック)。

プロトコルはアクティブロー、MSBファーストだった。完全な1バイトを送信した後、 キーボードはホストがKDATを最低85マイクロ秒ローに引くことで確認応答するのを待った。 このハンドシェイクなしでは、キーボードは次のキーコードを送信しなかった ――組み込みのフロー制御を提供していた。

スキャンコードのフォーマット:ビット7 = 0でキー押下、1でキーリリース。 ビット6〜0がキーIDをエンコード。生コードは位置ベースであり、ASCIIではなかった ――OSのキーマップが文字に変換した。

特殊な3キーの組み合わせ(Ctrl + Amiga + Amiga)は/KBRESET線をアサートして ハードリセットをトリガーした。この線はシステムリセット回路に直接配線されていた。 これはすべてのAmigaユーザーが本能的に知っていた悪名高い「三本指の敬礼」だった。

キーボードは電源投入時キーストリームも送信した:起動時のコードシーケンスで、 キーボードの種類と言語レイアウトを識別した。システムはタイムアウト期間内に このストリームをチェックすることでキーボードの存在を検出できた。

$CONN01

コネクタ

Amiga 500の背面パネルには、それぞれ特定の目的を持つコネクタが並んでいた:

ビデオ — DB23メス(アナログRGB)
ピン3,4,5 赤、緑、青 — Deniseからのアナログ0〜0.7V
ピン10 /CSYNC — 複合同期
ピン11 /HSYNC — 水平同期
ピン12 /VSYNC — 垂直同期
タイミング 水平15.625 kHz(PAL)、垂直50 Hz。Amigaモニタに直接接続可能。VGAにはスキャンダブラが必要。
ジョイスティック / マウス — DE-9オス(×2)
ピン1〜4 上、下、左、右(直接アクティブなデジタルスイッチ、JOY0DAT $00A / JOY1DAT $00Cで読み取り)
ピン6 発射ボタン — アクティブロー、CIA-A PRAビット6(ポート0)またはビット7(ポート1)で読み取り
ピン5 中ボタン / pot X — アクティブローデジタルまたは比例アナログ入力(POT0DAT / POT1DATで読み取り)
ピン9 右ボタン / pot Y — ピン5と同様
ピン7 +5V電源供給(最大50 mA)
シリアル — DB25オス(RS-232)
ピン2 TXD — 送信データ(Paulaから)
ピン3 RXD — 受信データ(Paulaへ)
ピン4〜6,8,20 ハンドシェイク信号(RTS、CTS、DSR、CD、DTR) — CIA-BポートAが管理
ピン7 信号グラウンド
パラレル — DB25メス(Centronics互換)
ピン2〜9 データビット0〜7 — CIA-AポートB($BFE101)経由で双方向
ピン1 /STROBE — アクティブロー出力パルス
ピン11 BUSY — アクティブロー、CIA-B Flag入力で直接読み取り
ピン12 POUT — 用紙切れ
ピン13 /SEL — プリンタ選択
フロッピー — DB23オス(アクティブロー制御、Amiga専用ピン配置)
ピン2 /CHNG — ディスクチェンジ(CIA-A PRAビット2へ)
ピン3 /INDEX — 1回転につき1回
ピン5 /TK0 — トラックゼロ(CIA-A PRAビット4へ)
ピン6 /WPRO — ライトプロテクト(CIA-A PRAビット3へ)
ピン7 /RDY — ドライブレディ(CIA-A PRAビット5へ)
ピン15,18,19 /MTR、/DIR、/STEP — モーター、方向、ステップ(CIA-Bから)
ピン13 /SEL0 — ドライブ0選択(アクティブロー、CIA-B PRAビット3から)
ピン14 /SIDE — サイド選択(CIA-B PRAビット2から)

底面の86ピン拡張コネクタは68000のアドレスバスとデータバス、制御信号への完全な アクセスを提供した。アクセラレータボード、RAM拡張、CPUバスへの直接アクセスが 必要なあらゆるアドオンへのゲートウェイだった。それはAmigaの最大の強みであり 限界でもあった――完全にオープン、完全に無防備、完全に信頼ベース。

$DFF1FE

カスタムチップレジスタマップ

すべてのカスタムチップレジスタは$DFF000から始まる512バイトのブロックに 格納されていた。オフセット(例:DMAOCONの$096)がこのベースアドレスに加算された。 レジスタは読み取り専用(R)、書き込み専用(W)、またはストローブ(S —— 任意の値の書き込みでアクションがトリガーされる)のいずれかだった。一部のレジスタ ペアは読み取りと書き込みで異なる値のためにアドレスを共有していた。

DMA & 制御
$002 R DMACONR — DMA制御読み取り
$096 W DMACON — DMA制御書き込み(SET/CLR)
$01C R INTENAR — 割り込みイネーブル読み取り
$09A W INTENA — 割り込みイネーブル書き込み(SET/CLR)
$01E R INTREQR — 割り込み要求読み取り
$09C W INTREQ — 割り込み要求書き込み(SET/CLR)
$010 R ADKCONR — オーディオ/ディスク制御読み取り
$09E W ADKCON — オーディオ/ディスク制御書き込み(SET/CLR)
$004 R VPOSR — ビーム位置(V8とフレームID)
$006 R VHPOSR — ビーム位置(V7〜V0、H8〜H1)
$02A W VPOSW — ビーム位置書き込み(ゲンロック同期用)
$02C W VHPOSW — ビーム位置書き込み
$02E W COPCON — Copper制御(ビット1 = Copper danger)
Copper
$080 W COP1LCH — Copperリスト1ポインタ(ハイ)
$082 W COP1LCL — Copperリスト1ポインタ(ロー)
$084 W COP2LCH — Copperリスト2ポインタ(ハイ)
$086 W COP2LCL — Copperリスト2ポインタ(ロー)
$088 S COPJMP1 — Copperをリスト1でリスタート
$08A S COPJMP2 — Copperをリスト2でリスタート
$08C W COPINS — Copper命令フェッチ(デバッグ)
ビットプレーン
$100 W BPLCON0 — ビットプレーン制御(プレーン数、HIRES、HAM、DPF)
$102 W BPLCON1 — スクロール値(PF1、PF2の水平遅延)
$104 W BPLCON2 — スプライト/プレイフィールド優先度
$108 W BPL1MOD — 奇数ビットプレーンモジュロ
$10A W BPL2MOD — 偶数ビットプレーンモジュロ
$0E0–$0EE W BPL1PT〜BPL6PT — ビットプレーン1〜6ポインタ(ハイ/ローワードペア)
$110–$11E R BPL1DAT〜BPL6DAT — ビットプレーンデータ(DMAからラッチ)
$08E W DIWSTRT — ディスプレイウィンドウ開始(V7〜V0、H7〜H0)
$090 W DIWSTOP — ディスプレイウィンドウ終了(V7〜V0、H7〜H0)
$092 W DDFSTRT — データフェッチ開始
$094 W DDFSTOP — データフェッチ終了
スプライト($120〜$17E)
$120–$13E W SPR0PT〜SPR7PT — スプライト0〜7 DMAポインタ(ハイ/ローペア)
$140–$17E W SPR0POS/CTL/DATA/DATB 〜 SPR7POS/CTL/DATA/DATB — 位置、制御、画像データ
Blitter
$040 W BLTCON0 — Blitter制御0(シフト、イネーブル、ミンターム)
$042 W BLTCON1 — Blitter制御1(Bシフト、フィル、ラインモード)
$044 W BLTAFWM — ソースA最初のワードマスク
$046 W BLTALWM — ソースA最後のワードマスク
$048–$056 W BLTCPT、BLTBPT、BLTAPT、BLTDPT — ソースC/B/Aと出力先Dのポインタ
$058 W BLTSIZE — Blitter開始(高さ × 64 + ワード単位の幅)
$060–$066 W BLTCMOD、BLTBMOD、BLTAMOD、BLTDMOD — C/B/A/Dのモジュロ値
$070–$076 W BLTCDAT、BLTBDAT、BLTADAT — C/B/Aのデータレジスタ
$000 R BLTDDAT — Blitter出力先データ(先読み)
オーディオ
$0A0–$0AE AUD0 — LC(ポインタ)、LEN(長さ)、PER(周期)、VOL(ボリューム)、DAT(データ)
$0B0–$0BE AUD1 — 同レイアウト
$0C0–$0CE AUD2 — 同レイアウト
$0D0–$0DE AUD3 — 同レイアウト
ディスク
$020/$022 W DSKPT — ディスクDMAポインタ(ハイ/ロー)
$024 W DSKLEN — DMA長と制御
$026 W DSKDAT — ディスクDMAデータ書き込み
$008 R DSKDATR — ディスクDMAデータ読み取り(先読み)
$01A R DSKBYTR — ディスクバイトとステータス
$07E W DSKSYNC — ディスク同期パターン
シリアル
$018 R SERDATR — シリアル受信データとステータス
$030 W SERDAT — シリアル送信データ
$032 W SERPER — シリアル周期(ボーレート)
衝突検出
$00E R CLXDAT — 衝突データ(全スプライト間およびスプライト-プレイフィールド間衝突)
$098 W CLXCON — 衝突制御(イネーブルビットとマッチ値)
カラーパレット($180〜$1BE)
$180–$1BE W COLOR00〜COLOR31 — 32色レジスタ、12ビットRGB(----RRRRGGGGBBBB)
マウス/ジョイスティック
$00A R JOY0DAT — ジョイスティック/マウスポート0データ(カウンタ)
$00C R JOY1DAT — ジョイスティック/マウスポート1データ(カウンタ)
$036 W JOYTEST — 両ジョイスティックカウンタへの書き込み
$012 R POT0DAT — Potカウンタペア0(アナログパドル/比例入力)
$014 R POT1DAT — Potカウンタペア1
$034 W POTGO — Pot開始 / ピン方向
$016 R POTGOR — Potポートデータ読み取り
$DFF1FE

詳細ページ

各サブシステムには、完全なレジスタドキュメント、命令エンコーディング、プログラミング例を含む専用の詳細ページがある――Bible de l'Amigaから翻訳。

$A01000
Amigaモデル一覧
A1000からA4000まで — チップセット世代、CPU、発売の歴史
$CPU000
Motorola 68000
ピン構成、制御信号、アドレッシング、割り込み
$BFE001
CIA 8520
CIA-A & CIA-Bポート、タイマー、TODカウンタ、割り込み制御
$DFF000
カスタムチップ
Agnus、Denise、Paula — アーキテクチャとピン説明
$000000
メモリ構成
Chip RAM、Fast RAM、メモリマップ、ROM、レジスタ空間
$DFF096
DMAと割り込み
DMACON、バスサイクル、INTREQ/INTENA、優先度レベル
$DFF080
Copperコプロセッサ
MOVE/WAIT/SKIP命令、Copperリスト、DMA
$DFF100
プレイフィールドとディスプレイ
ビットプレーン、解像度、HAM、デュアルプレイフィールド、スクロール
$DFF120
スプライト
8チャネル、制御ワード、ポジショニング、アタッチドスプライト
$DFF040
Blitter
ブロック転送、ミンターム、シフト、マスク、フィル、ライン描画
$DFF0A0
オーディオシステム
4チャネル、DMA再生、ボリューム、モジュレーション、フィルタ
$JOY00A
マウスとジョイスティック
ゲームポート、クアドラチャデコーディング、パドル入力
$DFF030
シリアルポート
UART、ボーレート、SERDAT/SERDATR/SERPER
$DFF020
ディスクコントローラ
フロッピーDMA、MFMエンコーディング、DSKSYNC
$KBD001
キーボード
6500/1マイクロプロセッサ、シリアルプロトコル、キーコード
$CONN01
コネクタ
RGB、シリアル、パラレル、フロッピー、ゲームポート、拡張