
# M88 - PC8801 Series Emulator

## 初めに

cisc氏作のPC-8801エミュレータ[M88](http://retropc.net/cisc/m88/)を改造した私家版です。

* 最近のコンパイラでビルドできる様に修正。
* 今時の環境に合わせてデフォルトの設定値を変更。
* 英語101キーモードの追加。
* ウインドウ座標を保存するオプションを追加。
* PC-8001mkIISR ひらがなフォントファイルの形式を変更。
* fmgenの修正。
* [c86ctl](https://launchpad.net/c86ctl)用の制御を追加。

## M88am について

上記 rururutan 氏版をベースに、さらに個人的な改造を加えたものです。
本改造版は **M88am** と呼びます（本家 M88 および rururutan 氏版と区別するための呼称です）。  
あらかじめお断りしておきますが、本カスタマイズは「**Claude Code**」により実施しております。

* デバッグ機能の大幅な強化
  * ポーズ / ステップイン / ステップオーバー / ステップアウト
  * 実行・メモリ読み書きブレークポイントと、その管理ウインドウ
  * ウォッチウインドウ、バックトレース、レジスタ編集
  * メモリ / 逆アセンブル窓のアドレスジャンプと PC 追従
  * GVRAM を R/G/B プレーン単位でダンプ
  * ブレークポイントとウォッチをディスクイメージ単位で保存
* デバッグウインドウのホイールスクロール、拡大、フォントサイズ変更、位置の永続化
* ブラウン管 (CRT) フィルタ — D3D11 描画パスの新設
* ウインドウ倍率 (100 / 150 / 200%) とフルスクリーン
* ディスクイメージの排他オープンをオプション化
* メニュー構成の整理と設定ダイアログの改善
* FM 音源 SSG-EG を本家 2.21a に差し戻し

本ドキュメントでは **M88am** で追加・変更した点のみを説明します。  
明記していない機能は rururutan 氏版のまま引き継いでいます。

**ベースからの改変内容の詳細は [CHANGES.md](CHANGES.md) を参照してください。**

### ソースの文字コードについて

**`src/zlib/` を除く全ソースを CP932 から UTF-8 (BOM付き) に変換しています**
（`src/win32/M88.rc` のみ UTF-16LE）。上流と差分を取る際はご注意ください。

コンパイラには `/source-charset:utf-8 /execution-charset:.932` を指定しています。
MBCS ビルドのまま ANSI 版 Win32 API に日本語文字列リテラルを渡しているため、
**ソースは UTF-8、実行時文字列は CP932** という組み合わせが必須です。
`/utf-8` に置き換えると文字化けします。

### ビルド構成

**x64 のみを対象としています。** Win32 (x86) 構成はプロジェクトに残していますが
ソリューションのビルド対象から外してあり、動作は保証しません。
x64 では Z80 コアに `src/devices/Z80c.cpp` の C++ 実装が使われ、
x86 専用のハンドアセンブリ版 `Z80_x86.cpp` は使用しません。

## 動作環境

* Windows 11 で動作検証を行っています。

## ライセンス

c86ctl.hは2条項BSDライセンスです。

新規ファイル/追加コードは2条項BSDライセンスになります。
M88am で新規に追加したファイルの一覧は [CHANGES.md](CHANGES.md) にあります。

`src/zlib/` はサードパーティ (zlib 1.2.8) で、zlib ライセンスに従います。
M88am では変更していません。

既存のファイルは以下のオリジナルライセンスに従います。

* M88 はcisc氏が著作権を所有しています。
* M88 とそのソースコードは一切無保証です。
* M88 そのもの、または M88 の使用や、M88 を使用できなかったことなど、M88 に関して生じた損害はすべて使用者が自ら負うものとします。作者は一切責任を負いません。また、作者は M88 に関してバグ、不具合等があったとしてもそれに対処する義務を負いません。
* M88 の転載、及び配布は禁止します。但し，M88 のソースコードに改変を加えたもの，及び M88 のソースコードを利用したソフトに関しては，その限りではありません。
* M88.exe の使用者は NEC PC-8801 シリーズの本体を所有しなければなりません。また、使用する ROM データはその本体から直接取り出した ROM データでなければなりません。使用者の所有物でない本体から取り出した ROM データは使用できません。

* M88 のソースコードの一部，または全部を組み込んだソフトは，フリーソフトとして公開することが出来ます。
* 但し，src\pc88 のディレクトリの下にあるファイルを組み込む場合，または商用ソフト(シェアウェア含む)へのプラグインソフトとして配布する場合は，同時にそのソフトのソースコードもフリーソフトとして公開ください。
* 公開の際には，ドキュメント等に M88 のソースコードの一部または全部を組み込んだ事と，著作権表示を明示してください．また，作者への連絡を頂ければ幸いです。
* M88 のソースコードを利用したソフトのソースを配布する際には，M88 のソースコードのうち，そのソフトのコンパイルに必要なものに限り，添付することを認めます。
* 商用ソフト(シェアウェア含む) に M88 のソースコードの一部，または全部を組み込む際には，事前に M88 の作者の合意を得る必要があります。
* M88 に改変を加えたソフトを配布する場合は，M88 の著作権表示，および改変内容を明示してください。


## 簡単な使い方の説明

**M88am** で追加・変更された点について、簡単な説明を行います。

### スクリーン機能
* メニューバーに追加された「**Screen**」から拡張された各機能にアクセスできます。
* ウインドウサイズは、 100%、150%、200% の何れかに設定可能です。
* 「**Full Screen**」を選択した場合、モニタいっぱいにエミュレータ画面を表示します。  
フルスクリーン中は、マウスの右クリックで **ディスクの入れ換え**、**画面モード変更**、**リセット** が行える簡易メニューが表示されます。
* 「**Tools**」メニューの「**Show Status in Full Screen**」をチェックすることで、フルスクリーン中もステータスバーを表示することが可能です。
* 「**Screen**」メニューの「**CRT Filter**」をチェックすることでブラウン管 (CRT) フィルタの効果を加えることが出来ます。
* 「**Screen**」メニューの「**CRT Filter Settings...**」を実行すると、ブラウン管 (CRT) フィルタ設定のダイアログがオープンします。
* ブラウン管 (CRT) フィルタの設定内容は iniファイルに自動的に記録されるため、次回起動時も設定した内容が有効となります。  
また、それとは別に「ユーザ1」～「ユーザ3」の3つのプリセット領域に、任意の設定値を保存し読み出すことも可能です。
* ブラウン管 (CRT) フィルタの利用にあたっては、 **M88** の設定ウインドウから「画面」－「偶数ラインを表示する」をチェックしたうえで適用するほうが効果的です。

### デバッグ機能
* 「**Debug**」メニューから各デバッグ機能にアクセスします。
* 従来より実装されていたデバッグウインドウについては、文字フォントを大きくする修正を行いました。
* メモリウインドウ、コードウインドウについては「**Ctrl + G**」キーを押下することで、飛び先の番地を指定できます。
* ステップ実行に対応しています。  
「**Debug**」メニューより「**Pause**」を実行するか、後述のブレークポイントを設定することでエミュレータの動作を停止しステップ実行できます。  
再度、動作させる場合は「**Debug**」メニューより「**Play**」または、「**F5**」キーを押してください。  
停止中、ステータスバーの色が変わります。
* ステップ実行の際は、「**Step In**（**F11**）」「**Step Over**（**F10**）」「**Step Out**（**Shift + F11**）」の各機能が使用できます。
* 「**Step Over**」は **CALL**、**RST**、**LDIR** 系の命令を1つの単位として飛び越します。
* 「**Step Out**」はスタックの先頭を戻り番地とみなして、呼び出し元まで実行します（戻り番地と判断できない場合は何も起きません）。
* 「**Debug**」メニューの「**Skip Interrupts while Stepping**」がチェックされている場合、ステップ実行中の割り込みは止まらずにそのまま処理されます。
* 「**Debug**」メニューの「**Show Breakpoints**」を実行することで、ブレークポイント管理ウインドウがオープンします。  
新規ブレークポイントの追加、変更、削除に加え、ブレークの **有効** ／ **無効** の設定も行えます。
* ブレークポイント追加の際は、任意のアドレスに対し実行またはメモリの Read / Write 発生といったブレーク条件を設定します。
* 「**Debug**」メニューの「**Show Watch**」を実行することで、ウォッチ管理ウインドウがオープンします。  
ウォッチ対象の確認と管理が行なえます。
* 「**Debug**」メニューの「**Trace Execution**」をチェックすることで、最大 100命令ぶんのトレースログ（バックトレース）が記録されます。  
チェックした場合、エミュレーションのパフォーマンスが低下することがあります。
* 「**Debug**」メニューの「**Show Trace**」を実行することで、記録済のトレースログを確認できます。  
また「**Clear Trace**」で記録済のログを削除できます。
* 「**Debug**」メニューの「**Save Settings per Disk**」をチェックすることで、ブレークポイント、ウォッチの設定情報をディスクイメージに紐づけて保存できます（ディスクイメージと同じフォルダに「.m88dbg」ファイルとして自動作成）。  
次回、読み込みの際に自動的に設定がロードされます。
* ブレークポイントの設定情報読み込み時、ブレークポイントはすべて **無効** 状態で読み込まれます。

### M88 用 機能拡張モジュール「DISKDRV」について
**M88** 本体が x64 となったことにともない、公式サイトで配布されている「DISKDRV」は動作しなくなりました。  
「DISKDRV」についても x64 ビルドしたバイナリ「diskdrv.m88」を含めています。  
なお、ROMファイル「e1.rom」は配布対象外としているため、別途、公式サイトから入手してください。

## 参考にしたもの

**M88am** のカスタマイズを実施するにあたり、以下を参考にさせていただきました。  
ありがとうございます。

### M88g http://www.retropc.net/gimons/
* デバッグ機能の拡充にあたり、CPUのRun/Stop 実装を参考にさせていただきました。
* ウインドウサイズを変更するにあたり、 M88g の 200% 拡大実装を参考にさせていただきました。

### yosshin4004.github.io https://yosshin4004.github.io/
* ブラウン管 (CRT) フィルタ実装にあたり「レトロゲームのドット絵の拡大表示と EOTF/OETF の関係」の記事を参考にさせていただきました。
