2017.11.14 初版
2017.11.26 OS設定の文言を修正、tmpfsに関する設定を追加
2017.12.03 コンポジットビデオ出力をプログレッシブスキャンに設定する方法を追加
2018.02.03 UI説明を正式公開版に変更・追記
ファミコンミニに始まって、最近は昔のアイテムがミニチュアサイズで復刻されたりして、賑やかで楽しくなりました。そんな中、突然発表されて話題をさらった「PasocomMini MZ-80C 」を、せっかくここまでできてるのだからと外観だけじゃなくてもう少し機能的にミニチュアモデルとして動かせるよう改造してみました。
念のため、それと忘れてしまうぐらい時間が経ってからここを発見した人のために、PasocomMini MZ-80Cについて簡単に紹介しておきましょう。
HAL研究所 という、老舗のソフト・ハードメーカーがあります。老舗だけに、古くからのパソコンファンにはお馴染みの会社です。まだグラフィック機能が貧弱だったMZ-80シリーズやNECのPC-8001などに、表示文字フォント(の一部)を自由に書き換えられる「プログラマブル・キャラクタ・ジェネレータ(PCG)」という後付けオプションを発売したり、ゲームなどを開発・販売したりしていました。経営不振等いろいろ紆余曲折もありましたが、現在も元気です。
そのHAL研究所の社長に就任間もない三津原氏が、自身の思い入れから(諸説あり)ミニチュア版レトロPCの企画を立ち上げます。それから一年半かけて完成した第一弾が、このMZ-80Cというわけなのです。さらに発表時にはモックとしてですがPC-8001とFM-7も同じサイズで作られていたこともあり、MZ以外のファンにも注目されることになりました。
当時のWeb記事のリンクを貼っておきます。
発表直後の静岡ホビーショーでも披露されたり 、実店舗としては唯一の予約受付店となった秋葉原BEEP SHOPでモック展示が行われたりしつつ、予告通り10月中旬も中旬、14日に発売されました。なお予約制のため発売直後のキャンセル品などを除いて、継続的に販売される予定はありません。
それではここから写真で紹介しましょう。
Pasocom Mini MZ-80C本体と箱。本体の造形が見事すぎて、何か比較できるものが横にないと本物のMZ-80Cを撮影しているかのようです。
いきなり脱線しますが、この箱がまたマニアック。基本的なデザインは本物のMZ-80Cの箱をベースにしていて、型名や会社名、注意書きなどの場所はそのままに、本来アルゴマークがある場所を本体のシルエットに置き換え背景のプログラムリストをオリジナルのものにするなど、ちゃんと現代の製品としての主張ができるようになっています。
本物の箱は天井が観音開きになるのですが、印刷でそれっぽく描かれているのも面白いデザインです。
さて、本題に戻りましてPasocomMini MZ-80C本体です。
本体は本物の1/4サイズで造形されています。1/4ってのは寸法のことで、ということは縦×横×高さで1/64では?とかふと思ったりもしましたが、まぁ細かいことは気にしないことにしましょう。個人的には気になるときは「寸法1/4」とか表現しています。
なんと素晴らしい造形…。横に開口したUSBコネクタ部が見えなければ、「言われなければわからない」レベルですよね。スピーカのところの穴もちゃんと開いています。
それもそのはず、造形は青島文化教材社 の手によるもので、静岡ホビーショーでの展示もアオシマブースで行われていました。
なお、SHARPロゴとアルゴマークについては版権その他の都合でついていません。でも、MZシリーズ特有の型番に使われているあのステンシル文字も版権という意味では微妙なのでは…。
スリットなんかもこのとおり、強度確保の都合で数まで同じというわけではないんですが、イメージを損なわないようにちゃんと配慮されています。回転しませんが音量つまみまでついてます。
キーボードも緻密ですね…こうやって本物と比べていると、普通に押せそうな気がしてきます。
本体底面にもスリット…ではなく溝にしてあるだけですが、本物には底面にもスリットがありまして、普段見えないところなんですが細かいところまで気配りされていますね。
オマケがまた楽しくて。
CRTのところは、黒いフードの前縁(フレーム部分)が外れて、裏から画面を模した紙を入れることができるようになっています。標準で添付されているのがBASIC(SP-5030)起動時のものですけど、代わりにゲームの画面なんかを入れるのもいいですね。
ダミーのカセットテープが3つ付属します。BASIC風・マシンランゲージ風・アプリケーションテープ風のラベルもあって、貼り付けることで1/4サイズの本体付属(マシンランゲージはオプションだけど)テープを再現できます。
もちろんCMTのところに装着できます。CMT部の下面に穴があって、そこに細い棒を入れるとフタが取れます(跳ね上がりはしない)。CMTのボタンも押せはしませんが雰囲気ばっちりです。
当時のMZシリーズ特有の、ボンネットを開けるがごとくの機構もその雰囲気が再現されています。さすがに本物同様のアーム機構はないですが、アームを伸ばした状態に見えるパーツを使って筐体を開けている状態にすることができるのです。
アームは下部筐体に保管用に装着する場所が確保されています。アームの手前に見える円形のは磁石で、これで上の筐体と簡易的にロックさせています。
側面と背面のコネクタ開口部は、これまた付属パーツで閉じることができるようになっています。動かさずディスプレイする目的のために用意されているんですね。
ちょっとサイドが堅くて閉じにくい…。
筐体を開けた写真にも見えるように、PasocomMini MZ-80CにはRaspberry Pi 1 model A+ が搭載されていて、実際にコンピュータとして使うことができるセットになっています。
そういう意味ではこれを先に見せるのはアレな感じもしますが、画面はMZ-80エミュレータでZEPLISを動かしているところ。PasocomMini MZ-80Cはここでは単なるラズパイケースでしかなくて、HDMIにモニタを接続し、USBにキーボードを接続し、電源を供給している…ということになります。
いわゆるBIOSに相当するモニタは、純正のSP-1002でも雑誌に掲載されたNEW-MONITORでもなく、HAL-MONITORと銘打たれています。ここにはエミュレータを操作するためのギミックが仕掛けられているようで、プログラムをロードする「LD」コマンドを実行するとこんな感じのポップアップが出てきて、ロードに関する操作がキーボードやマウスでできるようになっています。
モニタがオリジナルなので、本物と微妙に動作が異なるところもあるような、ロードできるプログラムも基本は他のエミュレータで使えるMZTファイルなんですが何かヘッダに細工があるとかどうとか…。
この商品の本当の目的は、レトロPCのミニチュア筐体を使った、今時のBASICで遊べるパソコンであって、MZ-80エミュレータはある意味オマケのようなものです。搭載されている「SmileBASIC」はニンテンドー3DSやWii U用ソフト「プチコン」シリーズのRaspberry Pi版で、PasocomMini用にカスタマイズされています。
こちら、プログラムリストのエディト画面モード。Wii U用「プチコンBIG」よりも画面は広いかな? 今時のエディタらしく、単語の機能毎に色分けされてたりしますね。
スプライトやサウンドが自在に使えますので、ゲームなんかも楽々作れます。というか上記リストとこの実行画面は付属しているサンプルプログラムですが、まぁなんというか…30年前のホビイストには想像もつかない多機能さです。
BASICといっても今時のコンピュータで動くのですから、インタープリタでもストレスなく動きます。凄い時代になりましたね…。
Raspberry Pi用ということで、GPIOを使う命令なんかも用意されています。またエミュレータを操作する…メモリを読み書きしたり、逆アセンブルしたりなど何かに応用できそうな機能もたくさんあります。
もちろんPasocomMini MZ-80Cの添付品としてシステムが書き込まれたmicroSDカードが添付されています。もし内容を壊しちゃったら修復費用1万円だそうなので、まずバックアップを取ってそれを別のカードにコピーしてから使う必要があります。そんなことをしたらいくらでもコピーできちゃって、別のRaspberry
Piで(例えばBモデルだとUSBとかいろいろ載ってますし)使えちゃうんじゃないかと思う所ですが、実は製品に搭載されているボードでしか動かないようにプロテクトがかけられています。起動時にCPUのどこかにアクセスしてシリアル番号を確認し、記録されているものと合致していなければそのままシャットダウンしてしまうのです。
しかし…本当にこれ限定販売で終わっちゃうんですか? 細々とでいいから継続販売してほしいな…。
まぁね、発表当初から「オールインワンなんだしモニタに表示できればいいのに」「キーボードが本当に押せればいいのに」とかみんな言ってましたよね。本当に押せるキーボードは、それだけで相当のコストがかかりそう(その前に実現可能なの?)なわりに非実用的なので忘れるとしても、1/4だから2.5インチくらいの液晶パネルをはめ込んだら本物の雰囲気そのままに画面表示してくれそうじゃないですか。
6月1日の予約開始日まで内外のいろいろなRaspberry Pi(以後RasPi)取り扱いサイトを調べて、どうやら行けそうだと確信した液晶パネルや改造用のRasPi
A+を調達し、いろいろ前準備した上で発売日を迎え、早速改造したというわけなのです。いろいろと仮組み状態ですが、こんな風に動かせます。
VIDEO
…などとさらっと書いてますが、細かいレベルで寸法がわからないので、公式発表の「1/4」という数字を信じて本物のMZ-80Cの寸法を測りつつ、またリークするかのように公式ツイッターアカウント が小出しに流す写真を見ながら、あーでもないこーでもないと思案し心配して、それでもわからないものは現物合わせ…自分で言うのもなんですが、よく収まりましたよね…。
着手前はだいたいこんなことを考えていました。
外部からアクセスする必要もあるし、無線LANは必要。そして直接キー入力するためにBluetoothも必要。両方ともUSBドングルで実現するとして、USBハブも必要…外にぶら下がるのはかっこ悪いよね、なんとか内蔵させたい…。
液晶パネルは駆動回路とセットのものを手に入れたけど、12V電源で動くらしい。ならば外からは12Vを供給して、内部で5Vに降圧してRasPiに供給するか。
PWMで発音させればオリジナルである8253と似た感じで音が出せるかな? ならGPIOのところからPWMを出せるようにしようか。
液晶パネルの都合上QVGAに設定せざるを得ない。とすると製品として搭載されているSmileBASICやエミュレータがどう制約を受けるか、そもそも動かせるかどうかもわからん…なら自前でエミュレータを作って組み込んでしまえば気にしなくてすむよな?
とはいえ肝心のエミュレータをイチから作るのはしんどいわけで…。
液晶パネルの内蔵化が目的なんですから、これが一番肝心。あちこち探し回って検討した結果、Adafruitの「NTSC/PAL (Television) TFT Display - 2.0" Diagonal 」を採用することにしました。2.2インチでもいけるんじゃないか? と思ったりもしたんですが、パネル外形寸法を考えると小さめの方が安全ではないか…と思って決めました(Adafruitではこの上が2.5インチになるので、大きすぎてパスした)。
これが組み込んだ液晶モニタキット。既に加工してしまったので、Adafruitから写真を拝借しました。
入手したものは制御基板のバージョンが改まっていたようで、ボタンがひとつ増えていました。ボタンはバックライト輝度調整と天地反転の操作が可能です。
この液晶モニタキットは、映像入力がNTSCまたはPALのコンポジットビデオ信号のみとなっています。伝統的にRasPiには接続しやすいモデルですが、やはりコンポジットではちょっと画質が心配…。
かといって、HDMI方式で2インチクラスの液晶モニタってないんですよね。そうすると残りはSPIで接続する(GPIOコネクタに直接取り付けられる)方式ということになるんですが、これは1/60というフレームレートが確保できるか怪しい…というわけで、ここはやむなくコンポジットビデオ接続で通すことにします。
それと、液晶パネルってベゼルのある一辺が必ず他の三辺より太くなっていますよね。フレキシブル基板の出る側、回路が仕込まれていると思うのですが、パネル外形とはここも含めてになりますから、表示位置というのは外形に対して少しオフセットすることになってしまいます。
このベゼルの太い部分が左右どちらかの横にあった場合は、パネル取り付け位置をあらかじめ左か右にオフセットしておかないと不自然な表示になってしまいます。その部分を隠すための余裕が存在するかどうか、なければひとまわり小さいパネルを使って表示部を中央に寄せる…なんかの対策が必要になるでしょう。
ベゼルの太い部分が上または下にある場合、もちろん全体の表示は上または下にオフセットしますけど、QVGAの解像度が縦240ドットであるのに対して必要な縦のラインが200ですから、余りの40を使って表示位置を調整すれば容易に逆方向にオフセットできるわけです。短辺側にフレキが出る液晶パネルが多数ある中、このパネルは本当にラッキーでした。
上の写真を見るとリード線がライトアングルのコネクタを使って横方向に出ていて、取付時の妨げになりそうです。そこでコネクタを取り外し、リード線が基板から垂直に直接生えるようにしました。コネクタは後で再利用します。
次に、通常はダミー画面の絵を入れる、フレーム裏面を加工します。ここに液晶パネルがすっぽりと収まってくれるとありがたいのですが…。
む~ん、惜しい。
横幅は余りますね。縦が足りませんが、本体の突起と組み合わさって固定の一助とする構造物の間の間隔がちょうど液晶パネルの横幅と同じになっていて、そこを手がかりに削ればうまくいきそうです。
成形時の構造線のようなものがうっすらありますので、そこを目安に削っていくことにしました。
…とまぁ、こんな感じ(削ったところが全部黒なのでわかりにくいですが)。ABS樹脂でしょうかね? 柔らかい材質なので削るのは比較的楽かとは思いますが、やりやすい場所というわけでもなく。
表からはこんな感じです。開口部に対して画面がひとまわり小さく収まってますね。ただその分左右に隙間があります。それとベゼルの幅の都合で、上に寄ってしまってます。
表示用制御基板は、両面テープで液晶パネルの裏側に貼り付けてあります。熱に対してはあまり良くないかも…てのはさておき、パネルがいい感じに収まっただけで固定してません。それに銀色のベゼルが目立って興ざめです。そこで固定ついでにベゼルを隠せるよう、基材とか支持体とかいうそうですがテープ本体が黒色の両面テープを用いてパネルを貼り付けてしまいます。
ベゼルと周囲の形に合わせてこんなふうにテープを貼り付けて…。
貼ったテープが目立たぬよう、また裏側に出っ張ったりしないよう薄くて黒色の両面テープを探したのですが、なかなか売ってないものですね。薄すぎると透けてベゼルの銀色が見えるでしょうし…。灰色で妥協するかと一時は考えましたが、透かしてみるとやはり銀色並みに目立つ…。そんなわけで採用したのは日東電工のNo.5713 、厚さ0.33mmの黒色両面テープです。
フレームにはめ込んで、両面テープで接着。
バックライトの光が両面テープから透けたりしないよう、裏からSugru で詰め物をして塞ぎます。ついでにフレキシブル基板がバネになってパネル裏面に貼り付けた表示基板が跳ね上がってくるので、Sugruで固めてしまいましょう。
ベゼルを隠すために黒色の両面テープを使いましたが、それでもフレームや液晶パネルとのコントラストが気になる…それに液晶パネルのバックライトが明るくて、brightレベルが高いような気がする…というわけで、元々添付されてるスモークのフィルム(CRT前面にはめるもの)に代えて、もう少し濃い色のものに交換します。
出来上がりはこんな感じ。いい雰囲気ですね!
無線LANとBluetoothを同時に使うためのUSBハブ。見た目に外付けしないで使うためには、当然外に向かってるUSBコネクタ経由ではダメなので、ハブをRasPiに直結するしかないってことになります。ライトアングルからストレート形のコネクタに交換してしまうという考えもないわけではなかったのですが、そもそもライトアングル形以外のコネクタを取り付けられるパターンにはなってないんですから、変に工夫するよりは直結の方が簡単です。
また液晶モニタキットはコンポジットビデオ接続ですから、通常はミニジャックから適当なケーブルでつなぎますけれど、一旦外に出るとか不格好ですのでこちらもミニジャックを使わず直接取り出したい…とするなら、RasPiを加工しなくてはなりませんね。まぁそう思って、PasocomMini
MZ-80Cの入手よりずっと前にRaspberry Pi A+、つまり製品に内蔵しているものと同じのを改造用に別途入手していたんですけれど(Raspberry
Pi Zero Wの方が性能も良いしBluetoothも無線LANもあるので工作には都合がいいんですが、ガワだけでなく中身も使って改造したという体裁にこだわりたかったので)。
ということで、慎重にUSBとミニジャックを取り外し。GNDの端子は熱量的にしんどいので、あまりこだわらずに。
USBハブのケースを割って中身を取り出し、USBコネクタを取り外した後フラットケーブルの切れ端を利用して直結します。ちゃんと接続されているか、実際に動作させて確認。
USBハブはいわゆるCRTフードの中に収めますので、あまり大きくないものをといろいろ探したところ、かつてセリア で売っていたという2ポートハブを使うことにしました。私はビット・トレード・ワン のUSB2BT組み立て済み版に同梱されていたものから拝借したのですが、返そうとセリアに行ってみたらもうその姿はなかったという…。
実は液晶モニタキットの電源仕様が12Vだと思い込んでいて、二系統の電源を接続しないといけないのはスマートじゃないので、基板を乗っけて12Vから5Vを作ってこれをRasPiの電源にしようと思っていたのです。そのための部品も準備はしていたのですが、サイトの説明や基板のシルクをよく見ると5Vでもいけると書いてあるじゃないですか(必要な電流量は増える)。これで少し工作が楽になりました。
それでも、ある程度パーツを取り外したりできるようにしておかないと使い勝手が悪くなるのと、電源以外にも載せたい部品がありますので、基板を一枚増設することにしました。
普通のRasPi用工作なら、しかもA+なら基板の大きさはあまり気にしなくてもいいところなんですが…公式ツイッターアカウントが当時公表していた写真には気になるものがありまして…。
ダミー画面フレームを取って中を見てみると、下の筐体が少し内側にはみ出るというか、せり出しています。本物も似た感じなのでその点ではニヤニヤできるポイントなのですが、工作のことを考えるとRasPi基板にやや被ってるのでスタック(上に載せる)基板の大きさに配慮が必要です。
この被ってる部分、ナナメに傾いていますので(MZ-80シリーズのボディ部分って、くさび形になってましたよね)この上に基板を乗せるとかいう手も使いにくいと思います。
裏から見てみると、HDMIコネクタの上に被ってる領域が意外に大きいのです。ちょっとした盲点ですね。
RasPi基板の固定位置とCRTフードの大きさの都合なので仕方ないんですが、GPIOコネクタの一部が筐体に当たっちゃうんですね。そのために筐体に切り欠きが設けられています。ここに被ってしまうGPIOの端子は4つ分。ちょうど5Vの電源が出ているところです。
PasocomMiniの売り文句としては、SmileBASICでもサポートしているところからGPIOを使った工作や制御も楽しめる…ということだったんですが、コネクタが素直に載らないのはちょっと辛くないですかね…。
というわけで、筐体の上側を閉じても干渉せず、かつコネクタの干渉も考慮したスタック基板を作らなければなりません。GPIOの干渉する部分はコネクタをつけないでおこうかと一瞬考えたりもしましたけど、載せる部品はやっぱり5V電源を使用しますので…。
もういろいろ部品が載っててちょっと見にくいですが、基板全景はこんな感じ。コネクタ部分だけ20ピン幅で、その他は18ピン幅としました。奥行もあまり欲張らず…。
そのままでは上記の切り欠きでクリアしきれず、当たってしまい筐体を閉じることができません。なのでコネクタとその上の基板をゴリゴリ削り…ちょっと段差がついて削られてる感じ、わかりますかね?
なんとかこれで閉じられました。本当はコネクタの端がフードのところに当たってるんですが、わずかに筐体をねじれば避けられますのでこれでいいかなと…。
どーんと白いUSBハブが立てて載せられてあります。これは両面テープで接着しました。当初は基板が裸の状態で寝かせてあったんですが、閉じる時に上の筐体に引っかかってしまったので、やむなく立てた次第。
それとこの写真では隠れてるのですが、増設基板を支えるのにスペーサを両面テープでRasPiに貼り付けてあります。
音は、PasocomMiniとしてはHDMIからも出せますけれど、この工作では使ってませんからミニジャックからの出力ということになりますね。RasPiの音声出力は二系統のPWM出力をステレオとして利用していますが、ネットで探すとGPIO端子に出力を変更して、基板にアンプ回路を構成する…というのが工作として一般的のように見えます。
しかしよくよく読めば、電源投入時とかのノイズが大きくて、それを回避するためのフィルタ回路が工夫のポイントらしく…面倒なのでいろいろ考えた末に、どうせそのフィルタ回路に相当するものがRasPi上に載っているのだからそこから引っ張ればいいじゃん、という結論に至りました。「そこ」ってのはビデオ出力と同じくミニジャックのところですね。出力レベルはヘッドホンかラインぐらいでしょうから、スピーカで鳴らすためにアンプ回路は必要です。
初めはもっと単純に、トランジスタ二つでアンプを構成していたんですが全く鳴らない…よく考えたらその回路はDC成分が含まれてるはずの信号を増幅してて、RasPiの音声出力は取り出したところで既にDCカットされていますので、それで動かないんだろうと…。
急遽調べて、「簡単なスピーカーアンプ 」というページから回路を拝借して(コンデンサの値だけ、手持ちのものから選んだのでそのままではない)、ようやく鳴りました…LM386N、たった1個だけよく持ってたな…。
ひとまず基板上に全部収めるつもりで超小型スピーカをつけています。結構な音量で鳴ってくれますが、低周波領域の再生は弱いかな…。
取り急ぎ組み上げた時、音を鳴らしてみるとLCDのバックライトが一瞬消えたり、そのうち無線LANが途絶したりなどシステムが不安定になる現象に出会いました。なんでかなーといろいろ考えた結果、電源の電流容量が足らなくなってるのかもしれんと思い当たりました。以前RasPiに無線LANなどを直挿ししてると動作が不安定になるので強化対策が必要 と話題になったことがあったんですよね。この時は加工を後回しにしても支障ないと判断して電源供給を元の仕様通りのmicroUSBコネクタ経由にしており、ACアダプタはRasPi3対応の2.5A品だったのですけどあまり意味がなかったわけです。
背面開口部を閉じる都合で元々予定していたんですが、電源をUSBコネクタ経由でなくACアダプタから直接供給するようにコネクタを設けました。本物ではACコードを差し込むあたりの場所に小さい穴を開けて、それっぽく電源コードが出てるみたいに。
この加工でLCDのバックライトが点滅するとかの現象は発生しなくなりました。無線LANのトラブルの方は別の原因でしたが…。
さきにLCD表示基板から取り外したコネクタをこちら側に移植。端子ピッチが狭い(シュリンクピッチ?)のでナナメに置きました。
でも今にして思えば、あまり意味なかったかもしれないなぁ…表示基板側にコネクタがついたままでも、なんとか余裕があるみたいだから…。
OSは特に凝ったものは使用せず、RaspbianのLite版(2017-09-07)を使っています。エミュレータはX環境ではなくコンソールアプリケーションとして動かすため、GUIは必要ありませんからこれで十分です(全部CLIで設定するのが面倒だけど)。特殊なのは画面出力ぐらいですが、こんな感じで設定しました。
PasocomMini MZ-80Cの製品としての特徴がSmileBASIC+並列で動くMZ-80エミュレータということだったんですが、やはり一般の商品としてはエミュレータ部分に制約が生じるのも仕方なく、テープ周りの動作とか、当初はPCGさえ搭載されないという話さえありました。満足いかない仕様なら自分でエミュレータを用意するしかないですよね!
とは言えゼロから作るのはしんどすぎる話で…なら既にあるものを移植するのが早い、と武田さん のCommon Source Code Project を覗いてみるも…こらあかん、どこから手をつけて良いものやら…。
ならば、と実は少し前からちょくちょくソースを眺めていたまるくんのMZ700WIN を使わせてもらうことにしました。レトロPCのエミュレータとしては比較的初期の作品なので、例えば画面表示データ作成ではインラインアセンブラを使うなど当時やや足らなかったパフォーマンスを稼ぐための工夫などがあるものの、エミュレータの基本構造を勉強するにはちょうど良い量のソースなので、わりとオススメだと思います。
移植作業はこんな感じになりました。
使えないのはOSからのイベント(キー入力やメニュー)、画面描画、サウンド。Windowsにまつわる機能や呼び出しはザクザク削除したりコメントアウトしました。
元はMZ-1500のエミュレーションまで実現していますが、MZ-80の機能だけあればいいのでこちらもザクザク切り捨て。
MZ-700の機能もメモリバンクやカラーアトリビュートなんかは不要ですので削除しました。メモリマップドI/Oにある8255や8253なんかはほぼそのまま使えます。
キー入力はLinux Input Subsystemを利用し、サウンド出力はPWMを利用。画面はフレームバッファをそのまま使ってます。SDLとかでGPUを使わないとパフォーマンス出ないんじゃないかと思ってたんですが、全くそんなことはありませんでした。
Z80エミュレータ、PCGはそのまま使えました。
ROMやBASICにパッチ当てせずにCMTのアクセスを可能にするため、内部でMZTフォーマットを展開してCMTとテープのエミュレーションも行うようにしました。さすがに実時間をかけてロードとかするのはかったるいので、テープ動作中はエミュレーション速度を高速化させています。
元のMZ700WINはWindowsアプリなので、ウィンドウのメニューでいろいろ操作できますがこのエミュレータではそうはいきません。テープイメージの指定やPCGのオン・オフなど、製品としてのPasocomMiniなら画面にメニューを出して…という方法で解決していますがこちらはCGA並みの解像度にコンポジットビデオではとても実用的な視認性があるとは思えず…。
そこで考えたのが、Webによるユーザー・インターフェースです。幸いにしてRasPiはLinuxマシンですから、Webサーバには簡単になれます。あまりインタラクティブな操作性は望めないかもしれませんが、最近のWeb技術の活用で結構面白い物ができるような気がします。それにWebからコントロールできるならスマホとかの画面でも操作できることになりますよね。PasocomMini
MZ-80Cを改造する目標のひとつが「動かせる置物を作る」ということでして、デモとかを動かすだけなのにわざわざキーボードを接続してガチャガチャ操作するってのも大層ですし、スマートにいきたいですよね。
プログラムですが、エミュレータに外部から制御を可能にする切り口を設けて、それとWebサーバを兼ねたPythonスクリプトが通信します。このPythonスクリプトがユーザーのWebブラウザに送り込んだJavascriptと通信して、ボタン操作などのユーザーの指示を受け取るわけです。作り始めた時点ではPythonもJavascriptも(ついでにCSSも)ほとんど初心者なので、ドキュメントと首っ引きですわ…。
なおWebSocketやCSSグリッドなどを使っていますので、かなり新しいブラウザでないと表示・操作できないかもしれません。当方はPCではFirefox57、スマホではChrome64で確認しています。
エミュレータの操作画面は、Webブラウザで「http://RasPiのアドレス:8080 」にアクセスするとそのホーム画面が現れます。
これがホーム画面です。簡単な操作ができるよう、見せたいもの・載せたいものを最小限に並べたつもりなんですが、かなり長くなっちゃいましたね…。
STATUS
MODE … 現在動作しているMZの設定名称が表示されます(CONFIGURATION画面で説明)。
MON … 使用しているモニターROMの名称が表示されます(DATA BASEで説明)。
CG … 使用しているCG ROMの名称が表示されます(DATA BASEで説明)。
CMT … セットしたテープイメージの名称が表示されます。
LED … カナ/英数LEDの状態が色で表示されます。 エミュレータのLED表示状態が変更されたら即座にこちらに反映されるようにしてありますが、いかんせんスクリプトとWebですので反応時間が短くなく、たまにゲームなどで激しく点滅するのがあったりしますが、時には取りこぼすこともあるかと思います。
テープの走行状態が表示されます。動作中は水色、停止中は灰色として表されます。
OPERATION
CPU … Reset Z80をリセットさせます。本当にリセットするか確認のダイアログが表示されます。
PCG … PCG表示のON/OFFを切り替えます。
Input … キーボードから入力したように1行の文字列を入力する欄です。入力できるのは英数字と記号です。この欄にフォーカスがある状態でEnterキーを押すとそのまま、横のCRボタンを押すと行末に改行が付加されて入力されます。
LOAD /RUN /GOTO$ … よく使うであろうコマンドをInput欄に1ボタンで入力できるボタンです。
BREAK … BREAKキーを入力します。SHIFTと併用した状態で入力されるようにしてありますので、BASICプログラムを止めるのにも使えます。
CLR /HOME /INST /DEL /矢印 編集キーです。多少のカーソル移動とか書き換えに使えます。
キー操作機能は簡易的なものですので、例えばオートリピートとか凝った動きにはなりません。あまり過大な期待はしないでください。
CMT
STOP /PLAY /EJECT … CMTを操作するボタンです。
Attr … 登録してあるテープイメージに付与してあるアトリピュートを選択します。変更するたびに下の選択ボックスの内容が入れ替わります。いわゆる絞り込み検索っぽい使い方になっています。
Image Name … 登録してあるテープイメージの名称を選べます。SETボタンを押すとマウントされ、ステータスのCMT欄にその名前が表示されます。
Author /Source /Text … 登録してあるテープイメージに付与してある説明情報が表示されます。テープイメージを選択するときの補助として使って下さい。
SYSTEM
REBOOT … Raspberry Piをリブートします。
SHUT DOWN … Raspberry Piの電源を遮断できる状態に移行させます。
メニューアイコン
メニューを表示します。
リロードアイコン
ページを再読込します。ブラウザの再読込と同じです。
メニューの「DATA BASE」をクリックすると、エミュレータで扱うプログラムデータを登録する画面に変わります。
これがDATA BASE画面。CMTにセットしてロードするテープイメージと、ROMイメージデータを登録します。
タイトル下の青い字で書いてあるところはデータベース操作に関する結果を表示します。
DATA BASE
Select Function … 新規登録(New...)かデータ修正(Edit...)かを選びます。
Image Name … データの名称を入力します。他のデータと同じになってもかまいません。
Type … データの種類を設定します。CMTにセットしてロードするタイプはMZTで、メモリにマップされて使うもの(モニタROMとかCG-ROM)はROMとしてください。
Attr … MZTデータの属性を設定します。OBJはマシン語プログラム、BTXはBASICプログラム、BSDはシーケンシャルデータ、Otherはそれ以外です。まぁBSDは今のところイメージデータの形式さえ定義されていませんから飾りみたいなものですが…。
Author … 作者またはメーカーの名称を入力する欄です。
Source … 掲載雑誌や提供元などの情報を入力する欄です。
Text … ソフトの説明などを入力する欄です。Author以下三項目は自由入力欄で、入力してもしなくてもどんな内容でもかまいません。ただ名前は同じだが作者が違うなど古典作品にはいろいろありますから、そういったソフトの区別に使えるのではないかと思います。
DELETE /CANCEL /SAVE … それぞれ削除/入力取り消し/登録するボタンです。その時有効なボタンだけ押せるようになっています。
「Select Function」で「New...」を選択すると、「Select File」としてファイル選択ボタンが現れます。ここでローカルのファイルを指定すると、情報を簡易的に解析してMZTファイルだった場合は名称とアトリビュートが、それ以外だとファイル名などが自動的にセットされます。TypeやAttrの項目が誤認識されていることもあり得ますし、名称も日本語とかだと「読めるだけマシ」レベルの抽出になりますので、適宜修正してください。
なお拡張子が「MZF」であるファイルを指定すると、海外で使われていたファイルであると考えて輸出仕様のASCIIコードを用いて抽出します。
一方「Select Function」で「Edit...」を選択すると、これまで登録しているデータの一覧が「Select name」の選択ボックスに現れます。編集したいデータを選んでSELECTボタンを押すと、現在の登録内容がその下に表示されます。これを編集して上書き登録してください。
データの新規登録では、ファイルをひとつずつ指定しては登録して…とやってたら面倒くさいですよね。そこでファイル選択のダイアログにて複数のファイルを指定して、一度に登録することができるようになっています。その時各データの情報を入力していくことはできませんので、自動認識する内容以外は空欄で登録されます。自動で入力された欄以外、それともし誤認識された項目があれば後から編集して修正してください。
メニューのCONFIGURATIONをクリックすると、エミュレータの設定を登録・操作する画面が現れます。
こちらがCONFIGURATION画面です。エミュレータの動作に必要なROMや画面色設定の組み合わせに名前をつけて保存し、起動時または一時的に呼び出してその内容をもとにエミュレータを設定します。
DATA BASE画面と同様、タイトル下の青い字で書いてあるところはデータベース操作に関する結果を表示します(設定もデータベースに保存しているのです)。
CONFIGURATION
Select setting … 既に登録している設定を編集・設定のために呼び出します。選択ボックスから選んでRECALLボタンを押すと下に設定内容が表示されます。
Label Name …設定につける名前です。
Monitor ROM …モニタROMとして使用するデータを選択します。DATA BASE画面にてROMタイプとして登録したデータの一覧から選べるようになっています。
CG ROM …Monitor ROMと同様、CG ROMとして使用するデータを選択します。
CRT Color …白黒(B/W)かグリーン(Green)を選べます。
Start Up …起動時に適用したい設定には、ここをYesと選択しておきます。後で別の設定にYesを入れたら、以前Yesになっていた設定は自動的にNoに変更されます。
DELETE /CANCEL /NEW SAVE /UPDATE … それぞれ削除/入力取り消し/新規登録/上書き登録するボタンです。その時有効なボタンだけ押せるようになっています。
APPLY …今画面上に表示されている組み合わせ(モニタROM/CG ROM/CRTの色)にてエミュレータを再設定・リセットします。これは一時的な設定なので、電源を切れば消えてしまいます。
Web画面を使ってどのようにエミュレータ本体と連携しているか、試作段階のものですが動画にてご覧頂きましょう。テープイメージをセット(この時は絶対パスを入力している)し、LOADコマンドを入力して、PLAYボタンを操作。ロード終了後PCG表示をオンにしています。ロードしたのはマイコンソフトのパックマン(PCG版)。これプレイ画面が90度横になっちゃう以外は良い動きをしていて、実は非PCG版でも雰囲気たっぷりなんですよね。
VIDEO
まずはROMデータと起動後ロードするシステムを用意して下さい。本体のROMや付属テープをイメージ化するのが理想的ですが、ない場合でもなんとかなったりします。
モニタROM … MZ-NEW MONITOR (ZIP)を利用します。mz_newmon.zipを展開して、ROMSフォルダに入っているNEWMON.ROMが目的のデータになります。 CG ROM … emuフォルダにfongten.pyというフォント生成スクリプトを用意しました。同じくemuフォルダにあるmz80fon.txtから「python3
fontgen.py mz80fon.txt」と実行するとfron.romというファイルができますので、これをブラウザのあるPCなどに転送して登録してください。 BASIC … Vectorの「KM-BASIC for MZ-80K/MZ-700 」からダウンロードしてください(kmb???.zip)。入手したZIPファイルに含まれるrelease.mztが目的のデータになります。 ゲーム … ありがたいことにタスクフォーツ高知から発売されていた「ワンダーハウス」 (ZIP)がダウンロードできる他、雑誌「PiO」に掲載されたシューティングゲーム「ZEPLIS」シリーズ もダウンロードできます。
プログラムはリポジトリ の「Clone or download」をクリック→Download ZIPをクリックでZIPファイルをダウンロードし内容を転送するか、RasPi上でGitが使えるなら
>git clone https://github.com/NibblesLab/mz80rpi.git
とすれば現在のフォルダにプロジェクトが展開されます。
次にエミュレータ本体をコンパイルします。
>cd mz80rpi/emu/z80
>make
>cd ..
>make
本当はmakeを一発だけで済ませたいのですが…まだうまく使いこなせておらず…。
さらに、PythonスクリプトにてTornadoというフレームワークを使用していますので、pipコマンドにてインストールします。
>pip3 install tornado
Pythonスクリプトとエミュレータ本体を起動(アーカイブにstart.shというシェルスクリプトを用意してありますので、実行属性をつけた上で走らせてください)して、しかるのちにブラウザからあくせすすれば上記の画面が現れるはずです。なおPythonスクリプトが読み込まれてアクセス可能になるまで少し時間がかかりますので、ページが存在しないとかエラーになってもリロードすれば大丈夫だと思います。
最初は何もデータがない状態ですので、画面も真っ暗です。次の手順で動かせる設定を作っていってください。
DATA BASE画面にて、モニタROM・CG ROM・各種ソフトを登録します。
CONFIGURATION画面にて、モニタROMとCG ROMの組み合わせと画面の色を決め、スタートアップをYesにした設定を作ってください。ACCEPTボタンでその設定でのエミュレータが起動します。
HOME画面でプログラムを指定し、ロードすれば使えるようになります。
なお、キーボードの配列はemu/key.defにて決定しています。設定ルールはMZ700WINと同じですが、メニューから選択するとかいうような機能はないので、設定は一種類のみとなっています。
エミュレータとしては、まだやりたいことが残っています。今後の予定としては…。
キーボードの各キーの割り当て。今は暫定的にMZ700WINと同じくkey.defを使用していますが、わかりにくいのでUIで設定できるようにしたい…けど汎用化を目指すと複雑になっちゃうんですよね。どうしたものか…。
ゲームパッド対応。キーボードはキー割り当ての問題でゲームでは使いにくいことが多く…いやMZ実機では問題ないんですが、当時「器用に動かせる右手で操作する(注:もちろん右利きのみの想定)」考え方が多く青いキーに移動キーが割り当てられてるゲームなんかが多くて、その場合109キーボードとかではテンキーの数値部分でもない中途半端なところが相当するなんてことも当たり前で…ゲームパッドで遊べたら嬉しいですよね。ただこれもLinuxで認識したジョイパッドの動きをどう取り込むかとか課題が多いのです…。
画面のノイズ。表示と同期を取らず画面に読み書きアクセスを発生させたら、ノイズが出たのですよ。これを再現させたい…いや自分の趣味でしかありませんが、次の項目とつながっているんです。
MZ-1200・80A対応。機能的には少し拡張すれば実現できるんですが、こいつらには「画面アクセス時にウェイトが発生する」ようになっていてノイズが発生しないんです。そのタイミングをとったりする動作が80K/Cでのノイズ出力実現と近いものがあるのです。
音の出力。今はエミュレータの構造上、PCMっぽい音は不得意だと思うんですが(未確認)、ちゃんと出力させようと思うと連続的に途切れることなくスピーカを振動させないといかんと思うんです。今はPWMで設定した周期にて出力させてるわけですが、PCM的なやつはソフトでタイミングをとってON/OFFさせてるわけで…これをどのように解決するか。目標はOh!MZ誌に掲載されたキャリーラボの三重和音演奏プログラムが正しく動作することです。
さて果たしてどこまでやれるかな…。
戻る