MZ-2500覚え書き

当時、MZ-2521を完全に廃れてから中古屋の隅で寂しそうにしているのを購入しました。
ですからソフトウェアやコミュニティーについての事情はほとんど知りません。
ここには私が書いておかなければならない事だけを忘れないうちに書いておきます。

TVコントロール回路


MZ-2531(V2)ではX1シリーズと互換性のあるTVコントロール端子が追加されていますが、MZ-2511/2521(V1)にはありません。
当時、某所でV2用IOCS-ROMを抜くことが出来たので、それを解析して仕様が分かりました。
ROMライタは持っていなかったので、V2のIOCS ROMのデータをRAMバンクにロードしてからワークエリア内のバンク番号を書き換えてIOCS ROMとすり替えました。
MZ-2500のバンクメモリとIOCSはよくできてましたね。

ハードウェア

I/Oアドレス
ビット
R/W
機能
0AFH
0
R
TV POWER信号入力
0AFH
0
W
TV CONTROL信号出力
それぞれ単純な1bitのINポートとOUTポートです。
TVコントロール信号がPPM変調かなにかですが、Z80B君が割り込み禁止状態で命令ステップでタイミング作りに専念して信号を作ってます。

emz2500のソースリストをちらっと確認してみましたが、やはりこのポートは実装されてなかったです。
X1もそうですが、TVコントロールはソフトを実行する目的のエミュには不要なので最後まで置き去りでしょう。
emzのサイトにある別のMZ-2800 解析資料によると同ポートはMZ-2800ではSASI-I/Fになってるようですが、MZ-2531では確かにここがTVコントロールポートです。

ファンクションコール

ファンクション番号
パラメータ
機能
忘れた
忘れた
TVにコントロール信号を出力する
失念しました。資料も残ってません。
他にTV POWER状態を取得するファンクションコールもあったかもしれない。

当時、MZユーザにこのファンクションコールの存在について話したところ、
MZ-2500 テクニカル・マニュアルに載ってないファンクションコールは無いですよという回答でした。
でも、ここを糸口にポートアドレスと仕様を割り出して実際に動作させたのは事実なので確かに存在します。
V1のIOCS ROMとV2のIOCS ROMの未定義ファンクションテーブルを比較すれば見つかると思います。

インターフェースボード

ほとんどの信号は辞書ROM用コネクタから取れるので、ここにボードを突っ込んでWRなど足りない信号をICクリップで取りました。
実機も同様の方法で実装されてることは、後の後々にmz enCYCLOPEDIA Vol.10を頂戴して知りました。
実機だとWR信号はどうやって取ってるんだろうか・・・mz enCYCLOPEDIAの写真では分からないや。

今考え直せば、ハードはファンクションコールで切ってあるのだから、IOCSにパッチを当てればジョイスティックポートで代用しても動かすことができたはずですね〜

FDアクセス中のBGM再生

MZ-2500でこれをやってるのは勝手移植もので一本だけだと思います。はい、ソー○リアンですね。
実はディスクエラーが発生するとリトライ出来なくなる致命的バグが残っているため恥ずかしくて触れたくないのですが、こっちはエミュの再現性にも関わることなので書きます。

仕組み
・音源ドライバで裏レジスタをいっさい使わない(裏レジは割り込み処理で使います)
・音源ドライバではIX関係の命令など、割り込みレイテンシを長くする命令は使わない。
・Z80SIOの送信割り込みを利用して、32us未満の短い割り込み間隔を作る。
・割り込みルーチンでは裏レジを使ってFDCを迅速にアクセスして、次のSIO割り込みを仕掛ける。
・FDC用の割り込み以外は全て禁止、FDアクセス中の演奏インターバルは専用のポーリングループで処理する。

割り込みルーチンは裏レジでオーバーヘッド減らしたり、一度に2バイト読んだり、SIOの送信データを5bitや6bit長の送信データを使ったりと調整には非常に苦しみ、エラーが完全に出なくなるまで調整することは出来ませんでした。

こんなトリッキーな方法でタイミングも厳しく、バグも残ったことから後出しのイー○3ではやってないんです。
ソー○リアンもBGMを止める安定バージョンが別にあるのですが、こちらは聞くに堪えないほど不快なので。

エミュではSIOの送信割り込みとYM2203のタイマーオーバーフローフラグをサポートしてくれれば動くはずです。
FDCのLOSTデータはソフト的に抑制できるので、Z80SIO送信割り込みの厳密な時間管理は不要でしょう。

割り込み禁止FDアクセスの制限が無ければPC8801xRからの移植なんてパッチとバンク切り替えで余裕だったのにぃ〜
FDアクセス中はキースキャンも出来ない仕様なら、いっそZ80PIOの割り込み源にでもFDCのINTピンをぶら下げてくれてれば楽勝だったのにぃ〜

グラフィックアクセス時のウェイト

同時書き込み機能を使うよりPOP命令を使ったベタレタリングの方がCPUのステップ数では速いはずなのにそれだとどうしても描画速度が遅くなってしまいます。
さんざん試して悩んだ末に出た答えは「いまどきサイクルスチールアクセスじゃないの?」という疑い。
検証してませんが、実際に遅かったので間違いないでしょう。

サイクルスチールというのはCRTCが画面表示中にビデオRAMをアクセスしていても、その隙間をぬってCPUからもアクセスできる回路のことで、これが無いとCPUはブランク期間になるまで金縛りに合うことになります。
あまり表には出てこないスペックですが処理速度の面では非常に重要な事です。
水平15KHzのワーストケースでは44us以上になるのでM1ウェイトとかリードモデファライトの追加ウェイトとかそういうレベルの話しじゃないんです。CPUがバッチリ止まります。
ここを見過ごしちゃうとエミュの再現性にもかなり影響が出るはずですが、MZ-2500に限らず巷のエミュレータのほとんどは、ビデオアクセスのウェイトをサポートしていないようです。

MZ-2500ではレタリング処理を垂直帰線期間中に集中させたり、表示エリアを小さくする、などで全体の描画速度が上がります。
オブジェクト同士の重ね合わせもリードモデファライト機能を使ってビデオメモリ上で行うと楽なのですが、悲しいかなメインメモリ相手にCPUでシコシコマスク処理する方が速いのです。

FDアクセスの問題とこの問題の2点が、究極のZ80マシンと呼ばれるMZ-2500の汚点

320x200x256色モード

スタークルーザーが減色無し256x128でレタリングできるはずだなぁー

ん?、X1turboZ?、Z80でマスキング合成して8プレーンも表示するのは速度的に無理でしょ。(8色で既に超重)

え?、MSX2?、そっちは動かせるかも。