う利点があります。 てすから OS のファンクションだけを利用 しておけば , 基本的にハードウェアに依存 しないプログラムを作成することがて、きま す。同じ OS 上て、あれば , どの機種て、も動作 するプログラムが作成て、きるわけて、す。 ただし , テキスト関連の機能については , 表示スヒ。ードが遅いということが欠点とし てあげられます。 といいます。 BIOS もファンクションコール 日 OS (Basic I/O System) このときに利用する機能を , ェアを制御しなくてはなりません。 の場合には , OS を飛び越えて直接ハードウ もない機能を利用する場合があります。そ ときには , OS のファンクションコールに 日 / OS ードを上げています。 て、は , 次に述べる BIOS を多く利用してスヒ。 そのため , ほとんどのアプリケーション 原因て、す。 したため , 走行ステップが多いことがその 元来英語専用て、あったものを日本語対応に ェックなどを行いながら動作することと , MS-DOS は , 表示するデータの変換やチ [ 表 1 ] ASC Ⅱ制御コード 記号 BEL BS HT VT FF CR SCJB ESC RS LF 16 進数 07 08 09 OA 0 日 OC OD 1 A 1 B 1 E 機 能 と同様に , ードウェア機能のなかて、よく Sound bell ブザーを約 1 秒鳴らします。 Cu 「 SO 「 backwa 「 0 カーソルを 1 文字左に移動します。 カーソルが 72 カラムより右側にある場合は 1 行下の左端に移動し , 最終行の場合は 1 08 , , 24 , 32 , 40 , 48 , 56 , 64 , 72 タブ位置は次のように決められています。 カーソルを次のタブ位置に移動します。 SkiP tO nexttab stOD 頭のコラム , 行 ) にある場合は何もしません。 カーソルが行の左端にある場合は 1 行上の右端に移動し , カーソルがホーム位置 ( 先 カーソルを 1 文字右に移動します。 Cu 「 SO 「 fO 「 wa 「 d もしません。 カソールを同じカラム位置で 1 行上に移動します。カーソルが先頭行にある場合は何 Cu 「 SO 「 IJD 行スクロールアップします。 カーソルを同じカラム位置で 1 行下に移動します。カーソルが最終行にある場合は 1 Cu 「 SO 「 down 行スクロールアップします。 ある場合は 1 行スクロールアップして左端に移動します。 カーソルが行の右端にある場合は 1 行下の左端に移動し , カーソルが最終行の右端に カーソルをホームに移動します。 Cu 「 SO 「 HOME 工スケープコードです。 lnt 「 OdUCe on ESC sequence C 日丁画面をすべてクリアします。カーソルはホーム位置となります。 Clea 「 SC 「 een カーソルを行の左端に移動します。 Cu 「 SO 「 tO left ma 「 gin 使われるものを関数としたものて、す。 BIOS はハードウェアそのものて、すから , 機種によって内容が違います。そのため BIOS を 1 個て、も利用すると , そのプログラムはそ のハードウェア専用プログラムになってし まいます。全機種対応というプログラムを 作成する場合には , ファンクションコール を利用してください のインタフェイスを受け持ちます。このた IO. SYS は , ハードウェアと MSDOS. SYS に常駐します。 MS-DOS が起動すると Fig. 2 のようにメモリ いうふたつのファイルから構成されてます。 MS-DOS は , IO. SYS と MSDOS. SYS と CMAGAZINE 1990 3 め , IO. SYS は機種によって異なります。 MS 96 ※ NEC rMS-DOS Ve 「 . 3. 3 B マニュアル」より List 1 csr_ POSit 1 : 2 : 3 : 4 : 6 : 7 : 8 : 9 : / * csr_posit csr_posit(int X, int Y) VO i d static char param[2]= (char)y + 0X20: param[3]= (char) x + 0X20 : printf("X. 4s",param) : return;
[ 表 2 ] ESC シーケンス カーソルを右に n 文字 (Dn=n) 移動します。カーソルが行の右端にある場合 , あるいは右端を越えた場合には右端に位置します。省 Cu 「 SO 「 fO 「 wa 「 0 置します。ロ n が省略されるか pn = 0 の場合はロ n = 1 として処理します。 カーソルを同じカラム位置で下に n 行 ( ロ n = n ) 移動します。カーソルが最終行にある場合は , あるいは最終行を越えた場合には最終行に位 Cu 「 SO 「 down します。ロ n が省路されるかロ n = 0 の場合はロ n = ーとして処理します。 カーソルを同じカラム位置で上に n 行 (on= n ) 移動します。カーソルが先頭行にある場合 , あるいは先頭行を越えた場合には先頭行に位置 C 凵「 SO 「 I-JD 1 と C のパラメータは省略できません。 c はカラム位置の指定てあり 1 カラム目に位置づけるには 20H となります。 1 は行位置の指定であり 1 行目に位置づけるには 20 H となります。 この場合ノヾラメータ 1 と C は 2 進数で 20 H のオフセットが加えられた値です。 ESC [ : ロ c H と同様の処理を行います。 ESC CDl:pc H と同様の処理を行います。 ム目に位置づけます。 pc= n のときは n カラム目で n が最終カラムの値より大きい場合は最終カラムに位置づけ , pc= 0 あるいは pc が省略された場合は 1 カラ = 0 あるいはが省路された場合は 1 行目に位置づけます。 カーソルを指定位置に移動します。ロは m のときは m 行目で m が最終行の値より大きい場合は最終行に位置づけます。 Direct cu 「 SO 「 add 「 essing 機能 C 日 T 画面の制御を行うエスケープシーケンスには , 次のものがあります。ここで ESC はエスケープコード ( 1 (H) を表し , バラメータロ n , 団 , DC, ロ s は川進数を表しています。 工スケープシーケンス ESC CDI:pc H ESC [ 口にロ c f ESC=1c ESC [pn A ESC [on B ESC [pn C ESC [pn D ESC COU ESC [ 1 J ESC [2J ESC * ESC [OK ESC [ 1 K ESC [EK ESC [pn M ESC [pn L ESC ESC ESC ESC )O ESC [6n ESC [u ESC [s 路されるかロ n = 0 の場合は , pn= 1 として処理します。 Cu 「 SO 「 backwa 「 d カーソルを左に n 文字 (pn= n) 移動します。カーソルが行の左端にある場合 , あるいは左端を越えた場合には左端に位置します。ロ n が省 路されるか pn = 0 の場合は , pn= 1 として処理します。 Clea 「 f 「 om cu 「 SO 「 tO end Of SC 「 een カーソル位置から , 最終行の右端までクリアします。カーソル位置はそのままです。パラメータ 0 は省路できます。 Clea 「 f 「 om beginning Of SC 「 een tO CIJ 「 SO 「 Clea 「 enti 「 e line containing cu 「 SO 「 行の左端から , カーソル位置までをクリアします。カーソル位置はそのままです。 Clea 「 f 「 om beginning Of line tO cu 「 SO 「 Clea 「 f 「 om cu 「 SO 「 tO end Of line ESC [ ?-U と同様の処理を行います。 カーソル位置はホーム位置となります。 C 日 T 画面をすべてクリアします。 Clea 「 SC 「 een 先頭行の左端から , カーソル位置までをクリアします。カーソル位置はそのままです。 カーソル位置から , 行の右端までをクリアします。カーソル位置はそのままです。パラメータ 0 は省路できます。 カーソルを同じカラム位置で 1 行上に移動します。カーソルが先頭行にある場合は一行スクロールダウンします。 Reve 「 se index カーソルを 1 行下の行の左端に移動します。カーソルが最終行にある場合は , 1 行スクロールアップします。 Next line カーソルと同じカラム位置で 1 行下に移動します。カーソルが最終行にある場合は 1 行スクロールアップします。 lndex 移動する行が最終行を越えた場合は , その越えた行は夫われます。 pn が省路されるか pn = 0 の場合は = 1 として処理します。 カーソルの位置する行以降を n 行 ( pn = n ) 下に移動し , 空白の n 行を挿入します。カーソルは先頭の挿入行の左端に位置します。挿入行が最終行を越えた場合 , lnse 「 t line を越えての削除は行われません。 pn が省略されるかロ n = 0 の場合はロ n = 1 として処理します。 カーソルの位置する行から下に n 行 (Dn= n ) 削除し , 以降の行を上に詰めます。カーソルの位置は詰められた行の左端になります。最終行 Delete line カーソルが位置している行の左端から右端まてをクリアします。カーソル位置はそのままです。 Select kanJi mode カーソル位置を直後のコンソール入力呼び出しで知らせます。その型式は ESC [ ロ c 日です。 Cu 「 SO 「 position 「 eDO 「 t ESC [ s でセープした内容を戻します。以前に ESC [ s が実行されていない場合は , カーソルはホーム位置に移動し , 属性は規定値となります。 Set cu 「 SO 「 DOSition カーソル位置 ( 行 , カラム ) とその表示文字の属性をセープします。 Save cu 「 SO 「 position モードです。 漢字を取り扱うモードを指示します。このモードになっていないと , 漢字を入力しても漢字の表示は行われません。システムの既定値はこの 98 CMAGAZINE 19 3
パラメータをセットした後て、 , printf 関 数て、出力しています。「 % 」に続く「 .4 」は精度 指定子て、 4 文字出力の意味て、す。「 s 」は変数 param の文字列出力て、あることを示しま す。 ライプラリが画面上に文字を表示する場 合や文字を入力する場合 , カーソル位置か ら表示 , あるいはカーソル位置て、入力する ようになっています (ListI) 。 put st 「 ( 文字列表示 ) 任意の場所に文字列を表示します。内部 て、 , csr posit 関数を呼び出しています。 printf 関数の「 % 」に続く「 * 」は , 表示する文 字数を引数 (cnt) て、渡すことを示しています 40 : / * 37 : VOid 36 : VOid VOid VOid VOid VOid 31 : VOid VOid 1 0 List 30 : 32 : 33 : 34 : 35 : 38 : 39 : 41 : 42 : 43 : { 44 : 45 : 47 : 50 : 52 : 54 : 56 : 59 : 63 : 70 : 77 : 86 : 92 : 93 : 98 : 100 : 101 : 102 : 103 : 104 : clr_right(int x,int y,int cnt); clr_left(int x,int y, int cnt); -fwd(void) : back ()o (d) : -up(void): down(void) : CSr_ CSr CSr_ CSr color (char *attr, char * c 引 0 に no ) : buzzer(void) : int main() str[60], work [ 20 ] . chr; Char int workno,x, y. cnt; menu: cls(); COIor(REV, SKY) : put - str ( 33 , 2. " 画面関数テスト " , 14 ) : c010r(0RG, WHITE) : csr-posit(), 5 ) : (List2) 。 put chr(l 文字表示 ) 部て、 csr posit 関数を呼び出しています。全 任意の場所に半角 1 文字を表示します。内 clea 「 ( 1 行消去 ) 用します (List4) 。 一般に起動直後 , 画面切り替えなどに使 します。 ソルは , ホームボジション ( 左上端 ) に位置 テキスト画面を全画面消去します。 cls ( 全画面消去 ) 角文字には対応していません (List3) 。 カー データだけを表示する場合 ( あるいは , その す。また , 左側に見出しを残しておいて , 一般に文字列表示を行う前に呼び出しま します。 カーソル位置から右側 ( 左側 ) を n 行分消去 ( カーソル右側 / カーソル左側消去 ) clr right/clr left す (List5) 。 一般に文字列表示を行う前に呼び出しま posit 関数を呼び出しています。 任意の 1 行を消去します。これも内部て、 csr CMAGAZINE 19 3 逆 ) にも使用て、きます (List6)0 102 printf()l : 文字列表示 \ n " ) : printf()2 : 1 文字表示 \ n " ) : printf()3 : 全画面消去 \ n " ) : printf( ” 4 : 1 行消去 \ n " ) : printf()9 : カーソル左移動 \ n " ) : pr i ntf ( " 8 : カーソル右移動 \ n" ) : printf()7 : ブザー鳴動 \ n " ) : printf()6 : カーソル左側消去 \ n " ) : printf()5 : カーソル右側消去 \ n " ) : printf()9 9 : 終了 \ n " ) : printf()1 1 : カーソル下移動 \ n " ) : printf()1 0 : カーソル上移動 \ n " ) : csr-posit(), 19 ) : clear(19); clear(18); case 4 : break : cls(); case 3 : break : put-chr(), Y, str[0]) : cls(); getxy (&x. (Y) : gets(str) : printf ( ”表示したい文字 = つ : csr-posit(), 18 ) : cIear(19): cIear(18); case 2 : break; put-str(x,y,str, cnt) : cls(): getxy (&x, (Y) : cnt=strlen(str) : gets (str) : printf(" 表示したい文字列 = csr-posit(). 18 ) : clear(19); cIear(18); case 1 : switch (workno) workno=atoi (str) : gets (str) : coIor(0RG, WHITE) : printf(" 処理番号 = " ) : csr-posit ( 0 , 19 ) : pr i ntf ( " 処理番号を指定してください。 Yn") : csr-posit(). 18 ) : coIor(0RG, SKY) : gets (work) : pr i ntf ( " 消去したい行番号 ( 0 ~ 2 4 )
五ロ 用 応 ことがて、きます。たとえば , カーソルの位 置づけて、は , カーソルの座標 ( X , Y ) を指定す ることがて、きます。 カーソル位置づけの ESC シーケンス ( ESC CpI ; pcH) は , 次のような文字列として出 力します。 x = 0 , Y= 10 とすると , 次のよ うになります。 char param [ ] [ 表 3 ] colo 「バラメータ define 名 List 9 バラメータ 0 7 ・・乙 - LO 定転線滅 既反下点赤青紫緑黄水白 0 日 G REV IJNDER 日凵 NK RED BLIJE PIJRPLE G 日 EEN YELLOW SKY WHITE CO ー 0 「 1 : 2 : / * col or 3 : 4 : color (char *attr. char * C010r - no ) VO i d param ロ ={ESC, ・ [ ・ 6 : static char 7 : param [ 2 ] =*attr; 8 : / * 表示属性 * / param[4]=*color-no; / * 表示色 * / 9 : param[5]=*(c010r-no + 1) : printf("X. 7s", param) : return; 13 : } 属 性 りし CO 1 / 8 0 りし Cu 0 し Cu 表示色 X 座標 Y 座標 これを CRT へ出力すれば , 指定した位置 にカーソルが位置づけられます。 サンプレプログラム サンプルプログラムは , 各関数のテスト 用のプログラムを内蔵しています。メニュ ーに従って , 操作すれば , 各関数のテストが て、きるようになっています。いろいろと , 自作の関数を増やしてください それて、は各関数を解説しましよう。 csr posit( カーソル位置づけ ) カーソルを任意の場所に位置づけます。 「 ESC = lc 」を使用しています。「 1 」 ( Y 座 標 ) , 「 c 」 ( x 座標 ) は , それぞれ 2 進数て、オフ セット 20H を加えた値て、す。 X 座標は , 0 ~ 79 まて , Y 座標は 0 ~ 24 ま て、となっています。以下 , XY 座標を指定す る関数は , この範囲て、指定してください たとえば x = 5 , Y= 10 とすると , 次のよう になります。 rnaln LlSt 1 0 1 : #include く i 0. h> 2 : # i ncl ud e く stdio. h> 3 : #include く string. h> 4 : #include く stdlib. h> 5 : #include く sysytypes. h> 6 : #include く sysYstat. h> 7 : 8 : #define ESC 0x 1 b 9 : #define B 亂し 0X07 11 : #define ORG 12 : #define REV 13 : #define UNDER 14 : #define B い NK 16 : #define RED 17 : #define B し UE 18 : #define PURP し E 19 : #define GREEN ” 20 ” 20 : #define YELLOW ” 21 ” 21 : #define SKY 22 : #define WHITE 23 : 24 : VOid getxy(int *x, int (y) : 25 : VOid csr-posit(int x, int y) : 26 : VOid put-str(int x. int y,char *buf, int cnt) : put-chr(int x, int y,char chr) : 27 : VOid cls(void); 28 : void clear(int y); 29 : VO i d char param [ ] {Ox1b, ' ' , Ox2a , 0X25 } ・ X 座標 Y 座標 応用 C 言語 101
語 用 応 buzzer( プサー鳴動 ) 約 1 秒間ブザーを鳴らします。一般に , 工 ラーや警告メッセージとともに使用します (List7) 。 1 0 List y=atOi (work) : 105 : clear(y) : 106 : break : 107 : case 5 : 108 : clear(18); 109 : clear(19); 110 : csr-posit(), 18 ) : 111 : 112 : pr i ntf ( ”カーソルの右側を消しますっ : 113 : getxy (&x, (y) : 114 : printf ( " 消去したい行数 = " ) : 115 : gets (work) : 116 : cnt=ato i (work) : clr-right(x,y,cnt); 1 18 : break; 1 19 : case 6 : cIear(18); 120 : cIear(19); 121 : csr-posit(), 18 ) : 122 : pr i ntf ( " カーソルの左側を消します " ) : 123 : getxy(&x,&y) : 124 : printf ( " 消去したい行数 = " ) : 125 : 126 : gets (work) : cnt=ato i (work) : 127 : clr_left(), y,cnt) : 128 : 129 : break; 130 : case 7 : buzzer() : 131 : 132 : break; 133 : case 8 : cIear(18); 134 : put-str ( 0 , 18 , " 1 桁目なら 0 k 。確認 ! " , 22 ) : 135 : csr-posit(), 19 ) : 136 : csr-fwd() : 137 : 138 : break; 139 : case 9 : cIear(18); 140 : put-str ( 0 , 18. ” 0 桁目なら 0 k 。確認 ! " , 22 ) : 141 : csr-posit(1,19); 142 : csr-back ( ) : 143 : 144 : break : 145 : case 10 : cIear(18); 146 : put - str ( 0 , 18 , " この行なら 0 ko 確認 ! ル , 22 ) : 147 : 148 : csr-posit(), 19 ) : csr-up() : 149 : 150 : break : case 11 : cIear(18); 152 : put - str ( 0.18 げ 1 行飛びなら 0 ko 確認 ! " , 24 ) : 153 : csr-posit(), 19 ) : 154 : csr-down ( ) : 155 : 156 : break : / * 終了 * / 157 : case 99 : 158 : return; 159 : getchar ( ) : 160 : 161 : goto menu : 162 : } 163 : 164. ・ / * getxy 165 : 166 : getxy(int *x. int *Y) VO i d 168 : Char work [ 20 ] : 169 : 170 : clear(2 の : 171 : csr-posit(), 2 の : 172 : pr i ntf ( " X 座標 ( 0 ~ 7 9 ) = 173 : gets (work) : *x=atoi (work) : 174 : pr i ntf ( " Y 座標 ( 0 ~ 2 4 ) = 175 : gets (work) : 176 : *y=atoi (work) : 177 : 178 : return; csr fwd/csr back/csr up/csr down ( カーソル移動右 / 左 / 上 / 下 ) カーソルを 1 桁右へ ( 左へ / 上へ / 下へ ) 移動 します。ラインエデイタやスクリーンエデ イタを作成するときにカーソル制御用とし て使用します (List8)0 c 。 lo 「 ( 表示属性 / 表示色指定 ) 呼び出し後に表示する文字の「属性」と「表 示色」を指定します。指定パラメータは表 3 のとおりて、す。 必ず属性と表示色を指定してください 属性や表示色を変える場合には , また呼び 出してください なお , この ESC シーケンスは , 属性のみ , 表示色のみという指定がて、きます。目的に 応じて , どちらか一方のみの関数も作成し てください (List9) 。 関数の使用例 関数の使用例は , サンプルプログラムの main 関数をご覧ください。それぞれのテス トが使用例になっています (List10)0 宣言文が書かれています。必要な 定義文 , 関数だけを抜き出して使われる場合には , この部分も忘れないようにしてください また , 前回まて、作成してきたデータベー スアクセスプログラムの表示部分ゆ rintf 関 数 ) を上の関数を使って書き換えると , カー ド型データベースふうの表示がて、きます。 次回は , 今回の関数を利用して , 挿入 / 削 除機能つきのキーポード入力関数を作成す る予定てす。 応用 c 言語 103
五ロ 用 応 工スケープシーケンス 機能 SeIect g 「 aDh mode ESC ) 3 グラフ文字を取り扱うモードを指示します。このモードにてグラフ文字の入力および出力が可能となります。 ESC [ > 51 Enable cu 「 SO 「 diSDIay カーソルを画面上に表示するモードを指示します。システムの既定値はこのモードです。 ESC [>5h Disable cu 「 SO 「 diSDlay カーソルを画面上に表示しないモードを指示します。このモードになるとそれ以降 ESC [ > 51 が指示されるまでカーソルは表示されません。 ESO [ > 1 h Enable bottom line C 日 T 画面の最下位行をプログラムで使用可能とするための指示です。これにより画面のすべての行をプログラムで使用できます。 ESC [ > ⅱ Disable bottom line この指示により , C 日丁画面の最下位行はシステムで使用されます。システムの既定値は , このモードです。 ESC [>3h Select 20 line mode C 日丁画面の表示行数を 20 行とする指示です。 ノーマ丿レモードのみ ESC [ > 3 ⅱ Select 31 line mode C 日 T 画面の表示行数を田行とする指示です。 八イレゾリューションモードのみ ESC [ > 3 ー Select 25 line mode C 日 T 画面の表示行数を 25 行とする指示です。システムの既定値はこのモードです。 Cha 「 acte 「 att 「 ibute ESC 表示文字に属性を指示することができます。属性は一度指定すると以降に続く表示文字に適用され , 次の属性が指定まで有効です。ノヾラメー タ DS は一度に複数指定できますが , 色の指定はそのうちでひとつにする必要があります。ロ s には次の値を用いますが , ふたつのどれかを指 定てきるものもあります。 DS 0 2 4 5 7 既定の属性 八イライト ( モノクロのみ ) ノヾーティカルライン アンダーライン プリンク リノヾース 8 シークレット 30 黒淡 ( 暗 ) 34 31 赤 35 紫 32 緑 36 水色 33 黄色 37 白濃 ( 明 ) 40 リバース黒 赤 42 黄色 43 44 紫 45 水色 46 白 47 モノクロ C 日 T 装置での色の指定は濃淡の指定として処理します。なお既定の属性に戻すには ESC [ m が最適です。 keyboa 「 d 「 eassignment キーの割り当てを変更します。 ESC [ に続く最初の 1 文字 ( 引用符 く例〉 ①、、 Q ″キーに、、 A ″を割り当てます。 ESC [ 81 : 65P 以後 , [Äキーを押すと , 、、 A " が入力されます。 ②、、 A " キーに文字列 D 旧とキャリッジリターンコードを割り当てます。 ESC 「 AD 旧 1 3 ロ 以後 , キーを押すと , D 旧と入力したのと同じになります。 ③①②で割り当てた文字 , 文字列をもとのキーコードに戻します。 ESC [ 81 P ESC 「 A ロ く注意〉 ・ Pn には , 川進数を指定します。指定できる範囲は以下のとおりです。 33 ( 21 H: 。に ) ~ 126 (7EH: 。ー " ) 、 刪 ()I H: 、、。″ ) ~ 223 (DFH: 冖 ) ・文字列は、引用符 ( い″または一 ) で囲みます。 ・ひとつのキーに割り当て可能な文字数は文字までてす。 ※ NEC 「 MS-DOS Ve 「 . 3. 3 マニュアル」より 8 「′ー 0 リ 0 0 し 1 ー・ CO Cu Cu Cu 0 し ESC [Ph: ・・・ :Pn ロ または ESC ["st 「 ing":p または ESC [Pn:"st 「 ing":Pn p , 2 番目以降の文字 ( または文字列 ) を割り当てます。 は除く ) に対応するキー 応用 c 言語 99
0 0 IJ ミックにロードすることもてきるようにな テムては , システムの立ち上げ後にダイナ ことが可能な構造になっている ( 新しいシス バイスのドライバを書き , それを組み込む ルのソースが手元にない場合ても新しいデ しかし , UNIX の入出力システムはカーネ 制限され , 外部からの情報が得にくかった。 ンスの関係からソースコードの情報公開は , 理解するには無理があった。また , ライセ 杯てソースを見ないかぎりは動作を十分に 度のものなのて、 , 概要を把握するのが精一 しかしこれらの文献はわずかに 10 ページ程 UNIX I/O System 』の 3 点のみてあった。 tem 』 , 「 UNIX lmplementation 』 , TThe た , 「 The UNIX Time Sharing Sys V6, V7 の時代のマニュアルに含まれてい やその動作について明記してある文献は , る。ひと昔前まて、は , カーネルの実現方法 さてやっかいなのがカーネルの部分て、あ の情報さえわかれば , なんとか実現てきる。 ス , すなわちシステムコール , サプルーチン 良 / 追加てある。 UNIX とのインタフェイ ちばん手軽なのが , コマンドレベルての改 能を追加することがてきるようになる。い ーザ自らシステムを改良したり , 新しい機 ソースが手に入ると何が起こるのか ? ュ 結べば入手てきる点も大きな特長て、ある。 たこれらのソースが , ライセンス契約さえ よって記述されている点があげられる。ま カーネルのほとんどすべての部分カ℃言語に UNIX の特長のひとっとして , コマンドや けて今日に至っている。 ールの集まり , などの特長が支持されつづ れたインプリメンテーション , 基本的なツ 加がなされたが , つねに移植性を考慮に入 の過程においては , 多くの改良や機能の追 は , たいへん珍しいことてある。その発展 ソフトウェアが利用されつづけるというの ータの世界て , こんなにも長い間ひとつの て、 20 年がすぎてしまった。コンヒ。ュ NIX という OS が誕生して , 早いもの 19 3 っている ) 。そこて、有用となってくるのが , 20 CMAGAZINE ・今月の書籍・ 『 LJN Ⅸディスドラヾ』 "WRITING A UNIX DEVICE DRIVER" UN Ⅸディス防伀 ー・、′を第、一第 1 第第を物を 書の目次を以下に記す。 年にアメリカて出版されたものて、ある。本 スドライバ』てあろう。本書の元本は 1988 まさに今回取り上げたのこの『 UNIX デバイ ・アスキー , 447 頁 , 3 , 910 円 ■ J 朝 ce 監修 : 中野浩一 / 大西照代共訳 •JANET l. EGAN/THOMAS J. TEIXE 旧 A 著 1 章 2 章 3 章 4 章 5 章 6 章 7 章 8 章 9 章 10 章 付録 A 付録 B 付録 C 付録 D UNIX と入出力サプシステム UNIX 入出力システム 入出力ハードウェアとデバイス ドライバ システム生成 実行時データ構造 デバイスドライバのロジック例 デバイスドライバ開発のための 手法 キャラクタ型とプロック型ドラ イバのテンプレート デバイスドライバの基本的要件 そのほかの事項 デバイスドライバ用へッダファ イルの概要 カーネル入出力サポートルーチ ン キャラクタ型ドライバのテンプ プロック型ドライバのテンプレ 付録 E XENIX 付録 F バークレ—UNIX との互換性 見してもわかるとおり , 巻頭から巻 末まて、すべてデバイスドライバの書 き方について記述されている。章の配置も 順番に読み進めばよいように適度に並べら れているのて、 , 行ったり来たりすることも なく読み通せる。 内容は , 基本的に MASSCOMP 社のシス テム上て、動く RTU という UNIX を前提とし ている。そのため , 各自のシステムて、試み るときには多少の応用が必要となるが , の類の書籍の性格上致しかたないことて、あ る。欲をいえばほかのマシン用のものも出 版してほしいといったところか。 結局デバイスドライバを書くには , 8 章て、 解説され , 付録 C と D て、示されているテンプ レートをもとにすればよい。このときは付 録 A と B も参考にする。さらにこの付録に は , XENIX, バークレー UNIX に関する内 容も含まれているのて、 , きわめて有用て、あ る。また付録 B は , カーネルを読もうとする 人にとっても有用て、あろう。 訳本としての本書の特長は , Juice という UNIX のユーザグループによって監修されて いる点があげられる。訳も平均水準を超え ているのて、 , 読み進むうえて、元本を参照し たくなるようなことはほとんどなかった。 きちんとしたドライバの実現は別として ( この点は書く人の実力次第て、ある ) , なん となくドライバが書けそうな気になるとい うのが読後の素直な感想だ。 さらに UNIX のカーネル全般について学習 したい方は , 次の 2 冊に進まれるとよい [fThe Design of the UNIX Operating System 』 , M. J. Bach , Prentice-Hall 『 The Design and lmplementation of the 4.3BSD UNIX Operating SystemJ , S. J . LeffIer, M. K. McKusick, M. J . Karels , J . S. Quarterman , Addis on-Wesley 井上尚司
EG 日本語 日本語変換 & 編集ライフラリ カナ漢字変換・日本語入力処理を、アプリケーションプログラム内で実現 / 【対応機種】 アプリケーションから、カナ漢字変換フロントエンドプロセッサを呼び出すインターフェースは、 >PC ー 98 シリーズ ( LT , 八イレソを除く ) いまだ統一されておらす、製品の異バージョンでの同一インターフェースにも保証はありません。 【対応 C 言語】 日本語処理をアプリケーションに取り込んでおけは、不必要な他ソフトの変更を追いかける事もな >Mic 「 osoft C ODtimizing くなります。 Compile 「 Ve 「 . 5.1 ( ラージメモリモテル対応 ) EG 日本語は、文章変換効率の良さですでに定評のあるマッキントッシュの " EGWo 「 d " ( 工ルゴ ソフト社製 ) カナ漢字変換部分を機能強化して作成された C 言語用ライプラリです。これまで日本 語処理をアプリケーションで実現しようとすると大変な労力を必要としましたか、このライプラリ を使用することによって、アプリケーションプログラム内で完全な日本語処理か可能です。ライプ ラリは、編集ライプラリと、変換ライプラリという 2 つの処理系を持ち、簡単なアプリケーション から、本格的な日本語ワードプロセッサまての幅広い開発をサポートします。 ■ EG 日本語の位置づけ fo 「 MS-C Ve 「 .5.1 価格¥ 98 , 000 日本語編集ライフラリ関数一覧 編集テキストの設定 SMSetText 編集テキストの取っ出し SMGetText カーソルのフリンク S M 旧 騙集テキスト定義 SMActivate 騙集テキストの未定義 SMDeactivate 文字の入力 SMKey 確定文字列の取り出し SMGetCry 文字列のカット SMCut 文字列のコピー SMCODY 0 文字列のペースト SMPaste 文字列の削除 SMDelete 文字列の挿入 SMlnse 「 t テキストの書き自し SMCJDdate テキストのスクロール SMSc 「 0Ⅱ カーソル ( 選択文字列 ) の設定 SMSetSeIect バラクラフの初期化 P 「 glnit ノヾラクラフ編集の開始 P 「 gNew パラクラフ騙集の終了 P 「 gEnd パラクラフへの文字の入力 P 「 gKey カーソルのフリンク P 「目 バラクラフの領域の書き百し P 「 gCJDdate パラクラフの高さを得る P 「 gHeight ・日本語変換機能 一日本語編集機能 アプリケーション・プロクラムが日本語ワードプ このライプラリは日本語テキストの編集機能を ロセッサ等、日本語の入出力の良否が製品の良 提供するものてあり、複雑な日本語処理もこの 否に影響するような場合には、この日本語変換 機能を使用することにより簡単に実現すること ライフラリを使用することにより、本格的な日本 ができます。 語処理が実現て、きます。 ・日本語編集機能を 使用した場合のア ・文阜変 ( 例 ) きようのてんきははれてす プリケーションプ ロクラムフロー 今日の天気は晴れてす 開始 日本語変換ライプラリ関数一覧 初明設定 EGCINIT 文章変癜 EGCTXCVT 文節変贋 EGCCLCVT ローマ字変 EGCRMCVT 半角変 EGCJACVT 全角変 EGCAUCVT シフト J ー S ・ J ー S 変贋 EGCSJCVT U ー S ・シフト J ー S 変換 EGCJSCVT 同音語学習 EGCLEA 日 N ユーサー辞書登録 EGCWDADD ユーサー辞書削除 EGCWDDEL 辞書の検索 EGCFIND 辞書の次検索 EGCNEXT 辞書の読み出し EGCKEAD メイン辞書作成開始 EGCCREATE メイン辞書作成書き出し EGCWRITE メイン辞書作成終了 EGCEOF メイン辞書作成 EGCNDIC 開始宣言 テキストの設定 文字の入力 SMNew SMSetTe xt K ey lnput SMKey 醫了 ? SMGetText SMDiSDOSe きようの一てんきは一はれてす mode = 0 S 「 c ( S 「 = 24 ハイト ) 今日の一てんきは一晴れてす length=?0 dst yeS dS テキストの取り出し 終了宣 0 0 seon fixl ・主なスペック 必要メモリ 256K 日以上 ( 使用するアプリケ - ションによ って異なります。 ) かな漢字変換自由文入力変換、文章一括変喚 漢数字変換 5 種類 入力モードローマ字ひらかな、カタカナ、ローマ字半角 カタカナ、ひらがなカタカナ、英数全角半角、半角カタカナ 入力文字の種類すべての文字を混在入力可能 文字種変換英数変換 ( ローマ字入力時のみ ) 、ひらがな 変換、カタカナ変換、全角変換、半角変喚 【お求め方法】当社製品は、ノヾソコンソフト取扱い店てお求めいたたけますが、弊社に直接こ注文の際は、 凵 FEBOAT INDEX 事業部 ( TEL : 03 ー 293 ー 3887 ) まてお問い合わせ下さい。 ・ Copyright N0tice * EG 日本語は株凵 FEBOAT と株工ルゴソフトとの提携製品です。 * ビタゴラスは、株凵 FEBOAT , AMS, lnc. と有京葉イ ンフォメーション・プロジェクトとの提携製品です。 * その他、プログラム名、システム名、 CPU 名は一般に各メーカーの ( 登録 ) 商標です。 * 価格、仕様は予告なく変史する場合があります。 一度に変換てきる最大文字数約 5 開文字 ( 全角ひらかな ) 変換てきる文字種全角ひらがな。文字種混在 ( の変 可能 文法解析ニ文節最長一致法、接頭語処理、接尾語処理、 活用語尾処理、数詞処理、助数詞処理、副詞処理、連体詞 処理、人名、地名処理 辞書の記数約 4 万 7 千語 ( 約 3 囲 K 八イト ) ユーザー登録語数約 1000 語 20K 八イト ( ユーティリティ の使用て約 30000 語 ) 再絅能な辞書付き 開発元工ルゴソフトにこ連絡・登録いただく だけて、無料て、辞書の再販が可能です。 株式会社 LIFEBOAT 〒圓ー東京都千代田区神田錦町 3 ー 6 PHONE : 03 ー 293 ー 47 Ⅱ囮 FAX : 03 ー 293 ー 47 田 ※価格に消費税は含まれておりません。
0 し か わ スタンタがを。 4 0 0 新世代言語 C + + をやさしく統合化 IDEA C + + ( イテア・シープラスプラス ) は、高機能フルスクリーンエテイタ、ソース レベルテノヾッガを備えた統合化 C + + インタープリタです。プロクラミングのプロセス ( ソースコードの作成・・・テノヾッグ ) を同一環境の中でスピーティに行えま魂また、ポッ プアップメニューによる快適な操作性、日本語によるエラーメッセージ、プログラムの 暴走を監視する機能など、初心者の方にも安心して使っていただけま魂 IDEA C + + は C 言語のインタープリタとしても利用できますので、 C 言語の学習か rl ロ EA C + + 」の主な特徴 ら始めて、そのまま使い慣れた環境の中で C + + にステップアップできま魂 C + + インタープリタ / ソースレベルテパッガ ・中間言語形式のインタープリタ ( C + + のソースファイルを中間言語にコンパイ ル / リンクし、その中間言語を翻訳実行します ) ー複数のソースファイルによるプログラムや、大規模なプログラム ( 10 , 側 0 ステップ IDEA C + + で開発したソースコードは、市販の C + + トランスレータや C + + ネイティ 程度 ) の開発が可能。 ・マイクロゾフコンパイラに準拠した約 3 の関数 ( 日本語処理関数 / グラフィ プコンノヾイラを用し、て、 EXE ファイルに変換できますので、本格的なプログラムの開 ック関数を含む ) 、 C + + の標準ライプラリ ( stream. h ・ complex. h. vector. h) を サポート 発ツールとしてもこ利用いただけます。 ■コンパイルエラーの発生した位置にカーソルを移動させる、タグジャンプ機能。 ・日本語によるコンパイルエラー / 警告の表示。 IDEA C + + 好評発売中 / ■バッケーシ内容■ ・必要なファイルだけを自動的にコンパイル / リンクする自動 MAKE 機能。 ・オンメモリによる高速なコンパイル / リンク ( 約 60g 行 / 分 ) 。 IDEA C + + システム本体 対応機種 NEC pc -98m シリーズ ( XA 、 LT を除く ) ・古い C ( K & R 、 ANSI 準拠 ) のインタープリタとして使用可能。 マニュアル 2 冊 EPSON PC -286 シリーズ •MIWA C 十 + トランスレータ、マイクロソフト C コンパイラに対応。 ユーサースマニュアノレ 動作環境 MS-DOS ve 「 . 2.11 以上 ・ C + + のソースレベルでのデバッグが可能。 C + + プログラミング ( 株日本ソフトパンク発行 ) メモリ 384K 八イト以上 ( フリーエリア ) ■変数の値を対話的に参照 / 変更できる云ータインスペクタ機能。 サンプルプログラム ■トレース、ステップ実行機能。最大 16 個設定できるプレイクポイント。 価格 29 田 00 円 ( 消費税込 ) ( 「 C + + プロクラミング」掲載の全ソースプログラム ) ・不正なメモリアクセス等を未然に検出する実行時ェラーチェック機能と、エラー を起こした位置へカーソルを移動させるタグジャンプ機能。 IDEA C + + EX 発売中 スクリーンエテイタ IDEA C + + EX ] ( イテアシープラスプラス・エクス ) はオプシェクトファイル形態で IDEA C + + を ・最大 12 内のファイルを編集可能なマルチファイル。 ・同時に 2 つのファイルをオープンできるデュアルウインドウ方式。 提供しますので、ユーサーか C + + やアセンプラで作成した関数をリンクし、これらの関数を呼び出すこと ・ポップアップ・メニューと、 2 ストローク・キー入力の両方式サポート。 かてきる独自のインタブリタを構築できま魂 YIDEA C + + EX は、自由に拡張できるので大規模なア ・クラスや関数に関する情報を対話式に調べることができるプラウザ機能。 プリケーション開発や使用目的に特化した一 DEA C + + の構築かできま 価格 178 , 000 円 ・行、文字列、箱型のカット & ペースト。 ■各カットバッフアの編集、プリント出力機能。 ■異なるファイル間移動もできるタグジャンプ機能。 三光金属株式会社シード事業部〒 578 東大阪市菱江 707 ・キー割付のカスタマイス・可能。 TEL 0729- -3795 代 FAX 0729-64-4785 お問い合わせ・お申し込み TEL 0729-65-7225 ( 直 ) ・ ATOK 等の各種日本語 FP 対応。 や改良のため予告なく仕様およびテサイン等を変更することがあります。 MS-DOS 、マイクロソフト C コンヾイラは米国マイクロソフト社の登録商標てす。 や ATOK は株シャストシステムの登録商標てす。※ M ー WA C + + はミワシステムズコンサルティンク社の製品てす。 : いおす、れ これから C をはしめる人に プロフェッショナルな開発ツールとして sanko SEED
ートと呼ばれます。このテンプレートは , テキストエデイタにより細部を修正して使 用します。 くアイコンエデイタ > アイコンエデイタは , PM アプリケーショ ンをミニマイズしたときに , それをシンボ、 ライズして表示するためのアイコン , マウ スのポインタて、あるカーソル , あるいはそ れに準ずるポインティングデバイス , そし てディスプレイ上の一部 ( 99X99 まて、 ) の メモリイメージて、あるビットマップデータ のおのおのをビクセルごとに編集します。 保存されるファイルはアイコンが * . ico, カーソルが * . ptr , ビットマップカす * . bmp という拡張子をもったファイルに保存され ます。 くフォントエデイタ > フォントとはデザインとサイズの統一さ れたひとそろいの文字セットのことて、す。 システムはあらかじめシステムフォントと 呼ばれるフォントをもっていますがオリジ ナルフォントを作成するときにフォント工 デイタを使用します。保存されるファイル には * . fon の拡張子がつけられます。 くリソース記述ファイル > リソーススクリプトファイルとも表記さ れますが , リソース記述ファイルと同意て、 す。このファイルは ASCII 形式のテキストフ ァイルてすから , テキストエデイタて、の編 集が可能て、す。テキストのみて、記述するア クセラレータキー , メニューテンプレート などはここて、定義て、きます。アクセラレー タキーとはいわゆるショートカットキーの ことて、 , キーポードインタフェイスを重視 するユーザのためにメニューをまったくア クセスすることなくメニューの選択項目に 到達するようにしたキーをさします。また アイコン , ビットマップなどのバイナリデ ータ形式のリソースを使用する場合 , リソ ース記述ファイルにリソース定義文を用い て記述します。 くリソースコンパイラ > リソース記述ファイル * . rc もそのまま て、は実行形式ファイルにバインドすること 48 CMAGAZINE 19 3 Fig. 3 コーティングの流れ *. def *. dlg *. bmD MS-C Ve 「 . *. ObJ 5.1 segmen executable linke 「 (no *. exe 「 esou 「 ce) はて、きませんのて、 , リソースコンパイラ (RC. EXE) を使ってコンパイルします。コ ンパイルすることによって出力されるファ イルは * っ . res の拡張子をもっバイナリ形式 のファイルて、 , これをもう一度 RC. EXE を 使って * . exe ファイルにバインドさせます。 RC. EXE はコマンドラインに対して与える オプションとファイル名により , 次の 3 とお りの方法て、使用します。 ( 1 ) RC * . rc * . exe ( 2 ) RC -r* . rc * . exe ( 3 ) RC * . res * . exe ( 1 ) はリソース記述ファイルをコンパイル し実行形式ファイルに付加します。 ( 2 ) はリ ソース記述ファイルのコンパイルだけを行 いバイナリ形式のリソースファイル ( * . res) を出力します。 ( 3 ) は ( 2 ) によって出力された リソースファイルを実行形式ファイルに付 List 1 smp 加します。 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : 1 1 : smp. Obj : snp smp. h snp. c cl /Zi. /0d -c -G2sw -W3 smp. c snp snp. h smp. rc snp. res : rc - 「 snp s 叩・ 0bj s 叩 . def snp. exe : link /co s 叩 . / A : 16. 間し rc snp snp. exe: rC snp S np. res 0S2 を sm P *. exe ( 「 esou 「 ce binded) くメイクファイルによる実行形式ファイル の作成 > , こまて、ツールによるリソースを中心に 数種類のファイルの扱いについて説明して きましたが , それらを実行形式ファイルに するためには数回のコンパイル / リンクを必 要とします。これを効率よく行うのがメイ クューティリティて、 , MAKE. EXE に評価 させるためのファイルがメイクファイルて、 す。メイクファイルは通常拡張子をつけず , ソースファイル名と同じにします。メイク ファイルは入力ファイルと前回の出力ファ イルのタイムスタンプを比較し , 今回の入 力が新しければ次に記されたコマンドライ ンを実行します。実際の例としてスケルト ンをコンパイルするメイクファイル、、 SMP" を説明します (List1)0 まずコマンドラインから、、 make smp" と 入力することて、 MAKE. EXE を起動しま す。メイクファイルのファイル評価ライン の先頭に SMP 自身がきていますが , これは コンパイルオプションなどの変更て、作成さ れる実行ファイルの内容が変わることに由 来します。メイクはソースとヘッダファイ ルを評価しコンパイルだけを行います。オ プションはデノヾッグのために , ソ Zi デノヾッ グコードを付加〃 , ソ Od 最適化禁止ク、、一 c コンパイルのみ実行ク , 80286 「 esou 「 ce compile 「日 C. EXE 日 C. EXE