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' とかもできます。


91:Re: キーコード変換
hideyosi 10/18 23:21
ENTERキーの処理。
まず、ENTERキーの分岐をおきます。これは簡単。

------------------------------
;ENTER キー
CMP AL,0x1C ;Zが押されている
JE ENTERPRINT
--------------------------------

で、このENTERPRINTってラベル以下にコードを書けば出来上がり・・・

------------------------------------------------
ENTERPRINT:
;BIOSでカーソル位置を設定
MOV AH,0x02
MOV BH,0x0
MOV DL,0
MOV DH,Y座標
INT 0x10

JMP INTEND
-----------------------------------------------

・・・・あれれ? この場合、Y座標の値ってどうするんだ?

順当に考えると、「現在のY座標+1」ってことだよね?
むむむ?? 「現在の座標」って、どうやって求めるんだろう?
さっそくいろいろと調べてみた。
なになに? 0040:0050hがそうだって???
うむむむ??? どうもよくわからないや。こりゃ、実験しかないか!?





92:Re: キーコード変換
hideyosi 10/18 23:34
うーん・・・0040:0050hという表現。これまでのパターンだと、これは、セグメント:オフセットのパターンではないかなぁ?

そうすると、この0040:0050hという場所の値を読み出すには

-------------------------------------------
MOV AX,0x40
MOV ES,AX ; ESを0040にする。
MOV AX,WORD[ES:0x50]
ーーーーーーーーーーーー---------------

こういうコードになるのかな???

93:Re: キーコード変換
hideyosi 10/19 01:06
だあぁぁぁぁぁぁ!!!!!

にゃんだよクソ!!! ちゃんとBIOSにあるぢゃん!

ってことで、こういうコードを追加して、目的の動作をしました。

-------------------------------------------
ENTERPRINT:
;現在のカーソルの位置を取得(Y座標のみ)
MOV BH,0x0
MOV AH,0x03
INT 0x10

;BIOSでカーソル位置を設定
MOV AH,0x02
MOV BH,0x0
MOV DL,0
INC DH ;上で取得した行位置+1
INT 0x10

JMP INTEND
-------------------------------------------------------

94:Re: キーコード変換
hideyosi 10/19 03:32
上の状態だと、カーソルが最下行に行っちゃうと、固まったようになって画面が動かなくなっちゃう。
で、こんなコードに変更。

----------------------------------------
ENTERPRINT:
;現在のカーソルの位置を取得(Y座標のみ)
MOV BH,0x0
MOV AH,0x03
INT 0x10

INC DH ;上で取得した行位置+1

CMP DH,0x19

;もし、最下行だったらロールアップ
JE ENTERPRINTLUP

;そうじゃなかったら、普通にカーソル移動

JMP ENTERPRINTNML


ENTERPRINTLUP:
;ロールアップ。まず、ロールアップをする
MOV AL,0x01
MOV BH,0x0F
MOV CH,0x01
MOV CL,0x0
MOV DH,0x18
MOV DL,0x4F
MOV AH,0x06
INT 0x10

;カーソルを最下行にセット
MOV DH,0x18
JMP ENTERPRINTNML


ENTERPRINTNML


;BIOSでカーソル位置を設定
MOV AH,0x02
MOV BH,0x0
MOV DL,0

INT 0x10

JMP INTEND
--------------------------------------------------

おーー! まるでエディタの如く、最下行でロールアップするぞ!?


95:プロンプトの搭載
hideyosi 10/19 21:21
なんか、「見た目だけ」とはいえ、だんだんMS-DOSっぽくなってきて楽しいなぁ・・・。
そんなわけで、プロンプトを搭載してみよう。
これはそうむずかしくない。まず、テキスト画面を一旦クリアする。
で、プロンプトを表示する。
さらに、Enterキーが押されたら、とりあえず無条件でプロンプトを表示させると。

-------------------------------------------------
ENTERPRINTNML


;BIOSでカーソル位置を設定
MOV AH,0x02
MOV BH,0x0
MOV DL,0

INT 0x10

CALL PROMPTPRINT

JMP INTEND




PROMPTPRINT:
;BIOSコールで文字列を表示
MOV AH,0x13
MOV AL,0x01
MOV BH,0x0
MOV BL,0x0F
MOV CX,0x07
;本来はここで、DLとDHで座標を指定するが、これは変わらないので
;いらないと思う
MOV BP,pmsg
INT 0x10
RET


;プロンプトの文字列
pmsg DB "THEBBL>"

-------------------------------------------------------






・・・・ぶははははは!!! できたできたー!






96:リリース!(ごっこ)
hideyosi 10/19 22:58
さーてと!!
とりあえず、キリがいいので、この私のOS(は?)を、リリースして
みよう。

hideyOS Ver 0.01ってことで。(笑

http://thebbl.hideyosi.com/age/hdOS001.lzh

・・・みなさんに笑って頂いてナンボですから・・・ (T∀T)

あ、あと、これまでのソースは、こちらから直で見られます。
アドヴァイスなんかしてみようなんて方は、是非・・・(^^;)

http://thebbl.hideyosi.com/age/test11.nas.txt



97:Re: リリース!(ごっこ)
-- K 10/19 23:13
 早速楽しんでいます。.COMは374バイトで、Win2000のDOS窓でも動いています。

 ささやかな要望を。キーを離したときに入力されるというのは、ちょっと脱力系なので、できれば押したときに入力されてほしいです。

 あと、BackSpaceの処理が追加されたら、もっとそれっぽいかも!

 さらに、最初に"hideyOS Ver 0.01"みたいなメッセージがあったらいいなあ。

 それでは。


98:Re: リリース!(ごっこ)
hideyosi 10/19 23:22
>早速楽しんでいます。

ぐはぁ!!! よりによって、Kタンが試している!?
魚影〜!!! ゴロゴロゴロ・・・・ <恥ずかしくてのたうちまわっている

>できれば押したときに

・・・あ” 
そっかぁ。そいえば、押してときの動作って、やってみたことないなぁ。さっとくためしてみよう。


さて、ほいだば、Ver 0.02に向けてガンバロ!
Ver0.02では、まず、キーボードの処理をなんとかする。Kタンにアドヴァイスしてもらった書き方の理解と勉強。当然、BSやShiftなんかの処理も搭載したいなぁ。

あと、とりあえず、なんらかのコマンドを搭載したい。たとえば、clsとか、rebootとか。

あと、現在は画面関係はみんなBIOSにたよっているけど、これをなんとかできないか実験してみよう。



99:Re: リリース!(ごっこ)
feel 10/19 23:49
試しました
しっかり動きますね
私も頑張りたいと思います
頑張って下さい
家のウイルス対策ソフト(NOD32)が過剰反応してビビりましたが
何ともなくてよかったよかった

明日から修学旅行だぁ〜
京都へ台風と戦いに行ってきます
そしたらまた頑張ります


1-

BluesBB ©Sting_Band