?? readme.txt
字號:
割り込みエントリ処理ライブラリ(IRQFUNC) Ver.2.0 for PC/AT
対応コンパイラとして,LSI C-86試食版以外にTurbo Cにも対応しました.
●アーカイブファイル內(nèi)容
README.TXT アーカイブファイル內(nèi)容説明(このファイル)
IRQFUNC.TXT IRQFUNC関數(shù)説明ファイル
IRQFUNC.H IRQFUNCヘッダファイル
IRQFUNC.ASM IRQFUNCアセンブラソースファイル(LSI C-86用)
IRQFUNC.OBJ IRQFUNCオブジェクトファイル(LSI C-86用)
IRQFUNC2.ASM IRQFUNCアセンブラソースファイル(Turbo C用)
IRQFUNC2.OBJ IRQFUNCオブジェクトファイル(Turbo C用)
MK.BAT IRQFUNCオブジェクト生成用アセンブルバッチファイル
IRQTEST.C IRQFUNC用サンプルソース
MKSMP.BAT IRQFUNC用サンプルプログラム用コンパイルバッチファイル
IRQTESTL.EXE IRQFUNC用サンプルプログラム(LSI C-86でコンパイルしたもの)
IRQTESTT.EXE IRQFUNC用サンプルプログラム(Turbo Cでコンパイルしたもの)
●IRQFUNCについて
アセンブルにはTurboアセンブラ 2.01を使用しています.
●IRQTESTのコンパイル方法
▲IRQTESTL.EXE(LSI C-86試食版)
IRQTESTL.EXEはLSI C-86試食版でコンパイルしたEXEファイルです.LSI C-86試食版をコンパイルできる環(huán)境下で,カレントディレクトリに IRQTEST.C IRQFUNC.H IRQFUNC.OBJ MKSMP.BAT を置いて,そこで MKSMP.BAT を?qū)g行するとコンパイルされます.
▲IRQTESTT.EXE(Turbo C)
IRQTESTTはTurbo C 2.0でコンパイルしたEXEファイルです.Turbo Cをコンパイルできる環(huán)境下で,カレントディレクトリに IRQTEST.C IRQFUNC.H IRQFUNC.OBJ IRQFUNC2.OBJ MKSMP.BAT を置いて,そこで MKSMP.BAT を?qū)g行するとコンパイルされます.
●IRQTESTの動作內(nèi)容
このプログラムはキーボードからの入力によって,そのキーコードを畫面に表示します.キーを押したときと離したとき両方のコードが表示されます.ESCキーを押すとプログラムを終了します.
PC/AT互換機ではキーボード割り込みがIRQ1に割り當(dāng)てられているので,このサンプルプログラムでもIRQ1を使っています.まず元のIRQ1のマスク狀態(tài)を保存します.
originalIrqMask=_maskIRQ(1,1);
この保存は,このプログラムを終了するときに狀態(tài)を復(fù)帰させるために必要です.さらにこの次の行で割り込みベクタを書き換えるので,書き換え途中で割り込みが発生しても,あらぬアドレスにジャンプしてしまうことのないように,割り込みをマスクします.ここで使っているIRQの番號が1で,さらにマスクの指定も1なのでちょっと紛らわしいですが,1番目の引き數(shù)がIRQ番號で,2番目の引き數(shù)が割り込み可(0)/不可(1)のマスク設(shè)定です.
またIRQ12の狀態(tài)を保存します.
次に,
originalVector=_hookIRQ(1,&keyInterrupt);
により,元のIRQ1の割り込みベクタを保存し,新しい割り込み処理としてkeyInterrupt関數(shù)に飛ぶように割り込みをフックします.新しい割り込み処理関數(shù)の名前に&がついているのでは,この関數(shù)のアドレスを示すためです.そして,
_maskIRQ(1,0);
により,さきほどマスクしていたIRQ1を割り込み受付可能に設(shè)定します.
あとはIRQ1の割り込みが発生するたびに,keyInterrupt関數(shù)が実行されます.keyInterrupt関數(shù)では必要な処理をしたあと,そのまま関數(shù)を終了するだけです.
プログラムを終了するときも手順があります.割り込み処理プログラムがこのプログラムの中にあるので,そのままプログラムを終了してメモリを解放してしまったら,次に別のプログラムがロードされた時點で割り込み処理プログラム領(lǐng)域が破壊されるので,プログラムが暴走してしまいます.プログラムを終了するときは割り込みベクタを解放して元に戻しておく必要があります.
まず割り込みベクタを再度書き換えるので,
_maskIRQ(1,1);
によりIRQ1の割り込みをマスクします.次に,
_freeIRQ(1,originalVector);
により,IRQ1に割り込みベクタを解放し,保存しておいた元の割り込みベクタを設(shè)定します.そして,
_maskIRQ(1,originalIrqMask);
により,元のマスク狀態(tài)に戻します.IRQ12の狀態(tài)も戻しておきます.
これでプログラムを終了すればOKです.
●バージョンアップ履歴
?1999年1月1日
初版
?2000年12月1日
Turbo C対応(引き數(shù)スタック渡方式)対応版正式公開
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -