home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / his / his.doc next >
Text File  |  1995-06-20  |  23KB  |  571 lines

  1. □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
  2. □                                                                        □
  3. □                     ハードウェア割り込み支援ライブラリ                 □
  4. □                                                                        □
  5. □       1995.6.12                                    by ちょもらんま     □
  6. □                                                                        □
  7. □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
  8.  
  9.  
  10. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  11. 0.目次
  12. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  13.  
  14.  1.概要
  15.  2.ファイル一覧
  16.  3.ライブラリのインストール
  17.  4.サンプルプログラムについて
  18.  5.本ライブラリの使い方
  19.  6.割り込みハンドラの書きかた
  20.  7.各関数の説明
  21.  8.スタックについて
  22.  9.ソースリストについて
  23. 10.著作権について
  24.  
  25.  
  26. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  27. 1.概要
  28. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  29.  
  30.  C言語のプログラムから、ハードウェア割り込みを使用するためのライブラリです。
  31.  例えばキーボードから文字を入力するとき、ひたすらキーボードを監視し続けるよ
  32. り、キー入力があったときだけキー入力関数が起動するようにしたほうがエレガントで
  33. すよね? このように「外部デバイスから要求があったときに、あらかじめ用意してい
  34. た関数を起動させる」仕組みを、ハードウェア割り込みといいます。ハードウェア割り
  35. 込みが利用できるようになると、ハードの細かい制御が可能となり、プログラミングの
  36. 幅が大きく広がります。
  37.  残念ながら、C言語だけではハードウェア割り込みのようなハードに密着した処理は
  38. 記述はできません。このような処理を書くためには、アセンブラが必要になってしまう
  39. のです。しかし、C言語では書けない部分をアセンブラで書いてリンクリンクすれば、
  40. C言語のプログラムからでも割り込みが利用できます。
  41.  そこで、アセンブラがないと書けない部分を、ライブラリという形でC言語のプログ
  42. ラムから利用できるようにしたのが、この「ハードウェア割り込み支援ライブラリ」で
  43. す。C言語では書けない部分も含め、ハードウェア割り込みにからむ面倒な処理は、す
  44. べてライブラリが勝手にやってくれますので、気軽に自作アプリケーションからハード
  45. ウェア割り込みを利用することができます。
  46.  割り込みが使いたくてうずうずしていたみなさん!このライブラリを使って、あなた
  47. の野望を実現させて下さい(笑)。
  48.  
  49.  なお、本ライブラリを利用するためには富士通のCコンパイラ「High-C」が必
  50. 要です(最新バージョンである必要はありません)。
  51.  
  52.  
  53.  
  54. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  55. 2.ファイル一覧
  56. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  57.  
  58. +--SAMPLE
  59. |  +--VSYNC.C       サンプルプログラム(VSYNC割り込み)
  60. |  +--VSYNC.EXP     (↑の実行ファイル)
  61. |  +--KEY.C         サンプルプログラム(キーボード割り込み)
  62. |  +--KEY.EXP       (↑の実行ファイル)
  63. |  +--STACK.C       サンプルプログラム(スタックの使用量の確認)
  64. |  +--STACK.EXP     (↑の実行ファイル)
  65. |  
  66. +--SOURCE           
  67. |  +--MAKEFILE      メイクファイル
  68. |  +--HIS.H         割り込みライブラリを利用するためのインクルードファイル
  69. |  +--HISINNER.H    ライブラリのソースに共通のインクルードファイル
  70. |  +--HISL1.ASM     ライブラリのソース
  71. |  +--HISL2.ASM     同上
  72. |  +--HISL3.ASM     同上
  73. |  +--HISL4.ASM     同上
  74. |  +--HISL5.ASM     同上
  75. |  +--HISL6.C       同上
  76. |  +--HISL7.C       同上
  77. |  +--HISL8.C       同上
  78. |  +--HISL9.C       同上
  79. |  +--HISL10.C      同上
  80. |  +--HISL11.C      同上
  81. |  +--HISL12.C      同上
  82. |  +--HIS.LBC       ライブラリアン用コマンドファイル
  83. |  +--HIS.MAP       ライブラリに含まれるモジュールの一覧
  84. |  
  85. +--HIS.H            割り込みライブラリを利用するためのインクルードファイル
  86. +--HIS.LIB          ライブラリ本体
  87. +--HIS.DOC          いま読んでいるファイル
  88. +--HIS.GGG          本ライブラリの簡単な説明
  89. |  
  90. +--OMAKE          
  91.    +--VSYNC.C       1995年3月号の「VSYNC期間を活用する」のサンプル
  92.    +--VSYNC.EXP     同上
  93.    +--VSYNCI.ASM    1995年3月号の「VSYNC期間を活用する」のサンプル
  94.    +--VSYNCI.ASM    同上
  95.    +--README.DOC    OMAKEディレクトリの内容の説明
  96.  
  97.  
  98. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  99. 3.ライブラリのインストール
  100. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  101.  
  102.  ライブラリを使用するときに必要なのは、インクルードファイル「HIS.H」とラ
  103. イブラリ本体「HIS.LIB」の2つです。
  104.  「HIS.H」は、High-Cをインストールしたディレクトリのなかにある「
  105. INC」ディレクトリに、「HIS.LIB」は、やはりHigh-Cをインストール
  106. したディレクトリのなかにある「SMALL」ディレクトリに入れてください。
  107.  
  108. [インストール例]
  109. +--BIN           -  -  -  -  -  -  -  -  -  -  -  <DIR>     94-08-09 18:26
  110. |  +--HCD386P.EXP   -  -  -  -  -  -  -  -  -  -    670437  94-05-16 14:37
  111. |  (略)
  112. |  
  113. +--SMALL         -  -  -  -  -  -  -  -  -  -  -  <DIR>     94-08-09 18:26
  114. |  +--HCC.LIB       -  -  -  -  -  -  -  -  -  -    199680  94-05-16 14:37
  115. |  +--HCE.LIB       -  -  -  -  -  -  -  -  -  -    253952  94-05-16 14:37
  116. |  +--TBIOS.LIB     -  -  -  -  -  -  -  -  -  -     35328  94-05-16 14:37
  117. |  (略)
  118. |  +--HIS.LIB       -  -  -  -  -  -  -  -  -  -      5632  95-06-12 19:09
  119. |  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  120. +--INC           -  -  -  -  -  -  -  -  -  -  -  <DIR>     94-08-09 18:26
  121. |  +--STDIO.H       -  -  -  -  -  -  -  -  -  -      7851  94-05-16 14:37
  122. |  +--DOS.H         -  -  -  -  -  -  -  -  -  -      7151  94-12-30  7:38
  123. |  +--EGB.H         -  -  -  -  -  -  -  -  -  -      8673  94-05-16 14:37
  124. |  +--MOS.H         -  -  -  -  -  -  -  -  -  -      4119  94-05-16 14:37
  125. |  (略)
  126. |  +--HIS.H         -  -  -  -  -  -  -  -  -  -      1940  95-06-12 23:36
  127. |  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  128. |  
  129. (後略)
  130.  
  131.  
  132.  インクルードファイル「HIS.H」は、ソース中で
  133.  
  134.  #include <his.h>
  135.  
  136. として読み込むことができます。本ライブラリを利用するときには、必ずこの1行を
  137. ソースの始めのほうに書いてください。
  138.  
  139.  ライブラリ本体「HIS.LIB」は、普段お使いの「HCE.LIB」や「TBI
  140. OS.LIB」などと同じように、リンク時に、リンクファイルなどで指定して利用し
  141. て下さい。
  142.  
  143. -lib e:\high_c\small\hce
  144.      e:\high_c\small\tbios
  145.      e:\high_c\small\his.h
  146.      ^^^^^^^^^この部分は、ご自分の環境に合わせて書き直してください。
  147.  
  148.  
  149.  
  150.  
  151. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  152. 4.サンプルプログラムについて
  153. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  154.  
  155.  サンプルプログラムは、3本あります。
  156.  
  157.  
  158. ・VSYNC.C
  159.  
  160.  VSYNC(垂直同期)割り込みを使用するサンプルです。VSYNC割り込みが発
  161. 生するたびに、画面の左端から順に青い縦棒を書いて行きます。描画はVSYNC期間
  162. 中に行われますので、残像が残ったりせず綺麗に描かれていきます。
  163.  また、VSYNC割り込みは常に60分の1秒毎に発生しますから、機種の違い、高
  164. 速モード・互換モードの違いにかかわらず、一定速度で動きます。環境にかかわらず一
  165. 定速度で動作するプログラムが作れるのも、割り込みの醍醐味の1つです。
  166.  
  167.  
  168. ・KEY.C
  169.  
  170.  キーボード割り込みを使用するサンプルです。キーボード入力待ちに割り込みを利用
  171. しています。
  172.  起動するとあの目玉TOWNS(小さいけど)が表示されます。この目玉TOWNS
  173. は、[←]キーで左に、[→]キーで右に移動します。画面の端に達したらプログラムは終
  174. 了です。
  175.  
  176.  
  177. ・STACK.C
  178.  
  179.  割り込みハンドラが消費するスタックの大きさを調べるためのサンプルです。詳細
  180. は、後述の「6.スタックについて」を参照してください。
  181.  
  182.  
  183.  
  184. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  185. 5.本ライブラリの使い方
  186. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  187.  
  188.  とっても簡単。 (^_^)
  189.  
  190.  (1)スタック領域を登録する。
  191.  (2)割り込みハンドラを登録する。
  192.  (3)割り込みを許可する。
  193.  (4)割り込みハンドラを登録から外す。
  194.  
  195.  
  196.  これだけです。詳しく説明しましょう。サンプルプログラムを適宜参照しながら読ん
  197. で下さい。
  198.  
  199.  
  200. (1)スタック領域を確保する。
  201.  
  202.  スタック領域とは、自動変数の値や、関数の呼び出し元などを記録しておく領域のこ
  203. とです。Cで書かれた関数を動かすためには欠かせない領域ですので、予めスタック領
  204. 域を確保したうえで、 HIS_stackArea関数を用いてこの領域を登録しておきます。スタ
  205. ック領域をどのくらい確保すれば良いかは、後述の「8.スタックについて」を参照し
  206. てください。
  207.  
  208.  
  209. (2)割り込みハンドラを登録する。
  210.  
  211.  割り込みハンドラを HIS_setHandler 関数を用いて登録します。割り込みの種類は
  212. 「割り込みレベル」で指定してください。
  213.  割り込みレベルは、次のようになります。
  214.  
  215.     0  タイマ
  216.     1  キーボード
  217.     2  RS-232C
  218.     3  拡張RS-232C
  219.     4  I/O拡張ユニット
  220.     5  I/O拡張ユニット
  221.     6  FPD
  222.     8  SCSI
  223.     9  CD-ROM
  224.    10  I/O拡張ユニット
  225.    11  VSYNC
  226.    12  プリンタ
  227.    13  FM,PCM
  228.    14  I/O拡張ユニット
  229.    15  (リザーブ)
  230.  
  231.  
  232.  
  233. (3)割り込みを許可する。
  234.  
  235.  割り込みハンドラを登録した直後は、割り込み禁止状態になっていますので、
  236. HIS_enableInterrupt 関数で割り込みを「許可」します。この操作により、もし割り込
  237. みが発生すれば、(2)で登録した割り込みハンドラが実行されることになります。
  238.  
  239.  
  240. (4)割り込みハンドラを登録から外す。
  241.  
  242.  割り込みハンドラの登録を HIS_detachHandler関数を用いて解除します。以後、ユー
  243. ザープログラムの割り込みハンドラが呼び出されることはありません。
  244.  登録した割り込みハンドラは、プログラムの終了までに必ず外しておいて下さい。
  245.  
  246.  
  247.  
  248.  
  249. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  250. 6.割り込みハンドラの書きかた
  251. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  252.  
  253.  
  254.  割り込みハンドラというのは、割り込みが起こったときに呼び出される関数です。割
  255. り込みハンドラには「(VSYNC割り込みが起こったら)ああする」とか、「(キー
  256. 入力があったら)こうする」とかいったような処理を、記述することができます。ただ
  257. し、割り込みハンドラは通常のプログラムとは異なった状況で実行される関数ですか
  258. ら、次のようなことに注意してください。
  259.  
  260.  
  261.  注意点その1:割り込みハンドラでは、なるべくハンドラ外の関数を使用しない。
  262.  
  263.   「ハンドラ外の関数」には、High-C標準のライブラリ関数も含みます。これ
  264.   は不便ですが、仕方ありません。割り込みが発生する前に実行されていたプログラ
  265.   ムと割り込みハンドラの処理が衝突して、誤動作を起こす恐れがあるためです。と
  266.   くに、入出力関係の関数は、なるべく使わない方が無難です。とくに、割り込みハ
  267.   ンドラ実行中は割り込みが使えませんので、キー入力など割り込みを使っていそう
  268.   な関数は、厳禁です)。
  269.    ただし、ハンドラ外の関数を全く利用できないというわけではありません。割り
  270.   込みハンドラで使っている関数を、ハンドラの外では使わないなどの工夫をすれ
  271.   ば、たいがいの関数は問題なく使えるはずです。
  272.  
  273.  
  274.  注意点その2:割り込みハンドラの処理は、最小限度にとどめる。
  275.  
  276.    割り込みハンドラで重い処理をしていると、その分通常のプログラムの実行速度
  277.   が低下します。このようなことが起こらないよう、割り込みハンドラの処理は、で
  278.   きればフラグを立てる程度の簡単な処理にとどめておいた方がいいでしょう。
  279.  
  280.  
  281.  注意点その3:割り込み原因を解除する。
  282.  
  283.    割り込みハンドラの処理が終わったら、そのことをTOWNS君に教えてあげる
  284.   必要があります。このやり方は、割り込みの種類によって違います。例えば、
  285.   VSYNC割り込みの場合は「割り込み原因クリアレジスタ(I/Oアドレス05
  286.   CAh)」に書き込みをする、キーボード割り込みの場合には「キーボードデータ
  287.   レジスタ(I/Oアドレス0600h)」の値を読み出す、といった具合です。詳
  288.   細は、「FMTOWNSテクニカルデータブック(アスキー社刊行、千葉憲昭著)
  289.   」を参照してください。
  290.  
  291.  
  292.  
  293.  
  294. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  295. 7.各関数の説明
  296. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  297.  
  298. (1)関数一覧
  299.  
  300.  HIS_checkIntNumber   割り込みレベルが正常かチェックする
  301.  HIS_checkMask        指定された割り込みがマスク(禁止)されているか調べる
  302.  HIS_detachHandler    割り込みハンドラの登録を解除する
  303.  HIS_disableAllInt    全てのハードウェア割り込みを禁止する
  304.  HIS_disableInterrupt 指定されたハードウェア割り込みを禁止する
  305.  HIS_enableAllInt     「全てのハードウェア割り込みの禁止」を解除する
  306.  HIS_enableInterrupt  指定されたハードウェア割り込みを許可する
  307.  HIS_getCS          コードセグメントのセレクタの値を読む
  308.  HIS_getDS          データセグメントのセレクタの値を読む
  309.  HIS_readIMR          IMR(インタラプトマスクレジスタ)の値を読む
  310.  HIS_setHandler       割り込みハンドラを登録する
  311.  HIS_stackArea        スタック領域を登録する
  312.  HIS_writeIMR         IMR(インタラプトマスクレジスタ)に書き込みをする
  313.  
  314.  
  315.  実際に良く使うのは、「5.本ライブラリの使い方」で紹介した
  316.  
  317.   HIS_stackArea  HIS_setHandler  HIS_enableInterrupt HIS_detachHandler
  318.  
  319. の4つでしょう。これ以外はオマケと思っていただいて結構です。(^^;)
  320.  
  321.  
  322. (2)各関数の説明
  323.  
  324. ---------------------------------------------------------------------------
  325. ○HIS_checkIntNumber   割り込みレベルが正常かチェックする
  326.  
  327. int  HIS_checkIntNumber( int  intnum );
  328.  
  329.   intnum : ハードウェア割り込みレベル
  330.   戻り値 : HIS_NoError = 正常終了
  331.            その他の値は、後述の「(3)int型関数共通戻り値」参照
  332.  
  333.  指定されたハードウェア割り込みレベルが正常な値かどうかチェックします。具体的
  334.  には、0~15の値であれば正常です。
  335.  
  336.  
  337. ---------------------------------------------------------------------------
  338. ○HIS_checkMask        指定された割り込みがマスク(禁止)されているか調べる
  339.  
  340. int  HIS_checkMask( int  intnum );
  341.  
  342.   intnum : ハードウェア割り込みレベル
  343.   戻り値 : HIS_intMasked   = 割り込みは禁止されている
  344.            HIS_intUnmasked = 割り込みは許可されている
  345.  
  346.  指定されたレベルのハードウェア割り込みが許可されているかどうかをチェックしま
  347. す。
  348.  
  349. ---------------------------------------------------------------------------
  350. ○HIS_detachHandler    割り込みハンドラの登録を解除する
  351.  
  352. int  HIS_detachHandler( int  intnum );
  353.  
  354.   intnum : ハードウェア割り込みレベル
  355.   戻り値 : HIS_NoError = 正常終了
  356.            その他の値は、後述の「(3)int型関数共通戻り値」参照
  357.  
  358.  指定されたハードウェア割り込みレベルの割り込みハンドラ(直前にHIS_setHandler
  359. 関数によって登録されたハンドラ)の登録を外します。指定されたレベルの割り込みに
  360. ついては、割り込みの許可・禁止の状態等も含め、直前のHIS_setHandler関数を実行す
  361. る前の状態に完全に戻ります。
  362.  登録した割り込みハンドラは、この関数を使って、プログラムの終了までに必ず外し
  363. ておいて下さい。
  364.  
  365. ---------------------------------------------------------------------------
  366. ○HIS_disableAllInt    全てのハードウェア割り込みを禁止する
  367.  
  368. #define HIS_disableAllInt() _inline( 0xfa )
  369.  
  370.  全てのハードウェア割り込みを禁止します。定義からわかるように、
  371. HIS_disableAllIntは関数ではなく、割り込み禁止を意味する機械語(CLI)に展開
  372. されるマクロです。HIS_enableAllIntと対で、一時的に全ての割り込みを禁止したいと
  373. きに使います。
  374.  
  375. ---------------------------------------------------------------------------
  376. ○HIS_disableInterrupt 指定されたハードウェア割り込みを禁止する
  377.  
  378. void HIS_disableInterrupt( int  intnum );
  379.  
  380.   intnum : ハードウェア割り込みレベル
  381.  
  382.  指定されたハードウェア割り込みを禁止します。割り込みハンドラは、たとえ登録さ
  383. れていても呼び出されなくなります。
  384.  
  385. ---------------------------------------------------------------------------
  386. ○HIS_enableAllInt     「全てのハードウェア割り込みの禁止」を解除する
  387.  
  388. #define HIS_enableAllInt() _inline( 0xfb )
  389.  
  390.  HIS_disableAllintの効果を打ち消します。定義からわかるように、
  391. HIS_enableAllIntは関数ではなく、割り込み許可を意味する機械語(STI)に展開さ
  392. れるマクロです。HIS_disableAllIntと対で、一時的に全ての割り込みを禁止したいと
  393. きに使います。
  394.  
  395. ---------------------------------------------------------------------------
  396. ○HIS_enableInterrupt  指定されたハードウェア割り込みを許可する
  397.  
  398. void HIS_enableInterrupt( int  intnum );
  399.  
  400.   intnum : ハードウェア割り込みレベル
  401.  
  402.  指定されたハードウェア割り込みを許可します。この関数の実行後、あらかじめ
  403. HIS_setHandler関数で登録されていた関数が呼び出されるようになります。
  404.  なお、この関数を使って HIS_disableAllInterrupt関数で禁止した割り込みを許可す
  405. ることはできません。
  406.  
  407. ---------------------------------------------------------------------------
  408. ○HIS_getCS          コードセグメントのセレクタの値を読む
  409.  
  410. unsigned short HIS_getCS( void );
  411.  
  412.   戻り値 : コードセグメントのセレクタの値(CSレジスタの値)
  413.  
  414.   コードセグメントのセレクタの値(CSレジスタの値)を知りたいときに使います。
  415.  
  416. ---------------------------------------------------------------------------
  417. ○HIS_getDS          データセグメントのセレクタの値を読む
  418.  
  419. unsigned short HIS_getDS( void );
  420.  
  421.   戻り値 : データセグメントのセレクタの値(DSレジスタの値)
  422.  
  423.   データセグメントのセレクタの値(DSレジスタの値)を知りたいときに使います。
  424.  
  425. ---------------------------------------------------------------------------
  426. ○HIS_readIMR          IMR(インタラプトマスクレジスタ)の値を読む
  427.  
  428. int  HIS_readIMR( void );
  429.  
  430.   戻り値 : IMR(インタラプトマスクレジスタ)の値
  431.  
  432.   IMR(インタラプトマスクレジスタ)の値を読み取ります。b0-b7がマスタ側、
  433. b8-b15がスレーブ側の値です。b16-b31は意味を持ちません。
  434.  なお、IMRというのはハードウェア割り込みコントローラ(PIC)内部のレジス
  435. タ(I/Oアドレス0002h、0012h)です。詳細はアスキーの「FMTOWN
  436. Sテクニカルデータブック」を参照してください。
  437.  
  438. ---------------------------------------------------------------------------
  439. ○HIS_setHandler       割り込みハンドラを登録する
  440.  
  441. int  HIS_setHandler( int  intnum , void (*handler)() );
  442.  
  443.   intnum  : ハードウェア割り込みレベル
  444.   handler : 割り込みハンドラへのポインタ
  445.   戻り値  : HIS_NoError = 正常終了
  446.             その他の値は、後述の「(3)int型関数共通戻り値」参照
  447.  
  448.  指定された割り込みハンドラを、指定されたハードウェア割り込みの割り込みハンド
  449. ラして登録します。割り込みは一時的に禁止されますが、HIS_enableInterrupt関数を
  450. 実行すると登録した割り込みハンドラが稼働可能になります。
  451.  本関数を呼ぶにあたって、古い割り込みハンドラを退避したりする必要はありませ
  452. ん。ライブラリのほうで面倒を見てくれます。
  453.  また、前に登録した割り込みハンドラを外す前に新しく別の割り込みハンドラを登録
  454. した場合、古い割り込みハンドラは一時的に無効になり、新しい割り込みハンドラが有
  455. 効となります。古い割り込みハンドラは、 HIS_detachHanlder関数によって新しい割り
  456. 込みハンドラが外されたとき、再び有効になります。
  457.  
  458. ---------------------------------------------------------------------------
  459. ○HIS_stackArea        スタック領域を登録する
  460.  
  461. char *HIS_stackArea      ( char *stack , int stacksize );
  462.  
  463.   stack     : スタック領域の先頭位置のポインタ
  464.   stacksize : スタック領域の大きさ
  465.   戻り値    : 登録完了 -> スタック領域の先頭位置のポインタ
  466.               登録解除 -> NULL
  467.  
  468.  割り込みハンドラで使用するためのスタック領域を登録します。この領域は、16種
  469. 全てのハードウェア割り込みハンドラで共通に使われます。
  470.  stack == NULL または stacksize == 0 のときはスタック領域の登録は解除され、関
  471. 数の戻り値は NULL となります。
  472.  
  473. ---------------------------------------------------------------------------
  474. ○HIS_writeIMR         IMR(インタラプトマスクレジスタ)に書き込みをする
  475.  
  476. void HIS_writeIMR( int  value );
  477.  
  478.   value : IMR(インタラプトマスクレジスタ)に書き込む値
  479.  
  480.   IMR(インタラプトマスクレジスタ)に書き込みをします。b0-b7がマスタ側、
  481. b8-b15がスレーブ側に書き込まれます。b16-b31は意味を持ちません。
  482.  
  483.  
  484. (3)int型関数共通戻り値
  485.  本ライブラリのほとんどのint型関数では、以下に示されるリターンコードを返しま
  486. す。
  487.  
  488.  HIS_NoError            正常終了
  489.  HIS_OtherHandler       すでに他のハンドラが登録されているが、
  490.                                     新規のハンドラが稼働する。
  491.  HIS_IllegalIntNumber   割り込みレベルが不正である。
  492.  HIS_OutofMemory        メモリ不足。
  493.  HIS_NoHandler          登録されている割り込みハンドラはない。
  494.  HIS_UnexpectedSize     変数のサイズが予想と異なり、本ライブラリは実行不可。
  495.  
  496.  
  497.  
  498. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  499. 8.スタックについて
  500. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  501.  
  502.  「6.(1)スタック領域を確保する。」でも述べたように、スタック領域とは、自
  503. 動変数の値や、関数の呼び出し元などを記録しておく領域のことです。Cで書かれた関
  504. 数を動かすためには欠かせない領域ですので、予めスタック領域を確保したうえで、
  505. HIS_stackArea関数を用いてこの領域を登録しておきます。
  506.  
  507.  スタック領域を確保するとき問題になるのは、どの位の大きさの領域を確保すべきか
  508. ということでしょう。実際に実験して割り込みハンドラがスタックをどの程度使うのか
  509. 調べてみると、この問題に答えを出すことができます。
  510.  サンプルの「STACK.C」を見てください。このプログラムは、割り込みハンド
  511. ラがどの位スタック領域を使用したか教えてくれます。スタック領域をあらかじめ適当
  512. な値(何でもよいのですが、このサンプルではABhにしました)で埋めたあと、割り
  513. 込みハンドラを動かしてスタック領域がどこまで使われたのか調べているわけです(ス
  514. タック領域は、終わりの方から先頭に向かって使われていきます)。
  515.  割り込みハンドラがどの程度スタック領域を消費しているのか知りたくなったら、こ
  516. の「STACK.C」を参考に実験して、調べてみてください。
  517.  
  518.  なお、スタック領域は余裕をもって、なるべく大きめにしておくのがよいでしょう。
  519.  
  520.  
  521.  
  522. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  523. 9.ソースリストについて
  524. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  525.  
  526.  「SOURCE」ディレクトリには、本ライブラリのソースリストが収録されていま
  527. す。アセンブラソースの方は、386|ASMをお持ちの方なら、問題なくコンパイ
  528. ル、アセンブルできると思います。
  529.  
  530.  問題はCのソースです。実は、「High-Cマルチメディア(開発)キット」を使
  531. っている場合、インクルードファイル「DOS.H」にバグがあるためエラーが発生し
  532. てしまい、コンパイルできません。そこで、「DOS.H」を書き換える必要がありま
  533. す。
  534.  
  535.  「DOS.H」の50行目前後に
  536.  
  537.    #ifdef _I386
  538.  
  539. という行がありますが、これをコメントにしてしまいます。
  540.  
  541.    /*#ifdef _I386*/
  542.  
  543. この #ifdef と対になっている #else , #endif が80行目前後にありますので、この
  544. あたりもコメントにします。
  545.  
  546.    /*
  547.    #else
  548.    extern _Far void (* _dos_getvect(unsigned __intnumber))();
  549.    extern void _dos_setvect(unsigned __intnumber,_Far void (*v)());
  550.    #endif
  551.    */
  552.  
  553. これで、コンパイルできるようになります。
  554.  
  555.  
  556. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  557. 10.著作権について
  558. 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  559.  
  560.  本ライブラリ、サンプル、及び本ドキュメントの著作権は、作者の私、安田知弘(
  561. ちょもらんま)が所有しています。
  562.  本ライブラリを組み込んだアプリケーションの作成は、もちろん自由に行って構いま
  563. せんし、作成したアプリケーションの配付も制限しません。ライブラリそのものの再配
  564. 付もしてくださって構いませんが、その際は本ドキュメントも含め、全てまとめて(
  565. OMAKEディレクトリは除く)行ってください。
  566.  また、本ライブラリを改造してアプリケーションに組み込むことも、ドキュメントに
  567. 一言書いておいて下さるかぎり、制限しません。ただし、改造したものをライブラリと
  568. して再配付する場合には、別途作者の許可が必要です。
  569.  なお、作者は、本ライブラリ及びドキュメントを利用した結果生じた損害に対して、
  570. 一切責任を負いません。
  571.