MZ-700フルJavaScriptエミュレータ
フルJavaScriptのMZ-700エミュレータ。 SHARP往年の8ビットマイコン MZ-700 をブラウザのJavaScriptで再現してます。 モニターROMはMZ-700用 NEW MONITORを使用させていただいています。
ブラウザは、動作速度とその安定性から Chrome をおすすめします。 他のブラウザでは画面更新とエミュレーションが上手く同期しないケースがあります。 Z80命令サイクルを正確には再現できていないので速度にムラがあります。 正確なエミュレーションは、まるくんさんのWindows向けエミュレータ MZ700Win が、お勧めですよ。
エミュレーション対応表(概要)
キーボード | ○ |
---|---|
BEEP音 | ○(※1) |
データレコーダー | ○(※2) |
PCG-700 | ○ |
プロッタプリンタ | × |
MZ-1500全般 | × |
- ※1 BEEP音:○
- 音程は正確ですが音長に揺れがあります。またオリジナルの音質は再現できていません。
- ※2 データレコーダー:○
- モニターのSコマンドでメモリ領域をセーブするとMZTファイルをダウンロードできます。
リポジトリ
更新履歴
- 2017-08-13 - npm mz700-js v0.7.15 に更新。
- MZTドロップ時に逆アセンブルせず即実行するようにしました(画面を一定時間ブロックしてしまう為)。
- 逆アセンブルするにはCMTのファイル名表示エリアに現れる「Disassemble」ボタンを押して下さい。
- アセンブルリストをタブらしく表示。
- 2017-07-16 - npm mz700-js v0.7.10 に更新。
- アドレス指定でメモリダンプの表示ができなかった不具合を改修。
- 画面幅が狭くなった時に各ウィジェットの表示崩れを抑制。横スクロールします。
- 速度制御のスライダーをひとつに削減。
- アセンブリソースの表示切り替え速度を改善。無駄なアセンブルを抑制した。
- アセンブルと同時に実行されしまう不具合を改修。
- その他デザイン的な変更など。
- 2017-06-25
- npm mz700-jsの v0.6.2に対応しました。
- BEEP音のポップノイズを低減しています。
- オシレータの波形を従来のサイン波から矩形波に変更しました。 実機がないのでなんとも言えないのですが、矩形波の粒が細かすぎるのか音が軽いように思います。
- Chrome以外のブラウザでの動作に関して: Firefox、Edgeでは、きれいに動いていないようです。 動作速度のムラがひどいのですが、しばらく放置していると安定します。 また、サブスレッド側でのエミュレーションで使用しているタイマーのセッティングが上手くいっていないようです。 ブラウザ別に「正しい」設定を行うとある程度高速でスムーズに動くようになるようです。
- 2017-02-19
- リセット動作が正しく動くよう修正。画面をクリアしてモニターが再スタートします。
- キーボードから実行、停止、ステップ実行等、操作できるようにしました。 CTRL+F9で停止、CTRL+F8で再開、CTRL+F11でステップ実行。
- Chromeのみですが3つのスライダーで実行速度の制御が可能です。
各スライダーは、それぞれ以下の値に対応しています。
- エミュレーションに使用するインターバルタイマーの個数
- タイマー処理一回で実行するZ80命令数
- タイマーのインターバル
- 2017-02-14 「XEVIOUS for 700」で使用されているIXH,IXLレジスタ関連のZ80未定義命令に対応しました(全てではありません)。 ただし現時点でXEVIOUSは正しく動作していません。 その他、OUT命令を実行するとブレークがかかっていた不具合を修正しました。
- 2016-11-13 モニタープログラムの'S'コマンドに対応。MZTファイルをダウンロードできます。 1200HからのPCGを使用したサンプルプログラムをダウンロードするには、下に記述している方法でアセンブルを行ってから、 モニターで、*S1200,125F,1200,PCG-CURSOR-MZ[CR]と入力し、 RECPLAYボタンを押せば、データレコーダーにメモリの内容が保存され、ダウンロード用のリンクが表示されます。 このファイルをMZ700WINで読み込ませて、先週追加したPCGのエミュレーションが正しく行われていることを確認しました。
- 2016-11-06 HAL研究所のPCG-700のエミュレーションを追加しました。(npmのバージョンはv0.1.8) しかし当方PCG-700の対応ソフトを持っていなくて実機もないので、本当にきちんと動作してるかどうかは未確認です。 理解している仕様に従い、カーソルのパターンを書き換えるプログラムを1200H 番地に置いています。 初期状態ではアセンブルされていないので「Assembly Source」内の「Assemble」ボタンを押して、 モニターで「G1200[Enter]」と入力すればカーソル形状が変わります。
- 2016年9月 紅茶羊羹さんのサイト We &HEART; Love MZ-700 からダウンロードできるZEPLISシリーズのロードボタンを追加しました。 最後まで完全に動作するかどうかは未確認です。
- retropc.netで公開されているタスクフォーツ高知殿の、 ワンダーハウスとビルディングホッパー が動作していますので、それぞれ読み込みボタンをつけました。
-
&face; 2016年9月3日(土) 22時34分56秒 &filledface;
また゛ しけんちゅう て゛すか゛、 HTMLのテキスト を MZ-700 てき な か゛めん に へんかん する きのう を ついか しました のて゛、 とりあえす゛ かいて おきます。↓↓↓↓↓
&ufo;&ufo;&ufo;&ufo; MZ-700 に ふかのう は ない &ufo;&ufo;&ufo;&ufo; - 2016-09-02 スクリーンキーボードのレイアウトをなんとなく一般的なキーボードの配列に合わせました。 MZ-700キーマトリクスの並びはキー入力の機構を知るには有用だと思っていましたが、実際だれも得していない現状を直視しての対応です。 あとUIオブジェクトのキャプションが英語に。単純に手が滑った結果です。 対応する npm mz700-js のバージョンは v0.1.6 です。
- 2016-08-14 transworkerの修正によって、Edgeでも動作するようになりました。 しかし非常に低速です(Chromeの半分ぐらいの速度)。 また、音は出ますが何やらタイトルバーの部分が忙しい状態です(笑)。 動作しなかった原因は、WebWorker側でのグローバルコンテキストのコンストラクタ名が、他のモダンブラウザと違っていたこと。 対応する npm mz700-js のバージョンは v0.1.5 です。
- 2016-05-03
不具合修正:VRAMの裏画面側が更新されたときに停止していた不具合がありました。
4月の更新で入れちゃいました。失礼しました。
これにてZ80エミュレーションの実装はひと区切り。
ビルディングホッパーの色ズレが残っていると思っていましたが、どうやらこれは正しい動きのようです。
AKDさんのサイトで、
同じ色ズレが発生している画面があって、
改めてBdの説明書を読み直してみると「使用するMONITORによっては色がズレる」と書かれていたんですね。
それでも、まさかと思ってMZ700Winで試してみたら、確かに同じところでズレ発生。
タイトルループの最初はズレないため、今年の初めに確認したときに、ズレはないと思い込んでしまったようです。
ということで、他の不具合は残っている可能性がありますが、
基本的なZ80のエミュレーションは完了していたと思ってよさそう。
次は、カセットテープのエミュレーションですな。
それとMicrosoft Edgeで動かすのもやんなきゃ。 - 2016-05-02 画面周りの整理と修正:
REFUGEEの2回目の補給時点で停止してしまう問題が、いつのまにか解消していた模様。
ビルディングホッパーのタイトル色ずれ問題、そもそもNEWMON7のモニタサブルーチンでアトリビュートがスクロールされていないことが判明。なにか機種判定みたいなことしているのかな? - 2016-04-17 ループ関連命令の処理をまじめにエミュレート。この結果、処理速度が若干遅くなっています。 あと、一般的には、あまり使われていないようだけど、インデックスレジスタ関連(DD CB ... / FD CB ...)の命令のエミュレーションと逆アセンブルの不具合を改修。かなり恥ずかしい凡ミスだった。 その他、画面表示要素を折りたためるように変更し、Node.jsによるテストルーチンの増強、そして全体的なリファクタリングを行った。ビルディングホッパーの色ずれ問題は解消してない。
- 2016-03-29 MZTの読み込み時間を改善。サブスレッドで実施&無駄なアセンブルを削除
- 2016-03-28 IE11で動作するように修正(ただし音は出ず、かなり低速)
- 2016-03-27 音量調節・ミュート機能
- 2016-01 エミュレーションのサブスレッド化
- 2016-01 サウンド機能実装
- 2015-12 割り込み実装、周辺ICのエミュレーション
- 2015-12 MZTの読み込み
- 2015-08 WEBで公開
- 2014 エミュレータ中心部分作成
TODO
- 改善:デバッグ機能の充実、レジスタ表示とメモリのダンプリストが使いにくい&活用できていない
- 未実装:IE11でのBEEP音出力
- 未実装:プロッタプリンタへの対応
- 未実装:MZ-1500のエミュレーションへの対応
参考サイト
- 8ビット CPU Z80命令セット
- Z80 Code Refference
- Programming mz700
- 8255 functions in the MZ-700
- MZ-700のI/O($FE,$FF プリンタインタフェース)
雑記
貴重な体験
2016年1月25日、仕事帰りの電車のホームで、MZ-1500の情報が豊富な 「AKD's site」さんから、 ご丁寧なご連絡をいただいて、本サイトへリンクしていただきました。 (壮々たる諸先輩方のサイトが並ぶ中で恐縮です)
MZ-700と同じくMZ-1500も、中学から高校生の頃の自分に、 いろんなものを与えてくれた思い出深い機種でした。 音楽(和音の構成とコード理論)や三次元グラフィックへの興味、 物理シミュレーション、人工知能などの科学的知識や体験など全てが、 現在の「作ることは、楽しいな」という感覚に結びついています。
今の自分の根っこを構成しているものは、ほとんどMZが与えてくれたんだろなーなどと、 AKDさんとスマホでやり取りをしている電車の中で感じてました。ああ、懐かしい。
経緯とか
構想は2014年から。でも本格的にやり始めたのは、2015年の7月頃かな。
そもそも MZ-700 をエミュレーションしたかったのではなく、ゲームがしたいわけでもなかった。 単にブラウザで動作するZ80CPUのエミュレータを作りたかった。そういうのあれば、ちょっと楽しいかもという程度。
しかし、レジスタと、メモリの内容が16進でダンプされているだけではちょっと弱い。 画面や周辺の入出力装置で可視化する必要はあるだろうと。 そう考えたときに「かつて知ったるMZ-700」となったわけ。
MZ700のハードウェアに関して、正確な知識はありませんでしたが、 幸いオーナーズマニュアルが手元にあったので良かったです。 本体が行方不明なのが気になりますが。
いくつになってもお勉強
古くからJavaScriptを使っているけど、新たな概念や手法に対する貪欲さがなくなってきて、 しかも、ある程度、後方互換性が確保されているから、レガシーな方法でもそんなに困らずなんとか書けてしまう。
ところが、こんなのを作ってみると、さすがに最新の手法を使わないと、音やグラフィック、それからスレッドなど、 どうにもならないケースが出てきて(汗)。 しかし、やってみたら意外に簡単だったと気付いたりして、いくつになってもお勉強です。