歓迎光臨
"ePC-9801" - NEC PC-9801 emulator for Win32
"ePC-9801E" - NEC PC-9801E/F/M emulator for Win32
"ePC-9801U" - NEC PC-9801U emulator for Win32
"ePC-9801VF" - NEC PC-9801VF emulator for Win32
"ePC-9801VM" - NEC PC-9801VM emulator for Win32
"ePC-9801VX" - NEC PC-9801VX emulator for Win32
"ePC-98DO" - NEC PC-98DO emulator for Win32
"ePC-8801MA" - NEC PC-8801MA emulator for Win32
"ePC-8001mkIISR" - NEC PC-8001mkIISR emulator for Win32

"ePC-9801" is NEC PC-9801 emulator for Win32.
"ePC-9801E" is NEC PC-9801E/F/M emulator for Win32.
"ePC-9801U" is NEC PC-9801U emulator for Win32.
"ePC-9801VF" is NEC PC-9801VF emulator for Win32.
"ePC-9801VM" is NEC PC-9801VM emulator for Win32.
"ePC-98DO" is NEC PC-98DO emulator for Win32.
"ePC-8801MA" is NEC PC-8801MA emulator for Win32.
"ePC-8001mkIISR" is NEC PC-8001mkIISR emulator for Win32.
These softwares are under GNU GENERAL PUBLIC LICENSE.

This software requires Windows 2000/XP/Vista/7.

Download: Jump to Common Source Code Project



ePC-9801/E/U/VF/VM/VX 謎WIPページ
ePC-98DO 謎WIPページ
ePC-8801MA 謎WIPページ
ePC-8001mkIISR 謎WIPページ

PC-9801VM以降やPC-9821エミュレータが豊富に存在する中で、
敢えて初代とかPC-9801E/F/Mとかのエミュレータです。
VM以降だと動作しないソフトがあれば、多少は需要があるかもしれませんね。

PC-98DOは、50機種記念のネタです(笑)
例によって、たとえネタでも全力投球。

副産物で作ったPC-8801MAの記述ばかり増えた挙句に、PC-8001mkIISRまで。
もう何の機種のページなのか分からなくなっちゃいましたね(苦笑)



2017/8/12

PC-8001/PC-8801のテキスト画面の描画処理を修正しました。

テキスト画面の表示が停止されている場合でも、アトリビュートから各文字の色を
取得する処理は実行するようにしました。
白黒モードのときのグラフィック画面の色指定に参照されるためです。
PC-8801mkIISRのデモンストレーションディスクで、アナログ・デジタルを指定後、
赤色のNECロゴが回転するのが表示されるようになっています。

また、テキストの色番号に0が指定されている場合、常に黒色で描画していましたが、
これを背景色で描画するようにしました。
やはりPC-8801mkIISRのデモンストレーションディスクにおいて、銀紙の星飾りの、
パレットを変更して画面全体の色を変えるシーンで、画面の一部が黒色のままに
なっている問題が修正されています。
従来黒色のままになっていた部分は、テキスト画面にグラフ文字の豆腐(87H)が、
色番号0で表示されていました。(多分、グラフィック画面のマスク用?)

Common Source Code Project側で、デバッガを小修整しました。
CPUがすぐにサスペンドしない場合、CPUがサスペンドするのを待っている旨、
メッセージを表示するようにしました。
通常は発生しませんが、デバッグ対象のCPUが、BUSREQ等で長時間停止していると、
次の1命令を実行する直前の、サスペンドフラグが落ちるのを待つためのループに
突中できないため、この状態になる可能性があります。



2017/8/10

PC-9801VXをサポートしました。
将来のハイレゾ機実装のための、ITFとEGCの実装テスト用です。
EGCは、猫さんから移植したQEMU/9821から更に引っ張ってきました。

スクリーンショットは懐かしのふぁにび。
SYSTEM3というか、AGSってEGC使ってたかしらん、ちょっと記憶が怪しいです(苦笑)


PC-8001/PC-8801のグラフィック画面の描画処理を修正しました。
PLAY6が正しい色で表示されるようになっているかと思います。

白黒モード時、グラフィック画面の色番号を、常にテキスト画面のアトリビュートから
取得するように修正しました。
(640x400は既にそうなっていましたが、640x200の場合もそのように修正しました)
このとき、色番号はテキスト画面のアトリビュートから取得しても、
実際に描画する色は、グラフィック画面のパレットを使用するようにしました。
また、カラーモードか白黒モードかに応じて、正しい背景色になるようにしました。

Common Source Code Project側で、デバッガの安定性を向上しました。

CPUのデバッグ中、1命令実行すると、サスペンド中であるというフラグを立てて、
次の1命令を実行する直前に、デバッガ上でトレース命令が実行されることで
サスペンドフラグが落ちるまで、ループするようになっています。
デバッガの方は、サスペングフラグを落として、再びフラグが立つまで待つことで、
CPUを1命令ずつ動かすようになっています。

従来は、サスペンド中であるフラグが立ったら、すぐにデバッガの処理を再開して
いましたが、次の1命令を実行する直前の、サスペンドフラグが落ちるのを待つ
ループに入るまで、極々僅かな時間ですが、まだ仮想マシンが動いていました。
この期間に、別スレッドで動いているデバッガから、仮想マシン側に茶々が入って、
仮想マシン側の動作が不安定になる可能性がありました。

これを、CPUが1命令実行して、消費クロック分の時間だけ、他のCPUや周辺装置など
仮想マシンを駆動して、更に次の1命令を実行する直前の、サスペンドフラグが
落ちるのを待つループに突中するまで、デバッガ側で待機するようにしました。

またZ80に関しては、1命令実行後、DMAが繋がっている場合は1バイト転送して、
それから割り込みチェックを入れるようにしました。
また、割り込み発生時に、リターンアドレスが1インクリメントされてしまうという
間欠的な不具合があるとのことですので、念のため、1命令毎にHALTフラグを
クリアしてやることで、割り込み直前に実行したのがHALT命令であった場合のみ、
PCをインクリメントしてからPUSHするようにしました。

その他、カナキーをローマ字変換で入力する機能を改良しました。
シフトキー+ファンクションキーを入力できるようにしています。



2017/6/22
拡張RAMのバンクに、実際のバンク数以上を指定したときの挙動を修正しました。
また、DMAがアンダーランになったときのCRTCの挙動を修正しました。

uPD765Aのドライブステータスを正しく取得できない不具合を修正しました。
ドライブが空なのに、強制的にREADY信号を入れた場合の処理が正しくありませんでした。
YM2203に対して、YM2608のレジスタを操作したときの処理を修正しました。

これらの修正は、RPE避難所で配布されている、ePC-8801MAの改造版を取り込んだものです。
多謝多謝です。


他機種と共通で、カナキーをローマ字変換で入力する機能をサポートしました。
メニューのControl - Romaji to Kanaか、アプリケーションキーで有効・無効を切り替えます。
MS-IME相当のローマ字の綴りは受け付けるようになっている筈です。

また、Alt+Ctrl+Enterで、フルスピード動作の有効・無効を切り替えられるようにしました。
なお、Alt+Enterでフルスクリーン、Ctrl+Enterでマウス有効・無効の切り替えは従来通りです。



2015/12/9
PC-9801-26において、YM2203のポートAから取得できるIRQの番号を再修正しました。



2015/9/30
引き続き、PC-9801各機種の音源周りを弄っています。

PC-9801-14をサポートしました。(多謝多謝>関係各位)
音源であるTMS3631については、Neko Project IIのコードを移植しました。
ただし、UME-3氏の動画を参考に、1オクターブ音を低くしています。

なお、TM3631については、詳しい情報をMoriyaさんがブログに投稿しておられます。
現在の実装では、エンベロープで波形を弄る辺りがサポートできていませんが、
将来的により再現性を向上させていきたいと思っています。

PC-9801-26において、YM2203のポートAからIRQの番号を取得できるようになっていますが、
この値が間違っていたのを修正しました。
三国志で音楽が鳴らない件、これで直っているんじゃないかなーと思います。



2015/9/29
PC-9801各機種について、PC-9801-26およびサウンドBIOSの有効・無効を指定できるようにしました。
PC-9801-14のサポートについては、後日あらためて検討します。



2015/8/25

XM8 version 1.30の変更点を取り込ませていただきました。
640×400モード時のテキストアトリビュートの取り扱いが修正されています。


コモンソース側で、スクリーン周りを修正しました。
画面を拡大していない場合に、CRTフィルターが掛かるようになっています。
また、仮想マシンが、Direct3D9のオフスクリーンに直接描画する処理を廃止しました。
この結果、オフスクリーンがロックされる時間が最小限になっています。
もしかしたら、Windows8でフレームレートが極端に低くなる問題が解決しているかもしれません。



2015/8/13
現在、8086/186/286は、MAME 0.149ベースのコアを使用しています。
これに、MAME 0.128ベースのV30の命令を追加しました。
PC-9801U/VF/VMおよびPC-98DOで、こちらのコアを使うように変更しています。



2015/7/31
XM8 version 1.20の変更点を部分的に取り込ませていただきました。

SR/TR/FR/MR+専用サウンドボードIIは、XM8ではBIOSから機種判定して自動的に選択されますが、
こちらではメニューから、OPNA, OPN, OPN+OPNAを選択する形式にしました。
ディップスイッチ関係については、今回の修正では取り込んでいません。

大幅にソースに変更があったので、PC-8001mkIISRと共存できるように取り込むのが大変でした(苦笑)



2015/6/28
XM8 version 1.10の変更点を取り込ませていただきました。



2015/6/25
PI.様のXMシリーズの最新作、XM8が公開されました。
仮想マシン部は、拙作のePC-8801MAがベースとなっています。
元々、私のエミュレータの実装は、PI.様のXM6の設計に大いに影響を受けておりますので、
今回私のソースを採用いただけて大変光栄に思っております。

#最後に直接お会いしたのは、もう10年くらい前でしたか。
#お互い、随分と長いこと活動を続けてきたものですねえ、としみじみ。

XM8で仮想マシンに入れられた修正のうち、再現性向上に関する部分を取り込ませていただきました。
まことに多謝多謝です。
主に、OPNAのステータスとか、タイミング回りの再現性が向上しています。

コモンソース側で、デバッガ周りの修正を行いました。
連続実行をESCで中断する際に、デバッガウィンドウにフォーカスがあるかチェックするようにしたり、
BC/BD/BEで*を指定することで、全ブレークポイントを一括操作できるように修正しています。



2015/2/21
PC-8801において、BEEPやCMD SINGの再生品質を改善しました。
また、従来別々に合成して加算していたのを、ORをとって合成するようにしました。
例えばニュートロンにおいて、BGMの再現性が改善されているかと思います。

音声の再生品質の向上については、イベントマネージャで、繰り返し実行するイベントの
発火タイミングを、従来のCPUの1クロック単位だったのを、1/1024クロック単位にしたり、
音声合成をスキャンライン毎に行っていたのを、1サンプル毎に行うようにしたりするなど、
コモン側でも色々と修正しています。



2015/2/13

PC-8001mkIISRにおいて、始皇帝のタイトル画面にゴミが表示される問題を修正しました。
CRTCでSET IRQ MASKを行ったとき、表示が停止するようです。
この修正については、M88の実装を参考にさせていただきました、多謝です>cisc様


PC-8801において、ニュートロンの背景が黒く表示される問題を修正しました。
カラーモードでグラフィック画面が非表示の時、背景色を黒にする処理が誤爆していました。


カムイの剣のタイトル画面で、メッセージが表示されない不具合を修正しました。
DMAアンダーランが発生したとき、テキスト画面の描画を停止するようになっていましたが、
DMAの設定を行ってアンダーランが発生しなくなったとき、描画を再開するよう修正しています。

その他、気持ちディスク2のおどりで、描画が乱れる問題を修正しています。
uPD76AでREAD DATAコマンドを発行して、対象のセクタが見つかるまで転送は開始されませんが、
何故かコマンド発行後すぐにステータスを見に行って、その時点でまたセクタが見つかってないと、
そのままコマンドを打ち切ってしまっているようです。
取り敢えず、コマンドを発行して、実行フェースに移行する前にステータスを読んだ場合、
強制的に実行フェースに移行するような修正を入れています。



2015/1/28
PC-80/88において、ステートセーブの不具合を修正しました。
テープイメージを録音のために開いて、まだセーブが実行される前の状態でステートセーブした場合、
ステートの読み込み後に、テープへのセーブに失敗する可能性がありました。

また、DMAがアンダーランになった場合のCRTCの動作を修正しました。
レッドナウ氏のmax2の実装を参考にさせていただきました、多謝多謝。



2015/1/10
PC-8801MAにおいて、PC-8801-23(OPNA)とPC-8801-11(OPN)を選択できるようにしました。
ステートセーブの互換性はなくなっています。



2015/1/1
PC-80/88の拡張RAMのバンクレジスタについて、bit4-7をマスクするように修正しました。
純正のボードだと下位4bitのみ有効、I/O DATAのボードだと全bitが有効なようです。



2014/12/29
80mkII愛友会のapaslothy様より、再度ePC-8001mkIISRのパッチを頂きました。
以下の不具合が修正されています。

パックランドの背景色が黒かった不具合が修正されています。



2014/12/26
80mkII愛友会のapaslothy様より、再度ePC-8001mkIISRのパッチを頂きました。
以下の不具合が修正されています。
また、パックランドのカセットテープをロードできない不具合を修正しました。

PC-9801シリーズについても、ステートセーブに対応しました。



2014/12/25
80mkII愛友会のapaslothy様より、ePC-8001mkIISRのパッチを頂きました。
以下の不具合が修正されています。
また、あわせてご指摘いただいた、以下の不具合を修正いたしました。
不具合情報およびパッチ、ありがとうございました。>apaslothy様



2014/12/23
DMAが停止している場合に、テキスト画面を表示しないように修正しました。
PC-8001mkIISRで、XANADUにゴミが表示される問題が解決しているかと思います。

ePC-8001mkIISR, ePC-8801MAにおいて、ステートセーブに対応しました。
注意点はトップページの更新履歴をご参照ください。



2014/11/21


PC-8801において、CMTの多段ロードに対応しました。
スパルタンXやドアドアなどが動作するようになっています。


NIPPYについては、ROM BASICを使っているのに、ROMを切り離してしまうという問題が発生しています。
一先ずパッチで無理やり動かすようにしましたが、もう少し調査してみます。



2014/10/29
PC-8801において、CRTCのステータスレジスタのポート番号が間違っていたのを修正しました。
結構酷い間違いな筈だけど、今まで動いていた辺り、ステータス見てるソフトって殆どないのかしら?



2014/10/28
CHOBINの表示の問題を再修正しました。
DMACに変な設定をした場合に、DMAアンダーエラーが発生して、CRTCの表示を停止する処理が、
2014/8/29の修正の際に機能しなくなっていたのが原因でした。

その他、CRTCのステータスレジスタの挙動の修正などを行っています。



2014/10/27
CHOBIN向けに入れた修正が、Ys3などに悪影響を及ぼしていたため、一旦元に戻します。
CHOBINについては、もう少し対応を考えたいと思います。



2014/10/25

CHOBINにおいて、画面の上の方にゴミが表示されていた問題を修正しました。
DMAの転送が有効な間に、8257(DMAC)のレジスタに変な値を書き込んでいたのが原因です。
DMAの転送が有効な間は、レジスタへの書き込みをはじくように修正した他、
AUTO INITIALIZEやTC STOPの対応など、全般的に8257の再現性を向上させています。

PC-9801において、サウンドBIOSのサイズが間違っていたのを修正しました。

その他、デバッガにおける10進数の入力の再サポートや、Z80のディスアセンブラの修正、
フレームレートが不安定になる問題の修正を行っています。

もろもろ、ご修正&ご指摘多謝です>レッドナウ氏&某スレの方々



2014/10/11
PC-8801において、BSキーが反応しない問題を修正しました。
BSキーは、FH以降のキーボードで追加されたキーです。
N88-BASICなどでは、FH以降で追加されたキーをスキャンしないようになっています。
このため、FH以降のキーボードでは、互換性のため、BSキーが押された場合は、
INSDELキーも同時に押されたものとして扱うようです。
この部分が未実装になっていたため、BSキーが反応しなかったようです。

その他、デバッガの不具合を修正しました。
Dで終わる値(ヘキサのFDなど)が、デシマルとして解釈されていた不具合と、
Z80の逆アセンブラで、FD xxが、FEに置き換わってしまう不具合が修正されています。



2014/10/10

PC-8001mlIISR/PC-8801MAにおいて、PCG-8100をサポートしました。
i8253による3chサウンドもサポートしています。

PC-9801VFの可動実機を確保できたので、BIOSを吸い出して動作確認してみました。
ROM BASICの起動も、ディスクからの起動も問題なかった、のですが。
どうも、PC-9801U/VF/VMと、PC-98DOは、BIOSが全く同一内容だったようです。
一応PC-9801UVの実機も調達中なのですが、この分だとそっちも同じなんだろうなあ。



2014/10/4
PC-8001mkIISRのグラフィック画面が化ける不具合を修正しました。
Port31の、カラー・白黒、320x200・640x200を切り替えるbitが逆になっていたのが原因です。
多分、XANADUが正しく表示されない件は、これで直ってるかと思います。



2014/9/29

初期98の中でも微妙なPC-9801U, PC-9801VFをサポートしました。
VFの方は、手持ちの実機が通電しなくて、まだROM吸出しが出来ていないのですが。
多分動作する、と、いいなあ。


多くの機種で、CRT風の表示にするフィルタをサポートしました。
実解像度の2倍または3倍に拡大表示する際に有効となります。
また、PC-8801については、テキスト画面のスキャンラインを非表示としました。



2014/9/7
PC-8801のDMACについて、転送中にアドレス・カウンタレジスタを更新するようにしました。
また、従来は一気に全データを転送していたのに対して、画面の表示期間に同期して、
1行分のデータをCRTCに転送するように修正しています。
この修正で、新たに動くようになったソフトが何かあるかは不明ですが(苦笑)


PC-8801に限らず、多くの機種において、内蔵デバッガをサポートしました。
使い方はSYMDEBと同じ感じです。
特定のメモリアドレスやI/Oポートへの読み書きでブレークを掛けることもできます。
使い方は、?でコマンド一覧が表示されますので、そちらをご参照ください。

Z80の他、8048, 8080/8085, 8086/8088/80186/80286/80386, V30, uPD7801をサポートしています。



2014/8/29
PC-8801のCRTCについて、ノントランスペアレントモードをサポートしました。
このモードを使っているソフトがあるかどうか判らないため、動作については未テストです。
また、ノンアトリビュートモード時にカーソルが表示されない不具合を修正しています。



2014/8/28

PC-8801のテキスト画面について、Enri様よりご指摘いただいた、アトリビュートの不具合を修正しました。
アトリビュートのbit3が立っていたら、リバースやシークレットなどを無視するようになっていたのが原因ですが、
何故そんな処理をわざわざ入れていたのか、もう思い出せないです(苦笑)


はせりん様にご指摘いただいた、CDOS-IIが起動しない不具合を修正しました。
uPD765Aでセクターを探す際に、C/H/Rのみ比較していたのを、C/H/R/N全部を比較するように修正しています。
実際のNとは違う値を指定して、ギャップまで読み込めたような気がするんですが、勘違いだったのかしら。

その他、fmgenを新しいバージョンに差し替えました。
オリジナルのソースが見つからなかったので、RuRuRu様のM88改造版のGitHubから引っ張ってきています。



2013/12/31
PC-9801/8801/X1について、プリンタポートへの出力を、ファイルに保存するようにしました。
主に、くれゆに様の検証プログラムの結果を、ファイルに出力するようです(苦笑)

いい機会なので、他機種に横展開すると同時に、プリンタエミュレータも実装しようかと考えています。
この辺は2014年のテーマになりそうです。
最初はMZ-2500とMZ-1P17/1P30辺りからかなーと思います。



2013/12/5
取り急ぎ、某所でご指摘いただいた不具合の修正のみ。
リセット直後のOPNのステータスレジスタの値が、実機と異なっている不具合を修正しました。
CRTCの全画面反転をサポートしました。



2013/8/8
くれゆに様のサイトで、新しい検証プログラムが追加されたのを受けて、
PC-8801の、電源投入時のメインRAMの状態を修正しました。
この修正で何か動くようになったソフトがあるかどうかは判りません。



2013/8/1
くれゆに様のサイトで、新しい検証プログラムが追加されたのを受けて、
引き続き、PC-8801のメモリウェイトの修正を行いました。
その他、今更ですがハイレゾ・標準モニタを選択できるようにしたり、
CRTCの設定に応じて、自動的に垂直同期周波数を設定するようにしました。
その結果、くれゆに様の実機での計測結果に近い結果が得られるようになっています。

また、X1同様に、uPD765Aのタイミングを徹底的に修正しました。
メモリウェイトの修正とあわせて、タイミング的にいい感じになってきてるかと思います。

uPD765Aについては、READ DATAで、Nに実際のセクタより大きい値を指定した場合、
セクタギャップや次のセクタまで読めてしまう挙動も再現しています。



2013/7/23
PC-8801のメモリウェイトやCRTCの垂直同期周波数の修正を行いました。
くれゆに様のサイトの情報を基にしています、多謝多謝。
各モードとも、結構実機の計測値に近い結果が得られているかと思います。



2013/2/26

PC-8801のテキスト画面について、アトリビュートの処理を修正しました。
ファンクションが表示されない不具合が修正されています。
(こちらもご指摘ありがとうございます>はせりん様)

なんでこんなエンバグしたのか自分でも理解できないや(苦笑)



2013/2/7

N-BAICモードで、カレンダ時計の設定が正しく行えない不具合を修正しました。
PC-98DO/8801MAでは、RTCにuPD4990を使用しています。
uPD4990は、uPD1990互換としても使用可能なのですが、この辺りの実装が不十分だったようです。
(ご指摘ありがとうございます>はせりん様)



2013/1/18

PC-8001/PC-8801において、N80形式のイメージの読み込みをサポートしました。
テープイメージとして扱いますが、実際はテープをロードした状態のRAMをダンプしたものです。
…あんまり需要はないかな?(苦笑)



2012/12/29

uPD765AのREAD DIAGNOTICSの実装を修正しました。
従来は、MB8876のREAD TRACKと同じように、インデックスホールから読み込んでいましたが、
インデックスホール後、最初のセクターのデータ部分から、Nで指定した長さだけ読むようにしました。

この修正で、ウルティマ4が動作するようになったようです。
ご指摘ありがとうございました>ナイコンさん340氏
検証用プログラムまで作っていただき、本当に助かっております。


PC-8801シリーズの副産物として、PC-8001mkIISRを実装してみました。
現状は、取り敢えず動く程度の評価版です。
テープ版ゼビウスしか動作確認できていませんので、今後他のソフトの検証を進めたいと思います。



2012/10/25
PC-8801のV1(S)モードにおいて、DMA転送時のウェイト値を変更しました。



2012/10/23
PC-8801のV1(S)モードにおいて、VRAMアクセス時のウェイト値を変更しました。
こんな感じで大丈夫でしょうか?>御心当りの方



2012/8/18

PC-8801のテキストアトリビュート周りの実装を修正しました。
ブラスティーで画面にゴミが表示されたり、メルトダウンで敵弾が化ける不具合が修正されています。
また、アルファについても例外処理なしで正しく表示されるようになりました。


PC-9801において、テキスト・グラフィックのGDCがスタートしていないとき、それぞれの画面を
表示しないように修正しました。
例えばアリスソフトのソフトで、従来は上画面のようにログが表示されてしまっていましたが、
テキスト画面が非表示となることで、このログが隠れるようになっています。

一部でご要望いただいておりました、mamefm.dll (V1)に対応しました。
OPN/OPNAを搭載している機種について、実行ファイルと同じフォルダにmamefm.dllが存在すると、
FM音源の3ch/6chをmamefm.dllで合成するようになっています。
(PSG/Rhythm/ADPCMについては、従来通りfmgenで合成されます)

ワンボード系を除く全機種で、画面表示に使うAPIをGDI/Direct3D9から選択できるようにしました。
従来はGDI/Direct3D9それぞれで別バイナリを用意していましたが、今回から1つになります。



2012/3/20

一部ソフトで音楽のテンポが遅くなる件を改めて修正しました。
前回の修正では直っていなかったREFIGHTについても、正常なテンポになっています。

I/OによってFM音源のクロックを切り替えられるという情報もあったのですが、実際のところは
サウンドIRQの取り回しの問題でした。
内蔵タイマのリセットや、割り込みマスクの設定のタイミングによっては、タイマが1周したときに
2回割り込みが発生するようです。
M88の実装を参考に割り込みまわりを修正することで、正しいテンポで音楽が鳴るようになりました。
FM音源の割り込みをレベルで扱うのと、一旦割り込みコントローラに割り込み要求をしたら、
サウンド割り込みがマスクされても要求を取り下げないのがミソのようです。

また、Direct3D9版のバイナリが、全機種共通でビデオ録画に失敗する問題を修正しています。



2012/3/15

データレコーダをサポートしました。
ロードはCMT/T88形式を、セーブはCMT形式のみをサポートしています。
(一部エミュレータに存在する、I/Oポート0x00への出力でマシン語をロードする処理についても
一応サポートしています)


リップスティックADVで音楽のテンポが遅い問題に対応しました。
OPN(A)のレジスタ0xA3に0x02を出力していましたのを、内蔵タイマに与えるクロックの倍率を
指定していると解釈して実装しています。
ドキュメントされている仕様ではありませんので、実際には違ってるかもしれません。
他のソフトで副作用が発生しているようでしたらご連絡ください。

その他の細かいところとして、グラフィック画面を出力禁止にしたとき、従来はパレット0番の色が
表示されていたのを、黒色が表示されるように修正しました。
また、テンキーのコンマを、CTRL+フルキーのコンマで入力できるようにしました。
(ついでに、CTRL+ピリオドをテンキーのピリオドと解釈するようにしています)

PC-9801E/VM, PC-98DO, PC-8801MAで、CPUクロックの設定を変更した後、リセットすることで、
従来のように再起動しなくても設定を反映するように修正しました。
内部的には、VMクラスのインスタンスを一旦破棄して、もう一度newすることで実現しています。



2012/3/6

バスマウスをサポートしました。
メニューから、ジョイスティックとマウスの切り替えることができます。
動作中の切り替えも受け付けますが、起動時にどちらが接続されているかについて
判定しているソフトが多いと思いますので、うまく動作しない場合はリセットしてください。


RST MUSIC DISK vol.12のPCMロード画面が化ける問題を修正しました。
アルファの件と同様に、特殊なアトリビュートのデータ列に対する例外処理を入れています。
また、アルファについても、現在位置を示す表示が化けていた問題を修正しています。


RTCのデバイスタイプを、uPD1990AからuPD4990Aに切り替えました。
KOB-softのゲームがブートしない不具合が修正されています。


MISTY BLUEが起動しない不具合を修正しました。
ADPCMデータの書き込み毎に割り込みが発生してしまっていたのが原因のようです。
Reg #29への設定が行われていないようなので、タイマ割り込みのみ発生するように、
初期値として3を設定することで仮に対処をおこないました。

fmgenを弄りついでに、タイマーA/Bの時間管理の方法を変更しました。
従来はusec単位で扱っていましたが、これをOPN/OPMのクロックベースに変更しました。
時間単位を変換する段数が減る分、精度が多少良くなっているかと思います。
ym2203/ym2151クラス側でも、従来はスキャンライン毎にfmgenのタイマーを進めるように
していましたが、レジスタにアクセスする際にもタイマーを進めるようにしました。



2012/2/21

PC-8801mkII FRのデモを基準に、メモリウェイトを微調整しました。
ぴったしとは行きませんでしたが、それなりに合ってるかと思います。



2012/2/20
スクリーンマネージャを、Direct3D9を使用するように修正しました。
Vista/7など、GDIが遅い環境では、それなりに高速化しているかと思われます。
従来のGDIで描画する方が良い場合は、emu.h内で#define USE_D3D9をコメントアウトしてください。

ついでに、フルスクリーンで画面を引き伸ばしたときの画質向上を図りました。
画面の解像度が仮想マシンの画面の整数倍でない場合に、画面のサイズより一回り大きく拡大して、
それから画面のサイズにあわせて縮小するようにしています。
GDIでは遅くて実用的ではなかったのですが、Direct3D9だと結構な速度で動いてくれるようです。

環境によっては、色がくすむといった現象がおきているようです。
何か問題がありましたらご連絡ください。


マルチボリュームのD88形式のディスクイメージをサポートしました。
マルチボリュームの場合、イメージに含まれるボリューム名がディスクのメニューに列挙されて、
そこから挿入するボリュームを選択することができます。
また、ドライブ1でマルチボリュームのイメージを読み込んだ場合は、ドライブ1に第1ボリュームが、
ドライブ2に第2ボリュームが読み込まれます。

なお、ディスクを変更する場合に、0.5秒間だけディスクを抜いた状態になるように修正しています。
これは、新九玉伝など、一旦ディスクが抜かれた状態を検出しないと、ディスクが交換されたことを
認識しないソフトの対策のためです。

※ 本修正は、コモン側で行っていますので、ディスクを扱う全機種について反映されています。


400ラインモード時に、テキストアトリビュートからグラフィックの色を取得するように修正しました。
FRのデモのワープロの画面などで、白一色だったのが修正されています。

内部的に、メモリウェイトの処理を変更しています。
現状はm88のウェイト値を参考にしていますが、ここからもうちょっと微調整をする予定です。



2012/2/17

ePC-8801MAで、PC-8801FAのデモが動かなくなっていたのを修正しました。
単にメモリウェイトを有効にし直しただけです。
何か微妙なタイミング依存で動いているっぽいですね(苦笑)



2012/2/16
ePC-8801MAをリリースしました。
ePC-98DOのPC-88側の再現性が向上してきましたので、単体のバイナリとしたものです。
これに併せて、ePC-98DOに追加していた、OPNA・ジョイスティック・辞書ROMは削除しました。

今更ページを分割するのも面倒なので、このままPC-98のページに寄生したままで行きます。


スタートレーダーが途中で停止してしまう問題が解決しました。
メモリ周りやCPUなどを疑っていたのですが、問題はVRAMのアクセスにありました。
VRAMの拡張アクセスモードに入ったとき、独立アクセスモードのプレーン選択レジスタを
クリアする必要があったようです。…分かるかそんなん(苦笑)

その他、テキストウィンドウや辞書ROMへのアクセス周りの実装や、電源オンにしたときの
メインRAMの内容の初期化処理を修正しています。

コモンソース側で、Z80コアをMAME 0.145ベースで再実装しました。
スタートレーダーの件を調査している際に、CPUの問題ではないことを確認するために、
念のため再実装したものです。
何か他の機種で、動くようになったり、動かなくなったりしているものがあるかもしれません。
何か問題がありましたらご連絡お願いいたします。



2012/2/13
アルファでサウンドが鳴らない問題を修正しました。
FM音源の存在判定として、FM音源のステータスが0か否かをチェックしていたため、
最初にステータスを読みに行ったときのみBUSYフラグを立てるように修正しています。



2012/2/11

メルヘンヴェールでテキスト画面が崩れる問題を解決しました。
これまで、1行のデータ長を80桁+アトリビュート40bytesで120bytesと決めうちしてましたが、
メルヘンヴェールでは、アトリビュートを0個に指定していたため、1行ごとに40bytesずつ
表示位置がずれてしまっていたのが原因です。

前回の実装で、CRTCの1行辺りのライン数の取得の処理を誤魔化していたのを修正しています。
どうもスキップラインの扱いを誤って理解していたのが問題だったようです。
多分これで、変なハック無しでもちゃんと動くようになっているんじゃないかと思います。


マンハッタンレクイエムで、画面が上半分に潰れる問題を解決しました。
ポート$32に200/400ラインを切り替えるbitがあり、これで200/400ラインの判定をしていましたが、
実際は、更に白黒モードが有効になっていないと、400ラインには切り替わらないようです。


アルファで、画面上にゴミが表示される問題を仮対応しました。
アトリビュートに変なデータが指定されており、どう解釈していいか判断がつかなかったため、
アトリビュートが特定のデータ列になっているときのみ、例外処理で誤魔化すようにしています。
ここは後日要調査ですね。
また、サウンドがならない問題が残っていますので、こちらも確認してみます。


スタートレーダーが起動しない問題を解決しました。
スタートレーダーでは、サブシステム側の$7000から独自のローダープログラムを読み込んで、
これを使ってメイン側とのデータ転送を行っています。
ファイルリード時には、(多分)ファイル番号を指定すると、まずファイル長の情報が返されて、
それからその分だけデータが転送されるようになっています。
このとき、ハンドシェイクにポートCのDAVを使っていますが、途中でファイル転送を中断した場合に、
DAVが立ちっぱなしになっており、次のファイルリード時に、ファイル長を受け取り損ねてしまい、
いつまでもデータ受信で待機し続けてしまっていたのが原因でした。

実際には、ポートCを直接操作するのではなく、8255のコントロールレジスタでモード指定をすることで、
各ポートのラッチをクリアすることで、DAVを立ち下げていたようです。
8255の実装をあらためて再確認すると、モード変更時のラッチクリアの処理が未実装になっていました。
もう十分枯れた実装だと思っていたのですが、まだまだこんなこともあるんですね(苦笑)
色々な機種を実装して、色々な使い方をすると、色々な発見があるものです。


テグザーが起動しない問題も解決しています。
問題の根っこは、スタートレーダーと同じだったようです。



2012/2/8-2
Ys3のテキストマスクの問題が再発していた問題に対処しました。
CRTCの仕様がどうにも判らなくなってきたので、DMAの転送長から行数を算出するなど、
ちょっといんちきな実装になっています。
取り敢えず、Ys3とソーサリアンはこれで両立できているっぽいです。



2012/2/8
PC-98DOの88モードにおいて、400ライン表示でクラッシュする問題を修正しました。
先日、スキャンライン毎に描画するように修正した際に、エンバグしていたようです。
ついでに、こっそり辞書ROMをサポートしています。

また、コモンソース側で、ウィンドウがフォーカスを失った際に、押されているキーを
全てリリースするように修正しました。
全機種共通で、キーを押したままウィンドウを切り替えた場合に、キーが押されっぱなしに
なってしまう問題が解決しています。



2012/2/7

PC-98各機種について、テキスト画面のセミグラフィックをサポートしました。
スクリーンショットはCARRY LABのRADAR SNAKYです。
正直、98でセミグラを使用しているソフトがあるとは思っていませんでした(苦笑)

あと、PC-98DOの98モードで、8MHz時にフロッピーからブートできない不具合を修正しました。
トラックが移動しない場合のシークコマンドに掛かるウェイトを多少調整しています。



2012/2/6
今回も、ブログの方でご報告いただいた不具合対策がメインです。
既にページの半分以上がPC-8801の内容になっちゃってるなあ(苦笑)


ロマンシアで、画面が白黒になる不具合を修正しました。
アナログパレットを指定して、デジタルに切り替えるという不思議な操作をしています。
どうも、アナログもデジタルも、パレットの実態は同じものということのようですね。

また、カーソルが画面上に残るという問題がありましたが、こちらも解決しています。
DMAアンダーランが発生した場合は、テキスト画面の出力を止めればいいようです。
ただ、CRTCの設定中の過渡的な状態でDMAアンダーランが発生するソフトもあるようなので、
(これは、エミュレータ上のタイミング依存の現象かとは思いますが)
CRTCまでは停止せずに、そのフレームの中だけで判定するように仮の対策をしています。


ソーサリアンで、画面に黒い帯が表示される問題を対策しました。
黒い帯の実体は、テキスト画面に表示された、不透明な黒色のセミグラフィックでした。
テキストの1行あたりのライン数の扱いに関する問題で、DMA転送されたデータを越えて
テキスト画面を描画してしまっていたようです。


TELNET MUSIC-BOXで音が鳴らない不具合を修正しました。
OPN(A)で、タイマーが発火した後、タイマーがリセットされないままになっていて、
次にタイマーが発火しないままになっていたのが原因でした。
割り込みの優先順位とかタイミング依存の不具合のような気もしますが、
暫定的に、タイマーが繰り上がったら、常に割り込みを発生するように修正しました。
他の機種も含めて、何か変な副作用が出ていましたらご連絡ください。


PC-98DO実機では、FM音源はOPNまでなのですが、勢い余ってOPNAを乗せてしまいました。
PC-98側でも、DO+内蔵音源として認識されるようになっています。
邪道と言えば邪道ですが、既にジョイスティックもサポートしちゃってるし…

取り敢えず、PC-8801MA単体のエミュレータとして独立させることがありましたら、
そのときはPC-98DO内部では本来の仕様にダウングレードしようかと思っています。
それまでは、PC-8801エミュレータとしての利便性を優先ということで。



2012/2/2
段々とPC-8801のページと化しつつある今日この頃(苦笑)


信長の野望 武将風雲録が動作するようになりました。
CRTCが停止した状態で、VRTC割り込みが発生待ちで停止してしまっていたようです。
今回の修正で、CRTCが停止状態でもVRTC割り込みを更新するようにしています。


夢幻戦士ヴァリスのタイトル画面で暴走してしまう問題を解決しました。
Z80コア側で、$DD/$ED/$FDプリフィックスを、任意の命令の前に付けた場合において、
問題なく動作するように修正しています。

細かいところで、PC-9801/E/F/Mにおいて、マウス割り込みの周波数を指定するポートを
無効にしました。
初期型マウスI/Fは、割り込み周期をボード上のスイッチで指定する方式だったようです。



2012/1/31
今回も地味修正です。


PC-8801モードで、CAPS/カナロックが機能していなかったのを修正しました。
また、PC-8801/PC-9801ともに、カレンダが機能していなかったのを修正しました。

カレンダの方は、何故動かないのかなあと調べてみると、実はuPD1990Aではなく、
uPD4990Aが搭載されていたというオチでした。
こんな時期から、もうuPD4990Aに切り替わってたっけ?とちょっと新鮮な驚きです。



2012/1/30

更にPC-8801モードのテキストアトリビュートを修正しました。
ドアドアのタイトル画面で、変なところで文字の色が変わる不具合が解決しています。
テキストアトリビュート関係は、もうこれで大丈夫かな?


ドラゴンナイト2で、ディスクの交換を検出できない問題を修正しました。
PC-9801側ではディスク交換時にIRQを発生させて、PC-8801側では発生させてはいけない、と。
その辺の具体的な理由はちゃんと究明しないといけませんね。



2012/1/29
今回も、PC-8801モードの修正が中心です。


ドラゴンナイト2のエルフロゴで暴走する不具合を修正しました。
既にCPUに対して要求されている割り込みを、受け付けられる前にI/Oでマスクした場合に、
CPUの方で割り込み要求が正しくクリアされていなかったのが原因でした。


イース3で、画面上下に白い帯が表示されてしまう不具合を修正しました。
多分スクロール絡みでごみが表示されてしまう部分を、テキスト画面で不透明な黒色で
豆腐を表示することで隠すようになっていますが、アトリビュートが変化する位置を
正しく取得できていなかったのが原因でした。
この修正で正しいのかちょっと自信がないですが、少なくともBASICでは問題なさそうです。



2012/1/25

PC-8801モードでシルフィードが動作するようになりました。
VRAMの拡張アクセスモードにおいて、メインRAMをアクセスする設定にしたときに、
独立アクセスモードでVRAMを参照してしまっていましたのが原因でした。
また、DELキーが機能していなかった件や、FH以降で拡張されたINS/F6-F10を押した際に、
SHIFT+DEL/F1-F5も押されたと判定するように修正しました。

PC-9801モードにおいて、マウスが動作するようになりました。
また、ディスクの交換時にIRQを立てて、ディスクの交換を検出できるように修正しました。

コモンソースの方で、イベントマネージャを更に修正しています。
メインCPUで1命令実行することに、イベントの発生を確認することによって、
登録してから短時間で発火するイベントの時間精度が向上しています。
他のクラスに影響しないよう、イベントマネージャの外部仕様が変わらないように、
また余り重くならないように修正するのが結構大変でした。
従来の実装がトリッキーに過ぎましたが、今回の修正で随分シンプルになったかと思います。



2012/1/18
引き続き、PC-98DOのPC-8801モードの作業中です。


ぎゃわんぶらぁ自己中心派やドラゴンナイト2などが動作するようになりました。
FDCについて、シークに時間が掛かるようにしたり、リード・ライトコマンド後に
リザルトフェースに移行した状態で、TCを受け付けるように修正しています。
また、シークに時間が掛かるようにした副作用で、PC-9801のブート時にRecalibを
4ドライブまとめて実行する処理で問題が発生したため、同時にシーク系コマンドを
複数ドライブに発行した場合のイベント処理を修正しました。


ハイドライド3が動作するようになりました。
PC-8801では、OPNのI/Oポートでジョイスティックの状態を読み込むようになっているのですが、
ハイドライド3では何故かこのポートを出力に設定した上で、ポートをリードしています。
従来の実装では、この場合は出力した値を読むようになっていたため、ジョイスティックの
全てのボタンやレバーがオンの状態になってしまい、フリーズしたように見えていたようです。


N88-日本語BASICが起動するようになりました。
I/Oポートの0xE2は、拡張RAMの選択をするレジスタですがが、このポートをリードした際に、
ライトした値を反転した値が読めるように修正しています。
また、400ラインモニタの存在判定のポートや、400ラインの描画処理を修正しました。

その他、メモリウェイトの追加や、V1(S)やNモードでDMA転送時にBUSREQを立てるなど、
動作速度に関する修正を追加しました。
ついでに、実機ではサポートされていませんが、ジョイスティックをサポートしています。



2012/1/9
PC-9801E/F/M/VMおよびPC-98DOにおいて、CPUクロックの切り替えをサポートしました。
設定変更後、次回起動時に設定変更が反映されます。
PC-98DOのPC-8801モードでは、4MHzで動作させる機会も多そうですね。

内部的に、SUPPORT_OLD_FDD_IFとSUPPORT_320KB_FDD_IFを分けています。
PC-9801U/VFなど、2DD専用I/Fで320KBドライブはサポートしていない機種用です。
ビルドすれば多分動作すると思うのですが、実機の確認が出来るまで保留中。



2012/1/7
PC-98DOのPC-8801モードの修正を行いました。
結構色々なソフトが動くようになってきています。


OPNのIRQのラインを接続し忘れていたのを修正しました。
また、OPNの入力ポートの値を初期化するようにしました。
V1(H)/V2モード時、DMA経由でメモリを読む場合は、常に高速TVRAMにアクセスするようにしました。
アトリビュートの初期値を0xe0から0x00に変更しました。

以上の修正で、XANADUでゴミが表示されたり、ジョイスティックが押されっぱなしの状態になったり、
音楽がならない問題が解決しています。
(PC-98DOのPC-8801モードでは、ジョイスティックを接続することが出来ない仕様なのですが、
実用を考えるとやっぱりサポートすべきだろうかと思案中です)

XANADUが、とか言いつつ、スクリーンショットはあーくしゅで。
以前にPC-9801版のスクリーンショットを取ってるからつまらないかなあと。


uPD765Aのシークの処理を見直すことで、2HDのディスクが読み込めるようになりました。
従来は、アンフォーマットなディスクの場合はシークに失敗するようになっていたため、
2Dモード時に2HDのRecalibに失敗してしまい、ディスクの認識に失敗していました。
そこで、どんなディスクでも挿入さえされていれば、Recalibに成功するように修正しています。
(ディスクが存在して、READ DATAに失敗したら、ドライブタイプを2HDに変更するようです)

また、サブシステム側で汚いパッチを当てて、ディスクがドライブ1にしか挿入されていなくても、
常に2ドライブ存在すると判定するように修正しています。



2011/12/31
50機種目のネタとして、誰も喜ばないであろうPC-98DOを仕込んでみました。
J-3100とかΛ-1とかFM16βとか、他にも作業してたネタはあった筈なんですが(苦笑)


PC-9801VM相当部分は、QEMU/9821やPC-9801E/F/Mの実装がありましたので、割りとさっくりと。
スクリーンショットは懐かしのドラゴンナイト2から。
副産物として、PC-9801VMオンリーのバイナリもビルドするようにしています。

ちょっと詰まったのが、FDCの初期化周り。
ドライブの存在確認として、
といった処理があるんですが、従来の実装ではマスクをクリアして直ぐ割り込みが発生するため、
折角立てたフラグがクリアされてしまっていました。
8259の方で、既に要求されている割り込みのマスクがクリアされた場合、ちょっと待機してから
CPUに割り込みを発生するように修正することで解決しています。
他の機種で悪影響がないかちょっと心配です。

なお、CPUはV30相当なので、80286以降を要求するソフトウェアは動作しません。
たとえば、アリスソフトアーカイブスにあるゲームなどは、GR-DOSが組み込まれていますので、
古いバージョンのMS-DOSを組み込みなおす必要がありますのでご注意ください。
例によって、DALKでスクリーンショット撮ろうとして自分で気がつきました(苦笑)


PC-8801MH相当部分は、BASIC上のソフトは大体動作するようになってきました。
PC-98DOなので、例によってサウンドボードIIとかデータレコーダとかは敢えて未サポートです。

こっちはサブシステム周りで色々梃子摺ってました。
PC-80S31Kだと、メインとサブシステム間の結線は、ポートB→ポートAとなっていますが、
PC-8801では、サブシステム側で独自のコードを走らせて、ポートA→ポートBの方向で
データ送信する場合もあるようでして。
そりゃ単に結線してるだけなんだから、データの送信方向なんて使い方次第ですよね。
I/Oログを確認するまで中々気付きませんでした。

今回の実装のため、イベントマネージャを色々拡張しています。
PC-8801とPC-9801で、それぞれ別のイベントマネージャを並存させる必要があるため、
汎用デバイスからイベント登録した場合に、どちらのイベントマネージャに登録されるかを
ちゃんと区別できるようにしたり、
動的にフレームレートなどのタイミング周りの設定を変えられるようにしたり、
クロック数の異なるCPUをイベントマネージャに登録できるようにしたりしています。
この辺、あまり既存のコードを修正しないですむ様に、ちょっと工夫が必要でした。


N-BASICモードで起動するとこんな感じです。
実際はPCキーを押しながら起動して、設定画面でモードを選択するようなのですが、
今のところはメニューからPC-98/PC-88のV1(S)/V1(H)/V2/Nを選択するような方式になっています。


PC-98DOの副産物として、PC-9801/E/F/Mで320KBフロッピードライブをサポートしました。
2Dのディスクは他のエミュレータでブートできないようなので、結構貴重かもしれません。
PC-80S31KのROMイメージが必要ですが、PC-8801のサブシステムのROMでも代用可能です。

フロッピーだけで3種類6ドライブあると、メニューがかなり窮屈ですね(苦笑)
使えるドライブだけ表示するようにするとか、工夫した方がいいのかも。



2011/4/12

PC-9801-03/13相当のデータレコーダに対応しました。
8237の入出力をそのままファイルに落としているだけなので、波形情報にはなっていません。
実機のテープを持ってくる方法については保留とさせてください。



2011/4/1

200ラインモードにおいて、グラフィックが正常に表示できるようになりました。
また、FM音源のIRQ周りの結線をし忘れていたのを修正しました。
ついでにFM音源に接続されているジョイスティックもサポートしています。

初期ハードの再現となると、後はデータレコーダと320KBフロッピーの対応ですね。
マウスとSASIハードディスクはどうしようかしら。



2010/9/29
初代PC-9801を調達できましたので、ROMを吸い出して動作確認をしてみました。
で、ROM BASICすら起動しない体たらくで(苦笑)
通常のPC-98x1だと、RECALIBとSENCE INTSTATでドライブの存在確認をして、
SENCE DEVSTATでメディアの存在確認をするというのがお約束なのですが、
初代PC-9801ではRECALIBとREAD IDを実行して、SENCE INTSTATでステータスを
確認することでメディアの存在確認をしているようですね。

従来の実装だと、SENCE INTSTATではRECALIBやSEEKのエラーステータスしか
取得できないようになっていたので、その辺を修正して対応しました。


メディアの存在確認で無限ループしなくなり、ROM BASICが起動するようになりました。



で、手持ちの2HDなソフトで、比較的古めのものを吸い出して動作確認。
当時はPC-9801VX21で遊んでました。
ブートはするのですが…んー、PC-9801版のZORK1って要2画面か要GRCGでしたっけ?


ついでに、ePC-9801EでXANADUがブートできない件の修正。
こっちはREAD DATAのリザルトのうち、ST1のENとORが立っていると駄目だったようです。
EOTの設定からして、タイムアウトはしてるような気はするんですが、いいのかな?
というか、PC-9801のFDCってTCはどう処理してるんだったか調べないといけないですね。
先日ヤフオクに出てた全回路図を落とし損ねたのが悔やまれるなあ。



2010/9/20
エミュレータの開発を始めて10周年を記念した作品です。
PC-9801F2は、私にとって始めて入手した、実用的なPCでした。
中2〜高2まで、青春を共にしたマシンですので、何とも懐かしいです。

初代98とPC-9801Mが入手できていない関係で、動作確認はまだできていませんが、
まあ多分動作するんじゃないかと思います。
現在手配中なので、年内には動作確認できる予定です。


ディスクBASICを起動してみました。


デモプログラムを起動したところ。


PC-9801Fのご紹介。
グラフィックはGDCのコマンドで描画されているようです。


漢字ROMや20行モードもサポートされています。


同じくデモプログラムから、直子の部屋。


MS-DOSもブート可能です。