歓迎光臨
"EmuZ-700" - SHARP MZ-700 emulator for Win32
"EmuZ-800" - SHARP MZ-800 emulator for Win32
"EmuZ-1500" - SHARP MZ-1500 emulator for Win32

"EmuZ-700" is SHARP MZ-700 emulator for Win32.
"EmuZ-800" is SHARP MZ-800 emulator for Win32.
"EmuZ-1500" is SHARP MZ-1500 emulator for Win32.
These softwares are under GNU GENERAL PUBLIC LICENSE.

These softwares require Windows 2000/XP/Vista/7.

Download: Jump to Common Source Code Project



EmuZ-700 謎WIPページ
EmuZ-800 謎WIPページ
EmuZ-1500 謎WIPページ

アイマスオープニング専用のバイナリはこちらです。
音周りが標準のものと異なっています。
2008/8/16のバイナリから統合されました。

まるくん紅茶羊羹さんAKDさんに感謝と尊敬の念を捧げます。



2017/4/15
各機種において、CPUクロックおよび垂直同期周波数を、より正確な値に修正しました。
また、紅茶羊羹さんの調査結果に基づき、SN76489のI/Oウェイトをサポートしました。



2016/1/10
MZ-1500において、漢字サーマルプリンタ MZ-1P17をサポートしました。
なお、ディップスイッチSW1-4はONの状態となっています。
また、出力したデータをそのままバイナリファイルに出力するダミープリンタをサポートしました。



2015/12/20
PCG-700の上位128文字の書き込みの問題を修正しました。



2015/3/4

MZ-700において、PCG-700をサポートしました。
…なんでサポートしてなかったんだっけ?


PCG-700を無効にすると、こんな感じになります。



2015/2/21

MZ-1500について、画面を回転する機能をサポートしました。
実質、紅茶羊羹さんの勝手移植のドルアーガの塔の専用ですね。

以前から実装する約束だったのですが、別件で画面周りの実装を見直すつもりで、
結局ずるずると先延ばしになってしまっていました。

コードを整理をしたので、他機種でも縦画面をサポートするのは簡単です。
必要そうな機種がありましたら、お知らせください。



2015/1/19
EmuZ-2500と同様に、Z80SIO周りを修正しました。
Z80SIOの送受信クロックに、正しい周波数を指定するように修正しています。



2014/12/29

MZ-1R23(漢字ROM)およびMZ-1R24(辞書ROM)をサポートしました。
また、ステートセーブに対応しました。



2014/12/23
クイックディスクを交換した場合に、一部内部フラグを初期化するようにしました。
中途半端に読み書きしてディスクを交換したときに、以後の動作が安定化しているかもしれません。



2014/4/17
Norix様のVirtuaQDの*.QDF形式を仮サポートしました。
GAPやSYNCなど、折角正しいタイミングで吸い出されているのをちっとも生かせていませんので、
現状では仮対応ということにします。

ロードする分には問題なく動作しているかと思います。
ディスクを書き換えた場合は、QDF形式ではなく、MZT形式に変換して保存されます。



2014/1/8

ユーザ移植版の60K P-CP/Mが起動するようになりました。

ブート時に、FDCに対してSTEP IN/OUTを発行して、その直後にFORCE INTERRUPTで中断という、
意図がよく分からない操作をしています。
従来のMB8876/MB8877の実装では、このような場合はヘッドを移動しなかったのですが、
FORCE INTERRUPT時にシーク中の場合、次のトラックまでは動かすようにしました。
半端な位置にヘッドがあるまま中断する訳ないですし、考えてみれば当たり前ですよね(苦笑)

また、FDCのDRQでCPUに割り込みを掛ける処理をサポートしました。
純正FDD I/FのMZ-1E05の仕様ではないと思いますが、これもユーザ拡張なのでしょうか。
IRQのマスクは、0xDFのbit0で指定します。

Z80PIOのPA5の入力ピンに、間違ってHBLANKを接続していたのを修正しました。
本当はVBLANKですね。


白黒モニタをサポートしました。
先日のレミングスもそうですが、勝手移植ものは白黒モニタ前提のものが多いそうです。



2013/12/31

MZ-800/1500のフロッピードライブを、2Dから2DDに変更しました。
(Oh!石さん、ご指摘多謝です)
スクリーンショットは、MZ-800用の勝手移植レミングスです。
純正のドライブは2Dだったと思うんですが、2DDもあったのかな?



2011/5/19

スクロールレジスタの修正を行いました。
画面のスクロールが正しく行えるようになっています。

普通の機種だと、スクロールレジスタは画面の表示にのみ影響するものですが、
MZ-800ではCPUから見たVRAMのアドレスにも影響するようになっています。
画面がスクロールしても、画面の表示上の位置とVRAMのアドレスが常に一致する訳で、
確かにこれは合理的かもしれません。
それにしても本当にユニークなアーキテクチャなマシンですね。



2011/5/18
MZ-800を実装してみました。
紅茶羊羹さんの日記で紹介して頂いてから、どうにも興味が抑えられなくって(を

MZ-800は、MZ-700を拡張した海外専用モデルです。
同じくMZ-700を拡張したMZ-1500が、PCGで表示能力を強化する方向で拡張されたのに対して、
こちらは320x200, 640x200のグラフィック画面を追加する方向で拡張されています。

CP/Mをサポートするために、80桁のテキストを表示する必要があったのは判るのですが、
あえて既存のテキスト画面の桁数を増やす方向にいかなかったのが興味深いですね。

実装自体は2日程度で済んだのですが、機能の実装そのものよりも、MZ-700/800/1500の3機種を
同じコード上で共存できるよう#ifdefを整理するのが一番面倒だった気がします(苦笑)


BASIC上のデモソフトを動かしてみました。
グラフィック画面のスクロールにまだ難があるかもしれません。


CP/Mは、640x200,2色モードで、CGROMから文字パターンを読み取って表示しています。
VCCPは珍しいですね。他にはMZ-2500のPersonal CP/Mくらいでしか見たことがありません。

こちらはフロッピーディスクで供給されていますので、フロッピードライブもサポートしました。
仕様が共通なので、MZ-1500の方でもあわせてサポートしています。



2011/4/6
クイックディスクの安定性を向上させました。
特に、タイミング依存で書き込みに失敗することがある問題が解決してるかと思います。

インフォメーションブロックのLOCK/SECRETの情報は、MZT形式のヘッダには含まれていません。
IPLでもこの値は参照されておらず、資料でも未使用とされています。
しかし、EXTRA-LOADERなど、この値を参照するソフトが一部に存在しているようです。
そこで、MZT形式のヘッダのオフセット+3EH/+3FHの値を、LOCK/SECRETとして扱うようにしました。
適切な値を入れてやれば、これらのソフトが動作するようになるかもしれません(未確認)

ブロックファイルに細工しているなど、MZT形式では再現できないソフトが他にもあるようです。
将来的には、クイックディスクの内容を、SYNC/CRC/GAPなども含めて書き出したような、
べた形式のイメージもサポートすることを検討中です。
現状でも、MZT形式のファイルから、内部的にべたイメージを生成して読み書きしていますので、
技術的にはそう難しくないかと思います。



2011/4/1

EmuZ-1500にいおて、ようやくクイックディスクの対応が完了しました。
一般的に使われている、MZT形式のディスクイメージを扱うことができます。
読み込みだけでなく、MZ-5Z001上でSAVEコマンドの実行も可能です。

ただし、書き込みはタイミングがシビアなので、うまく動作しない場合もあるようです。
一応、元のMZTファイルはバックアップしておいてからお試しください。
または、ファイル属性をリードオンリーにしておくと、エミュレータ上においても、
ディスクがライトプロテクトされているように扱われます。

BIOSにパッチを当てる方式ではなく、実機のハードウェア構成を表現するように、
かなりガチンコで実装してみました。
これのために、Z80SIO側についても、MONOSYNC/BISYNCモードに対応するように
かなり手を加えています。

これでクイックディスク、カセットテープともにMZT形式を扱えるようになりましたので、
MZTファイルを直接RAMにロードする機能は削除しました。

元々は一発ネタ向けに始めた開発でしたが、これでMZ-700/1500エミュレータとしては
おおむね実用的になったかなと思います。



2010/12/28
MZT形式のファイルを、テープイメージとして取り扱えるようにしました。
内部的に、MZT形式を波形データに変換して、データレコーダで読み取るようになっています。
従来の、MZT形式を直接メモリに読み込むやり方では対応できなかった、BASICのプログラムなども、
これで正常にロードできるようになっている筈です。
データレコーダの汎用クラス側での修正なので、EmuZ-80K/1200でも同様にサポートされます。

クイックディスクのサポートはもうちょっとかかりそうな感じです。
Z80SIOの同期通信周りの実装をしているのですが、MZ-2500などで正常に動作しなくなるなど、
些か梃子摺っています。



2010/9/4

MZ-1500で、PCGのアトリビュートのbit3をチェックするように修正しました。
画面周りは、これで大体完璧になったんじゃないかと思います。
スクリーンショットは、へのへのへ太郎さん作のSPARROWです。
デバッグご協力ありがとうございます>AKDさん

また、SOUND MASKの実装を修正した結果、「さんだーふぉーす」と叫ぶようになりました。
従来、波形は8253で生成するものとして、SOUND MASKは単にミュートとして実装していましたが、
サンダーフォースでは、8253の出力はHに固定して、SOUND MASKの方を駆動することで、
あの音声を再生していたようです。
これは全く盲点でした、解析していただきありがとうございます>紅茶羊羹さん

その他、描画期間中にPCM RAMをアクセスしたときにウェイトが掛かるようにしたり、
メモリマップドI/Oのアドレスの範囲を修正したり、RAMファイルを実装したりしています。


コモンソース側の作業になりますが、BEEP音を再生時のプチノイズを解決しました。
根本的な原因としては、実時間と仮想マシン内の時間の同期の問題です。

Win32側の再生用のサウンドバッファは、現実の時間に従って再生・消費されて、
これが空になったら、仮想マシンに必要なサンプル数だけ波形の生成を要求しますが、
仮想マシンの生成用サウンドバッファは、仮想マシン内の時間に従って生成されるので、
Win32側から要求された時点では、必要なだけの波形が生成されていない場合があります。
その場合、従来の実装では、不足分だけその場で波形を生成して穴埋めをしていましたが、
このとき、仮想マシンは停止した状態になっています。

音源チップとかだったら、そのまま指定されているトーンで波形を生成するだけですが、
今回のように、8253などの周辺回路から送られるパルスで波形を生成する場合は、
仮想マシンが停止していたら、パルスが送られてこないため、ちゃんと波形が生成できません。
これがプチノイズの原因だったようです。

規則的なパルスが来ると期待するならば、8253の設定値から出力周波数を算出して、
それを元に理論上の出力波形を生成してしまえばそれですむんですが、
それだとサンダーフォースなど、不規則なパルスがくる場合の音声を再現することができません。

そこで、サンプル数が足りない場合は、その場で必要なだけ仮想マシンを回してやることで、
仮想マシン内の時間を進めながら波形を生成させるように修正しました。
またこのとき、通常の仮想マシンの駆動処理をスキップしてやることで、
Win32側でのタイミング管理と齟齬を来たさないように調整しています。



2010/8/31-2
更にMZ-1500において、プライオリティレジスタとPSGのI/Oアドレスを修正しました。
ご指摘ありがとうございます>やっぱりAKDさん

何か物凄いポカミスの連発です、お恥ずかしい。



2010/8/31
MZ-1500において、カラーパレットが正しく動作していない不具合を修正しました。
パレット番号と、カラーコードが逆になっていたのが原因です。
ご指摘ありがとうございました>AKDさん



2010/8/27

8253から出力された波形を音声として出力する処理を改良しました。
従来は単なるON/OFFとして処理していましたが、
今回から、1パルスに相当する期間において、ON/OFFされていた時間を算出して、
その比率に応じたボリュームで出力するように改良しています。

これにより、タイニーアイマスで、実機に近い音が再生できるようになりました。
近々、ニコニコの方に再アップしておきます。


MZ-1500の実装を開始しました。
QD以外の一通りの機能については実装が完了しています。
QDについては、ハードウェアを忠実に再現できるよう、Z80SIO経由でアクセスする予定です。
まずはプロトコルの解析からしないといけませんね。

なお、MZ-700の方でも、MZTの読み込み処理を一部修正しました。
MZ700WINのパッチを読み込めるようにした他、複数ブロックの読み込みを廃止しています。
多段ロードするソフトは、wavで読み込んでくださいということでご了解ください。
(無理にパッチで読み込ませるより、ハードウェアに忠実に実装するのが方針ですので)



2008/10/10
Windows CE環境において、EMMの容量を1MBに変更しました。
これで起動直後に終了する問題が解決しているかと思います。



2008/10/6
データレコーダ周りの実装を修正しました。
元々はアイマスのデモ用ということで、テープが回りっぱなしになっていたのを、
MOTOR ON信号で制御できるようにしました。
それに応じて、MOTORの状態信号もちゃんと取得するようにしています。
また、テープ読み込み中はフレームをスキップするようにしました。

8253のモード3を使用時に、音がちゃんと再生されない問題を修正しました。
起動時にピッと鳴るようになっています。
8253側で、カウンタに対して出力信号をON/OFFする閾値の問題でした。
また、PCM側で出力波形にローパスフィルタを掛ける様に修正しています。


MZ-700エミュレータでスタンダードとなっている、MZT形式の読み込みに対応しました。
テープイメージのみの対応ですが、複数のMZTファイルを連結したものもサポートしています。

これで大体実用上の問題はなくなったのではないかと思います。
wavファイルを直読みできることから、多段ロードするソフトでMZTに変換できないものを
実行するのに使用するなど、意外に需要があるようですね。



2008/8/27-2
MZ-700でアイマスMADを再生してみよう、の実験報告の特設ページを作成しました。



2008/8/27
vsync/hsyncのタイミングの見直しをしました。
MZ-700エミュレータで動画シリーズを実機で検証して頂いて判明した不具合で、
1垂直同期中に何回水平同期が発生するかが正しくありませんでした。
より実機に近いタイミングで動作するようになっているかと思われます。

また前回より16MBのEMMメモリをサポートしています。
MZ-700エミュレータで動画シリーズ用の仮想デバイスです。

MZT形式の対応を検討中です。
最近はMZ-700用のプログラムを開発する機会が多いのですが、
ハンドアセンブルしてHEXファイルを作成して、
自前ツールでバイナリにして、
COPY /BでMZTヘッダをくっ付けて、
mzt2wavでwavファイルにして、
更に周波数変換してロードするのがいい加減面倒なんですよ(苦笑)
(MZ700WINを使用している方でも気軽に使えるかな、というのもありますが)



2008/8/16
8253のゲート周りの実装を見直した結果、ぷちぷちとノイズがする問題が修正されました。
blogとニコニコ動画上でやっていた諸々の実験の報告は、また後日にでも。



2008/6/11
突発的に思い立ちまして(いつも大概そうなんですが)、勢いで実装してみました。
MZ-700ネタですが、一応P6オフに向けての新ネタです。


まるくんの投稿されたこの動画を、エミュレータ上で音付きで再現することだけが目的です。


再現してみた結果、こんな感じになりました。


紅茶羊羹氏の野球拳2000も動作します。

以下、スクリーンショット大増量でお送りします。


起動したら、L [RETURN]を押してからプログラムテープを挿入。


プログラムが起動したらプログラムテープを抜きます。
PROJECT iM@Sのところで音楽テープを挿入。


音楽テープの音声を検出するとタイトル画面に移行します。


天海春閣下香。

の_の


如月千早。

6_6


萩原雪歩。

ゆきぽかわいいよゆきぽ。


高槻やよい。

このキャラグラからは、やよいへの愛が感じられますね。


秋月電子律子。

このキャラグラからは、律子への哀が(ry


てってってー、ざっざっざざー。


こちらは野球拳2000。
水平描画期間中のVRAMウェイトや、ラスタ毎の描画に対応しています。


理屈としては判るんですが、これが本当にテキスト画面だけで構成されているとは驚きです。