SFD-700 mkII テクニカルガイド
SFD-700 mkII テクニカルガイド
このガイドは、SFD-700 mkII のハードウェアアーキテクチャ、CPLD 機能ブロック、I/O レジスターマップ、メモリマップ、ビルドおよびプログラミング手順を解説します。カードの動作を理解したい、ハードウェアレベルでトラブルシューティングしたい、ファームウェアを変更したい、または提供されたソースファイルからカードをビルドしたいユーザーを対象としています。
エンドユーザーのセットアップとインストールについては ユーザーマニュアル を参照してください。VHDL ソースコードのウォークスルーとファームウェア開発については 開発者ガイド を参照してください。
システムアーキテクチャ
SFD-700 mkII はバス接続された拡張カードです。ホストの Sharp MZ コンピューターの Z80 アドレス、データ、制御バスに接続し、メモリマップされたリソースおよび I/O マップされたリソースのセットとして自らを提示します。中心的なインテリジェンスはすべてのバスサイクルをデコードして信号を適切にルーティングする CPLD です。
システムブロック図
┌──────────────────────────────────────────────────────────────────┐ │ SFD-700 mkII v1.2 PCB │ │ │ │ ホスト Z80 バス(A[15:0]、D[7:0]、MREQ、IORQ、RD、WR、RESET) │ │ ────────────────────────────┬─────────────────────────────── │ │ │ │ │ ┌───────────────┴───────────────┐ │ │ │ EPM7128SLC84-15 CPLD │ │ │ │ │ │ │ │ • I/O アドレスデコード │ │ │ │ • メモリアドレスデコード ├──► ROM_CSn │ │ │ • ROM/RAM ページレジスター ├──► RAM_CSn │ │ │ • MZ-700/1500 メモリ管理 ├──► ROM_A10 │ │ │ • ドライブ/モーター/面/dden レジ├──► RAM_A10 │ │ │ • データバス反転(ID バス) ├──► FDCn │ │ │ • クロック分周(16→8MHz) ├──► CLK_FDC │ │ │ • 割り込みゲーティング ├──► DRVSAn/Bn/Cn/Dn│ │ │ • モードラッチ(ジャンパーから)├──► MOTOR / SIDE1 │ │ └──────────────┬────────────────┘ DDENn │ │ │ │ │ ┌────────────────┼────────────────┐ │ │ │ │ │ │ │ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐ │ │ │ WD1773 FDC │ │ Flash ROM │ │ SRAM │ │ │ │ (反転 │ │ 512KB │ │ 32KB │ │ │ │ データバス)│ │ (AFI + RFS) │ │ (ワークスペース)│ │ │ └──────┬──────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ ┌──────┴──────────────────────────┐ │ │ │ 34 ピンフロッピーコネクタ J3 │ │ │ │ (DRVSAn-Dn、MOTOR、SIDE、DDEN、│ │ │ │ STEP、DIR、WGATE、DATA ライン) │ │ │ └──────────────────────────────── ┘ │ │ │ │ │ フロッピードライブ A–D │ └──────────────────────────────────────────────────────────────────┘
PCB リビジョン履歴
SFD-700 mkII は 3 回のハードウェアリビジョンを経てきました。基本的な回路トポロジーはすべてのリビジョンで同じです。違いは主にプログラマブルロジックの実装にあります。
| バージョン | プログラマブルロジック | ステータス | 注記 |
|---|---|---|---|
| v1.0 | 2 個の Lattice GAL(GAL26CV12 + GAL16V8) | 参考のみ — ビルド不推奨 | MZ-1U06 内の MZ-700 で機能します。GAL レジスター数の制限により、完全なメモリ管理と ROM ページングを同時に実現できませんでした。 |
| v1.1 | 2 個の Lattice GAL(GAL26CV12 + GAL16V8) | 参考のみ — ビルド不推奨 | マイナーな PCB 修正。v1.0 と同じ GAL の制限があります。 |
| v1.2 | 単一の Altera EPM7128SLC84-15 CPLD | 現行 — 推奨 | 両方の GAL を置き換えます。完全な MZ-700/MZ-1500 メモリ管理と独立した ROM/RAM ページング。MZ-80A、MZ-700、MZ-1500、MZ-2000 でテスト済み。 |
主要集積回路
EPM7128SLC84-15 — CPLD(v1.2)
Altera MAX7000S EPM7128SLC84-15 は 84 ピン PLCC パッケージの EEPROM ベースの Complex Programmable Logic Device です。主な特徴:
WD1773 — フロッピーディスクコントローラー
- 128 マクロセル — 各マクロセルは D タイプフリップフロップレジスターを持つプログラマブルな積和ロジックセルです。128 個中 72 個がこの設計で使用されています。
- 最大伝播遅延 15ns — Z80 のセットアップ/ホールドウィンドウ内でバスサイクルをデコードして応答するのに十分な速度。
- 5V トレラント入力 — MAX7000S ファミリーはレベル変換不要で Sharp MZ バスから 5V 信号を直接受け取れます。
- EEPROM 設定ストレージ — プログラムされたロジックはオンチップ EEPROM に無期限に保持されます。外部設定メモリやブート遅延はありません。
- JTAG 経由のインシステムプログラマブル — CPLD は 10 ピン JTAG ヘッダーと USB-Blaster を使用してボードから取り外すことなく再プログラムできます。
- 68 ユーザー I/O ピン — 利用可能な 68 本中 65 本が使用されています(96% 使用率)。
Western Digital WD1773 は、完全な読み書きデータ分離、トラックフォーマット、セクターアクセスロジックをハードウェアに実装したシングルチップのフロッピーディスクコントローラーです。WD1771/WD1772 ファミリーの直系の子孫で、WD179x シリーズとバス互換です。
この設計に関連する主な WD1773 の特徴:
SST39SF040(または互換品)— 512KB Flash ROM
- 反転データバス — WD1773 はすべての 8 データバスビットが反転されることを要求します(ロジック高がロジック低になり、その逆も同様)。CPLD はこれを専用の反転データバス(ID[7:0])を使用して透過的に処理します。
- DRQ(データリクエスト) — WD1773 はデータ転送中に読み取れるバイトがある(または書き込むバイトが必要な)ときに DRQ をアサートします。MZ-80A(MODE 0)では、CPLD は DRQ を Flash ROM アドレスビット A10 にルーティングします。これにより 2MHz CPU はポーリングではなく異なる ROM コードパスを実行することで転送を処理できます。
- INTRQ(割り込みリクエスト) — コマンドが完了するとアサートされます。CPLD はこの信号をソフトウェア制御の有効化ビットを通じてゲートし、ポート 0xDF への書き込みで有効化されたときのみ Z80 の INT ラインにルーティングします。
- 8MHz クロックが必要 — WD1773 は標準の MFM(ダブルデンシティ)動作に 8MHz 入力クロックが必要です。CPLD は 16MHz 水晶発振器を 2 分周することでこれを生成します。
Flash ROM はマシンのブートファームウェア(AFI ROM)と ROM ファイリングシステムを格納します。128 × 4KB ページとして構成され、CPLD の 2 つのページ切り替え式メモリウィンドウ(EXXX と FXXX)を通じてアドレス指定できます。CPLD はアクティブなページを選択するために上位アドレスビット(A10 以上は ID バス経由)を駆動します。デバイスは回路内または外部 Flash プログラマーを使用して外部でプログラムできます。
クロックアーキテクチャ
16MHz 水晶発振器(X1)が一次クロックを提供します。これは CPLD の専用グローバルクロック入力(
CLK_16M)を駆動します。CPLD 内では、単一のトグルフリップフロップ(FDCCLK プロセス)がこれを 2 分周して 8MHz クロック(CLK_8Mi)を生成し、WD1773 チップクロックピンへの CLK_FDC ピンに直接出力されます。
CPLD 内のすべての登録プロセス(ページレジスター、ドライブレジスター、割り込み有効化、メモリ管理ステート)は 16MHz クロックでクロックされます — これにより 62.5ns のクロック期間が得られ、サポートされるすべてのホストマシン(最も遅い MZ-80A は 2MHz = 500ns クロック期間で動作)の Z80 バスサイクルのセットアップ/ホールド要件を十分に満たします。
ホスト Z80 クロック(CLK_BUS0)は CPLD 入力ピンに接続されていますが、現在のロジックでは使用されていません — バスサイクルデコードは完全に組み合わせ(アドレスと制御信号を非同期にデコード)です。ピンは将来の使用のために予約されています。
I/O アドレスデコード
CPLD は Z80 の IORQn、RDn、WRn、A[7:0] ラインを監視し、I/O バスサイクルが認識されたポートアドレス内にある場合に内部選択シグナルを生成します。すべてのデコードは純粋に組み合わせです — バスシグナルが有効になってから最大 1 CPLD 伝播遅延(最大 15ns)以内に結果が利用可能です。
3 つのアドレスブロックがデコードされます:
- 0xD8–0xDB — WD1773 FDC レジスター(ステータス/コマンド、トラック、セクター、データ)。CPLD は読み取りと書き込みの両方に対して FDCn(WD1773 チップセレクト)をアサートし、同時にデータ反転のために ID データバスの方向を制御します。
- 0xDC–0xDF — FDC 制御レジスター(ドライブ/モーター、ヘッド面、データデンシティ、割り込み有効化)。これらは CPLD 内部のフリップフロップとして実装された書き込み専用レジスターです(0xDF は割り込みを無効にするために読み取りも可能)。
- 0x60–0x63 — ROM/RAM ページングレジスター(EXXX ページ、FXXX ページ、MODE 読み取り)。読み書き可能です。
- 0xE0–0xE6 — ホストメモリ管理ポート。書き込みは CPLD によってインターセプトされ、ホストのページング状態を追跡し、適切に SFD-700 自身の ROM/RAM チップセレクトを抑制します。
メモリアドレスデコード
CPLD は Z80 メモリサイクル(MREQn が RDn または WRn とともにアサート)も監視し、Flash ROM と SRAM のチップセレクト出力を生成します:
- EXXX ウィンドウ(E300h–EFFFh) — MREQn が低く Z80 アドレスが 0xE3xx–0xEFxx の範囲にあるときに選択されます。E000h–E2FFh は MZ-700/MZ-1500 のメモリマップされた I/O に予約されており、拡張カードが占有してはなりません。下限が 0xE300 となっているのはこのためです。
- FXXX ウィンドウ(F000h–FFFFh) — MREQn が低く Z80 アドレスが 0xF0xx–0xFFxx の範囲にあるときに選択されます。
データバス反転
WD1773 は歴史的な慣例でデータバスビットをすべて反転します:Z80 データバス上のロジック '1' は WD1773 データバスでは論理 '0' として現れ、その逆も同様です。ディスクリートインバーター IC(部品数と伝播遅延を増やす)を使用する代わりに、CPLD がこれをインラインで処理します。
CPLD は 2 つの双方向 8 ビットバスに接続します:
- Z80_DATA[7:0] — ホスト Z80 データバス(非反転)。
- ID[7:0] — 反転データバス、WD1773 データピンに接続され、Flash ROM と SRAM への上位アドレスビットとしても使用されます。
- Z80 が FDC から読み取り(0xD8–0xDB): WD1773 が反転データで ID[7:0] を駆動します。CPLD は ID を読み取り、Z80_DATA を駆動する前に再反転するため、ホストは正しい(非反転の)データを受け取ります。
- Z80 が FDC に書き込み(0xD8–0xDB): CPLD は Z80_DATA を取り、すべてのビットを反転し、WD1773 が期待する反転表現を受け取るように結果を ID[7:0] に駆動します。
- メモリアクセス(EXXX/FXXX ウィンドウ): メモリチップセレクトがアクティブなとき、ID バスは Flash ROM と SRAM への上位アドレスラインとして機能します。CPLD は {page_register[6:0], Z80_ADDR[11]} で ID[7:0] を駆動し、7 ページビットとストレージデバイスへの自然な A11 ラインを提供します。
ROM / RAM ページング
SFD-700 mkII は 512KB Flash ROM または 32KB SRAM の 4KB ページを Z80 アドレス空間の 2 つのウィンドウにマッピングします。両方のウィンドウは CPLD 内のソフトウェア書き込み可能なページレジスターによって独立して制御されます。
| ウィンドウ | アドレス範囲 | ページレジスター(I/O ポート) | ページ幅 | 最大ストレージ |
|---|---|---|---|---|
| EXXX | E300h–EFFFh | 0x60(D7=ROM/RAM 選択、ビット[6:0]=ページ) | 4 KB | 128 × 4KB = 512KB |
| FXXX | F000h–FFFFh | 0x61(D7=ROM/RAM 選択、ビット[6:0]=ページ) | 4 KB | 128 × 4KB = 512KB |
各ページレジスターのビット 7(D7)は、そのウィンドウで Flash ROM または SRAM のどちらがアクティブかを独立して選択します(D7=0 → Flash ROM;D7=1 → SRAM)。ビット[6:0] はページアドレスを保持します。
リセット時:
- EXXX ページレジスターはページ 2(10 進数)に初期化されます — "RFS スタートバンクを含むカスタマイズされた UROM"。
- FXXX ページレジスターは MZ-80A/MZ-1200 ではページ 0(MZ-80A 用 AFI ROM)に、MZ-700 ではページ 1(MZ-700 用 AFI ROM)に初期化されます。
- 両方のページレジスターは D7=0 でリセットされます — デフォルトでは Flash ROM がアクティブです。
MZ-700 / MZ-1500 メモリ管理
MZ-700 と MZ-1500 は内部 64KB DRAM とキャラクタージェネレーター ROM を上位アドレス空間にバンクイン/バンクアウトするハードウェアメモリ管理コントローラーを含んでいます。これは D000h–FFFFh のアドレスに影響します — SFD-700 mkII の ROM と RAM ウィンドウが使用するまさにその範囲です。
ホストオペレーティングシステムは I/O ポート 0xE0–0xE6 への書き込みでマッピングを制御します。CPLD はこれらの書き込みを監視して 2 つの内部状態フラグを維持します:
| ポート | アクション | SFD-700 mkII への影響 |
|---|---|---|
| 0xE1 | ホストが DRAM を D000h–FFFFh にマップ | REG_ROMDIS を設定 — SFD-700 ROM/RAM を無効化 |
| 0xE3 | ホストがメモリマップ I/O を D000h にマップ | REG_ROMDIS をクリア — SFD-700 ROM/RAM を再有効化 |
| 0xE4 | ホストがモニター ROM + DRAM をマップ | REG_ROMDIS をクリア — SFD-700 ROM/RAM を再有効化 |
| 0xE5 | ホストがすべての D000h–FFFFh アクセスを阻害 | REG_ROMINH を設定 — SFD-700 ROM/RAM を無効化 |
| 0xE6 | デフォルトマッピングに戻る | REG_ROMINH をクリア — SFD-700 ROM/RAM を再有効化 |
REG_ROMINH は REG_ROMDIS より優先されます。REG_ROMINH が設定されているとき、SFD-700 mkII のチップセレクトは REG_ROMDIS の状態に関わらず抑制されます。両方のフラグは Z80 RESET でクリアされます。
この設計により、SFD-700 mkII は CP/M、BASIC、オペレーティングシステム自体を含む、メモリ管理操作を実行するすべての MZ-700 および MZ-1500 ソフトウェアと正しく共存できます — ホスト側に特別なソフトウェアドライバーは必要ありません。
MZ-80A の DRQ-to-アドレスライントリック
Sharp MZ-80A(および MZ-1200)は Z80 CPU を 2MHz で動作させます。標準の MFM ダブルデンシティモードのフロッピーディスクは WD1773 から 32µs ごとに新しいデータバイトを生成します。2MHz では Z80 は 32µs に約 16 命令を実行できます — これは高速 RAM のポーリングループには十分ですが、元の K&P SFD-700 はブートコードを ROM に格納しており、追加の ROM アクセスオーバーヘッドにより実効命令レートがオーバーランなしに WD1773 のデータレジスターを確実に消費するために必要なレベルを下回っていました。
Sharp の解決策(ここで採用)は WD1773 の DRQ 出力を Flash ROM アドレスビット A10 に接続することです。これは次のように機能します:
- ブート ROM はセクター読み取りルーティンの 2 つのコピーを交互の 1KB セグメントに含みます。両方のコピーは機能的に同一ですが、一方は WD1773 データレジスターを即座に読み取り(DRQ = 1、つまりデータが準備完了のときに取られる)、もう一方は待機するためにループバックします(DRQ = 0、つまりデータがまだ準備できていないとき)。
- DRQ はバイトが利用可能なときに高になります。DRQ が A10 に配線されると、CPU はデータが準備できているときに自然に ROM の "データ読み取り" パスを実行し、そうでないときは "待機" パスを実行します — ポーリング命令は不要で、CPU はフラグを確認するのに 0 サイクルを無駄にします。
- CPLD はこれを MODE 0 のみで実装します:
ROM_A10 ≤ '1' when (MODE = MZ-80A) and DRQ = '1', else Z80_ADDR(10)。他のすべてのモードでは、ROM_A10 は自然な Z80 アドレスビット 10 に従います。
割り込み制御
WD1773 はコマンドが完了したとき(タイプ I、II、III コマンド)と強制割り込みコマンド(タイプ IV)が発行されたときに INTRQ をアサートします。CPLD はこのシグナルを登録された有効化ビット(REG_INT)を通じてゲートします:
- 0xDF への書き込み: REG_INT = 1 を設定 — INTRQ が Z80 INT ラインにルーティングされます。
- 0xDF からの読み取り: REG_INT = 0 をクリア — Z80 INT ラインがデアサートされます。
- RESET: REG_INT が非同期にクリアされます。
GAL ロジック(v1.0 / v1.1)
SFD-700 mkII のバージョン 1.0 と 1.1 は CPLD の代わりに 2 つの Lattice GAL デバイスを使用していました。v1.0 または v1.1 ボードをお持ちの方の完全性と参考のためにここで文書化します。
GAL26CV12(U1、GAL1)— I/O デコーダーとメモリ管理
主要なロジックデバイス。FDC アクセスのために Z80 I/O アドレスバスをデコードし、バスバッファの方向シグナルを生成し、登録出力を使用して MZ-700 メモリページング状態を追跡し、割り込み有効化フラグを制御しました。主な制限は、単一の登録出力クラスターが完全な MZ-700 メモリ管理状態と ROM ページングレジスターを同時に保持できなかったことです — これらは GAL からのストローブで駆動される外部のディスクリートフリップフロップとして実装されていました。 GAL16V8(U2、GAL2)— ROM デコーダー
メモリ側のアドレスデコードを処理し、F000h–FFFFh ウィンドウの ROM チップセレクトを生成し、DRQ シグナルを Flash ROM アドレスビット A10 に多重化し(MZ-80A 用)、MODESEL ジャンパーを通じてファームウェアページを選択しました。 GAL ファイルのビルド
CUPL ソースファイルは
主要なロジックデバイス。FDC アクセスのために Z80 I/O アドレスバスをデコードし、バスバッファの方向シグナルを生成し、登録出力を使用して MZ-700 メモリページング状態を追跡し、割り込み有効化フラグを制御しました。主な制限は、単一の登録出力クラスターが完全な MZ-700 メモリ管理状態と ROM ページングレジスターを同時に保持できなかったことです — これらは GAL からのストローブで駆動される外部のディスクリートフリップフロップとして実装されていました。 GAL16V8(U2、GAL2)— ROM デコーダー
メモリ側のアドレスデコードを処理し、F000h–FFFFh ウィンドウの ROM チップセレクトを生成し、DRQ シグナルを Flash ROM アドレスビット A10 に多重化し(MZ-80A 用)、MODESEL ジャンパーを通じてファームウェアページを選択しました。 GAL ファイルのビルド
CUPL ソースファイルは
CUPL/ ディレクトリにあります。WinCUPL が Lattice GAL26CV12 をサポートしないため、コンパイルには Logical Devices CUPL v4.0(DOS 時代)が必要です。DOSBox で実行します:
cupl -j -f -a g26cv12 SFD700_1 # GAL1 をコンパイル(GAL26CV12) cupl -j -f -a g16v8 SFD700_2 # GAL2 をコンパイル(GAL16V8)
GAL のプログラミング
GAL16V8(GAL2)は TL-866 II+ を含むすべての最新のプログラマーで直接サポートされています:
GAL16V8(GAL2)は TL-866 II+ を含むすべての最新のプログラマーで直接サポートされています:
minipro -p GAL16V8 -w SFD700_2.JED
GAL26CV12(GAL1)は PLCC-28 から DIP-28 へのアダプターとカスタムの
infoic.xml デバイスデータベースエントリー(CUPL/ ディレクトリに提供)が必要です:
minipro -p GAL26CV12 -w SFD700_1.JED
CPLD アーキテクチャ(v1.2)
v1.2 CPLD 設計は 128 個中 72 個のマクロセル(56%)を使用し、37 個のレジスターと 65 本の I/O ピンを持ちます。両方のグローバルクロックリソースが使用されています:すべての登録プロセス用の CLK_16M と、同期/非同期リセット用の Z80_RESETn です。72 個のマクロセルは以下の機能ブロックに論理的に分割されています:
| ブロック | マクロセル | 説明 |
|---|---|---|
| クロック分周器 | 1 | トグルフリップフロップ:16MHz → WD1773 用 8MHz |
| I/O アドレスデコーダー | ~15 | すべての I/O ポート選択シグナルの組み合わせデコード |
| メモリアドレスデコーダー | ~4 | EXXX と FXXX ウィンドウ選択の組み合わせデコード |
| モードレジスター | 3 | RESET でサンプリングされる MODE ジャンパーの 3 ビット登録ラッチ |
| ドライブ/モーターレジスター | 5 | 4 ドライブ選択ビット + モーター有効化ビット(ポート 0xDC) |
| 面レジスター | 1 | ヘッド面選択(ポート 0xDD) |
| ダブルデンシティレジスター | 1 | DDEN 制御(ポート 0xDE) |
| 割り込み有効化 | 1 | WD1773 INTRQ ゲート(ポート 0xDF) |
| EXXX ページレジスター | 8 | 8 ビットレジスター:D7=ROM/RAM 選択、ビット[6:0]=EXXX ウィンドウ用ページアドレス(ポート 0x60) |
| FXXX ページレジスター | 8 | 8 ビットレジスター:D7=ROM/RAM 選択、ビット[6:0]=FXXX ウィンドウ用ページアドレス(ポート 0x61) |
| MZ-700 メモリ管理 | 2 | ROMINH と ROMDIS 状態ビット(ポート 0xE1–0xE6) |
| データバス / 出力マルチプレクサー | ~25 | ID バスドライブ、Z80_DATA マルチプレクサー、チップセレクト出力 |
すべての I/O は LVTTL です。MAX7000S ファミリーは 5V 入力トレラントで、5V の Sharp MZ バスとレベル変換なしに直接互換性があります。
| シグナル | ピン | 方向 | 説明 |
|---|---|---|---|
| CLK_16M | 83 | 入力 | 16MHz 水晶発振器 — グローバルクロック |
| CLK_FDC | 81 | 出力 | WD1773 への 8MHz クロック |
| CLK_BUS0 | 2 | 入力 | ホスト Z80 バスクロック(予約済み) |
| Z80_RESETn | — | 入力 | アクティブロー リセット — グローバルリソース |
| A[15:0] | 4–25 | 入力 | Z80 アドレスバス |
| D[7:0] | 27–35 | 双方向 | Z80 データバス |
| ID[7:0] | 64–74 | 双方向 | 反転データバス(WD1773)/ ROM-RAM 上位アドレス |
| M1n | 36 | 入力 | Z80 マシンサイクル 1 インジケーター |
| RDn | 37 | 入力 | Z80 読み取りストローブ |
| WRn | 39 | 入力 | Z80 書き込みストローブ |
| IORQn | 40 | 入力 | Z80 I/O リクエスト |
| MREQn | 41 | 入力 | Z80 メモリリクエスト |
| Z80_INT | 44 | 出力 | Z80 への割り込み(ゲートされた INTRQ) |
| Z80_EXWAITn | 45 | 出力 | 外部ウェイト(永続的に非アクティブ) |
| FDCn | 63 | 出力 | WD1773 チップセレクト(アクティブロー) |
| INTRQ | 61 | 入力 | WD1773 割り込みリクエスト |
| DRQ | 60 | 入力 | WD1773 データリクエスト |
| DDENn | 58 | 出力 | WD1773 へのダブルデンシティ有効化 |
| SIDE1 | 57 | 出力 | ヘッド面選択 |
| MOTOR | 56 | 出力 | スピンドルモーター有効化 |
| DRVSAn | 55 | 出力 | ドライブ A 選択(アクティブロー) |
| DRVSBn | 54 | 出力 | ドライブ B 選択(アクティブロー) |
| DRVSCn | 52 | 出力 | ドライブ C 選択(アクティブロー) |
| DRVSDn | 51 | 出力 | ドライブ D 選択(アクティブロー) |
| ROM_CSn | 77 | 出力 | Flash ROM チップセレクト(アクティブロー) |
| RAM_CSn | 76 | 出力 | スタティック RAM チップセレクト(アクティブロー) |
| ROM_A10 | 80 | 出力 | ROM ページビット / DRQ マルチプレクサー(MZ-80A MODE) |
| RAM_A10 | 79 | 出力 | RAM ページアドレスビット |
| MODE[2:0] | 49,48,50 | 入力 | ホストマシンモードジャンパー |
I/O レジスターマップ
CPLD でデコードされた完全な I/O レジスターマップ。すべてのアドレスは 8 ビットの Z80 I/O ポートアドレスです。WD1773 は反転データを使用します — CPLD は透過的に反転を処理するため、ソフトウェアは通常の(非反転)形式でデータを読み書きします。
| ポート | R/W | レジスター | 説明 |
|---|---|---|---|
| 0xD8 | R/W | WD1773 ステータス/コマンド | 読み取り:ステータスレジスター。書き込み:コマンドレジスター。 |
| 0xD9 | R/W | WD1773 トラック | 現在のトラック番号レジスター。 |
| 0xDA | R/W | WD1773 セクター | 現在のセクター番号レジスター。 |
| 0xDB | R/W | WD1773 データ | データレジスター — セクター転送中に読み書き。 |
| 0xDC | W | ドライブ & モーター | ビット[2:0]:ドライブ選択(4=A、5=B、6=C、7=D、0=なし)。ビット[7]:モーター有効化。 |
| 0xDD | W | ヘッド面 | D0=0 → 面 1、D0=1 → 面 0 |
| 0xDE | W | データデンシティ | D0=0 → ダブルデンシティ(MFM)、D0=1 → シングルデンシティ(FM) |
| 0xDF | W/R | 割り込み有効化 | 書き込み:WD1773 INTRQ → Z80 INT を有効化。読み取り:無効化。 |
| 0x60 | R/W | EXXX ページ | D7 → ストレージ選択(0=Flash ROM、1=SRAM)EXXX リージョン用。ビット[6:0] → E300h–EFFFh ウィンドウのページアドレス。 |
| 0x61 | R/W | FXXX ページ | D7 → ストレージ選択(0=Flash ROM、1=SRAM)FXXX リージョン用。ビット[6:0] → F000h–FFFFh ウィンドウのページアドレス。 |
| 0x63 | R | モードレジスター | ラッチされた MODE ジャンパー値(0–6)を読み取る |
| 0xE1 | W | MZ-700/1500 ROMDIS 設定 | ホストが DRAM を D000h–FFFFh にマップ — SFD-700 ROM/RAM を無効化 |
| 0xE3 | W | MZ-700/1500 ROMDIS クリア | ホストがメモリマップ I/O をマップ — SFD-700 ROM/RAM を再有効化 |
| 0xE4 | W | MZ-700/1500 ROMDIS クリア | ホストがモニター + DRAM をマップ — SFD-700 ROM/RAM を再有効化 |
| 0xE5 | W | MZ-700/1500 ROMINH 設定 | ホストがすべての上位メモリを阻害 — SFD-700 ROM/RAM を無効化 |
| 0xE6 | W | MZ-700/1500 ROMINH クリア | デフォルトマッピングに戻る — SFD-700 ROM/RAM を再有効化 |
メモリマップ
SFD-700 mkII は Z80 上位アドレス空間の 2 つのウィンドウを占有し、どちらも 512KB Flash ROM または 32KB SRAM から独立してページングされます。
| ウィンドウ | Z80 アドレス範囲 | ページレジスター | 実効サイズ | 注記 |
|---|---|---|---|---|
| EXXX | E300h–EFFFh | 0x60 | ページあたり 3.75KB | E000h–E2FFh は MZ-700/MZ-1500 のメモリマップ I/O — 拡張カードからアドレス指定不可 |
| FXXX | F000h–FFFFh | 0x61 | ページあたり 4KB | フル 4KB ウィンドウ。ページ 0 = MZ-80A AFI ROM。ページ 1 = MZ-700 AFI ROM。 |
各ウィンドウはページレジスターのビット 7(D7)を通じて Flash ROM と SRAM を独立して切り替えられます — D7=0 は Flash ROM を選択し、D7=1 は SRAM を選択します。ビット[6:0] のページアドレスはストレージモードの切り替えをまたいで保持されます — 0x60 または 0x61 に新しい値を書き込むと対応するウィンドウが即座に再マッピングされます。
CPLD ビットストリームのビルド
CPLD ビットストリームは Quartus II 13.0.1 SP1 Web Edition でコンパイルされます。この特定のバージョンが必要です — それ以降のリリースでは MAX7000S(EPM7128)デバイスファミリーのサポートが削除されました。Web Edition は Intel FPGA ソフトウェアアーカイブから無料で入手できます。
ビルドディレクトリに移動してコマンドラインからコンパイルします:
cd /dvlp/Projects/SFD700/CPLD/v1.2/build quartus_map --read_settings_files=on sfd700 # 分析と合成 quartus_fit --read_settings_files=on sfd700 # フィッター(配置配線) quartus_asm --read_settings_files=on sfd700 # アセンブラー — sfd700.pof を生成 quartus_sta sfd700 # タイミング分析(オプション)
または Quartus II GUI で
CPLD/v1.2/build/sfd700.qpf を開いて Processing → Start Compilation を実行します。
ビルドが成功した後の予想されるリソース使用量:
| リソース | 使用数 | 利用可能数 | 使用率 |
|---|---|---|---|
| マクロセル | 72 | 128 | 56% |
| レジスター | 37 | 128 | 29% |
| I/O ピン | 65 | 68 | 96% |
| プロダクトターム | 179 | — | — |
| グローバルクロック | 2 | 2 | 100% |
これらの数値から大きく逸脱した場合は、合成設定の不一致を示しています。再コンパイルの前に Quartus プロジェクト設定でターゲットデバイスが EPM7128SLC84-15(MAX7000S ファミリー)に設定されていることを確認してください。
CPLD のプログラミング
EPM7128SLC84-15 は Altera USB-Blaster または互換クローンを使用して 10 ピン JTAG ヘッダー(J2)でアクセスできる 4 ピン JTAG ポート(TDI、TDO、TMS、TCK)でプログラムされます。
コマンドラインから:
quartus_pgm -c "USB-Blaster" -m JTAG \ -o "p;CPLD/v1.2/build/output_files/sfd700.pof"
または Quartus II プログラマー GUI を使用します:
- Tools → Programmer を開きます。
- Hardware Setup をクリックして USB-Blaster を選択します。
- Add File をクリックして
output_files/sfd700.pofを選択します。 - Program/Configure にチェックを入れ、オプションで Verify にもチェックを入れます。
- Start をクリックします。プログラミングは数秒で完了します。
参考サイト
| リソース | リンク |
|---|---|
| SFD-700 mkII プロジェクトページ | /sfd700/ |
| SFD-700 mkII ユーザーマニュアル | /sfd700-usermanual/ |
| SFD-700 mkII 開発者ガイド | /sfd700-developersguide/ |
| SFD-800(MZ-800 対応カード) | /sfd800/ |
| K&P SFD-800 マニュアル(ドイツ語) | /Downloads/Manuals/KandP/sfd_mfd800.pdf |
| Altera MAX7000S データシート | Intel FPGA 製品ページ |
| Quartus II 13.0.1 SP1 Web Edition | Intel FPGA ソフトウェアアーカイブ |
| WD1773 アプリケーションノート | Western Digital / 歴史的アーカイブ |