short - みる会図書館


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

1. 月刊 C MAGAZINE 1993年9月号

DO S ファンクションライプラリ関数ヘッダファイル 1 : #ifndef DOSFUNC_DEFINED_ 2 : 3 : #ifndef MK•-FP 4 : #define MK-FP(), 0 ) ((void far *)(((unsigned long)(s) くく 16 ) ー (unsigned)(o))) 5 : #end i f 7 : struct dpb-t { / * テ・イスク・ハ。ラメータ・ガロック ( MS-DOS 4.0 以降 ) * / 8 : unsigned char / * ドライフ・番号 ( 0 , 1 , 2 , . dr i ve ; unsigned Char un i t : ユ : ット番号 ( 0 , 1 , 2 , . unsigned short / * ハ・イト / セクタ sector_size; / * クラスタサイ n ー 1 ( セクタ / クラスター 1 ) * / unsigned Char cluster_mask; unsigned Char / * クラスタサイス・ n cluster_shift; / * 予約セクタ数 ( FAT の開始論理セクタ番号 ) * / unsigned short first_fat; unsigned Char fat_count; / * FAT 数 15 : unsigned short / * ルート・テ・イレクトリエントリ数 root_entries; / * テ・一タ領域開始論理セクタ番号 unsigned short first_sector; 17 : unsigned short max_cluster; / * データ領域最大クラスタ番号 ( 全クラスタ数 + l) * / 18 : unsigned short fat_size; / * セクタ数 / FAT 20 : unsigned short dir_sector; / * ルート・ディレクトリ領域開始論理セクタ番号 * / void far *pdriver_adr; / * テ・イス・ドライへのホ。インタ 22 : unsigned char med i a ; / * メデ行・ディスクリフ。タ・ハ・イト 23 : unsigned char first_access; / * ディスク交換を示すフラク・ struct dpb-t far *pnextdpb; / * 次の DPB を指すホ。インタ 25 : unsigned short nextfree, / * 最後に変更したクラスタ番号 26 : unsigned short free_cluster; / * 未使用クラスタ数 28 : 29 : struct dpb3-t { 30 : unsigned Char dr i ve ; unsigned Char un i t : 32 : unsigned short sector_size; 33 : unsigned char cluster_mask; 34 : unsigned char us ter_ 曲 i f t : 35 : first_fat; unsigned short 36 : unsigned char fat_count; unsigned short root_entries; 38 : unsigned short first_sector, 39 : unsigned short max_cluster; 40 : unsigned Char fat_size; 42 : unsigned short dir_sector; 43 : void far *pdriver_adr; 44 : unsigned char med i a : 45 : unsigned char first_access; 46 : struct dpb3-t far *pnextdpb; 47 : unsigned short nextfree; 48 : unsigned short free_cluster; 49 : } ; 50 : 51 : struct dpb2-t { 52 : unsigned Char dr i ve ; 53 : unsigned char un i t ; 54 : unsigned short sector_size; 55 : unsigned Char cluster_mask; 56 : unsigned char cluster_shift; 57 : unsigned short first_fat; 58 : unsigned Char fat_count; 59 : unsigned short root_entries; 60 : unsigned short first_sector; unsigned ShOFt max_cluster; 63 : unsigned char fat_size; unsigned short dir_sector; 65 : void far *pdriver_adr, unsigned Char med i a ; unsigned Char first_access; 68 : struct dpb2-t far *pnextdpb; 69 : unsigned short current_cluster; unsigned Char current-dir[ 64 ] ; 74 : struct loadprogram-t { 75 : unsigned short envseg; ファンクションが正常に終了した場合に は , AL レジスタに 00h が返され , DS : BX レジスタに指定したドライプ (DOS ファンク ション 1Fh : カレントドライプ , DOS ファン クション 32h : DL レジスタ ) の DPB アドレス が返されます。指定されたドライプが無効 だったり , ディスクエラーが発生していれ , ば , AL レジスタに FFh が返されます。 DPB (Disk Parameter Block) はドライ プを管理するために必要な諸データを設定 するプロックて、す。 DOS ファンクション IF h と DOS ファンクション 32h て、取得て、きる D PB の構造体は Table 2 に示すようにバージ ョンによって異なっているため注意が必要 て、す。 DOS 4.0 以降て、大容量ディスクをサポー トした関係により , オフセット 0Fh の IFAT 当たりのセクタ数が 2 バイトになっていま す。よって , それ以降が 1 バイトずつずれて います。 DPB の各要素は次のような意味を持って ①ドライプ番号 ドライプ番号を示します。 0 =A ドライプ 1 = B ドライプ 1 十 号 数 * 号 番 番 ー々′ 理 全 . ワ 3 93 号 番 = - ↓・々 , 番 、 1 11 開数番 一 0 0 開 の団理タ 刀域すす . 領・ハ示指オ 始大リイク し数 トラスをを 号号 外開最 . ロ番番セ イイタイ域域 ′ / イ・ - ア - 変 数デ領領 ティアクに用 数 : 、イの後使 ハ ( 々 / 々′ール - ア一ア デ次最未 0 25 = Z ドライプ 十 数 * 号 番 番 々・ . 々′ 列 字 全 号 文 、ノ , 1 1 ム々′ -1 ・戸し体 開数番 開 ク造セ の理 、ノ ラ域尠すすの ( 構 の 領示指 リ始大 境 < トラスをを 々′々ノ 外開最 号号 れトーみノノ・ - 番番セスス イイ社域域 フ・ト / ササけ数デ領領 数 . ーレーレ ハ物・ . み .. マ丁、ル一ア - 丁・ ドライプごとに必す異なります。 となり , ②ユニット番号 デバイスドライパ内のユニット番号を示 します。 MS-DOS がプロックデバイスに読 み書きの要求を出すときに , そのデバイス ドライパ内のどのユニットかを指定するた めの番号て、す。したがって , ユニット番号 は , デバイスドライバごとに 0 から始まりま す。 プログラミングにあたって関係するのは ドライプ番号て、 , ュニット番号はデバイス ドライバを直接呼び出さないかぎりはとく に関係ありません。 ③セクタ長 64 C MAGAZINE 1993 9

2. 月刊 C MAGAZINE 1993年9月号

M ① 非公開情報 0 ist 1 セクタ当たりのバイト数 ( バイト数 / セク タ ) を示します。 IBM PC 互換機て、は 1 セクタ = 512 バイト が標準になっています。 ④ 1 クラスタ当たりのセクタ数ー 1 1 クラスタ当たりのセクタ数から 1 を引い た数 ( セクタ / クラスター 1 ) を示します。 ⑤クラスタセクタのシフトカウント 1 クラスタ当たりのセクタ数を 2 の累乗て、 示します。 ⑥予約セクタ数 ( FAT の開始論理セクタ番号 ) 予約セクタ数を示し , FAT の最初の論理 セクタ番号になります。 ⑦ FAT(File Allocation TabIe) の数 FAT の数を示します。フロッピーディス クやハードディスクて、は通常は 2 となりま す。 RAM ディスクて、は 1 となっているもの もあります。 ⑧ルートディレクトリのエントリ数 ルートディレクトリのエントリ数を示し ます。ルートディレクトリには , に刀ヾ された数以上のファイルやサプディレクト リを作成て、きません。 ⑨データ領域の開始論理セクタ番号 データ領域の最初の論理セクタ番号を示 します。工デイタやワープロて、作成したフ ァイルのデータはこのセクタ以降に格納さ れます。 ⑩最大クラスタ番号 ドライプ内の全クラスタ数に 1 を足した数 ( 全クラスタ数十 1 ) を示します。 ⑩ IFAT 当たりのセクタ数 ひとつの FAT が占めるセクタ数 ( セクタ数 / FAT) を示します OMS-DOS 2. x , 3. x ては 1 バイトて、すが , MS-DOS 4.0 以降て、 2 バイ トになりました。 @ルートディレクトリ領域開始論理セクタ 番号 ルートディレクトリ領域の最初の論理セ クタ番号を示します。 ⑩デバイスドライバへのポインタ 1 76 : 77 : 78 : 80 : 82 : 83 : struct dosexterror_t { 84 : unsigned short errax; 85 : unsigned short errbx; 86 : unsigned short errcx; 87 : unsigned short errdx; 88 : unsigned short errsi : 89 : unsigned short errdi , 90 : unsigned short errds, unsigned short erres; 92 : unsigned short errreserved, 93 : unsigned short erruid; 94 : unsigned short errpid; 96 : 97 : struct extcountryinfo-t { 98 : Char signature; 99 : unsigned short length; 100 : unsigned short countrycode; 101 : unsigned short codepage; 102 : unsigned short dateformat; 103 : 104 . 105 : 106 : 107 : 108 : 109 : 110 : 1 1 1 : 1 12 : 113 : 1 14 : 1 15 : 1 16 : 118 : 120 : 1 2 1 : 122 : 123 : 124 : 126 : 127 : struct dos65table-t { / * DOS ファンクション 65h が返すテ - フ・ルが指し示すたフ・ル 128 : / * 残りの構造体のハ・仆数 unsigned short length; table[ 1 ] : 129 : / * テ - フ・ル Char 130 : } : 1 3 1 : 132 : struct dos65return_t { 133 : Char signature; 134 : struct dos65table_t far *ptable; 135 : } : 136 : 137 : struct mcb-t { 138 : Char 139 : 1 40 : 1 4 1 : 1 42 : 143 : 144 : 145 : 146 : 147 : # i f 148 : #define __asm 149 : 150 : # i f _TURBOC_ char far *pcommandtai l; char far *pfcbl; char far *pfcb2; unsigned short spinit, ssinit; uns i gned shor t i p i n i t, CS i n i t ; 、ノ ・不 - 、ノ、ノ 値値 の。 ホホ期期 へ のの初初 行へへのの 1 、 ( し「し 置 正 訂 る れ さ 推所 体 . 生 造ん発 構の 張張工 拡拡曲 付付 てて 置置 前後 をを ス ? し 直直 のの。一 ト 額額ス の 体数 金金にに式式 、ノ 造 はは前後形形 号 7 「こ 号号のの点間間ル記 式 ロロ り・ の 0 の り ( 号号置記記額額時時 式式 ーな 切記記位貨貨金金、 換切 0 0 0 行 情 ( 造ド 区号りりの通通ははマ 12 変区 を 一ファョ号の記切切号 : : 号号 にの 己己号の 国子の一 記位点区区記 乃字中域 0 11 ワ 0 張別り籾ド付 貨単数付刻貨圓貨貨言刻 0 0 ビ文朴約 拡識残わ日 - 一 も大予 通千小日時通 = = 通通時 のを へ字デ ワ 1 CO 0 0 字文 * 文の / , か ~ 2 宀子 0 ・ 0 currency[ 5 ] : thousands[ 2 ] : dec i ma 2 ] : datesep[ 2 ] : timesep[ 2 ] ; b i t f i e 届 : Char Char Char Char Char Char currencyplaces; timeformat; Char Char void far char char す 数 返 男ロ 識ガの の名 、ノ の後 体 用メ最ッ 、ノ 理 乃子構 管 , 男 1 ′ 0 ー 0 S ー gn : unsigned short ovner; unsigned short S ー ze : reservedC 3 ] : Char nameC 8 ] : Char def ined ( --TURBOC- / * Turbo C/C + + , Borland C + + asm 〉 0X200 / * Turbo C + + , Borland C + + MS ー DOS 非公開情報詳説 65

3. 月刊 C MAGAZINE 1993年9月号

X 68 k 活用講座 List 1 いよいよ最終回 長い間続いた本連載も , 次回て、終わりて、 す。やりのこしたこともたくさんありそう て、すが・・・ 次回て、は , 付録ディスクにサンプルゲー ムの最終バージョン , 記事のほうては連載 て、扱ったテーマをもう一度ざっとおさらい して締めくくりたいと思います。 game. h に追加した変数 330 : 331 : 332 : 333 : 334 : 335 : 336 : 337 : 338 : 339 : now_counter write—one blOCkO ( ) ; 340 : write—one—blockl ( ) : 341 : 342 : ha 1 f_def_data ニ 0b1 ー 0 ー 0 ー 1 ー 1 ー 1 ー 1 ー 0 ー 010 ー 0 ー 1111 : 343 : use half_tone = 1 : 344 : 345 : else if ( 面初期化く 0X1000 の 346 : 347 : 348 : 349 : 350 : 351 : 352 : 353 : 354 : 355 : 356 : else 357 : 358 : 359 : 360 : 361 : 362 : } if ( 面初期化 = 1 ) int i; 面初期化ー 2 ; for (i ニ 0 : i く 256 : i + + ) GPALET (), の : i 十十 ) for (i = 0 ; i く H-BLOCK-NUM * 16 + H BLOCK NUM; 0 int 1 : 面初期化 + = 1024 : for (i = 0 : i く 256 ; i + + ) if (g-paletCi] > 面初期化 ) palet-bufCi] ニ面初期化 : else paIet—bufCi] ニ g-palet[i]; palet—def = 1 ; List 231 :. 232:EXTERN BG_REG bg_array[32]; 233 : 234 : EXTERN int use_hal f_tone ; 235:EXTERN unsigned short half_def_data; 236 : 237 : EXTERN jmp_buf err_buf ; 238 :. ゲーム開始 = 1 : 面初期化 = 0 : LiSt 3 List 垂直帰線割り込み処理 if (this-no-is-useCi] ! = NO_USE) = spCi]; *sp_scr_reg 十十 vsync_counter; sp—is—ready = 0 : 886 : 887 : 888 : 889 : 890 : 891 : 892 : 893 : 894 : 895 : 896 : 897 : 898 : 899 : 900 : 901 : 902 : 903 : 904 : 905 : 906 : 907 : 908 : 909 : 910 : 911 : 912 : 913 : 914 : 915 : 916 : 917 : 918 : 919 : 920 : 921 : 922 : 923 : 924 : 925 : 926 : 927 : 928 : 929 : 930 : IRTE ( ) : 931 : 932 : } 841 : . 842 : / * 割り込み処理関数 * / 843 : 844:static CRTC_REG *const crtc 845 : 846. ・ VOid 847:vsync—disp (void) 848 : { 849 : *(short * ) 0Xe82500 = 0X09e4 : 850 : if (sp—is-ready Ⅱ request-def) 851 : 852 : / * SP スクロールレジスタを CPU に開放 * / 853 : *(short * ) 0Xeb0808 & = 0xffffd; 854 : 855 : / * PCG の定義を行う。 1 / 60 秒に 4PCG 最大とする。間に合うのか ? 856 : 857 : if (request-def) 858 : 859 : sprite def_req; if (def_req = request def) 860 : 861 : int anime = SP ANIME (def—req) ; 862 : do { 863 : 864 : int 1 ; for ( i ニ 1 : i く 128 ; i + + ) 865 : if (!pcg-is-use[i]) 866 : 867 : break ; if (i く 128 ) 868 : 869 : 870 : 871 : 872 : 873 : 874 : 875 : 876 : 877 : 878 : 879 : 880 : 881 : 882 : 883 : 884 : 885 : ()G REG * ) 0Xe2000 ; BG_REG *bg_top for (i = 0 : i く 32 : i + + ) *bg_top + + = bg_array[i] : *(short * ) 0Xeb0800 *(short * ) 0Xeb0802 *(short * ) 0Xeb0804 *(short * ) 0Xeb0806 / * SP,BG 表示り *(short * ) 0Xeb0808 ト 0X0203 : / * グラフィック画面スクロール * / *crtc = scro ll_data ; / * パレットを設定 * / if (palet—def) unsigned short * 1 = (unsigned short * ) 0Xe82000 ; unsigned short *P = palet buf; int i : for (i = 0 : i く 256 ; i + + ) pa let-def else unsigned short * 1 (unsigned short * ) ( 0Xe82000 + (PAL-C MIN * sizeof (short))) : unsigned short *p = c-palet; int i; fo 「 (i = 0 : i く PAL_C MAX ー PAL_C_MIN; i + + ) if (use-half-tone) *(unsigned short * ) 0Xe82600 = half-def-data; else *(unsigned short * ) 0Xe82600 = 0b1 ー 0 ー 0 ー 0 ー 0 ー 0 』一 0 ー 010 ー 0 ー 1111 : = (CRTC_REG * ) 0Xe80018 ; pcg—is_use[i] SP_PCG NO (def_req, anime) DEF_SP (), SP_PCG_DATA (def anime)); } while (--anime > : の ; SP_DEFI NED (def_req ) def reques t if (sp—is-ready) int i; SP_CTRL *S p disp—sp; SP_CTRL *sp_scr_reg ニ (SP_CTRL * ) 0Xeb0000 : / * スプライトスクロールレジスタ書き込みり for (i i く 128 : i + + , sp_scr_reg + + ) C MAGAZINE 124 1993 9

4. 月刊 C MAGAZINE 1993年9月号

プラの力を借りないて℃言語だけて、「ちゃん C のそれとはだいぶ違うという認識なのて、 , 時間といったところて、しようか。いちおう , とくに「ゲームプログラムをやってみたい」 横 18 タイル縦スクロールを実現して , マッ としたラスタースクロールゲーム」が記述て、 と思って X680X0 シリーズを購入された方々 きたのて、す。 プデータもそれにあわせて書き換えを行い が , 「アセンプラて、なくちやダメ」といった おもしろいゲームは , 高度なプログラム 認識を持たれるのが恐いのて、す。 だけて、て、きるのて、はなく , むしろアイデア ラスタースクロールーてみ と綿密に設計されたグラフィックやスプラ このチャレンジはそこそこの成果を納め よう たようて、 , 初代 X68000 10MHz て、もこのサ イトのデータ構造や管理方法のほうが重要 最近は , このゲームプログラムの作成に ンプルゲームはちゃんと動きます。アセン て、す。最初は , X-BASIC て、作って BtoC て℃ も X68030 を使うようになっていたのて、 , コ ラスタースクロールと半透明を実現する処理 ( map. c) ンパイル時間は従来の 1 / 3 程度に短縮されて います。もし , X68000 10MHz て、処理が間 に合わなかったら「 X68030 専用て、す」て、逃げ てやろうと思っていました。こんなことを 思うからバチが当たったのて、しよう。そう 簡単には思うように動いてはくれませんて、 本連載て、 , 何度かラスタースクロールを 扱いましたが , やり方は目を覆いたくなる ようないい加減な方法て、した。画面上の Y 座 標に対応するラスター位置を正確に把握し てプログラムしたわけて、はなかったのて、 , そのようなデータを得るために多大な時間 を消費してしまいました。 自分て、は , スクロールさせた量とマップ データの位置て、ラスタースクロール範囲を 計算させたツモリなのに , 何度やってもち ゃんと指定した範囲に納まってくれないの て、す。ただ単に「いい加減」な値て、計算した のて、はうまく動くはずがないってことだっ たのて、すが・・・ もうひとつ , ラスタースクロールに ' わったわけがあります。それは , 「ラスター スクロールのような重い処理は , C のような 。級て、は無理。アセンプラて、なくっち [ÄJ に一口ロ やダメ」といった風潮を打破したいがためて、 もあります。 一般的に , アセンプラのほうが記述やと くにデバッグが難しいために , 速度を要求 されるゲームプログラムて、はアセンプラブ ログラミングが一種のカリスマ的な次元ま て、あがめられる傾向があります。私は , 確 かにアセンプラの処理速度は認めますが , アセンプラブログラミングの敷居の高さは 、 0 List l:#include "game. h ” 2 : 3 : / * #define MAP—IS—FILE * / 4 : 5:#ifndef MAP_IS_FILE 6:#include ”図 ata. h ” 7:#endif 8 : 9:#incIude ” sindata. h ” 10 : ll:static int 面初期化 : 12 : 13 : Vram 書き込みアドレスり 14:static unsigned char *vramO = (unsigned char の ( 0XC80000 - 0X400 * 272 ) ; 15:static unsigned char * v 「 a 田 1 = (unsigned char の ( 0Xd00000 ー 0X400 * 272 ) : 16 : 17:static int now_counter; 18 : s tat i c uns i char *map data—ptr0 : 19:static unsigned char *map—data—ptrl; 20 : 21:#define RASTER—MIN 40 22:#define RASTER—MAX RASTER—MIN + 512 23:#define RASTER_STEP 32 24 : 25:static int *raster—map; 26:static int scroll_counter; 27:static short do_raster; 28:static short start_raster = RASTER MIN; 29:static short end_raster = RASTER_MIN; 30:static int index_val : 31 :static CRTC_REG raster_val; 32 : 33 : / ネ 16 * 16 矩形を指定された Vram アドレスに書き込み * / 34 : 35:#ifdef SOPT_TRANS 36:static void 37 : wr i te_vram (uns igned short *vr, uns short *dat) 38 : { 39 : int i; fo 「 (i = 0 : i く 16 : i + + ) 40 : 41 : 42 : 43 : 44 : 45 : 46 : 48 : 49 : 50 : 51 : 52 : 53 : 54 : 55 : 56 : 57 : 58 : 59 : 60 : 62:#eIse 63:#define DMA_SENS 64 : ( { register int d0 asm ("d0") ; 65 : d0 = 0x8d; asm volatile ( ” trap # 15 ”・” = d ” ( d の : ” 0 ” ( d の ) : 66 : unsigned short *P = vr; 事 p + 十 : *dat 十十 : * p + + ニ *dat 十十 : * p + 十 = *dat + 十 : 事 p 十十 = *dat 十十 : * p 十十 : *dat 十十 ; * p + 十 : *dat 十十 ; * p + 十 = *dat 十十 : vr + = 0X200 : 0 120 C MAGAZINE 1 的 3 9

5. 月刊 C MAGAZINE 1993年9月号

List 1 言語に変換して高速化するのもいいて、しよ う。て、すが , 泥縄的になりがちなインタブ リタ言語から ( X ー BASIC は泥縄になりにく い構造はしています ) きちんとデータ構造か ら設計を行うプログラミングに慣れていか ないと , 絶対に壁にぶちあたります。 X680 00 て、は , C 言語て、「ラスタースクロール」程度 のことはて、きることはわかりました。「遅 い , 遅い」と昨今いわれ続ける X68000 シリー ズて、すが , アクション系ゲームを個人て、作 成するにはまだまだ十分なパワーを持った マシンて、す。ぜひ , チャレンジしてみてく ださい 実際のコーティング List 1 が実際にサンプルゲームて、使ってい るラスタースクロールと半透明を実現する 処理を記述した map. c て、す。仕事のあとの貴 重な睡眠時間 2 日分を消費してくれた「苦労 の結品」て、す ( そこまて、いうかあ ? ? ) 。 指定ラスター位置て、の割り込みは , ゲー ムが始まった直後から常時行われるように なっています。この割り込みの登録は utile s. c の画面関係初期化の関数て、行われます。 初期化時点て、マップデータを解析して , グ ラフィックの横ライン数の何本目を描画し た位置からラスタースクロールを開始して , 何本目て、ラスタースクロールを終了するか をあらかじめ計算しておきます。 さんざん行ったテストの結果 , 256X256 高解像度 31KHz 水平周波数て、は , おおむね 40 ラスターが表示開始位置 , そこから 512 ラ スターて、表示終了というくらいて、プログラ ムを行えばうまく動くようて、す。市販品の ゲームのように何種類かの画面モードに対 応するためには , 各モードて、のラスター開 始位置等を確認して ( 本当は CRTC に設定す る値から計算て、きるハズて、す ) モードに応じ た処理を行うのが適切て、しよう。 マップデータを解析した結果から , 実際 のスクロール量を計測してラスタースクロ ール開始位置が画面に表示されたら「ラスタ fo 「 (i : 0 : i く 256 : i + + ) map-data[i] = xmalloc (sizeof (short) * 256 ) : 155 : 156 : 157 : 158 : 159 : int I,J; 160 : unsigned short *p; 161 : uns i char *q , for (i : 0 : i く 256 : i + + ) 162 : 163 : 164 : fread (gbuf, sizeof (gbuf), s i zeof (char) , file); 165 : P = map-data[i] ; 166 : q = gbuf; for (j = 0 : j く 256 : j + + ) 167 : 168 : 169 : 170 : fclose (file) : 171 : 172:#ifdef MAP_IS_FILE strcpy (name, LOAD_DIR) : 173 : fiIe_name[5] = 174 : s trcat (name, f i le name) ; 175 : fiIe—nane[5] : 176 : file = fopen (name, ” rb ” ) : 177 : if (!file) 178 : game-abort ( " マップデータファイルがありません” ) : 179 : map-data-ptr0 = x 皿 110C (now-counter = filelength (fileno (file))) ; 180 : fread (map—data—ptrO, now_counter, sizeof (char), file) : 181 : fclose (file) : 182 : 183 : # else map—data-ptr0 = MAP—DATA—PTRO; 184 : 185 : map—data—ptrl = MAP—DATA—PTRI; if (sizeof (MAP-DATA-PTR のト sizeof (MAP-DATAMRI)) 186 : game-abort ( " マップデータ異常 " ) : 187 : now—counter = s i zeof (MAP—DATA 円 R の : 188 : 189 : 190 : int i, J; unsigned char buf[H—BLOCK_NUM] : 191 : 192 : uns igned char *P : 193 : p ニ map—data—ptrO : for (j = 0 : j く sizeof (MAP—DATA-PTR の / H_BLOCK-NUM; j 十 + ) 194 : 195 : for (i ニ 0 : i く H—BLOCK_NUM; i + + ) 196 : 197 : fo 「 (i = 0 : i く H_BLOCK_NUM; i + + ) 198 : 199 : p + = H_BLOCK_NUM; 200 : 201 : p - map—data—ptrl : 202 : for (j = 0 ; j く sizeof (MAP—DATA-PTRI)/ H_BLOCK-NUM; j + 十 ) 203 : 204 : for (i = 0 : i く H—BLOCK_NUM; i + + ) 205 : buf[i] = 206 : * p 十十 : for (i = 0 : i く H_BLOCK_NUM; i + + ) 207 : 208 : p + = H_BLOCK_NUM ; 209 : 210 : 211 : 212:#endif 213 : int 214 : 1 ; int 215 : counter ; 216 : raster_map x 110C (sizeof (int) * (now—counter/ H-BLOCK-NUM + 1 ) ) : 217 : 218 : counter for (i = 16 ; i く now_counter / H-BLOCK-NUM; i + + ) 219 : 220 : 221 : 222 : 223 : 224 : 225 : 226 : 227 : 228 : 229 : 面初期化 = 1 : 230 : 231. 232 : 233 : ・ VOid 234. 235:raster-scr011 ( ) 236 : { static short count; 237 : static short last; 238 : static short next = RASTER—MIN; 239 : / * ラスター位置指定レジスタアドレス * / 240 : short *next-inter = (short * ) 0xe8 圓 12 : 241 : 0 uns igned char dat - map-data-ptr0 [s i zeof (MAP-DATA-PTR の counter 十 = 32 : = RASTER_DATA) if (dat ras ter map [ i ー 16 ] = else ras ter—map [ i ー 16 ] - i * H_BLOCK_NUM] : counter : C MAGAZINE 1993 9 122

6. 月刊 C MAGAZINE 1993年9月号

TabIe 8 カーソル表示 NEC-MOUSE TabIe 7 マウスの初期化 NEC-MOUSE MS-MOUSE く NEC-MOUSE と同じ > く NEC-MOUSE と同じ> MS-MOUSE く NEC-MOUSE と同じ > く NEC-MOUSE と同じ > 入力 AX : 01 H 出力なし TabIe 9 カーソル消去 NEC-MOUSE 入力 AX ニ 00H 出力 AX ニ環境状態 ー 1 : マウスが使用できる環境 0 : マウスが使用できない環境 BX : ボタン数 TabIe 10 カーソル位置の取得 NEC-MOUSE MS-MOUSE く NEC-MOUSE と同じ > <NEC-MOUSE と同じ > 入力 AX = 02H 出力なし Table 1 1 マウスカーソル形状の設定 NEC-MOUSE 入力 AX : 09H BX ニカーソルの中心点の 水平座標 CX : カーソルの中心点の 垂直座標 ES : DX : カーソルの形を決 定するテータのアドレス MS-MOUSE く NEC-MOUSE と同じ> BXCbitO] ニ左ボタンの状態 0 : 離されている 1 : 押されている BX[bitI ] : 右ボタンの状態 0 : 押されている 1 : 離されている く NEC-MOUSE と同じ > く NEC-MOUSE と同じ > 入力 AX = 03H 出力 AX = 左ボタンの状態 0 : 離されている ー 1 : 押されている BX : 右ボタンの状態 0 : 離されている ー 1 : 押されている CX : カーソルの水平位置 DX : カーソルの垂直位置 TabIe 12 水平方向のカーソル移動範囲の設定 NEC-MOUSE 入力 AX : 1 OH CX = 最小位置 DX : 最大位置 出力 なし MS-MOUSE く NEC-MOUSE と同じ > く NEC-MOUSE と同じ > 出力なし TabIe 13 垂直方向のカーソル移動範囲の設定 NEC-MOUSE 入力 AX : 1 1 H CX ニ最小位置 DX = 最大位置 出力なし MS-MOUSE AX = 08 H MS-MOUSE AX : 07 H く NEC-MOUSE と同じ > く NEC-MOUSE と同じ > く NEC-MOUSE と同じ> マウスのカーソル位置とボタン押下状態を取得 く NEC-MOUSE と同じ> く NEC-MOUSE と同じ > く NEC-MOUSE と同じ > List 3 List 33 マウスドライバを初期化する 1 : #include く dos. h 〉 2 : 3 : typedef struct ぐ 4 : short mX; 5 : short mY; 6 : / * bit0:left, bitl:right * / unsigned mButton; て : ー } VMouser 8 : 9 : VO i は mouse-getpos (VMouse* mp) union REGS 、 regs; 12 : 13 : regs. X. ax = 3 : int86 ( 0X33 , &regs, &regs) : 14. 15 : mp- >mX ニ regs. X. CX : mp—> mY 言「 egs. X. dx : 一 ~ / * bi t0 : 左ボタン , b i tl : 右ボタン * / 17 : if (is-ms-mouse) 18 : / * 各ビットが一なら ON , 0 なら OFF * / np->mButton = regs. X. bX & 3 : else { 19 : 20 : ノ * NEC-MOUSE はボタンの ON / OFF 状態を次のように返す * 左ボタン : AX = O:OFF, ー 1 : ON 22 : * 右ボタン一 : BX = O:OFF, ー 1 : ON 23 : * これを MS-MOUSE の形式に変更する 24 : 叩ー〉祁 utt 囲 = (regs ・ x. ? 、い : の一 (regs. x 、 bx ? 2 ー 0 ) : 25 : ・ 26 : 1 : $include く dos. 3 : static int is-ns-mouse ま 0 : / * NEC-MOUSE = 0 第 MS-MOUSE = 1 * / 4 : 5 : int mouse-init(void) on REGS regs; 8 : / * ( l) マウスドライバの初期化町 9 : regs. X. ax ゴ 0 ; 10 : int86 ( 0X33 、 &regs, &regs) : の一なマウスドライバなし * / if (regs. X, ax ニ 12 : return 0 ; / * ( 2 ) NEC-MOUSE か MS ー MOUSE かを見分ける . ′ * / regs. X. ax を i n t86 ( 0X33 , &regs, &regs) : ー is-ms-mouse ら (regs.x. ax = 3 ) : / * ax が壊れなければ MS-MOUSE である * / / * マウスドライバあり * / return l; 20 : 46 C M AGAZIN E 1993 9

7. 月刊 C MAGAZINE 1993年9月号

特集実践 C テクニカルファイル て、は AX レジスタに左ボタンの状態を返すの 行した後ならば , is ms mouse 変数には組 unsigned mButton ・ に対して , MS ー MOUSE て、は AX レジスタの } VMouse , み込まれているドライバが ,NEC-MOUSE 内容を壊さないことを利用している。 この構造体のメンバ mX にはマウスカーソ なら 0 が , MS-MOUSE なら 1 が格納されて この例のようにふたつのドライバの区別 ルの水平位置を , mY にはマウスカーソルの いるはずて、あるから , はドライバの初期化関数の処理として行っ 垂直位置を , mButton にはボタン押下状態 if ()S ms mouse) てしまうのがよいだろう。そうすれば , 初 を格納する。 期化関数を実行したあとのマウス操作関数 mButton への格納形式て、あるが , こて、 て、この情報を利用することがて、きるからぞ は MS - MOUSE の形式に合わせておこ フ。 ある 0List 33 ( 46 頁 ) て、は is ms mouse( とい 左ボタンが , う static な ) 変数にこの情報を残している。 OFF 状態なら , bit0 に 0 次の [ 例題 21 ] に示すマウス操作関数て、は ON 状態なら , bit0 に 1 この変数を利用してドライバの区別を行っ を格納する 右ボタンが , ている。 OFF 状態なら , bitl に 0 ON 状態なら , bitl に 1 を格納する マウスカーソルの位置や , ボタンの押下 という具合て、ある。 状態を得るには , 再び < カーソル位置の取 List 33 ( 46 頁 ) の mouse init( ) 関数を実 得 > ファンクションを実行すればよい 月リ 水平方向のカーソル移動範囲を設定 述したようにこのファンクションて、はボ、タ ンの ON, OFF 状態の格納形態がふたつのド ライバ間て、大きく違っている。具体的には , ・ NEC-MOUSE では , 左ボタン→ AX が 0 なら OFF ー 1 なら ON 右ボタン→ else て、 , ふたつのドライバの処理を分けること がて、きる。 MS-MOUSE が組み込まれている場合な ら , 素直に regs. x. bx & 3 , mp->mButton とすればよいし , NEC-MOUSE が組み込ま れている場合なら , MS-MOUSE の形式に 変換するために (regs. x. ax ? 1 : 0 ) mp- > mButton (regs. x. bx ? 2 とすればよい。この関数が List 34 ( 46 頁 ) て、 ある。 [ 例題 21 ] マウスカーソル位置 とホタンの押下状態を取得 List マウスカーソルの移動範囲を設定するに は , < 水平方向のカーソル移動範囲を設定 する > ファンクションと , < 垂直方向のカー ソル移動範囲を設定する > ファンクション のふたつのファンクションを使用する必要 がある ( もちろん水平 , または垂直移動範囲 のどちらか片方のみの設定もて、きるが , た いていの場合 , これて、は足りないだろう ) 。 TabIe 12 ( 46 頁 ) , TabIe 13 ( 46 頁 ) に注目し どちらの項目もファンクション てほしい 番号 ( 入力 AX の値 ) が異なるだけて、 , 移動距 離の与え方はふたつのドライバとも同じて、 ある。 [ 例題 22 ] マウスカーソルの 移動範囲を設定 1 : #include く dos. h 〉 2 : 3 : VOid mouse_limit-x(int xmin, int xmax) 5 : un i 0 Ⅱ REGS regs : 6 : 7 : is_ms_ mouse ? 7 : 0X10 : regs. X. aX 8 : regs. X. CX xmn; 9 : regs. X. dX ニ xmax : 10 : int86 ( 0X33 , &regs, &regs) : List 36 BX が 0 なら OFF ー 1 なら ON ・ MS-MOUSE では 左ボタン→ BX の bit0 か 0 なら OFF 1 なら ON 垂直方向のカーソル移動範囲を設定 1 : #include く dos. h 〉 2 : 3 : void mouse-limit-y(int ynin. int ymax) 5 : union REGS regs : 6 : 7 : i S_ms -mouse ? 8 : 0x11; regs. X. ax 8 : regs. X. CX ym ー n : 9 : regs. X. dX = ymax : ⅲ t86 ( 0X33 , &regs, &regs ) ; 右ボタン→ BX の bitl が 0 なら OFF 1 なら ON て、ある。また , この関数て、はボタンの状態 のほかにもカーソル位置を得る必要がある。 こて、 , 以下のような戻り値を格納するた めの構造体を用意することにしよう。 typedef struct { short mX ; short mY Fig. 8 それそれのドライノヾにあうファンクション番号を設定 水平方向の移動範囲を設定する場合 ファンクション番号ニ i s_ ? 7 / * MS-MOUSE * / : 0X10 / * NEC-MOUSE * / ; m 0 u S e 垂直方向の移動範囲を設定する場合 ファンクション番号 = is- ? 8 / * MS-MOUSE * / m S mouse : 0X11 / * NEC-MOUSE * / ; 特集実践 C テクニカルファイル VOI. 2 47

8. 月刊 C MAGAZINE 1993年9月号

X 68 k 活用講座 LiSt 1 ール開始」のフラグをたてて , 実際 ースクロ にラスタースクロールを行います。 最初は , 画面上方から画面中程まて、がラ スタースクロール範囲になります。スクロ ール範囲の画面上て、の下限がゲーム進行に 応じて下方に移動していきます。これを管 理している変数が end raster て、す。画面全体 がラスタースクロールを行うようになると , end raster は実際には存在しないラスター位 置まて、値が大きくなります。これをそのま ま設定すると「ハマリ」ます。存在しないラ スター位置て、割り込みを設定すると二度と 割り込まなくなってしまいます。最初はこ れにやつばり「ハマリ」ました。 最終ラスター位置の値を , カット & トラ イて、設定するという非科学的な方法て、設定 したのは私て、す。 次に , マップが進行していって , ラスタ ースクロール終了位置が画面に表示される と , ラスタースクロール範囲の上限が画面 下方に向かって移動するようになります。 これを管理しているのが start raster< す。 start raster が最終ラスターを越えて移動し た時点がラスタースクロールの終了てす。 TabIe 1 に List 1 の説明をまとめておきま す。 今回のテーマて、ある半透明機能を忘れる ところてした。半透明機能は , 垂直帰線割 り込みて設定を行っています。 List 2 は gam e. h に追加した変数て、す。 int use half tone 半透明機能を有効にするフラグて、す。実 際には割り込み処理て half def data をポ ートに設定します。 unsigned short half def data 割り込み処理て実際にポートに設定する データをセットしておきます。 List 3 はかなり肥大化した垂直帰線割り込 み処理てす。スプライトの処理 , グラフィ ックパレットの変更 , バックグランドの書 き換え , スクロールレジスタの設定 , 半透 明機能の設定と , ゲームの重要な部分をす べて引き受けるもっとも下位の関数てす。 242 : スクロールレジスタアドレス * / if (do—raster) 243 : 244 : 245 : / * スクロールレジスタアドレスり CRTC REG *crtc = (CRTC_REG * ) 0Xe80018 : 246 : short difs = sin—tbl[index_val][count] : 247 : 248 : next + = RASTER_STEP : if 0 last 報 end-raster く RASTER HAX & & end く next) 249 : ras ter 250 : 251 : next = end_raster; 252 : last 253 : else if (next 〉 RASTER—MAX) 254 : 255 : last : if (last) 256 : 257 : if (start—raster > RASTER_MIN & & start 258 : く RASTER_MAX) raster 259 : next S tart_ras ter : 260 : else 261 : next = RASTER MIN; 262 : last = count = difs = 0 ; 263 : 264 : raster—val. sc2—x—reg = raster—val. sc3 scroll data. sc2_ + difs; _reg —x—reg X 265 : *crtC = raster_val; 266 : 267 : else 268 : next = RASTER_MIN; / * 次回割り込み位置を指定する * / 269 : *next_inter = next; 270 : 271 : count 十十 ; if (count > 32 ) 272 : 273 : count = 0 : IRTE ( ) ; 274 : 275 276 : 277. ・ VOid 278 : 背景移動処理 (void) 279. 280 : static int cont = 0 : 281 : static int cont_block = 0 ; if ( ! 面初期化 ) 282 : 283 : if ( ! 面クリア ) 284 : 285 : 286 : 287 : 288 : 289 : 290 : 291 : 292 : 293 : 294 : 295 : 296 : 297 : 298 : 299 : 300 : 301 : 302 : 303 : 304 : 305 : 306 : 307 : 308 : 309 : 310 : 311 : 312 : 313 : 314 : 315 : 316 : 317 : 318 : 319 : 320 : 321 : 322 : 323 : 324 : 325 : 326 : 327 : 328 : 329 : ・ 1 ・ 1 = PAL_C_MIN + (cont > > 2 ) % (PAL_C_MAX ー PAL_C_MIN) : = 0 ; i く PAL—C-MAX ー PAL_C_MIN; i 十十 ) c-palet[i] = g-palet[j]; if ( + + j > PAL-C-MAX) j = PAL_C_MIN; i f (cont—bl ock く H-BLOCK—NUM) now_counter write—one—bIockO ( ) : write—one—blockl ( ) : if (cont & 1 ) scroll_data. scO—y—reg scro 1 1 data. scl_y_reg scrol l_data. sc2—y—reg scro 1 1 data. sc3—y—reg : scro 1 1 _data : ras ter va 1 sc 「 011_counter 十 : 2 ; if ( + + index-val > 31 ) index val i f ( ras ter-map [scro ll—counter/32] ) end_ras ter + = 2 ; i f (end—ras ter > RASTER—MIN + RASTER STEP) do_ras ter : if (end—raster > RASTER—MIN & & raster—nap[scroll-counter/32] s tart_ras ter + : 2 ; i f (s tart—raster > RASTER—MAX ー RASTER STEP) do raster : 0 : end_raster = start—raster = RASTER MIN; cont 十十 : if ( + + cont—block > 31 ) cont_block = 0 ; if (now_counter : : 面クリア = 1 : return : X68k 活用講座 123

9. 月刊 C MAGAZINE 1993年9月号

用して , Fig. 8 ( 47 頁 ) のようにそれぞれのド ライノヾにあうファンクション番号を設定す そこて、 , 22 : } 55 : } こて、も is ms mouse 変数を使 List 37 マウスカーソルの形式を設定する 1 : # i ncl ude く dos. い ればよい。この関数を List 35 ( 47 頁 ) , t 36 ( 47 頁 ) に示す。 Lis 2 : 3 : 5 : 6 : 7 : 8 : 9 : 10 : 12 : 13 : 14 : 19 : 20 : VOid mouse-setform(int X, int y, VOid* pattern) 引数 xmin, ymin には , それぞれ水平方 向 , 垂直方向の移動範囲の最小値を , xma x, ymax には , それぞれ移動範囲の最大値 を与える。たとえば , マウスカーソルの移 動範囲を (x : 300 , y : 100 ) ~ (x : 400 , y : 200 ) の矩形内に設定するのなら , mouse li mit x( ),mouse limit Y( ) のふたつの関数 形状を設定 [ 例題 23 ] マウスカーソルの というようにすればよい mouse limit_y ( 100 , mouse limit x ( 300 , を使って , 200 ) ; 400 ) ; て , NEC ー MOUSE て、はカーソルマスクだけ OR'€ターン ) のふたつを設定するのに対し とカーソルマスク ( AND 後の画面に対する X リーンマスク ( 下地に対する AND パターン ) るだろう。ただし , MS-MOUSE て、はスク ァンクション 9 を実行すればよいことがわか OUSE, MS-MOUSE の両ドライバとも , フ スカーソルの形状を設定するには , NEC ー M Table 11 ( 46 頁 ) に注目してほしい。マウ を設定する。 0 32 バイトにカーソルマスクを与えなければ 6 ビット x 16 ) にスクリーンマスクを , 後半 にあわせて , 引数 pattern の前半 32 バイト ( 1 カーソルバターンは MS ー MOUSE の形式 まずはこれを注意深く読んて、いただきたい このための関数を List 37 ( 48 頁 ) に示す。 List 38 un i on REGS regs , s truc t SREGS sregs : regs. X. ax ま 9 : / * パターンの水平方向の中心点 * / regs. X. bX ニ X : / * パターンの垂直方向の中心点 * / regs. X. CX ニ y; if ( ! is_ms_mouse) { char buf ロ 6 * 2 * 2 ] ; / * buf の前半分にパイト順を入れ換えたカーソルマスクを置く * / svab((char*)pattern + 32. buf, 32 ) ; / * 後半分はクリアしておく * / menset(buf + 32, 0 , 32 ) : pattern ニ buf; ニ FP_0FF(pattern); regs. X. dX ニ FP_SEG(pattern) : sregs. eS ⅲ t86x ( 0X33. &regs, &regs, &sregs); マウスカーソルを十字に変更するサンプルプログラム 3 : 4 : 6 : 7 : 8 : 9 : 10 : 12 : 13 : 16 : 17 : ・ 18 : 19 : 20 : 22 : 23 : 24 : 25 : 26 : 27 : 28 : 29 : 30 : 31 : 32 : 33 : 34 : 35 : 36 : 37 : 38 : 39 : 40 : 41 : 42 : 43 : 45 : 46 : 47 : 48 : 49 : 50 : 52 : 53 : 54 : 1 : # i ncl ude く std i 0. h> 2 : #include く dos. h> int main(void) static short csr_plusC16*2] 0xfc7 f, 0xfc7f, 0xfc7fi 0xfc7f, 0xfc7f, 0xfc7f, 0X0001 , 0X0001 , 0X0001 , 0xfc7f, 0xfc7f, 0xfc7f, 0xfc7f, 0xfc7f, 0xfc7f, 0xffff, 0X0000 , 0X0100 , 0X0100 , 0X0100 , 0X0100 , 0X0100 , 0X0100 , 0x7ffc, 0X0100 , 0X0100 , 0X0100 , 0X0100 , 0X0100 , 0X0100 , 0x 圓 00 , 0X0000 , VMouse mp; ならない こて、思い出していただきたい のが NEC ー MOUSE て、はカーソルマスクだけ を必要とするというこ . とて、ある。このため , 組み込まれているドライバが NEC-MOUSE なら pattern の後半 32 バイトのみを使用する ようにするための処理を行う必要がある。 この処理を行っているのが , if (!is ms mouse) { 48 C MAGAZINE 1993 9 if (!mouse-init()) { mouse-setform(), 7 , csr-plus) : return, puts ( " マウスドライバが組み込まれていません . ' 第 / * マウスカーソルを表示する * / vhile (I) { mouse_show_cursor() : break; if (mp. mButton) mouse-getpos(&mp); / * ボタンをクリックするとプログラムを終了する * /

10. 月刊 C MAGAZINE 1993年9月号

新発売を 仮想メモリライプラリ マジ、一ル 定価 9 , 800 円 ( 消費税別 ) X 68 k 活用講座 「マジックファイル」は小さなメモリで大き なファイルなどを効率良くアクセスするた めの、 C 言語プラグラミング支援ライプ ラリです。 1 .8086CPU で Long 長の仮想メモ功く複数個 扱えます 2 . 仮想メモリへのアクセスはすべて関数を 通じてアクセスします。メモリプロックのロック 等を意識する必要がありません。 3. 仮想メモリ内のプロンク転送が瞬時に行え ます。 4 . 主記憶、 EMS 、 XMS 、外部記憶を効率よく 統合化できます。 本ソフトにはサンプルプログラムとして工 デイタ (PicoSoft EDITOR) を添付し ています。 「マジックファイル」を使用して作成した 工デイタ本体とエデイタのソースコードが 含まれています。 ( ライプラリソースコードは 含まれておりません ) List 1 68 : )) 69 : 70:#define DO-DMA(BUP, DAT) 71 : do { register int d0 asn ( ” d0 つ : register int dl asm ( ” dl " ) ; register int d2 asm ( ” d2 " ) ; 73 : register VOid 事 al ("al"); reg i S ter VO id *a2 asm ( " a2 ” ) ; d0 = 0x8b : dl = 0b1 ー 000 ー 01 ー 01 ; 77 : d2 = 16 : 78 : al = (BUF) : a2 = (DAT) ; asm ( 80 : ” trap # 15 ”・ 81 : 82 : 83 : } while ( の : 84 : 85:typedef struct 86 : ( 87 : unsigned char *addr; 88 : unsigned short count; 89 : ) array—chain : 90 : 91:static void 92 : ” i te_vran (uns igned char *vr. uns igned char *dat) 93 : { int i; 94 : static array-chain bufC16]; 95 : 96 : while (DMA SENS) 98 : for (i ニ 0 : i く 16 : i + + ) 99 : bufCi]. addr 100 : buf[i]. count = 32 ; 101 : vr + = 0X400 ; 102 : 103 : 104 : DO_DMA (buf, dat); 105 : } 106 : 107:#endif 108 : 109 : void write-one—blockO ( ) 110 : { static int write—count; 111 : 112 : write_vram ( a , (unsigned char の聞 p data[nap-data—ptr0[now—counter]]) ; 113 : vran0 + : 32 : 114 : write—count + + ; i f ( 響ⅵ te—count = = H-BLOCK—NUM) 115 : 116 : wr i te_count = 0 ; 117 : ” a ー = ((H—BLOCK—NUM * 32 ) + 0X400 * 16 ) ; 118 : i f (vramO く (uns igned char の 0XC0000 の 119 : ” a 用 0 = (unsigned char の ( 0XC80000 ー 0X400 * 16 ) : 120 : 121 : 122 : } 123 : 124 : void write—one—blockl ( ) 125 : ( 126 : static int write—count; 127 : write—vram ( a 田 1 , (unsigned char の map—data[map—data—ptrl[now—counter]]) : 128 : vraml + = 32 ; 129 : write_count + + : if (write—count = H—BLOCK-NUM) 130 : 131 : write_count = 0 : 132 : vranl - = ((H—BLOCK-NUM 事 32 ) + 0X400 本 16 ) : 133 : i f (vraml く (uns i gned char の 0XC8000 の 134 : a = (unsigned char 事 ) ( 0Xd00000 - 0X400 事 16 ) : 135 : 136 : 137 : } 138 : 139 : void ロードマップ (int 面 ) 140 : { static char file name ロ = "han. dat ”・ 141 : char na [ 128 ] : 142 : unsigned char gbuf[256] : 143 : 144 : FILE *file; file-nane[3] + = 面 : 145 : strcpy (name, LOAD-DIR) : 146 : strcat (nane, file name) : 147 : file ニ fosm (name, ”「 b " ) : 148 : if (!file) 149 : ganeN)rt ( ”マップファイルがありませんつ : 150 : fread (g-palet, sizeof (g—palet), sizeof ( c 「 ) , file) ; 151 : if (!nap-data[0]) 152 : 153 : 154 : d0 ; つアイを第 ) ー第ス ~ 動作環境 ライプラリ : MS-DOS 汎用。 Microsoft-C 、 Borland ー C とリンクで きます。 ェデイタ : PC ー 9801 / 9821 専用 PC ー 286 / 386 / 486 本ソフトはピコソ列咽が開発し、アンテナ ハウス株が販売する製品です お問合せ、お買求めは イアンテ -jJ コ株。部 〒 102 東京都千代田区ニ番町 1 ト 9 花ビル TEL 03-32 引 -9631 FAX 03-3221-9975 く資料請求番号 121 〉 X68k 活用講座 121 0