top page > Klaviatur > here

AT 互換機用 PC-98 配列キーボード


ここは現在作成中です.

概要

このページの目的は,NEC 製の PC-98 配列キーボードである PK-KB002 の使用法を提示することです.

環境は FreeBSD 4.11 + XFree86 4.4.0 です. FreeBSD 6.2 + X.Org 6.9.0, FreeBSD 7.2 + X.Org 7.4 にも触れます.

3.5 節にて配布する patch ができたら,3.2, 3.3, 3.4 節の具体的な修正法を書いた所はもっと簡潔にした方が読み易いですね.


目次

1. このキーボードについて
2. PC との接続
3. PK-KB002 の設定
3.1 動作の問題点
3.2 設定ファイルの修正
3.3 Key Pad の補完
3.4 LED の点灯
3.5 配布ファイル

1. このキーボードについて

PC-98 配列キーボード PK-KB002 には次のような特徴があります.

FreeBSD においては,すべてのキーを PC-98 と同じに使えるようにするためには,FreeBSD の USB driver や X Window System のソース等を変更する必要があります.[2]

なお,私は所持しておりませんが PK-KB002 の Mouse のコネクタを PS/2 から USB (バスパワードハブ) に変えた PK-KB011 や,さらにそれを文豪配列にした PK-KB017 もあります.[3][4][5]
おそらくここに記したことは同様に適用できると思います.

FreeBSD 7 系 + X.Org 7 系の環境でも試したいのですが,別のトラブルが多くて遅々として進みません.

[1] PK-KB011 ですが,PC-98 にて使用した情報は公開されています.
[2] Mac OS X では PK-KB011 用の driver が公式に配布されているようです. (PK-KB002 も動くでしょう.)
[3] 製品の発表は PK-KB002 が 1997.10.23,PK-KB011 が 1998.7.15, PK-KB017 が 1998.11.2 であり,既にすべてが出荷停止です. 現時点での入手は容易ではありません.
[4] (2012.3.10) PK-KB017 を入手しました. 基本的な寸法は PK-KB002 と同一です. キーの感触は少し柔らかくなった気がします. 修飾キーのキートップの刻印は独特の日本語になっていますが,キーの側面に馴染みの名前が刻印されているので迷う事はありません. キー配置は最下段を除いて PC-98 配列と同じです. 最下段は,jp106 特有の [全角/半角], [ひらがな], [カタカナ] のキーが加わって [Space] がかなり小さいことと,[かな][Grph] の配置が逆であることとが異なります. PK-KB002 に挿し換えても,新規に追加された三つのキーか効かないこと以外は問題なく使えます.
[5] (2012.10.27) PK-KB002 をもう一台入手したので,PK-KB017 とニコイチすれば PK-KB011 になるのかと思い分解してみたのですが,コネクタの形状が違うのでダメでした.

2. PC との接続

ここでは,kbdmux が off の場合を考えます.

PC に PS/2 K/B と PS/2 Mouse とが接続されている場合,それらは次のように log に出力されます.

atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0
atkbd0: <AT Keyboard> flags 0x1 irq 1 on atkbdc0
kbd0 at atkbd0
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: model Generic PS/2 mouse, device ID 0

PK-KB002 の PS/2 コネクタに Mouse を繋げ,それを PC の USB コネクターに接続すると,次のように log に出力されます. 番号付けは PS/2 K/B が優先なので,接続するのが OS の起動前でも後でも結果は同じです.

ukbd0: NEC PC98KEY USB KBD/M, rev 1.00/1.00, addr 2, iclass 3/1
kbd1 at ukbd0
ums0: NEC PC98KEY USB KBD/M, rev 1.00/1.00, addr 2, iclass 3/1
ums0: 3 buttons

PS/2 K/B を接続しない場合には,当然ですが USB K/B が kbd0 になります.

(注意) PK-KB002 に PS/2 Mouse を挿していなくても,USB Mouse があると認識されます.

これを抜くと,次のように表示されます.

ukbd0: at uhub0 port 1 (addr 2) disconnected
ukbd0: detached
ums0: at uhub0 port 1 (addr 2) disconnected
ums0: detached

usbdevs を実行すると次のように出力されます.

# usbdevs -v
Controller /dev/usb0:
addr 1: full speed, self powered, config 1, OHCI root hub(0x0000), NEC(0x0000), rev 1.00
 port 1 addr 2: low speed, power 100 mA, config 1, PC98KEY USB KBD/M(0x0011), NEC(0x0409), rev 1.00

3. PK-KB002 の設定

3.1  動作の問題点

console でも X Window System でも,その各々に標準で用意されている AT 互換機用の jp106 の設定を選択すれば,「とりあえず」使うことができます. ただし,そのままでは PC-98 と細かい部分で差異があります. それらは原因別に三つに分類されます. すなわち,

1. PC-98 K/B と jp106 K/B との仕様の違いに起因する差異.

  • Key Pad は,Num Lock しないと数字が入力できない.
    PC-98 では console でも X Window System でも必ず数字が入力される.
  • いくつかの英数キーが異なる. すなわち PC-98 では [0], [^,`], [@,~(tilde)] のキーが jp106 では [0,~(tilde)], [^,~(overbar)], [@,`] である.[1] (overbar は tilde が入力される.)
    また,jp106 では [_] キーで '\' (backslash) が入力される. PC-98 はこのキーには反応しない.
    (どちらの K/B でも '_' (underscore) は [SHIFT] + [_] で入力される.)
  • [LWIN], [RWIN], [MENU] を利用できる. PC-98 は設定の問題でなくこれらのキーを検知できない.
    これらを使わないように設定すれば良い. (driver を修正すれば反応すらさせないこともできる.)
  • 左右の [SHIFT] が独立であり,[LSHIFT], [RSHIFT] と区別されている. 機能は同じである.
    PC-98 では,左右の [SHIFT] は同じ scancode を返し,[LSHIFT] に設定されている.
    これは混乱のないように注記しただけで,設定は今のままで良い.

これらは console, X Window System の各々に対して設定ファイルを書き換える際に知っておけば済む問題です.

2. jp106 K/B と PK-KB002 の仕様の違いに起因する差異.

  • PK-KB002 では二つの [Enter] が独立でなく,<KPEN> がない.
  • PK-KB002 には [RALT], [RCTRL] がない.
  • jp106 には Key Pad の '=' と ',' (<KPEQ>, <KPSP>) がない.
  • jp106 には PC-98 の [かな] の LED に相当する [ALGR] のための LED がない.
    (逆に [NMLK], [SCLK] のための LED がありますが,言及しません.)

上の二つは,使い分けをしないならば問題ありません. 下の二つは,当然ですが FreeBSD やその ukbd driver,および X Window System において動作に必要な諸設定がなされておらず,次のようになります.

  • Key Pad の '=' と ',' とが効かない.
  • [かな] キーを押したとき,LED が点灯/消灯しない.
    英字しか打たず,console の [ALGR] や X Window System の ISO_Next_Group, Mode_switch を利用しないならば,ここは修正不要.

これらには,各々の source を修正するレベルの対応が必要です. 以下では,その修正法を具体的に解説します. (記述の一部が未完成ですが,修正そのものには成功しています.)

3. FreeBSD の PC-98 と AT 互換機との仕様の違いに起因する差異.

AT 互換機の console 環境で scancode 128-255 を使うようなキーマップを使う場合,CAPS の LED が本来の機能を失い,ALGR に対応した LED になります. PC-98 には ALGR に対応した LED があるので,そのような振り分けは行なわれません.

この差異は,上述の [かな] の LED を点灯させるための修正と同時に対応することができます.

[1] 厳密には,ここで "jp106" と総称している K/B には jp106, jp109, jp109A という種類があります. ここで問題にしたキーにのみ注目するならば,jp106, jp109 の [0,~(tilde)], [^,~(overbar)] のキーは jp109A では [0], [^,~(tilde)] です. FreeBSD や X Window System は,overbar は tilde を入力するようにし,かつ jp109A K/B にて [SHIFT] + [0] で '~' (tilde) が入力されてしまうことを許容することにより,これらの K/B の設定を区別せずに済ませています.

3.2  設定ファイルの修正

この節の目的は,設定ファイルの修正だけで対応が可能な問題に対し,その修正法を示すことです.

PK-KB002 を使う PC にて,PS/2, USB を問わず (PK-KB002 のような亜種でない) jp106 K/B と併用するか否かで,修正に必要な知識や労力が違ってきます. すなわち,

  1. 併用しないのであれば,jp106 のために用意された設定ファイルを書き換えます. 楽です.
  2. 併用するのであれば,修正した設定ファイルを別の名前で用意します.
    また,それに伴って諸々のファイルの内容を変更する必要があります.
    console に対しては手間は変わりませんが,X Window System に対しては面倒になります.

もちろん,併用しない場合にも後者を選んでもかまいません. 以下 (3.3, 3.4 節も含む) では,前者の場合について例示します.

先ず console ですが,/usr/share/syscons/keymaps/jp.106.kbd

  071   fkey49 '7'    '7'    '7'    '7'    '7'    '7'    '7'     N
  072   fkey50 '8'    '8'    '8'    '8'    '8'    '8'    '8'     N
  073   fkey51 '9'    '9'    '9'    '9'    '9'    '9'    '9'     N
  074   fkey52 '-'    '-'    '-'    '-'    '-'    '-'    '-'     N
  075   fkey53 '4'    '4'    '4'    '4'    '4'    '4'    '4'     N
  076   fkey54 '5'    '5'    '5'    '5'    '5'    '5'    '5'     N
  077   fkey55 '6'    '6'    '6'    '6'    '6'    '6'    '6'     N
  078   fkey56 '+'    '+'    '+'    '+'    '+'    '+'    '+'     N
  079   fkey57 '1'    '1'    '1'    '1'    '1'    '1'    '1'     N
  080   fkey58 '2'    '2'    '2'    '2'    '2'    '2'    '2'     N
  081   fkey59 '3'    '3'    '3'    '3'    '3'    '3'    '3'     N
  082   fkey60 '0'    '0'    '0'    '0'    '0'    '0'    '0'     N
  083   del    '.'    '.'    '.'    '.'    '.'    boot   boot    N

の部分を /usr/share/syscons/keymaps/jp.pc98.kbd に倣って次のように変更します.

  071   '7'    '7'    '7'    '7'    '7'    '7'    '7'    '7'     N
  072   '8'    '8'    '8'    '8'    '8'    '8'    '8'    '8'     N
  073   '9'    '9'    '9'    '9'    '9'    '9'    '9'    '9'     N
  074   '-'    '-'    '-'    '-'    '-'    '-'    '-'    '-'     N
  075   '4'    '4'    '4'    '4'    '4'    '4'    '4'    '4'     N
  076   '5'    '5'    '5'    '5'    '5'    '5'    '5'    '5'     N
  077   '6'    '6'    '6'    '6'    '6'    '6'    '6'    '6'     N
  078   '+'    '+'    '+'    '+'    '+'    '+'    '+'    '+'     N
  079   '1'    '1'    '1'    '1'    '1'    '1'    '1'    '1'     N
  080   '2'    '2'    '2'    '2'    '2'    '2'    '2'    '2'     N
  081   '3'    '3'    '3'    '3'    '3'    '3'    '3'    '3'     N
  082   '0'    '0'    '0'    '0'    '0'    '0'    '0'    '0'     N
  083   '.'    '.'    '.'    '.'    '.'    '.'    '.'    '.'     N

さらに,

  105   fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62  O
  106   fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63  O
  107   fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64  O
  115   '\'    '_'    fs     us     '\'    '_'    fs     us      O

の部分を次のように変更します.

  105   nop    nop    nop    nop    nop    nop    nop    nop     O
  106   nop    nop    nop    nop    nop    nop    nop    nop     O
  107   nop    nop    nop    nop    nop    nop    nop    nop     O
  115   nop    '_'    fs     us     nop    '_'    fs     us      O

次に X Window System ですが,/usr/X11R6/lib/X11/xkb/symbols/jp
(X.Org 6.9.0 では /usr/X11R6/lib/X11/xkb/symbols/pc/jp,X.Org 7.4 では /usr/local/share/X11/xkb/symbols/jp です.)

    key  <KP7> {        [  KP_Home,     KP_7    ]       };
    key  <KP8> {        [  KP_Up,       KP_8    ]       };
    key  <KP9> {        [  KP_Prior,    KP_9    ]       };

    key  <KP4> {        [  KP_Left,     KP_4    ]       };
    key  <KP5> {        [  KP_Begin,    KP_5    ]       };
    key  <KP6> {        [  KP_Right,    KP_6    ]       };

    key  <KP1> {        [  KP_End,      KP_1    ]       };
    key  <KP2> {        [  KP_Down,     KP_2    ]       };
    key  <KP3> {        [  KP_Next,     KP_3    ]       };

    key  <KP0> {        [  KP_Insert,   KP_0    ]       };
    key <KPDL> {        [  KP_Delete, KP_Decimal ]      };

/usr/X11R6/lib/X11/xkb/symbols/nec/jp に倣って次のように変更します.
(X.Org 7.4 では /usr/local/share/X11/xkb/symbols/nec_vndr/jp です.)

    key  <KP7> { [ KP_7                 ]       };
    key  <KP8> { [ KP_8                 ]       };
    key  <KP9> { [ KP_9                 ]       };

    key  <KP4> { [ KP_4                 ]       };
    key  <KP5> { [ KP_5                 ]       };
    key  <KP6> { [ KP_6                 ]       };

    key  <KP1> { [ KP_1                 ]       };
    key  <KP2> { [ KP_2                 ]       };
    key  <KP3> { [ KP_3                 ]       };

    key  <KP0> { [ KP_0                 ]       };
    key <KPDC> { [ KP_Decimal           ]       };

さらに,

    key <AB11> { [ backslash, underscore      ]       };

を次のように変更します.

    key <AB11> { [ NoSymbol,  underscore      ]       };

なお,<LWIN>, <RWIN>, <MENU> は設定されていないので対応は不要です.

3.3  Key Pad の補完

この節の目的は,Key Pad の '=' と ',' を使えるようにすることです. key codes も参照して下さい.

先ず console ですが,

(1) /usr/src/sys/dev/usb/ukbd.c を修正する.
  これらのキーをを検知するようにし,それらに未使用の scancode 126, 127 を充てる.
  (未使用ならばどこに充てても良いのですが,少なくとも 126, 127 は kbdmux が通してくれます.)

以下は source の抜粋ですが,

/*
 * Translate USB keycodes to AT keyboard scancodes.
 */
Static u_int8_t ukbd_trtab[256] = {
          72,  73,  82,  83,  86, 107, 122,  NN, /* 60 - 67 */
         112, 125, 121, 123,  NN,  NN,  NN,  NN, /* 88 - 8F */
};

ここを次のように変更します.

          72,  73,  82,  83,  86, 107, 122, 126, /* 60 - 67 */   ← ここが Key Pad '='
         112, 125, 121, 123, 127,  NN,  NN,  NN, /* 88 - 8F */   ← ここが Key Pad ','

参考までに,この近辺の usbcode は次表のようになっています.

usbcode (hexa) PC-98 配列 jp106
135 (87)'_''\', '_'
136 (88)かなカタカナひらがな
137 (89)'\', '|''\', '|'
138 (8a)XFER変換
139 (8b)NFER無変換
140 (8c)Key Pad ','(なし)
103 (67)Key Pad '='(なし)

(2) /usr/share/syscons/keymaps/jp.106.kbd を修正し,scancode 126, 127 に '=' と ',' を充てる.

  126   '='    '='    '='    '='    '='    '='    '='    '='     N
  127   ','    ','    ','    ','    ','    ','    ','    ','     N

(3) kernel 再構築を行なう.

次に X Window System ですが,上述の (1),(3) が済んでいれば,設定ファイルの変更だけで対処できます.

/usr/X11R6/lib/X11/xkb/keycodes/xfree86 の jp106 のところに以下の二行を加えます.
(X.Org 7.4 では /usr/local/share/X11/xkb/keycodes/xfree86 です.)

    <KPEQ> = 134;
    <KPSP> = 135;

また /usr/X11R6/lib/X11/xkb/symbols/jp にも以下の二行を加えます.
(X.Org 6.9.0 では /usr/X11R6/lib/X11/xkb/symbols/pc/jp,X.Org 7.4 では /usr/local/share/X11/xkb/symbols/jp です.)

    key <KPEQ> { [ KP_Equal             ]       };
    key <KPSP> { [ KP_Separator         ]       };

3.4  LED の点灯

この節の目的は,[かな] キーを押したとき,LED が点灯/消灯するようにすることです.

先ず console ですが,

(1) /usr/src/sys/sys/kbio.h を修正し Lock に ALGR を加える.
(2) /usr/src/sys/dev/usb/ukbd.c を修正し,ALGR[かな] の LED を対応させる.
(3) kernel 再構築を行なう.

X Window System においては,上述の修正がなされていることを前提に,さらに source を修正して X Window System を make World し直す必要があります.

3.5  配布ファイル

3.2, 3.3, 3.4 節の修正のための patch は,配布物としての点検を行なった後,ここに up します.

なお,この patch ですが,あまりにもこのキーボードに限定した話なので,FreeBSD や XFree86, X.Org に送れないでいます.