2016.10.20
前へ
次へ
ホームページトップへ戻る

マイコン独立大作戦
キーボードインターフェースの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
そして作戦その2は、やっぱりキーボードインターフェースしかありませんでしょう。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第10回]


●キーコード対照表の作成(4)

前回までの作業は通常おもに使うアルファベット、数字、記号などの一般的なキーでASCIIコードが割り振られているものを対象にしてきました。
今回はそれ以外のキーについて作業をします。
まずはデータの入力作業です。

logfile nd80zlog\10181044.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>cm 9080
9080 54-30
9081 00-70
9082 00-31
9083 0C-69
9084 10-32
9085 20-72
9086 00-33
9087 40-7a
9088 40-34
9089 A4-6b
908A 4C-35
908B 00-73
908C C4-36
908D 00-74
908E 04-37
908F 2A-6c
9090 FD-38
9091 E7-75
9092 FF-39
9093 FF-6?
9093 FF-7d
9094 B6-2e
9095 9F-71
9096 C7-2a
9097 FF-7c
9098 7F-2d
9099 7F-7b
909A FF-2b
909B FF-79
909C F7-08
909D 9A-66
909E 38-0d
909F F9-5a
90A0 50-20
90A1 00-29
90A2 B0-1b
90A3 58-76

先回までと同じ手法で、CMコマンドを使ってASCIIコードとスキャンコードをペアにして9080〜のエリアに入力しました。
実は上のリストは今回作業を行なったCMコマンドでのデータ作成の途中のところまでなのですが、今回はASCIIコードが割り振られていない特殊キーですとか、スキャンコードも2バイトあるものとかが対象になっているため、BASICのプログラムもそれに応じて複数本作成しました。
ですのでCMコマンドでのデータ入力のリストもそれぞれのプログラムにあわせて、分けて示すことにしました。

まずはキーボードの右側にあるテンキー入力部のキーとASCIIコードで示すことのできる特殊キーのうち一部スキャンコードが2バイトのものを除外して作表します。
下が作成したBASICプログラムとその実行結果です。

>/save keymake3.txt
    10 FOR A=$80 TO $A2 STEP 2
    20 AD=$9000+A
    30 CAS=PEEK(AD)
    40 KC=PEEK(AD+1)
    50 IF CAS>$20 GOTO 120
    60 IF CAS=$08 THEN A$="Backspace "
    70 IF CAS=$0D THEN A$="Enter     "
    80 IF CAS=$20 THEN A$="Space     "
    90 IF CAS=$1B THEN A$="Esc       "
   100 PRINT A$;HEX$(CAS,2);" ";HEX$(KC,2)
   110 GOTO 130
   120 PRINT CHR$(CAS);" ";HEX$(CAS,2);" ";HEX$(KC,2)
   130 NEXT A
>r.
0 30 70
1 31 69
2 32 72
3 33 7A
4 34 6B
5 35 73
6 36 74
7 37 6C
8 38 75
9 39 7D
. 2E 71
* 2A 7C
- 2D 7B
+ 2B 79
Backspace 08 66
Enter     0D 5A
Space     20 29
Esc       1B 76

右側のテンキーは左側の普通のキーの数値、記号とASCIIコードは同じなのですが、スキャンコードは左側のキーとは別のコードになっています。
[/]がありませんがこれはスキャンコードがちょっと特殊なため今は除外しています。
同様にテンキー部の[Enter]も除外しています。
上の出力表にある[Enter]は左側の通常使う[Enter]です。
[BackSpace][Space][Esc]はテンキー部分ではありませんが、ASCIIコードが割り当てられていますので、ここで処理しました。

さて、ここからはASCIIコードがない特殊キーの作表になります。
ASCIIコードがないとはいっても、処理のうえではASCIIコードに代わるなんらかのコードがあることが望ましいです。
ここではキーボードの上部に配置されているF1〜F12キーについて作表します。
ちょうどASCIIコードではE0〜FFは通常使う文字は割り当てられていないので、F1〜のコードをそのまま割り当てることにします。
ただし8ビットコードですからF10〜F12にはFA〜FCを割り当てます。
下はCMコマンドでコードを入力している部分のリストと、それを読み込んで表作成をするBASICプログラムとその実行結果です。

90A4 80-f1
90A5 26-05
90A6 12-f2
90A7 1C-06
90A8 20-f3
90A9 E0-04
90AA 40-f4
90AB 00-0c
90AC 80-f5
90AD 02-03
90AE 50-f6
90AF 04-0b
90B0 7F-f7
90B1 FF-83
90B2 5F-f8
90B3 ED-0a
90B4 DF-f9
90B5 DF-01
90B6 97-fa
90B7 BB-09
90B8 FF-fb
90B9 FF-78
90BA EF-fc
90BB FE-07

>/save keymake4.txt
    10 FOR A=$A4 TO $BA STEP 2
    20 AD=$9000+A
    30 CAS=PEEK(AD)
    40 KC=PEEK(AD+1)
    50 IF CAS<$FA GOTO 120
    60 AA=CAS-$FA
   100 PRINT "F1";AA;" ";HEX$(CAS,2);" ";HEX$(KC,2)
   110 GOTO 130
   120 PRINT HEX$(CAS,2);"  ";HEX$(CAS,2);" ";HEX$(KC,2)
   130 NEXT A

>r.
F1  F1 05
F2  F2 06
F3  F3 04
F4  F4 0C
F5  F5 03
F6  F6 0B
F7  F7 83
F8  F8 0A
F9  F9 01
F10 FA 09
F11 FB 78
F12 FC 07

次もASCIIコードが割り当てられていない特殊キーの作表です。
今回はコードとしてE0〜EBを割り当てました。
下はCMコマンドでコードを入力している部分のリストと、それを読み込んで表作成をするBASICプログラムとその実行結果です。

90BC EF-e0
90BD AF-0e
90BE F7-e1
90BF BE-0d
90C0 04-e2
90C1 00-58
90C2 4A-e3
90C3 20-12
90C4 02-e4
90C5 80-14
90C6 00-e5
90C7 60-11
90C8 01-e6
90C9 48-59
90CA 58-e7
90CB 58-67
90CC 41-e8
90CD 08-64
90CE 4A-e9
90CF E0-13
90D0 FF-ea
90D1 FE-7e
90D2 DF-eb
90D3 FD-77
90D4 6F-
>/sv keycode2,9080,90d3
0054(84)bytes saved

>/save keymake5.txt
    10 DATA HAN/ZENKAKU,TAB,CAPS,LSHIFT,LCTRL,LALT,RSHIFT,NOHENKAN
    20 DATA HENKAN,KANA/ROMAJI,SCREENLK,NUMLK
    30 FOR A=$BC TO $D2 STEP 2
    40 AD=$9000+A
    50 CAS=PEEK(AD)
    60 KC=PEEK(AD+1)
    70 READ KEY$
    80 N%=LEN(KEY$)
    90 PRINT KEY$;SPACE$(12-N%);HEX$(CAS,2);" ";HEX$(KC,2)
   100 NEXT A
>r.
HAN/ZENKAKU E0 0E
TAB         E1 0D
CAPS        E2 58
LSHIFT      E3 12
LCTRL       E4 14
LALT        E5 11
RSHIFT      E6 59
NOHENKAN    E7 67
HENKAN      E8 64
KANA/ROMAJI E9 13
SCRLK       EA 7E
NUMLK       EB 77

いよいよ最後のグループです。
今回もASCIIコードが割り当てられていない特殊キーなのですが、今まで作業したスキャンコードと異なり、このグループはスキャンコードがE0で始まる2バイトです。
割り当てるべきコードとしてEx、Fxは使ってしまいました。
何を割り当てるか、どうするかは後で考えることにして、とりあえず整理のため今までと同じように表を作成することにしました。
スキャンコードの最初の1パイトはE0ですからCMコマンドでの入力にあたっては2バイト目だけを入力することにしました。
またキーコードとして割り当てるコードはまだ未定ですから、その入力もしませんから結局スキャンコードの2バイト目のコードだけを入力してデータとしました。
下はCMコマンドでコードを入力している部分のリストと、それを読み込んで表作成をするBASICプログラムとその実行結果です。

>cm 90e0
90E0 11-2f
90E1 01-75
90E2 20-72
90E3 28-6b
90E4 11-74
90E5 05-7d
90E6 80-7a
90E7 12-6c
90E8 06-69
90E9 0C-71
90EA 51-70
90EB 7E-1f
90EC 1F-14
90ED 14-11
90EE 11-27
90EF 27-4a
90F0 4A-5a
90F1 5A-
>/sv keycode3.bin,90e0,90f0
0011(17)bytes saved

>/save keymake6.txt
    10 DATA APPLICATION,UP ARROW,DOWN ARROW,LEFT ARROW,RIGHT ARROW
    20 DATA PAGE UP,PAGE DOWN,HOME,END,DELETE,INSERT,LEFT WIN,RIGHT CTRL
    30 DATA RIGHT ALT,RIGHT WIN,/,ENTER
    40 FOR A=$E0 TO $F0
    50 AD=$9000+A
    60 KC=PEEK(AD)
    70 READ KEY$
    80 N%=LEN(KEY$)
    90 PRINT KEY$;SPACE$(12-N%);"E0,";HEX$(KC,2)
   100 NEXT A
>r.
APPLICATION E0,2F
UP ARROW    E0,75
DOWN ARROW  E0,72
LEFT ARROW  E0,6B
RIGHT ARROW E0,74
PAGE UP     E0,7D
PAGE DOWN   E0,7A
HOME        E0,6C
END         E0,69
DELETE      E0,71
INSERT      E0,70
LEFT WIN    E0,1F
RIGHT CTRL  E0,14
RIGHT ALT   E0,11
RIGHT WIN   E0,27
/           E0,4A
ENTER       E0,5A

結果の表のうち、最後の/とEnterはキーボードの右にあるテンキー部分のキーです。

以上でスキャンコードの整理はほぼ完了です。
あと残ったのは、下記の2キーです。

Print Screen  E0,12,E0,7C
Pause       E1,14,77,E1,F0,14,F0,77

この処理をどうするかはまた考えてみることにいたします。
どちらも通常使うキーではないと思いますから、独立大作戦のキーボードインターフェースとしては無理して実装しなくてもよろしいのでは、とも思います。

上のPauseのスキャンコードがあまりに恐ろしいものなので、インターネットのスキャンコードについてのサイトで確認していましたら、次の3つのキーが落ちていることに気が付きましたので、以下に追記しておきます。

Wake Up  E0,5E
Sleep     E0,3F
Power    E0,37

今回でスキャンコードの整理と作表作業は終わりです。
次回からはここで作成したキーコード変換表データを使って、PS/2キーボードからキー入力したデータをASCIIコードに変換して画面に表示するプログラムなどについて説明を進めていくことにいたします。

キーボードインターフェースの製作[第10回]
2016.10.20upload

前へ
次へ
ホームページトップへ戻る