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

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

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

[第8回]


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

前回のところを読み直していて気が付いたことがあります。
表の終わりの”¥”がASCIIコード5C、スキャンコード51になっています。
そこから上のほうに少し戻ったところにも”¥”があってASCIIコードは同じ5Cなのですがスキャンコードは6Aになっています。
実は表の終わりのスキャンコード51は右Shiftキーの左側にある、かなの”ろ”のキーです。
このキーは英字キーでは”\”(バックスラッシュ)なのですが、日本語キーボードの場合には半角モードでこのキーを押しても”¥”が表示されます。
正確に言いますと、それは日本語キーボードだから、ではなくて日本語文字コードセットがそうなっているからなのです(キーボードからは文字コードではなくてスキャンコードしか出力されませんから)。
ともかく前回の表が上記のようになっているのはそういう理由によるものです。

前回の終わりのところで英小文字のASCIIコードをプログラムで英大文字のASCIIコードに変換しました。
本日になって気が付いたのですが、これではまだ中途半端でした。
キーボードの英半角文字入力では、通常はアルファベットキーを押すと小文字が表示されますが、Shiftキーを押しながらアルファベットキーを押すと大文字が表示されます。
同様に数字キーや記号キーもShiftとともに押したときと、Shiftを押さないときで異なる記号が表示されます。
前回はそこのところを英大文字を表示させるだけで終ってしまったのですが、同様にしてShiftを押しながら入力した場合に表示される記号についても作表するとともに、同時にバイナリデータとしてメモリに書き込むようにしました。
作表したものは人間が見るには適していますが、いずれキー入力プログラムを作って、そこでスキャンコードからShiftキーの状態によってそれぞれのASCIIコードに変換することを考えると、メモリ上にデータのかたちで置く必要があると考えたからです。

そのような今回の変更作業もZB3BASICなら、難なく楽にできてしまいます。
以下は作成したBASICプログラムのリストと、それを実行した結果です。

>/save keymake7.txt
    10 FOR A=0 TO $5E STEP 2
    20 AD=$9000+A
    30 CAS=PEEK(AD)
    40 KC=PEEK(AD+1)
    50 IF A=$5E THEN CAS=$5F:GOTO 110
    60 IF (CAS>=$2C)*(CAS<=$2F)THEN CAS=CAS+$10:GOTO 110
    70 IF CAS=$30 THEN PRINT "   - ";HEX$(KC,2):CAS=0:GOTO 120
    80 IF CAS<=$3B THEN CAS=CAS-$10:GOTO 110
    90 IF CAS<=$5E THEN CAS=CAS+$20:GOTO 110
   100 IF CAS<=$7A THEN CAS=CAS-$20
   110 PRINT CHR$(CAS);" ";HEX$(CAS,2);" ";HEX$(KC,2)
   120 AD2=$9100+A
   130 POKE AD2,CAS
   140 POKE AD2+1,KC
   150 NEXT A
>r.
! 21 16
" 22 1E
# 23 26
$ 24 25
% 25 2E
& 26 36
' 27 3D
( 28 3E
) 29 46
   - 45
A 41 1C
B 42 32
C 43 21
D 44 23
E 45 24
F 46 2B
G 47 34
H 48 33
I 49 43
J 4A 3B
K 4B 42
L 4C 4B
M 4D 3A
N 4E 31
O 4F 44
P 50 4D
Q 51 15
R 52 2D
S 53 1B
T 54 2C
U 55 3C
V 56 2A
W 57 1D
X 58 22
Y 59 35
Z 5A 1A
= 3D 4E
~ 7E 55
| 7C 6A
` 60 54
{ 7B 5B
+ 2B 4C
* 2A 52
} 7D 5D
< 3C 41
> 3E 49
? 3F 4A
_ 5F 51

>dm 9100,915f
9100  21 16 22 1E 23 26 24 25-25 2E 26 36 27 3D 28 3E  !.".#&$%%.&6'=(>
9110  29 46 00 45 41 1C 42 32-43 21 44 23 45 24 46 2B  )F.EA.B2C!D#E$F+
9120  47 34 48 33 49 43 4A 3B-4B 42 4C 4B 4D 3A 4E 31  G4H3ICJ;KBLKM:N1
9130  4F 44 50 4D 51 15 52 2D-53 1B 54 2C 55 3C 56 2A  ODPMQ.R-S.T,U<V*
9140  57 1D 58 22 59 35 5A 1A-3D 4E 7E 55 7C 6A 60 54  W.X"Y5Z.=N~U|j`T
9150  7B 5B 2B 4C 2A 52 7D 5D-3C 41 3E 49 3F 4A 5F 51  {[+L*R}]<A>I?J_Q
>/exit
0000 00C3 - 
リモート接続を終了しました
logfile closed at Tue Oct 18 22:36:50 2016


9100〜915FにShiftキーを押した場合のスキャンコードとASCIIコードの対応データが作成されたことをDMコマンドで確認しました。
こうやって確認してみると、もとは簡単に入力してデータを作成するために、ASCIIコードとスキャンコードをペアにしてメモリに入力したのですけれど、プログラムでコード変換を行なうためには、スキャンコードとASCIIコードと、それからShiftを押したときのASCIIコードを、たとえば9000〜と9100〜と9200〜というように別々に分けて格納したほうがよいことに気が付きます。

それではそれもBASICでやってみることにいたしましょう。
でも、今回は時間がなくなってしまいましたので、それは次回にて。

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

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