1:OSを作れたらいいねぇPart2 hideyosi 10/20 22:37 前スレ K氏のheboOSをまねてみる なんでPart2なんだよ!? 世の中そういうもんです。 えー。まーそんなわけで、前スレがながーくなっちゃったので、新スレっつーことで。 heboOSベースのOSモドキ、「hideyOS Ver 0.02」に向けて、新たにお勉強しましょうーっつーことで。 12:Re: Shiftとか hideyosi 10/24 20:30 うーむ。どうも、メモリに直接値を入れるのはまずいようだ。 そこで、 ----------------------------------------------------- SHIFTON: MOV BX,[SSHIFT] ;この段階ではもうキーの値はいらない。 ;壊れてしまってもOK MOV AL,0x01 MOV [BX],AL JMP INTEND SHIFTOFF: MOV BX,[SSHIFT] ;この段階ではもうキーの値はいらない。 ;壊れてしまってもOK MOV AL,0x0 MOV [BX],AL JMP INTEND ----------------------------------------------------- 一旦ALレジスタに代入してから値をセットしてみよう。 お!? コンパイルエラーは収まったぞ!? 13:Re: Shiftとか hideyosi 10/24 20:50 さらに、Shiftキー判定部分と、テーブルを追加。 -------------------------------------------------------;乗っ取ったキーボード割り込み部分 IINT09: ;押されたキーは何かを調べる ;IN命令で、押されたキーの値を取得 MOV DX,0x60 IN AL,DX ;Shiftの判定。押されているか離されているかはもう ;定数で判定しちゃえ! ;離されている場合。 CMP AL,0x2A JE SHIFTON ;押されている場合。 CMP AL,0xAA JE SHIFTOFF ;同じく右側も。 ;離されている場合。 CMP AL,0x36 JE SHIFTON ;押されている場合。 CMP AL,0xB6 JE SHIFTOFF ;持ってきた値を一時、AHに複製する MOV AH,AL ;AHに複製した値の7ビット目だけを摘出 AND AH,0x80 ;もし、この結果の値が00000000すなわち0x80なら、 ;キーは「押された」となるはず。ここで条件分岐 CMP AH,0x80 ;なにもせずに割り込みを終了する JE INTEND ;持ってきた値の7ビットだけを抽出 AND AL,0x7F ;二進数 01111111 でANDする ;Shiftが押されているかどうか判定 MOV AH,[SSHIFT] CMP AH,0x0 JE SHIFTONPRINT CMP AH,0x01 JE SHIFTOFFPRINT SHIFTONPRINT: ; ALには0x1e(A)などのキースイッチの値が入る MOV BH,0 MOV BL,AL MOV AL,[BX+KEYTABLESHIFTON] ;この処理で、ALには、文字コードが入っている JMP MOJIPRINT ;実際に文字を表示する処理 SHIFTOFFPRINT: ; ALには0x1e(A)などのキースイッチの値が入る MOV BH,0 MOV BL,AL MOV AL,[BX+KEYTABLESHIFTOFF] ;この処理で、ALには、文字コードが入っている JMP MOJIPRINT ;実際に文字を表示する処理 ---------------------------------------------------------- テーブル ---------------------------------------------------------- ;文字コードとキースイッチコードの対応表。英字キーボード、ShiftOFF KEYTABLESHIFTOFF: ; 0 , 01 ,・・・・・ DB 0 , 0 , '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 8, 9 ; 10, 11,・・・・・ DB 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '{', '}', 10, 0 ; 1E, 1F,・・・・・ DB 'a', 's','d', 'f', 'g', 'h', 'j', 'k', 'l', ':','"','~', 0, '|' ; 2C, 2D,・・・・・ DB 'z', 'x', 'c', 'v','b', 'n', 'm', '<', '>', '?', 0 ; 37 ,38,・・・・ DB '*' , 0,0x20,0,0,0,0,0,0,0,0,0,0,0,0,0,'7','8','9','-','4','5','6','+' ; 4F , 50,・・・・ DB '1' , '2' , '3','0','.' ; 54,55,・・・・ DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 73,74,・・・・ DB 0,0,0,0,0,0,0,0,0,0,'\' --------------------------------------------------------- よし! コンパイルエラーもないぞ! いっけえぇぇぇぇ!! ・・・・・・・だめじゃん・・・・orz うーーーん。どこがまずいのかな? ひとつづつ検証してみよう。 14:Re: Shiftとか -- K 10/24 21:29 > MOV [BX],0x0 MOV BYTE [BX],0x0 と書けばOKです。もちろんAL経由でも、プログラムが長くなる以上の害はありませんが。 15:Re: Shiftとか hideyosi 10/24 21:39 >と書けばOKです。 あぁぁぁぁ!!! いっけねぇ!! そっか!? BXは16ビットなんだから、ちゃんとそう宣言しなくちゃいけんと! ・・・これ、前にもひっかかったじゃねーかよ! だめだなぁ・・・・ (T∀T) 16:Re: Shiftとか -- K 10/24 23:12 ついでに言うと、 MOV BYTE [SSHIFT],0x0 で全く問題ありません。これだとALもBXもつかわずに済みます。 17:Re: Shiftとか hideyosi 11/03 18:54 さーてと! オベンキョ再開。Shiftキーがなんで全然反応しないんだろう? まずは、Shifの判定部分にちゃんと飛んでいるかどうか。SHIFTONのラベル以下に文字表示のルーチンでも叩きこんで、調べてみる。 =========================================================== SHIFTON: MOV BX,[SSHIFT] ;この段階ではもうキーの値はいらない。 ;壊れてしまってもOK MOV AL,0x01 MOV [BX],AL MOV AL,0x41 MOV AH,0x0e INT 0x10 JMP INTEND SHIFTOFF: MOV BX,[SSHIFT] ;この段階ではもうキーの値はいらない。 ;壊れてしまってもOK MOV AL,0x0 MOV [BX],AL MOV AL,0x42 MOV AH,0x0e INT 0x10 JMP INTEND =========================================================== ・・・・うーむ。ちゃんとSHIFTを押すと、ABと表示される。つまり、ちゃんとここへは飛んできているんだ。 18:Re: Shiftとか hideyosi 11/03 19:02 うーん。もしかして、ここのところかな? ================================================ MOV BX,[SSHIFT] ;この段階ではもうキーの値はいらない。 ;壊れてしまってもOK MOV AL,0x0 MOV [BX],AL =============================================== MOV BX,[SSHIFT]。これはつまり、アドレス指定に用いられるBXレジスタに、ラベル「SSHIFT」のアドレスを代入している。 ・・・この場合、BXだから16bitだし、また、ラベルで置換されるアドレスも、オフセットながら通常は16bit。 問題はこれ。 MOV [BX],AL ・・・もしかして、BYTEを使うのかな??? 19:Re: Shiftとか I.Tak. 11/04 08:50 NASK/NASMの文法では, []がついてるのは (LEAを除いて) *全てメモリアクセス* です。BXにSSHIFTのアドレスを 入れるのなら MOV BX, SSHIFT としませう。このへんMASMと違うので, そういう解説を 読んでるなら要注意ですよ? 20:Re: Shiftとか 名無しさん 11/08 23:22 キタ━━━━━━(゜∀゜)━━━━━━!!!!!!!! I.Tak.さんの指摘がドンピシャ!!!! 一気にうまくいきましたぁぁぁぁあ!!! よーーし! あとは、簡単なコマンドを搭載してみて、それを0.01としてリリース予定だぁぁ!!! >このへんMASMと違うので, そういう解説を >読んでるなら要注意ですよ? ・・・つか、ちょっと一旦、naskの使い方を整理してみたほうがいいかなぁ。(私自身のためと、naskを使ってみたいという人のために) 21:Re: Shiftとか hideyosi 12/12 22:21 さて、あまりいつまでもお休みしてられないので、ちょこっとづつでも手をいれてかなくちゃ。 現在、大まかな強化機能が出来上がってくれた。さあ、いよいよ、コマンドの搭載である。 現状の作り(ベターっとアセンブラで書いてある)では、どうせ本当の意味でのコマンドは搭載できないので、「コマンドっぽい」って感じでまず実装。 考え方としては、どこかにコマンド格納用のエリア(バッファっていうのかな?)を確保し、最後に打たれたEnterから、新しく打たれたEnterまでを格納する。 まずは、そんなところから始めてみよう。 この場合、すぐに思いつくのが、アセンブラのコード上で、DBとかを使ってエリアを作っておいて、そのラベルをプログラム上から参照するという方法。これはすぐに出来そうだが、これだと実行時にしか使わない、無意味なデータエリアがOS本体のファイルサイズに反映されることになる。別にこのOSは、OSASKみたいにサイズのこだわっているわけじゃないが、チトあまりにも無駄っぽいような。 ・・・うーん、でも、とりあえずはいいや。まずはこの、おもいっきしベタな方法をとにもかくにも実装してみよう。 |