|
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)が過剰反応してビビりましたが 何ともなくてよかったよかった 明日から修学旅行だぁ〜 京都へ台風と戦いに行ってきます そしたらまた頑張ります |