OSを作れたらいいねぇPart2

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みたいにサイズのこだわっているわけじゃないが、チトあまりにも無駄っぽいような。

・・・うーん、でも、とりあえずはいいや。まずはこの、おもいっきしベタな方法をとにもかくにも実装してみよう。


1-

BluesBB ©Sting_Band