unsigned - みる会図書館


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

1. 月刊 C MAGAZINE 1993年10月号

98 & 00S / ゲー ムプロクラミンク大作戦 と音の余韻の時間のふたつを合わせたもの たとえばステップタイム ( 音長 ) に 8 , Q コ になる」ということて、す。これを表すために マンドが 4 に設定されている場合 , ゲートタ イムは ( ( 1 / 8 ) x 4 ) x 8 = 4 になります。これ プログラム側て、このようなことをしなけれ は「音全体の長さは , 実際に鳴っている時間 ばなりません。 このウェイトをどちらか外 List 1 0 ね。ステップタイムは音長 , ゲートタイム は実際に音が出ている長さを表します。 Q コ マンドはこれの比て、 , 通常 1 / 8 単位て、設定さ れます。 ドレミプログラム Li st 64 : 66 : 69 : 71 : 77 : / * 78 : void keyon(unsigned char ch) 79 : { music—outp(0x28, Oxf0 + (h) ; 82 : 83 : void keyoff(uns igned char ch) music—outp(0x28, (h) ; 88 : void wait(void) 89 : { long 1 = Ox2ffffL; while ( 1 ーー ) 93 : 94 : } 卩 97 : / * 98 : void main(void) 99 : { struct neiro_t neiro_data 100 : { 0X61 , 0X01 , 0X03 , 0X33 101 : { Ox1e, 0x1e, 0x0f, 0x0f 102 : { 0x5f, 0x5f, 0X94 , 0X94 103 : { 0X05 , 0X05 , 0X05 , 0X07 104 : 0X02 } , { 0X02 , 0X02 , 0X02 , 105 : 0xa6 } , ( 0X11 , 0X11 , 0X66 , 106 : 0x2c, 107 : 108 : unsigned Char octave = 4 : 109 : 110 : unsigned Char scale 111 : int i; 112 : の ; music_neiroout(&neiro_data, 113 : for ( i = 0 ; i く 8 : i + + ) { 114 : 115 : 116 : OC tave 十十 ; 117 : scale = 0 ; 118 : 119 : 120 : 121 : 122 : 123 : 124 : 125. 2 : 4 : 5 : #include く dos. h> 6 : 7 : 9 : struct neiro DT-MLC4] ; Char 10 : unsigned TL[4] ; 11 : uns i gned char KS-ARC4] ; unsigned Char DRC4]; uns i gned Char 13 : SRC4]; Char 14 : uns i gned SL-RR[4] ; uns i gned Char 15 : FB_ALG; 16 : uns i gned Char m-scale[] 19 : uns i gned i nt musical scale 20 : 0X26a , 0X2b6 , 21 : 0X30b , 22 : 0X339 , 23 : 0X39e , 24 : 0X410 , 25 : 0X48f , 26 : / * sharp data * / 0X28f , 0x2df, 28 : 29 : 0X30b , 0 x36a, 30 : 31 : 0X3d5 , 32 : 0X44e , 33 : 0X48f , 35 : ヨ 0 36 : 37 : / * 38 : VOid music_outp(unsigned char adr, unsigned char dat) 39 : ( 40 : 41 : 42 : 第 43 : 44 : 45 : 1 48 : ) 49 : 52 : void music—scale(unsigned char unsigned char octave, uns igned char ch) 53 : { music—outp()h + 0xa4, (octave くく 3 ) ー (m—scale[scale] 54 : music—outp()h + 0xa0, m—scale[scale]) : 55 : 56 : ) uns i gned char ch) 58 : VOid muSIC_neiroout(void *neiro. unsigned char adr2' *P nelt•o; int i : Program DOLeMi. ch + 0X40 ; adr adr2 = ch + 0X80 : adr2 + for (i ー 0 ; i く 4 ; i + + , adr + = 4 , music—outp(adr, 127 ) ; music—outp(adr2, 15 ) : adr = ch + 0X30 ; for ( i 0 ; i く 24 : i + + , adr + = 4 , music—outp(adr, (p) ; adr = ch + 0xb0 ; music—outp(adr, (P) ; int i; while (inportb(0x188) & 0X8 の adr) ; outportb(0x188, fo 「 (i = 0X20 : i > 0 ; outportb(0x18a, dat) ; の ; muslc_scale(scale 十十 , octave, keyon ( の : wait(); keyoff( の ; wait() : 98 & DOS / V ゲームプログラミング大作戦 115

2. 月刊 C MAGAZINE 1993年10月号

5 -0 非公開情報 0 Fig. 4 List 9 の実行例 E:YUSR 〉 test5d0a 拡張工ラー・コート・ 拡張巧ー・コート・ E: YUSR> ←起動時の拡張工ラー情報 . 0008 , 巧ー・クラス . 01 , 推奨される訂正措置 . 04 , 工ラーの発生箇所 : 04 . AAAA, ェラー・クラス・ BB, 推奨される訂正措置 . BB, 工ラーの発生箇所 : CC 設定した拡張工ラー情報 DOS ファンクション 50h と DOS ファンクシれます。 MS-DOS て、はファイルのオープン ョン 67h て、 20 個の制限を取り払うことも可能 ) ョン 51h は常駐プログラムて、ファイル関係のに関して通常 , 1 プロセスて、 20 個まて、という があるため , 常駐プログラムが自分専用の DOS ファンクションを使用するときに使わ制限 (DOS 3.3 以降て、あれはの OS ファンクシ PSP 領域を設定してファイルアクセスを行 ったのち , PSP を元に戻すために DOS ファ DOS ファンクション 5DOAh のテストプログラム ンクション 51h と対になって使用されます。 DOS ファンクション 51h を呼び出す関数を List 7(getpsp. c) に示します。使用例は Lis t 2 を参照ください List 9 1 : $include く stdiO. h> 2 : $include く dos. h> 3 : $include ” dosfunc. h" 4 : 5 : i nt mai n ( VO i d ) struct DOSERROR solderr, snoverr; / * 拡張工ラ - 構造体 8 : / * 拡張工ラ - 構造体 struct dosexterror_t serr; 9 : dosexterr( &solderr ) : / * 起動時の拡張巧 - ・コ - ト・の取得 * / 10 : printf( " 拡張工ラ - ・コ - ト・ : % 04X. 工ラ - ・クラス . % 02X , ”推奨される訂正措置 : % 02X , 工ラ - の発生箇所 : % 02X \ n ” / * 拡張巧 - ・ 1- ト・ 13 : solderr. exterror, ( unsigned char )solderr. class, / * 工ラ - ・クラス ( unsigned char )solderr. action, / * 推奨される訂正措置 * / 15 : ( unsigned char )solderr.locus ) ; 16 : / * 工ラ - の発生箇所 / * 拡張巧 - ・コ - ト・ / * bh : 工ラ - クラス , b に推奨される訂正措置 * / 20 : / * ch : 工ラ - の発生箇所 22 : 23 : 24 : 25 . 26 . 28 : 29 : 30 . 32 : 33 : 34 : 35 : 36 : 38 : 39 : 40 : 42 : 43 : 44 : 45 : 46 : 47 : 48 : 49 : 50 : 0 拡張工ラー設定 DOS ファンクション 5DOAh(TabIe 5 ) DOS ファンクション 59h て、次に返される拡 張工ラー情報を設定します。 MS ー DOS 3.1 以降て、は DOS ファンクション 59h て、より詳細 なエラーて、ある拡張工ラー情報を取得て、き ます。 DOS ファンクション 5DOAh は DOS フ アンクション 59h て、返される拡張工ラー情報 を設定するためのファンクションて、す。 用途としては DOS ファンクションの INT 21h をトラップする常駐プログラムが元の割 り込みハンドラを呼び出したあとて、 , その 結果に細工をするために別の DOS ファンク ションを使用するといった場合に使用され ます。別の DOS ファンクションを呼び出す と拡張工ラー情報が書き換えられる可能性 があります。したがって , その前後て、拡張 工ラー情報をセープ / リストアして元に戻し ておくわけて、す。 拡張工ラーを設定する関数を List 8(sete xerr. c) に , そのテストプログラムを List 9 (test5dOa. c) に示します。また , List 9 の実 行例を Fig. 4 に , コンパイル例を Fig. 5 に示 します。なお , DOS ファンクション 59h を呼 oxaaaa; Serr. = 0xbbbb; serr. errbx oxcccc; serr. errcx : 0xdddd; serr. errdx ()xeeee : serr. errsi : 0xffff; serr. errdi serr. errds : 0X1111 : : 0X2222 : serr. erres serr. erruid = 0X3333 : serr. errpid : 0X4444 ; serr. errreserved dos-setdosexterr( &serr ) : / * ユ - サ・印 0 : ロ - カル・コンヒ。ュ - タ / * フ。ロセス 0 : ロ - カル・フ。ロセス / * 予約 0000h / * 拡張巧 - の設定 dosexterr( &snoverr ) : / * 設定後の拡張工ラー・コ - ト・の取得 * / printf( " 拡張巧 - ・コ - ト・ . % 04X , 工ラ - ・クラス : % 02X , ”推奨される訂正措置 : % 02X , 工ラ - の発生箇所 : % 02 料 n ” / * 拡張工ラ - ・コ - ド snoverr. exterror, ( unsigned Char ) sno ー e 「「 . class. / * 工ラ - ・クラス ( unsigned char )snoverr. action, / * 推奨される訂正措置 * / ( unsigned char )snoverr.locus ) : / * 工ラ - の発生箇所 ( unsigned short )solderr. exterror; / * 拡張工ラーコ - ト・ * / ( unsigned short )solderr. class * 0X100 + solderr. action; / * bh : 工ラ - ・クラス , い : 推奨される訂正措置 * / ( unsigned short )solderr.locus * 0X100 : / * ch : 工ラーの発生簡所 serr. = serr. errbx serr. errcx serr. errdx serr. errsi serr. errdi serr. errds serr. erres serr. erruid serr. errpid serr. errreserved = 0 ; dos-setdosexterr( &serr ) : return( 0 ) ; す に 元 0 0 0 報 吐約張 ア予拡 MS ー DOS 非公開情報詳説 97

3. 月刊 C MAGAZINE 1993年10月号

M 0 非公開情報 0 List ist 28 : } 29 : 30 : int exec-ovlay( char path[], char cmdline[] ) 33 : 34 : 35 : 36 : 38 : 39 : 40 : i f ( ( cnd len : st ⅵ en ( cnd ⅱ ne ) ) > 126 ) / * コマンド・ラインが長すぎる return( 43 : strcpy( cnd80h + l, cmdline ) : / * コマンド・ラインコビ - 44 : c 面 80h [ ( c 面 80h [ 0 ] - ( char )cmdlen 46 : / * 新領域作成 fo 「メモリ分断対策 * / 48 : if ( dos-getstrategy( &oldstrategy ) ) 49 : の取得 / * ストラテシ・ return( -1 ) ; 50 : / * 上位メモリ・フ・ロックから割付け nevstrategy 52 : if ( oldstrategy / * 下位メモリ・フ・的クから割付け 53 : nevstrategy dos_setstrategy( nevstrategy ) ; / * ストラテシ・の設定 54 . pncb : MK-FP( -psp - / * 現領域の MCB セク・メント 55 : / * 自フ。ロセスの必要ハ。ラク・ラフ数 56 : nevsiz pmcb->size; pncb : MK-FP( * ( unsigned far * )MK_FP( _psp, ENVSEG ) - 58 : envsiz pmcb->size; / * 環境変数領域の必要ハ。ラク・ラフ数 * / 59 : #ifdef _MSC_VER i f ( _dos_allocmen( envsiz, &envseg / * 新環境変数領域の確保 * / 60 : Ⅱ -dos-allocmen( nevsiz, &nevseg ) ) / * 新フ。ロク・ラム領域の確保 62 : $endif 63 : $ifdef __TURBOC_ if ( allocmem( envsiz, &envseg ) / * 新環境変数領域の確保 * / 64 : Ⅱ allocnem( nevsiz, &nevseg ) / * 新フ。ロク・ラム領域の確保 66 : $endi f 67 : dos-setstrategy( oldstrategy ) : / * ストララシ・を元に戻す 68 : return( / * メモリ不足 69 : / * ストラテシ・を元に戻す dos-setstrategy( oldstrategy ) : paracopy( HK-FP( envseg, 0 ). MK_FP( * ( unsigned far * )MK_FP( _psp, ENVSEG ). 0 ) , 73 : / * 新領域に環境変数を北。 - envs i Z ) ; parac 叩 Y( MK-FP( nevseg, 0 ) , MK-FP( -PSP, 0 ) , nevsiz ) : 75 : / * 新領域にフ。ロク・ラムを北。 - if ( -dos_freemen( * ( unsigned far * )MK_FP( _psp. ENVSEG ) ) ) 77 : return( / * 現環境変数領域の解放 * ( unsigned far * )MK-FP( nevseg, ENVSEG ) - 80 : envseg , / * 新環境変数領域のセク・メント * ( unsigned far * )MK-FP( nevseg, FILETBL + 2 ) : 82 : nevseg; / * ファイル・テ - フ・ルへのホ。インタ北。 83 : / * 新環境変数領域の MCB セク・メント 84 : : MK_FP( envseg ー pmcb ; / * Ovner 変更 for 解放 85 : ( unsigned )nevseg pmcb- 〉 ovner short / * 新領域の MCB セク・メント 86 : MK_FP( nevseg pmcb )nevseg; / * 0vner 印変更 for 解放 ( unsigned pmcb- 〉 ovner short / * 現領域の MCB セク・メント 88 : pmcb : MK-FP( -psp - )nevseg; / * 0vner 印変更 for 解放 89 : ( unsigned pmcb- 〉 ovner short / * 新 PSP アト・レスのセット dos_setpspadr( nevseg ) : 91 : $ifdef _MSC_VER 92 : / * C ライフ・ラリ終了処理 -cexit() : 93 : $endif 94 : $ifdef __TURBOC_ / * 割込へ・クタ 00h 他のリストア 95 : _restorezero() : 96 : $endi f 97 : $if defined( _MSC_VER ) Ⅱ defined( --TURBOC-_ ) / * 新領域の PSP セク・メント dX, nevseg asm 田 OV / * 新 psp セク・メントー現 PSP セク・メント dx, -PSP sub —as 田 100 : ax, ds _asm 田 OV 101 : add ax, dx _as m 102 : / * 新 DS dS, ax _asm の OV 103 : _asn 田 OV ax , SS 1 04 : add ax, dx _asm 105 : / * 新 SS _asm 田 OV SS, ax 106 : _asm の OV ax, CS 107 : ax, dx add _asm / * 新 CS / * 新Ⅳ / * 新領域にシ・ヤンフ。 _asm push ax _MSC_VER offset nevadr _asm 田 OV ax, _asm push ax _asm retf 108 : $endi f 109 : 1 10 : # i fde f 1 14 : nevad r : 1 15 : $endi f 1 16 : $ifdef 119 : $endi f 120 : 1 21 : 122 : 1 23 : / * 旧メモリ・フ・的クの解放 if ( _dos-freemem( -psp ) ) 124 : _exit( 125 : 126 : -PSP nevseg, / * 環境セク・メント・アト・レス 127 : lpblk. envseg / * PSP 80H のコマント・行に対するホ。インタ * / : cmd80h, 128 : ゆい k. pcommandtail ゆい k. pfcbl ニ MK-FP( FCBI ) : 129 : - PS P, / * PSP 5CH に渡すテ・フォルト FCB に対するホ。インタ * / 130 : FCB2 ) : ゆい k. pfcb2 : MK-FP( 1 : -PSP, / * PSP 6CH に渡すテ・フォルト FCB に対するホ。インタ * / 132 : i f ( dos_loadprogram( path, & lpbl k ) ) / * フ。ロク・ラムのロ - ト・ 133 : _ex i t ( / * フ。ロク・ラムのロート・エラ - 134 . 135 : nevseg : dos-getpspadr() ; / * PSP アト・レスの取得 136 : / * nevseg : 起動フ。ロク・ラムの PSP セク・メントアト・レス * / 1 37 : )MK-FP( nevseg, PARSEG ) 138 : unsigned far * * ( unsigned far * )MK-FP( _psp, PARSEG ) : 1 39 . / * 親フ。ロセスの PSP セク・メント北。 - 1 40 : 1 41 : 割込へ・クタ 22h , 24h を元に戻す * / 1 42 : 23h , 1 43 . )MK-FP( nevseg, PRGEND + 0 ) 1 44 : long far * * ( long far * )MK-FP( PRGEND + 0 ) : 1 45 : -PSP, )MK-FP( ー ong far * nevseg, PRGEND + 4 ) 1 46 . * ( long far * )MK_FP( PRGEND + 4 ) : 1 47 : -PSP, )MK-FP( nevseg, PRGEND + 8 ) long far * 1 48 : * ( long far * )MK-FP( PRGEND + 8 ) : 149 : -PSP, $ifdef _MSC_VER 150 : dos_setvect( 151 . 0X22 , * ( vo i d ( interrupt far * far * ) ( ) )MK-FP( PRGEND + 0 ) ) ; 152 : -PSP, -dos-setvect( 0X23 , 153 : * ( void ( interrupt far * far * ) ( ) )MK-FP( PRGEND + 4 ) ) ; 154 . -PSP, -dos-setvect( 0X24 , 155 : interrupt far * far * ) ( ) )MK-FP( * ( void ( PRGEND + 8 ) ) ; 156 : -PSP, #endi f 157 : 8 : $ifdef _TURBOC_ setvect( 0X22 , 159 : PRGEND + 0 ) ) : * ( void interrupt ( far * far * ) ( ) )MK-FP( 160 : -PSP, setvect( 0X23 , 161 : * ( void interr 叩 t ( far * far * ) ( ) )MK-FP( PRGEND + 4 ) ) : 2 : -PSP, setvect( 0X24. 163 : PRGEND + 8 ) ) : * ( void interrupt ( far * far * ) ( ) )MK-FP( 164 : -PSP, $endif 165 : 166 : -dos-freemem( * ( unsigned far * )MK-FP( -PSP, ENVSEG ) 167 : / * 現環境変数領域の解放 168 : 169 . $if defined( -MSC-VER ) Ⅱ defined( _TURBOC_ 170 : / * 起動フ。ロク・ラムの PSP セク・メント 171 : IOV es, nevseg _asm / * SS の初期値 172 : ss,lpblk. ssinit _asm 田 OV / * SP の初期値 - 2 173 : sp,lpblk. spinit m 0 V as 田 / * 起動時の AX レシ・スタの初期値 174 _asn POP ax 175 : pushf _asm / * CS の初期値 176 . ゆい k. cs i n i t push _asn / * Ⅳの初期値 177 : push ゆい k. i p i n i t _asn / * 現領域の PSP セク・メント 178 : dx, -psp _asm 田 OV 1 79 : dec dx _asm / * 現領域の HCB セク・メント 180 . ds, dx _asm 田 OV 181 : / * 割込禁止 c ⅱ _asm ds: [ 0X0 け 0 / * 現領域の解放 ( 0 響 ne 「リセット ) * / 182 : vord ptr _asn 田 OV 183 : push _asm / * 起動フ。ロク・ラムの PSP セク・メント 184 . ds _asm POP / * 子フ。砒スにシ・ヤンフ。 ( 割込許可 ) 185 : iret _asn 186 : $end i f return( 187 : 188 : / * 起動ファイルフル・ハ。ス名 / * 起動コマント・オフ。ション / * Load Program 構造体 stat ic struct loadprogram-t ゆい k : / * PSP 80H のコマント・行 char cnd80h[ 128 ] ; / * コマント・・ラインの長さ register int cmdlen; / * ストラテシ・ unsigned oldstrategy, nevstrategy; unsigned nevseg, envsi z; struct ncb-t far *pncb; / * コマント・・ラインの作成 * / _TURBOC_ offset $ + 5 _asn 田 OV ax, _asm push ax ー ( 0xcb ) : emit_ / * 新Ⅳ 新領域にシ・ヤンフ。 / * retf ・ / * 新領域のフ。ロク・ラム MS ー DOS 非公開情報詳説 93

4. 月刊 C MAGAZINE 1993年10月号

行面冫飾ド M 艫 ば ,List 2 のようにすれば警告音は ればよいでしようか。 鳴らなくなり , List 3 のようにすれ A この場合 , 配列 ~ のポインタ ば警告音が鳴るようになります。 アプリケーションて、この領域を という型を使わなければなりませ ん。たとえば , ptrC10] [ 20 ] とい 変更するときは , 必ず起動前の状 態に戻しておくようにしてください う形式て、アクセスする領域を確保 するためには , char (*ptr) [ 20 ] = new char [ 10 ] [ 20 ] ; PC ー 9801 で pc98mouse 関数を 使っているのですが , ボタンの状 態を取得しようとしてもマニュア ルに書かれているような値が返さ Q d ~ h をインクルードしている れません。 プログラムがありますが , Fig. 2 に A pc98mouse は , NEC 形式のマ 示す工ラーメッセージが発生しま ウスドライバに対応しています。 す。なぜでしようか。 たとえば ,MS-DOSVer. 5.0 に付 A ANSI 規格互換オプシ = ン ( 。 属している MOUSE ℃ OM などは , マイクロソフト形式と呼ばれるも マンドラインコンパイラては一 A ) を のて , NEC 形式とは仕様が異なり 指定されている場合に発生します。 dos. h は ANSI 規格て定義されてい ます。 るヘッダファイルてはないのて、 , dos. h を使わないようにするか , B C 十十の拡張を認めるオプション ( ー A ー ) を指定してください 警告音が鳴らない設定 *(unsigned char far * ) 0X00000500 し一 = 0X20 : List 2 警告音が鳴る設定 *(unsigned char far * ) 0X0000050 乢 & = -0X20 : List 3 マウスドライバを使用するための関数例 1 : $include く graphics. h> 2 : $include く conio. h> 3 : #include く dos. h> 4 : 5 : struct mouseinfo { 6 : unsigned short reg_ ax : 7 : unsigned short reg-bx; 8 : unsigned short reg_cx; 9 : unsigned short reg_dx, 12 : / * マウス割り込みを呼び出す関数の例 * / 13 : int mouse( int cmd, struct mouseinfo *mp) struct REGPACK regs ; : cmd; regs. r_ax i f ( 叩 ) { 18 : regs. r-bX = mp- 〉 reg-bx; 20 : regs. r-cx = mp->reg-cx; regs. r-dx = mp->reg-dx; 22 : intr(0x33, &regs) ; 23 : i f ( 叩 ) { 24 : 25 : mp->reg_ax 26 : mp->reg-bx 27 : mp->reg_cx 28 : mp— >reg_dx 29 : 30 : return regs. r_ax; 32 : 33 : main() 34 : { 35 : mouseinfo ninfo; struct : DETECT, gm, status; 36 : int gd 37 : int X, Y ; 38 : ini tgraph(&gd, &gn, ” %%BC3%YBGI") ; 39 : status = mouse(), &ninfo); 40 : if (status) { outtextxy(), 0 , ” Press right button t0 quit ” ); 42 : nouse(), &minfo); / * マウスの表示 * / 43 : mouse(), &minfo); / * マウスの位置を取得する * / 45 : minfO. reg_cx; X 46 : - minfO. reg-dx; do { 47 : mouse(), &minfo) : 48 : / * 左ボタンが押されている場合 * / 49 : i f ( (minfo. reg-bx & 0X000D 50 : & & ()x ! : ninfo. reg-cx) Ⅱ (y ! = minfo. reg: ・ (x))) { mouse(), &minfo); / * マウスを消去 * / 52 : line(), y, minfO. reg-cx, 面 nfO. reg_dx); 53 : mouse(), &ninfo); / * マウスの表示 * / 54 : 55 : X : minfO. reg_cx; 56 : y = minfO. reg-dx; 57 : / * 右ボタンが押されるまで * / } vhile ( ( 面 nfO. reg-bx & 0X0002 ) 59 : mouse(), &minfo); / * マウスの消去 * / 60 : } se { outtextxy(), 0. ” Mouse driver is not installed"); 62 : getch() : 63 : closegraph() : 65 : return 0 ; 66 : List 4 とします。 Q DOS / v を使。ていますが , マ ウス関係の関数はありませんか ? A DOS/V 版 BorIand c 十十の Q PC ー 9801 で DOS のプログラム 標準ライプラリ関数には , マウス を開発しています。プログラムの ドライバを呼び出す関数はありま 処理中 , キー入力のリビートによ せん。 DOS/V て、マウスドライバを使用 ってビープ音が鳴り続けてしまう するには , List 4 のような関数をご のですが , ビープ音を鳴らさない 使用ください ( DOS / V て、は , マウス ようにすることはできるでしよう ドライバの仕様が NEC 形式のもの とは異なります。マイクロソフト 形式のマウスドライバの仕様は「 T BIOS のキー入力バッフアは 1 6 文字分用意されていますが , キー HE PROGRAMMER'S PC SOU 入力バッフアがあふれると警告の RCEBOOK SECOND EDITIO ためにビープ音が鳴ります。この NJ (Thom Hogan 著 , Microsof tPress( 邦訳「プログラマーズ PC 警告音を鳴らさないようにするた ソースブック」 ( 楙正憲訳 , インプ めには , BIOS のワークエリア ( 00 レス ) ) などをご覧ください ) 。 00 : 0500H ) を変更します。たとえ 0 lnformation from Compiler Makers 179

5. 月刊 C MAGAZINE 1993年10月号

スを示します。 S 2.11 以降て、は FCB を使用しないファン 子プロセスに渡す FCB 1 へのポインタを クションが追加されたため , 現在て、はほ 示します。子プロセスの PSP のオフセッ DOS ファンクション 4B01h の利用例 とんど使用されていません。たいていの ト 5Ch にコヒ。ーされます。 DOS ファンクション 4B01h を呼び出す関数 場合 , 無視しても問題ありません。 ④ PSP 6Ch に渡すデフォルト FCB に対する ⑤ SS : SP の初期値ー 2 を List 1 (loadprog. c) に示します。また , 以 ポインタ 前の連載て、紹介した常駐サイズ 0 を実現する 子プロセスのスタックポインタの初期値 子プロセスに渡す FCB 2 へのポインタを を示します。スタックには起動時の AX レ 子プロセスのオーバレイ関数を List 2(exec 示します。子プロセスの PSP のオフセッ ジスタの初期値が積まれています。 0 ⅵ . c ) に , そのテストプログラムを List 3 ト 6Ch にコビーされます。 FCB 1 と FCB ⑥ CS : 旧の初期値 (testexec. c) に示します。また , その使用法 2 は CP / M 時代の名残て、 MS ー DOS の初期 子プロセスのプログラム実行開始アドレ とコンパイル例を Fig. 2 に , 実行例を Fig. 3 のころに使用されていましたが , MS-DO execp 0 ⅵ ay 関数テストプログラム ストラテジの取得 List ist 4 1 : $include く dos. h> 2 : $include ” dosfunc. h ” 3 : 4 : unsigned dos_getstrategy( unsigned *strategy ) 6 : 7 : 8 : 12 : 1 : # i nc lude く s td i 0. h > 2 : #include く string. h> _MSC_VER 3 : # i fdef 4 : $include く stdlib. れ> 5 : $end i f _TURBOC_ 6 : # i fdef 7 : # i ncl ude く d i r. れ > 8 : $endi f $include "dosfunc. h ” 9 : 10 : char ロ ) ; int execp-ovlay( char ロ , 12 : *argvC] ) 13 : int main( int argc, char 16 : 19 : 20 : 22 : 23 : 24 . 25 : 26 : 27 : 28 : 29 : 30 : 32 : 33 : 34 : 35 : 36 : 39 : 40 : int execp-ovlay( char char cmd line ロ 42 : #i fdef _MSC_VER char fullpath[ 128 ] : 43 : 44 : -searchenv( name, ” PATH" 45 : i f ( ! fu Ⅱ path [ 0 ] ) 46 : 47 : $endi f 48 : $ifdef _TURBOC_ char *fullpath, 49 : 50 : if ( ( fullpath : searchpath( 52 : $endif 53 : 54 : union REGS regs; / * ストラテシ・の取得 : 0X5800 : regs. X. ax i ntdos( &regs. &regs ) : if ( regs. x. cflag ) return( regs. X. ax ) : *strategy regs. X. ax; return( 0 ) : / * MS-DOS のエラ - ・コ - ト・ / * ストラテシ・ char *pcmd, cmdline[ 256 ] ; i f ( argc く : 1 ) return( 1 ) : pcnd * 十十 argv; —argc; cmdline[ 0 ] ⅶⅱ e ( --argc ) { strcat( cndline, * 十十 argv ) : strcat( cmdline, List 5 ストラテジの設定 1 : $include く dos. h> $include ” dosfunc. h ” 2 : 3 : 4 ・ unsigned dos-setstrategy( unsigned strategy ) 7 : 10 : 13 : printf( ” %s XsYn ” 0000 0000000 [ 00 i f ( strchr( pcnd, pcmd cmdline ) : ニ N 乢し ) { / * 拡張子なし ? union REGS regs; strcpy( CO 田田 an 山 pcmd ) ; strcat( command, execp-ovlay( comnand, cmdline ) : strcpy( command, pcmd ) : strcat( CO 田田 an 山 return( execp-ovlay( command, cmdline / * ストラテシ・ / * ストラテシ・の設定 regs. x. bx = strategy; : 0X5801 ; regs. X. ax i ntdos( &regs. &regs ) : if ( regs. x. cflag ) return( regs. X. ax ) ; return( 0 ) : / * MS-DOS のエラ - ・コ - ド return( execp-ovlay( pcmd, cmdline ) ) ; List 6 PSP アドレスのセット fullpath ) : 1 : $include く dos. h> $include "dosfunc. h" 2 : 3 : 4 : VOid dos-setpspadr( unsigned pspseg ) 6 : 7 : 8 : 9 : 10 : ) ) = NULL ) n ame union REGS regs; return( / * 起動コマント・が見つからない return( exec-ovlay( fullpath, cmd ⅱ ne ) ) : / * PSP セク・メント・アト・レス / * PSP アト・レスのセット regs. X. bX : pspseg; regs. h. ah : 0X50 : intdos( &regs, &regs ) : 94 C MAGAZINE 1993 10

6. 月刊 C MAGAZINE 1993年10月号

的な曲が演奏て、きるようになります。 にはレジスタマップの 0X28 を操作します。 す。 音程とは周波数て、す。音色が音量の変化 下位 2 ビットて、チャンネルを指定し , 上位 4 また , 止めるのも , キーオフするときに て、あるのに対して , 音程は周波数を変化さ ビットはそれぞれのオペレータを有効にす は逆に全部のオペレータをオフにしてやり せることて、作られます。 るかどうかのスイッチて、す。このスイッチ ます。チャンネル設定は同じて、す。という この周波数を設定するレジスタは , 0xa0 をオンにしてやらないと音がなりません。 わけて、 , List 9 になりますね。 ~ 0xa6 て、す。仮に 1 チャンネルの音程を設定 そこて、作ってみると , List 8 のようになりま チャンネル設定には , ch & 3 や if 文て、間 する場合は , 0xa4 にオクタープデータと周 違った値を渡さないようにしたほうがいい TabIe 2 音程の周波数 波数の上位 3 ビットを送出し , 0xa0 に下位 8 て、しよう。 音程 ビットを送るといった具合になります。設 それて、はお待ちかね , ドレミを鳴らすも 定する周波数の値は TabIe 2 を参照してくだ のを作ってみます。曲そのものを演奏しよ うとすると , まだ音長とテンボの問題があ オクタープとは mml て、いうところの O コマ りますのて、 , 今はこれて、我慢て、す。 ンドて、設定される値て、す。たとえばピアノ 後に残った未完成な部分 , 音長を待っ部 の正面に立っと第 4 オクタープの音程のキー 分て、すが , ここて、はお手軽に CPU て、ウェイ になります。また , ドレミフアソラシドと トを取ってみます。 long 型て、ウェイト値を 鳴らすとして , オクタープに 4 が設定されて 取りましたのて、 , お手持ちの機種によりス いる場合シの次のドの音を鳴らすときには , ピードを調節してください オクタープをひとつ上げ 5 を設定するように ウェイトは , キーオン / キーオフ後両方に します。 入れます。これはゲートタイム / ステップタ こて、は簡単に周波数を表引きにして設 イムと呼ばれるものを簡単に表現したもの 定してやることにします。表がて、きたらと て、す。 mml て、いうところの Q コマンドて、す りあえず使えるようにしてみましよう (List 表はシャープが設定されたら 7 を足せばい いようにしました。これは , mml の解釈ル ーチンて、使用されることを見越して , 簡便 に設定て、きるよう配慮したためて、す。ライ プラリとして組み込むときは , もう一段ひ ねってラから始まるように表を設定します。 これは , ABCDE ・・・・・・と mml を並べると , ラ シドレミ ・・となるためて、す。こうすれば , mml ー ' A' としてこの値から表を引くだけ て、いいて、すね。 こらへんはいろいろな考 え方がて、きるのて、 , 各自アイデアが生まれ たら拡張してみてください。これだけが正 解例て、はありません。 さて , 音色・音程とくれば , もう鳴るも のを作って演奏させ・ないわけにはいきませ ん。 F チャンネルの場合 , 音色の設定・音 程の設定・鳴らす・音長分待つ・止める , という流れがすべてて、す。これを頭の片隅 に置いてください て、は残りのうち , 鳴らし始めるもの , キ ーオンするものを作ります。キーオンする 114 C MAGAZINE 1993 10 レジスタ 0X26a 0X28f 0X2b6 0X2 df 0X30b 0X339 0X36a 0X39e 0X3 d 5 0X410 0X44e 0X48f ドドレレミフフソソララシ 音程の設定 List 1 : unsigned int m—scale ロ 0X26a , / * musical scale * / 2 : 3 : 0X2b6 , 4 : 0X30b , 5 : 0X339 , 6 : 0X39e , 7 : 0X410 , 8 : 0X48f , 0X28f , / * sharp data * / 9 : 10 : 0x2df, 11 : 0X30b , 0X36a , 13 : 0X3d5 , 14 : 0X44e , 15 : 0X48f , 18 : VOid muslc_scale(uns igned Char scale, unsigned Char OCtave, unsigned Char (h) 19 : { music—outp()h + 0xa4, (octave くく 3 ) ー (m—scaleCscaIe] 〉〉 8 ) ) : 20 : music-outp()h + Oxa0, m-scale[scale]); 21 : 22 : } 音を止める 音を鳴らし始める List List 1 : void keyoff(unsigned char ch) music—outp(Ox28, (h) ; 3 : 1 : void keyon(unsigned char ch) music-outp(0x28, 0xf0 + (h) ; 3 :

7. 月刊 C MAGAZINE 1993年10月号

す。 ートて、データを出力するという形態を取っ ウェイト用の 0X20 という値は , だいたい ・ C 言語で書いてみる ています。ポインタの考えを I/O;* ートを使 の値て、すがとくに問題はないようてす。少 使用言語は C 言語にします。通常はリアル って考えたものと思えばわかりやすいかも し邪道なアプローチかもしれませんが , 仕 タイムて、扱う必要があるのて、 , アセンプラ しれません。ますこれを先に作ってみます。 方ありません。実際にライプラリとして使 て、記述するものなのて、すが , 今回はこれて、 標準的なポートアドレスは , それぞれア うときには , 後て、ポートアドレスを変更て、 ことにしてコーティングの仕方を考え ドレス用の 0X188 と , データ用の 0X18a て、 きるように変数から参照する形にしておき ていこうと思ってます。それなら C 十十にす す。またほかの IC と同じく busy フラグがあ ます。 ればいいのて、すが , 実はうまくいくかどう ります。このフラグが立っている間は I / O ポ 注意点て、すが , このウェイトはデータ部 か自信がなかったのて、 , とりあえず安全策 分だけに使ってください。アドレス部分て、 ートへの出力はて、きません。このふたつを として , 今まて、慣れ親しんて、いる C 言語にし 使うと将来速い CPU がて、きたときに , 十分 考えると , List 1 のような形に作れます。と てみました ( 前回まて、が C 十十て、進んて、いた なウェイトが得られずうまく動いてくれま ころが困ったことにそう簡単にはいかない ・・とおしやる方もいるとは思います のて、す。 のに・ せん。 Cyrix 486DLC が出た最初の頃 , CP 一部の NEC 製品には , 連続してポートを U を差し換えると一部メーカーのゲームて、音 それて、は手元にサウンドボードのマニュ 読み出すと間違った値が返されるという「仕 が正常に鳴らなくなるという現象の大部分 アルがあることを前提にしながら , 作成を 様」があります。 は , これが原因のようて、した。 進めていきます。 私の体験て、すが , サードバーティ製のサ さらにデータ入力用の関数も作ってみま ウンドボード上て、開発を進めているときに す。原理は同じて、 , データ出力を入力に換 途中て、サウンドボードが内蔵されてる機種 えてやるだけて、す ( List 3 ) 。 へ開発環境を移し換えたことがありました。 これがて、きたところて、 , とりあえず音を サウンドボードのマニュアルの巻末にた そうしたらまったく音が出なくなり , 鳴らすものを作ってみましよう 0List 4 に m いてい , レジスタマップという表が書いて 三晩悩んてしまいました。これを回避する usic outp 関数を追加して ( 付録ディスク NO あると思います。これだけて、はなんだかわ ためにはデータ部分の busy フラグ検査を省 ISE. C) 実行すると , ホワイトノイズが鳴り かりませんね。 YM2203 系の IC て、は , データ き , CPU て、ウェイトをかけるようにしなけ ます。何かキーを押せば終了て、す。もし , を出力するのにアドレス用 I/O*—トて、アド ればなりません。するとこんな形になりま 鳴らないようて、したらポートアドレスの設 レスを指定してやり , その後データ用 I / O ポ す (List 2 ) 。 定やボ、一ドの実装状態を確認してください サウンドボートにアクセス ( 1 ) サウンドボートにアクセス ( 2 ) ます作るもの List List 1 : void music—outp(unsigned char adr, unsigned char dat) 3 : 4 : 5 : 6 : 7 : 8 : 9 : 11 : } 1 VOid music—outp(unsigned char unsigned char dat) whi le (inportb(0x188) & 0X8 の / * read busyflag * / 3 4 outportb(0x188, adr) : 5 while (inportb(0x188) & 0X8 の 6 7 outportb(0x18a, dat) ; 8 int i : while (inportb(0x188) & 0X8 の outportb(0x188, adr) ; for (i = 0X20 : i > 0 ; i--) outportb(Ox18a, dat) : 1 ヨー 1 ー テータ入力用関数 List 音を鳴らしてみる List 1 : unsigned char mus ic_inportb(uns igned char adr) 3 : int i; 4 : while (inportb(0x188) & 0X8 の 5 : 6 : outportb(0x188, adr) ; 7 : for (i = 0X20 ; i 〉 0 : i--) 8 : 9 : return inportb(0x18a) : 10 : 11 : ) 1 : void main(void) 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : } music-outp(0x6, 0x の : / * SSG Noise * / music—outp(0x8, 0xc) ; / * VO 1 ume music—outp(0x7, 0X87 ) ; / * Mixer on * / printf( ” Hit any key ” ) : getch() : music—outp(0x8, 0X0 ) ; music—outp(0x7, 0xbf) ; / * VoIume off * / / * Mixer off * / 112 C MAGAZINE 1993 10

8. 月刊 C MAGAZINE 1993年10月号

98 & 00S / ゲームプログラミング大作戦 た表が出てきます。関係があるのは , これ 依存するコーティングになりますが , これ 言て、いうと SSG のノイ 仕組みて、すが , と 0X30 以降のレジスタて、す。 LFO 関係は後 には目をつぶることにしましよう。 ズ発生機能を利用したものて、す。ただこれ 以上の考えをまとめると , List 5 になりま 回しにするとして , 必要な部分だけ列記す だけなのて、すが , SSG の仕組みが簡潔によ るとこうなります (TabIe 1 ) 。 す。 く表れている例て、すのて、 , 参考にしてくだ 四つのオペレータの順番て、すが , これも こて、 FM 音源の仕組みを全部説明するこ レジスタ順にしたいのて、 1 , 3 , 2 , 4 の順に とはしませんが , すべてはこのオペレータ なります。 mml から変換するプログラムは と呼ばれるものに集約されます。もっとよ 次回紹介しますが , もし作成するときには り深く知りたければ , マニュアルやほかの 気をつけてください 参考書に詳しく書かれていますのて、 , そち 鳴るものがて、きたら , 音色を作るのが筋 て、はこれをレジスタに送出する関数を作 らを参考にしてください というものて、す。音色とは , フルートの音 ってみます (List 6 ) 。せつかくレジスタマッ それて、はこれをどう構造体としてまとめ 色とかビアノの音色とかいったあれて、す。 プと同じ並びにしたのて、 , データを連続て、 るか考えてみます。レジスタマップの 0X30 BIOS を利用すれば , この音色が 81 個もただ 送れるようにしてみましよう。値の受け取 以降を見てください。各オペレータは四つ こは諦めるしかあり て、使えるのて、すが , りには , void 型のポインタにし , あとて、 ch て、構成されています。仮に 3 番目のチャンネ ません。まあ使う音色といっても多くて一 ar 型のポインタにしてインクリメントしな ルに DT を設定しようとすると , 0X32 , 0X3 曲 10 種類ほどて、すし , 音色パラメータ自体 6 , 0x3a, 0x3e の四つのレジスタ全部にそれ がらデータを次々と送ればいいてすね。呼 も最近はいろいろな形て、流通しているのて、 , び出すときは , アドレス演算子て、データを ぞれ違うデータを送らなくてはなりません。 それらを利用すれば事足りると思います。 指定するのも定石どおりて、す。 さらに問題として , ふたつのオペレータて、 それて、は実際の設定方法を考えてみましよ テクニック的なものとしては , RR と TL ひとつのレジスタを使っている部分がある を最少に設定して音を止め , 演奏中に音色 点て、す。表のまま構造体にしてしまうと , サウンドボードのマニュアルをべらべら を切り換えてもノイズが出ないようにして 個々のオペレータに対応したデータ送出を とめくると音色パラメーター覧などといっ いる点て、す。 RR まて、消さないとこの効果が しなければならず , ソースがだらだらと長 音色を構成する構造体 得られません。 FB / ALG だけレジスタが離 くなってしまいます。 れているのて、後て、送るようにします。これ これて、は美しくありません。美しくない て、音色が設定て、きるようになりました。 ものにはバグがわいてきます。そこて、内部 的なデータとしては , レジスタマップて、示 音程の作方 されているデータそのものを保持し , mml (Music Macro Language) からデータを設 音色ときたら音程て、す。ドレミ 定されたときには , この形に変換してメモ ったあれて、す。これさえて、きればもう基本 リに蓄積するようにします。構造体の形に TabIe 1 0X30 以降のレジスタ ( LFO 関係は除く ) 内容 レジスタ 音の立ち上がりを設定します AR(Attack Rate) AR で TL まで達した音量が SL になる時間を設定します DR (Decay Rate) SL から音量が 0 になる時間を設定します SR(Sustain Rate) RR(Release Rate) 余韻を設定します SL(Sustain Level) Sustain 時の音量を設定します TL(TotaI Level) 音量を設定します DR(Detune Rate) 各オペレータの周波数をずらします ML(MulitipIe) 各オペレータの周波数を倍にします 高い音になるほど各 Rate を短くします KS(Keyboa 「 d ScaIing) FB(Feed Back) 変調を設定します 四つのオペレータの組み合わせを指定します ALG (AIgorithm) 98 & DOS / V ゲームプログラミング大作戦 113 List 1 : struct neiro—t { uns i gned char DT—ML [ 4 ] ; unsigned char TL[4] ; 3 : unsigned char KS—AR[4] ; 4 : uns i gned char DR [ 4 ] : 5 : uns i gned char SR [ 4 ] ; 6 : uns i gned char SL—RR [ 4 ] ; 7 : 8 : uns i gned char FB—ALG ; レジスタに送出する関数 LiSt uns igned char ch) 1 : VOid music_neiroout(void 3 : unsigned char adr, adr2; 4 : unsigned Char *p = neiro; 5 : int i; 6 : 7 : adr = ch + 0X40 : 8 : adr2 = ch + 0X80 : for (i = 0 ; i く 4 ; i + + , adr + = 4 , adr2 + = 4 ) { 9 : music—outp(adr, 127 ) ; / * TL = 127 * / music—outp(adr2, 15 ) : / * RR = 15 * / 11 : 13 : adr = ch + 0X30 : for (i = 0 ; i く 24 ; i + + , adr + = 4 , P + + ) 14 : music—outp(adr, (p) ; 15 : adr = ch + 0xb0; / * FB/ALG * / music—outp(adr, (P) : 18 : )

9. 月刊 C MAGAZINE 1993年10月号

モリが十分に残っていないといけません。 TabIe 1 プログラムのロードと非実行 DOS ファンクション 4B01h はプログラムを DOS ファンクション 4B01h (DOS 2.1 1 ~ 5.0 ) 引数 AH =4Bh 起動する DOS ファンクション 4B00h とほとん AL = 01 h ど同じことを行いますが , プログラムを口 DS : DX = 起動する ASCIZ ノヾス名のアドレス ES : BX = ノヾラメータブロックのアドレス ードするだけて、実行せすに戻ってきます。 INT 21 h 返り値キャリー SYMDEB, CodeView などのデバッガが本 AX = 01 h : 無効なファンクション ファンクションを使用しています。 = 02h : ファイルが存在しない = 03h : 無効なノヾス パラメータブロックの内容は次のとおり = 04h : オープンされているファイルか多すきる = 05h : アクセスの拒否 て、す。 = 08h : 十分なメモリがない ①渡される環境のセグメントアドレス =OAh : 不正な環境 =OBh : 不正なフォーマット 子プロセスに渡す環境変数のセグメント キャリー = 0 ノヾラメータブロック十 OEh SP の初期値ー 2 アドレスを示します。 0000h の場合 , 親プ ノヾラメータブロック十 10h SS の初期値 ロセスの環境をコピーします。子プロセ ノヾラメータブロック十 12h 甲の初期値 ノヾラメータブロック十 14h CS の初期値 スに渡す環境変数は 32K バイトを超えては SS : SP 初期値ー 2 起動時の AX 初期値 いけません。 機能 DS : DX レジスタにロードするバス名の ASCIZ 文字列のアドレスを指定し , ES : BX レジスタ にロードするためのバラメータブロックのアドレスを指定する ② PSP のオフセット 80h のコマンドラインに DOS ファンクション 4B00h と異なる点はプログラムをロードして実行せすに戻ること バラメータブロックの内容は以下のとおり 対するポインタ オフセット バイト数 内 子プロセスに渡すコマンドラインに対す 2 渡される環境のセグメントアドレスか 00h の場合 , 親環境をコピーする 00h るポインタを示します。コマンドライン 4 PSP のオフセット 80h のコマンドラインに対するホインタ 02h コマンドラインの形式は以下のとおり の形式は Fig. 1 のとおりて、 128 バイトを超 えてはいけません。リダイレクト記号 コマンドライン文字列 CR ( < , > ■ ) はすべて親プロセスが処理す CR を除く文字数 ( 1 バイト ) る必要があります。 ③ PSP 5Ch に渡すデフォルト FCB に対する 4 PSP 5Ch に渡すテフォルト FCB に対するポインタ 4 PSP 6Ch に渡すテフォルト FCB に対するポインタ ポインタ 常駐サイズ 0 を実現する子プロセスのオーバレイ関数 ↑ 06h OAh LiSt ist プログラムのロード く string. h> 1 : $include 2 : # i ncl ude く s t d ⅱ b. れ > 3 : # i ncl ude く process. h> 4 : $include く dos. h> 5 : $include ” dosfunc. h ” 6 : TURBOC_ 7 : # i fdef dos_freemem 8 : $define 9 : VOid _restorezero( VOid 10 : extern Ⅱ : $endif : #define PRGEND 0x0a 14 : $define PARSEG 0X16 15 : $defi ne ENVSEG 0x2c $defi ne FILETBL 0X34 16 : 0x5c 17 : $define FCBI 0x6c 18 : $define FCB2 19 : long huge *PS. unsigned parasiz ) 20 : static VOid paracopy( long huge *pd, 22 : 23 : 24 . 25 : 26 . 1 : $include く dos. h> 2 : #include ” dosfunc. h ” 3 : dos-loadprogram( char far 4 : unsigned *name, void far *parablk ) 6 : 8 : 9 : 13 : 15 : 16 : 17 : union REGS regs; struct SREGS segs; ニ FP_OFF( nane ) : / * ds:dx = 起動する ASCIZ ハ。ス名のアト・レス * / regs. X. dx : FP_SEG( nane ) ; segs. ds = FP_OFF( parablk ) ; / * es:bx = ハ。ラメ - タ・フ・ロックのアト・レス regs. X. bX : FP_SEG( parablk ) : segs. es ニ 0X4b01 : regs. X. ax i ntdosx( &regs, &regs, &segs ) : if ( regs. x. cflag ) return( regs. x. ax ) : return( 0 ) : freemem の領のの 境・イ - a_ a. 仆親環万門門 / * フ。 0 ク・ラムの 0- ト・ / * MS-DOS のエラ - ・コ - ド / * ハ。ラク・ラフ単位の北。 - vhile ( parasiz- *pd 十十 *ps 十十 ; *pd 十十 *ps 十十 ; *pd 十十 *ps 十十 ; *pd 十十 *PS 十十 : 92 C MAGAZINE 1993 10

10. 月刊 C MAGAZINE 1993年10月号

Fig. 3 各種設定オプション Search E 山 t e 凵ロい口「に Project 記 ome t0 ci mm 画 acintosh のプログラマを支援する目的て、 [ 1 ] APDA アップルが後援している , M [ 注 ] していてください Edit から Options... を選ふ ロ Confirm saves ロ Confirm project updates ロ AIways compact projects 区 StnctPrototype Enforcement OTHINK C + Objects @THINKC 図 L ・ E 55ig5 ロ Projector-aware ロ Generate link map ◎ Require prototypes ・・…壗 lnfer prototupes 設立された団体て、あり , こから各種 Prefe 「 ences の設定 図 Check pointer tgpes ロ enums are alwags ints ーーロ R000g0 に 0 trigraphs まロ *define —STDC— ANSI Conf 「 n 浦 0 ・ Language Settings の設定 Compiler Settings の設定 ー ! 図 no 「 e case ー ! ロ Wrap around ーーロ Wh01e words onlg ロ Generate 66020 instructions ロ Generate 66661 instructions ロ C1asses are indirect bg default ロ Methods are virtual bg default 図 Optimize monomorphic methods Code Optimization の設定 ロ Honor ・ register ・ first 図 Automatic Register A55 炉・ 図 Suppress redundant 106dS 図 Defer & combine stack adjusts COde Optimization ロ 4-bgte ints ロ 8-bgte doubles ロ Native floating-point format 図 *p" unsigned char 0 ロ Use 6 励 Optrnizer 開発ソフト , あるいは開発に必要な文 書が有償て、入手することが可能てす。 間い合わせ先などは技術評論社より出 ている fMacintosh DEVELOPER' S JOURNAL 』誌を参照してください [ 2 ] 「インサイドマック』英語版は "ln side Macintosh"0 Macintosh て、プログ ラムするにあたって最低必要て、あると いう資料。日本語版 ( 第 1 巻から第 6 巻ま て、 ) がトッパン ( 凸版印刷の関連会社 ) よ り出版されている。英語版 , 日本語版 Mac 専科 Welcome to Macintosh Programming 89 述べた事情があるためて、す。 に設定をしていますが , その理由は今 き , 関数プロトタイプを強化するよう ンパイラの条件設定 ( Fig. 3 参照 ) のと て、触るという形を取ります。筆者はコ ったほうは必要な部分だけをポインタ インタ」て、パラメータを指定し , 受け取 造体」を全部渡すのて、はなく「構造体ポ また , 呼び出しを高速化するため「構 す。 うという仕様にしたものがほとんどて、 定が多いため , 構造体にまとめてしま ージャ類のほとんどはパラメータの指 組むことすらて、きません。とくにマネ さもなければ , そもそもプログラムを の概念は確実におさえておくことて、す。 て、注意すべきことは「構造体」「ポインタ」 のポインタ ) 。 Macintosh のプログラム る型ということて、す ( 具体的には void 型 [ 4 ] Ptr 型 Ptr 型とは「ポインタ」を意味す ん。 (Fig. 3 ) が , 本講座て、は取りあげませ て、 int を 32 ビットにすることもて、きます [ 3 ] int は 16 ビット実はオプション設定 能て、す。 とも , 大きな都市の大型書店て、入手可