K氏のheboOSをまねてみる

90:キーコード変換
-- K 10/18 14:04
>おぉぉ!!! 文字がいろいろと表示できる!けっこうたのしいぞ!!

 おめでとうございます。

>いろいろと考えてみたんだけど、やっぱほかにいい方法がみつからないや。もういいや!絨毯爆撃で!

 ちょっとだけヒントを書くことにしようかな。

 アセンブラでもCでも同じことですが、この手のコードをifのかたまりやswitchのかたまりで書くのは良くないことです。C言語であれば、

 static char table[] = {
  0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', '\b', '\t',
  'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', '\n', 0, 'A', 'S',
  'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0, 0, ']', 'Z', 'X', 'C', 'V',
  'B', 'N', 'M', ',', '.', '/', 0, '*'
     (以下略)
 };

とやっておいて、 j = table[i]; とでもすれば、一発でキーコードから文字コードにできます。

 おなじことをnaskですることもちろんできて、

; ALには0x1eなどのコードが既に入っているとする。

  MOV BH,0
  MOV BL,AL
  MOV AL,[BX+table]

; これでもうALには文字コードが入っている。たくさんのCMP+JEにさようなら。

; 以下はプログラムではなくデータなので間違って実行しないような位置におく

table:
  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, '*'
     (以下略)

 僕の書いた意味が理解できたら使ってみてください。
理解できなければ今のままCMP+JEで書くほうがいいと思います。
MOVしか使ってないので、努力すれば理解できるのではないかと思って書いてみました。

 ちなみに、'A'などの表現が見慣れないかもしれませんが、これは0x41のことです。 MOV AL,'A' とかもできます。


1-

BluesBB ©Sting_Band