Sharp MZシリーズ FPGAエミュレータ v2.0

概要

Sharp MZシリーズエミュレーター v2.0は、オリジナルのMiSTerベースのエミュレーションを大幅に進化させ、tranZPUter SW-700ハードウェアプラットフォームに移植したものです。物理Sharp MZマシン内で8台のSharp MZコンピューター(MZ-80K、MZ-80C、MZ-1200、MZ-80A、MZ-700、MZ-800、MZ-80B、MZ-2000)の完全なFPGAエミュレーションを提供します。ホストマシンの物理キーボード、サウンド出力、カセットテープドライブはFPGAエミュレートされた同等品と統合されており、実機と仮想ハードウェアリソース間のシームレスな切り替えが可能です。

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スクリーンショットを以下に示します。

アーキテクチャ概要

v2.0エミュレーターは、明確な関心の分離を持つ3層設計です:

レイヤー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フルエミュレーション mzmz80amz700

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

他のホストマシンの場合はMZ700MZ80Aまたは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.1 Dockerイメージ(Quartus 17.1.1 Standard Edition)
  • CPLDビルド: quartus-ii-13.0.1 Dockerイメージ(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

このプロジェクトでGPL v3とマークされたソースファイルおよびバイナリファイルはフリーソフトウェアです。フリーソフトウェア財団が発行するGNU一般公衆ライセンスのバージョン3、またはそれ以降のバージョンの条件のもとで、再配布および改変することができます。

ソースファイルは有用であることを願って配布されていますが、いかなる保証もありません。商品性や特定目的への適合性の黙示的な保証も含みません。詳細についてはGNU一般公衆ライセンスをご参照ください。

このプログラムとともにGNU一般公衆ライセンスのコピーを受け取っているはずです。受け取っていない場合はhttp://www.gnu.org/licenses/をご覧ください。