bochs 2.6.11で日本語キーボード

bochsがなかなか良い感じに動くのに日本語入力用のキーに対応してなくて、せっかくの98/V環境が操作できなくてちょっと残念。仕方がないのでソースをいじって日本語106/109キーボードに対応させてみる。

bochsはオープンソースなIA-32のエミュレータ(いわゆる仮想PCソフト)。https://sourceforge.net/projects/bochs/files/bochs/2.6.11/ からVisual Studio 2013用のソース bochs-2.6.11-msvc-src.zip をダウンロードして適当なところに展開。追加のライブラリなどは要らない。そして次の3つのファイルを修正。問題となるのはキーテーブルに未定義の穴が開いていて、ホストのキーボード入力から未定義のキーが送られた場合は0が返され、結果として無視されるところ。これに101キーに無くて106キーで追加や変更になる「変換」、「無変換」、「ひらがな」、右下の「\」、右上の「¥」の定義と対応するスキャンコードを追加する。ちなみに設定にあるkeymapの項目はコピペ入力用の定義でキーの直接入力には関係無く、ここをどういじっても106キーの問題は解決しない。

gui/win32.cc  334行目~
/* Todo: “…” key (ibm xxx) for Japanese 106 keyboard */ のコメントが入っているところに新しい定義を入れる。(106キー配列で不足しているキー)

/* 0x70 - 0x7f */ 
BX_KEY_KATAKANA,
0,
0,
BX_KEY_RO,
0,
0,
0,
0,
0,
BX_KEY_CONVERT,
0,
BX_KEY_NONCONVERT,
0,
BX_KEY_YEN,
0,
0,
},

gui/gui.h 512行目~
win32.ccで追加した定義をenumでBX_KEY_NBKEYSの前に追加。

  BX_KEY_KATAKANA,
  BX_KEY_RO,
  BX_KEY_CONVERT,
  BX_KEY_NONCONVERT,
  BX_KEY_YEN, 

  BX_KEY_NBKEYS
};

gui/keymap.cc  75行目~
win32.ccで追加した値に対応する項目をbx_key_symbol[]の最後に追加。

"BX_KEY_KATAKANA",
"BX_KEY_RO",
"BX_KEY_CONVERT",
"BX_KEY_NONCONVERT",
"BX_KEY_YEN"
};

iodev/scancodes.cc 771行目~
win32.ccで追加したキーのスキャンコードを追加。並び順はgui.hと同じにする。

 { // BX_KEY_KATAKANA,
   { "\x70", "\xF0" },
   { "\x13", "\xF0\x13" },
   { "\x13", "\xF0\x13" },
 },
 { // BX_KEY_RO,
   { "\x73" , "\xF3" },
   { "\x51" , "\xF0\x51" },
   { "\x51", "\xF0\x51" },
 },
 { // BX_KEY_CONVERT,
   { "\x79" , "\xF9" },
   { "\x64" , "\xF0\x64" },
   { "\x64" , "\xF0\x64" },
 },
 { // BX_KEY_NONCONVERT,
   { "\x7B" , "\xFB" },
   { "\x67" , "\xF0\x67" },
   { "\x67", "\xF0\x67" },
 },
 { // BX_KEY_YEN, 
   { "\x7D", "\xFD" },
   { "\x6A", "\xF0\x6A" },
   { "\x6A", "\xF0\x6A" },
 },

vs2013\bochs.sln をVisual Studio 2013で開き、ビルド→ソリューションのビルドすると、obj-debug(デバッグ版)かobj-release(リリース版)に生成物ができる。そこそこ出るワーニングは無視してbochs.exeができればビルド完了。

ゲストマシンを実行してキー入力の動作を確認する。ゲストのOSは106キーで日本語配列を使うように設定する。98/VでXFER/NFERのエミュレーションも問題なし。

bochsが良いのはハードウェアの仮想化支援を使わずに純粋にソフトウェアのみで実装されていて動作は遅いが他のプラットフォームへの移植性が高いこと。もしWindowsやMacosがx86、x64から離れてVirtualBoxやVMwareやカーネルモードを使うqemuがおかしくなるようなことがあっても、それなりの演算速度を持つホストならbochsは動くはず。それとDOSのEMM386.EXEが使用セグメント指定無しでも問題なく動くこと。qemuやほかの商用仮想化ソフトでもこの安定感は得られない。



2006年に日本語とハングルのキーボードのパッチが出てるのに、OS/2パッチだけCSVにマージしてキーボードは無視された様子。
#301 Japan and Korea key support & Cirrus support for OS/2
https://sourceforge.net/p/bochs/patches/301/

あと、3モードFDD対応は本体からBIOSソースまで、すべて1セクタ=512バイトで至る所ハードコードしてあって、ちょっとやそっとでは無理っぽい。256バイト/セクタも同様なんでCP/Mのディスクイメージも無理。

bochs 2.6.11で日本語キーボード」への1件のフィードバック

  1. ピンバック: の回想録

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中