tranZPUter SW

まえがき

tranZPUter および tranZPUter SW は現在も積極的に開発が続けられており、変更内容は定期的にドキュメントへ反映されています。

tranZPUter SW は tranZPUter プロジェクトから派生したものであり、オリジナルの tranZPUter プロジェクトで使用されていた ZPU の代わりに、Freescale K64F プロセッサを IO 制御プロセッサとして採用しています。

tranZPUter v1.0 のテスト中、また CP/M を搭載した RFS v2.0 アップグレードの登場を契機として、tranZPUter を更新する必要があることが判明しました。Z80 が追加メモリを持ち、より高いクロック周波数で動作できるようにすること、そして FPGA ファブリック上の ZPU Evo または K64F といった制御 IO プロセッサから独立して動作できるようにすることが必要でした。

tranZPUter v1.0 の設計には制約があり、プロジェクトの完成を著しく困難にしていました。たとえば、BGA(ボール・グリッド・アレイ)IC のはんだ付け経験が乏しかったため、次善の策として既製品の FPGA ボードである CYC1000(FPGA が既にはんだ付けされたもの)を選択しました。このデバイスおよび同サイズ・FPGA ALM 要件に対する他のすべての選択肢は、汎用 I/O ピンが不足していました。そのため、トライステートレジスタラッチを用いたマルチプレクスを使用せざるを得ませんでした。「KISS(Keep It Simple Stupid)」が頭をよぎります!そこで概念と設計をさらに進めるため、一歩立ち戻り、CP/M 要件を実現するために Z80 側で何が必要かを検討し、制御 IO プロセッサに何が必要かを見直しました。30 ポンドを超える IC(X 線装置でしかはんだ付けの正否を確認できないもの)のはんだ付けに今もなお不安を感じているため、十分な汎用 I/O ピンを持ち 5V 耐性のある強力なミニ開発ボード Teensy 3.5 を選択しました。これがこの中間設計です(ソフトウェアプログラマーで、エレクトロニクスや VHDL に不慣れでも Z80 マシンを強化したい方には実際にはより適した設計です)。

すべてを C/C++ で記述する予定でしたが(FLW = Famous Last Words /後で言い訳になる言葉 ―― K64F はコンパイルされた C コードでは十分な速度が出なかったため、割り込みサービスルーチンを ARM Thumb アセンブラで記述する必要がありました)、動作確認後は、ZPU が作成済みのソフトウェアをすべて実行できるという確信のもと、BGA を使った tranZPUter v2.0 の仕様策定という大きな一歩を踏み出せるでしょう。

概要

Sharp MZ80A は 2MHz で動作する Z80 CPU を搭載しています。ヴィンテージなマシンではありますが(Z80 は現在も新しい産業設計において 33MHz 以上で広く使用されています)、現代のコンピュータ(または Raspberry Pi)と比較すると非力です。歴史の一部であるという点を除いても、時折役立つソフトウェア資産があり、今もなおファンが存在します。ソフトウェアエミュレータを作成することでソフトウェアの利用期間を延ばすことも可能ですが、オリジナルハードウェアを使用することには特別な意味があります。これはマシンをオリジナルのまま保ちつつ、BBC Micro 上の PiCoPro のように追加の処理能力・ストレージ・ソフトウェアで実現された複数の異なる CPU を提供するアップグレードの代替手段です。これはすべて、オリジナル CPU をトライステートにして K64F がバスと下位の元のマザーボード周辺機器を必要に応じて制御するバスマスタリングによって実現されます。

このアップグレードは Z80 のハードウェア機能を拡張し、64K バージョンの CP/M を実現するための追加 RAM を提供するとともに、Sharp MZ80A マザーボードの周辺機器にアクセスする際には元の速度を維持しながらプロセッサを高速化します。

この設計は tranZPUter と連携して進行中の作業です。tranZPUter SW 向けに記述された C/C++ 制御ソフトウェアは、ZPU 上の tranZPUter でも動作することを意図しています。

この設計は Z80 を所定の位置で置き換えるため、MZ80A に限定されず、適切なソフトウェアの適合(例:MZ-700 や MZ-80B)によって任意の Z80 ベースのコンピュータに使用できます。

tranZPUter SW

tranZPUter という名前は「TRANsformable ZPU compuTER(変形可能な ZPU コンピュータ)」に由来しています。オリジナルの tranZPUter のベース CPU は ZPU Evo です。ZPU Evo は元の Z80 をトライステートにして MZ80A のメモリと周辺機器を ZPU デバイスとして扱うことで、Sharp MZ80A に対してメニュー・SD・ビデオオーバーレイサービスを提供します。

tranZPUter SW は tranZPUter 設計の目標を継承しつつ、下位の Z80 ハードウェアを同時に改善します。FPGA 上の VHDL をベースとした ZPU Evo の代わりに、Freescale K64F ARM Cortex-M4 を使用します。tranZPUter SW は要件に対してよりソフトウェア寄りのアプローチであることから、プロジェクト名に *S*oft*W*are の略として SW サフィックスを追加することで両設計を区別しています。

異なる CPU を提供するには、たとえば PiCoPro で使用されている既存の CPU エミュレータを利用し、この設計のインターフェースを通じて MZ80A バス上の CPU 信号を使用するよう適合させるだけです。プログラムメモリは MZ80A 上のものでも、より高速な K64F メモリでも構いません。つまり、ソフト CPU を使用する場合に MZ80A メモリを使用する実質的な必要性はありません。ソフト CPU を使用する利点は潜在的なパフォーマンス向上ですが、K64F は 120MHz でしか動作しないため、これはまだ検証されていません。tranZPUter SW の設計は Z80 ハードウェアをアップグレードし、Sharp MZ80A マザーボードから切り離してプロセッサをより高いクロックレートで駆動できます。Z8400 20MHz CPU を使用すれば最大 20MHz まで可能です。CP/M や DBase II などのデータベースを使用するプログラムにとって、より高い CPU パフォーマンスはメリットとなります。

ギャラリーには現在の設計の写真があり、Gitea にアップロードされているファイルは比較的安定しています。常に変化する WIP ファイルはアップロードされません。

ハードウェア

この設計の基本は Z80 バスマスタリング、すなわち Z80 を回路から切り離して残りのコンピュータハードウェアを必要に応じて制御する機能です。バスマスタリングは、DMA による I/O デバイスからメモリへの高速データ転送や、ビデオ・グラフィックスなどのアプリケーション向けのメモリ間転送に通常使用されていました。Z80 バスの制御を引き継いだデバイスは、Z80 が同じ処理を行うプログラムを実行するよりも遥かに高速にデータ転送できます。これがその利点です。

バスマスタリングは Z80 バスの制御を引き継ぎ、メインメモリと SD カード間のデータ転送、またはメニュー表示のための I/O プロセッサとビデオ表示バッファ間のデータ転送に使用されます。また、ソフトプロセッサがハードウェア Z80 を完全にアイドル状態にして主 CPU として機能する場合にも使用されます。つまり、ソフト CPU エミュレータを使用することで、ローカルメモリ上でアプリケーションを処理しながら、必要に応じてホストマシン上の I/O とビデオバッファにスローダウンしてアクセスし、まったく異なるコンピューティング体験を提供できます。6809 や 68000 ベースの Sharp MZ80A を想像してみてください!

この設計は、オリジナルの Z80 をドーターカード上に持ち上げ、いくつかの信号を必要に応じて制御できるよう再ルーティングすることを中心としています。

v1.0 Z80 アップグレード回路図

Sheet 1

他の Sharp モデル(MZ-700 など)向けプログラムや 64K CP/M を実行できるようにするため、この設計には必要なページングロジックを備えた 512KB スタティック RAM デバイスが追加されています。この段階ではメモリの再マッピング(下位 Sharp MZ80A アドレス空間のブロックをマップアウトして 512KB スタティック RAM のブロックをマップイン)において柔軟性が必要なため、フラッシュ RAM 形式のプログラマブルデコーダを使用しています。これにより開発中の最大の柔軟性が確保され、必要な機能に対する最終的なメモリマップの決定が可能となり、このプロジェクトの v2.0 ではコストと基板スペースを削減するためにフラッシュ RAM の代わりに PAL/GAL のハードワイヤードロジックを使用できます。

上記の回路図は、IO プロセッサなしで基本ボードをインストールできるように設計されています。このボードを Sharp MZ80A の Z80 ソケットに挿入するだけで標準通り動作し、追加機能は BASIC/アセンブラからプログラムでアクセスできます。RFS ボードがインストールされている場合、RFS ソフトウェアのアップデートによって追加の拡張ハードウェア機能が活用されます。RFS ボードがインストールされていない状態で IO 制御プロセッサ(Teensy 3.5)を追加すると、RFS ボードで利用可能な機能を上回る全く新しいオプションが利用可能になります。この設計を使用することで、最終的な tranZPUter プロジェクトでは Teensy 3.5 の代わりに FPGA を使用することが容易になります。

プロジェクトの進展に伴い、修正と機能強化を反映するために最初のカット PCB に小さな変更が加えられました。上記リビジョン 1.0d では追加のロジックが加えられており、プロトタイプ PCB ではポイント間配線とピギーバック IC で実現されています。設計は完全に動作するようになり、バージョン 1.1 ではできる限りロジックを削減しますが、GAL/PAL ではなくディスクリートロジックの使用は継続します。バージョン 1.1 では PCB サイズを縮小するためにより多くの SMD デバイスを使用し、MZ-80A・MZ-80B・MZ-700 のケース内に収まるようにします。将来のバージョン 2 ではすべてのディスクリートロジックと 512KB フラッシュ RAM デコーダを除去し、CPLD に置き換える予定です。

v1.0 Teensy 3.5 回路図

Sheet 2

2 枚目の回路図は Teensy 3.5 開発ボードで、48 ピン DIL パッケージ(追加 GPIO 用の接触パッドが裏面にもあります)で提供され、tranZPUter のようなプロジェクトボードに搭載するのに理想的です。Freescale K64F プロセッサ、SD カード、プログラムをメモリにアップロードするための USB ロジックを搭載しています。5V 耐性コアのおかげで、Teensy3.5 がこのプロジェクトで Z80 を制御するために必要なサポートハードウェアは非常に少ないです。

v1.0 PCB


以前の回路図や PCB ボードと同様に、このプロジェクトは KiCad 回路図キャプチャおよび PCB レイアウトで設計されています。以下は部品実装・組み立て待ちの完成ボードです。

PCB TopSide

PCB UnderSide


v1.1 Z80 アップグレード回路図

Sheet 1

バージョン 1.1 は v1.0d と機能的にほぼ同じですが、いくつかのゲートを削減し、既存のゲート数を活用しながら ENIOWAIT(ウェイトステートジェネレータを有効にする制御で、明示的に有効化しない限り元のソフトウェアには影響しません)を追加しています。

v1.1 Teensy 3.5 回路図

Sheet 2


バージョン 1.1 は v1.0d とほぼ同じですが、ウェイトステートジェネレータが有効になっていることを検出するための ENIOWAIT が追加されています。

v1.1 PCB


PCB のバージョン 1.1 では設計が若干コンパクトになっています。Sharp MZ-80A と MZ-700 の両方に対応する 1 枚のボードを作ることを望んでいましたが、MZ-700 が PCB に課す制約(Z80 の向きが逆、SD カードの挿入・取り出し用の隙間、クリアランスなど)により、2 種類のボードを設計する必要があります。

以下のボードは現在製造中の Sharp MZ-80A ボードの KiCad 画像です。バージョン 1.1 の設計と PCB は、v1.0 から v1.0d への変更をすべて反映した段階的な設計です。

PCB TopSide

PCB UnderSide

Assembled PCB

Assembled PCB


v2.0 Z80 アップグレード回路図

Sheet 1

バージョン 2.0 ではディスクリートロジックを CPLD に置き換えています。MZ-700 に収まる小型 PCB を製造するにはディスクリートロジックが多すぎるため、コンポーネント数を削減しつつ潜在的な機能を増やしながら基板サイズを縮小することを目指しています。MZ-80B を検討すると、Z80B・8255 とコネクタ(CN6 など)の間のクリアランスから基板の最大サイズは 50×100mm となります。CPU の向きは MZ-700 と同じ方向なので、1 枚のボードで両機種に対応できることを期待しています。

v2.0 Teensy 3.5 回路図

Sheet 2

バージョン 2.0 は v1.1 と非常に似ており、アイデアリストが増えるにつれて追加の接続性が加えられています。

v2.0 PCB


PCB のバージョン 2.0 では設計がかなりコンパクトになっています。4 層基板にしない限り、Sharp MZ-80A と MZ-700 の両方に対応する 1 枚のボードを作るのはまだ容易ではありません。4 層基板はプロジェクトが成熟したときの方針です。

以下のボードは製造済みで部分的に組み立てられた Sharp MZ-80A ボードの KiCad 画像です。このボードで本当にミスをしてしまい、今でもどうしてそうなったか不思議に思っています!スペースを最小化するために AS6C4008 の sTSOP デバイスを使用しようとしたのに、TSSOP を注文してしまいました。おそらく夜更かしのせいでしょうが、実際に部品を注文するまでミスに気づかなかったという事実から、このような間違いを最小化するためにボードを設計しながら部品を注文するという方針に変える必要があります。

PCB TopSide

PCB UnderSide

Assembled PCB


v2.1 Z80 アップグレード回路図

Sheet 1

バージョン 2.1 は v2.0 のミスと継続的な要件リストを踏まえ、160 マクロセル CPLD を低消費電力の 512 マクロセル AE に置き換えています。これらのデバイスはかなり古いですが安価に入手できるため採用しています。より大きな CPLD を使用する理由は、ハードウェアレベルでモデルの差異をマッピングする機能を追加したいからです。たとえば MZ80B はキーボードと制御に I/O ポートを使用するのに対し、MZ80A/MZ700 はメモリマップドポートを使用します。アイデアとしては、MZ80B モードの CPLD が I/O 操作をインターセプトし、Z80 をトライステートにして Sharp MZ80A ホスト上のメモリマップドポートに正しい値を書き込むというものです。読み取り操作のマッピングや、Sharp MZ80A キーボードが必要に応じて MZ700 または MZ80B モードのように見えるキーボードストローブ信号のマッピングも同様です。

v2.1 Teensy 3.5 回路図

Sheet 2


バージョン 2.1 は v2.0 と非常に似ていますが、現在 3.3V で動作しているためさらなる接続性が追加されています(K64F はすべてのピンで 5V 耐性があるわけではないため)。

v2.1 PCB


PCB のバージョン 2.1 は v2.0 に続き、高密度 TQFP パッケージと正しい(今度こそ!)SRAM パッケージを使用しています。SRAM は正しく TSOP として仕様が決定・発注されました。sTTSOP ではなく TSOP を選択したのは PCB ルーティングの理由からで、狭いピンでのルーティングはかなりの挑戦でした。

以下のボードは Sharp MZ-80A 向け PCB の KiCad 画像です。

PCB TopSide

PCB UnderSide

Assembled PCB

Assembled PCB


v2.2 Z80 アップグレード回路図

Sheet 1

これまでのすべてのバージョンは、オプションの Teensy 3.5 48 ピン DIL 開発ボードを使用した組み立てが非常に困難でした。Teensy 3.5 の設計は多くの K64F GPIO ピンにアクセスできるようにしていますが、その多くは裏面のはんだパッドにあります。これらのパッドは接続が非常に難しく、成功・失敗が分かれます。裏面パッドを正確かつ確実に接続できなかった場合、ボードは使用不能となり、修正はほぼ不可能です。バージョン 2.2 はこの状況を改善するために、MK64FX512 プロセッサを tranZPUter SW 設計に組み込み、Teensy 3.5 を廃止します。IO プロセッサは設計の不可欠な部分となります。

互換性のために、必要であれば Teensy 3.5 ブートストラップ MCU をオプションでインストールすることも可能です。それ以外の場合はプログラミングは JTAG インターフェース経由で行われます。

v2.2 K64 I/O プロセッサ

Sheet 2


バージョン 2.2 では Teensy 3.5 開発ボードを 100 ピン QFP MK64FX512 プロセッサに置き換え、必要に応じてプログラミングを容易にするための Teensy ブートストラップ MCU をオプションで追加できます。

v2.2 PCB


PCB のバージョン 2.2 は v2.1 に続き、高密度 TQFP パッケージを使用し、アクセスしやすいよう前面向きの SD カードとマイクロ USB タイプ B インターフェースを配置しています。

以下のボードは Sharp MZ-80A 向け PCB の KiCad 画像で、KiCad で設計・製造発注済みです。

PCB TopSide

PCB UnderSide

Assembled PCB

Assembled PCB


バージョン 2.1 と v2.2 は、現在設計中のオリジナル ZPU バージョンの tranZPUter ボードの基盤として使用されています。Z80 アップグレード回路は変わらず継続されますが、tranZPUter の v2.0 では K64F I/O プロセッサが Cyclone IV FPGA・CPLD・2MB RAM に置き換えられます。これにより ZPU を制御 I/O プロセッサとして、また 110K LE FPGA に詰め込める他のプロセッサやロジックをインスタンス化することが可能になります。

設計詳細

このセクションでは、tranZPUter の動作とホスト(現在 Sharp MZ-80A および MZ-700 でテスト済みの元のコンピュータ)・tranZPUter SW ドーターボード・K64F プロセッサ間の相互作用を理解するための内部設計情報を提供します。

K64F Z80 ホスト API

API は Z80 の 64K メモリ空間内の共通 RAM ブロックを基盤としており、このブロックを通じてプロセッサ間通信が行われます。K64F 側ではこれが C の構造体として宣言され、Z80 側ではメモリ変数へのアセンブラ参照として宣言されます。
// Structure to contain inter CPU communications memory for command service processing and results.
// Typically the z80 places a command into the structure in its memory space and asserts an I/O request,
// the K64F detects the request and reads the lower portion of the struct from z80 memory space,
// determines the command and then either reads the remainder or writes to the remainder. This struct
// exists in both the z80 and K64F domains and data is sync'd between them as needed.
//
typedef struct __attribute__((__packed__)) {
    uint8_t                          cmd;                                // Command request.
    uint8_t                          result;                             // Result code. 0xFE - set by Z80, command available, 0xFE - set by K64F, command ack and processing. 0x00-0xF0 = cmd complete and result of processing.
    union {
        uint8_t                      dirSector;                          // Virtual directory sector number.
        uint8_t                      fileSector;                         // Sector within open file to read/write.
        uint8_t                      vDriveNo;                           // Virtual or physical SD card drive number.
    };
    union {
        struct {
            uint16_t                 trackNo;                            // For virtual drives with track and sector this is the track number
            uint16_t                 sectorNo;                           // For virtual drives with track and sector this is the sector number. NB For LBA access, this is 32bit and overwrites fileNo/fileType which arent used during raw SD access.
        };
        uint32_t                     sectorLBA;                          // For LBA access, this is 32bit and used during raw SD access.
    };
    uint8_t                          fileNo;                             // File number of a file within the last directory listing to open/update.
    uint8_t                          fileType;                           // Type of file being processed.
    union {
        uint16_t                     loadAddr;                           // Load address for ROM/File images which need to be dynamic.
        uint16_t                     saveAddr;                           // Save address for ROM/File images which need to be dynamic.
        uint16_t                     cpuFreq;                            // CPU Frequency in KHz - used for setting of the alternate CPU clock frequency.
    };
    union {
        uint16_t                     loadSize;                           // Size for ROM/File to be loaded.
        uint16_t                     saveSize;                           // Size for ROM/File to be saved.
    };
    uint8_t                          directory[TZSVC_DIRNAME_SIZE];      // Directory in which to look for a file. If no directory is given default to MZF.
    uint8_t                          filename[TZSVC_FILENAME_SIZE];      // File to open or create.
    uint8_t                          wildcard[TZSVC_WILDCARD_SIZE];      // A basic wildcard pattern match filter to be applied to a directory search.
    uint8_t                          sector[TZSVC_SECTOR_SIZE];          // Sector buffer generally for disk read/write.
} t_svcControl;

通信はすべて Z80 によって開始されます。サービスが必要になると、Z80 は svcControl.cmd フィールドにコマンドを書き込み、svcControl.result フィールドを REQUEST に設定します。Z80 は次に出力ポート(設定可能ですが通常 0x68)に書き込み、これにより K64F への割り込みが送信されます。K64F はコマンドを読み取り、svcControl.result を PROCESSING に設定します。Z80 はこのハンドシェイクを待ち、タイムアウト期間後に確認できない場合はコマンドを再送します。Z80 は次に有効な結果を待ち、同様に合理的な時間内に結果を得られない場合はシーケンスを再試行し、一定回数の試行後にエラーで中断します。

K64F がコマンドを処理(例:ディレクトリの読み取り)し、必要なデータを構造体に格納すると、トランザクションを完了するために svcControl.result を有効な結果(成功、失敗、またはエラーコード)に設定します。

API コマンド一覧

コマンド コマンド番号 説明
TZSVC_CMD_READDIR 0x01 ディレクトリを開き、最初のエントリブロックを返す。
TZSVC_CMD_NEXTDIR 0x02 開いているディレクトリの次のブロックを返す。
TZSVC_CMD_READFILE 0x03 ファイルを開き、最初のブロックを返す。
TZSVC_CMD_NEXTREADFILE 0x04 開いているファイルの次のブロックを返す。
TZSVC_CMD_WRITEFILE 0x05 ファイルを作成して最初のブロックを保存する。
TZSVC_CMD_NEXTWRITEFILE 0x06 開いているファイルに次のブロックを書き込む。
TZSVC_CMD_CLOSE 0x07 開いているファイルまたはディレクトリを閉じる。
TZSVC_CMD_LOADFILE 0x08 ファイルを tranZPUter メモリに直接読み込む。
TZSVC_CMD_SAVEFILE 0x09 tranZPUter メモリから直接ファイルを保存する。
TZSVC_CMD_ERASEFILE 0x0a SD カード上のファイルを消去する。
TZSVC_CMD_CHANGEDIR 0x0b SD カード上のアクティブディレクトリを変更する。
TZSVC_CMD_LOAD40ABIOS 0x20 SA1510 BIOS の 40 桁版を読み込むリクエスト。Sharp MZ-80A に合わせた周波数に変更する。
TZSVC_CMD_LOAD80ABIOS 0x21 SA1510 BIOS の 80 桁版を読み込むリクエスト。Sharp MZ-80A に合わせた周波数に変更する。
TZSVC_CMD_LOAD700BIOS40 0x22 1Z-013A MZ-700 BIOS の 40 桁版を読み込むリクエスト。Sharp MZ-700 に合わせた周波数変更とメモリページコマンドの実行。
TZSVC_CMD_LOAD700BIOS80 0x23 1Z-013A MZ-700 BIOS の 80 桁版を読み込むリクエスト。Sharp MZ-700 に合わせた周波数変更とメモリページコマンドの実行。
TZSVC_CMD_LOAD80BIPL 0x24 MZ-80B IPL の読み込みリクエスト。周波数を切り替え Sharp MZ-80B 互換モードを有効にする。
TZSVC_CMD_LOADBDOS 0x30 CPM BDOS+CCP を再読み込みする。
TZSVC_CMD_ADDSDDRIVE 0x31 CPM ディスクをドライブ番号に割り当てる。
TZSVC_CMD_READSDDRIVE 0x32 割り当てられた SD ファイルを CPM ディスクドライブとして読み取る。
TZSVC_CMD_WRITESDDRIVE 0x33 割り当てられた SD ファイルである CPM ディスクドライブに書き込む。
TZSVC_CMD_CPU_BASEFREQ 0x40 tranZPUter が Z80 にメインボード周波数を使用するよう設定する。
TZSVC_CMD_CPU_ALTFREQ 0x41 Z80 を K64F が生成するクロック(代替周波数)に切り替える。
TZSVC_CMD_CPU_CHGFREQ 0x42 svcControl.cpuFreq で指定されたヘルツ値に K64F が生成する Z80 周波数を変更する。Z80 はこの周波数の最も近いタイマー分解能でクロックされる。
TZSVC_CMD_CPU_SETZ80 0x50 外部 Z80 ハード CPU に切り替える。
TZSVC_CMD_CPU_SETT80 0x51 内部 T80 ソフト CPU に切り替える。
TZSVC_CMD_CPU_SETZPUEVO 0x52 内部 ZPU Evolution CPU に切り替える。
TZSVC_CMD_SD_DISKINIT 0x60 下位 SD カードを初期化して生のアクセスを提供する。
TZSVC_CMD_SD_READSECTOR 0x61 下位 SD カードへの生の読み取りアクセスを提供する。
TZSVC_CMD_SD_WRITESECTOR 0x62 下位 SD カードへの生の書き込みアクセスを提供する。
TZSVC_CMD_EXIT 0x7F TZFS を終了し、マシンをオリジナルモードで再起動する。

API 結果コード一覧

コマンド 結果番号 説明
TZSVC_STATUS_OK 0x00 K64F の処理が正常に完了した。
TZSVC_STATUS_FILE_ERROR 0x01 ファイルまたはディレクトリエラー。
TZSVC_STATUS_BAD_CMD 0x02 不正なサービスコマンドが要求された。
TZSVC_STATUS_BAD_REQ 0x03 不正なリクエストが行われた。サービスステータスリクエストフラグが設定されていない。
TZSVC_STATUS_REQUEST 0xFE Z80 がリクエストを投稿した。
TZSVC_STATUS_PROCESSING 0xFF K64F がコマンドを処理中。

API 結果コード一覧

コマンド 結果番号 説明
TZSVC_STATUS_OK 0x00 K64F の処理が正常に完了した。
TZSVC_STATUS_FILE_ERROR 0x01 ファイルまたはディレクトリエラー。
TZSVC_STATUS_REQUEST 0xFE Z80 がリクエストを投稿した。
TZSVC_STATUS_PROCESSING 0xFF K64F がコマンドを処理中。

GPIO の構成

この設計では K64F は監視・サービスの役割を担います。Z80 は K64F が存在しなくても単独で機能でき、ホストマシンを完全にオリジナルの状態に保つことができます。加えて tranZPUter ボードは 512K スタティック RAM などの新しいアップグレードも提供しており、Z80 は必要に応じてこれを利用できます。

512K スタティック RAM など、Z80 が必要に応じて利用できる新たなアップグレードが加わっています。

SD カードアクセスやハードウェアエミュレーションなどの高度なサービスが必要な場合は、K64F がそれらを提供する必要があります。Z80 は K64F をハードウェア拡張として認識し、I/O リクエストを発行することで機能を受け取ります。

たとえば Z80 が BIOS ロードを要求する場合、I/O 出力リクエストを生成して K64F に割り込みをかけます。K64F は Z80 をトライステート バスマスター モードにし、SD カードから BIOS を読み取って、Z80 のラインを操作して BIOS データを Z80 RAM に書き込みます。さらに、tranZPUter が MZ-700 などのマシンをエミュレートしている場合、K64F はすべての Z80 I/O トランザクションを読み取り、メモリ モード変更リクエストをインターセプトし、Z80 をトライステートにして、tranZPUter のメモリ モード ラッチに正しいメモリ モードを書き込み、その後 Z80 を解放することでハードウェア エミュレーションを実現します。

この機能を提供するために、K64F は必要に応じてすべての Z80 信号を読み書きできる必要があります。K64F の利点のひとつは、5V 耐性を持つデジタル I/O ポートが豊富に備わっていることで、5V Z80 システムとの接続・動作は比較的容易です。残念ながら、Teensy 3.5(K64F プロセッサを搭載した小型開発ボード)はポート/ピンの線形割り当てを使用しておらず、さらにモデルによっては K64F が特定のビットをインスタンス化しないという問題があります。このため、Z80 信号と GPIO ポート/ピンの割り当てが断片的になり、リアルタイムでイベントを検出・対応してサービスを提供するために必要な 16 ビットアドレスや 8 ビットデータ値をソフトウェアが組み立てるのに時間がかかります。

Z80 ピンから GPIO ポート/ピンへの割り当ては割り込みサービスルーチンでいくつかの問題を引き起こしましたが、ハードウェア ウェイト ステート ジェネレーターの追加によって解決されました。Sharp の I/O システム範囲 0xE0〜0xFF に対して I/O 操作が行われると、WAIT 信号が自動的にアサートされ、ISR が BUSRQ 信号を上げるとキャンセルされます。ほとんどの状況では実際の WAIT ステートは挿入されず、競合する割り込み(スレッドスケジューラ、ミリ秒タイマー)によって遅延が生じた場合にのみ、このメカニズムが WAIT を追加して ISR が処理できるまで信号を有効に保ちます。

この問題を理解するために、以下のテーブルを作成して Z80 信号とその関連 K64F ピンを示しています。信号は 5 つの 32 ビット内部 K64F レジスタに分散されています。 </div>

K64F ポートとビットの割り当て
BIT / PORT 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
A                             Z80_A0 Z80_A11 Z80_A12 Z80_A13 Z80_D4 Z80_D3               Z80_A14        
B                 CTL_RFSH Z80_INT Z80_MEM0 Z80_NMI Z80_A9 Z80_A10 Z80_D1 Z80_D0         Z80_A7 Z80_A8         Z80_MEM4 Z80_MEM3 CTL_HALT CTL_CLKSLCT Z80_BUSACK CTL_BUSACK
C                                         Z80_A1 Z80_A2 Z80_A3 Z80_A4 Z80_RD SYSCLK Z80_WAIT Z80_WR Z80_MREQ Z80_A16 Z80_A17 Z80_BUSRQ
D                                 Z80_RESET       TZ_BUSACK   Z80_MEM2 Z80_MEM1 Z80_D5 Z80_A18 CTL_M1 Z80_D6 Z80_IORQ Z80_D7 CTL_CLK Z80_D2
E           Z80_A15 Z80_A5 Z80_A6                         SYSREQ SVCREQ                    
GPIO ビットから Z80 アドレスラインへのマッピング
ADDR 18 ADDR 17 ADDR 16 ADDR 15 ADDR 14 ADDR 13 ADDR 12 ADDR 11 ADDR 10 ADDR 9 ADDR 8 ADDR 7 ADDR 6 ADDR 5 ADDR 4 ADDR 3 ADDR 2 ADDR 1 ADDR 0
PORT D:6 PORT C:1 PORT C:2 PORT E:26 PORT A:4 PORT A:14 PORT A:15 PORT A:16 PORT B:18 PORT B:19 PORT B:10 PORT B:11 PORT E:24 PORT E:25 PORT C:8 PORT C:9 PORT C:10 PORT C:11 PORT A:17
                                     
GPIO ビットから Z80 データラインへのマッピング
DATA 7 DATA 6 DATA 5 DATA 4 DATA 3 DATA 2 DATA 1 DATA 0
PORT D:2 PORT D:4 PORT D:7 PORT A:13 PORT A:12 PORT D:0 PORT B:17 PORT B:16

メモリ モード

tranZPUterSW ハードウェア設計の特徴のひとつは、512K Flash RAM 内でメモリ マップを自由に作成できることです。これらのマップはメモリ モードに割り当てられ、メモリ モード ラッチによって選択されます。これらは、tranZPUter SW のメモリが元のメインボード コンポーネントとともに Z80 メモリ アドレス空間にどのようにマッピングされるかを定義します。この機能は、TZFS、CP/M、Sharp MZ-700 および MZ-80B の互換モードを実現するために有効活用されています。

定義済みのモードを以下の表に示します。さらなる拡張のためにいくつかの空きスロットが残されています。
モード 対象 範囲 ブロック   機能 DRAM リフレッシュ 説明
0 オリジナル 0000:0FFF メイン MROM あり デフォルト。通常の Sharp MZ80A 動作モード。すべてのメモリと IO(tranZPUter 制御 I/O ブロックを除く)はメインボード上にある
    1000:CFFF メイン D-RAM    
    D000:D7FF メイン VRAM    
    D800:DFFF メイン ARAM    
    E000:E7FF メイン MM I/O    
    E800:EFFF メイン ユーザー ROM    
    F000:FFFF メイン FDC ROM    
1 オリジナル+ UROM 0000:0FFF RAM 0 MROM あり モード 0 と同じだが、ユーザー ROM が tranZPUter RAM にマッピングされ、ロード可能な BIOS イメージ用に使用される
    1000:CFFF メイン D-RAM    
    D000:D7FF メイン VRAM    
    D800:DFFF メイン ARAM    
    E000:E7FF メイン MM I/O    
    E800:EFFF メイン ユーザー ROM    
    F000:FFFF メイン FDC ROM    
2 TZFS 0000:0FFF RAM 0 MROM なし TZFS またはその他の tranZPUter RAM を使用するソフトウェアのブートモード。ユーザー ROM はモニターに ROM として見え、通常の起動手順の一環として 0xE800 のエントリポイントを呼び出す。0xE800 に格納されたソフトウェアは必要に応じてメインボードを切り離して tranZPUter RAM で動作できる。フロッピー ディスク コントローラの F3FE と F7FE に 2 つの小さなホールがある(Flash RAM のアドレスラインの粒度により F3C0 と F7C0 から 64 バイト離れている必要がある)、これらはメインボード上に配置する必要がある。フロッピー ディスク コントローラはデータ読み書きの一部としてこれらを使用するが、Z80 では FDC をポーリングするのに十分な速度がない
    1000:CFFF RAM 0 メイン RAM    
    D000:D7FF メイン VRAM    
    D800:DFFF メイン ARAM    
    E000:E7FF RAM 0 MM I/O    
    E800:EFFF RAM 0 ユーザー ROM    
    F000:FFFF RAM 0 FDC ROM    
3 TZFS 0000:0FFF RAM 0 MROM なし TZFS のページ モード。tranZPUter ブロック 0 内のすべての RAM を使用するが、F000:FFFF はブロック 1 にあり、TZFS のページバンク 2 にあたる
    1000:CFFF RAM 0 メイン RAM    
    D000:D7FF RAM 0 VRAM    
    D800:DFFF RAM 0 ARAM    
    E000:E7FF RAM 0 MM I/O    
    E800:EFFF RAM 0 ユーザー ROM    
    F000:FFFF RAM 1 FDC ROM    
4 TZFS 0000:0FFF RAM 0 MROM なし モード 3 と同じだが F000:FFFF はブロック 2 にあり、TZFS のページバンク 3 にあたる
    1000:CFFF RAM 0 メイン RAM    
    D000:D7FF RAM 0 VRAM    
    D800:DFFF RAM 0 ARAM    
    E000:E7FF RAM 0 MM I/O    
    E800:EFFF RAM 0 ユーザー ROM    
    F000:FFFF RAM 2 FDC ROM    
5 TZFS 0000:0FFF RAM 0 MROM なし モード 3 と同じだが F000:FFFF はブロック 3 にあり、TZFS のページバンク 4 にあたる
    1000:CFFF RAM 0 メイン RAM    
    D000:D7FF RAM 0 VRAM    
    D800:DFFF RAM 0 ARAM    
    E000:E7FF RAM 0 MM I/O    
    E800:EFFF RAM 0 ユーザー ROM    
    F000:FFFF RAM 3 FDC ROM    
6 CP/M 0000:FFFF RAM 4 メイン RAM なし CP/M。すべてのメモリが tranZPUter ボード上にある。F3C0:F3FF と F7C0:F7FF(フロッピー ディスク ページング ベクター)はメインボード上に存在する特例
7 CP/M 0000:0100 RAM 4 CP/M ベクター なし CP/M メイン CBIOS エリア。CBIOS 用に 48K + 2K が利用可能でメインボード ハードウェアへの直接アクセスが可能。F000:FFFF はバンク 4 に残り、このメモリ モードとモード 6 の間のゲートウェイとして使用される
    0100:CFFF RAM 5 メイン RAM    
    D000:D7FF メイン VRAM    
    D800:DFFF メイン ARAM    
    E000:E7FF メイン MM I/O    
    E800:EFFF RAM 5 ユーザー ROM    
    F000:FFFF RAM 4 FDC ROM    
8 オリジナル+ エミュ 0000:0FFF メイン MROM あり オリジナル モードだが、メイン RAM が tranZPUter バンク 0 にある。このモードは、MZ-700 プログラムなどの起動時にバンク切り替えを行い、ロードされたプログラムが tranZPUter RAM バンク内のメイン メモリに存在することを期待するプログラムのブートストラップに使用される
    1000:CFFF RAM 0 メイン RAM    
    D000:D7FF メイン VRAM    
    D800:DFFF メイン ARAM    
    E000:E7FF メイン MM I/O    
    E800:EFFF メイン ユーザー ROM    
    F000:FFFF メイン FDC ROM    
10 MZ-700 0000:0FFF RAM 6 メイン RAM なし MZ-700 モード(OUT $E0)- モニター RAM をメイン RAM に置き換え
    1000:CFFF RAM 0 メイン RAM    
    D000:D7FF メイン VRAM    
    D800:DFFF メイン ARAM    
    E000:E7FF メイン MM I/O    
    E800:EFFF メイン ユーザー ROM    
    F000:FFFF メイン FDC ROM    
11 MZ-700 0000:0FFF RAM 0 MROM なし MZ-700 モード(OUT $E0 + $E1)- I/O およびビデオ ブロックをメイン RAM に置き換え
    1000:CFFF RAM 0 メイン RAM    
    D000:D7FF RAM 6 VRAM    
    D800:DFFF RAM 6 ARAM    
    E000:E7FF RAM 6 MM I/O    
    E800:EFFF RAM 6 ユーザー ROM    
    F000:FFFF RAM 6 FDC ROM    
12 MZ-700 0000:0FFF RAM 6 メイン RAM なし MZ-700 モード(OUT $E1 + $E2)- モニター RAM を RAM に置き換え、I/O およびビデオ ブロックをメイン RAM に置き換え
    1000:CFFF RAM 0 メイン RAM    
    D000:D7FF RAM 6 VRAM    
    D800:DFFF RAM 6 ARAM    
    E000:E7FF RAM 6 MM I/O    
    E800:EFFF RAM 6 ユーザー ROM    
    F000:FFFF RAM 6 FDC ROM    
13 MZ-700 0000:0FFF RAM 0 MROM なし MZ-700 モード(OUT $E5)- 上位メモリをロックアウトし、モニター ROM をページイン
    1000:CFFF RAM 0 メイン RAM    
    D000:FFFF n/a 未定義    
14 MZ-700 0000:0FFF RAM 6 メイン RAM なし MZ-700 モード(OUT $E6)- モニター RAM を RAM に置き換え、上位メモリをロックアウト
    1000:CFFF RAM 0 メイン RAM    
    D000:FFFF n/a 未定義    
15 MZ-800/MZ-700         以下の表を参照。メモリ モードは MZ-800 に準ずる
21 K64F アクセス 000000:FFFFFF n/a FPGA リソース なし tranZPUter SW-700 ボード用に予約済み
22 FPGA アクセス 0000:FFFF n/a ホスト リソース あり tranZPUter SW-700 ボード用に予約済み
23 K64F アクセス 000000:FFFFFF RAM メイン RAM なし tranZPUter SW-700 ボード用に予約済み
24 K64F アクセス 0000:FFFF RAM 0 メイン RAM あり/なし すべてのメモリと IO が tranZPUter ボード上にあり、64K ブロック 0 が選択されている。このモード使用時はメインボードの DRAM が tranZPUter ライブラリによってリフレッシュされる
25 0000:FFFF RAM 1 メイン RAM あり/なし すべてのメモリと IO が tranZPUter ボード上にあり、64K ブロック 1 が選択されている。このモード使用時はメインボードの DRAM が tranZPUter ライブラリによってリフレッシュされる
26 0000:FFFF RAM 2 メイン RAM あり/なし すべてのメモリと IO が tranZPUter ボード上にあり、64K ブロック 2 が選択されている。このモード使用時はメインボードの DRAM が tranZPUter ライブラリによってリフレッシュされる
27 0000:FFFF RAM 3 メイン RAM あり/なし すべてのメモリと IO が tranZPUter ボード上にあり、64K ブロック 3 が選択されている。このモード使用時はメインボードの DRAM が tranZPUter ライブラリによってリフレッシュされる
28 0000:FFFF RAM 4 メイン RAM あり/なし すべてのメモリと IO が tranZPUter ボード上にあり、64K ブロック 4 が選択されている。このモード使用時はメインボードの DRAM が tranZPUter ライブラリによってリフレッシュされる
29 0000:FFFF RAM 5 メイン RAM あり/なし すべてのメモリと IO が tranZPUter ボード上にあり、64K ブロック 5 が選択されている。このモード使用時はメインボードの DRAM が tranZPUter ライブラリによってリフレッシュされる
30 0000:FFFF RAM 6 メイン RAM あり/なし すべてのメモリと IO が tranZPUter ボード上にあり、64K ブロック 6 が選択されている。このモード使用時はメインボードの DRAM が tranZPUter ライブラリによってリフレッシュされる
31 0000:FFFF RAM 7 メイン RAM あり/なし すべてのメモリと IO が tranZPUter ボード上にあり、64K ブロック 7 が選択されている。このモード使用時はメインボードの DRAM が tranZPUter ライブラリによってリフレッシュされる
凡例:
MROM = モニター ROM。元のブートファームウェア(例: SA-1510)
D-RAM = メインボード上のダイナミック RAM
VRAM = メインボード上のビデオ RAM
ARAM = メインボード上のカラー属性 RAM
MM I/O = メインボード上のメモリ マップド I/O コントローラ
RAM 0 .. 7 = 512K スタティック RAM チップ内の 64K RAM ブロック番号
メイン = ホスト コンピューターのメインボード(例: Sharp MZ-80A メインボード)
MZ700/MZ800 メモリ モード
MZ-700           MZ-800            
レジスタ 0000:0FFF 1000:1FFF 1000:CFFF C000:CFFF D000:FFFF 0000:7FFF 1000:1FFF 2000:7FFF 8000:BFFF C000:CFFF C000:DFFF E000:FFFF
OUT 0xE0 DRAM         DRAM            
OUT 0xE1         DRAM             DRAM
OUT 0xE2 MONITOR         MONITOR            
OUT 0xE3         メモリ マップド I/O             上位 MONITOR ROM
OUT 0xE4 MONITOR   DRAM   メモリ マップド I/O MONITOR CGROM DRAM VRAM   DRAM 上位 MONITOR ROM
OUT 0xE5         禁止             禁止
OUT 0xE6         <復帰>             <復帰>
IN 0xE0   CGROM*   VRAM*     CGROM   VRAM      
IN 0xE1   DRAM   DRAM     <復帰>   DRAM      
凡例:
<復帰> = 対応するコマンドが呼び出される前の状態に戻る
* = MZ-800 ホストのみ

Z80 CPU 周波数切り替え

tranZPUter SW を他のマシンと互換性を持たせるために、CPU をそのマシンの速度でクロックする必要があります。また、CP/M などのソフトウェアを使用する際には、最大のパフォーマンスを得るために CPU をできる限り高速でクロックすることが望まれます。

周波数切り替えの主な問題は、基盤となるホストの周波数を変更できないことです。ホストは通常クロックを生成しており、その回路はそのクロック許容範囲内で動作するように設計されています。

切り替え可能な Z80 CPU 周波数の要件を満たすために、ホスト周波数を一方の入力とし、K64F からの矩形波ジェネレーターを第二の入力とする正エッジ トリガー型周波数切り替えが実装されています。切り替えメカニズムはバス制御ロジックに連動しており、ホストへのアクセスがある場合には CPU の周波数がホストの周波数に変更されることで継続的な安定動作が保証されます。起動時には、Z80 は常にホスト クロックでクロックされてマシンの元の仕様が満たされます。

K64F が存在する場合、そのオンボード タイマーを使用してプログラム可能な矩形波出力を生成できるため、第二の周波数を選択できます。K64F はこの第二クロック ソースの周波数を設定し、Z80 は I/O OUT コマンドでそれを選択できます。これにより Z80 上で動作するソフトウェアが固定の周波数ではありますが自身の周波数を変更する機会が与えられます。K64F Host API の拡張により、Z80 は K64F に任意の値への Z80 CPU 周波数設定をリクエストでき、これは TZFS や CP/M でユーザーが独自の周波数を選択するのに役立ちます。

CMOS Z84C0020 20MHz CPU での現在のテストでの観察結果:
  • tranZPUter はすべての機能において 1Hz〜20MHz の範囲で安定して動作する
  • tranZPUter v2.1 ボードで 24MHz @ 安定動作。メインボードへのアクセス時には周波数が 2MHz(またはシステム クロック)に低下し、メインボードへのアクセス完了後に高い周波数に戻る。メインボードの周波数を制御する MZ80A ビデオ モジュールが開発中であり、近々メインボードを 4MHz 以上でクロックすることが実現可能になる見込み。筆者は元の Sharp MZ80A を 4MHz にオーバークロックした経験があり、以前の経験と Sharp MZ80A 内のメインボード コンポーネントの分析から、オーバークロックは実現可能と思われる

トレーニングやデバッグの目的で CPU を低速化することも可能ですが、ホスト回路へのアクセスは常にホスト クロック周波数で動作します。

Z80 では、以下の表に周波数を切り替えるために読み書きすべき I/O ポートを示します。v1.1 ボードでの周波数切り替えには、K64F が二次周波数を生成するため K64F が必要です。v2.1 ボードでは外部オシレーターまたは K64F を使用するオプションがあります。

ポート 機能
0x62 Z80 CPU 周波数を第二ソース(K64F または外部オシレーターが生成する周波数)に切り替える
0x64 Z80 CPU 周波数をデフォルトのホスト ソースに切り替える。RESET 時のデフォルト

システム設定

CPLD は、基盤となるホストとの動作方法を変更するための内部設定レジスタを保持しています。以下の表にポートと各ビットの機能を示します。

システム設定レジスタ(0x6E - 10 進数 110)
ビット 方向 説明
2:0 R/W ハードウェア モデルの互換性を設定する。CPLD を設定して、設定されたモデルと互換性を持つようにホスト ハードウェアを再マッピングする
000 = MZ-80K
001 = MZ-80C
010 = MZ-1200
011 = MZ-80A
100 = MZ-700
101 = MZ-800
110 = MZ-80B
111 = MZ-2000
3 R/W tranZPUter SW-700 ボード用に予約済み。メインボード ビデオを有効または無効にする
4 R/W tranZPUter SW-700 ボード用に予約済み。メインボード ビデオを有効または無効にする
7 R/W リセット後も設定を保持する(=1)または リセット時にデフォルトに設定する(=0)

注: 実装済みの互換モードは以下の段落に記載されています。実装されていないモードを選択した場合はマッピングが行われず、ベースの MZ-700 ハードウェアに戻ります。

CPLD は、実行中のマシンの機能を示す読み取り専用の情報レジスタも保持しています。

システム情報レジスタ(0x6F - 10 進数 111)
ビット 方向 説明
2:0 R tranZPUter がインストールされている基盤となるホスト モデル(物理的なコンピューター ハードウェア)
000 = MZ-80K
001 = MZ-80C
010 = MZ-1200
011 = MZ-80A
100 = MZ-700
101 = MZ-800
110 = MZ-80B
111 = MZ-2000
3 R FPGA ビデオ モジュールがインストールされているか。0 = 未インストール、1 = インストール済み
7:5 R CPLD のバージョン番号。新しいバージョンの CPLD VHDL が異なる機能を提供する場合に Z80 コードで使用される

Sharp MZ-700 モード

tranZPUter の目標のひとつは、ホスト上で他のモデルのソフトウェアをできる限り動作させることでした。元のホストは MZ-80A であり、この機械で MZ-700/MZ-800/MZ-80B 用のソフトウェアを動作させることが目標でした。tranZPUter 自体は実際の Sharp MZ-700 や MZ-80B に接続でき、これらのマシンでテストされています。そのため設計目標がさらに拡張され、700 または 80B をホストとした tranZPUter でも MZ-80A ソフトウェアを動作させられるようになっています。

MZ-700 と MZ-80A の相違点:
Sharp MZ80A Sharp MZ-700
48K RAM。1000:CFFFH から連続したブロック。0000:0FFFH の ROM と C000:CFFFH の RAM をスワップするオプションあり 64K RAM。1000:CFFFH から連続したブロック。0000:0FFFH と D000:FFFFH はページ可能なブロック
キーボード - テンキー付きビジネスレイアウト。ハードウェアは MZ-700 と同一だが、キーを識別するストローブとデータラインが異なる キーボード - パーソナルレイアウト
ディスプレイ - 40 文字モノクロ。基本ハードウェアは MZ-700 と同じ カラー ディスプレイ - 前景色と背景色を提供する属性 RAM を追加。代替文字用の大型キャラクター ジェネレーター ROM を追加
CPU 周波数 - 2MHz CPU 周波数 3.58MHz
MZ-700 との互換性を持たせるために、利用可能な tranZPUter ハードウェアに応じて 2 つの異なるアプローチを採用しました。

tranZPUter v1.1

当初の設計では、K64F がリアルタイムで Z80 バス トランザクションを読み取り、必要に応じてインターセプトすることで、ハードウェアの差異を「擬似的に」再現することを意図していました。これはすべて高優先度割り込みを使用してレイテンシを最小化することで行われる予定でした。K64F はトリガーとなる IO またはメモリ トランザクションが発生すると割り込みを受け、実行状態に応じて必要な変更を行い、Z80 バス トランザクションをオーバーライドするかハードウェアを模倣するライトバックを行う予定でした。

たとえばトリガーには、Sharp MZ-700 が 64K RAM をページングするために使用する OUT コマンドがあります。これらはインターセプトされ、正しいメモリが MZ-700 に表示されるよう tranZPUter のメモリ モードに必要な変更が加えられます。

ARM アセンブラー コードにかなりの時間を費やした後、K64F を 168MHz にオーバークロックしても十分な速度が出ないことが明らかになりました。スレッドやタイマー割り込みなどの低優先度割り込みが高優先度割り込みに干渉し、レイテンシが影響を受けることで K64F が 2MHz Z80 トランザクションの 1 サイクルのチャンスを逃す事態が生じました。2MHz Z80 トランザクションの 1 サイクルをインターセプトできないのであれば、より高速なプロセッサやオーバークロックを試みる余地はありませんでした。

問題を検討した結果、v1.0 ハードウェアを更新して WAIT ステート ジェネレーターを追加することが解決策でした。Sharp の予約エリア 0xE0〜0xFF に IN/OUT コマンドが発行されると、Z80 の WAIT ラインがアサートされ、RESET または BUSRQ 信号によってのみクリアされます。WAIT ステートが有効になっていると上記の問題はなくなります。K64F が IO 割り込みの処理を開始すると直ちに BUSRQ をアサートして WAIT ステートを解除し、Z80 は現在の命令の終わりまで処理を続けます。これにより K64F がバス上の内容を解析し、トライステートの Z80 バスを解放する前に適切なハードウェア更新を行う時間が確保されます。実際にはオシロスコープで観察すると WAIT ステートが Z80 が動作するのに十分なほど長く有効になることはほとんどなく、ホストは WAIT 遅延を感じず、バスのトライステートによる最小限の遅延のみが生じます。

次の非互換性は CPU 周波数でした。MZ-80A の 2MHz に対して MZ-700 は 3.58MHz です。これを解決するために K64F が二次周波数を生成する CPU 周波数切り替えを追加しました。これにより MZ-700 モードで動作する際に K64F が CPU 周波数を 3.58MHz に設定できるようになりました。ホスト ボードは 2MHz で動作しているため、ハードウェア アクセス中は周波数が 2MHz に低下し、タイミングに敏感なゲームでは問題になる可能性がありますが、一般的には互換性があります。

MZ80A カラーボード v1.0 はディスプレイの非互換性を解決しますが、小さな注意点があります。カラーボードを設計した際、商業的に販売されたことのなかった元の Sharp MZ80A カラーアップグレードの属性マッピングに従うことを選択しました。これにより色の選択において MZ-700 との若干の非互換性が生じますが、一般的にはうまく機能します。必要であれば、はんだごてを数分使うことで修正できます。カラーボードは MZ-700 のキャラクター ジェネレーター マップも提供しているため、MZ-700 で見られるすべての文字を MZ-80A で表示できます。

最後の非互換性はキーボードの差異を解決することでした。1Z-013A BIOS のソースコードを持っているため、キースキャン マッピングを更新して MZ-80A キーボードで正しく動作させることが解決策でした。この解決策はうまく機能しますが、BIOS を使用しない MZ-700 ソフトウェアでは機能しない可能性があります。実行されるソフトウェアによっては、キースキャン マッピングが BIOS で行われるか、ソフトウェア自体がキーボード機能を組み込んでいます(例: S-BASIC)。分析の結果、独自のキーボード機能を組み込んでいるソフトウェアは BIOS と同じマッピング テーブル ロジックを使用していることがわかりました。筆者はこれを K64F で検出し、マッピング テーブルをオーバーレイする意図を持っており、これによりより多くの MZ-700 ソフトウェアが正しく機能するようになります。

すべての解決策を組み合わせることで、TZFS を使用して MZ-700 モードに入るコマンドを実行できます。このコマンドは 1Z-013A BIOS をロードし、CPU 周波数を 3.58MHz に設定し、正しい割り込みドライバーを K64F にインストールして Z80 トランザクションをインターセプトして変換します。これにより、ホストはあらゆる点で Sharp MZ-700 のように動作するようになります。S-BASIC をロードすると「BASIC INTERPRETER 1Z-013B」のサインオンが表示され、36439 バイト残り、準備完了プロンプトが現れます。一見それほど印象的でないように思えますが、S-BASIC がただ動作するだけのためにさまざまなメモリ ブロックをページイン/アウトしていることを考えると、これは大きな前進です。

tranZPUter v2.1

tranZPUter バージョン 2.1 の設計では、個別のハードワイヤード ロジックの代わりに CPLD(複合論理デバイス)を使用しています。これにより、設計の進化とバグの修正においてハードウェア レベルの互換性をロジックで追加する大きな余地が生まれます。CPLD を使用することで、メモリ管理とキーボード リマッピングの両方がハードウェア内で行われるようになり、K64F サービスが不要になります。これには多くの利点があります。たとえば、K64F プロセッサなしで ROM ファイリング システム(v1.0 または 1.1)ボードと組み合わせた tranZPUter v2.1 を使用することで、Sharp MZ-80A を Sharp MZ-700 として動作させることができます。K64F が存在する場合は、複雑な割り込み処理が不要になります。

キーボード マッピング

MZ-700 のキーボード レイアウトを MZ-80A にコピーすることでマッピングが行われています。

MZ-80A キー MZ-700 キー   MZ-80A キー MZ-700 キー
BREAK/CTRL GRAPH   GRPH ALPHA
INST/DEL CTRL   CLR/HOME BREAK
カーソル 左/右 無印キー   カーソル 上/下 下矢印/ポンド記号
テンキー 7 INST/CLR   テンキー 8 カーソル 上
テンキー 9 DEL/HOME   テンキー 4 カーソル 左
テンキー 5 機能なし   テンキー 6 カーソル 右
テンキー 1 F1 キー   テンキー 2 カーソル 下
テンキー 3 F5 キー   テンキー 0 F2 キー
テンキー 00 F3 キー   テンキー . F4 キー
テンキー + 機能なし   テンキー - 機能なし

その他すべてのキーはマシン間で同じです。


Sharp MZ-80B モード

MZ-700 モードと同様に、tranZPUter の設計目標は MZ-80A ホストまたは MZ-700 ホスト上で Sharp MZ-80B ソフトウェアを動作させることです。

MZ-80B は MZ-80A/MZ-700 と多くの類似点を持っていますが、キーボードが異なり、IO はメモリ マップではなく IO マップされています。64K メイン メモリもバンク化されています。MZ-80A/MZ-80B/MZ-700 は共通のキャラクター ベース ビデオ ハードウェアと共通のフロッピー ディスク コントローラを共有しており、これがディスク ベースのソフトウェアの動作を助けます。

MZ-80B を研究した結果、IO トランザクションをインターセプトし、ウェイト ステート ジェネレーターの助けを借りてメモリ マップド トランザクションに変換することを意図しています。メモリは MZ-700 と同様に 512K Flash RAM デコーダのメモリ マッピングによって対応されます。キャラクター ベース ビデオはすべてのマシンで 0xD000 で共通なので、ほとんどの MZ-80B ソフトウェアを MZ-80A/MZ-700 で動作させることができるはずです。グラフィックスは MZ80A カラーボードの近日アップデートで可能になりますが、まずは小さなステップから——IPL をブートさせてカセット BASIC をロードすることから始めましょう…

tranZPUter SW ボードのバージョン 2.1 が完全に組み立てられて動作しており、ハードウェア レベルの MZ-80B 互換モードの作成に多くの時間を費やしました。CPLD のリソース不足(512 マクロセル デバイスでも)による機能要件から、このモードを延期することにしました。要件を CPLD と K64F に分割するか、開発中の tranZPUter v2.0 を待つかのどちらかです。tranZPUter v2.0 ボードは 115K LE FPGA と 512 マクロセル CPLD を搭載しており、I/O プロセッサとして ZPU を使用するという元のコンセプトに戻り、互換モードなどの要件をハードウェアで実現します。現在作業中です!

ハードウェア記述言語

tranZPUter SW は、個別ロジックを置き換えて設計の進化とバグ修正の柔軟性を高めるために、CPLD(複合プログラマブル ロジック デバイス)を広く活用しています。このデバイスは回路を形成するために相互接続する必要があるハードウェア ロジック要素の配列です。デバイスを設定するにはビットマップが必要で、CPLD にアップロードすることでデバイスが設定され、必要な回路が形成されます。

ビットマップを作成する方法はさまざまありますが、通常はソフトウェアのソースコードに似たハードウェア記述言語が使用されます。筆者は大学で学んだ ADA をベースとした VHDL を使用することを選択しました。Verilog と System Verilog も使用しており、これらの言語も優れているとわかっています(実際に Sharp MZ エミュレーターで使用しています)が、このプロジェクトでは VHDL が選択した HDL です。

CPLD である 512 マクロセル MAX 7000A デバイスは、5V 耐性という理由で選ばれました。この特性はより最近のデバイスには見られず、Sharp MZ-80A の信号を読み取るための追加の電圧変換回路が必要になってしまいます。

複合ロジック デバイス - MAX 7000A

CPLD は、元の tranZPUter SW にあった個別ロジックと Flash RAM デコーダを置き換えます。Sharp MZ-80A からの Z80 信号と tranZPUter Z80 アップグレード ロジックに直接インターフェースします。その目的は以下を提供することです:

  • Z80 メモリ マップ デコーディング
  • Z80 バス制御
  • WAIT ステート生成
  • ハードウェア リマッピング
  • 電圧変換

CPLD 設定を形成するソース ファイルは以下のとおりです:

モジュール 説明
tranZPUterSW_TopLevel.vhd トップ レベルの設計ファイル。回路のルート回路図に相当します。CPLD に入力されるメイン コンポーネント信号とその使用方法をレイアウトします
tranZPUterSW_pkg.vhd このファイルには関数、定数宣言、パラメーターが含まれており、コンパイルされるすべての VHDL ファイル/モジュールで使用されます
tranZPUterSW.vhd メイン設計ファイル。CPLD 内のターゲット回路にゲートとワイヤの相互接続を形成するすべてのロジックが含まれています
build/tranZPUterSW.qpf Quartus Prime がプロジェクトとすべてのファイルを宣言するために使用するプロジェクト ファイル
build/tranZPUterSW.qsf 定義と割り当てファイル。コンパイル、フィッティング、使用するピンとその名前、パラメーターなどすべてのパラメーターを設定します。このファイルは Quartus Prime によって作成されますが、Quartus Prime GUI よりも手動で変更する方が速い場合が多いです
build/tranZPUterSW_constraints.sdc タイミング制約ファイル。Time Quest タイミング アナライザーによって作成・使用され、コンパイラーとフィッターが CPLD 内でコンポーネントを配置する場所を決定する際にも使用されます

CPLD ビットストリームのビルド

VHDLコードをビットストリームにビルド・コンパイルしてCPLDにアップロードするには、AlteraのQuartus Prime v13.0.1を使用する必要があります。これは優れたソフトウェアであり、ウェブエディションは無料でダウンロード・使用できます。最新のAltera製品を除くほぼすべての製品の開発に適しています。

Quartus PrimeをWindows/Linuxワークステーションにインストールするか、以下で詳述するようにDockerイメージを作成することができます。様々なLinuxディストリビューションへの複数回のインストール経験から、Dockerを使用することがこの複雑なパッケージを利用する最も簡単な方法です。

コンパイル:

   1. Quartus Prime v13.0.1を起動します(ローカルインストールまたはDockerイメージのいずれか)。
   2. 'File->Open Project' に移動し、リポジトリのクローンが保存されているディレクトリを検索して <Clone Path>/tranZPUter/CPLD/SW/build/tranZPUterSW.qpf ファイルを選択します。これによりCPLD tranZPUterSWプロジェクトが開きます。
   3. 'Processing->Start' コンパイルを選択します — 警告メッセージは無視して構いません。
   4. 完了すると、<Clone Path>/tranZPUter/CPLD/SW/build/output_files ディレクトリ内に tranZPUterSW.sof という名前のビットストリームが生成されます。

プログラミング:

   1. ビットストリームをCPLDにアップロードするには、tranZPUterSWボード上の10ピン JTAG IDCコネクタにUSBポート経由でAltera USB Blasterを接続する必要があります。
   2. Quartus Primeで 'Tools->Programmer' に移動すると、新しいProgrammerウィンドウが起動します。
   3. Programmerウィンドウで 'Hardware Setup' をクリックし、USBアダプターを選択して 'Close' をクリックします。
   4. 'Auto Detect' をクリックすると、EPM7512AET144というデバイスが1つ検出されるはずです。
   5. EPM7512AET144デバイスを右クリックし、'Add File' を選択して <Clone Path>/tranZPUter/CPLD/SW/build/output_files/tranZPUterSW.sof にあるsofファイルを選択し、'Open' をクリックします。
   6. EPM7512AET144に対して 'Program/Configure' と 'Verify' のチェックボックスを選択します。
   7. 'Start' をクリックすると、コンパイルされたビットストリームがCPLDにプログラムされます。

ソフトウェア

既存のZPUソフトウェアであるZPUTAとzOSは、この設計で使用するためにK64Fプラットフォームに移植されています。zOSはK64Fプロセッサ上の統合OSプラットフォームとなり、I/Oプロセッサ固有の操作はOSのスレッドおよび外部アプリケーション内で処理されます。

zOS

オペレーティングシステムの詳細については、zOSのセクションを参照してください。標準機能・ツールに加え、以下のアプリケーションが追加されています:

コマンド 説明
tzload tranZPUterメモリへのファイルのアップロード・ダウンロード、ビデオフレームのキャプチャ、新しいフレームの設定。
TZLOAD v1.1

Commands:-
  -h | --help              This help text.
  -d | --download <file>   File into which memory contents from the tranZPUter are stored.
  -u | --upload   <file>   File whose contents are uploaded into the tranZPUter memory.
  -U | --uploadset <file>:<addr>,...,<file>:<addr>
                           Upload a set of files at the specified locations. --mainboard specifies mainboard is target, default is tranZPUter.
  -V | --video             The specified input file is uploaded into the video frame buffer or the specified output file is filled with the video frame buffer.

Options:-
  -a | --addr              Memory address to read/write.
  -l | --size              Size of memory block to read. This option is only used when reading tranZPUter memory, for writing, the file size is used.
  -s | --swap              Read tranZPUter memory and store in <infile> then write out <outfile> to the same memory location.
  -f | --fpga              Operations will take place in the FPGA memory. Default without this flag is to target the tranZPUter memory.
  -m | --mainboard         Operations will take place on the MZ80A mainboard. Default without this flag is to target the tranZPUter memory.
  -M | --mempage           Operations on mainboard will page in all DRAM banks prior to operation. ie. MZ-700 will page in lower and upper DRAM banks so 0000:FFFF = DRAM
  -z | --mzf               File operations are to process the file as an MZF format file, --addr and --size will override the MZF header values if needed.
  -v | --verbose           Output more messages.

Examples:
  tzload --download monitor.rom -a 0x000000      # Load the file monitor.rom into the tranZPUter memory at address 0x000000.
tzdump tranZPUterメモリの内容を画面にダンプします。
TZDUMP v1.1

Commands:-
  -h | --help              This help text.
  -a | --start             Start address.

Options:-
  -e | --end               End address (alternatively use --size).
  -s | --size              Size of memory block to dump (alternatively use --end).
  -f | --fpga              Operations will take place in the FPGA memory. Default without this flag is to target the tranZPUter memory.
  -m | --mainboard         Operations will take place on the MZ80A mainboard. Default without this flag is to target the tranZPUter memory.
  -v | --verbose           Output more messages.

Examples:
  tzdump -a 0x000000 -s 0x200   # Dump tranZPUter memory from 0x000000 to 0x000200.
tzclear tranZPUterメモリをクリアします。
TZCLEAR v1.1

Commands:-
  -h | --help              This help text.
  -a | --start             Start address.

Options:-
  -e | --end               End address (alternatively use --size).
  -s | --size              Size of memory block to clear (alternatively use --end).
  -b | --byte              Byte value to place into each cleared memory location, defaults to 0x00.
  -f | --fpga              Operations will take place in the FPGA memory. Default without this flag is to target the tranZPUter memory.
  -m | --mainboard         Operations will take place on the MZ80A mainboard. Default without this flag is to target the tranZPUter memory.
  -v | --verbose           Output more messages.

Examples:
  tzclear -a 0x000000 -s 0x200 -b 0xAA  # Clears memory locations in the tranZPUter memory from 0x000000 to 0x000200 using value 0xAA.
tzclk 代替Z80 CPU周波数を設定します。
TZCLK v1.0

Commands:-
  -h | --help              This help text.
  -f | --freq              Desired CPU clock frequency.

Options:-
  -e | --enable            Enable the secondary CPU clock.
  -d | --disable           Disable the secondary CPU clock.
  -v | --verbose           Output more messages.

Examples:
  tzclk --freq 4000000 --enable  # Set the secondary CPU clock frequency to 4MHz and enable its use on the tranZPUter board.
tzreset tranZPUterをリセットします。
TZRESET v1.0

Commands:-
  -h | --help              This help text.
  -r | --reset             Perform a hardware reset.
  -l | --load              Reload the default ROMS.
  -m | --memorymode <val>  Set the memory mode.

Options:-
  -v | --verbose           Output more messages.

Examples:
  tzreset -r        # Resets the Z80 and associated tranZPUter logic.
tzio Z80 I/Oポートの読み書きツール。
TZIO v1.1

Commands:-
  -h | --help              This help text.
  -o | --out <port>        Output to I/O address.
  -i | --in <port>         Input from I/O address.

Options:-
  -b | --byte              Byte value to send to the I/O port in the --out command, defaults to 0x00.
  -m | --mainboard         Operations will take place on the MZ80A mainboard. Default without this flag is to target the tranZPUter I/O domain.
  -v | --verbose           Output more messages.

Examples:
  tzio --out 0xf8 --byte 0x10    # Setup the FPGA Video mode at address 0xf8.
tzflupd K64F FlashRAM更新ツール。実行中のzOS/ZPUTAカーネルを新しいバージョンに更新します。
TZFLUPD v1.1

Commands:-
  -h | --help              This help text.
  -f | --file              Binary file to upload and flash into K64F.

Options:-
  -v | --verbose           Output more messages.

Examples:
  tzflupd -f zOS_22012021_001.bin --verbose   # Upload and program the zOS_22012021_001.bin file into the K64F flash memory.
tzmtest tranZPUterメモリテストプログラム。K64FはtranZPUter静的RAMおよびFPGA BRAMをテストするために複数の方法を繰り返します。
TZMTEST v1.0

Commands:-
  -h | --help              This help text.
  -a | --start             Start address.

Options:-
  -e | --end               End address (alternatively use --size).
  -s | --size              Size of memory block to test (alternatively use --end).
  -f | --fpga              Operations will take place in the FPGA memory. Default without this flag is to target the tranZPUter memory.
  -i | --iter              Number of test iterations, default = 1.
  -t | --test              Specify test as a bit value, bit 0 = R/W inc ascending test, 1 = R/W inc walking test, 2 = W ascending then R,
                           bit 3 = W walking then R, bit 4 = echo and stick bit test.
  -v | --verbose           Output more messages.

Examples:
  tzmtest -a 0x000000 -s 0x20000   # Test 128K tranZPUter memory from 0x000000 to 0x020000.

*T*ran*Z*puter *F*iling *S*ystem

TranZputer ファイリングシステムは、MZ-80A RomディスクアップグレードボードのRomファイリングシステムを移植したものです。同じソフトウェア機能の多くを再利用しているため、同様のサービスを提供しますが、異なるメモリモデルを使用する点が異なります。SDカードに保存されたファイルを操作するメソッドを提供し、拡張コマンドラインインターフェイスであるTZFSモニターを提供することを目的としています。コマンドセットには、SDファイルの操作・バックアップと、MZ700/800コンピューターに搭載されていた多くのコマンドが含まれます。

SDカードとROMはK64F I/Oプロセッサによって管理されます。サービスリクエストAPIが記述されており、共通の共有メモリブロック(640バイト)を物理的なI/Oリクエストと組み合わせて使用することで、Z80とK64F間でコマンドとデータを受け渡します。例えば、Z80がSDファイルを読み込みたい場合、メモリブロック内にファイルオープンリクエストを作成し、物理的なI/O操作を行うと、K64Fが割り込みで検出し、ファイルを開いて共有メモリ内で1セクターずつZ80にデータを返します。

RFSではソフトウェアを多くのROMページに分割してページング経由でアクセスする必要がありましたが、TZFSでも同様です。ただし、ページが大きいため必要なページ数は少なくなります。TranZputer ファイリングシステムを構成するZ80ソフトウェアは、リポジトリの <software> ディレクトリ内にあります。

TranZputer ファイリングシステムを構成するファイルは以下の通りです:

モジュール ターゲット位置 サイズ バンク 説明
tzfs.asm 0xE800:0xFFFF 6K 0 TranZputer ファイリングシステムの主要部分およびMZ700/MZ800モニターツール。
tzfs_bank2.asm 0xF000:0xFFFF 4K 1 メッセージ表示ルーティン、静的メッセージ、ASCII変換およびヘルプ画面。
tzfs_bank3.asm 0xF000:0xFFFF 4K 2 未使用。
tzfs_bank4.asm 0xF000:0xFFFF 4K 3 未使用。
monitor_SA1510.asm 0x00000:0x01000 4K 0 40文字ディスプレイ用オリジナルSA1510モニター。tranZPUterメモリの64Kバンク0にロードされます。
monitor_80c_SA1510.asm 0x00000:0x01000 4K 0 80文字ディスプレイ向けにパッチを当てたオリジナルSA1510モニター。tranZPUterメモリの64Kバンク0にオンデマンドでロードされます。
monitor_1Z-013A.asm 0x00000:0x01000 4K 0 Sharp MZ-700向けオリジナル1Z-013AモニターをMZ-80Aキーボードおよびアトリビュートカラーに対応するようパッチ済み。
monitor_80c_1Z-013A.asm 0x00000:0x01000 4K 0 Sharp MZ-700向けオリジナル1Z-013AモニターをMZ-80Aキーボード、アトリビュートカラー、80カラムモードに対応するようパッチ済み。
MZ80B_IPL.asm 0x00000:0x01000 4K 0 MZ-80BプログラムをブートストラップするためのオリジナルSharp MZ-80B IPLファームウェア。

さらに、TZFSソフトウェアのビルドを支援するいくつかのシェルスクリプトがあります:

スクリプト 説明
assemble_tzfs.sh TranZputer ファイリングシステムのバイナリイメージをビルドするbashスクリプト。
assemble_roms.sh TZFSが必要とするSA-1510モニターROMなど、標準MZ80A ROMをすべてビルドするbashスクリプト。
flashmmcfg tranZPUter SW FlashRAMデコーダー用のデコードマップファイルを生成するバイナリプログラム。
glass-0.5.1.jar Glass 0.5のバグ修正版。0.5はアドレス0xFFFFへの書き込みを拒否して1バイト不足する問題があったため、このバグ修正版が作成されました。

CP/M

CP/M v2.23はRFSプロジェクトからtranZPUterに移植され、RFS下での48Kに対して使用可能な全64Kメモリを活用できるよう拡張されました。カスタムBIOSはtranZPUterメモリを活用し、ロジックを別のメモリバンクに再配置することでCP/M TPA空間を節約します。

CBIOSおよびCP/Mオペレーティングシステムを構成するファイルは以下の通りです:

モジュール ターゲット位置 サイズ バンク 説明
cbios.asm 0xF000:0xFFFF 4K 0 CP/M CBIOSスタブ、割り込みサービスルーティン(RTC、キーボード等)およびCP/Mディスク定義テーブル・バッファ等。
cbiosII.asm 0x0000:0xCFFF 48K 1 CP/M CBIOS、I/OプロセッササービスAPI、SDカードコントローラー機能、フロッピーディスクコントローラー機能、画面およびANSIターミナル機能、ユーティリティ、オーディオ機能。
  0xE800:0xEFFF 2K 1 CBIOSIIの追加スペース(現在未使用)。
cpm22.asm 0xDA00:0xEFFF 5K 0 CCP(コンソールコマンドプロセッサー)およびBDOS(基本ディスクオペレーティングシステム)からなるCP/Mオペレーティングシステム。これらのコンポーネントはCP/Mサービスを必要としないアプリケーションによって上書きされる場合があり、アプリケーション終了時に再ロードされます。
cpm22-bios.asm     0 カスタムBIOSは自己完結型であり、このスタブはコードを含まなくなりました。

さらに、CP/Mソフトウェアのビルドを支援するいくつかのシェルスクリプトがあります:

スクリプト 説明
assemble_cpm.sh CPMバイナリをTZFS経由でロード可能なMZF形式アプリケーションとしてビルドするシェルスクリプト。
make_cpmdisks.sh FAT32フォーマットのSDカード上でバイナリファイルとして使用するCPMディスクセットをビルドするbashスクリプト。フロッピーディスクエミュレーターや物理メディアへのコピー用のCPC拡張ディスク形式も作成されます。
glass-0.5.1.jar Glass 0.5のバグ修正版。0.5はアドレス0xFFFFへの書き込みを拒否して1バイト不足する問題があったため、このバグ修正版が作成されました。

詳細については、CP/Mのセクションを参照してください。



TZFSモニター

Sharp MZ80Aの電源投入時、モニターと呼ばれるコマンドラインインターフェイスがユーザーに提示され、テープのブートストラップや事前ロードされたソフトウェアの手動実行などの基本操作が可能になります。TZFSモニターはこの基本モニターの拡張であり、tranZPUter SWカードをメインボードのZ80ソケットに挿入した後、モニタープロンプト '\*' で以下のコマンドを入力するとTZFSが起動します:

JE800<cr>

コンピューターのスタートアップを直接TZFSに自動化することも可能です。そのためには、SDカードのルートディレクトリに次の名前の空のファイルを作成します:

'TZFSBOOT.FLG'

K64Fプロセッサの起動時にzOSがブートし、zOSがこのファイルを検出すると、Sharp MZ80A上でTZFSが自動的に起動するために必要なタスクを実行します。

TZFSが起動すると、通常のSA-1510モニターサインオンバナーが表示され、すべてが正常であれば「+ TZFS」という接尾辞が付加されます。通常の '\*' プロンプトが表示され、オリジナルのSA-1510コマンドに加えて拡張コマンドセットを発行できます。その一部はMZ700/MZ800シリーズで見られたものであり、その他はカスタムのものです。完全なコマンドセットを以下の表に示します:

コマンド パラメーター 説明
4 なし 40/80カラムディスプレイアップグレードが追加されている場合、40文字モードに切り替えます。
8 なし 40/80カラムディスプレイアップグレードが追加されている場合、80文字モードに切り替えます。
80B なし Sharp MZ-80B互換モードに切り替えます。< /s>
700 なし Sharp MZ-700 40カラムBIOSおよびモードに切り替えます。
7008 なし Sharp MZ-700 80カラムBIOSおよびモードに切り替えます。
B なし キー入力ビープ音を有効/無効にします。
BASIC なし SDカード上の最初のBASICインタープリターを見つけ、ロードして実行します。
C [<8ビット値>] 0x1200からRAM先頭までのメモリを0x00または指定した値で初期化します。
CD [<ディレクトリ>] 指定したSDカードのディレクトリ <directory> に切り替えます。ディレクトリが指定されていない場合は、デフォルトの \MZF にリセットします。ディレクトリを変更後、I/Oプロセッサがディレクトリの内容をキャッシュするため、DIRコマンドの出力に数秒かかる場合があります。
CPM なし SDカード上のCP/M 2.23を見つけ、ロードして実行します。
D <アドレス>[<アドレス2>] <address> から <address2>(または20行分)のメモリを16進数およびASCIIでダンプします。画面がいっぱいになると、キーが押されるまで出力が一時停止します。

アドレス値なしの後続の ‘D’ コマンドは最後に表示されたアドレスから継続します。

ページング中の認識キー:
‘D’ - ページダウン、’U’ - ページアップ、’X’ - 終了、その他のキーは次のデータ画面を表示します。
DIR <ワイルドカード> SDカードに保存されたファイルの一覧を表示します。各ファイルタイトルの前に、ファイルを識別するための16進数が付きます。
結果をフィルタリングするためのワイルドカードパターンを指定できます(例: ‘*BASIC*’ はBASICを含む名前のファイルをすべて表示)。
出力の形式はHH<セパレーター>ファイル名で、<セパレーター>はファイルの種類を示します:
’.’ = マシンコード、’-‘ = BASIC MZ80K/C/A、’<-‘ = BASIC MZ-700/800、’+’ = その他。
EC <名前> または
<ファイル番号>
SDカードからファイルを削除します。<name> または <file number> を持つファイルを検索し、見つかった場合は削除します。
EX なし TZFSを終了してマシンを元の状態に戻します。I/Oプロセッサは無効化されます。
F [<ドライブ番号>] 指定したフロッピーディスクからブートします。ディスク番号が指定されていない場合は入力が求められます。
FREQ <KHz単位の周波数> CPU周波数を指定した値に変更します(0でデフォルト)。任意の周波数が可能で、CPUが制限要因となります。搭載の20MHz Z80 CPUでは24MHzまで検証済みです。
H なし これらのコマンドすべてのヘルプ画面を表示します。
J <アドレス> <address> の場所にジャンプ(実行を開始)します。
L | LT なし テープからメモリにファイルをロードして実行します。
LTNX なし テープからメモリにファイルをロードします(実行しません)。
LC <名前> または
<ファイル番号>[,<ターゲットモデル>]
SDカードからメモリにファイルをロードします。<name> または <file number> を持つファイルを検索し、見つかった場合はロードして実行します。
オプション引数 <target model> を使用すると、ロードされたソフトウェアが実行されるターゲットを設定できます。この引数は、MZ-800などのマシンでデフォルトがMZ-800として実行されるが、このフラグを指定してMZ-700互換モードを強制したい場合などを対象としています。フラグはソフトウェアをオリジナルのマシンメモリにターゲットして実行するためにも使用されます。現在のフラグ:
8 - MZ-800ホスト上でMZ-800モードを強制。
7 - MZ-800ホスト上でMZ-700モードを強制。
O - ホストメモリにロードしてオリジナルとして実行。
LCNX <名前> または
<ファイル番号>[,<ターゲットモデル>]
SDカードからメモリにファイルをロードします。<name> または <file number> を持つファイルを検索し、見つかった場合はロードしますが実行しません。
<target model> はLC同様です。
M <アドレス> <address> から始まるメモリロケーションを編集・変更します。
P なし 接続されたプリンターのテストを実行します。
R なし メインメモリのメモリテストを実行します。
S <開始アドレス> <終了アドレス> <実行アドレス> メモリのブロックをテープに保存します。ファイル名の入力が求められます。

例: S120020001203 - 0x1200から0x2000まで保存し、実行アドレスを0x1203に設定します。
SC <開始アドレス> <終了アドレス> <実行アドレス> メモリのブロックをSDカードにMZFファイルとして保存します。ファイル名の入力が求められ、SDカード上のファイル名として使用されます。
SD2T <名前> または
<ファイル番号>
SDカードからテープにファイルをコピーします。<name> または <file number> を持つファイルを検索し、見つかった場合はCMTのテープにコピーします。
T なし 8253タイマーをテストします。
T2SD[B] なし テープからSDカードにファイルをコピーします。テープからプログラムをロードし、SDカードの空き領域に書き込みます。コマンド末尾にBを追加するとバッチモードが起動し、1枚以上のカセットのすべてのプログラムを変換するループに入ります。BREAKキーが押されるかエラーが発生した場合にのみ停止します。
V なし テープに書き込んだファイルをメモリに保存されたオリジナルデータで検証します。
VBORDER <色> VGAボーダーの色を設定します。
0 = 黒
1 = 緑
2 = 青
3 = シアン
4 = 赤
5 = 黄
6 = マゼンタ
7 = 白。
VMODE <ビデオモード> 拡張FPGAビデオモジュールを使用してビデオモードを選択します。FPGAは選択したマシンのビデオハードウェアをエミュレートするよう再構成されます。
0 = MZ-80K
1 = MZ-80C
2 = MZ-1200
3 = MZ-80A
4 = MZ-700
5 = MZ-800
6 = MZ-80B
7 = MZ-2000
OFF = オリジナルビデオハードウェアに戻す。
VGA <VGAモード> VGA互換の出力モードを選択します。
0 = オリジナルSharpモード
1 = 640x480 @ 60Hz
2 = 1024x768 @ 60Hz
3 = 800x600 @ 60Hz。

40/80カラムカードが取り付けられている場合、’4’ を入力すると40カラム表示に、’8’ を入力すると80カラム表示に切り替わります。ディレクトリ一覧コマンドでは、80カラムモード時に4カラムで出力が表示されます。


Sharp BASIC SA-5510

RomファイリングシステムのさらなるFurther開発中、SA-5510 BASICインタープリター(MZ-80Aの標準)をリバースアセンブルして、RFS下でのSDカードと互換性を持たせました。このインタープリターはtranZPUterが動作するSharp MZ-80A/MZ-700/800マシンと互換性があるため、TZFSに移植することにしました。

インタープリターのバイト位置は、既知のアドレスにある関数を期待して書かれたプログラムがあるため重要です。したがって、リバースアセンブルは正確でなければならず、変更・拡張はメインプログラムの外部で行う必要がありました。幸いなことに、インタープリター内にはTZFSには不要な自己複製ブロックがあり、この領域を追加機能のために使用しました。

RFSではLOAD/SAVEコマンドにドライブ仕様を埋め込むことができましたが、TZFSはより強力であり、SDカードのディレクトリやワイルドカードを指定するための個別のコマンドが必要でした。さらにTZFSにはCPUクロックなどのいくつかの便利な機能があり、さらなるコマンドの追加が必要でした。

以下の表に、コマンドの拡張と簡単な説明を示します。
コマンド パラメーター 説明
LOAD ”[<ファイル名>]” 現在のSDカードディレクトリまたはCMT(カセット)内で “<filename>” を検索します。<filename> が指定されていない場合、次の順次ファイルをロードします。
SAVE ”[<ファイル名>]” メモリ内のプログラムを “<filename>” という名前で現在のSDカードディレクトリまたはCMT(カセット)に保存します。
<filename> が指定されていない場合、0から始まる連番 <number> を持つ ‘DEFAULT<number>’ という名前で保存します。
DIR ”[<ワイルドカード>]” 指定した <wildcard> フィルターを適用して現在のSDカードディレクトリをTZFS形式で一覧表示します(例: DIR M* はMで始まるすべてのプログラムを一覧表示)。
CD [<パス>] アクティブなSDディレクトリを <path> に変更します。<path> が指定されていない場合はルートディレクトリに変更します。パスがCの場合(例: CDC)はCMT(カセット)に切り替え、その他の引数はSDカードに切り替えます。
FREQ [<周波数>] CPUを指定した周波数 <freq> に変更します。<freq> はKHz単位で指定します(例: 10000 = 10MHz)。<freq> が指定されていない場合はオリジナルのメインボード周波数に戻ります。

内蔵カセットドライブでLOADまたはSAVEするには、以下のコマンドを使用します:
    CDC
    LOAD
または
    CDC
    SAVE “EXAMPLE”

新しいバージョンのBASIC SA-5510は「BASIC SA-5510-TZ」という名前になっています。 </div>

注: ランダムファイルの読み書きBASIC操作は、ロジックを完全に理解していないためまだ完全には実装されていません。分析できる適切なプログラムが入手できたら、CMT仕様に従って動作するようTZFSを改修する予定です。


Microsoft BASIC

Sharpマシンには複数のBASICバージョンがカセットまたはフロッピーで使用可能ですが、互いの互換性は限られています(例: MZ80A SA5510はMZ-700 S-BASICとは異なります)。各マシンには、ディスクドライブ用のSA-6510やサードパーティ版のOM-500など複数のバリアントがある場合があります。これらのBASICインタープリターのほとんどは、Sharp MZ80K/A/700での使用を目的としている限りTZFS上で正常に動作しますが、CMT(カセット)またはフロッピーストレージに限定されます。

既存のBASICインタープリターの欠点の一つは、TZFS拡張で更新するためのソースコードの入手可能性です。バイナリをリバースアセンブルするかバイナリを直接編集しない限り、TZFSコマンドを追加することはできません。RFSの開発中にも同じ問題に直面し、より複雑なtranZPUterハードウェアのデバッグを支援するBASICのバージョンが必要だったため、ソースコードが自由に入手可能なMicrosoftのBASICバージョン、すなわちNASCOM v4.7b版のMicrosoft BASICを使用することにしました。このBASICバージョンはレトロの世界でかなり多くのフォロワーを持ち、その結果として多数の既存BASICプログラムがあります。また、追加コマンドで拡張することも比較的簡単です。

インターネット上には2つのバージョンのNASCOM 4.7bソースコードが存在します。オリジナルと、LOAD/SAVE/SCREENなどのハードウェア依存コマンドをいくつか取り除いた代わりにGrant Searleがそのmulticompプロジェクト向けにバイナリ/16進変数を追加した版です。私は両方のバージョンを参考に3番目のバージョンを作成し、欠けているテープコマンドを含む利用可能なコマンドの記述と拡張を行いました。

プロジェクトの発展に伴い、Microsoft BASICはさまざまな構成をサポートする必要が生じました。RFSでは5つ、TZFSでは4つです。RFSバージョンを除き、TZFSを実行するtranZPUterでは以下が利用可能です:
  • MS-BASIC(MZ-80A) - カセットからブート可能なオリジナル48Kハードウェア。
  • MS-BASIC(MZ-700) - カセットからブート可能なオリジナル64Kハードウェア。
  • MS-BASIC(TZFS40) - ビデオアップグレードハードウェアなしのTZFSアップグレード。
  • MS-BASIC(TZFS80) - 80カラムディスプレイを提供するビデオモジュールFPGAアップグレードを搭載したTZFSアップグレード。

各バージョンはTZFSドライブに表示され、ハードウェアと用途に応じて使用する必要があります。標準コマンドと機能については、オリジナルのNASCOM Basicマニュアルを参照してください。以下の表は、MZ-80A Romディスクハードウェアにより適合させるために追加した拡張機能の概要を示しています。

コマンド パラメーター 説明
CLOAD ”<ファイル名>” SDカードからカセットイメージ(トークン化されたBASICプログラム)をロードします。
CSAVE ”<ファイル名>” 現在のBASICプログラムをSDカードにトークン化カセットイメージ形式で保存します。
LOAD ”<ファイル名>” SDカードから標準ASCIIテキスト形式のBASICプログラムをロードします。
SAVE ”<ファイル名>” 現在のBASICプログラムをSDカードにASCIIテキスト形式で保存します。
DIR <ワイルドカード> 指定したワイルドカードを適用して現在のディレクトリを一覧表示します。
CD <FAT32パス> 作業ディレクトリを指定したパスに変更します。以降のすべてのコマンドはこのディレクトリを使用します。起動時、CLOAD/CSAVEのデフォルトは0:\CAS、LOAD/SAVEのデフォルトは0:\BASですが、このコマンドで指定したディレクトリに統一されます。デフォルトに戻すにはパスなしでCDと入力します。
FREQ <KHz単位の周波数> CPUを指定したKHz周波数に設定します。0を指定するとデフォルトのメインボード周波数に切り替わります。100KHzから24MHzの範囲でテスト済みで、使用するZ80に依存します。Z80が対応していればオーバークロックも可能です。
ANSITERM 0 = オフ、1 = オン 内蔵ANSIターミナルプロセッサを無効または有効(デフォルト)にします。これはANSIエスケープシーケンスを認識して画面操作に変換するものです。専用の画面コマンドに依存しないポータブルなBASICプログラムを使用できるようになります。参考: Star Trek V2 BASICプログラムはANSIエスケープシーケンスを使用しています。
NASCOMカセットイメージ変換ツール
NASCOMのBASICプログラムはカセットイメージファイルとしてインターネット上で見つかります。これらのファイルには、埋め込まれたトークン化BASICコードとともにテープフォーマットデータがすべて含まれています。これらのファイルを使用できるようにするため、テープフォーマットデータを取り除きBASICコードを再構築する変換プログラムを作成しました。さらに、このBASICバージョンは新しいコマンドをサポートするよう拡張されているためトークン値が変更されており、このプログラムは変換中にトークン値を自動的に更新します。

変換ツールはコマンドラインで実行するよう設計されており、その概要は以下の通りです:

NASCONV v1.0

必須オプション:-
  -i | --image <ファイル>      変換するイメージ ファイル
  -o | --output <ファイル>     変換されたデータの出力先ファイル

オプション:-
  -l | --loadaddr <アドレス>   MZ80A BASIC の開始アドレス。NASCOM アドレスを使用して正しい MZ80A アドレスを設定する
  -n | --nasaddr <アドレス>    元の NASCOM BASIC の開始アドレス
  -h | --help              このヘルプを表示する
  -v | --verbose           より多くのメッセージを出力する

使用例:
  nasconv --image 3dnc.cas --output 3dnc.bas --nasaddr 0x10fa --loadaddr 0x4341    3dnc.cas ファイルを NASCOM カセット形式から変換する

メモリデコーダーツール

初期のtranZPUter SW設計(v2.0未満)では、アクティブなデコーダーとして512KBのFlash RAMを使用していました。これは、開発が進むにつれてtranZPUter SWがMZ80K/C/B/700/800マシンのソフトウェアを実行できるようにするために意図的に選択されました。これらのマシンはグラフィックスが異なる場合を除けば類似したメモリマップを持っており(MZ80Aカラーボードは比較的MZ-700互換のビデオを提供し、Video Module v2.0の登場でMZ80B/800対応のピクセルグラフィックスも実現します)、複数の異なるメモリマップを可能にします。

デコーダービットマップを生成するために、Z80信号ロジックに基づいてマップを作成するCのツールを作成しました。このロジックはZ80信号を使用するため、「メモリマップ5、Z80 WR、アドレス:0xE800:EFFFにtranZPUter RAMがマッピングされている」のように比較的直感的に記述できます。

Cプログラム内のシグナルを使用してデコーダーマップを作成する例:

    // トランザクション前のセットアップ。アドレスラインには RD/WR/MREQ/IORQ 信号がアサートされる前に次のアドレスが含まれる。
    // セットが tranZPUter とメインボードの混合リソースを使用する場合、FlashRAM に信号が提示されてから
    // 信号を出力するまでの伝播遅延、さらに 279 SR ラッチ、74HCT08 AND ゲート、メインボードのトライステート バッファの
    // 追加遅延がある。アドレスへのこのアクションでメインボードまたは tranZPUter を事前に有効化することで、
    // メインボードの BUSACK 信号への伝播の影響を取り除く。
    //
    switch(set)
    {
        // セット 3 - モニター ROM 0000-0FFF、メイン RAM エリア 0x1000-0xD000、ユーザー ROM 0xE800-EFFF は tranZPUter メモリ ブロック 0 にある。フロッピー ROM F000-FFFF は tranZPUter メモリ ブロック 1 にある。
        // 注: このモードではメイン DRAM はリフレッシュされないためデータ保存に使用できない。
        case 3:
            if( (Z80_ADDR >= 0x0000 && Z80_ADDR < 0xD000) || (Z80_ADDR >= 0xE800 && Z80_ADDR < 0xF000))
            {
                flashRAM[set].tranche[inSignals].DISABLE_BUS = 0;
                flashRAM[set].tranche[inSignals].ENABLE_BUS = 1;
            } else if ((Z80_ADDR >= 0xF000 && Z80_ADDR < 0xF3C0) || (Z80_ADDR >= 0xF400 && Z80_ADDR < 0xF7C0) || (Z80_ADDR >= 0xF800 && Z80_ADDR < 0x10000))
            {
                flashRAM[set].tranche[inSignals].DISABLE_BUS = 0;
                flashRAM[set].tranche[inSignals].ENABLE_BUS = 1;
                flashRAM[set].tranche[inSignals].A16 = 1;
                flashRAM[set].tranche[inSignals].A17 = 0;
                flashRAM[set].tranche[inSignals].A18 = 0;
            } else
            {
                flashRAM[set].tranche[inSignals].DISABLE_BUS = 1;
                flashRAM[set].tranche[inSignals].ENABLE_BUS = 0;
            }
            break;

            ...

    // メモリ書き込みの特定マッピング
    if(Z80_MEM_WRITE)
    {
        switch(set)
        {
            // セット 3 - モニター ROM 0000-0FFF、メイン RAM エリア 0x1000-0xD000、ユーザー ROM 0xE800-EFFF は tranZPUter メモリ ブロック 0 にある。フロッピー ROM F000-FFFF は tranZPUter メモリ ブロック 1 にある。
            // 注: このモードではメイン DRAM はリフレッシュされないためデータ保存に使用できない。
            case 3:
                if( (Z80_ADDR >= 0x0000 && Z80_ADDR < 0xD000) || (Z80_ADDR >= 0xE840 && Z80_ADDR < 0xF3C0) || (Z80_ADDR >= 0xF400 && Z80_ADDR < 0xF7C0) || (Z80_ADDR >= 0xF800 && Z80_ADDR < 0x10000))
                {
                    flashRAM[set].tranche[inSignals].DISABLE_BUS = 0;
                    flashRAM[set].tranche[inSignals].RAM_WE = 0;
                    flashRAM[set].tranche[inSignals].RAM_OE = 1;
                }
                break;

              ...

デコーダーツールはコマンドラインで実行するよう設計されており、その概要は以下の通りです:

FLASHMMCFG v1.0

オプション:-
  -h | --help              このヘルプを表示する
  -i | --io-addr <アドレス>    IO 制御レジスタのベース アドレス
  -o | --output <ファイル>     最終バイナリ イメージを指定ファイルに出力する。このファイルを Flash RAM に書き込む
  -v | --verbose           より多くのメッセージを出力する

使用例:
  flashmmcfg --output Decode1.bin --io-addr 0x20       IO 制御レジスタのベース アドレスとして 0x20 を使用してマッピング バイナリを作成する

tranZPUter SWソフトウェアのビルド

tranZPUter SWボードが機能するには、いくつかのソフトウェアコンポーネントが必要です:

  • zOS - K64F I/Oプロセッサ上で動作する統合オペレーティングシステム
  • TZFS - Sharp MZ80A上で動作するZ80ベースのオペレーティングシステム(ファイリングシステム)
  • メモリデコーダー - tranZPUterボードのハードウェアデコーダーロジックを形成する512Kバイトのマップ
  • CP/M - マイクロコンピューター向けの実際のオペレーティングシステムで、Sharp MZ80Aに移植されており、多数のアプリケーションを利用できます。

ソフトウェアのビルドには異なる手順が必要であり、以下のセクションで説明します。


パス

読みやすさのため、この章では以下の略称が対応するパスを指します。2つのリポジトリを使用します。tranZPUterの主要リポジトリと、オペレーティングシステム用のzSoftです。

zSoftリポジトリ(zOS)

略称 パス 説明
[<絶対パス>]   このリポジトリをシステム上に展開したパス。
<zsoft> [<絶対パス>]/zsoft/ zSoftソフトウェアのルートディレクトリ。
<z-apps> [<絶対パス>]/zsoft/apps アプリケーションディレクトリ。すべてのzOS/ZPUTAアプリケーションとそのmakefileがここに配置されます。
<z-build> [<絶対パス>]/zsoft/build コンパイルされたソフトウェアのターゲット出力ディレクトリ。例: <z-build>/SD にはSDカードに書き込むすべてのファイルが含まれます。
<z-common> [<絶対パス>]/zsoft/common ライブラリにアセンブルされない共通のC/C++メソッド。
<z-libraries> [<絶対パス>]/zsoft/libraries C/C++ライブラリ。通常はC/C++インストールの一部ですが、組み込み作業(特にZPU)では個別に作成する必要があります。
<z-teensy3> [<絶対パス>]/zsoft/teensy3 K64FベースのTeensy 3.5ソフトウェア。その一部はzOSのK64Fバージョンで使用されます。非常に豊富なライブラリを持ち、K64Fプログラムに簡単に追加できます。
<z-include> [<絶対パス>]/zsoft/include 共通インクルードヘッダーファイル。
<z-startup> [<絶対パス>]/zsoft/startup 組み込みプロセッサのスタートアップファイル(一般的にアセンブラー形式)。テンプレートとマクロを使用して、正しいターゲットのメモリモデルのスタートアップコードを作成します。
<z-iocp> [<絶対パス>]/zsoft/iocp IO制御プログラム。ZPU上でアプリケーションをブートストラップするための初期ブートローダーです。
<z-zOS> [<絶対パス>]/zsoft/zOS zOSソースコード(異なるターゲットCPU向けにパラメーター化されています)。
<z-zputa> [<絶対パス>]/zsoft/zputa ZPUTAソースコード(異なるターゲットCPU向けにパラメーター化されています)。
<z-rtl> [<絶対パス>]/zsoft/rtl レジスタ転送レベルファイル。ZPUターゲットプロジェクトのビルドに必要な、生成されたメモリ定義・初期化ファイルです。
<z-docs> [<絶対パス>]/zsoft/docs ソフトウェアに関する関連ドキュメント。
<z-tools> [<絶対パス>]/zsoft/tools ターゲットファイルのコンパイルと作成を支援するツール。

tranZPUterリポジトリ

略称 パス 説明
<cpu> [<絶対パス>]/tranZPUter/cpu ZPU VHDL定義ファイル。
<build> [<絶対パス>]/tranZPUter/build ZPUベースのtranZPUterボードの開発・テスト用ビルドファイル。
<devices> [<絶対パス>]/tranZPUter/devices ZPU開発またはtranZPUter開発で使用されるハードウェアデバイスのRTL定義。
<docs> [<絶対パス>]/tranZPUter/docs プロジェクトに関する関連ドキュメント。
<pcb> [<絶対パス>]/tranZPUter/pcb Gerberファイル。各tranZPUterバージョン(SW、SW-700、tranZPUter)はそれぞれのサブディレクトリにあります。
<schematics> [<絶対パス>]/tranZPUter/schematics Kicadの回路図とPCB設計ファイル(コンポーネントライブラリ定義を含む)。
<software> [<絶対パス>]/tranZPUter/software プロジェクトで使用するソフトウェアのルートディレクトリ。
<tools> [<絶対パス>]/tranZPUter/software/tools ターゲットファイルのコンパイルと作成を支援するツール。
<asm> [<絶対パス>]/tranZPUter/software/asm TZFS、CP/M、各種オリジナルモニターROM用のZ80アセンブラーファイル。
<roms> [<絶対パス>]/tranZPUter/software/roms Z80ソースをアセンブルして作成されたROMファイル。
<srctools> [<絶対パス>]/tranZPUter/software/src/tools tranZPUter v1 Flash RAMメモリマップデコーダーファイル作成ツールおよびNASCOM Basic変換ツール。
<cpm> [<絶対パス>]/tranZPUter/software/CPM オリジナルのCPMソフトウェア。アプリケーションごとにグループ化されており、生成されたフロッピーディスクおよびSDカードイメージを含みます。
<mzf> [<絶対パス>]/tranZPUter/software/MZF 生成されたSDカードイメージに追加されるオリジナルのSharp MZF形式アプリケーション。
<bas> [<絶対パス>]/tranZPUter/software/BAS 読み取り可能なテキスト形式に変換されたNASCOM Basicプログラムのコレクション。生成されたSDカードイメージに追加されます。
<cas> [<絶対パス>]/tranZPUter/software/CAS NASCOMテープイメージから変換されたNASCOM Basicトークン化テーププログラムのコレクション。生成されたSDカードイメージに追加されます。
<cas> [<絶対パス>]/tranZPUter/software/NASCAS 未変換のオリジナルNASCOMカセットイメージのコレクション。変換にはnasconvツールを使用してください。
<config> [<絶対パス>]/tranZPUter/software/config ツール用の設定ファイル。現在はCP/Mイメージ生成用のディスク定義ファイルが含まれます。

ツール


すべての開発はLinux(特にDebian/Ubuntu)上で行われています。Flash RAMの書き込みやCP/M ToolsのGUIバージョンの使用にはWindowsを使用していますが、Windows上でのTZFSのビルドに専念する時間はまだとれていません。いずれ必要なツールがすべてインストールされたDockerイメージを作成する予定ですが、それまでの間、Z80コードのアセンブル、Cプログラムのコンパイル、CP/MソフトウェアやCP/Mディスクイメージの操作には以下のツールを入手してインストールする必要があります。

Teensy3.5/K64Fについては、ARM互換のツールチェーンが現在リポジトリのビルドツリー内に格納されています。

   
ZPU GCC ToolChain ZPU開発用のGCCツールチェーン。/opt または同様の共通エリアにインストールします。
Arduino Arduino開発環境。zOSのK64Fバージョンに豊富なArduinoライブラリから機能を追加する場合以外は必須ではありません。参考用です。
Teensyduino Arduinoレベルでのテンシー3.5ボード操作のためのTeensy3 Arduino拡張。参考用で必須ではありません。
Z80 Glass Assembler アセンブリファイルをマシンコードに変換するZ80アセンブラー。0.5リリースのバグ(0xFFFFの位置にバイトを作成しない問題)を修正した版がリポジトリの <tools> ディレクトリに保存されています。
samdisk マルチOS対応のコマンドラインベースの低レベルディスク操作ツール。
cpmtools マルチOS対応のコマンドラインCP/Mディスク操作ツール。
CPMToolsGUI WindowsベースのGUI CP/Mディスク操作ツール。
z88dk Z80 CPU向けの優れたC開発キット。
sdcc Z80をターゲットの一つとする優れた小型デバイスCコンパイラ。z88dkはこのツールのZ80向け強化版をパッケージ内に含んでいます。

zOSのビルド

zOSのビルドについては、zOSビルドセクションを参照してください。

典型的なビルドコマンドは以下の通りです:

build.sh -C K64F -O zos  -N 0x10000 -d -T

これはK64Fプロセッサ向けのzOSイメージを、64KのプライマリヒープサイズPayload(-N 0x10000)とtranZPUter拡張(-T)を付けてビルドします。

出力ファイルは <z-zOS>/main.hex で、Teensy 3.5ボードにアップロードできます。


TZFSのビルド

リポジトリをクローンし、提供されているシェルスクリプトとバイナリを実行することで、ソフトウェアと最終ロードイメージをビルドできます。

TZFSのビルド手順は以下の通りです:

  1. <tools>/assemble_tzfs.sh を使用してTZFSバイナリを作成します。これにより、メインコードとバンクコードをすべて含むROMイメージ <roms>/tzfs.rom が作成されます。
  2. <tools>/assemble_roms.sh を使用してオリジナルのMZ80Aモニターロムを作成します。これにより <roms>/monitor_SA1510.rom および <roms>/monitor_80c_SA1510.rom が作成されます。
  3. 必要なSharp MZFファイルをMZFディレクトリにコピーまたは削除します。
  4. SDカードにファイルをコピーします。

典型的なビルド手順については以下を参照してください。


メモリデコーダーのビルド

512K Flash RAMに書き込むメモリデコーダーマップをビルドするには、リポジトリをクローンして以下の手順に従います:

  1. ディレクトリに移動して以下のコマンドを実行します: make make install
  2. 以下のコマンドを実行します: /flashmmcfg --output /tranZPUterDecoderMappingFile.bin
  3. ファイル /tranZPUterDecoderMappingFile.bin を適切な512KB Flash RAMに書き込みます。

デコードロジックの追加は、<software>/src/tools/flashmmcfg.c ファイルを編集し、setMap() メソッドに適切な条件節を追加することで行います。


CP/Mのビルド

CP/Mのビルドについては、CP/Mビルドセクションを参照してください。

tranZPUter向けのCP/Mバージョンは、特別なSDカードやコンパクトなROMイメージを用意する必要がないため、ビルドが若干シンプルです。

CP/Mシステムは4つのパーツでビルドされます:

1. CCP、BDOSおよびCBIOSスタブを含む cpm22.bin
2. バンク化されたCBIOS(0xF000:FFFFに配置された4KページのプライマリソースとFPGAされた64K RAMブロックの最大48Kページから構成)
3. 1 + 2 + MZFヘッダーをTZFSがロード可能なMZF形式ファイルへ連結
4. K64F SDカード上に16MB FAT32ファイルとして保存されるCPMディスクドライブの作成

上記すべてが2つのbashスクリプト ‘assemble_cpm.sh’ と ‘make_cpmdisks.sh’ にエンコードされており、以下のように実行できます:

cd <software>
tools/assemble_cpm.sh
tools/make_cpmdisks.sh

CPMディスクイメージは、生のイメージは <cpm>/1M44/RAW に、CPC拡張形式のディスクイメージは <cpm>/1M44/DSK にあります。これらのイメージは <cpm> 内のディレクトリから作成され、CPM*で始まる各ディレクトリが1つの1.44MBドライブイメージにパッケージされます。なお、これらのディレクトリはサポートされるその他のディスクのイメージとしても対応するディレクトリ(例: SDカードの16MBドライブイメージ用の <cpm>/SDC16M)にパッケージされます。

SDカード上のファイルとして存在するCPMディスクは <CPM>/SDC16M/RAW に保存され、CPMDSK<番号>.RAW という形式(<番号> は00、01 … n)で、CP/M下のディスクドライブに対応します(標準ブートでは00 = ドライブA、01 = ドライブB等。フロッピーディスクコントローラーが優先する場合は00 = ドライブC、01 = ドライブD)。CP/Mの通常実行では最大6つのディスクが接続されます(接続は動的ですが使用可能なメモリに依存します)。


典型的なビルド

ソフトウェアのビルド、SDカードの作成、インストールのクイックスタートを以下にまとめます。

<a name="build-zos" id="build-zos"></a>
# zOS のビルド
cd <zsoft>
./build.sh -C K64F -O zos  -N 0x10000 -d -T
<a name="flash-mainhex-into-the-k64f-processor-via-usb-or-opensda" id="flash-mainhex-into-the-k64f-processor-via-usb-or-opensda"></a>
# <z-zOS>/main.hex を USB または OpenSDA 経由で K64F プロセッサにフラッシュする
cp -r build/SD/* <SD CARD>/

<a name="build-tzfs" id="build-tzfs"></a>
# TZFS のビルド
cd <software>
tools/assemble_tzfs.sh
<a name="build-the-required-host-sharp-roms" id="build-the-required-host-sharp-roms"></a>
# 必要なホスト(Sharp)ROM をビルドする
tools/assemble_roms.sh
<a name="build-cpm" id="build-cpm"></a>
# CPM をビルドする
tools/assemble_cpm.sh
<a name="build-the-cpm-disks" id="build-the-cpm-disks"></a>
# CPM ディスクをビルドする
tools/make_cpmdisks.sh

<a name="create-the-target-directories-on-the-sd-card-and-copy-all-the-necessary-applications-and-roms" id="create-the-target-directories-on-the-sd-card-and-copy-all-the-necessary-applications-and-roms"></a>
# SD カードにターゲット ディレクトリを作成し、必要なすべてのアプリケーションと ROM をコピーする
mkdir -p <SD CARD>/TZFS/
mkdir -p <SD CARD>/MZF/
mkdir -p <SD CARD>/CPM/
mkdir -p <SD CARD>/BAS
mkdir -p <SD CARD>/CAS
cp <software>/roms/tzfs.rom                   <SD CARD>/TZFS/
cp <software>/roms/monitor_SA1510.rom         <SD CARD>/TZFS/SA1510.rom
cp <software>/roms/monitor_80c_SA1510.rom     <SD CARD>/TZFS/SA1510-8.rom
cp <software>/roms/monitor_1Z-013A.rom        <SD CARD>/TZFS/1Z-013A.rom
cp <software>/roms/monitor_80c_1Z-013A.rom    <SD CARD>/TZFS/1Z-013A-8.rom
cp <software>/roms/monitor_1Z-013A-KM.rom     <SD CARD>/TZFS/1Z-013A-KM.rom
cp <software>/roms/monitor_80c_1Z-013A-KM.rom <SD CARD>/TZFS/1Z-013A-KM-8.rom
cp <software>/roms/MZ80B_IPL.rom              <SD CARD>/TZFS/MZ80B_IPL.rom
cp <software>/MZF/CPM223.MZF                  <SD CARD>/MZF/
cp <software>/roms/cpm22.bin                  <SD CARD>/CPM/
cp <software>/CPM/SDC16M/RAW/*                <SD CARD>/CPM/
cp <software>/MZF/*                           <SD CARD>/MZF/
cp <software>/BAS/*                           <SD CARD>/BAS/
cp <software>/CAS/*                           <SD CARD>/CAS/

<a name="if-you-want-tzfs-to-autostart-create-an-empty-flag-file-as-follows" id="if-you-want-tzfs-to-autostart-create-an-empty-flag-file-as-follows"></a>
# TZFSを自動起動したい場合は、以下のように空のフラグファイルを作成します。
> <SD CARD>/TZFSBOOT.FLG

<a name="if-you-want-to-run-tzfs-commands-on-each-boot-create-an-autoexecbat-file-and-place-required-commands-into-the-file" id="if-you-want-to-run-tzfs-commands-on-each-boot-create-an-autoexecbat-file-and-place-required-commands-into-the-file"></a>
# ブートのたびにTZFSコマンドを実行したい場合は、autoexec.batファイルを作成して必要なコマンドを記述します。
> <SD CARD>/AUTOEXEC.BAT

<a name="eject-the-card-and-insert-it-into-the-teensy35-reader-on-the-tranzputer-board" id="eject-the-card-and-insert-it-into-the-teensy35-reader-on-the-tranzputer-board"></a>
# カードを取り出してtranZPUterボードのTeensy3.5リーダーに挿入します。
<a name="remove-the-z80-from-the-sharp-mz-machine-and-install-the-tranzputer-board-into-the-z80-socket" id="remove-the-z80-from-the-sharp-mz-machine-and-install-the-tranzputer-board-into-the-z80-socket"></a>
# Sharp MZマシンからZ80を取り外し、Z80ソケットにtranZPUterボードを装着します。
<a name="power-on-if-the-autostart-flag-has-been-created-you-should-see-the-familiar-monitor" id="power-on-if-the-autostart-flag-has-been-created-you-should-see-the-familiar-monitor"></a>
# 電源を入れます。自動起動フラグが作成されている場合は、おなじみのモニターサインオンメッセージに続いて+TZFSが表示されるはずです。
<a name="signon-message-followed-by-tzfs-if-the-autostart-flag-hasnt-been-created-enter-the-command" id="signon-message-followed-by-tzfs-if-the-autostart-flag-hasnt-been-created-enter-the-command"></a>
# 自動起動フラグが作成されていない場合は、モニターにJE800と入力してTZFSを初期化します。

K64F MPUの書き込み

オリジナルのtranZPUter SWはPJRCの優れたTeensy開発ボードを使用していましたが、後期のtranZPUter SWリリースではFreescale K64FX512プロセッサの100ピンTQFP版に置き換えられました。

PJRCがK64FX512プロセッサのプログラミングのために開発した方法は非常にシンプルであるため、迅速な開発のためにtranZPUter SW-700ボードにそれをOpenSDA JTAGメソッドとともに組み込むことは理にかなっていました。基板実装時にPJRCブートMCU(U6)を取り付け、JP1-5のジャンパーピン1-2を設定すると、PJRCのTeensyツールを使用してUSB経由でK64Fをプログラムできます。U6を取り付けない場合は、SWDプロトコルを使用してJTAGポートに接続したOpenSDAプログラマー経由でプログラムします。この場合はJP1-4のジャンパーピン2-3とJP5のピン1-2を接続します。

プログラミングにTeensyツールを使用するために必要なファイルと実行ファイルはすべてzSoftリポジトリの <z-tools> ディレクトリにあります。

OSビルド後にK64Fをプログラムするには、以下の手順に従ってください:
1. USBケーブルでtranZPUter SW-700ボードをPCに接続します。
2. Teensyプログラミングアプリケーションを起動します:
   <z-soft>/teensy
3. Teensyアプリケーションで File->Open HEX file を選択し、<z-zOS> または \z<zputa> ディレクトリ(アップロードするOSに応じて)に移動して 'main.hex' ファイルを選択します。
4. tranZPUter SW-700ボードの 'K64F PROG' ボタンを押します。
5. Teensyアプリケーションで Operation->Program を選択します。これにより内蔵Flash RAMがプログラムされます。
6. 仮想シリアルデバイスに設定されたターミナルエミュレーターが開いていることを確認してください(不明な場合はLinux内で 'dmesg' コマンドを実行して最新のUSB接続とその名前を確認してください)。通常デバイスは /dev/ttyACM0 です。ボーレートやビット/パリティの設定は不要です。これは仮想シリアルポートでUSB速度で動作します。
7. Teensyアプリケーションで Operation->Reboot を選択します。これによりK64Fが再起動し、zOSまたはZPUTAが動作を開始します。
8. ターミナルエミュレーターを使ってOSと対話します。
zOS v1.2向けのzOSアプリケーションが開発中であり、SDカードからzOSコンソール経由でK64Fに新しいファームウェアを書き込めるようになります。SWDデバイスが必要なK64Fの初期プログラミングを除き、このアプリケーションによりPJRCやJTAGツールを使用する必要がなくなります。

Teensy3.5の書き込み

Teensy 3.5開発ボードを使用する初期バージョンのtranZPUter SWでは、USBコネクタ経由でプログラムを書き込む必要があります。

Teensyのプログラムに必要なファイルと実行ファイルはすべてzSoftリポジトリの <z-tools> ディレクトリにあります。

OSビルド後にTeensyをプログラムするには、以下の手順に従ってください:

1. USBケーブルでTeensy 3.5ボードをPCに接続します。
2. Teensyプログラミングアプリケーションを起動します:
   \<z-soft>/teensy
3. Teensyアプリケーションで File->Open HEX file を選択し、\<z-zOS> または \z<zputa> ディレクトリ(アップロードするOSに応じて)に移動して 'main.hex' ファイルを選択します。
4. Teensy 3.5のRESETボタンを押します。
5. Teensyアプリケーションで Operation->Program を選択します。これにより内蔵Flash RAMがプログラムされます。
6. 仮想シリアルデバイスに設定されたターミナルエミュレーターが開いていることを確認してください(不明な場合はLinux内で 'dmesg' コマンドを実行して最新のUSB接続とその名前を確認してください)。通常デバイスは /dev/ttyACM0 です。ボーレートやビット/パリティの設定は不要です。これは仮想シリアルポートでUSB速度で動作します。
7. Teensyアプリケーションで Operation->Reboot を選択します。これによりK64Fが再起動し、zOSまたはZPUTAが動作を開始します。
8. ターミナルエミュレーターを使ってOSと対話します。

Teensyプログラミングツールの詳細については、Teensyの基本的な使用方法ガイドを参照してください。


クレジット

サードパーティの設計を使用またはベースにしたコンポーネントについては、元の作者の著作権表示を含めています。私の知識と調査の範囲内で、すべてのサードパーティソフトウェアはオープンソースで自由に使用可能です。ライセンス上の制限があるコンポーネントが見つかった場合は、このリポジトリから削除し、適切なリンク/設定が提供されます。

ライセンス

この設計(ハードウェアおよびソフトウェア)はGNU Public Licence v3のもとでライセンスされています。

GNU Public License v3

GPL v3としてマークされたこのプロジェクトのソースおよびバイナリファイルはフリーソフトウェアです。Free Software Foundationが発行するGNU General Public Licenseのバージョン3、またはそれ以降のバージョンの条件のもとで再配布および変更することができます。

ソースファイルは有用であることを期待して配布されていますが、商品性または特定目的への適合性についての暗黙の保証を含め、いかなる保証も行いません。詳細はGNU General Public Licenseを参照してください。

このプログラムとともにGNU General Public Licenseのコピーが提供されているはずです。提供されていない場合は http://www.gnu.org/licenses/ を参照してください。