000 - みる会図書館


検索対象: 月刊 C MAGAZINE 1992年10月号
213件見つかりました。

1. 月刊 C MAGAZINE 1992年10月号

3 0 ー A 0 The レⅲ 0 わト 0 Programming TUR 0 + w ws 、■第第 置第置■ ■第 退第一ト にま第こ第 丁に朝 0 凶ロロ 0 ・ Resource WO 「 k 0 0 0 日 0 編集に ) フ p イル旧 T / ラキスト ⅲ dCh 軈 つの関 # incl # incl # incl St 「 ing # include く ctype. # incl ude qnath. を 「 ansp(* カラーハ。いトウイ、野 ー 7 ハい あの Tu 市 0 + for Windows に、 DOS/V 版・登場。 ポーランドだから、もちろん日本語対応。 もう妥協することはありません。 住にに」刃」にに wid 冖 : 信、 5 し 物調い . れ 物出コ第う . ル当 MB 以上のプロテクトメモリ・周辺機器 : 最低 15MB 以上のハードディスク / バスマウス対応 ・ \ 29 , 800 ・価格・・・ ( 本製品の価格には消費税は含まれておりません ) C と C + + 、両方に対応した超高速なコンパイラ と、快適なビジュアルツールを搭載した、 Wind 。 ws プログラミンクへの最短コース・ Turbo C 十十 for Windows 。いよいよ DOS / V 対応版かデビューしま す。ポーランドのソフトですから、もちろんマニュアル やヘルプファイル、コメントもすべて日本語対応。英 語版の製品で妥協する必要は、まったくありません。 どうぞ、 Turbo C 十十 for Windows ならではの快 適な Wind 。 ws プログラミンクをお楽しみください。 ・ Wind 。 ws アプリケーションを簡単・短時間に作成 ・統合開発環境とオプジェクトプラウザ Turbo C 十十 for Windows は、 ANSI C と C 十十 2.1 に対応し、 Windows べースて、Ⅵⅱ ndows アプリケー ンドウや、メニュー、スクロールバー、ダイアログ、 ションの開発が行えます。抜群の操作性を持った統 ェテンタ等の洗練された機能が簡単に利用て、きま 合開発環境や高性能なテ。バッガの搭載などによっ ・動作環境 て、 Windows フログラミングがより身近になりました。 ・適応機種 : 旧 M PS / 55 シリーズ ( DOS / V 動作マシ ンに限る ) ・ OS : 旧 M DOS バージョン J5.0 / V 以上十 ・オプジェクトウインドウズ : 00P のパワーを具現化 ポーランドの OOP 技術によるオプジ屋クトウインド MS - Windows バージョン 3.02 以上・メモリ : 最低 2 ウズが、複雑な Windows プログラミングを簡単に します。オプジェクトウインドウズにより、細かなユー ザーインターフェース等のプログラミングに時間を さくことなく、マウス対応のオーバーラッブマルチウィ TURBO FORWINDOWS TURBO い ☆ PC ー 98 版も好評発売中 . を ボーフノト株式ムネ土〒 151 東京都渋谷区笹塚 1-64-8 笹塚サウ = ビル TEL. 03-5350-9370 代 FAX. 03-5350-9390 ※ AII Borland Products are trademarks 0 「 registered trademarks Of Borland lnternational, lnc. OBorland lnternational,lnc. ※ Mic 「 0S0 れ、 Wi 面 ows は米国マイクロソフト社の登録商標です。その他、商品名は一般に各社の商標です。 TIJRO 0 ー 0 を一、 0 日 0 R ー、 0 ※詳しくは、カタログをこ・請求ください。 く資料請求番号 F04 〉 雑誌 14325 ー 10 ◎ソフトパンク凸版印刷 printed inJapan TI 01 45251 00986 旧ⅢⅢⅢ II 蘿ⅧⅡ圓

2. 月刊 C MAGAZINE 1992年10月号

PASCAL 拡張 日本語プロクラム ⅱ .2 ・プロクラム例 プログラムフィポナッチの数列 ( アウトブット ) ; { フィポナッチの数列で 50 まで出力する } 変数二つ前 , 直前 , 新デー久作業 : 整数型 : 開始 行書き出し ( ' フィポナッチの数列 ' ) ; 二つ前 : = 0 ; 直前 : = 1 ・ 行書き出し ( 二つ前 ) : 行書き出し ( 直前 ) ; まず作業 : = 3 から 50 以下実行 開始 新データ 二つ前十直前 ; 行書き出し ( 新データ ) 直前 直前 ー新データ : 終了 TAMAGO は、構造化言語 PASCAL の仕様を拡張して、 きわめて日本語に近い形でプログラムを記述することができま すプログラムの作成は、日本語ワープロでソースを編集して、 TAMAGO コンパイラに投入するだけで簡単にできますプロ グラムの学習や、構造化の基本を学ぶのに、最適なプログ ラムですぜびお試しドさい。 数字、記号も全角で入力できます 左の例は、日本語によるプログラム記述例ですが、通常 の英数半角の PASCAL ソースを、コンバイルすることもできます 従って、 TAMAGO コン / ヾイラーを、 PASCAL のコン / ヾイラーとし ても、用いることができます 終「 . ◆稼働環境 PC9801 シリーズ、 DOS / V マシン ・対応機種 3.1 以上 ( 2.1 では一部制限付き ) ・ MS—DOS 最低 384KB 、実行時最低 256KB ( プログラムに依存 ) ・メモリー 組み込み可能。 FD ペースでも可能 ・ハードディスク ◆製品ー賢 TAMAGO 実行モジュール。 TAMAGO 1 . 2 コンヾイラー、インタブリター 実行モジュール 3.5 インチ ユーティリティー、サンプログ TAMAGO 1 . 2 ラム、オンライン簡易マニュア 実行モジュール 5 インチ ルか含まれています。 日本語マニュアル TAMAGO 1 . 2 プログラマーズマニュアル A5 判 200 ページ コンヾイラー、インタブリターの TAMAGO 1 . 2 ソースプログラム、 MAKE ファ ソースプログラム 3.5 インチ イル、リンク用パッチファイル、 TAMAGO 1 . 2 簡易マニュアルか、含まれてい ソースプログラム 5 インチ ま魂 TAMAGO 1 . 2 実行モジュール 3.5 インチ十マニュアル マニュアルと実行モジュールが セットになっていま魂 TAMAGO 1 . 2 実行モジュール 5 インチ十マニュアル ・価格には消費税 ( 3 % ) 、送料が含まれています ・ 3.5 インチは 2DD ( 720KB ) 、 5 インチは 2HC ( 1.2MB ) です PC9801 、 DOS / v どちらのマシンでも読み込めます ◆こ注文方法 商品は直接弊社宛に、電話、ハガキ、 FAX ( 以上代金引換または銀行振込 ) 、郵便振替、現金書 留でお申込み下さい。 ・電話のお申込みは、下記番号へ。代金は銀行振込、または代金引換でお支払い下さい。 ◆仕様 文法は、標準 PASCAL(JIS X ー 3008 ) に準拠しますが、一部仕様を拡張してあります ・識別子 関数名、手続き名、変数名、型名等に、全角のひらがな、カタカ大漢字、英数字等が使用で きます標準の関数名、手続き名については、日本語表記のものが用意されています ・数字・記号 全角の数字、記号を使用することができます ・予約語一覧 TAMAGO で使用できる予約語を以下に示します 下表の同一行の識別子は、コンバイラーにとって同じものと見なされます 品番号 金額 ( 送料込 ) 商品名 2 , 650 円 1 71 13 2 , 650 円 1 71 15 2 , 260 円 1 7131 3 , 050 円 1 7153 3 , 050 円 17155 4 , 360 円 1 7173 4 , 360 円 1 7175 ー全角 3 全角 2 全角 1 配列指標 除算 以ド実行 a n d 配列 a 「「 a y 開始 ト e 区 i n 場合 定数 ( 0 n S t 割る 以ド 減らして d 0 w n t 0 終「 n d 他方 ファイル 算黏 最初に f 0 「 前方参照 ー 0 「 w a r d 関数 f 社れ c t i 0 れ 移行 g 0 t 0 もし 実現部 i m p ーを m e れ t a t i 0 n 要素 接続部 i れ t e r f a C e 名札 ー a ト e ー ラのく′レ m 0 d 空位置 れ 0 t として で または 乂は 0 「 詰めた P a 0 k e d 第続 手続き p 「 0 ( e d u 「 e プログラム 算譜 P 0 区「 a m レコード 記録型 「 0 ( 0 「 d 繰り返し 繰返 r を p e t 集合 セット t h e れ 向かって から t 0 t y p e u れ i t 到達条件 使用部品 変数 w h i ーを 状態 W i t h 参照 PASCAL 拡張仕様 and array ト・ in C a S e ConSt do downto end forward function 0t0 implementation i れ t を「一 aC を label mod れ日 no t of 0 「 packed procedure program 「 e ( 0 「 d repeat 5 e t then t 0 type un i t un t i ー V a 「 wh ロ 2 物 i t h 条件 電話申込専用 受付センター , ( 03 ) 3403 ー 23 4 797 振込は電信で ・ハガキ、 FAX の場合は、商品番号、お名前、こ・住所、お電話、ご使用機種、銀行振込または代金 引換の区別を明記ぼ下さい。銀行振込の場合、振込確認後に発送致します ・郵便振替の場合、振替用紙の裏面に商品番号を明記して、上記金額をこ・送金下さい。 東京 5 ー 131621 加入者名 ( 株 ) マルテックス ・現金書留の場合、上表の金額 ( 送料込 ) と、商品番号、お名前、ご住所、お電話、こ・使用機 種を明記したメモを現金書留の封筒に同封して、お送り下さい。 【こ・注意】代金引換の際は、上記の金額に ( 210 円 ) 加算されます代金は、郵便配達員に お渡し下さい。 ◆その他 実行モジュールは、主要パソコン通信からも、ダウンロードすることができます ( フリーソフトウェア ) 。 実行モジュールはコビーフリーです 参照範囲 標準 PASCAL では指示語 坂 0 0 9 2 坂 赤 0 港 4 都 3 東 。一番 請、 株式会社 0

3. 月刊 C MAGAZINE 1992年10月号

5 刊 ) 瞬 9 冂 RØぐ◎ ) 当っ、〉ト Ct) 円田 CLOOOZ@ ¥田 ZOOOZ ~ 円田 R89 一② 髏¥田 A0091 ~ 円田 A08 一◎髏¥田 CLOO 日 ~ 円田 A883 髏¥圧 A88 ~ 円田 q00L@ ¥田 ZOOL ~ 爿田 A89 ◎ ¥田 R89 ~ 円田 A89 ⑩髏¥田 g89 ~ 円圧 R00 マ◎ 髏¥田 A00 マ ~ 円田 A008 ⑩髏¥田 R88 ~ 円田 A00Z3 辟・ ) 辟ミ ) Ø屮②くト区 4 亠ーく Y 斗 x@ 900 朴②似◎ flVO \ 0V0 ⑩、 1 ( 一ト燃署ト ) ・ 6 ) Ø屮の 0 ・ト Ø出 3 dS コ@ l/ld@ 0 一 SV8 ◎ト '< 犁ト◎ 0 ⑩コ 08003 NVH180d@ 加・ 9 円 081 ◎髏¥ 80 一 ~ 爿 89 ◎髏¥ 009 ~ 円 00Z ◎ ¥ 00Z ~ 爿 0 日⑩髏¥ 001 ~ 円 093 髏¥ 09e 邸緊ぐ・ 9 込ー」てト ( 日区ミー犁 ) ⑩ト日区ー 4 ◎ 爼ー 4 ( 一 4< 4A4 ⑩ーー凶ー月冂亠ハ、 . ・聨爨 I 。コ 2 。リ Y 負斗 C-g くØ 。コや〉齟リエー尽ハ医Øト¥ 回〔 回〔 回〔 0 一・ 7661 flNIZV9VRT 3 。 5 冂 GR r-.C 要切。ト 5 岩刊 ) P50 リØ※ アンケートに答えて今すぐポストへ / 切手はいりません。 眠〔〕Ø⑩ CO 〔 籵⑩

4. 月刊 C MAGAZINE 1992年10月号

正常なエラー処理となりません。キャラク XMS ファンクション一覧 TabIe 2 リターン 機能 コール Function タデバイスを正常にエラー処理するには , HMA 関連のファンクション どうすればよいて、しようか ? 強制的にプ AX = XMS ノヾージョン No. バージョンの取得 AH=OOh 00h ロックデバイスにしてプロック型の終了処 BX = XMS ドライパ・リビジョンナンバ DX = 0001h : HMA あり 理をすることて、問題解決て、す。それはキャ = 0000h : HMA なし ラクタ型を示すデバイスアトリビュート bit AX=0001h : 割り当て成功 AH=01h = 0000h . 割り当て不成功 DX=HMA 必要バイト数 15 を 0 にし , 強制的にプロック型にすればよ AX = 0001 h : 解放成功 AH=02h いのて、す。処理の内容を List 8 に示します。 = 0000h : 解放不成功 A20Line 関連のファンクション ー町æh による AX = 0001 h : A20Line 有効化成功 A20Line グローバルな AH=03h 03h プロテクトメモリー = 0000h : A20Line 有効化不成功 有効化 AX=OOOI h : A20Line 無効化成功 A20Line グローバルな AH=04h 04h NEC 版 MS ー DOS には隠しファンクション = 0000h : A20Line 無効化不成功 無効化 AX=OOO 1 h . A20Line 有効化成功 A20Line ローカルな有 AH=05h 05h INT DCh(CL=81H, AX= 1 と CL=82H, = 0000h . A20Line 有効化不成功 効化 AX = 0 ) があります (Fig. 5 ) 。このふたつの AX = 0001 h : A20Line 無効化成功 A20Line ローカルな無 06h AH=06h = 0000h : A20Line 無効化不成功 効化 ファンクションは XMS ドライバの代わりに AX = 0001 h : A20Line は有効 A20Line の状態取得 07h AH=07h プロテクトメモリを管理するものと思われ = 0000h . A20Line は無効 ますが , 使用しているソフトウェアは , NE EMB 関連のファンクション AX = EMB 最大空きメモリプロックイ 空き EMB 空き工リア状 C 版 MS-DOS に付属する RAMDISK. SYS し 08h AH=08h ズ 態取得 か確認していません ONEC 版 HIMEM. SYS DX = EMB 空きメモリの全サイズ は , このファンクションと XMS との整合性 AX = 0001h : 割り当て成功 EMB の割り当て 09h AH=09h 0000h : 割り当て不成功 DX = 割り当て EMB サイズ を確保するため , HIMEM. SYS 内て、このフ DX = 割り当てメモリプロックの八ンドル ( K バイト単位 ) アンクションをサポートしています。 RAM AX = 0001 h : 解放成功 EMB の解放 OAh AH = OAh = 0000h . 解放不成功 DX = 解放する EMB の八ンドル DISK. SYS のためだけにこのような処理ルー AX = 0001 h : 転送成功 EMB プロック転送 OBh AH=OBh チンをサポートするのはムダと考えて XMZ = 0000h : 転送不成功 DS : 引 = 転送バラメータ構造 体のアドレス ( * ) はこのファンクションをサポートしていま AX = 0001h : ロック成功 EMB のロック OCh AH=OCh せん。 = 0000h : ロック不成功 DX = ロックする EMB の八ンドル RAMi" イスクは筆者作の「 RZ3 」をお使い AX = 0001h : ロック解除成功 EMB のロック解除 ODh AH=ODh 0000h : ロック解除不成功 DX = ロック解除する EMB の八 ください。「 RZ3 」は近々発表の Ver. 3.5 て、 X ンドル MS メモリもサポートする予定て、す。 AX = 0001 h : 情報取得成功 EMB 八ンドル情報の取 OEh AH=OEh DX=EMB の八ンドル 0000h : 情報取得不成功 得 BH = EMB のロックカウント EMB 関連のファンクション BL = EMB の空き八ンドル数 DX = EMB のサイズ ( K バイト単位 ) AX = 0001h : 再割り当て成功 EMB は通常プロテクトモードからて、ない = 0000h : 再割り当て不成功 とアクセスて、きないため , 関連ファンクシ ョン処理は複雑になります (TabIe 2)0MS -DOS はリアルモードて、動作するわけて、すか ら , EMB にアクセスするごとにリアルモー ド , プロテクトモード間のモード移行を行 う必要があり , プロテクトモード時におけ る割り込み処理は非常に複雑になってしま います。 MemoryPr0386 などは MS-DOS Ver. 5 対応版て、も EMB 関連のファンクショ ンが用意されていません。 「 XMZ 」は , EMB のアクセスを⑩のテクニ 48 C MAGAZINE 1 2 10 HMA 領域の要求 01 h HMA 領域の解放 02h EMB の再割り当て OFh AH=OFh BX = 再割り当ての EMB のサイ ズ ( K バイト単位 ) DX = 再割り当てする EMB の八 UMB 関連のファンクション AX = 0001h : 割り当て成功 UMB の割り当て 1 Oh AH = 1 Oh = 0000h . 割り当て不成功 DX = 割り当てる UMB のサイズ ( パラグラフ単位 ) UMB の解放 AX = 0001 h : 解放成功 1 1 h AH = 1 1 h DX = UMB セグメント値 = 0000h : 解放不成功 ( * ) 転送バラメータ構造体 ExtMemMoveStruct STRUC Length dd SourceHandle dw ? SourceOffset dd DestHandle dw ? DestOffset dd ExtMemMoveStruct ENDS

5. 月刊 C MAGAZINE 1992年10月号

X 68 k 活用講座 List 7 のコンノヾイル結果 List List 80386CPU による GCC 2.2.2 でのコンバイル結果 . file gcc2_compi led. . text . align 2 . g10b1 -builtin—test0 builtin_testO: pushl Xebp movl Xesp, Xebp pushl Xedi xorb Xal, XaI movl 8 (%ebp), Xedi movl $ ー 1 , %ecx repne scasb movl %ecx, %eax notl Xeax decl %eax movl -4(Xebp), %edi 1 eave ret gccdump . file gcc2_compi led. . text . align 2 . g10b1 ー 100P ー OPt ー 100P ー OPt : pushl Xebp movl Xesp, Xebp pushl Xesi pushl Xebx movl 8(%eb ),Xesi xorl %ebx, kebx movl $-buf, Xecx . align 2 , 0X90 xorl Xedx, Xedx movl xecx, xeax . align 2 , 0X90 cmpl Xesi, (Xeax) jne L8 movl $ 0 , (Xeax) j mp L7 . align 2 , 0X90 movl Xesi, (Xeax) addl $ 4 , Xeax incl Xedx cmpl $ 14 , Xedx jle L10 addl 60 , %ebx addl 60 , %ecx cmpl 840 , Xebx jle L11 leal -8(Xebp) , Xesp popl Xebx popl Xesi leave ret gccdump L11 : L10 : L7 : Fig. 2 SX-Window い . 第 当ロ当 0 ツ - E 応を田誕 List fp 「 intf の間違った引数 Fig. 3 Ko-Window 1 : #include く stdio. h 〉 2 : main() fprintf stdout, "Xs Xs*n", "test") ・ 4 : ” test ” fprintf stdout, "Xd %s}n" 5 : 1 : int 2 : builtin—test0 (char *P) return —builtin strlen (P); 4 : test") : 颶 E 物を当ー印 Fig. 4 OS -9 / 68000 List 組み込み関数 ュ、・弩 10 Prior せイ : ' 軈」 : 新響響をジ。 - - ・・ , し幻 , 0 気 13 諸 : 胃 0 冫へ : ~ 9. g を 4 第 3 ら 5 ? 既円川下 ( ) ⅲ知 i & g. g ー 4. g ー 次 ! 7 5 ⅱ 0 、ル i 心 ? g g.e 】 23 4. を自 0 汽 2 : ”ⅱ、ル : 新 8 g 2 ー釜気けを 写引 0 : , ′ⅵ 0 ? を je ( ー ! こっこ k ッ引 : は 1 : int 2 : builtin_testO (char *P) return _bui ltin strlen (P) : 4 : 05 なⅡ物 n . ir んい X68k 活用講座 153

6. 月刊 C MAGAZINE 1992年10月号

のようにすることてす。それにはまず a [ 0 ] う意味は , 「この中て a Ck] が最小だ」とい けてす。実際にトランプても使って数回や がこの 4 個のうち最小てなければなりません ってみるとわかりやすいと思います。なお , うときの k を求めるということてす。それに ( 等しい場合も含めて最小ということにしま 最初並びて最小のものが先頭にあれば何も はトーナメントの考え方を使うのがよいて する必要はありませんが , その場合にも「自 しよう。 具体的に Fig. 4 ( a ) という 4 個の数なら , 4 分自身と交換する」と考えると統一的に理解 トーナメントというと , 普通は Fig. 6 のよ 番目の 5 を先頭にもっていかなければなりま てきます。 うなものを思い浮かべますが , Fig. 7 も立派 せん。そのためには , 先頭の 8 と 4 番目の 5 と 方法が納得て、きたら , それをプログラム なトーナメントてす。こちらのほうが規則 にしなければなりません。 a [ 0 ] から a [ 3 ] を交換すればいいのてす ( Fig. 4(b))0 性がよく見えるのて , こちらを使うことに これ <Fig. 4 (c) となりました。もう先頭 まて、の 4 個の整数を小さい順に整列するには しましよう。 まず a [ 0 ] と a [ 1 ] てどっちが小さいか の 5 の立場は安泰て、す。次はこの 5 を除いた Fig. 5 のようにします。 て、は次にく a [i] から a [ 3 ] までで最小の 3 個て同じように考え , 3 個の先頭の 9 と最小 比べます。小さいほうを a [k] とするのて の 7 とを交換します ( Fig. 4(d))0 もうこの 7 ものを探す > を考えましよう。今度も具体 すが , この番号 k を求めるには , 次のように 的に a [ 0 ] , a [ 1 ] , a [ 2 ] , a [ 3 ] の 4 個て も安泰てす。残るは 2 個てす (Fig. 4 (e) ) 。 9 するのがひとつの方法てす。 と 8 を交換して Fig. 4 ( f ) て、完了 ! というわ 最小のものを探すことにします。探すとい if (a [ 0 ] く a [ 1 ] ) k Fig. 2 から導出したプログラム でたらめな数を n 個作る 0 List LiSt 1 : #define N 10 2 : main() int a[N] ; 4 : 5 : make—random (N , a) ; 6 : output(), a) : 7 : sort(), a) ; 8 : output(), a) ; 9 : 10 : return 0 ; 1 : #include く stdlib. h 〉 2 : 3 : void make-random(int n, int aC]) / * でたらめな数を n 個作る * / 4 : 6 : 7 : 8 : 9 : 10 : } int i; for (i a[i] = rand(); 0 ; i く n; i + + ) a[O], a[l ] , a[2], a [ 3 ] を小さい順に整列する方法 so 関数の仮ルーチン List LiSt 十 十 / 、 1 」 十 っ , 1 イ、 0 0 1 : void sort(int n, int a ロ ) printf("sort(): 未完成 \ n " ) ; 3 : N 個の整数を小さい順に並べ換える関数 ( 1 ) N 個の整数を小さい順に並べ換える関数 ( 2 ) LiSt List 十 十 ・、 1 ー 1 十 十 ・ 1 0 0 0 0 1 0 3 4 ′ 0 6 ー 8 9 0 ・ 1 りり 0 4 11 1 1 1 人 1 人 十 十 十 0 0 0 ・ 1 0 1 人り 00 4 ′ 0 れ 0 っー 8 9 0 、 1 りなっ 0 1 ・ 4 、 1 、 1 ・ー 102 C MAGAZINE 1992 10

7. 月刊 C MAGAZINE 1992年10月号

MOUSE ドライバのファンクションを利用したサンプルプログラム include く dos. h> include く graph. h> i n t 8 6 関数を使用した M i c r 0 s 0 f t マウスドライバのサンプル マウスのファンクションはペクタテーブル 3 3 H を介してコールします。 9 : / * 関数のプロトタイプ宜言 * / 10 : void min(void); 11 : VOid muse_style(int centerx, int centery, int far *mask) ; 12 : int mouse_reset(void); 13 : int mouse on(void) ・ 14 : int mouse_off(voidj; 15 : Oi d 0 0 ー int ・ = , int *y, i nt 、 tat) : 16 : VOid mouse_setX)S int X, int y) ; 17 : VOid mouse_area(int xmin, int int ymin, int ymx) : 19 : ″マウス範囲の定義り 20 : #define AREA_XMAX 600 21 : #define AREA_YMAX 350 22 : #define AREA_XMIN 50 23 : #define 財 YMIN 50 24 : 25 : StatiC union REGS inregs, outregs•, 26 : static struct SREGS segregs; 28 : / 本マウス形状の定義データり 29 : unsigned int far cursor and maskC32] 0xfe3f, / 事 1111 1110 00 Ⅱ 1111 り 30 : 31 : 0xfc1f, 1111 1100 0001 1111 り 32 : 0xf80f, / * 1111 1000 0000 1111 り 33 : 0Xf007. ″ 1111 00 圓 0000 0111 り 34 : 0Xf007 , 1111 0000 0000 0111 り 35 : 0Xf007 , / * 1111 0000 0000 0111 り 36 : 0Xf007 , / 本 1111 0000 0000 0111 * / 0Xf007 , / * 1111 0000 0000 0111 り 38 : 0Xf007 , / 本 1111 0000 0000 0111 事 / 39 : 0x f007 , / ネ 1111 0000 0000 0111 り 40 : 0Xf007 , / * 1111 0000 0000 0111 り 0Xf007 , ″ 1111 0000 0000 0111 本 / 42 : 0Xf007 第 / 事 1111 0000 0000 0111 り 43 : 0Xf007 , 1111 0000 0000 0111 り 44 : 0Xf007 , / * 1111 0000 00 0111 * / 45 : 0Xf007 , / * 1111 0000 00 0111 * / 46 : 0X0080 , / * 0000 00001000 0000 * / 48 : 0X01C0 , / 本 0000 00011100 0000 り 49 : 0X03e0 , / 事 0000 00111110 0000 り 50 : 0X0000 , / 車 0000 00000000 0000 り 0X03e0 , 0000 00111110 0000 り 52 : 0X03e0 , / 事 0000 00111110 0000 り 53 : 0X03e0 , / * 0000 00111110 0000 り 54 : 0X032 , / 本 0000 00111110 0000 * / 55 : 0X032 , / * 0000 00111110 0000 り 56 : 0X03e0 , / * 0000 00111110 0000 り 0X03e0 , / 0000 00111110 0000 り 58 : / 0000 00111110 0000 り 0X03e0 , 59 : 0X03e0 , 0000 00111110 0000 り 60 : 0X03e0. 0000 00111110 0000 り 0X03 , 0000 00111110 0000 り 62 : 0X03 0000 00111110 0000 り 63 : ) : 64 : ″ 65 : AREA_XMIN,AREA_XMAX,AREA_YMIN, 朋ーⅧの範囲でマウスオペレーション 66 : * を行います . 67 : 本現在のマウス位置を表示します . 68 : ネ E S C キーを押下すると終了します . 69 : り 70 : void min(void) 72 : int stat : 73 : 98RESSCOLOR ・ —di splaycursor て -GCURSOROFF ・ 75 : ー setcolo 「 ( 3 ) : ー「 ec ね le (—GBORDER, 財 - X N, AREA_YMI N, AREA_YMAX) : AREA-XMAX, if (!mouse reset()) ( 80 : printf て” #nmouse driver not installai ” ) : 82 : exit(); 83 : 84 : mouse_styl e(), 0 , cursor_and_msk) : 86 : mouse-on(); mouse-area (AREA IN, AREA-XMAX, AREA_YM IN, ーⅧ ) ; mouse-setpos(10ö, 10 の : 88 : 89 : setcolor 6 ) ; 90 : mouse getpos()x s, &ypos. &stat); if (siat & 0X01 ( 92 : 93 : 3 の : Brintf("LEFT"); 94 : 95 : 96 : else if (stat & 0X02 ) { 3 の : settextX)Sition(3, 98 : Brintf("RIGHT"); 99 : 100 : 101 : —settextX)sition(l, 1 ) : 102 : printf()x : X3d y : % ” XPOS, (X)S) : List 1 103 : 104 : 105 : 106 : 107 : 108 : mouse-off(); 109 : 110 : 111. 112 : 113 : / * マウスドライバの初期設定をします く戻リ値 > 0 : マウスドライバが組み込まれていません 114 : * -1 : 正常終了 115 : 116 : * / int mouse_reset(void) 117 : 118 : { 119 : inregs. X. ax = 0 : int86 ( 0X33 , &inregs &outregs); 120 : return (outregs. x. ax} : 121 : 122 : 123 : 124 : マウスの形状を設定します . 125 : * 126 : * / 127 : VOid mouse_style(int centerx, int centery, int far *mask) 128 : 129 : inregs. x. ax : 0X09 : 130 : inregs. X. bX = centerx; 131 : lnregs. X. CX : centery; 132 : segregs. es : FP SEG(mask) ・ . x. dx = 0FP(mask5; 133 : 0 、 33 , &inFegs, &outregs, &segregs); 134 : 135 : 136 : / * 137 : * マウスカーソルを表示します . 138 : * / int mouse—on (void) 139 : 140 141 : lnregs. X. aX int86 ( 0X33 , &inregs, &outregs); 142 : 143. 144 : 145 : * マウスカーソルを消去します 146 : * / 147 : int mouse—off(void) 148 ・ 149 : lnr S. X. ニ 2 : int%(0x33, &inregs, &outregs); 150 : 151 152 : / ネ 153 : 本 マウスの現在位置 , ボタン押下情報を取得します . 154 : * / 155 : void mouse_getpos(int *X, int *Y, int *Stat) 156 : 157 : inregs. X. ax = 3 : 158 : int86 ( 0X33 , &inregs, &outregs); 159 : *X : outregs. X. 160 : *Y ニ outregs. x. dx; 161 : *Stat : outregs. x. bx; 162. 163 : / 本 164 : * マウスカーソル位置を設定します . 165 : ネ / 166 : void muse_setpos(int x, int y) 167 168 : inregs. X. ax = 4 ; 169 : lnregs. X. CX : x; 170 : inregs. x. dX = y; 171 : int86 ( 0X33 , &inregs, &outregs); 172 173 : / * 174 : 本マウスカーソルの移動範囲を設定します . 175 : り void xnin, int xnax, int ynin, int ymax) 176 : 177 : { 178 : tnregs. X. ax = 7 : 179 : lnregs. X. CX : xmln; 180 : lnregs. x. dx : xmax ・ int86 ( 0X33 , &inregs, &outregs); 181 : 182 : inregs. X. ax : 8 ; 183 : inregs. X. CX = ymln; 184 : inregs. x. dX : ymax ・ int86 ( 0X33 , &inregs, &outregs); 185 : 186 TabIe 2 80X86 チップの命令セット Sign-Extended Encodings Assembler lnst 「 uctions 83 E3 FF AND b& 0 幵幵 h 83C3 01 ADD b& 0001 h 83 D3 OF ADC bx. Ofh OR 83CB 01 1 bx, Offffh 83DB FF SBB 83EB 03 b& 3 SUB bx 0002 h 83 F3 02 XOR bx 0 幵 f2 h 83FB F2 CMP if (kbhit()) if (getch ) break; = 0x1b) Nonsign-Extended Encodings 81 E3 FFFF 81 C3 0001 81 D3 000F 81 CB 0001 81 DB FFFF 81 EB 0003 81 F3 0002 81 FB FFF2 167 lnformation from Compiler Makers

8. 月刊 C MAGAZINE 1992年10月号

List 7,List 8 は組み込み関数の展開の例 て、す。 CPU は 80386 て、 , strlen( ) がリビート プレフィックスっきの命令群に展開されて います。こういった特殊命令のサポートも GCC Ver. 2.2.2 の特徴のひとって、す。 X68000 ウインドウ X68000 の窓としては現在 , SHARP 製品 の SX-Window とフリーウェアの Ko-Wind ow の 2 種類が存在しています。 SX-Window は Mac ライクなウインドウシステムて、 , Ko -Window は独自のウインドウシステムて、 す。これらのウインドウシステムを扱うア プリケーションを作る場合に問題になるの が技術資料て、す。 今のところ SX-Window について SHARP から正式な技術資料は提供されていません。 て、すが , fSX-WINDOW プログラミング』 ( 吉沢正敏著 , ソフトバンク ) や , フリーウ ェアとして流れている沖氏の SXKit シリーズ などて、情報を得ることがて、きます 0Ko-Wi ndow システムについては , 全システムのソ ースが公開されており , これを読むことて、 すべての知識は得られます。個人的にはこ のふたつのウインドウシステムはまったく 別のコンセプトを持っていると思っている のて、 , 甲乙をつけるものて、はないと思いま す。 2 種類の・・・・・・と書きましたが ,Human68K 上て稼働するもの以外には OS ー 9 / 68000 にも ウインドウシステムがあります。こちらは OS 自体がマルチューザマルチタスクなのて、 見た目はより UNIX の X-Window に近い印 象になっていて , ツール類の貧弱さと処理 速度を除けば本当にいいウインドウだと思 います (Fig. 2 , 3 , 4 参照 ) 。 Fig. 1 List 6 をコンノヾイル List R3000A CPU による GCC Ver. 2.2.2 でのコンノヾイル結果 . file nobopt . set 朝 # GNU C 2.2.2 CAL 1.1 , 19 ] DECstation running ultrix compiled by GNU C # Cc1 defaults : # Cc1 arguments ()G value = 8 , Cpu = default, ISA = 1 ) : # -mgpopt -quiet -dumpbase ー 04 -0 、 gcc2—compi led. . text . align . g10b1 . comm . text . 10C . ent subu . frame . mask . fmask SW move la move move lw lw #nop bne . set . set SW . set . set 2 100P ー opt buf, 904 0 ) 8 11 1 よ 100P ー opt sp, $sp, 16 sp, 16 , $ 31 0X00000000 , 0 0x 圓圓圓圓 , 0 4 , 0($sp) 6 , $ 0 5 , buf 2 , 0 3 ) $ 2 , $ 7 , $ L19 noreorder nomacro 0 , 0 ( $ 3 ) macro reorder 100P ー OPt : # vars= 8 , regs= 0 / 0 , args = 0 , extra= 8 $ L21 : 0 り O 0 ・・ ( ・ -4 4- 0 0 0 00 0 ・ -0 れし ^ 0 0 0 0 LO 0 、 0 ・ $ - 0 , , 0 0 0 ・ 1 よ 0 ー -4- りな 0 0 りムれ 0 り 0 0 つなに 0 O ^ 0 0 SW addu s 1 t . set . set bne addu . set . set addu s I t . set . s et bne addu . set . s e t addu . end TabIe 1 Window 開発環境 技術資料 価格 ライプラリ 正式には未対応 SX-Window 正式には未公開 Ko-Window OS ー 9 / 68000 gcc2 test. c ー 0 -S -Wformat test. c: ln function main test. c:5: warning: t00 few arguments for formt test. c:6: warning: int fO ロ t , pointer arg (arg 3 ) 無料 29 , 800 円 あり あり 公開 公開 152 C MAGAZINE 1992 10

9. 月刊 C MAGAZINE 1992年10月号

X 68 k 活用講座 コンノヾイル速度 コンパイル速度を考えると・・ ・・と書いた のは GCC 2.2.2 て、最適化のレベルを上げる と相当にコンパイル速度が低下するためて、 す。 List 4 て、 R3000A の結果がててきたよう に , 筆者は最近 RISC ワークステーションを 触れるようになったのてすが , CC て、 GCC を 作成する ( * 4 ) のに約 5 分。たったこれだけて、 GCC ( * 5 ) が作れます。 X68000 との雲泥の差 にめまいを覚えましたが , GCC て、 GCC 自体 を作ると , 最適化のレベルー 03 て℃ C に比べ て目に見えて遅くなります。 RISC ワークス テーションてこういった状態てすから , X6 8000 て、は驚異的な速度になります。 GCC 2.2.2 を GCC 1.40 て、セルフプート ( * 6 ) させる と XVI 16Mhz て、一 03 指定て一晩連続稼働に なります。ちょっとしたレイトレ画像ても 作成している状態と同じてすが , このくら いのコンパイル速度になると現在の GCC 1.40 ても「何とかならんの ? 」という声があ るのて、すから X68000 て、は少し実用領域から 外れてきます。速度だけて、なく実行形式の 巨大さとコンパイルに使われる必要メモリ も、、次期 X68000 期待〃とせざるを得ない状 況になっていると思われます。 そのほカつ GCC 2.2.2 の特徴 X68000 版 Nemacs 移植者の村上氏が強調 されていた特徴として fprintf 系列の印字フ ォーマット文字列と引数の対応を警告する オプションがあります。 -Wformat(-WaII< も有効 ) を指定すると List 6 のような誤りのある呼び出しに対して 警告が出力されます (Fig. 1 参照 ) 。 ほかには多くの関数が、、組み込み関数〃 として実装されています。残念てすが X680 00 にはほとんど縁がないのて、 80386 の場合を 例にします (GCC 2.2.2 の組み込み関数の実 装を見ると , CPU がこういった特殊処理を 行う命令を持っていた場合に直接展開する ようてす ) 。 List X68000 版 GCC Ver. 1 .40 SX 07 でのコンバイル結果 . text . even . g10b1 ー 100P ー opt ー 100P ー opt : link a6, # 0 movem. 1 d3/d4/d5, -(sp) move. 1 8 (6), d3 moveq. 1 0 , d2 move. 1 # buf, d4 moveq. 1 加 , dl move. 1 dl, d0 move. 1 d4, a0 add. 1 d0 a0 moveq. 1 , d0 cmp. 1 (a の , d3 bne ? 8 moveq. 1 # 0 , d5 move. 1 d5, (a の bra ? 7 move. 1 d3, (a の addq. w # 4 , a0 addq. 1 # 4 , d0 moveq. 1 # 56 , d5 cmp. 1 dO, d5 bge ? 10 moveq. 1 # 60 , d5 add. 1 d5, dl addq. 1 # 1 , d2 moveq. 1 # 14 , d5 cmp. 1 d2, d5 bge ? 11 movem. 1 ー 12 ( a6 ) , d3/d4/d5 unlk a6 r tS ? 11 : ? 10 : ? 7 : List X68000 版 GCC Ver. 2.2.2 でのコンノヾイル結果 . text . even . glObI ー 100P ー opt ー 100P ー opt : link. 響 a6, # 0 move. 1 d3, -(sp) move. 1 8 ( a6 ) , al clr. 1 d2 move. 1 #—buf, dl clr. 1 d0 move. 1 dl, a0 cmp. 1 (a の , al bne L8 clr. 1 d3 move. 1 d3, (a の bra L7 move. 1 al, (a の addq.w # 4 , a0 addq. 1 # 1 , d0 moveq. 1 # 14 , d3 cmp. 1 d0, d3 bge L10 moveq. 1 # 60 , d3 add. 1 d3, d2 add. 1 d3, dl cmp. 1 # 840 , d2 ble L11 move. 1 ー 4 ( a6 ) , d3 unlk a6 rts い 1 : L10 : L7 : X68k 活用講座 151

10. 月刊 C MAGAZINE 1992年10月号

c ) 正方形の一部だけが円の内部にある これらのうち a) と b) は再分割するまて、も なく面積が求められるのて、 , 再分割しなけ ればならないのは c ) だけて、す。この性質を 使うと Fig. 7 のような不均等分割になりま す。 以上により不均等分割のアルゴリズムは List 7 のようになります。このアルゴリズム は分割した正方形の中て、円周内部のあたる 部分の面積を返すようになっています。 こて、正方形を表現するデータ構造につ いて考察します。正方形を一意に決定する ためには位置と大きさが必要て、す は , 正方形の位置を左下隅の項点 ( x , y ) て、 表し , 大きさを一辺の長さ len て、表すことに します。このデータ構造を用いて List 7 のア ルゴリズムを C プログラムとして詳細化した ものが List 8 て、す。 List 8 は再帰的な分割の過程をグラフィッ クス表示するようにしました。グラフィッ クスのライプラリは TC 十十 Ver. 1.01 のも のを仮定しています。残念ながら筆者は T C 十十以外のコンパイラ ( MS ー C など ) を所有 していないのて、 , TC 十十のみの対応となり ましたが , グラフィックスライプラリを間 接的にコールするようにしてありますから , PI ℃の冒頭にプロトタイプ宣言している関 数群を書き直せば移植て、きるようになって います。このため MS-C そのほかに移植する ことは容易て、しよう。 List 8 によるグラフィックス表示は , 分割 統治法独特の再帰的分割のようすを直感的 に理解するために役立ちます。付録ディス クに PC -9801 用の実行形式も添付しておきま すのて、 , ぜひ実行して分割のようすをご自 分の目て、確かめてください。分割統治法の 例題として , あまり実用的とはいえない の題材を選んだのは , この絵を皆さんにお 見せしたかったことが最大の理由なのて、す から。 42 : } 45 : { 62 : } 実行時にはカレントディレクトリに PC98. BGI が必要です。 A 〉 tcc pi ・ c graph. c graphics. lib * コンパイル法 * 作成 : 松田晋 1 : / * file ニ pi. c 分割統治による兀の算出プログラム List 8 3 : 5 : 8 : 18 : 20 : 25 : 28 : 29 : 32 : 33 : 34 : 36 : 38 : 43 : 46 : 48 : 49 : 50 : 52 : 53 : 54 : 55 : 56 : 58 : 59 : 60 : 63 : 64 : 68 : 69 : 73 : 74 : 75 : 77 : 10 : #include く stdio. h 〉 11 : #include く stdlib. h> 13 : #define SCALE 320 15 : VOid init_graphics(void) : 16 : void rectangle—fill(int x0, int y0, int xl, int (l) : VOid rectangle—edge(int x0, int y0, int xl, int (l) ; / * 長方形の描画 ( 中抜き ) * / VOid circle edge(int x, int y, int r) ; / * 円の描画 * / 22 : void flush_graphics(void) ; 24 : double eps : / * グラフィックの初期化 * / / * 長方形の描画 ( 塗りつぶし ) * / / * グラフィックの終了 * / 26 : void square(double x, double y, double len, int fi 11 ) int x0, YO, xl, yl ; x0 = x * SCALE; YO = y * SCALE; xl = (x + len) * SCALE; = (y + len) * SCALE; if (fill) rectangle—fill(x0, yO, xl, (l) ; else rectangle edge(x0, y0, xl, (l) ; 39 : double sqr(double x) return X * x; 44 : double area(double x, double y, double len) / * 引数 x の 2 乗を返す * / , の ; * 0.5 ; len) y + len, len) + len, Y, len) 十 len, y 十 len, 十 area(x 十 area(x 十 area(x, if (argc く 2 ) { double pi; int main(int argc, char *argv ロ ) if (sqr(x) + sqr(y) 〉 1. の { / * 距離の 2 乗で比較する * / square ( x, Y, 1 en, の ; return 0.0 ; } else if (sqr(x + len) + sqr(y + len) く 1. の { } else if (len く = eps) { return len * len; square(), Y, len, 1 ) ; return area(), y, len * = 0.5 ; } else { return len * len square(), y, len len) ; fprintf(stderr, " 使用法 : pi 許容誤差 \ n ” ) ; exit(l); eps ニ atof()r vC1]) ; init—graphicst) ・ circle—edge(), 0 , SCALE) ; Pi = area(), 0 1. の * 4.0 ; (void)getcharÖ ; flush—graphics ( ) : printf("pi 96 C MAGAZINE 1992 10