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 の仕様策定という大きな一歩を踏み出せるでしょう。
概要
このアップグレードは Z80 のハードウェア機能を拡張し、64K バージョンの CP/M を実現するための追加 RAM を提供するとともに、Sharp MZ80A マザーボードの周辺機器にアクセスする際には元の速度を維持しながらプロセッサを高速化します。
この設計は tranZPUter と連携して進行中の作業です。tranZPUter SW 向けに記述された C/C++ 制御ソフトウェアは、ZPU 上の tranZPUter でも動作することを意図しています。
この設計は Z80 を所定の位置で置き換えるため、MZ80A に限定されず、適切なソフトウェアの適合(例:MZ-700 や MZ-80B)によって任意の Z80 ベースのコンピュータに使用できます。
tranZPUter SW
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 バスの制御を引き継ぎ、メインメモリと SD カード間のデータ転送、またはメニュー表示のための I/O プロセッサとビデオ表示バッファ間のデータ転送に使用されます。また、ソフトプロセッサがハードウェア Z80 を完全にアイドル状態にして主 CPU として機能する場合にも使用されます。つまり、ソフト CPU エミュレータを使用することで、ローカルメモリ上でアプリケーションを処理しながら、必要に応じてホストマシン上の I/O とビデオバッファにスローダウンしてアクセスし、まったく異なるコンピューティング体験を提供できます。6809 や 68000 ベースの Sharp MZ80A を想像してみてください!
この設計は、オリジナルの Z80 をドーターカード上に持ち上げ、いくつかの信号を必要に応じて制御できるよう再ルーティングすることを中心としています。
v1.0 Z80 アップグレード回路図

上記の回路図は、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 回路図

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


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

v1.1 Teensy 3.5 回路図

バージョン 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 への変更をすべて反映した段階的な設計です。




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

v2.0 Teensy 3.5 回路図

バージョン 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 を注文してしまいました。おそらく夜更かしのせいでしょうが、実際に部品を注文するまでミスに気づかなかったという事実から、このような間違いを最小化するためにボードを設計しながら部品を注文するという方針に変える必要があります。



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

v2.1 Teensy 3.5 回路図

バージョン 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 画像です。




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

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

バージョン 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 で設計・製造発注済みです。




設計詳細
K64F Z80 ホスト API
// 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 の構成
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 |
メモリ モード
定義済みのモードを以下の表に示します。さらなる拡張のためにいくつかの空きスロットが残されています。
| モード | 対象 | 範囲 | ブロック | 機能 | 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 周波数切り替え
周波数切り替えの主な問題は、基盤となるホストの周波数を変更できないことです。ホストは通常クロックを生成しており、その回路はそのクロック許容範囲内で動作するように設計されています。
切り替え可能な 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 モード
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 |
tranZPUter v1.1
たとえばトリガーには、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 で表示できます。
すべての解決策を組み合わせることで、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
キーボード マッピング
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-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 をロードすることから始めましょう…
ハードウェア記述言語
ビットマップを作成する方法はさまざまありますが、通常はソフトウェアのソースコードに似たハードウェア記述言語が使用されます。筆者は大学で学んだ 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 ビットストリームのビルド
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にプログラムされます。
ソフトウェア
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コンピューターに搭載されていた多くのコマンドが含まれます。
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
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モニター
JE800<cr>
コンピューターのスタートアップを直接TZFSに自動化することも可能です。そのためには、SDカードのルートディレクトリに次の名前の空のファイルを作成します:
'TZFSBOOT.FLG'
TZFSが起動すると、通常のSA-1510モニターサインオンバナーが表示され、すべてが正常であれば「+ TZFS」という接尾辞が付加されます。通常の '\*' プロンプトが表示され、オリジナルのSA-1510コマンドに加えて拡張コマンドセットを発行できます。その一部はMZ700/MZ800シリーズで見られたものであり、その他はカスタムのものです。完全なコマンドセットを以下の表に示します:
| コマンド | パラメーター | 説明 |
|---|---|---|
| 4 | なし | 40/80カラムディスプレイアップグレードが追加されている場合、40文字モードに切り替えます。 |
| 8 | なし | 40/80カラムディスプレイアップグレードが追加されている場合、80文字モードに切り替えます。 |
| 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
インタープリターのバイト位置は、既知のアドレスにある関数を期待して書かれたプログラムがあるため重要です。したがって、リバースアセンブルは正確でなければならず、変更・拡張はメインプログラムの外部で行う必要がありました。幸いなことに、インタープリター内には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
既存の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番目のバージョンを作成し、欠けているテープコマンドを含む利用可能なコマンドの記述と拡張を行いました。
- 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カセットイメージ変換ツール
変換ツールはコマンドラインで実行するよう設計されており、その概要は以下の通りです:
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のビルド手順は以下の通りです:
- <tools>/assemble_tzfs.sh を使用してTZFSバイナリを作成します。これにより、メインコードとバンクコードをすべて含むROMイメージ <roms>/tzfs.rom が作成されます。
- <tools>/assemble_roms.sh を使用してオリジナルのMZ80Aモニターロムを作成します。これにより <roms>/monitor_SA1510.rom および <roms>/monitor_80c_SA1510.rom が作成されます。
- 必要なSharp MZFファイルをMZFディレクトリにコピーまたは削除します。
- SDカードにファイルをコピーします。
典型的なビルド手順については以下を参照してください。
メモリデコーダーのビルド
512K Flash RAMに書き込むメモリデコーダーマップをビルドするには、リポジトリをクローンして以下の手順に従います:
-
ディレクトリに移動して以下のコマンドを実行します: make make install - 以下のコマンドを実行します:
/flashmmcfg --output /tranZPUterDecoderMappingFile.bin - ファイル
/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版に置き換えられました。
プログラミングにTeensyツールを使用するために必要なファイルと実行ファイルはすべてzSoftリポジトリの <z-tools> ディレクトリにあります。
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と対話します。
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 License v3
ソースファイルは有用であることを期待して配布されていますが、商品性または特定目的への適合性についての暗黙の保証を含め、いかなる保証も行いません。詳細はGNU General Public Licenseを参照してください。
このプログラムとともにGNU General Public Licenseのコピーが提供されているはずです。提供されていない場合は http://www.gnu.org/licenses/ を参照してください。