Sharp MZシリーズ FPGAエミュレータ v2.0
概要
v2.0の設計は、Cyclone IV E FPGA(EP4CE115F23I7またはEP4CE75F23I7)上のモジュラーFPGAアーキテクチャを中心に構築されており、MAX7000AE CPLDがバス管理を担当し、ARM Cortex-M4(K64F)がI/Oプロセッサーとして設定、メニュー表示、ファイル管理を行います。このアーキテクチャにより、エミュレーターはMiSTer HPSのような外部ホストシステムを必要とせず、完全にスタンドアロンで動作できます。
3つのビルドバリアントが利用可能です:
- coreMZ - ホストマシンのオリジナルZ80 CPUを使用したビデオコントローラー強化のみ
- coreMZ_SoftCPU - ビデオコントローラーに加え、ソフトT80 Z80 CPUとオプションのZPU Evolutionプロセッサー
- coreMZ_emuMZ - T80ソフトCPU、完全な周辺機器エミュレーション、OSDメニューシステムを備えた全8台のSharp MZフルエミュレーション
エミュレーターは3台のホストマシン(MZ-700、MZ-80A、MZ-2000)と2つのFPGAサイズ(E115およびE75)をサポートし、SW-700 v1.3ハードウェアで合計18のFPGAビルド構成が可能です。
I/Oプロセッサーは、マシン選択、テープキュー管理、ROM設定、表示設定、デバッグのためのMiSTerスタイルのオンスクリーンディスプレイ(OSD)を提供します。動作中のOSDスクリーンショットを以下に示します。
アーキテクチャ概要
レイヤー1 - CPLD Bus Manager(MAX7000AE EPM7512AETC144-10):ホストマシンのZ80バスとFPGA間のインターフェースを処理します。メモリアドレスデコード、バスアービトレーション信号、電圧変換を管理します。CPLDは、どのメモリ領域がホストマシンのオリジナルハードウェアによって処理され、どの領域がFPGAにルーティングされるかを決定します。
レイヤー2 - FPGA Core(Cyclone IV E):T80 Z80互換CPU、ビデオコントローラー、キーボードマトリックス、カセットテープインターフェース、フロッピーディスクコントローラー、サウンドジェネレーター、バスアービター、Personalシリーズ(MZ-80K/C/1200/80A/700/800)およびBusinessシリーズ(MZ-80B/2000/2200/2500)のマシン固有ハードウェアエミュレーションを含む、すべてのエミュレーションロジックを格納しています。
レイヤー3 - I/O Processor(ARM Cortex-M4 K64F):ユーザーインターフェース(OSDメニュー)、ファイルシステムアクセス(テープイメージ、ROMファイル、フロッピーディスクイメージ用SDカード)、設定管理を提供します。K64Fはチップセレクトマルチプレクスされたレジスターインターフェースを介してFPGAと通信します。
設計哲学は、特定のホストシステムからの独立性を重視しています。FPGAにはすべてのエミュレーションロジックが内部に含まれており、I/Oプロセッサーはユーザーインタラクションとファイル管理にのみ必要です。これにより、最小限の変更で他のFPGAプラットフォーム(Xilinx Zynq、他のCycloneバリアントなど)への移植が可能です。
モジュール階層
FPGA設計(coreMZ_emuMZバリアント)は以下のモジュールをインスタンス化します:
| モジュール | 説明 | 主要機能 |
|---|---|---|
| clkgen | クロックジェネレーター | 128MHz PLL → CPU(2-32MHz)、周辺機器、サウンド、RTC、FDC用プログラマブルディバイダー |
| VideoController | ビデオレンダリングエンジン | マルチモード表示:40/80桁、モノ/カラー、グラフィックスフレームバッファー、VGAスケーリング、OSDオーバーレイ |
| mctrl | マシンコントロール | 91ビットCONFIGバス、マシンタイプ・表示・速度・ROM・テープ・オーディオ用レジスターデコード |
| T80 | Z80互換CPU | 完全なZ80命令セット、CKENCPU(TURBO設定による可変速度)からクロック供給 |
| arbiter | バスアービトレーション | 4台のFPGAデバイス+ホスト用ラウンドロビンアービトレーション、1秒ウォッチドッグタイムアウト |
| keymatrix | キーボードインターフェース | PS/2からSharp MZスキャンマトリックス変換、MZ-700ネイティブスキャンサポート |
| cmt | カセットテープ | APSS(自動検索)付き完全なテープエミュレーション、ハードウェアテープドライブ統合 |
| fdd | フロッピーディスクコントローラー | WD1793エミュレーション、マルチドライブサポート、DMAインターフェース |
| iointr | 割り込みマネージャー | I/Oプロセッサーイベント通知用8エントリーFIFO割り込みキャッシュ |
| snd | サウンドサブシステム | SN76489トーンジェネレーター、i8253タイマーオーディオ、16ビットPWMステレオ出力 |
| mz80k_hw | Personalシリーズ | MZ-80K/C/1200/80A/700/800メモリマッピング、I/Oレジスター、チップセレクト |
| mz80b_hw | Businessシリーズ | MZ-80B/2000/2200/2500ハードウェア、拡張GRAM、APSSテープインターフェース |
CPU切り替え
tranZPUterは4つのCPUモードをサポートし、I/Oアドレス0x6CのCPU設定レジスターまたはTZFSコマンドで選択できます:
| モード | CPU_CFG[5:0] | 説明 | TZFSコマンド |
|---|---|---|---|
| Hard CPU | 000000 | ホストマシンのオリジナルZ80プロセッサー | リセット時デフォルト |
| T80 Soft CPU | 000001 | FPGA Z80互換ソフトプロセッサー | softcpu |
| ZPU Evolution | 000010 | FPGA 32ビットZPUプロセッサー(コンパイル時組み込み時) | zpuevo |
| emuMZ | 000100 | 全周辺機器を含むSharp MZフルエミュレーション | mz、mz80a、mz700等 |
emuMZモードに切り替えると、I/Oプロセッサーは91ビットCONFIGバスを介してマシンタイプ、表示モード、CPU速度、その他すべてのパラメーターを設定してからCPUクロックイネーブルをアサートします。オリジナルのホストZ80はトライステートされ、T80ソフトCPUがアドレスバスとデータバスの完全な制御を行います。
ビルドバリアント
各ホストマシン(MZ-700、MZ-80A、MZ-2000)は、2つのFPGAサイズを対象とした独自のQSF制約ファイルセットを持ちます:
| バリアント | QSFファイル | 説明 |
|---|---|---|
| Video Only (E115) | coreMZ_E115.qsf | EP4CE115F23I7上のビデオコントローラー |
| Video Only (E75) | coreMZ_E75.qsf | EP4CE75F23I7上のビデオコントローラー |
| Full Emulation (E115) | coreMZ_E115_emuMZ.qsf | EP4CE115F23I7上の完全なエミュレーター |
| Full Emulation (E75) | coreMZ_E75_emuMZ.qsf | EP4CE75F23I7上の完全なエミュレーター |
| Soft CPU (E115) | coreMZ_E115_SoftCPU.qsf | EP4CE115F23I7上のVideo + T80/ZPU |
| Soft CPU (E75) | coreMZ_E75_SoftCPU.qsf | EP4CE75F23I7上のVideo + T80/ZPU |
ソースファイルはシンボリックリンクを介して3台のホストマシン全てで共有されます。マシン固有の差異はCPLD設定とQSFファイルのピンアサインメントで処理されます。
エミュレーション起動時、MZ-700モニタープロンプト(tzfs)で「mz」コマンドまたは実際のマシン(例:「mz80a」)コマンドを入力すると、要求されたマシンとして設定されたエミュレーションが起動し、MZ-700は要求されたマシンとして動作します。
MiSTerに似たメインメニューです。見た目は少し異なりますが、MiSTerメニューと同じように動作します。
これは実際のMZ-700上でエミュレーションが動作しているため、ハードウェアテープドライブまたはFPGAエミュレートされたドライブを選択できます。ハードウェアテープドライブを選択すると、すべてのテープの読み書き操作が物理カセットテープに対して行われます。
FPGAエミュレートされたテープドライブに切り替えると、エミュレーターに提供するテープイメージをキューで選択できます。キューは実際のカセットのように機能し、1つのテープイメージが処理されると次のテープイメージが自動的にアップロードされます。これにより、マルチパートのゲームやデータベースが正しく機能します。このメカニズムは、プログラムを前後にスキャンできるより高度なMZ-80B/MZ-2000 APSSテープドライブにとっても非常に重要で、キューはそれに応じてローテーションします。
ファイル選択はMiSTerに似ていますが、LinuxではなくFAT32の命名規則を使用します。
選択されたテープイメージがキューに追加されます。80Kベースのマシンでは、イメージがアップロードされるとキューから削除されます。80Bベースのマシンでは、コンピューターが行うAPSS操作に応じてキューがローテーションします。
MiSTerと同様に、エミュレートするマシンと設定可能なパラメーターを選択できます。
エミュレーションで使用するROMイメージはここで設定します。
Sharp MZシリーズのビデオモジュールは、MiSTer v1.0から精度と機能が向上しています。強化モードでは実際のMZ-700のビデオコントローラーとして、また Sharp MZシリーズエミュレーションのビデオコントローラーとして機能します。ZPUで動作する場合は32ビット対応、Sharp MZシリーズで動作する場合は8ビット対応です。
システムメニューはAboutオプション以外はまだ完成していません。
Aboutスクリーン。このOSDはフル8色ピクセルグラフィックスを持ち、OSD以外の多くの目的に使用できます。
以下のエミュレーションが作成されています:
| エミュレーター | ステータス | エミュレーター | ステータス | |
|---|---|---|---|---|
| MZ80K | 開発済み | MZ80C | 開発済み | |
| MZ1200 | 開発済み | MZ80A | 開発済み | |
| MZ700 | 開発済み | MZ80B | 開発済み | |
| MZ2000 | 一部開発済み | MZ800 | 開発中 |
現在のエミュレーターバージョンが提供する機能:
| MZ80K、C、1200、A用 48K RAM |
| MZ700、MZ80B用 64K RAM |
| 1x〜32x高速モード選択可能なハードウェアテープ読み書き |
| MZ80B/MZ2000用 APSSテープドライブ — メニューキューシステムを使用した完全自動APSS。 |
| 1x〜32xターボモード(例:MZ700で112MHz) |
| プログラマブルキャラクタージェネレーター(PCG-8000/PCG-1200) |
| 40x25、80x25 モノクロおよびカラー表示モード |
| 320x200、640x200 8色ビットアドレスグラフィックス |
| VGAスケーリング |
| エミュレーションタイプごとに更新可能なモニターROM、CGRom、キーマップ、ユーザーROM、FDC ROM。 |
| i8253 モノオーディオまたはテープオーディオ |
テスト中/開発中の拡張機能
| フロッピーディスクドライブ/コントローラー 5.25” |
| クイックディスクコントローラー |
| デュアルデジタルジョイスティック入力(MZ700) |
既知の問題
| キーボードマッピングの改善が必要です。特にMZ80Aの日本語版であるMZ1200について。 |
| HDMIを設計で再有効化する必要があります。 |
| ZPU I/Oプロセッサーがステータス情報表示に使用するステータスフレームバッファーを完成させる必要があります — 使用上は重要ではありません。 |
設計概要
この設計のコンセプトは、エミュレーションをできる限りHPSから独立させることです(スタンドアロンで動作するように)。HPSには制御レジスターの設定、完全なイメージによるテープ/フロッピーキャッシュRAMの読み書き、メニュー制御システムのオーバーレイのみが必要です。MiSTer/HPSシステムはエミュレーションをホストするための優れた基盤ですが、Xilinx Zynq 7000など別のターゲットにこのエミュレーターを移植したい方もいるかもしれません(私も試しています)。理論上、このエミュレーターを別のプラットフォームに移植して、PC(パラレルポート)、HPS、または別のCPUをメニュー制御システムとして使用したい場合にポーティングが容易になります。
Terasic DE10のCyclone V SEには5.5Mbitsのメモリがあるため、エミュレーションで使用するRAMのほとんどはFPGA上にあります。フロッピーディスクコントローラーはCMTユニットのようにフロッピーディスク全体をキャッシュするか、セカンダリSDカードを使用するかの決定により、HPSメモリ/外部SDRAMを使用する可能性があります。
インストール
| 1. | セットアップガイドに従って新しいSDブートディスクを作成します。https://github.com/MiSTer-devel/Main_MiSTer/wiki/Setup-Guide |
| 2. | releasesフォルダーから最新のRBFファイルをSD(scpまたはWindows/Linux下でSDをマウントしてローカルコピーコマンドを使用)にコピーします: |
| scp SharpMZ_MiSTer/releases/SharpMZ_<日付>.rbf root@<de10のIPアドレス>/media/fat/SharpMZ.rbf | |
| ターゲット名は.rbfで終わるものであれば何でも構いません。「root」パスワードはデフォルトのインストールでは1です。IPアドレスはコアをロードする前のMiSTerメインシステムメニューでESCを押すと確認できます。 | |
| 3. | SDカードにSharpMZディレクトリを作成します: |
| ssh root@<de10のIPアドレス> | |
| mkdir /media/fat/SharpMZ | |
| 4. | 新しいディレクトリにROMファイル、MZFテープファイル、DSKファイルをコピーします: |
| scp *.mzf root@<de10のIPアドレス>:/media/fat/SharpMZ/ | |
| 5. | MiSTerメニューを起動します(表示されていない場合はDE10リセットボタンを押します)。 |
| 6. | SharpMZコア(または付けた任意の名前のもの)を選択します。 |
| 7. | エミュレーターはSA-1510モニターでMZ80Aモデルとして起動します。 |
| 8. | F12を押して設定を変更し、「Save Config」を選択して保存します。 |
エミュレーターの使い方
メニューシステム
MiSTerメニューシステムはこの設計でフロントエンド制御として広く使用されています。カセットやフロッピーディスクのロード/保存、マシンパラメーターの設定、表示パラメーターの設定、デバッグ、MiSTer制御メニューへのアクセスが可能です。
テープストレージ
エミュレーションを本格的に使用するためには、既存のプログラムをロードおよび保存できる必要があります。最初は(元のマシンでは)CMT(テープ)ユニット経由で、その後フロッピー/クイックディスクに移行しました。
このメニューはハードウェアCMTユニットを制御し、以下の選択肢があります:
-
RAMへ直接ロード
このオプションでMZF形式のテープファイル(128バイトヘッダー+コード)をRAMに直接ロードできます。ヘッダーに格納されたロードアドレスとサイズを使用してコードを正しく配置し、カセットワークエリア(10F0H)にヘッダーを保存します。ロード完了後にウォームリセットを行うと、テープの詳細が画面に表示されます。ロードされたプログラムを実行するには、正しいモニターコマンドを入力します(例:J1200)。
-
テープのキュー
実際のカセットには1つ以上のプログラムが順次格納されています。エミュレーションキャッシュは1つのフルプログラムしか保存できないため、複数のプログラムを並べてキャッシュが空になると次のプログラムが供給される仕組みで、実際のカセットをシミュレートします。
MZ80B/MZ2000の場合、元のテープドライブはプログラムを前後に検索できるAPSS自動化ドライブでした。キューはAPSS信号を解釈して必要に応じてキューを前後に移動させることでこれをエミュレートします。
-
キューのクリア
このオプションですべてのキューエントリーを削除できます。
-
テープの保存エミュレーションキャッシュにあるプログラムをMiSTer SDカードに保存できます。 -
テープ自動保存エミュレーションキャッシュを自動保存できます。 -
テープボタン
アクティブなテープボタン(再生、録音、または自動)を設定できます。
-
テープ高速ロード
テープドライブの速度を設定できます:
オフ 2x 4x 8x 16x -
ヘッダーのマッピング(ASCII)
Sharp ASCIIとANSI ASCIIの間の変換を設定できます:
オフ 録音 再生 両方 注:APSSの機能導入により、テープ保存とテープ自動保存は不要になりました。
マシン
エミュレーションはいくつかのSharp MZコンピューターをエミュレートし、このメニューでモデルを選択できます。
-
マシンモデル
MZ80K MZ80C MZ1200 MZ80A MZ700 MZ80B MZ2000 MZ800(開発予定) -
CPU速度
MZ80K/C/1200/A = 2MHz 4MHz 8MHz 16MHz 32MHz 64MHz MZ700 = 3.5MHz 7MHz 14MHz 28MHz 56MHz 112MHz MZ80B/2000 = 4MHz 8MHz 16MHz 32MHz 64MHz -
オーディオソース
ソース 説明 サウンド エミュレーションが生成するモノラルオーディオをL/Rチャンネルに出力。 テープ CMT信号をサウンドとして出力。右チャンネルに再生、左チャンネルに録音。 - オーディオボリューム / ミュート
- ROM管理(マシンモデル、ユーザーROM、フロッピーディスクROM、カスタムROM有効化)
表示
-
表示タイプ: モノ 40x25 モノ 80x25 カラー 40x25 カラー 80x25 -
VGAスケーリング: 640x480@60Hz オフ - ビデオ(グラフィックスフレームバッファーとのブレンド制御)
- グラフィックス(グラフィックスフレームバッファーの有効/無効)
- グラフィックスアドレス
- VRAM CPUウェイト
-
PCGモード: ROM RAM
デバッグ
デバッグはコンパイル時オプションです。
DE10メインボードの8つのLEDで信号を表示できます。以下の選択肢があります:
- メモリバンクの選択(SysROM、SysRAM、KeyMap、VRAM、CMTHDR、CMTDATA、CGROM、CGRAM、All)
- デバッグモード(有効/無効)
-
CPU周波数: CPU/CMT 1MHz 100KHz … 0.1Hz - デバッグLEDS
- サンプル周波数
- シグナルブロック(T80、I/O、IOCTL、Config、MZ80C I/II、MZ80B I/II)
- バンク
システム
コアの選択、キーマッピング、Bluetoothの設定などができるMiSTerメインコントロールメニューです。
コントロールオプション
| オプション | 説明 |
|---|---|
| ブートリセット | MZ80B/MZ2000モードでIPLリセットを実行。 |
| リセット | エミュレーションをリセット。 |
| 設定のリロード | 以前に保存した設定をリロード。 |
| 設定の保存 | SDカードに設定を保存。 |
| 設定のリセット | 設定を標準デフォルトにリセット。 |
グラフィックスフレームバッファー
元の設計への追加として640x200/320x200 8色グラフィックスフレームバッファーがあります。このフレームバッファーは3×16K RAMブロック(1色あたり1ブロック)で構成されています。グラフィックスRAMはプログラマブルレジスターによりメインCPUアドレス範囲C000H〜FFFFHに1バンクずつ切り替えることができます。
グラフィックスRAMバンクをZ80 CPUアドレス範囲に切り替え
グラフィックスバンクスイッチセットレジスター:I/Oアドレス:E8H(10進数232)
グラフィックスバンクスイッチリセットレジスター:I/Oアドレス:E9H(10進数233)
制御レジスター(0xEA - 10進数234)
| ビット | 説明 |
|---|---|
| 1:0 | 読み込みモード(00=赤バンク、01=緑バンク、10=青バンク、11=未使用)。 |
| 3:2 | 書き込みモード(00=赤バンク、01=緑バンク、10=青バンク、11=間接)。 |
| 4 | VRAM出力。0=有効、1=無効。 |
| 5 | GRAM出力。0=有効、1=無効。 |
| 7:6 | ブレンドオペレーター(00=OR、01=AND、10=NAND、11=XOR)。 |
カラーライターレジスター(0xEB - 10進数235 〜 0xED - 10進数237)
(DE10バージョンと同一の詳細なビットテーブル)
ステータスフレームバッファー
エミュレーターへのI/Oプロセッサーの組み込みを意図した変更の一環として、通常の画面レンダリング外の垂直ラインを占有する追加フレームバッファーを追加しました。このフレームバッファーの目的は、オンボードIOプロセッサーが基礎となるエミュレーターに影響を与えることなく独自のメニューシステムを重ね合わせ、Record、Play、QuickDisk、フロッピーアクティビティランプやステータスなどの有用な情報を表示できるようにすることです。
ステータスフレームバッファーのアドレス:
| RAM | アドレス | 説明 |
|---|---|---|
| ステータス | 0x320000 | エミュレーター出力の上下の画面エリアのピクセルを保持するRAM。 |
| メニュー | 0x322000 | 256x128ピクセルの重ね合わせメニューのピクセルを保持するRAM。 |
| コントロール | 0x324000 | ビデオパラメーターアレイ。 |
| モード | 0x324400 | 現在のライブビデオモードを読み込みます。 |
ソースからのビルド
前提条件
- FPGAビルド: Quartus Prime 17.1.1 Standard Edition(Cyclone IV E合成用)
- CPLDビルド: Quartus II 13.0 SP1(MAX7000AEフィッティング用)
- Git: ソースリポジトリのクローン用
クイックビルド
リポジトリをクローンし、特定のバリアントをビルドします:
git clone https://git.eaw.app/eaw/tranZPUter.git
cd tranZPUter/FPGA/SW700/v1.3/MZ700/build
quartus_sh --flow compile coreMZ -c coreMZ_E115_emuMZ
他のホストマシンの場合はMZ700をMZ80AまたはMZ2000に、QSFバリアント名はcoreMZ_E115_emuMZを目的のものに置き換えてください。
CPLDビルドの場合:
cd tranZPUter/CPLD/SW700/v1.3/MZ700/build
quartus_sh --flow compile tranZPUterSW700
CI/CDパイプライン
自動ビルドは再現性のためにDockerコンテナを使用してjenkins.eaw.appのJenkinsで設定されています:
- FPGAビルド:
quartus-ii-17.1.1Dockerイメージ(Quartus 17.1.1 Standard Edition) - CPLDビルド:
quartus-ii-13.0.1Dockerイメージ(Quartus II 13.0 SP1)
Jenkinsパイプラインは全18のFPGAバリアント(3マシン × 2 FPGAサイズ × 3モード)と全CPLDバリアントをビルドし、出力をGiteaリリースとしてパッケージングします。
開発者ガイド
FPGAアーキテクチャ、レジスターマップ、信号の説明、I/Oプロセッサーインターフェース、エミュレーター拡張のステップバイステップガイドを含む詳細な技術ドキュメントについては、 開発者ガイドをご覧ください。
リンク
| サイト | 説明 |
|---|---|
| Engineers At Work | 私個人のプロジェクトサイト。 |
| 開発者ガイド | このエミュレーターの技術ドキュメントと開発者リファレンス。 |
| tranZPUterソースコード | Gitea上のソースコードリポジトリ。 |
| Jenkins CI/CD | 全FPGA/CPLDバリアントの自動ビルドパイプライン。 |
| SharpMZ.org | オリジナルのSharpMZサイト(オーナーは現在引退)。 |
| SharpMZ.no | オリジナルSharpMZサイトの後継として開発中。 |
| mz-80a.com | Sharp MZ-80Aガイド |
| Sharp Users Club | まだ活動中のSharp Users Club。 |
| SharpMZ Forum | 全モデル対応のアクティブなSharp MZフォーラム。 |
| SCAV | Sharp情報のチェコサイト |
クレジット
元々はNibbles Labが書いたMZ80Cエミュレーターを移植する意図でした。分析後にMISTerプロジェクトを発見し、独自のエミュレーションを書くことにしました。i8253/Keymatrixモジュールはこの実装で動作するよう適応されました。Nibbles LabとSorgeligの優れた作業に感謝します。サードパーティーの設計に基づいたコンポーネントを使用した場合は、ヘッダー内に元の著者の著作権表示を含めるか、適切なクレジットを付与しています。
ライセンス
このデザイン(ハードウェアおよびソフトウェア)はGNU Public Licence v3のもとでライセンスされています。
GNU Public License v3
ソースファイルは有用であることを願って配布されていますが、いかなる保証もありません。商品性や特定目的への適合性の黙示的な保証も含みません。詳細についてはGNU一般公衆ライセンスをご参照ください。
このプログラムとともにGNU一般公衆ライセンスのコピーを受け取っているはずです。受け取っていない場合はhttp://www.gnu.org/licenses/をご覧ください。