MZ2000_SDに連結MZTファイルAPIを追加する

MZ2000_SDに新しい機能を追加するにはArduinoのプログラムを変更する必要があります。
この辺りのswitch文に1バイト受取のcase分を追加するとコマンドを追加する事ができます。
元々のコマンドは080h~095hだったので私は0E0h~にMZTファイルを連結した大きなファイルを取り扱うためのコマンドを追加しました。

■Arduinoのプログラム更新
こちらのMZ-80K_SD.inoファイルをArduinoIDEで書き込みます。
ArduinoをMZ2000_SDから取り外しできる場合は取り外してArduinoのプログラムを書き込めばよいと思いますが、
取り外せない場合はMZ2000_SDの説明では「MZ-2000本体とは接続を外し、74LS04を外したうえで書き込んでください。」と書いてあります。
しかし、以下のように3本の信号線のみ接続してMZの電源を入れて書き込みを試してみた所、Arduinoを基板から外さずにMZに接続したままうまく書き換えできました。

USB-Serial Arduino
DTR DTR
RXD TXO
TXD RXI

Arduinoにプログラムを書き込むには5V対応のUSB-Serialが必要になります。
私はShigezoneこちらを買いました。

ProMini系に書き込むのに使うUSB-シリアル変換アダプターです。さっきの激安Pro Mini互換っぽい奴より高いとか思ってはいけません。(カワヅ)/USB-Serial 5V(HT42B534-1使用)ケーブル付 https://t.co/71T2jNPB5V @ShigezoneAkibaより

— Shigezone秋葉原ラジオデパート1F【マイコンボード・電子機器等の店】 (@ShigezoneAkiba) January 4, 2021

■Arduinoにプログラム書き込み手順
(1) ArduinoIDEをインストールする
こちらの右側にあるWindowsのうちのどれかを選択します。私はZIP fileってのを選びましたがMSI installerをダウンロードするとインストーラーが入っているので楽かもしれません。
次に「JUST DOWNLOAD」を選びます。emailは空欄、何も選択せず、もう一度「JUST DOWNLOAD」を選びます。するとダウンロードできます
もしこの手順でダウンロードできなかったら私が見たとき(2024/01/19)とは変わってしまったのかもしれません。
その場合はリンクを自分で見つけるかググったりして何とか解決してください。

(2) ArduinoとSerialUSBを接続してWindowsPCに接続する

(3) ArduinoIDEを起動する

(4) メニューから「ツール」-「ボード」-「Arduino AVR Boards」-「Arduino Pro or Pro Mini」を選択する

画像をクリックすると大きくなります

(5) メニューから「ツール」-「ポート」を選択する

(6) メニューから「ツール」-「ライブラリ管理」を選択する

(7) 左上のライブラリマネージャーの下にSdFatと入力する

(8) SdFatが表示されるので「インストール」ボタンを押す


(9) (→)ボタンを押してArduinoにプログラムを書き込む
以上で書き込みは終了です。
エラーが出た場合はCOMポートの番号があっているか、Arduino(MZ)の電源が入っているか、USBSerialとArduinoの結線があっているか読み込んだプログラムがMZ-80K_SD.inoか選択したボードがArduino Pro or Pro Miniになっているかなど確認してください。

■追加API
連結MZTファイルAPI
API番号 機能 Z80側から見たデータ転送
0E0h 連結MZTファイルオープン 1バイト 送信 コマンド 0E0h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
33バイト 送信 ファイル名(0で終わる文字列、33バイトよりも短い場合は0埋め)
1バイト 送信 状態 (0:正常, 0F1h:ファイルがない, 0FFh:ファイルをオープンできない)
0E1h 連結MZTファイル1ブロック読み込み 1バイト 送信 コマンド 0E1h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
17バイト 受信 MZファイル名(0Dhで終わる文字列)
2バイト 受信 読み込みアドレス
2バイト 受信 ファイルサイズ
2バイト 受信 実行アドレス
ファイルサイズ分のバイト数 受信 ファイルデータ
1バイト 受信 状態 (0FEh:次のデータがある, 0:次のデータが無い(終了))
0E2h 連結MZTファイルを1ブロックスキップ 1バイト 送信 コマンド 0E2h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
1バイト 受信 状態 (0FEh:次のデータがある, 0:次のデータが無い(終了), 0FFh:オープンしていない
0E3h 連結MZTファイルからブロックを探す 1バイト 送信 コマンド 0E3h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
17バイト 送信 ファイル名(0で終わる文字列、33バイトよりも短い場合は0埋め)
1バイト 受信 状態 (0:正常, 0F1h:ファイルが見つからない, 0FFh:オープンしていない)
0E4h 連結MZTファイルの先頭に戻る 1バイト 送信 コマンド 0E4h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
1バイト 受信 状態 (0:正常, 0FFh:オープンしていない)
0E5h 連結MZTファイルクローズ 1バイト 送信 コマンド 0E5h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
1バイト 受信 状態 (0:正常, 0FFh:オープンしていない)
0E6h 連結MZTファイルの次のブロックがあるか
(未実装、次バージョンで対応予定)
1バイト 送信 コマンド 0E6h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
1バイト 受信 状態 (0:次のデータが無い, 0FEh:次のデータがある)

サンプルプログラム

まずこちらからから「Sample2_###.zip」をダウンロードします。(###はバージョン番号)
動作はSample1.zipとほぼ同じで画像を7枚続けて表示します。違いは画像ファイルがMZ-2000版では21個から1個、MZ-80B版は7個から1個にまとまり上記のAPIを使ってファイル読み込みをしています。

■ファイル一覧
anime80b MZ-80B用画像表示サンプル一式
anime2000 MZ-2000用画像表示サンプル一式
readme.txt 説明ファイル

■MZ-80BでMZ2000_SDから画像を読み込んで表示する
(1) anime80bフォルダ内のファイルをマイクロSDカードにコピーします
(2) MZ-80Bを起動してMZ2000_SDからMZ2000_SDに対応したSB-5520を起動します
(3) LOAD命令を実行してANIME80Bをロードします
(4) RUNするとファイル名を聞いてくるのでGVRAMTOOL80Bと打ち込みます

■MZ-80Bマシン語呼び出し
LIMIT$D7FF:LOAD "GVRAMTOOL80B"     マシン語読み込み。MZ2000_SDではDOSFILEを聞かれるためGVRAMTOOL80Bと入力してください
USR($D800)                         GVRAMからRAMにコピーする GVRAM(8000Bytes) → RAM BUF
USR($D803)                         BUFにある320x200(8000bytes)をGVRAMにコピーする
USR($D806)                         なにもしない。欠番
POKE$D80A,L:POKE$D80B,H:USR($D809) LZEをBUFに展開する。LとHはLZEを読み込んだアドレス+4を指定する
F$="FILENAME":USR($D80F, F$)       MZ2000_SDからバイナリファイルをロードする
F$="FILENAME":USR($D812,F$)        連結MZTファイルオープン
USR($D815)                         連結MZTファイルロード
USR($D818)                         連結MZTファイルスキップ
F$="MZFILENAME":USR($D81B,F$)      連結MZTファイル検索
USR($D81E)                         連結MZTファイル先頭へシーク
USR($D821)                         連結MZTファイルクローズ

■MZ-2000/2200でMZ2000_SDから画像を読み込んで表示する
(1) anime2000フォルダ内のファイルをマイクロSDカードにコピーします
(2) MZ-2000/2200を起動してMZ2000_SDからMZ2000_SDに対応したMZ-1Z001を起動します
(3) LOAD命令を実行してANIMEをロードします
(4) RUNするとファイル名を聞いてくるのでGVRAMTOOL2000と打ち込みます

■MZ-2000/2200マシン語呼び出し
LIMIT$B7FF:LOAD "GVRAMTOOL2000"    マシン語読み込み。MZ2000_SDではDOSFILEを聞かれるためGVRAMTOOL2000と入力してください
USR($B800)                         GVRAMからRAMにコピーする GVRAM(16000Bytes) → RAM BUF
USR($B803)                         BUFにある320x200(8000bytes)をGVRAMに横2倍に引き伸ばしコピーする
USR($B806)                         BUFにある640x200(16000bytes)をGVRAMにコピーする
POKE$B80A,L:POKE$B80B,H:USR($B809) LZEをBUFに展開する。LとHはLZEを読み込んだアドレス+4を指定する
F$="FILENAME":USR($B80F, F$)       MZ2000_SDからバイナリファイルをロードする
F$="FILENAME":USR($B812,F$)        連結MZTファイルオープン
USR($B815)                         連結MZTファイルロード
USR($B818)                         連結MZTファイルスキップ
F$="MZFILENAME":USR($B81B,F$)      連結MZTファイル検索
USR($B81E)                         連結MZTファイル先頭へシーク
USR($B821)                         連結MZTファイルクローズ

■注意点
連結MZTファイルオープンを行い読み込み処理が終わったら必ず連結MZTファイルクローズを実行してください。
もし連結MZTファイルオープンをしたままBASICのLOADコマンドなどを実行するとMZが暴走します。

■連結MZTファイルの作り方
連結したいファイルが以下の3つだとすると
0001.mzt
0002.mzt
0003.mzt
コマンドプロンプトで
copy /b 0001.mzt+0002.mzt+0003.mzt file.mzt
と打ち込むと
3つのファイルが連結されたfile.mztが作成できます。
要はMZTファイルを単純に多数くっつけただけのファイルです。
戻る