MZ-2000というかEmuZ-2000 TF-Editionのメモ書き

気づいたことをメモ書きにしておきます。


プラグイン作成のメモ書き

独自で調べたもので、内容は無保証です。憶測の部分もあるのでかなり思い込みがあると思われます。DLLの作り方の基礎はオリジナル作者EmuZ-2000氏のExtBoardDLL拡張ボードDLL、<連載>拡張ボードDLLを作ろう!の記事が参考になるかも。この連載がもう少し続いていればうちの調査は不要だったかも?

  1. 記述する関数


  2. EMUZ2000EBIH構造体
    名前意味
    szGuidCodeTCHAR配列(配列長:MAX_GUID_LENGTH)プロファイル内でプラグインを識別するのに使われるGUID
    szBoardNameTCHAR配列(配列長:MAX_BOARD_NAME_LENGTH)プラグイン名
    szBoardInfoTCHAR配列(配列長:MAX_BOARD_INFO_LENGTH)プラグイン概要
    szDllCopyrightTCHAR配列(配列長:MAX_DLL_COPYRIGHT_LENGTH)著作権情報
    szDllMakerUrlTCHAR配列(配列長:MAX_DLL_MAKER_URL_LENGTH)作者ホームページ
    szDllMakerMailTCHAR配列(配列長:MAX_DLL_MAKER_MAIL_LENGTH)作者メールアドレス
    dwIoModeDWORD未使用?
    ioMapperMAPIOSTRUCT構造体I/O情報の構造体。下記参照
    flgsEXTFLG共用体プラグインの機能指定。USE_INFODIALOGのみ効果あり。
    ※ツール→プラグイン設定で開いたダイアログに表示される情報。


  3. MAPIOSTRUCT構造体
    名前意味
    fInportFuncEMUZ2000INPORTFUNC関数INP処理関数名
    fOutportFuncEMUZ2000INPORTFUNC関数OUT処理関数名
    ucStartPortUCHAR使用ポート
    nCountUCHARポート数
    ※ツール→プラグイン設定で開いたダイアログに表示される情報。

  4. 用意するソース


  5. コンパイル方法
    Visual Studio 2015でのコンパイル方法です。ファイル→新規作成→既存のコードからプロジェクトを作成を選択。 プロジェクトの種類は当然Visual C++、場所にソースを保存したフォルダを指定、プロジェクト名をボード名、プロジェクトの種類にダイナミックリンクライブラリを指定して完了。 *.c、*.h、*.rc、*.defが自動的に追加されます。プラグインソースのinterface内のplugin_ex.cとplugin_ex.hを追加(これはもしかしたら必要なら。うちは本体のメモリアドレスを得るのにこれに含まれる関数を使用しました)。 ビルド→ソリューションのビルドでコンパイルできます。str系関数でたくさんの警告が出ましたけど、unsafeとか言われても知ったことかって思って無視です。 環境設定が悪いのか、リソーススクリプトが参照してるDS_XXX関係が見つからない場合があったので、リソーススクリプトに#include <windows.h>を挿入したりしました。 また、構成プロパティ→リンカー→入力のモジュール定義ファイルに*.defを指定しないとエクスポートしてくれない(エミュレータのツール→プラグイン設定で作成したプラグインが認識されません)ので要注意。原因究明にテストプログラムを作ったり大変だった。


  6. プラグイン作成時のメモ
    メインメモリを参照:interface/plugin_ex.cをプロジェクトに加える。emuz2000_getMainMemoryPointer()を呼び出すとメインメモリへのポインタが戻される。引数はBoardInfomationServiceの2番目の引数から得られるIDを指定する。
    GRAMを参照:interface/plugin_ex.cをプロジェクトに加える。emuz2000_getGraphicRamPointers()を呼び出すと、2番目の引数にGRAM1、3番目の引数にGRAM2、4番目の引数にGRAM3へのポインタが戻される。1番目の引数は、上記と同様のIDを指定する。



MZ-1R13(漢字ROMボード)の利用

MZ-2Z021(漢字COLOR DISK BASIC)が無いと設定しても表示するすべがないと思われます。 漢字を表示させるのに必要なものは、DLL(emuz2000plugins_tf0_8d.zipに含まれてます)を本体のフォルダへ置き、EmuZ2000TF.iniをメモ帳などで開いてreadme.txtにあるように設定を記述します。 漢字ROM(アルゴの記憶にある漢字フォント作成プログラムで作成する)、 辞書ROM(sugaのジャンク部屋にあるオリジナル辞書作成ツールに含まれてます。手を加えた場合は作成します。)が必要です。 emuz2000plugins_tf0_8dで、漢字ROMと辞書ROMのファイル名の変更があり、元のDLLで使われていたファイル名ですと読み込まれなくなりました。 漢字ROMを「mz_1r13_kan.rom」、辞書ROMを「mz_1r13_dic.rom」とリネームしてください。
(2016-03-05追記:2016-02-26公開のemuz2000plugins_tf0_95_3のドキュメントChangeLog.txtにファイル名が記載されました)


コピー&ペースト機能

Version 0.94.1から表示画面をクリップボードへコピーする機能とクリップボード内のテキストをペーストする機能が追加されました。 コピーは表示イメージ通りにテキストがクリップボードへ転送され、ペーストはクリップボードから1文字づつ文字を打ち込まれた状態のように振る舞います。 一部のコードを除いてemuz2000_charcode.txtに対応するコードに置き換えられます。

  1. カナ文字の「シ」が正常に処理されない問題
    Version 0.94.2現在、emuz2000_charcode.txt内のカナ「シ」が「セ」となってるので、コピーするとシはセになり、 ペーストではシは無視されてしまいます。内容を自分で直せば問題なく動きます。
    Version 0.95.4で問題解消されました。TS-1000/2000でペースト時に複数改行される問題も解消

  2. クリップボード内のカナ文字を半角にしたい
    emuz2000_charcode.txtのカナ文字を半角に置き換えればできます。全角(2バイト分)を半角1文字とスペース1バイトで置き換えれば問題なく処理されます。(要は英数字と同じようにするだけです。) WindowsのテキストファイルでBASICソースをオリジナルに近い状態で格納できると思います。

  3. ペースト時に文字が欠落する
    ペーストの設定をNormal、MZ-1Z001上でペーストした場合、タイミングによって文字が欠落するケースが発生してます。 ペーストする行が長い場合に発生するみたいで、次の行の先頭数バイトが欠落したりします。うちのWindows動作が重たいのかもしれませんけどね。 一画面分を送りこもうとせずに、長い行は1行づつ、あとは小分けして送り込めば問題ないのでゆっくりとやってます。 (2016-03-08追記:改行されてから内部処理で時間がかかる場合に欠落するケースがあるとか。モニターとは関係ないので、欠落する場合は貼り付け設定で待ち時間を変更して対応とのこと。)

EmuZ-2000用ステートセーブ(状態ファイル)の読み込み

EmuZ-2000 TF-Edition Ver0.92.0にはEmuZ-2000のステートセーブ(*.emuz)の読み込み機能があります。 読み込めるのは、EmuZ-2000のステートセーブVer1.0フォーマット(*.emuzをテキストエディタで開いて、ファイル先頭にある文字列が「EmuZ-2000 State Save 1.0」とあるもの)です。 EmuZ-2000の最新版は、ステートセーブVer1.1フォーマットとなっており、読み込みができません。1.0と1.1の違いは、ステートセーブのヘッダ部で、1.1の方が48バイト大きいだけだそうです。(この48バイト分の内容の違いは忘れてしまったので不明です、) 1.1フォーマットならヘッダと思われる部分の48バイトを削り、ファイル先頭の識別子を1.0にしてしまえば読める可能性が出てくるわけです。

  1. バイナリエディタ(うちはStirlingを使用)でステートセーブを開く。
  2. アドレスの100辺りから48バイトをカット。
  3. アドレス17の31を30へ書き換える。(ファイル先頭からEmuZ-2000 State Save 1.0となるはず)
  4. エミュレータのファイル→状態ファイルの読込で読ませる

挙動がおかしいと思われる場合は、BASIC上のプログラムならBREAKさせてRUNしてみるのも手です。また、リセットして動く場合もあります。


S-OS上のテキストファイルをWindowsのテキストファイルからインポートする

Windows上のテキストファイルとしてソースコードなどを入力し、それをS-OS上へ持っていく事ができます。 Windows上で改行コードがCR(0x0D)、終端コードNULL(0x00)のファイルを作成。うちのステートセーブ内のメモリ編集ツールでバイナリイメージとして埋め込み利用します。

  1. S-OSを動かした状態でステートセーブを行う。E-MATEとかSLANGなどをロードしておくといいかも。
  2. Windows上で目的のテキストファイルを作成。ASCIIコードのマップが違う点も考慮して作成(中括弧が■になるとか)
  3. S-OS用の最終調整。ファイル最後に終端コードNULLを1文字挿入、改行コードCRで保存(Sakura Editorがおすすめ)。
  4. ステートセーブ内のメモリ編集ツールでバイナリとして埋め込み保存。アドレスはE-MATEなり使うソフトのテキスト格納アドレスに合わせる。
  5. エミュレータのファイル→状態ファイルの読込で読ませる
  6. ソフトを立ち上げ、テキストを確認する。

細かいところはバイナリエディタで補正するといいかもです。