OSを作れたらいいねぇPart2

6:Re: 続いてキー判定部
hideyosi 10/24 11:16
こんな実験をしてみた。

-------------------------------------------
;文字コードとキースイッチコードの対応表
KEYTABLE:
DB '0','1','2','3'

; DB 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 8, 9
; DB 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 10, 0, 'A', 'S'
; DB 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0, 0, ']', 'Z', 'X', 'C', 'V'
; DB 'B', 'N', 'M', ',', '.', '/', 0, '*'
-----------------------------------------------

例の、
MOV BH,0
MOV BL,AL
MOV AL,[BX+KEYTABLE]
の部分の理解。
この状態で、キーを押す。ESCキー。ESCキーのキースイッチ値は、
0x01。で、[BX+KEYTABLE]とかの場合は、KEYTABLEはラベルとなる。
ラベルは、ある特定のアドレスを文字に見立てただけなので、
実際にはアドレスに変換されるはず。(じゃ、仮に0x0200番地だと仮定してみる。)

MOV BH,0
MOV BL,AL

これによって、ESCキーが押された場合には、BXレジスタは、0x0001になる。で、

MOV AL,[BX+KEYTABLE]

とやると、実際には、

MOV AL,[0x0001+0x0200]

というようなことになる。で、実際の0x0201番地っていうのが、

DB '0','1','2','3'

この二番目の要素。すなわち、「1」のアスキーコードになると・・・・
なるほどなるほど!!!! わかってきたぞ!!!!
そうすると、例えば、一覧表をちゃんとした状態で、

MOV AL,[BX+KEYTABLE+1]

なんてイタヅラをすると、全てのキーが一個づつずれるなんてこともできると!あと、
MOV BH,0
MOV BL,AL
これは、そもそもアドレス(オフセット値)を指定するんだから、
16bitが必要なのでこうしているわけね。

??? じゃ、なんでBXレジスタなのか?

これは、「お作法で BX はメモリアドレスの指定に」ということなのかなぁ・・・・

仮にだけど、これをワザとDXレジスタでやってみるとどうなるかな???

・・・・あれれれ! コンパイルエラーになっちゃった。やっぱ、単純にお作法だけじゃなくて、こういう手のアドレス指定は、BXを使うもののようだね。


1-

BluesBB ©Sting_Band