歓迎光臨
"ePC-9801/E/U/VF" - NEC PC-9801/E/F/M/U/VF emulator for Win32
"ePC-9801VM/VX/RA" - NEC PC-9801VM/VX/RA emulator for Win32
"ePC-98XA/XL/RL" - NEC PC-98XA/XL/RL emulator for Win32
"ePC-98DO" - NEC PC-98DO emulator for Win32
"ePC-8801/mkII/MA" - NEC PC-8801/mkII/MA emulator for Win32
"ePC-8001/mkII/SR" - NEC PC-8001/mkII/SR emulator for Win32

"ePC-9801/E/U/VF" are NEC PC-9801/E/F/M/U/VF emulator for Win32.
"ePC-9801VM/VX/RA" are NEC PC-9801VM/VX/RA emulator for Win32.
"ePC-98XA/XL/RL" are NEC PC-98XA/XL/RL emulator for Win32.
"ePC-98DO" is NEC PC-98DO emulator for Win32.
"ePC-8801/mkII/MA" are NEC PC-8801/mkII/MA emulator for Win32.
"ePC-8001/mkII/SR" are NEC PC-8001/mkII/SR emulator for Win32.
These softwares are under GNU GENERAL PUBLIC LICENSE.

This software requires Windows XP/Vista/7/8/8.1/10.

Download: Jump to Common Source Code Project



ePC-9801/E/U/VF 謎WIPページ
ePC-9801VM/VX/RA 謎WIPページ
ePC-98XA/XL/RL 謎WIPページ
ePC-98DO 謎WIPページ
ePC-8801/mkII/MA 謎WIPページ
ePC-8001/mkII/SR 謎WIPページ

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

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

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



2023/6/11
PC-8001/8801/98DOにおいて、DMACのステータスのUPDATEビットを操作するようにしました。
VRAMからCRTCにDMA転送が終わったことの検出に使っているソフトもあるかもしれません。
普通はTC2ビットの方を見ると思いますが(苦笑)



2023/5/29

2HD版のCDOS2が起動するようになりました。
uPD765Aで、1トラック内で倍密度・単密度のセクタが混在するケースに対応しました。


PI.様SDI88で、MFM/FMモードで解析した結果。
倍密度が8セクタ、単密度が2セクタ混在しています。


内蔵デバッガも確認してみましたが、正しく読み込めているようです。


PDDOSの画面が表示されるようになりました。
DMAの転送長が0の場合、テキストのアトリビュートに白色が指定されているものとして、
モノクログラフィック画面を描画するようにしました。



2023/1/24

GDC周りの実装を色々修正しました。
PSET時に16bitでVRAM/EGCにアクセスするようにしました。
GDCからEGCに書き込む際に、GDC側でRMWせずにそのまま書き込むようにしました。
VECTWでDGDがセットされたときに、PITCHの値を半分にして処理するようにしました。

Windows 3.1のペイントブラシで、直線の描画時にごみが表示されなくなっています。



2022/12/31
PC-9801シリーズのマウスの処理を改良しました。
カウント値を-128〜+127の範囲で取得するように修正しました。
また、1フレームで一気に大きく動かしたときに、カーソルが飛ばないように改良しました。



2022/12/29

ラインカウンタ制御周りを再修正しました。
DAIVA カリ・ユガの光輝で、テキストのスクロールがチラつく問題が解決しています。
マンハッタンレクイエムと同じ問題ですが、SURが大きい値の場合を考慮した修正を入れました。


テキストのアトリビュートの、ブリンクとリバースの処理を修正しました。
緋王伝2で、カーソルの▼を表示した部分が反転したままになる問題が解決しています。



2022/12/24

スーパーリアル麻雀P2&P3で、クラッシュする問題を修正しました。
また、GDCでCR=40,PITCH=80,LR=1と設定したときに、画面が縦に伸びてしまう問題を修正しました。
タイトル画面が正しく表示できるようになっているかと思います。


Xakが操作できない問題を修正しました。
FM音源のポートAにはジョイスティックが繋がっており、必ず入力モードで使います。
しかし、何故かXakでは起動時にこれを出力モードに変更してしまっていました。
ジョイスティックの状態を正しく読み取れず、しかし、その値をジョイスティックの状態として
扱っていたため、全方向、全ボタンが押された状態と判定してしまっていたようです。
YM2203の方で、モード設定によらず、強制的に入力モードとする仕組みを追加して対処しました。



2022/12/17
PC-9801シリーズの画面描画周りの処理を色々と修正しました。


THE RETURN OF ISHTARで、画面が崩れる問題を修正しました。
GDCのPITCHコマンドでVRAM上の画面の幅を変更して、
更にSYNCコマンドのC/R、SCROLLコマンドのL/Fで、表示範囲を狭めていました。
このような場合に、画面をセンタリングするようにしてみました。


Topple Zipで、画面のスクロールで画面が崩れる問題を修正しました。
SCROLLコマンドで画面領域を分割して、それぞれL/Rで縦2倍に拡大表示していました。
200/400ラインで、VRAMの使い方を合わせたかったのかな?


マンハッタンレクイエムのオープニング、夢幻戦士ヴァリスのゲームオーバ後のスタッフロールで、
テキスト画面のスクロール時に、表示がちらつく問題を修正しました。
ラインカウンタ制御のスムーススクロールライン数の変更と、テキストVRAMの内容の変更と、
エミュレータが画面を描画する処理と、タイミングが噛み合っていませんでした。
垂直表示期間が始まってちょっと過ぎた時点の、ラインカウンタ制御の各レジスタの値と、
垂直表示期間が終わった直後の、テキストVRAMの内容を保持しておいて、
それらの値を使ってテキスト画面を描画するようにしたところ、表示が安定しました。

その他、2021/1/17のuPD765Aの変更で、アンフォーマットのディスクイメージに対して、
物理フォーマットが失敗するようになっていた問題と、
2HD/2DD両用ドライブの2DDモード時に、ドライブ認識が変になっていた問題を修正しています。
AIE信号をちゃんと処理するようにして、却ってうまく動かなくなっていたようです。



2022/12/4
PC-9801シリーズで、メモリおよびI/Oのウェイトサイクルを追加しました。
このため、i86/i286/i386クラスで、ウェイトサイクルを加算するようにしました。
i8237でDMA転送するときのバスの占有サイクルも追加しました。

その他、汎用メモリバスおよびI/Oバスクラスで、バス幅を考慮するようにしたりと、
コモンソースコードプロジェクト側で、かなり大工事をしています。
何か動かなくなってそうなので、お気付きの点がございましたらお知らせください。


uPD7220で、CSRWコマンドで指定したアドレスから、描画位置のX,Yの値を算出するときに、
VRAMのプレーンサイズを考慮するよう修正しました。
アリスの館で、ごみが描画されてしまっていたのが解決しているかと思います。



2022/11/17

PC-9801シリーズで、GDCのSCROLLコマンドでテキスト画面を分割した場合の処理を修正しました。
FEPが表示されない問題が解決しているかと思います。
SLをキャラクタ単位で解釈していたのを、ドット単位で解釈するよう修正してます。

2020/12/18にEGCの修正をしましたが、PC-98RLのトレーニングディスクで画面化けが発生したため、
いったん元の状態に戻しました。

その他、RAMウィンドウでFA0000h以降のアドレスにアクセスしようとしたときの修正や、
i386搭載機のA20ラインマスクを修正しています。
ただし、EMM386使用時に、ADDRESS 20 LINE ERRORが発生する問題がまだ未解決です。



2022/11/14

PC-8801-16をサポートしました。(多謝多謝>某氏)
8086-8MHzが搭載された16bitボードで、MS-DOS V1.25が動作します。
8253, 8255, 8259が載っていて、8255経由でPC-8801本体と通信するようになっています。

これにあたって、8255のポートBのモード1の動作を修正しました。
ポートBのIBFとOBFは同じ信号に割り当てられており、ポートBの入出力の向きの判定が必要ですが、
この判定処理をタイポしていました。
2013/5/11に、X1のサブCPUとの通信用にモード1/2をサポートしたときからミスってたようです。


DEMO1.BATを実行してみました。
N88.COMに引数としてBASICのプログラムを1行ずつ食わせるようになっています。


DEMO2.BAT


DEMO3.BAT


DEMO4.BAT


初代PC-9801において、常に2HD FDD I/Fが有効になるよう修正しました。
version 1.0のBIOSでブートするようになっているかと思います。



2022/11/12
PC-8801/mkIIで、400ラインモードが無効になっていたのを修正しました。
また、5インチドライブが切断されていると、エミュレータがクラッシュする問題を修正しました。
ご指摘ありがとうございます>UME-3様

PC-9801シリーズにおいて、サウンドBIOSの有効・無効はメニューで選択します。
メモリスイッチ上の値は、起動時に、このメニューの選択状態にあわせて更新されますが、
サウンドBIOSが無効の場合、メモリスイッチの値の更新がされない問題を修正しました。
また、PC-98XA/XL/RLにおいて、メモリスイッチ3のメモリサイズの初期値を変更しました。



2022/9/30

PC-9801シリーズにおいて、テキスト画面のスクロールレジスタを修正しました。
スクロールエリア外にごみが表示されたり、クラッシュする問題が解決しています。

画像は闘神都市ですが、Hit any keyの行がスクロールエリア外となっています。



2022/9/9
PC-8801シリーズにおいて、JAST SOUNDの音質向上と音量を調整しました。(多謝々々>佐藤様)



2022/8/27
PC-9801シリーズについて、メモリスイッチの内容を保存するようにしました。
またディップスイッチのSW2について、メニューから変更できるようにしました。

#何か理由があって敢えて保存してなかったような気もしますが、何だったか忘れました(汗)

コモンソースコードプロジェクト側で、NP21のI386コアを修正しました。
FPUタイプをDOSBOX2にしたのと、DOSBOXのFPU_ST80の処理を、NaNを考慮するよう修正しています。
また、SCSIデバイスについて、INQUIRYコマンドでデバイスリビジョンを返すよう修正しました。



2022/7/8
TRNジュニア用に8bit PCMやMIDIポートを実装しましたので、他機種でもサポートしてみました。


PC-8801シリーズにおいて、JAST SOUNDをサポートしました。
有効にするには、[Device] - [Printer] - [JAST SOUND]をチェックしてください。

#ああーん、の画面だとR18になってしまうので、石井君の画面です。


PC-9801シリーズにおいて、RS-232C接続のMIDI音源をサポートしました。
有効にするには、[Device] - [Serial] - [MIDI Device]をチェックしてください。


Fu-Music PlayerでMIDI音源を認識するため、システムポートのCS/CD信号がオンになるよう修正しました。
また、Intel 8251からのRx Ready, Tx Empty, Tx Ready割込みが発生するよう修正しました。

他機種もあわせて、将来的に物理COMポートや名前付きパイプもサポートしたいと考えています。



2022/4/9
PC-8801MAで、2HDアクセス時にステータスバー上のアクセスランプを緑で表示するよう改良しました。
PC-98DOについては常に赤色でいいのかな?



2021/1/17
PC-8001/8801で、前のフレームの表示期間が終了した時点のI/Oポートの値を記録しておいて、
その値をつかって描画するよう修正しました。
画面表示を停止してVBLANK中にパレットを変更して、画面表示を再開したケースで、
1フレームだけ変更前のパレットで描画されてしまう問題が解決しているかと思います。

コモンソースコードプロジェクト側で、uPD765AのTC信号の処理を修正しました。
READ/WRITE DATAコマンドで、セクターを読み書き中にTC信号がアサートされた場合、
そのセクターを通り過ぎてからリザルトを返すようにしています。



2020/12/31

PC-8801mkIISR付属デモのCARIGRAPHの画面が反転されない問題を修正しました。
CRTCのSTART DISPLAYコマンドで画面を反転するか否かを指定するようになっていますが、
テキストVRAMのアトリビュートで装飾指定されない場合、この設定が反映していませんでした。



2020/12/19
CD-ROM^2で、最初のトラックがオーディオの場合のプリギャップの値を修正しました。
提督の決断のオープニング曲の頭が切れる問題が直っているかと思います。



2020/12/18

CD-ROM^2のCD-DA再生周り、特に開始・終了位置の取得の処理を改良しました。
CDたから箱のホームステイの英会話が正しく再生されるようになっています。
ePC-Engineの方でも、The Manholeの音声が正しく再生されるようになりました。

PC-8001mkII/SRにおいて、8インチFDDをサポートしました。

PC-9801VX/RA, PC-98XL/RLにおいて、drachen6jp様のEGC周りの改良を取り込ませていただきました。
私の方で手付かずになっているQEMU/9821の改良をしていただき、感謝感謝です。
…正しく取り込めている、と思いますが、ちょっと心配だったり。



2020/12/16
8インチFDDについて、DRQ信号のマスク解除と、PC-98で言うところのFORCE READY信号をサポートしました。
DRQ信号のマスクは、0xF3のbit1がオンで解除されるようです。
FORCE READY信号は、0xF3のbit5でオン・オフを指定していました。
それぞれ、DMAタイプの5インチFDDの場合はbit0, bit4になる筈だったのかなと思います。

DRQ信号のマスクは、READ/WRITE SECTORコマンドの実行フェーズのとき解除していました。
FORCE READY信号は、ドライブの存在確認のためRECALIBコマンドを実行する際、ドライブにディスクがなくても
コマンドを実行できるように、FDCのドライブレディ信号を強制的にオンにするために使われます。

なおフォーマットに失敗する件ですが、少なくともN-88 DISK BASIC Version 1.0のformat.n88では、
DSKFでトラック数、セクタ数などの情報を取得した後、特定のトラック数でない限りは、
物理フォーマットせずに理論フォーマットを書込みしようとして失敗してしまっているようでした。
物理フォーマット済みのイメージに対してはフォーマットに成功するようです。
もしかしたら、NECからは物理フォーマット済みの8インチディスクしか販売していなかったんですかね?

PC-8801mkIISRのひらがなフォントの実装を修正しました。
PCG-8100が有効のとき、描画に使っているパターンデータが違っているのを忘れてました。

DiskDrvで絶対パスを指定しない場合、起動時のカレントディレクトリ内のファイルと見做すよう修正しました。
内蔵デバッガのNコマンドと同じ処理ですね。
ファイル選択ダイアログで別ディレクトリのファイルを選択すると、カレントドライブ・ディレクトリが
そのディレクトリに移ってしまうので、こうしないと何処にファイルが作られたか分からなくなってしまいます。



2020/12/15
8インチFDDと、内蔵でない5インチFDDを、個々に切り離せるようにしました。

PC-8001mkIISRのひらがなフォントに対応しました。要HIRAFONT.ROMです。

バスマウスが接続されていて、位置がラッチされていないときの読み取り値を修正しました。
ジョイスティックと認識されたとき、全方向が押されていると誤判定されないようになっています。

ePC-8801MAでは、モニタの種類に応じて自動的にスキャンラインの有効・無効を切り替えています。
これは、高解像度モニタのときスキャンライン有効、標準モニタのときスキャンライン無効とすると、
画面が適切に描画されるためです。2018/12/1〜12/3の記事をご参照ください。
この自動的にスキャンライン有効・無効を設定する動作を抑制するオプションを追加しました。


M88のDiskDrv相当の機能をサポートしました。
Device - Special Featuresから機能を有効にしてください。
機能を有効にすると、E1.ROMが組み込まれます。


Nモード、またはPC-8001シリーズの場合、DiskDrv80相当になります。
こちらの場合は、E8.ROMが組み込まれます。



2020/12/14

PC-8801シリーズで、DMAタイプの8インチフロッピードライブをサポートしました。
解析資料等でUME-3様にご協力いただきました。
いつもお世話になっております、多謝多謝です。



2020/12/13
CDたから箱の、BURAIのオートデモが起動しない問題を修正しました。
CD-ROM^2の論理ブロックサイズを変更したあと、Test Unit Readyコマンドで元のサイズに戻すようにしました。

また、200ラインのグラフィック画面で、テキスト画面のアトリビュートで色を指定するモードにおいて、
ハイレゾモニタでスキャンライン無効の設定のとき、スキャンラインを描画しないようにしました。



2020/12/12

テキストVRAMのアトリビュートの処理を修正しました。
今度こそミスティーブルーのテキストマスクの問題が修正されている、と思います。

カラーモードで装飾指定がされていない場合、最後に指定した装飾指定が残ってしまっていました。
各フレームの最初に、アトリビュートを初期化するよう修正しています。

また、2枚目のOPNAのステータス(0xAC, 0xAD)が正しく読めていなかったのを修正しました。



2020/12/11

CDたから箱で、ミュージック再生時に止まる問題を修正しました。
またミスティーブルーのオープニングでテキストマスクが表示されない問題を修正しました。
どちらもDMA絡みの問題を修正しています。

uPD8257では、ターミナルカウントに転送サイズ-1を指定します。
通常、テキストVRAMからCRTCの転送に使用しますが、このとき確かに2999を指定しています。
しかし、SCSIホストからRAMへの転送では、転送サイズそのまま指定していました。
セクターリード以外のコマンドでは、転送しないという意味で?0を指定しているようですが、
この場合は従来の実装では1バイトだけ転送されてしまいます。
そのため、CPUがデータフェーズでコマンドのリザルトを10バイト読み込んでいるつもりで、
その後のメッセージも読んでしまい、メッセージフェーズが終わってしまっているのに、
メッセージフェーズが始まるのを待ち続けていたようです。

また、ターミナルカウントの最上位2ビットで転送モードを指定します。
1,0でメモリ→I/Oの転送、0,1でI/O→メモリの転送、0,0でベリファイとなります。
以前はどうせCRTCへの転送しかしていなかったので、転送モードの設定を無視していましたが、
CD-ROM^2のデータ転送にDMAを使うため、転送モードに応じて転送方向を決めるようにしました。
しかし、ミスティーブルーでは、何故かCRTCへの転送モードに0,0を指定していました。
そのためテキストVRAMからCRTCへの転送が行われず、テキストマスクが表示されませんでした。



2020/12/6
PC-9801RA5のBIOSで起動しない問題を修正しました。
BIOSをROMからRAMに切り替える処理に問題があったようです。
ROMが表に出ているときも、RAMへの書込みは可能なんですね。

uPD765Aで、Nに8以上を指定した時の転送サイズを修正しました。
GIMONS様のこのツイートを参考にさせていただきました。
また、NP21/WのI386コアを、ver0.86 rev79 beta4に更新しました。
多謝多謝です。



2020/2/21
PC-9801VX/RAについて、80286/80386に加えてV30も搭載しました。
メニューのDevice - CPUから、どちらのCPUを有効にするか選択することができます。
また、ポート00F0hで有効なCPUを動的に切り替える処理も実装済みです。



2020/2/17

PC-9801/Eについて、1MB/640KB/320KBのFDD I/Fを個々に切り離せるようにしました。
ドライブレターの関係で、320KBのドライブだけ繋ぎたい、といったことが可能です。


MAMEベースのI286クラスから、8086/8088/80186/V30をI86クラスに分離しました。
I86クラスのCPUモデルは、cpu->device_model = NEC_V30; みたいな感じで、
マクロに依らずに切り替え可能です。
またV30については、8080エミュレーション機能をサポートしました。
8080エミュレーション機能を使った、CP/M-80エミュレータが動作しています。

NP21のI286の取り込みもしてみましたが、プロテクトモードの実装が不十分なため、
PC-9801VXのITFのCPUチェックを突破できませんでした。
当面、8086〜80286はMAMEベース、80386以降はNP21ベースでいくことになりそうです。

また、各x86コアに込みこまれていたMAMEベースのディスアセンブラについて、
I386用とV30用に分けて、それぞれ単体モジュール化しました。
将来的に、1機種に複数種類のCPUコアを入れる場合のためのコード整理の一環です。



2020/2/1

PC-98RLでWindows 3.1が起動するようになりました。
ハイレゾ機の広い画面で動かすと、何とも圧巻ですね。

Neko Project 21/Wのi386コアを組み込んでみました。(多謝多謝です>NP2関係各位)
FMR-50/70/80のi386/i486機にも横展開しています。

その他、uPD7220のSTOPコマンドを修正したり、メモリバスの16bit/32bitアクセスを改良したり、
SASIのIRQ/DRQ信号の生成処理を改良したり、ハイレゾ機のマウスのIRQ番号を修正したり、
PC-9801-86のPCM音源部を追加したりと、何だか色々修正が入っています。

また、ハードディスクのブランクイメージを作ってマウントする機能を追加しました。
HDI形式かNHD形式で、20MB/40MBのイメージを作成することができます。
他の機種にも横展開していますが、MZ-2800だけセクタ長が1024バイトのイメージになります。


こちらも動作するようになりました。
タイトル画面のところで、SASIからのIRQ待ちで止まってしまっていたようです。



2019/11/3


PC-98XA/XL/RLを更新しました。
VRAMやCGウィンドウのアクセス周り、水平周波数周りの修正を行っています。
取り敢えず、PCトレーニングディスクを動かす限り、正しく表示されているようです。

また、PC-9801全般について、VRAM/GRCGのワードアクセス周りを修正しました。
Artane.様の修正を部分的に取り込んでいます、多謝です。



2019/4/30
PC-8801について、CMDSING、PCG描画、スキャンライン毎のパレット変更を無効にできるようにしました。
PCGについては、Sound - PCG-8100で、サウンドにあわせて描画も無効にします。
パレットについては、Device - Display - Real Palettesです。

PC-9801について、三国志のサウンドが鳴らない問題を修正しました。
8259のISRレジスタの読み込み時、マスクレジスタを反映しないようにしています。

各々、ePC-8801MA改とrednow様の変更を一部取り込んだ形になります。
多謝多謝です>お二方



2019/1/29
PC-8001について、カーソルが表示されなくなる不具合を修正しました。



2019/1/18

PC-8001について、リセット時のRAM[0xff33]の初期値を0にしました。
PC-8001mkIIのGALAXIANが正常に起動するようになっています。



2019/1/16
PC-8001/8801について、GSX-8800をサポートしました。
また、各音源ボードの有効・無効を切り替えられるようにしました。

前回の更新で幾つかデグレしていたのを修正しました。
Nモードで片面だけ使っているディスクが起動しなくなっていたのを修正しました。
ST3のTSビットが立っていないと起動しないようです。
TSビットって、挿入されているディスクでなく、ドライブの状態を表すんでしょうか…



2019/1/11
PC-8001, PC-8001mkII, PC-8801, PC-8801mkIIの単体バイナリを用意しました。
I/O空間がフルデコードされていないのも再現できているかと思います。



2018/12/27
PC-8801MAにおいて、起動時のCD BIOSのマッピングを再修正しました。
また、CD-DAのフェードイン、フェードアウトをサポートしました。



2018/12/18


PC-8801MAのCD-ROM周りを修正しました。
MIRRORSやCDプレイヤーが起動することを確認できました。
CDたから箱は将来入手できましたら確認してみます。

主に起動時のCD BIOSのマッピングやDMAC周りを修正しました。
また、SCSI CD-ROMのNEC CD-ROM^2固有のコマンドを修正しています。

#名前ですが、ePC-8801MAで定着しているのでMCには変更しないつもりです。
#INP(99h)も、CDh(内蔵I/F)ではなく00hを返すようになっています。

最近の画面周りの修正で、従来動作していたソフトに不具合が起きているようです。
私の方で現象は把握できていませんが、一旦画面周りの実装を元に戻したうえで、
白黒グラフィックへのアトリビュートの反映やスキャンライン周りだけ入れました。
取り敢えずこれで様子を見たいと思います。



2018/12/9

PC-8801MAについて、ビデオアートボードとCD-ROMドライブをサポートしました。
X88000とM88/cdifの実装を参考にさせていただきました、ありがとうございます。

折角なのでデジタイザもサポートしたいところです。
I/O周りの資料をお持ちの方がいらっしゃいましたらご連絡くださると幸い。

CD-ROMドライブの方は動作確認できるソフトがあまりないのですが、
信長の野望 武将風雲録で、SCSIコマンドが発行されて音楽が流れるのを確認しています。



2018/12/5

PC-8001/8801において、カラーグラフィック画面のスキャンラインを、パレット0の内容によらず
黒色で描画するようにしました。
ハイドライド3の起動後の環境チェック画面で、背景が紫色になる問題が修正されています。

CRTCがリセットされた時にカラーコード0で表示される件は、後日対応を検討いたします。



2018/12/4

PC-8801MAにおいて、HAL研究所製OPM搭載拡張ボード HMB-20 響をサポートしました。
Bookworm様NRTDRV for PC-8801で使用できます。

YM2608とYM2151を共存するため、config内でmamfm.dll/mame2151.dllのパスの扱いを変更しています。



2018/12/2-2nd
本日2回目の更新です、必要な方は再ダウンロードをお願いいたします。

Bookworm様物置の情報を元に、描画処理を修正しました。多謝多謝です。
高解像度モニタの場合、スキャンラインもまとめて反転してたのかー、とか、
テキストでなくグラフィックが反転したところに黒で文字が表示されてたのかー、とか、
色々腑に落ちるところがありました。

PC-8801mkIISRのデモンストレーションディスクの銀紙の星飾りの問題も解決しています。











2018/12/2
PC-8001/8801において、白黒グラフィック画面の描画処理を修正しました。
テキストアトリビュートの反転を白黒グラフィック画面に反映しないようにしています。



2018/12/1
PC-8001/8801において、テキスト画面の描画処理を修正しました。
ePC-8801MA改の実装を参考にさせていただきました、多謝多謝です。
こちらを見る限り、白黒画面時のグラフィックと反転テキストの優先順位が肝なんでしょうか。
アナログ画面の背景色の処理も修正しています。


また、スキャンラインの描画の処理を変更しました。
奇数ラインでは、テキストは表示、グラフィックは非表示としています。
イメージとしては上のような感じですね。(左はスキャンライン有効、右は無効)

従来からRGBフィルタ有効でこんな感じでしたが、素でもそのように描画するようにしています。


ただし、PC-8801mkIISRのデモンストレーションディスクの銀紙の星飾りで、
指揮者のパターンを、背景色と同じ色で表示したテキストで隠しているところ(左右上)が、
スキャンライン有効の時に変な感じになります。
まあこれは仕方ないということで、スキャンライン無効にして実行してください。

スキャンラインの設定ですが、起動時、またはモニタの種類を変更してリセット時に、
高解像度モニタの場合はスキャンライン有効、標準モニタのときは無効に変更するようにしました。
その後で、手動でスキャンライン有効・無効を切り替えることは可能です。



2018/11/27
PC-8801において、PCキーをサポートしました。F11に割り当てられています。



2018/11/23

PC-8001/PC-8801において、スキャンライン毎にパレットが変更されるケースに対応しました。
EVER GREENのタイトル画面が正しく表示されるようになっています。
スキャンライン毎にパレットを変更することで、同時22色表示を実現しているそうです。

PC-9801RA/PC-98RLの音源を、PC-9801-86に変更しました。
8086/V30/80286機の音源は、はPC-9801-26としています。



2018/9/30
PC-98XAをリリースしました。
ハイレゾ機の最初期モデルということで、その後の機種とはI/O周りに細かい違いがあります。

後はXL^2の動作確認ですね、果たしてRLと同じバイナリで動くのかどうか…。
一応実機は確保できているのですが、かなりボロボロでして。



2018/5/24

PC-9801VX/RA, PC-98XL/RLにおいて、SASIハードディスクをサポートしました。
THD/NHD/HDI/ベタイメージの各形式をサポートしています。
BIOSフックではなく、SASI I/FおよびHDDをガチンコで実装しました。
PC-9801VX/RAではSASI BIOSのイメージが必要です。
PC-98XL/RLではBIOS内に含まれています。

Windows 3.1のテストをしてみたのですが、フロッピーから一通りコピーしたところで、
インストーラが止まってしまいました。
こちらはまだまだ時間が掛かりそうな感じですね。
ハイレゾ機のグラフィック周りのテストは、他のソフトを当たってみようかと思います。



2018/5/6
PC-98XLをリリースしました。
実機を調達できたので確認してみましたが、まだITFがないんですね。
ハイレゾ用ソフトが入手できたので、グラフィック周りの確認も進めないと。

PC-9801RAで、NEC形式のEMSをサポートしました。
ブート時の自己診断でエラーが出なくなる、程度の意味しかなさそうですが(苦笑)
また、SASI/SCSI/IDE BIOSのバンク切り替えをサポートしました。


PC-80/88のテキスト画面の、アンダー/アッパーバーを修正しました。
スネークワールドの最上部のスコア部分が正しく表示されるようになっています。
ご指摘多謝多謝です>Enriさん



2018/3/1

PC-98RLをリリースしました。
ハイレゾのグラフィックを使用するソフトが手持ちにないので、
まずはSASI-HDDをサポートして、Windows 3.1辺りでテストしようかと。


魔道物語1-2-3の画面化けを修正しました。
GDCのSCROLLコマンドで、SLに0が指定されていたのが原因でした。
この場合、一先ず画面全体の領域として扱うように修正しました。



2018/2/28

386機のITF/BIOSでブートできるようになりましたので、PC-9801RAをリリースします。
ITFのチェックでPROTECTED MODE ERRORが発生していたのですが、
リミットチェックで一般保護エラーが発生すべきところで発生していないのが原因でした。
ご調査ありがとうございます>某スレの方

MAMEのi386コアは、POP命令などではちゃんとリミットチェックしていたのですが、
MOV命令ではチェックをしていませんでした。
ITFで一般保護エラーを発生させる、mov_r16_rm16だけチェックするように修正しています。



2018/2/27
PC-9801のアナログパレットの配列長が間違っていたのを修正しました。
ご指摘ありがとうございます>某スレの方々
その他、386機のメモリバス周りを修正していますが、RAは未だ動作せずです。
纏まった時間が取れたら、ITFをしっかり読まないといけませんね。



2018/2/23

PC-9801で、DMACのTC信号をFDCに接続するよう修正しました。
また、コモンソースコードプロジェクト側で、uPD765AのST3の値を修正しました。
ご指摘ありがとうございます>858様、Thunderbolt様



2017/12/3

コモンソースコードプロジェクト側で、uPD765AのREAD DIAGNOSTICコマンドを修正しました。
指定されたC,H,R,Nが、最初のセクタのIDと異なっている場合に、No Dataを立てるようにしました。
Newtronのプロテクトに引っ掛かったときのメッセージが変化しています。



2017/11/26
PC-8001/PC-8801のテキスト画面の描画処理を再修正しました。
DMAアンダーランが発生した場合、転送できなかったアトリビュートを白色にしました。
ソーサリアンミュージックライブラリの表示がおかしくなっていたのが修正されています。



2017/11/25

PC-8001/PC-8801のテキスト画面の描画処理を再修正しました。
TOKUICHI FIGHTERの画面化けが修正されています。

前回、テキストの色番号に0が指定されている場合に、背景色で描画するようにしましたが、
これを黒色で描画するように戻しました。
白黒モード時に、アナログモードの場合はテキストもグラフィックもアナログパレットで、
デジタルモードの場合はテキストもグラフィックも固定のデジタル8色で描画するようにしました。

bookworm様のテキストおよびグラフィック VRAM についての覚え書きを参考にさせて頂きました。
まことにありがとうございます。

CPUモードがZ80 8MHz (FE2/MC)になっているとき、間違って4MHzになっていたのを修正しました。

また、PC8801MA改で修正して頂いた内容を一部取り込みました、多謝多謝です。
本体側と拡張ボード側の音源の種類(OPN/OPNA)の組み合わせを指定できるようにしました。
バックスペースキーが効かない場合がある問題を修正しました。
YM2151, YM2203が複数ある際、外部音源DLLを1回だけLoadLibrary()するようにしました。
RGB565が指定されていると、スクリーンバッファでメモリ破壊が起きる問題を修正しました。

コモンソースコードプロジェクト側で、uPD7220のブランク信号のタイミングを修正しました。
PC-9801の魔道物語1・2・3のオープニングで止まる問題が修正されていますが、
画面化けはまだ直っていません。
こちらはちょっと手古摺りそうな感じがします。



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もブート可能です。