OpenMSX 1.7.0 初期設定変更+キー暴走対策(2020/03/13更新)

 

※(2020/03/07) OpenMSX1.7.0情報と、CAPS,半角/全角キー問題の対処、同時押し化け問題を追記しました。
※(2020/03/08) 同時押し化けが実機再現である事や、同時押し化け再現の無効化について追記しました。
※(2020/03/10) 自前でmachine設定をカスタマイズしたい場合、MyDocument/openMSX/share/mahinesに配置したファイルが優先されるのでそちらに置くことを推奨するよう追記
※(2020/03/13) LALTにCapsLockを割り当てるとGRAPHキーが使えなくなるため、秀CAPS64を推奨するようにしました。

OpenMSX 1.7.0が出ました。
https://openmsx.org/

f:id:uniskie:20220307201924p:plain

 

■ 1.7.0の注目点

1.6.0ほどの大きな変更は見られませんが、細かい利便性の向上やバグフィックスが主な変更です。細かい問題まだまだたくさんありますね。

https://raw.githubusercontent.com/openMSX/openMSX/RELEASE_17_0/doc/release-notes.txt

残念ながらCAPSキー半角/全角キーや、かなファイル名問題は依然として残ったままです。(対策は後述)

■ 1.6.0の注目点

SDL2(入力描画音声などのライブラリ)とTcl8.6(スクリプト)への移行が大きな変更点。(エミュレーション以外の内部動作が少し変わっているようです)

機能面では利便性の向上と、OPLLの改善が一番大きいかと思います。

NukeYKT OPLLコアへの変更

以前より再現度が上がりました。(以前はハイハットの音量が低く、音も結構違い、BlueMSXと同じような感じでした。)

ただし、実機に比べるとフィルタが実装されていない為、逆に全音域がクリア過ぎて高音域やリズム音が逆に少し目立ち過ぎる感じです。
これは同じく2021年8月頃のアップデートで再現度が上がった最新のEMU2413や、VM2413でも同様です。

新しく曲を作る分には音域の幅が広くて良いのですが、過去に作られた名曲を聴く場合は、結構パート間の音量バランスが破綻するレベルになっていたりします。

ローパスフィルタやハイパスフィルタもエミュレーションで設定できるようになると嬉しいのですが……。

■ セットアップ

起動方法や準備などは他を検索してみてください。
BIOSを自前で用意する場合など)
https://umipi.hatenadiary.org/entry/2020/05/10/000008

■ 起動方法(Catapultの薦め)

OpenMSX.exeでは無くて、
OpenMSX\Catapult\bin\Catapult.exeを起動してやると楽です。
(OpenMSXをダウンロードしてインストール/解凍すると入っています)

UIで色々設定をしたり、ROMやディスクを入れ替えたりもできます。
ディスクイメージやROMファイルをドロップしてやるとそこにセットされます。

また、DiskへフォルダをドロップするとPCのフォルダをDiskとして読み書きできます。(ファイルアクセスのみ。ファイル数と容量も2DDで可能な数まで)

OpenMSXとリアルタイムに連動しますので、結構便利ですね。



■ 設定ファイル

OpenMSX設定は、
%My Documents%\openMSX\share\settings.xml
に保存されます。

マイドキュメントにない場合は、
OpenMSX\Share\settings.xml
のものがマイドキュメントへコピーされます。

■ キーボードトラブル

日本語への対応はイマイチで、たまにトラブルが起きます。
その場合の対処法を軽くまとめ。

  • 半角/全角でおかしくなった
    →ALT+半角/全角を押すか、違うウィンドウにフォーカスを移動する。
    予防策→半角/全角キーに「なにもしない」を割り当てる。(次項参照)
  • CAPSが点滅する
    →SHIFT+CAPSで切り替えるか、違うウィンドウにフォーカスを移動する。
    予防策→CAPSキーに「なにもしない」を割り当て、左ALTキーにCAPSキーを割り当てる。(次項参照)
  • かなキーが勝手に解除される
    予防策→かな自動解除機能を無効化する(次々項参照)

■ CAPSLOCK、半角/全角キーが勝手にリピートされる問題

SDLという色んな機種用に共通して利用できる基本システムを使って、キー入力やウィンドウ描画や音声再生をしているのですが、このSDL側の問題で、

・半角/全角キーを離しても通知がすぐに来ない

・CapsLockキーを離しても通知がすぐに来ない

という問題があります。

違うウィンドウにフォーカスが移動するとキーを離したことが通知されるのですが、

それまで通知されないので一生押したまま扱いになってしまうようです。

*1

 

解決方法(CAPSLOCKキー):

CAPSLOCKキーを無効化して、LALTに割り当てる方法を試してみたのですが、
そうするとGRAPHキーが使えなくなってしまいました。

そこで、秀CAPS64を使用して、SHIFT無しでも英数キーではなくてCAPSLOCKとして扱うように変更する方法をお勧めします。

f:id:uniskie:20220313124214p:plain

こうするとなぜかOpenMSXで、SHIFT無しでのCAPSLOCKキーを検出できなくなって、自動リピート暴走が無くなります。

CAPSLOCK状態を切り替えるにはSHIFT+CAPSLOCKキーを使ってください。

(SHIFT+CAPSLOCKキーはCAPSキーとして認識され、リピート暴走もしません)

 

解決方法(半角/全角キー):

OpenMSXエミュレーター側で、該当キーを無効化し、CAPSキーの代わりに左ALTをMSXのCAPSキーとして扱うように設定します。

*2

 

%My Documents%\openMSX\share\settings.xml
を開き<bindings>から</bindings>の間に

  <bindings>
    <bind key="keyb BACKQUOTE"/>
    <bind key="keyb BACKQUOTE+SHIFT"/>
    <bind key="keyb BACKQUOTE+CTRL"/>
    <bind key="keyb BACKQUOTE+CTRL+SHIFT"/>
    <bind key="keyb BACKQUOTE+ALT"/>
  </bindings>

を追加、保存します。

例)

<!DOCTYPE settings SYSTEM 'settings.dtd'>
<settings>
  <settings>
    <setting id="kbd_auto_toggle_code_kana_lock">false</setting>
  </settings>
  <bindings>
    <bind key="keyb BACKQUOTE"/>
    <bind key="keyb BACKQUOTE+SHIFT"/>
    <bind key="keyb BACKQUOTE+CTRL"/>
    <bind key="keyb BACKQUOTE+CTRL+SHIFT"/>
    <bind key="keyb BACKQUOTE+ALT"/>
  </bindings>
</settings>

※<settings>~</settings>の中に、さらに<settings>~</settings>と<bindings>~</bindings>がある形です。

■参考:コンソールコマンド

OpenMSXでF10を押すと出てくるコンソールでbindコマンドでも

bind RCTRL keymatrixdown 6 0x08
bind RCTRL,release keymatrixup 6 0x08

のようにキーに機能割り当てができます。

(※ LALTはGRAPHキーとして使用しているので、空いているのはRCTRLぐらい?)

 

keymatrixdown 6 0x08
は、MSXキーマトリクス6行目の0x08(CAPSキー)を押すというコマンドです。

keymatrixupは指定したキーを離すというコマンド)

 

ただ、「なにもしない」を割り当てる方法が分からなかったので、
settings.xmlファイルで指定するようにしました。

 

※ ちなみに、bindコマンドで設定した物は「OpenMSX終了時設定自動セーブ」を有効にしているとsettings.xmlに保存されます。

 

もし、右CTRLキーにCAPSLOCKを割り当てたい場合は

    <bind key="keyb CAPSLOCK"/>
    <bind key="keyb CAPSLOCK+SHIFT"/>
    <bind key="keyb RCTRL">keymatrixdown 6 0x08</bind>
    <bind key="keyb RCTRL,RELEASE">keymatrixup 6 0x08</bind>

をsettings.xmlの<bindings>セクションに追加してください。

 

■ かなキーが勝手に解除される問題

OpenMSXの初期設定は、英語圏向けに

「かなキーは次に1文字入力すると勝手に解除される動作」
に設定されています。

英語圏では特殊アクセント文字を入力する際に使うキーになっているため)

日本語圏では勝手に解除されるのは非常に困ります。
そこで「カナキー自動解除機能」をOFFに変更する必要があります。

解決方法:
%My Documents%\openMSX\share\settings.xml
を開き<settings>から</settings>の間に

<setting id="kbd_auto_toggle_code_kana_lock">false</setting>

を追加、保存します。

例)

<!DOCTYPE settings SYSTEM 'settings.dtd'>
<settings>
  <settings>
    <setting id="kbd_auto_toggle_code_kana_lock">false</setting>
  </settings>
  <bindings>
    <bind key="keyb BACKQUOTE"/>
    <bind key="keyb BACKQUOTE+SHIFT"/>
    <bind key="keyb BACKQUOTE+CTRL"/>
    <bind key="keyb BACKQUOTE+CTRL+SHIFT"/>
    <bind key="keyb BACKQUOTE+ALT"/>
    <bind key="keyb CAPSLOCK"/>
    <bind key="keyb CAPSLOCK+SHIFT"/>
    <bind key="keyb LALT">keymatrixdown 6 0x08</bind>
    <bind key="keyb LALT,RELEASE">keymatrixup 6 0x08</bind>
  </bindings>
</settings>

これで、初期設定で、かなキー自動解除をしなくなります。

■ キー入力同時押しが化ける問題(キーゴースト)

OpenMSXでのキー同時押し化け現象。

画像

「7890」が「7890;」に化けたり、
SHIFT+K+LがCTRL+LやCTRL+Kに化ける。

これはMSX実機の仕様(バグ?)を忠実に再現した物だそうです。
(キーマトリクスの上下が影響しあってしまう現象)
実際に、CASIO MX-10、Panasonic A1GTの実機で同様の現象が発生するのを確認しました。

これはOpenMSXが完全な再現を目指しているので実装されているのですね。

該当処理は OpenMSX/src/input/keyboard.cc の doKeyGhosting()で処理されています。

f:id:uniskie:20220308184642p:plain

OpenMSX/src/input/keyboard.cc

ゴーストも2タイプあって、SHIFT・GRAPH・CODE(かな)の3つにLEDを挟んでゴースト対策した機種と、全部にゴーストが発生するものがあるようです。

これらは機種毎の設定記述ファイルで制御されています。
OpenMSX/share/machines/*.xml 

<msxconfig>
  <devices>
    <PPI id="ppi">
      <key_ghosting>false</key_ghosting>
    </PPI>
  </devices>
</msxconfig>

のように、<devices>の<PPI>の中の設定になります。

  • key_ghosting"
    falseならキーゴーストを発生させない。
    (省略時はtrue)
  • key_ghosting_sgc_protected
    falseならShiftGraphicCodeの保護をしない。(Codeは日本ではかなキー)
    (省略時はtrue)

例えば、C-BIOSを使用した架空マシンの定義ではキーゴーストは再現していないのでこんな感じ。

f:id:uniskie:20220308194944p:plain

C-BIOS_MSX1.xml

CASIO MX-10/101ではキーゴーストありで、ShiftGraphCodeキーの保護もないのでこんな感じ。

f:id:uniskie:20220308195019p:plain

Casio_MX-101.xml

解決方法:

自分好みのカスタマイズMSXマシンを作る。

手順:

① お好みのマシンのxmlをコピー

openMSX/share/mahines から、
%My Documents%\openMSX\share\mahines にコピーを推奨します。
同じファイル名であれば、%My Documents%\openMSX\share\mahines に配置したファイルが優先されます。
また、アップデート時に上書きれる心配もなくなります。

② ファイル名変更と、設定マシン名を変更

openMSX/share/mahines に置く場合や、既存のマシンと共存させたい場合、ファイル名を変更すると分かりやすいです。

例)Casio_MX-10.xmlCasio_MX-101k.xml

とし、

  <info>
    <manufacturer>Casio</manufacturer>
    <code>MX-101k</code>

とする等。

PPIグループの設定にkey_ghosting falseを追加

    <key_ghosting>false</key_ghosting>

あとは、CatapultでFile→Test MSX Hardwaresを実行して、記述に問題が無ければMSXTypeで選べるようになります。

例)

f:id:uniskie:20220308200134p:plain

f:id:uniskie:20220308200156p:plain

■ カタカナ、ひらがなファイルの問題

フォルダをディスクドライブとしてマウントする機能があるのですが、そのなかにカタカナファイル名があるとFILESで化けたり、ひらがなファイル名でSAVE/LOADしようとするとOpenMSXがエラーで強制終了したりします。

(1chipMSX等では特にそういう問題はないのですが)

解決方法:

内部処理のバグは解決を待つしかありませんが、
今できる暫定対策としては
基本的にファイル名にカナを使う場合はDSKイメージで扱う」のが良さそうです。

BIOSの準備

C-BIOSであれば最初から用意されていますが、C-BIOSはディスクが使えません。
ディスクが使いたい場合、BIOSは自分で用意する必要があります。

BIOS(システムROM)を実機から取り出すには、
fMSX98 の MAKEROM.BASや
BlueMSXPanasonic dump tools や Kanjirom dump tool
などを使うといいかもしれません。
(「MSX BIOS 吸出し」で検索すると色々出てくると思います)

BIOSロムファイルをディスク等に保存したら、
OpenMSX\share\machines の中の各マシンのxmlファイルを開き、
そこに記述されているファイル名にして
OpenMSX\share\systemroms に配置します。

FDCロムはファイルサイズなど調整する必要があるかもしれません。
無理やり動かすなら手持ちのロムファイルをsha1計算ツールなどで調べて
手持ちに合わせた<sha1></sha1>を追加するのも手です。

sha1値の追加例)
複数行かいておくと、どれかに合えばOKとなります

<PanasonicRom id="Firmware ROM">
<rom>
<sha1>e779c338eb91a7dea3ff75f3fde76b8af22c4a3a</sha1>
<sha1>5fa3aa79aeba2c0441f349e78e9a16d9d64422ea</sha1>
<filename>fs-a1gt_firmware.rom</filename>
</rom>
</PanasonicRom>

 

■ デバッガ(MSXプログラムを作る人向け)

DEBUGGER.exeも別途用意されています。
こちらも高機能なので、必要ならダウンロードして使ってみると良いかもしれません。
BlueMSXには無い機能がいくつかあります。

(補足) デバッガは本体と別にダウンロードする必要があります。

デバッガを起動したら、OpenMSXが動作している状態で、Connect(⚡ボタン)を押すと、OpenMSXと連動して動くようになります。
(OpenMSXのexeを再起動するたびに行います)

※注:VisualStudioなどの開発環境を起動しているとConnectできない場合があります。その場合はVisualStudio等を終了させてください。

f:id:uniskie:20220308203450p:plain

f:id:uniskie:20220308212748p:plain


ボタン割り当てがBlueMSXのデバッガと異なりますが、
通常のトレース・ステップ実行のほかに、巻き戻しステップ実行が出来ます。

OpenMSXは巻き戻し機能が実装されていますが、それを利用して、1ステップずつ一個前に実行した命令の状態に戻っていく事が出来ます。
たとえば永久ループで停止した状態から原因までさかのぼるのも非常に簡単です。

(普通は問題を予測・推論して、問題が起きてそうなコードの手前にブレークを仕掛けたりして何度も試して推論を絞り込んでデバッグしますが、そんな面倒なことはせずに一発で原因まで到達できてしまいます。)

 

MSX TMS9918カラーの再現

OpenMSXは改造してビルドする必要もなく、machinesフォルダのxmlの設定内容を弄るだけで実機風MSXパレットにできます。

( OpenMSX\share\machines\*.xml の設定を弄る)

①BlueMSX TMS9918Aパレット改造版

f:id:uniskie:20210907003654p:plain

②OpenMSX MX-101 TMS9118 + saturation 50指定

f:id:uniskie:20210907003742p:plain

③OpenMSX MX-101 TMS9118 + saturation 75指定

f:id:uniskie:20210907003801p:plain

④OpenMSX MX-101 TMS9118 追加指定なし

f:id:uniskie:20210907003813p:plain

 

openMSX\src\video\VDP.cc
VDP::getMSX1Palette()
が良くできていて、一部癖の強い機種だけ専用パレット、他はY-Pb-Pr信号パラメータから変換しています。

調整はmachinesフォルダの*.xmlファイルをテキストエディタで開き、VDPタグに saturation、saturationPr、saturationPb の指定を追加することで可能です。(基本的にはsaturationの指定だけで良いかと思います)

例)

OpenMSX\share\machines\Casio_MX-101.xml
    <VDP id="VDP">
      ....
      <saturation>50</saturation>
    </VDP>

 

MX-101はSaturation 50%がなんとなく近い気がします。

 

情報元:OpenMSXのMSX1カラー議論スレッドログ

github.com


興味深いですね。

*1:

これが、VisualC++などのデバッガで追跡しようとしても、指定した場所に来たらデバッグウィンドウに移動するので、ウィンドウフォーカスが移動し、その際にキーを離した通知が発生するので一見問題が無いように見えてしまうというヤヤコシイ現象が起きます。何なんでしょうね。

ちなみに半角/全角キーはSDL_SCANKODE_GRAVE、SDLK_CODE_BACKQUOTEという値で通知されます。英語圏だとSHIFTと一緒に押すと「‘」という文字が入力されます。

*2:

OpenMSX 0.6.x以前はkeymapというファイルでホストPCキーとMSXキーの対応を指定できたのですが、0.7.0以降は廃止されているため、指定しても無視されます。

最近まで方法が分からなかったのですが、やっとやり方が分かったのでメモしておきます。