EMS - みる会図書館


検索対象: 月刊 C MAGAZINE 1993年8月号
15件見つかりました。

1. 月刊 C MAGAZINE 1993年8月号

あなたの使用してし 特集 、るコンヒュー ⑧物理ページに読み書きすることによりプ ログラムを実行するにれが目的だ ) ⑨ EMS メモリの使用を終えたら確保してい 巧ーのときはエラー番号を表示 * / 工ラーのときはエラー番号を表示 * / 6 : 7 : / * 1 へ。ーシ・確保 8 : 9 : た EMS メモリを解放する ・ EMM の常駐確認 List 28 3 : 4 : 6 : 7 : 8 : 9 : List 29 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : List 30 3 : 6 : 7 : 8 : 9 : List まず , if (regs. h. ah ! = の int86 ( 0X67 , &regs, &regs); regs. h. ah ニ 0X46 ; / * EMM の常駐確認が終了済みであること * / union REGS regs; t ma i n (v 0 i d ) EMM バージョンチェック else regs. h. (h) : : %02XhYn ” printf(" 工ラー regs. h. 引 printf("EMM ハ・一シ・ヨン : %d. %d\n ” > 〉 4 , regs. h. 引 & 0X07 ) : return 0 ; int main(void) ページフレームアドレスの取得 if (regs. h. ah ! : の int86 ( 0X67 , &regs, &regs); regs. h. ah = 0X41 : / * EMM の常駐確認が終了済みであること * / union REGS regs; printf ( " へ。ーシ・フいムセク・メント : %04XhYn", else printf("15- : %02XhYn", regs. h. (h); / * 工ラーのときは巧一番号を表示 * / regs. x. (x) : return 0 ; int main(void) 未アロケートページ数の取得 union REGS regs; if (regs. h. ah ! ニの int86 ( 0X67 , &regs, &regs) : regs. h. ah ニ 0X42 : / * EMM の常駐確認が終了済みであること * / 3 : 5 : printf()l ラ - : %02XhYn ” se { printf(" 総ページ数 : %d\n" printf(" 空ページ数 : %dYn" return 0 ; regs. X. regs. X. 論理ページの確保 i n t ma i n ()o i d) union REGS regs; / * EMM の常駐確認が終了済みであること * / regs. h. ah : 0X43 : regs. X. bx int86 ( 0X67 , &regs, &regs) ; if (regs. h. ah ! : の printf("lä- : X02XhYn ” e ー se printf("EMM ハンドル番号 return 0 ; dx); bx); regs. h. (h); / * 工ラ - のときは巧 - 番号を表示 * / : %dYn ” regs. X. (x) : 実践 C テクニカルファイル タに EMM ドライバが登録されているかチェ ックする必要がある。 EMM ドライバが登録 されていなければ , これから説明する EMM ファンクションはまったく使うことがて、き EMM ドライバの確認にはふたつの方法が ある。ひとつは、、 EMMXXXXO" という名前 て、ファイルをオープンしてみる方法 , もう ひとつは割り込みべクタ番号から常駐して いると思われるアドレスの、、 EMMXXXXO" という文字列を確認する方法て、ある。例と してふたつの方法て、 EMM の常駐確認をする プログラムを示す (List 26 ) 。 ・ EMM ステータスチェック ( List 27 ) EMM ドライバの常駐が無事確認て、きた ら , 次は EMS メモリが使用て、きるかを EM M ファンクション 1 て、確認する必要がある。 EMM ドライバが常駐しているからといっ て , EMS メモリが正常に使用て、きるとはか ぎらない。 EMS のハードウェアやソフトウ ェアが使用て、きるかを EMM ドライバに間い 合わせることて、確認する。 ・ EMM バージョンチェック ( List 28 ) EMM ファンクション 7 て、 EMM ドライバの バージョンを取得して確認する。現在て、は ほとんどが Ver. 4.0 というドライバなのて、 , このチェックは少し虚しく感じる。 ・ページフレームアドレスの取得 ( List 29 ) EMM ページフレームのセグメントアドレ スを取得する。確保した EMS メモリはこの セグメントアドレスから使用て、きる。 ・未アロケートページ数の取得 ( List 30 ) EMM ファンクション 3 て、 EMS メモリの論 理ページの総数と , 空いているべージ数を 取得する。 ・論理ページの確保 ( List 31 ) ファンクション 4 て、確保したいページ数を EMS メモリに割り当てる。 EMM は割り当 てに成功すれば EMM ハンドルというファイ ルハンドルのような値を返す。以後はこの ハンドルを用いて EMS メモリの読み書きを する。 ・論理ページの物理ページへの割り当て EMS メモリが確保て、きたら EMM ファン クション 5 を使用して論理ページを物理ペー 特集実践 C テクニカルファイル VoI. ー 71

2. 月刊 C MAGAZINE 1993年8月号

ジに割り当てる。これて、やっと EMS メモリ に読み書きすることがて、きる。 ・論理べージの解放 EMS メモリを使い終わったら EMM ファ ンクション 4 て、解放しなくてはならない。あ なたのプログラムが使用した論理ページを 解放しないて、終了してしまったら , その論 理ページはほかのプログラムから使用て、き なくなってしまう。 List 32 EMS を使用した簡単なメモリ確保関数 1 : # i nc lude く s td i 0. h> 2 : # i ncl ude く s td ⅱ b. h> 3 : #include く string. h> 4 : #include く dos. h> 5 : 6 : static struct { 7 : unsigned int unsigned short pageframe; 8 : 9 : unsigned i nt lock; 10 : } emsinf ニ { 0 , 0 , 0 } : int EMSInit(void) 12 : union REGS regs; unsigned Char far *p; if (emsinf. init) / * 既に初期化済 * / return 0 : P = (unsigned char far*)-dos-getvect(0x67) ; P : (unsigned char far*)MK-FP(FP-SEG(p), 20 : 10 ) : if (-fstrncmp((char far*)p, (char far*) "EMMXXXXO", 8 ) ) / * EMM ト・ライハ・が組込まれていない 22 : return 23 : regs. h. ah = 0X40 : 24 : / * EMM ステ - タスチェック int86 ( 0X67 , 25 : &regs, &regs) ; if (regs. h. ah ! = の 26 : 27 : return 28 : 29 : regs. h. ah ニ 0X46 : / * EM Ⅲ「一ジョンチェック int86 ( 0X67 , &regs, &regs) : 30 : if (regs. h. ah ! ニ 0 Ⅱ (regs. h. > 〉 4 ) く 4 ) / * ハ・一シ・ヨン 4 未満は巧ー 32 : return 33 : regs. h. ah = 0X41 : / * EMMA,O ーシ・フレームアト・レス取得 34 : int86 ( 0X67 , &regs, &regs) : 35 : if (regs. h. ah ! : 0 ) 36 : 37 : ー 1 : return emsinf. pageframe ニ regs. X. bx; 38 : 39 : regs. h. ah = 0X42 : 40 : int86 ( 0X67 , &regs, &regs) : if (regs. h. ah ! ニ 0 ) 42 : 43 : return -1 : 44 : 45 : emsinf. init 46 : emsinf.lock ニ 0 ; 47 : bx , return regs. X. 49 : int EMSAlloc(size-t size) 50 : 52 : int pa ge : REGS regs : 53 : union 54 : i f (ems i nf. i n i t ! : の { / * 初期化されていないか ? 55 : / * 16K ニ 0X4000 56 : page = (size > > 14 ) + ((size & 0x3fff) ? 1 ・ / * へ。ーシ・数に換算 57 : 58 : regs. h. ah = 0X43 ; 59 : regs. X. bX page; int86 ( 0X67 , &regs, &regs) : 60 : if (regs. h. ah ! : 0 ) 62 . return 0 : 63 : 64 : return regs. X. dx; 66 . 67 : void far* EMSLock(int handle) 68 : { 69 : int l, pages : REGS UIIIOII regs : 72 : if (emsinf. : 0 Ⅱ ems i nf.l oc k ! : の (void far*)NULL; 73 : / * 初期化が済んでいないかロック中 * / return 74 : 75 : / * ハンドルに割り当てられているヘ。ーシ・数取得 * / regs. h. ah ニ 0x4c : 76 : regs. X. dX : handle; int86 ( 0X67 , 77 : &regs, &regs) : 78 : if (regs. h. ah ! : の 79 : (void far*)NULL; return 80 : pages ー regs. x. bx; if (pages > 4 ) 83 : return (void far*)NUL い 84 : 85 : for (i : 0 : i く pages ; i 十十 ) { 、ノ 々′ーム。 レし「 / フ・ [ 例題 27 ] EMS を使用した簡単な メモリ確保関数 EMS メモリを malloc ( ) のように気軽に使 える関数を考えてみよう (List 32 ) 。 EMS メモリは通常メモリと違って , IM バ イト , 2M バイトは当たり前 ( たぶん ) の世界 、 0 しかしいざ使うとなるとページフレー ムという窓枠に頭を悩ませることになる。 アクセスて、きる EMS メモリはページフレー ムから見えている部分だけなのて、 , そのほ かの部分を読み書きするときは EMM ファン クション 5 を使ってべージフレームに割り当 てる必要がある。すて、にお気づきだろうが , 同時に使用したい複数の論理ページが物理 ページに割り当てられない場合 , めんどう なことになる。 そこて、 , 簡単にするため一度に確保て、き る EMS メモリを 64K バイト以下 , 物理ペー ジに割り当てることのて、きるハンドルをひ とつだけという思い切った仕様にする ( 対応 する EMM ドライバのバーションは 4.0 ) 。 こて、作成する関数を TabIe 4 に示す。 / * へ。ーシ・フレームアドレスを保存 * / / * 空きへ。ーシ・数を取得 / * EMM システム初期化完了 / * ロック中のハンドルなし / * 空いているヘ。 - シ・数 / * 確保できない / * ハンドル番号 関数の説明 ・ EMSlnit( ) [ 例題 26 ] て、説明した , ① EMM の常駐確認 ② EMM ステータスチェック ③ノヾーションの確認 ④ページフレームセグメントアドレスの取 得 ⑤空き論理ページ数の取得 を行う。 EMM の常駐確認て、は割り込みべクタ番号 72 C MAGAZINE 1993 8 / * へ。ージフレームより大きい

3. 月刊 C MAGAZINE 1993年8月号

[ 例題 26 ] EMM ファンクションを 使用する 48 : } EMS メモリを利用するには , EMM ドラ イバが必要になる。 EMM ドライバは , MS ー DOS のデバイスドライバとして , 起動時に 組み込まなければならない。 PC ー 9801 系の場 合 CONFIG. SYS に次のような行があれば組 List 26 EMM の常駐を確認するプログラム例 に 6 : 8 : 10 : 12 : 15 : 18 : 22 : 23 : 24 : 25 : 26 : 28 : 29 : 30 : 32 : 33 : 34 : 35 : 36 : 37 : 38 : 39 : 40 : 42 : 43 : 44 : 45 : 46 : 47 : 49 : 50 : 52 : 53 : 55 : 56 : 57 : 58 : 59 : 60 : 61 : 62 : if (_fstrncmp((char far*)p, (char far*)"EMMXXXX0", 8 ) ) 19 : / * ファイルをオープンして常駐確認する * / return 0 : return ー 1 : / * EMM ドライハ・が組込まれていない P 10 ) ; ニ (uns igned char far*) MK-FP(FP-SEG(P), ー (unsigned char far*)-dos-getvect(0x67) ; if ((handle ニ叩 en("EMMXXXX0", O-RDONLY)) = un ion REGS regs : handle : 20 : chk_emm2 (void) 1 : #include く stdiO. h> 2 : #include く string. h> 3 : #include く fcntl.h 〉 4 : # i ncl ude く i 0. h 〉 5 : #include く d0S. h 〉 7 : / * 割り込みべクタから常駐確認する chk-emml(void) far *p : unsi gned Char み込まれている。 70 C MAGAZINE 1993 8 グラムから使用て、きるようにする ⑦論理ページを物理ページに割り当てプロ 使用て、きるように確保する ⑥必要とする論理ページをプログラムから 量が EMS メモリにあるかを確認する ⑤プログラムて、必要となるだけのメモリ容 ④ページフレームのアドレスを求める ③ EMM ドライバのバーションを確認する する ードウェアが正常に動作しているか確認 ② EMM ドライバや , メモリボ、一ドなどのハ ① EMM ドライバが常駐しているか確認する 次の手続きが必要になる。 EMS メモリを使用するプログラムて、は , に対し , int86x ( ) は与・えることがて、きる点 セグメントレジスタの値を与えられないの int86( ) と int86x( ) との違いは , int86( ) は int86x ( ) といった関数が用意されている。 ェア割り込みを実行するために , int86 ( ) , MS ー DOS の処理系て、は C 言語からソフトウ り込みの INT 67h を使用する。 タに必要な値をセットしてソフトウェア割 ファンクションを実行するには , レジス することがて、きるようになる。 び出すことにより , EMS メモリを読み書き 用意されている各種のファンクションを呼 使用することはて、きない。 EMM ドライバに 管理されているのて、 , ドライバを無視して EMS メモリは , EMM ドライバによって 場合は上記のファイル名と異なるだろう。 に付属している EMM ドライバもあり , その ドバーティー製のメモリポードなど EMM386. SYS DEVICE EMMDRV. SYS または , DEV ℃ E / * オーフ。ンできないので EMM ト・ライハ・が組込まれていない * / return ー 1 : * これだけでは本当のファイルと見分けが付かないので * DOS ファンクション 44h IOCTRL を使用してファイルかデハ・イス * かを見分ける。 regs. x. ax = 0X4400 ; regs. X. bX = handle : intdos(&regs, &regs) : if (regs. x. cflag Ⅱ close(handle) : return ー 1 : regs. x. ax = 0X4407 : regs. x. bx = handle; intdos (&regs. &regs) : if (regs.x. cflag Ⅱ regs. h. ! : 0xff) { close(handle); return ー 1 : close(handle); return 0 : int main(void) if (chk-emml() く 0 ) { / * サフ・ファンクション 00h テ・ハ、、イステ・一タの取得 * / ! (regs. x. dx & 0X80 ) ) { / * " EMMXXXXO " がファイルならエラー / * サフ・ファンクション 07h 出力ステータスのチェック puts(" 工ラ - : ファイルのオープンでは確認できません . " ) : if (chk-emm2() く 0 ) { puts ( " 割り込みべクタで確認成功 . " ) : return ー 1 : puts(" 工ラー : 割り込みべクタでは確認できません . ' ' ) : puts ( " ファイルのオープンで確認成功 . " ) : return ー 1 : List return 0 : int main(void) EMM ステータスチェック 3 : 5 : 6 : 7 : 8 : 9 : 10 : un ion REGS regs; / * EMM の常駐確認が終了済みであること * / regs. h. ah = 0X40 : int86 ( 0X67 , &regs, &regs) : if (regs. h. ah ! : 0 ) printf("EMM は使用できません。 else 工ラ - return 0 : printf("EMM は使用できます。 }n"); : %02XhYn ” regs. h. (h) :

4. 月刊 C MAGAZINE 1993年8月号

特集実践 C テクニカルファイル 成する (List 33 ) 。 PC ー 9801 系の場合 , グラ フィックデータを保存するのに必要なメモ リ容量は 128K バイトにもなる。 [ 例題 27 ] て、 作成した関数て、は , 一度に 64K バイトまて、し か確保することがてきなかった。そこて、 128 K バイトを 4 回に分けてセープ , ロードする ことにする。 この関数の動作を確認するためには , Li st 34 のようなプログラムを書けば確認て、き PC ー 9801 系て、は VRAM とページフレーム が同じアドレスになっていることがある。 [ 例題 28 ] の関数はこのときの状態を考えて いないが , EMM ファンクション 31 ( ペー ジフレーム用ノヾンクステータスの取得と設 定 ) を使用して対応することがて、きる。 List 33 -8 0 11 ワ】り -4 -0 叮ー 8 0 1 よワ 0 int far *src : unsigned Char for (i = 0 : i く PLANE-NUM; i + + ) { if ((src = (unsigned char far*)EMSLock(handle[i])) ニ NULL) { for (i = 0 : i く PLANE-NUM; i + + ) EMSFree(handIe[i]) : / * 工ラーのときは EMS を解放 * / return ー 1 : memcpy (vram[ i], src, PLANE-SIZE) ; EMSUnlock(handIe[i]) : EMSFree(handle[i]) : return 0 : List 34 List 33 の関数の動作を確認する i n t ma i n ()o i d) if (EMSInit() くの { 3 : puts ( " EMS が使用できません . " ) : 4 : return ー 1 ; 8 : 9 : 16 : 17 : 19 : 20 : TabIe 4 EMS を使用した簡単なメモリ確保関数 関数名 EMSInit() EMS の初期化 EMSAIIoc( ) EMS メモリの確保 EMSLock( ) 確保した EMS メモリのページフレームへの割り当て EMSUnIock() ページフレームへ割り当てた EMS メモリの割り当て解放 EMSFree( ) 確保した EMS メモリの解放 拡張していただきたい。 16K バイト未満のサ を解放することは意味があると思う。引数 イズを確保したい場合は , プログラムを書 はハンドルて、ロック解除に成功した場合は く人がページ内のメモリを管理すればよい ハンドル番号を , 失敗した場合は 0 を返す。 複数ハンドルを割り当てたい場合は , EMM ・ EMSFree( ) この関数は [ 例題 26 〕て、説明した「⑨論理 ファンクションを駆使すれば ( そんな大げさ ページの解放」を行う。この関数を呼び出す なものて、はないが ) 可能だ。 ことによりハンドルに割り当てられた EMS EMM ドライバの Ver. 4.0 には 50 種類ほど メモリは完全に解放される。引数はハンド のファンクションが用意されている。今回 ルて、解放に成功した場合は 0 を , 失敗した場 説明しなかったファンクションを使用すれ ば , もっと立派な関数がて、きるはずなのて、 合は 0 以外の値を返す。 チャレンジしてみてほしい こて、説明した関数は , あまりにも低機 能て、単純だった。だいたい数十バイト確保 したいのに 16K バイトも確保されてしまう し , 一度にひとつのハンドルしかべーシフ [ 例題 27 ] て、作成した関数を使用して , グ レームに割り当てられない。「もう少しまし ラフィック画面のセープ , ロード関数を作 な関数に」とお思いになった方は , どんどん 74 C MAGAZINE 1993 8 / * ここでグラフィック画面に絵や図形を描いておく * / getch() : / * キ - が押されるまで待っ * / save-vram(handle) : / * VRAH を EMS へ保存 * / / * ここでグラフィック画面をクリアする * / getch(); / * キーが押されるまで待っ * / / * EMS から VRAM へ復帰 * / load-vram(handle) : return 0 ; [ 参考文献 ] [ 1 ] TMS-DOS 3.3 プログラマーズリファレ ンスマニュアル』 , 日本電気 [ 幻マイクロソフトプレス編 , 「 MS ー DOS 工 ンサイクロペディア VOLUMEI 』 , アス キー出版局 [ 3 ] 中島信行 , TMS-DOS メモリ管理ソフト 技法』 , CQ 出版社 [ 4 ] 川上峻史 , ℃言語と拡張メモリ』 , 工学 図書 [ 5 ] 上田哲二 , 「ワンポイントプログラミン グ講座 EM S メモリを使用する ( 1 ) , ( 3 ) 」 , ℃ MAGAZINE 』 1990 年 9 月号 , 10 月号 , 1991 年 1 月号 機能 サンプルプログラムの著作権について 本特集に掲載 , および付録ディスクに収 録したサンプルプログラムは , 筆者の意 向により Public Domain 扱いとします。し たがって , 営利・非営利目的の如何を問 わす , 本特集のサンフ - ルプログラムの使 用 , 改造 , 配付は自由です。ただし , サ ンプルフ・ログラムの運用にあたって生じ た障害について筆者 , 小誌は責任を負う ものではありません。自己の責任の下に 運用してください。 [ 例題 28 ] グラフィック画面の セープとロード

5. 月刊 C MAGAZINE 1993年8月号

LiSt 32 96 : } / * 物理へ。ーシ・ヘの割り当て 86 : 87 : 88 : 89 : 90 : 93 : 95 : 98 : 100 : 101 : 102 : 103 : 104 : 105 : } 106 : 107 : 108 : 109 : 1 10 : 1 12 : 1 13 : regs. h. ah = 0X44 : regs. X. dx : handle; regs. れ . regs. x. bx int86 ( 0X67 , &regs, &regs) : emsinf.lock = handle; return (void far*)NULL; if (regs. h. ah ! : の return ()O id far*) ((unsigned long)emsinf. pageframe くく 16 ) : int EMSUnlock(int handle) emsinf.lock return handle; if (emsinf. init & & emsinf.lock = handle) { return 0 : / * EMS 未初期化また h ロック中のハント・ルでない int EMSFree(int handle) union REGS regs : List 33 if (emsinf. init ! = 0 & & emsinf.lock ! ニ handle) { / * 未初期化かロック中のハンドルは解放できない return ー 1 ; return regs. int86 ( 0X67 を regs. X. dX = handle; regs. h. ah = 0X45 ; h. ah : &regs, &regs) : メモリ確保関数を使用して作成したグラフィック画面のセープ , ロード関数 3 : 5 : 6 : 7 : 8 : 9 : 14 : 15 : 20 : 22 . 23 : 26 : 27 : 28 : 30 : 33 : 38 : 39 : 40 : 45 : 46 : 1 : # i ncl ude く std i 0. h> 2 : $include く stdlib. h> * ラージモデルでコンパイルしてください。 * 関数内で使用している memcpy() の far パージョンを使うようにすれば * スモールモデルでも動きます。 * 例 1 1 : #def i ne 12 : #define fmemcpy() memcpy() PLANE_SIZE PLANE_NUM 32 * 1024U 4 (Borland C + + Ver3. の / * PC98 フ・ラフィック VRAM フ。いン数 * / / * PC98 ク・ラフィック VRAM 1 フ。いンのサイス・ * / handIeCPLANE_NUM] ; int unsigned char int save-vram(int *handle) far *vram[PLANE-NUM] = { (unsi gned char far * ) 0Xa8000000 し (unsi gned char far * ) 0Xb0000000 し (unsigned char far * ) 0Xb8000000 し (unsigned char far * ) 0Xe0000000 い : int far *dst; unsigned Char for (i ニ 0 : i く PLANE-NUM; i + + ) { if ((handle[i] : EMSAlloc(PLANE-SIZE)) = 0 ) { if (i > の { EMSFree(handIeCi ] ) : return -1 : fo 「 (i : 0 : i く PLANE-NUH: i + + ) { / * 今まで確保した EMS を解放 / * 確保失敗 * / EMSUnlock(handIeCi]) : / * VRAM を 1 フ。レ - ンずつ北。 - memcpy(dst, vramCi], P し ANE-SIZE) : return -1 : / * 巧 - のときは EHS を解放 * / EMSFree(handIeCi]) : for (i : 0 ; i く PLANE-NUM; i + + ) : NUL し ) { if ((dst : (unsigned char far*)EMSLock(handleCi])) return 0 : int load_vram(int *handle) 特集実践 C テクニカルファイル から確認する方法を用いている。正常に EM M の初期化が終われば空き論理ページ数を 返す。 EMM ドライバが常駐していないな ど , 初期化に失敗した場合は一 1 を返す。 ・ EMSAIIoc( ) この関数は [ 例題 26 ] て、説明した「⑥ EM M の確保」を行う。引数には確保したいメ モリサイズをバイト数て、与える。関数内て、 は , 与えられたバイト数からページ数への 変換を行い EMM ファンクション 4 て℃ MS メ モリを確保する。確保に成功すればハンド ル番号 , 失敗すれば 0 を返す。 1 バイト確保するのにも 1 ページ ( 16K バイ ト ) を割り当ててしまうお茶目な関数て、あ ・ EMSLock( ) この関数は [ 例題 26 ] て、説明した「⑦論理 ページの物理ページへの割り当て」を行う。 ただし , それだけて、は EMM ファンクション 特集実践 C テクニカルファイル V コ 73 数を使用して ) ページフレームへの割り当て が , プログラムを書く人が明示的に ( この関 関数の内容を見ると呆れるような処理だ るようにする。 かのハンドルがペーシフレームを使用てき L 。 ck ( ) 関数てロックした状態を解除し , ほ クションをひとつも使わない関数だ。 EMS この関数は [ 例題 26 ] て説明したファン ・ EMSUnIock( ) 得することがて、きる。 ンドルに割り当てられているべージ数を取 ァンクション 13 て、ハンドル番号からそのハ い EMM ファンクションを使用している。フ この関数て、は [ 例題 26 ] て説明していな NULL ポインタを返す。 を返す。ほかのハンドルが使用中て、あれば フレームを使用していなければ far ポインタ ドル番号を渡す。ほかのハンドルがページ 引数には , EMSAIIoc( ) 関数て得たハン になっている。 る関数 ( 次て、説明する ) を呼び出すまて有効 るための機構だ。ロックはロックを解除す リをほかの処理から確保されないようにす とはその名のとおり , 自分の確保したメモ ク機構をつけることにした。メモリロック を呼び出すだけなのて、超簡単なメモリロッ

6. 月刊 C MAGAZINE 1993年8月号

0 EMS メモリ 系ごとに自身を示す固有の定義済みマクロ 名が用意されているのて、 , # if の条件式は、、 d efined ( マクロ名 ) 〃とすればよい そのマクロ名が具体的に何かについては , 個々の処理系のマニュアルを参照すること になるが , 一般に処理系の名称 / 略称て、ある ことが多い TC/BC 十十て、は、、 TURBOC 〃 , QC て、 は、、 QC", LSI C て、は、、 LSI C" という具合て、 ある。 MS-C て、は , Ver. 6.0 以降から、、 MS C VER" というマクロ名が利用て、きるように なった。 Ver. 5.1 て、は残念ながら判定に使 用て、きるようなマクロ名はない。また , LS IC ー 86 て、は , 、、 LSI C" という識別子を、、 lcc" というコンフィギュレーションファイルの 中て、設定しているだけなのて、 , 厳密な意味 て、は定義済みマクロて、はない。ューザがイ ンストールの際に書き換えたらおしまいて、 ある。 さて , # if て、切り分ける場合 , 対応してい ない処理系はどう扱うのがよいだろうか。 また , MS-CVer. 5 . 1 のように判定て、きな いような処理系はどうしたらよいだろうか。 「何も対策は考えない。なるようになる」と いうのもひとつの方法て、はある。 しかし , それて、はあまりに不親切て、ある から , せめてエラーを発生させてコンパイ ルが失敗するようにしておこう。 MS-C V List 特集は践 C テクー 処理系を見分けるためのマクロ例 defined(__TURBOC__) .. TC / BC + + 用のコード、 ーカルファイル 3 : #elif defined(LSI_C) .. LSI C ー 86 用のコード . 5 : #elif defined(_MSC_VER) Ⅱ defined(_QC) .. MS ー C , QC 用のコード . 7 : # 引 se 6 : 4 : 9 : # error "MS-C v5. 1 以前の場合は -D-MSC-VER でコンパイルしてください . 8 : # error " このソースは TC/BC + + , LSI C ー 86 , MS-C, QC にのみ対応しています . 10 : #endif er. 5.1 のように判定て、きないものは , 適当 なマクロ名を決めて , それを定義するよう にとのエラーメッセージを出しておこう (L ist 25 ) 。 工ラーメッセージを出すには List 25 の例 のように # error を使用するのがよい。 ANS I C 規格に準拠した処理系て、は # error をサポ ートしていないものが多いが , その場合は サポートしていない旨のエラーとなるだろ うから , メッセージ表示は無理だとしても , 工ラー停止させることはて、きるだろう。 困るのは , 中途半端にサポートされてい る場合だ。 Turbo C Ver. 2.0 日本語版ては , #error は受け付けるが日本語対応がされておらず , メッセージ文字列中の漢字やカナが文字化 けしてしまう (Turbo C 十十 Ver. 1 . 0 以降 の日本語版は問題がない ) 。 そのような処理系を対象としている場合 は , メッセージ文字列は英語にすべきだろ [ 1 ] assert( ) の呼び出しを ( ( v 。 id ) 0 ) へ置換 してしまうことて、実体消しを行っている。 ( ( v 。 id ) 0 ) は何もしない空コードを表現す る呪文のようなものて、ある。 [ 2 ] 正確には、、クて始まり次に大文字または 〃が続くすべての名前と , ファイルスコ ープをもつ、、〃て、始まる名前の 2 種類が予 約されている。したがって , 関数内部の 自動変数や構造体のメンバ名には、、 ab" の ような名前を使ってもよい が , この規 則は覚える必要はない。、、〃て、始まる名前 は書きづらいし読みづらいのだから無理 して使う必要はない。単純に「、、〃て、始ま る名前は予約済み」として使わない すればよい [ 注 ] 村上幸太郎 最近て、は , EMS メモリやプロテクトメモ リなど , 多くのメモリを必要とするアプリ ケーションが多い しかし , 個人て、アログラミングを楽しむ 人にとって , これらのメモリが必要となる 場面はあまり多くはないだろう。さらに今 後 MS-Windows が普及すれば , これらのメ モリを意識してプログラミングすることは ほとんどなくなるだろう。 とはいっても , 多くの人々が MS-Windo MS - Windows の普及か声高に叫は れているが , まだまだ当分 , EMS メモ リなどを意識したプログラミングは必 要とされるだろう。本章では EMS メモ リ利用の原則から EMS メモリ確保関 数を利用したグラフィック画面のセー を意識する必要はありそうだ。ここて、は EM け先になりそうなのて、 , 今しばらくメモリ ws 上て、プログラミングするのはもう少しだ プ・ロードまでをフォローした。 S メモリについて取りあげる。 特集実践 C テクニカルファイル VOI. ー 69

7. 月刊 C MAGAZINE 1993年8月号

られていますが , 実質的にはプロ グラムコードを含みません。 List 2 のアセンプラブログラムを使って , 空の DLL ファイルを作成します。 リソーススクリプト (. (C) の作成 構築するフォントライプラリフ ァイル (. FON) の中に , 作成したフ オントファイルが含まれるように リソーススクリプト (. (C) を記述 します (Fig. I) 。 モジュール定義ファイル (. DEF ) の 作成 モジュール定義ファイルは , フ オントライプラリファイルのため に Fig. 2 の形式て、記述してくださ こて、は , Fig. 3 のようなモジュ ール定義ファイルを使います。 プログラムをリンクし , フォント を追加 TLINK を使い ,Fig. 4 のコマン ドライン形式て、フォントライプラ リファイル (. FON) を作成してくだ さい。次に , リソースコンパイラ (RC. EXE) を使い , フォントライプ ラリファイル (. FON) に , フォント ファイル (. FNT) を結合します (F ig. 5 ) 。 これて、 , フォントリソースが含 まれる MYFONT. FON が作成さ れます。このフォントリソースを アプリケーションの中て、使用する ためには , AddFontResource とい う Windows API をご利用くださ なお , アプリケーションが特 定のフォントをロードしたときに は , 終了前に RemoveFontResour ce て、フォントを解放するようにし てください Q Resource Wo 「 kshop のダイ アログエデイタで自作のカスタム コントロールを使いたいのですが , どうすればよいでしようか。 A ダイアログエデイタて、 , cont r01 メニューから Custom ( ツールア イコンて、は右下にある鍵のアイコ ン ) を選択すれば希望するコントロ ール名を指定て、きます OBWCC(B orland Windows Custom Contro I) のようにツールアイコンに登録て、 きるカスタムコントロールを作成 する方法は , DOC ディレクトリの CUSTCNTL. RW に記載されてい ます。これによって , ダイアログ 工デイタの中からカスタムコント ロールの実際の動作を確認て、きま す。 ObjectWindows で TWindow から新しいクラスを派生していま す。 Sc 「 0 日 e 「メンパを使って , ウィ ンドウのスクロールを自動的に処 理しようとしていますが , うまく 動作していないようです。なぜで しようか。 A TWindow の派生クラスて、 , ク ライアント領域に描画するために メンバ関数 WMPaint を定義して いないて、しようか ? TWindow は , WM PAINT メ ッセージを処理するディスパッチ 関数として WMPaint 関数が定義 し , ScroIIer メンバの状態から表示 位置の原点をずらすようになって います。派生クラスて WMPaint を 再定義してしまうと TWindow の WMPaint メンバが呼び出されなく なり , ScroIIer が正しく処理されま せん。 クライアント領域への描画はて、 きるだけ Paint メンバを再定義する ようにしてください Q ダイアログボックスにエディ ットコントロールやボタンコント ロールを貼り付けています。とこ ろが , 工ディットコントロールで 入力中にリターンキーを押してし まうと , 国ボタンを押したもの と認識されてしまいダイアログボ ックスが閉じてしまいます。国 ボタンはデフォルトボタンにはし ていませんが , 工ディットコント ロールでリターンキーを押しても 無視するようにするにはどうすれ ばよいでしようか。 A ダイアログボックスにデフォ ルトボ、タンがないときて、も , 国 ボタン ( IDOK のコントロール ID を 持つボ、タン ) はそのボ、タンがデフォ ルトボ、タンになるようて、す。これ を避けるためには , ボタンコント ロールの ID として IDOK を使わない ようにするか , ダイアログボ、ツク スの外に仮のデフォルトボタンを 作ることがて、きます。 ボタンコントロール ID として ID OK を使わない場合は ,ObjectWin dows て、 IDOK を受け取る Ok メンバ 関数の代わりに別の関数を定義す る必要があります。 BWCC のビットマップボタンを 使っている場合は , ボタンの ID は決められているのて、この方法 は使えません。 ダイアログボックスの外にデフ ォルトボタンを作る場合は , たと えば Resource Workshop のダイア ログエデイタて、ダイアログボック スの領域外にボタンを貼り付けま す ( 工ラーにはなりません ) 。この ボタンをデフォルトボタンとし , Tab st 叩を外しておくことて、無意 味なデフォルトボタンを作成て、き ます。 ダイアログボ、ツクスの外に貼り 付けたボ、タンは実際には表示され ません。こうすれば , 工ディット コントロールて、リターンキーを押 しても見えないボタンが押される ことになるのて、国ボタンは押さ れたことにはなりません。 Q Windows アプリケーションで ほかのプログラムを呼び出すため には , どうすればよいでしようか。 Windows API の WinExec を 使ってください。 WinExec は , W indows アプリケーションて、ないプ ログラムも呼び出せます。 Q Turbo Debugger でリモート デパッグをしているときに , File ー Get info で EMS の大きさが表示さ れません。デパッガのために , EM S を搭載しているのですが使われて いないのでしようか。 A リモートデバッグの場合 , Tu rbO Debugger の File ー Get info て、 はデバッグする対象となる環境の EMS の状態が表示されます。した がって , ターゲットプログラムの あるマシンて、 EMS がサポートされ ていなければ , EMS の大きさは表 示されません。 Turbo Debugger は , EMS があればそれを使いま す。 lnformation from CompiIer Makers 163

8. 月刊 C MAGAZINE 1993年8月号

特集実践 C テクー ーカルファイル ①第・環境設定 ・ Turbo C Ver. 2.0 , Trubo C 十十 Ver. TabIe 1 INDEX 1 . 0 , Borland C 十十 Ver. 2.0 / 3.0 Part1 起動・環境設定 ・ Microsoft C Ver. 5.1 / 6.0 , Microsoft 例題 1 環境変数の変更 C/C 十十 Ver. 7.0 , QuickC Compiler V 」題 2 コマンドラインオプションを実行ファイルに反映 2 」題 3 set/longjmp によるコルーチン 3 er. 2 . 0 Part2 入出力 ・ LSI C ー 86 Ver. 3.30 Section 1 キーボード入力 本特集中のプログラムは , とくに断わり 例題 4 ・イレ旨トを無効にする がなければ , これらの処理系のいずれて、も 例題 5 ctrl 十 c を無視する 例題 6 のキー入力を得る 問題なく動作するはずて、あるが , 時間的な 例題 7 BAS ℃の INKEY$ のよーなキー入力関数を作る 例題 8 のキー入力関数を旨作る 制約から , 上記のすべてて、動作チェックを 例題 9 Ctrl 十 C 検査のセット・丿セット 例題 10 アンンヨンキーカーソルキー入力を得る 例題 1 1 FEP のオン・オフを制御する 行えなかったため , ひょっとしたら問題が Section 2 画面出力 生ずる場合があるかもしれない。そういう 例題 12 数値をカンマで区切って出力 場合は , 本誌上と NIFTY-Serve 「 C 言語フォ 例題 1 3 漢数字表示 例題 1 4 数値の 2 進数表示 ーラム ( FC ) 」の会議室において間題解決を図 Part3 マクロ関連 っていくつもりて、ある。 Section 1 マクロ 本特集中て、は , 処理系の名前を次のよう 例題 1 5 マクロ定義の定石 に略す。 例題 1 6 値の交換 例題 1 7 FP—OFF, FP ー SEG マクロは処理系間に微妙な差かある ・ Turbo C/C 十十 , Borland C 十十 例題 18 ホインタ操作マクロ 例題 19 配列要素数取り出し → TC/BC 十十 例題 20 構造体メンバのオフセット取得 例題 22 置品奇麕マクロによる p 。 in 廿デバッグ ・ Microsoft C → MS-C Section 2 マクロ以外のプリプロセス ・ QuickC → QC 例題 23 #ifdef によるニ重 include 対策 ・ LSI C ー 86 → LSI C 例題 24 コメントアウトの代わりに # if 0 を使う 例題 25 処理系を見分ける なお , QC は , ライプラリが MS-C と同一 Part4 EMS メモリ て、あるため , MS-C として述べていること 例題 26 EMM ファンクションを使用する は , QC にもそのままあてはまると考えてよ 例題 27 EMS を使用した簡単なメモリ確保関数 例題 28 グラフィック画面のセープとロード いだろう。 表 項 目 図 リスト 7 6 5 4 1 っ 4 3 2 4 5 CD 7 89 8 012 1 1 1 1 3 1 4 1 6 , 1 7,C 1 8 , 1 9 , 20 , 2 1 , 22 , 2 24 9 , 1 0 12 , 13 3 25 2627 28 , 29 , 30 , 31 32 ' 33 , 34 4 本章ではプログラムの起動や実行環境 に関するものを取り上げる。具体的に は環境変数の書き換え , 実行ファイル へのコマンドオプションの反映 , コル ーチンを容易に実現するサンプルプロ グラムを作成した。 ているが , これは必ずしも環境変数の実体 にも残されない を書き換えるわけて、はなく , 環境変数のコ また , もし仮に putenv ( ) て、自分のプロセ ヒ。ー領域を書き換えるにすぎない。つまり , スの環境変数実体を書き換えることがて、き 環境変数の読み出し操作を行う関数 seten putenv() により書き換えた結果は同じプロ たとしても同じ結果となる。なぜなら , プ v ( ) は標準 C て、定義されているが , その逆の グラムの実行中に getenv ( ) て、得られる結果 ロセスの環境変数領域は親プロセスの環境 書き換えを行う関数は定義されていない。 を変史することはて、きるが , そのプログラ 変数領域のコヒ。ーて、あり , 子プロセスて、の MS-C, TC/BC 十十などの処理系て、は , 処 ムが終了してしまい DOS プロンプトに落ち 環境変数の変更は親プロセスのそれには影 理系定義の関数として putenv( ) が用意され てしまうと , その変史は悲しいことにどこ 響しないからて、ある。たとえば , system ( ) 特集実践 C テクニカルファイル VOI. ー 45 [ 例題 1 ] 環境変数の変更

9. 月刊 C MAGAZINE 1993年8月号

MS-C 厖 70 ん′嬲「 080 ″ RQuickBASIC/MS-BASIC/Vi8ualBASIC/QuickC/MS-C 血ん田 ~ 1 は、入出力画面作成 / 帳票出力機能をはじめ、アプリケー ション開発に欠かすことのてきない様 々な関数を含んた多目的ライフラリて す。ん & ~ 1 の関数は、いす れも高機能でかっ操作性にも優れてお り、高度なアプリケーションの開発を 容易に行うことかてきます。しかもこ の強力なライフラリか、ライセンスフ リーて、提供されます。せひとも、ん 一 1 をアプリケーション開発に お役立てください。 QuickC 佐 / 20 曜 IB C 漑 & B C 洫たバ - DOS ーを 7 」 0 S ー C ルイ .5 EMS 対応 ハイレゾ対応 ハイレゾリューションモードにも対応しました。 C 言語では、これ までの 2 S に例を利用して作成されたプログラムが、そのままハ B S ー C プログラムについては B み C イレゾモードで実行可能です。 の処理系自体がハイレゾに対応している場合のみ有効です。 シリアルプリンタでもページプリンタ並みの使い勝手が可能な、画 期的な「べージ出力機能」を実現 ! 印字位置の上下とは無関係に 任意の順序で出力が可能です。罫線専用の印字関数を用意したほか 文字修飾も簡単に行えます。ま た、印字をせすに画面上で帳票 イメージを確認できるレイアウ ト機能も装備しています。ハー ドコピーも簡単。 対応機種 : PC-PR201,NM9900,NPDL, 折れ線グラフ等も簡単に作成可能Ⅱ LIPSIII によ ESC/P ESC/Page, 凵 PS II LIPSIII る出力 ) シリアルプリンタでも同様に出力可能 9 3 年 0 2 月 2 8 当月積費秋当月第高当月電物ー第物・ ( 、 ) 当月・質年第美上第第第費秋 人・合計 物月売上ー 物月高 ロ 4. ] し .2 ーれ . 4. 関 4 靆し ! 15. れ 0 ー物 . 材 ~ の l. ヨ ~ 関 1.4 5. .1 輸 442. ) 4 れ B4 用紙での横 180 桁出力例 ( PC - PR201 による出力 ) 各言語の統合環境に対応したヘルプファイルを用意しました。環境 内から 0 ん S “ e 劔のリファレンスを参照可能です。また、付属の常 駐型ユーティリティによりお手持ちのエデイタ等の実行中にヘルプ ファイルを表示することも可能です。 ライプラリを E M S 対応にしました。これにより B A S ー C の統合 環境 ( QB , QBX , VBDOS ) 上においても、大規模なプログラムの開発が可能に なります。また、実行形式のプログラムにおいてもライプラリを E M S 領域にロードできますので、この場合はさらに大きなプログラ ムを構築可能です。 注 ) EMS 対応のプロクラムを実行する場合は、ライプラリを EMS メモリにロードする 常駐プログラム "QSLOAD. EXE" を使用します。このプログラムについては、再販ラ イセンスが付属しておりません。再販ライセンスのこ提供については、別途ご相談下 プリンタ制御 データ入力 工ディット入力、文字・数値 データの入力、日付・時間の 入力、 1 文字の入力の 6 形態 入力の終了条件として通常の キーや特殊キー、マウスのク リックなどから豊富に指定で きるほか、日本語 FEP と連動 した入力も可能 ( FEP の軽頁を 自動認識 ) ー 1 第・数宿等グラフ ・ー 5 : 「 0 3 4 ・ P 「第一背第引 0 工ディットスカのサンプルー -1 声し , : トを・ : ト ー 3 0 上 S れ 工し : ・ . 引 ! を ( 、 9 第川 5 口 0 宿料 : 印ー E ツみルー第王 u 資い : 日工 3 れを ( 料 E を課第・博に・正い F 日第・・印 5. 5 、 工ディット入力関数を使えは、テキスト 工デイタの作成も簡単です 0000 ・第 ( 物 ) 山田第 、物訶 ウインドウ 1 度に 20 個までのウインドウ をオープン可能です。元の画 面の待避領域としては裏 V R A M ・ E M S ・・ファイルを選 択可能。ウインドウ内の消去 ・スクロール・背景色・枠の 色等を指定可。 このようなウインドウ対応の入力画面が簡単に作成できます。 第ート・ アドバイサ対応のオンラインマニュアル 4. 〔 : 万円 ディスク その他 画面出力、マウス制御、日付・時間の計算関数、リアルタイムでの 日付・時間の表示関数、グラフィック関数 ( C 版のみ ) など 100 を超 える関数を用意しました フロッビーディスクのフォーマット、 ファイル / ディスク単位での コビー、巨大ファイルの分割コビー、ファイル名の操作 ( 抜き出し、 正当性のチェック ) 、ディスクオフラインの検出、残り容量の取得 などが可能です。 対応言語として、次世代 BAS ℃の Mi “可 ~ ⑩防 $ 出 C forMS-DOS を追加、さらに様々な用途で活用できます。従来の BAS ℃によるフ。 ログラムも、そのまま VB に移行できますので VB の快な開発環境 での作業が可能になります。 価格 ( 消費橳リ ) ■ BASC 十 C 版 ■ C 版 ■ C 版 必、要システム ・ . 本イ本 : NEC PC -9800 シリ - ース ( 初代、 U 、 LT を除く ) ・ MS-DOS Verston 2 . ロ ~ 5 . 0 ・ソフトウェア : く BAS ℃版 - び ) 文寸石む言・言吾〉 QutckBASlC V4 . 5 、 MS-BASIC V7 . ー V1suaI BASIC fo 「 MS ・ DOS VI . 0 く C ・言言吾 . 版マ ) 文寸応、物・言吾 > MS-C ( V ・「 4 . 0 ~ 7 . 0 ) 、 QuckC (Ver 2 . 0 ) く資料請求番号 01 1 〉 \ 35 , 80 \ 25 , 08 \ 25 , ティスクの内容 ・ライフ - ラリ ・インクノレ・一 - ドファイノレ ・アド / ヾイ・サ・文寸石む′、ノレプファイ ) レ ・ EMS 文寸応、常男主フログラム ・コ - ー・一テ・イリ・テ・イ ・サンラノレプログラム V B 対応 S 0 es ー 開発・発売元 〒 115 東京都北区赤羽 1 丐 2 ー 16 田口ビル 7F TEL 03-3902 ー 1169 ( 代 ) FAX 03-3902 ー 1292 株式会社サンクエスト

10. 月刊 C MAGAZINE 1993年8月号

円 93 年 8 月田 ( 毎月一回田発行 ) 第 5 巻第 8 号通巻 47 号円 90 年 2 月 2 日第 3 種郵便物認可 sun Microsystems の戦路家 Peter Deutsch ( Ⅱ ) AUG. 1993 Vol. 5 No. 8 デザイン・持田哲 イラストレーション・秋山育 表紙 C 〇 NTENTS 巻頭インタヒュー COMPUTER LANGUAGE 提携記事 COMPUTER LANGUAGE 提携記事 特集 速報 djgcc 詳解講座 C 言語入門講座 C プログラマのための 痛快工ッセイ C 言語フォーラム 難問回答 X68k 活用講座 Programnung on Purpose 『 Neckties and deadbolts 』 p. J. Plauger 即戦力アップ ! フリーソフトウェア最新レポートく第 43 回 > pc ー 9801 用 Windows 3.1 登場野口雄平 Wake Up! You've Entered the Transition Zone ソフトウェアの価値はユーサの使いやすさで決まる l'd Like to Thank the Academy.. 1992 年 JOLT 賞の発表 大野元久・・ BorIand C 十十 & Application Frameworks 3 コ Part4 ・ EMS メモリ村上幸太郎 Part3 ・マクロ関連久野浩 Pa 「 t2 ・入出力久野浩 / 上原潤ニ Part1 ・起動・環境設定上原潤ニ 起動・環境 / 入出力 / マクロ関連 / EMS メモリ編 実践 C テクニカルファイル耻 1 H el lo G C C World く最終回 > djgcc の入手方法安田英之 丹羽信夫の迷走プログラミングくその 20 > 旗上げゲーム用メッセージ作成プログラム・・ lnformation from Compiler Makers シャープ / テック情報システム・ C マガ電脳クラブく第 29 回 > クイーンプロプレム・エンプレム吉柄責樹 lnformation from Compiler Makers 工ル・エス・アイジャノヾン / ライフボート フィンローダのあっぱれこ意見番く第 1 6 回 > 「職と芸の割り合い」 lnformation from Compiler Make 「 s マイクロソフト・ C MAGA News Square G CC で学ぶ X68 ゲームプロクラミングく第 21 回 > ケームの仕上ゖ ( 4 ) 吉野智興 D 「 . 望洋のプログラミング道場く第 1 3 回 > ライプラリ開発のために ( 1 ) 柴田望洋・ C ー more く第 20 回 > 関数とモジュールきだあきら・・ 恥すかしながらドジりましたく第 45 回 > 情報は公開したほうが結局は得岩谷宏 ー田典玄のランタムアクセスく第 26 回 > Wind 。 ws NT と UNIX 新 MS - DOS プログラミング入門く最終回 > 1 行入力とヒストリ機能中島信行・ 実践アルゴリズム戦略解法のテクニックく第 1 6 回 > 表計算法 ( 2 ) 松田晋 C 言語プロクラミングレッスンく第 5 回 > 「らせん階段を昇る法。結城浩 98 & DOS / V ゲームプログラミング大作戦く第 3 回 > キャラクタェテイタの作成 ( 3 ) 野村広・・ EditO 「囿: Phone ( 03 ) 5642-8188 SaIes: Phone ( 03 ) 5642-81 Advertising: TOkyo: Phone ( 03 ) 5642-8111 Osaka: Phone ( 06 ) 264-1471 Ed itO 「囿 and Busi ness 0ffices: SOFTBANK SQUARE BLDG. , 3-42-3 , N 旧 ON BAS ト HAMACHO, CHUO-KU, TOKYO 103. JAPAN PubIishe 「 : GO 「 0 Hashimoto PubIishing DirectO 「 : TOShiO lnaba Editor-in-Chief: Shinichi Hoshino Manager Of Sales and Advertising: YOShiO GOShima ・本誌および付録ディスクに掲載されたすべてのプログラムは著作権法上 , 個人で使用する目的以外で無断で複製することは禁じられています。 ・本記事中のプログラム名 , システム名 , CPU 名は一般に各メーカーの登録商標です。本文中では TM , ⑨マークは明記していません。 EDITORS' ROOM ティスク内容のお知らせ Readers' Room lnformation from Compile 「 Make 「 s ボーランド ・ 23 ・・ 37 ・・ 42 ・・・ 44 ・・ 75 ・・・ 160 ・・・ 156 ・・・ 154 ・・・ 150 ・・・ 148 ・・・ 142 ・・・ 136 ・・・ 127 ・・・ 120 ・・・ 118 ・・・ 112 ・・・ 104 ・・ 89 162 ・・・ 168 ・・・ 167 ・・・ 164 CopyrightC1993 SOFTBANK CO 「 p. TOkYO. 齟 rights reserved. NO materialin this publication may be reproduced, in wh01e 0 「 in part, in any fO 「 m without pe 「 mission, Printed in Japan.