K氏のheboOSをまねてみる

84:Re: 割り込み処理
hideyosi 10/16 16:22
っはっはぁぁぁぁ。
なるほどぉ!
この場合の「割り込み番号」って、IRQ番号を使うんだぁ!
えーっと、キーボードのIRQって・・・・1か!

つまり、こうするわけか?

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

[BITS 16]
[OPTIMIZE 1]
[OPTION 1]
[INSTRSET "8086"]
[FORMAT "BIN"]
ORG 0x100
;-----------------------------------------------------
;--- こっから上は、MS-DOSの.COMを作る時の ------------
;----おまじないだと思ってくれい!     ------------
;-----------------------------------------------------


;-------- 実験部分 ----------------------

;BIOSのキー入力を乗っ取る
MOV AX,0
MOV ES,AX ; ESを0にする。
MOV WORD[ES:0x09*4+0],IINT09
MOV WORD[ES:0x09*4+2],CS
MOV AX,DS
MOV ES,AX ; ESをもとにもどす。


JMP MAINLLP ;メインループへジャンプ


;メインのループ部分
MAINLLP:


JMP MAINLLP



;乗っ取ったキーボード割り込み部分
IINT09:
;押されたキーは何かを調べる
;IN命令で、押されたキーの値を取得
MOV DX,0x60
IN AL,DX

;持ってきた値の7ビットだけを抽出
AND AL,0x7F ;二進数 01111111 でANDSする

;もしその値が1Eだったら、Aボタンが押されている
CMP AL,0x1E

;上のCPM命令によってキャリーフラブが変化している。
;同じならZFが1,CFが0になっている
;もしそうなら、文字表示ルーチンをコールする

JE MOJIPRINT

;そうでなかったら、割り込みから戻る
JMP INTEND


;文字を表示するルーチン
MOJIPRINT:
MOV AL,0x41
MOV AH,0x0e
INT 0x10

JMP INTEND


;割り込み後は、この処理をしないと戻れない
INTEND:
MOV AL,0x01 ;キーボードの割り込み(IRQ)
ADD AL,0x60 ;その番号に、60を足した値
MOV DX,0x20
OUT DX,AL

IRET

;-----------------------------------------------------
;---- これがないと、暴走しちゃうぞ! -------------
;-----------------------------------------------------
;MS-DOS終了
INT 0x20

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

おぉぉ!!! うまくいったぞ!!!!
逆にKタンの懸念どおり、一回押せば2回Aが出てしまうってのもちゃんと?再現。

よぉぉぉぉし!!!!!!!うまくいったぞ!!!


1-

BluesBB ©Sting_Band