━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 外部関数とそのライブラリについてのドキュメント ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ぺけ-BASICには、以下の5つの外部関数のファイルが付属しています。 1.DOSFNC.FNC DOS CALL 関係 2.IOCSFNC.FNC IOCS CALL 関係 3.LZHFNC.FNC LZH 形式の圧縮ファイルを展開 4.RASTER.FNC ラスタスクロールなどの特殊効果 5.SPDEF.FNC スプライトをファイル名から定義 それぞれの関数ファイルごとに解説します。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.DOSFNC.FNC ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ str getenv() int setenv() int _system() int drvctrl() void chgdir() str curdir() int filesnum() int files() の8つの関数が含まれています。 /*-------------------------------------------------------------------- str getenv( ENV;str ) /*-------------------------------------------------------------------- 環境変数の内容を得る。 ** ** ** ** ** ** ** ** ** ENV : 環境変数名 /*-------------------------------------------------------------------- int setenv( ENV;str {, SETLINE;str} ) /*-------------------------------------------------------------------- 環境変数に文字列を設定する。 ** ** ** ** ** ** ** ** ** ENV : 環境変数名 SETLINE : 設定する文字列 省略した場合、指定の環境変数を消去する 返り値 = 0 : 正常設定 < 0 : 異常終了 /*-------------------------------------------------------------------- int _system( COMLINE;str ) /*-------------------------------------------------------------------- COMLINE を command.x に渡して子プロセスとして起動する。 ** ** ** ** ** ** ** ** ** COMLINE : コマンドの文字列 返り値 : 終了コード ** ** ** ** ** ** ** ** ** command.x がパスの通ったディレクトリに存在しなければいけません。 COMLINE として、'copy', 'del' 等の内部コマンドも使えます。 BAStoC 時には、stdlib.h の system() 関数 に置き換えられます。 /*-------------------------------------------------------------------- int drvctrl( COM;int {, DRVNAME;str } ) /*-------------------------------------------------------------------- ドライブの状態をチェック・設定する。 ** ** ** ** ** ** ** ** ** COM =-1 : カレントドライブの値を返す (0=A:, 1=B:, ...) (DRVNAME は意味無し) 0 : 状態チェック 1 : イジェクト ( ハードディスクの時はシッピング?) 2 : イジェクト禁止 3 : イジェクト許可 4 : ディスクがセットされていない時にLED点滅 5 : ディスクがセットされていない時にLED消灯 6 : カレントドライブの変更 7 : メディアバイトを返す DRVNAME : ドライブ名を "A:" の形で指定 省略した場合、カレントドライブ COM = 0 の返り値: bit 7 : LED点滅 bit 6 : イジェクト禁止 bit 5 : バッファ有り bit 4 : ユーザーによるイジェクト禁止 bit 3 : ライトプロテクト bit 2 : ノットレディ bit 1 : メディア挿入 bit 0 : 誤挿入 COM = 1,2,3,4 の返り値: >= 0 : 正常終了 (設定後のメディアの状態) < 0 : エラー ** ** ** ** ** ** ** ** ** メディアバイト: $f4 : DAT (SCSI) $f5 : CD-ROM (SCSI) $f6 : MO (SCSI) $f7 : ハードディスク (SCSI) $f8 : ハードディスク $f9 : RAM DISK $fa : 2HD (1.44MB) $fb : 2DD (640KB) $fc : 2DD (720KB) $fd : 2HC (1MB) $fe : 2HD (1MB) /*-------------------------------------------------------------------- void chgdir( DIR;str ) /*-------------------------------------------------------------------- カレントディレクトリを変更する。 ** ** ** ** ** ** ** ** ** DIR : ディレクトリ名 /*-------------------------------------------------------------------- str curdir( {DRV;str} ) /*-------------------------------------------------------------------- カレントディレクトリを返す。 ** ** ** ** ** ** ** ** ** DRV : "A:" の形で指定したドライブのカレントディレクトリを返す。 省略した場合、カレントドライブが対象となる。 /*-------------------------------------------------------------------- int filesnum( FILENAME;str, ATTRIB;int ) /*-------------------------------------------------------------------- 指定のファイル名とアトリビュートに一致するファイルの個数を返す。 ** ** ** ** ** ** ** ** ** FILENAME : ファイル名。ワイルドカードも使用可。 ATTRIB : アトリビュート /*-------------------------------------------------------------------- int files( FILENAME;str, ATTRIB;int,NAMES();str, SIZES();int, TIMES();int, ATTRS();char ) /*-------------------------------------------------------------------- 指定のファイル名とアトリビュートに一致するファイルの情報を配列に展開 する。 ** ** ** ** ** ** ** ** ** FILENAME : ファイル名。ワイルドカードも使用可。 ATTRIB : アトリビュート NAMES : ファイル名の格納先 SIZES : ファイルサイズ TIMES : タイムスタンプ ATTRS : アトリビュート 4つの配列は、要素の個数を同じくしておかないといけません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.IOCSFNC.FNC ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ int bpeek() int wpeek() int lpeek() void bpoke() void wpoke() void lpoke() int iocs() int _arp() int _vrp() の9つの関数が含まれています。 なお、bpoke(), wpoke(), lpoke(), _arp() の仕様については、EXEC.FNC ( Oh!X '95年10月号掲載 ) を参考にさせていただきました。 /*-------------------------------------------------------------------- int bpeek( ADR;int ) int wpeek( ADR;int ) int lpeek( ADR;int ) /*-------------------------------------------------------------------- 指定アドレスのメモリを読み出す。 bpeek() はバイト単位、wpeek() はワード単位、lpeek() はロングワード単 位で読み出す。 ** ** ** ** ** ** ** ** ** ADR : アドレス wpeek(), lpeek() で奇数アドレスを指定するとエラー /*-------------------------------------------------------------------- void bpoke( ADR;int, VAR1;int {, VAR2;int, ... , VAR9;int } ) void wpoke( ADR;int, VAR1;int {, VAR2;int, ... , VAR9;int } ) void lpoke( ADR;int, VAR1;int {, VAR2;int, ... , VAR9;int } ) /*-------------------------------------------------------------------- 指定アドレスのメモリに値を書き込む。 bpoke() はバイト単位、wpoke() はワード単位、lpoke() はロングワード単 位で書き込む。 最大 9 個まで連続に書き込むことができる。 ** ** ** ** ** ** ** ** ** ADR : アドレス wpoke(), lpoke() で奇数アドレスを指定するとエラー VAR1, ... VAR9 : データ ** ** ** ** ** ** ** ** ** 不用意な使い方をすると、暴走・システムの破壊などの取り返しのつかない ことも起き得る関数なので、注意して下さい。 /*-------------------------------------------------------------------- int iocs( IOCS_CALL;int, {d1;int, d2;int, d3;int, d4;int, d5;int, a1(), a2()} ) /*-------------------------------------------------------------------- IOCS CALL を呼び出す。 ** ** ** ** ** ** ** ** ** IOCS_CALL : IOCS CALL 番号 d1-d5 : 指定のレジスタにセットされる値 a1/a2 : 数値型の配列名。データ部分の先頭が a1/a2 にセットされる ** ** ** ** ** ** ** ** ** IOCS_CALL 以外は省略可能です。 不用意な使い方をすると、暴走・システムの破壊などの取り返しのつかない ことも起き得る関数なので、注意して下さい。 /*-------------------------------------------------------------------- int _arp( DIM ) /*-------------------------------------------------------------------- 指定の配列のデータ部分の先頭アドレスを返します。 ** ** ** ** ** ** ** ** ** DIM : 1 or 2 次元の配列名(型はいずれでも良い) /*-------------------------------------------------------------------- int _vrp( VAR ) /*-------------------------------------------------------------------- 指定の変数のポインタを返す。 ** ** ** ** ** ** ** ** ** VAR : 変数名(型はいずれでも良い) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.LZHFNC.FNC ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ int lzh_extend() の1つの関数が含まれています。 /*-------------------------------------------------------------------- int lzh_extend( FILENAME;str, BUF() ) /*-------------------------------------------------------------------- .LZH 形式の圧縮ファイルを配列上に展開する。 ** ** ** ** ** ** ** ** ** FILENAME : 展開する圧縮ファイル名 拡張子は省略不可能 BUF() : 展開先の配列名 次元は1または2次元、型は int, char, float のいずれも可 ** ** ** ** ** ** ** ** ** 展開されるファイルは、アーカイブの先頭のファイルだけである。 BASICの外部関数として使っている時は、指定の配列より大きなファイ ルを展開しようとすればエラーを発行しますが、ライブラリは展開先の大きさ などおかまいなく展開してしまいます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.RASTER.FNC ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ void v_priority() int v_special() void v_disp() int ras_scroll_set() int ras_scroll_stat() void ras_home() の6つの関数が含まれています。 {} で囲ってある引き数は省略可能。 /*-------------------------------------------------------------------- void v_priority( STG;str, GRAPH;str ) /*-------------------------------------------------------------------- テキスト・スプライト・グラフィックの間と、グラフィック0〜3の間のプ ライオリティを変更する。 ** ** ** ** ** ** ** ** ** STG : テキスト・スプライト・グラフィックの間のプライオリティの指定 文字 S,T,G の順番で指定する。先に書いたものの方が優先順位は高い 例: TEXT > GRAPH > SPRITE => "TGS" GRAPH : グラフィック0〜3の間のプライオリティの指定 文字 0,1,2,3 の順番で指定する。先に書いたものの方が優先順位は高い 例: G0 > G3 > G1 > G2 => "0312" ** ** ** ** ** ** ** ** ** ともに、同じ面を2つ以上指定するとエラーとなる。 /*-------------------------------------------------------------------- int v_special( MD;int ) /*-------------------------------------------------------------------- ビデオコントローラの特殊表示機能、具体的に半透明と特殊プライオリティ を制御する。 ** ** ** ** ** ** ** ** ** MD : 動作を指定 MD = -1 : 今の状態を返す ( 0 〜 8 ) = 0 : 特殊表示機能を使用しない = 1 〜 7 : ベースページとそれぞれ指定の面との半透明動作を行う。 1 : テキストパレットの0の色 2 : テキスト 3 : セカンドページ 4 : テキスト+セカンドページ 5 : テキスト +テレビ/ビデオ 6 : セカンドページ+テレビ/ビデオ 7 : テキスト+セカンドページ+テレビ/ビデオ = 8 : 特殊プライオリティ ** ** ** ** ** ** ** ** ** ベースページ : グラフィックのプライオリティの最も高い面 セカンドページ : グラフィックのプライオリティの2番目に高い面 テキスト : スプライト、BGも含む、グラフィックよりプラ イオリティの低い面 /*-------------------------------------------------------------------- void v_disp( {MD;int} ) /*-------------------------------------------------------------------- 垂直帰線・表示期間を待つ ** ** ** ** ** ** ** ** ** MD : どちらを待つか指定 = 0 : 垂直帰線期間を待つ <> 0 : 垂直表示期間を待つ 省略した場合、垂直帰線期間を待つ /*-------------------------------------------------------------------- int ras_scroll_set( MD;int, RAS_DAT(,);int, PAGES;int, RASTERS;int, FIRST_RASTER;int) /*-------------------------------------------------------------------- ラスタスクロール用のデータをセット ** ** ** ** ** ** ** ** ** MD : ラスタスクロールさせる面を選ぶ MD = 0: BG0 (横方向のみ) 1: BG1 (横方向のみ) 2: BG0 (縦横) 3: BG1 (縦横) 4: GRAPH0 5: TEXT 6: BG0 (縦横、差分) 7: BG1 (縦横、差分) dim RAS_DAT( PAGES, RASTERS ) : ラスタスクロール用のデータ PAGES : 最大ページ番号 RASTERS : 1ページ当たりのラスタ数 - 1 省略時には、RAS_DAT(,) の第1添え字、第2添え字の最大がそれぞれ セットされる。 コンパイルの時には省略不可能。 FIRST_RASTER : スクロール(割り込み)開始ラスタ番号 ラスタの本数は 15kHz のとき 260 本 31kHz のとき 568 本なので, FIRST_RASTER + RASTERS がその値を越えないよう注意 省略時には0と見なす。 ** ** ** ** ** ** ** ** ** ラスタスクロール用のデータ RAS_DAT( PAGES, RASTERS ) は次のような形 式になっています。 RAS_DAT(n,m) = n ページ目の ( FIRST_RASTER + m ) 番目のラスタ表示時に スクロールレジスタにセットされる値。 MD = 0,1,4,5 のときは、X 方向のスクロールレジスタにセットされる値で す。 MD = 2,3 のときは、x,y をそれぞれ X,Y スクロールレジスタにセットされ る値だとすると、RAS_DAT(n,m) = x * &h10000 + y となります。 MD = 6,7 のときは、前のラスタのデータからの差分で与えます。すなわち、 RAS_DAT(n,m) = dx * &h10000 + dy dx, dy : 0 〜 &h3ff ** ** ** ** ** ** ** ** ** X-BASICやぺけ-BASICでラスタスクロールを実行中に、CTRL+C で実行を止めると、ラスタスクロールも止まります。 コンパイルする時には、次の2点を守って下さい。 1:ras_scroll_set() の第3・4パラメータは省略不可能 2:BAStoC で生成したCのソースの、b_exit(); の直前に ras_scroll_exit(); を『必ず』加える。 ras_scroll_exit() は、書き替えたベクタを元に戻したり、割り込みを解除 したりといった後始末を行う関数ですから、もし実行しないまま終了すると、 以降のアプリケーションの実行に支障が出ます。 また、実行中に INTERRUPT で ABORT すると、ras_scroll_exit() を通らな いまま終了してしまいます。 /*-------------------------------------------------------------------- int ras_scroll_stat( COM;int {, FIRST_PAGE;int, LAST_PAGE;int, LOOPS;int} ) /*-------------------------------------------------------------------- ラスタスクロールをコントロールや、状態を獲得を行う。 ** ** ** ** ** ** ** ** ** COM : コマンド COM = -1 :状態を得る。 返り値: > 0 : 残りループ回数 = 0 : 無限ループ < 0 : ラスタスクロール終了 COM = 0 : ラスタスクロールを止めて、データをリセットする 別のデータをセットし直す前は、必ずこの命令を行う COM = 1 : ras_scroll_set() によって与えられてデータにしたがって ラスタスクロール開始 COM = -1,0 の時、残りのパラメータは意味無し COM = 1 の時。 FIRST_PAGE : 開始ページ LAST_PAGE : 終了ページ ページデータの記述は ras_scroll_set() 参照 省略時には、先頭ページ (=0) と末尾ページ (= ras_scroll_set() の PAGES) がそれぞれセットされる。 LOOPS : ループ回数 = 0 : 無限ループ > 0 : その回数のループ 省略時には 0 = 無限ループと見なす /*-------------------------------------------------------------------- void ras_home( X;int {, Y;int} ) /*-------------------------------------------------------------------- ラスタスクロールに対応した、ras_scroll_set() の MD で指定した面の左 上の座標の設定を行う(本来の bg_scroll(), home() などは無効となるので 注意)。 ** ** ** ** ** ** ** ** ** X,Y : セットされる x,y 座標 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.SPDEF.FNC ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ int spfile_def() int palfile_def() の2つの関数が含まれています。 /*-------------------------------------------------------------------- int spfile_def( FILENAME;str, SP_NO;int ) /*-------------------------------------------------------------------- スプライトデータの収められたファイルから、スプライトを定義する。 ** ** ** ** ** ** ** ** ** FILENAME : スプライトデータの収められたファイル名 SP_NO : 定義を始めるスプライト番号 ( 0 〜 255 ) ** ** ** ** ** ** ** ** ** ファイルの形式は以下の通り。 オフセット +&h00 SP_NO 番目のスプライトデータ +&h80 SP_NO + 1 番目のスプライトデータ : : : 各々のスプライトデータは、1パタン当たり 16x16 ドットの大きさで、PCG エリアにそのまま書き込める形式になっている。 /*-------------------------------------------------------------------- int palfile_def( FILENAME;str, PAL_NO;int ) /*-------------------------------------------------------------------- パレットデータの収められたファイルから、パレットを定義する。 ** ** ** ** ** ** ** ** ** FILENAME : パレットデータの収められたファイル名 PAL_NO : 定義を始めるパレット番号 ( 0 〜 15 ) ** ** ** ** ** ** ** ** ** ファイルの形式は以下の通り。 オフセット +&h00 PAL_NO 番目のパレットデータ +&h20 PAL_NO + 1 番目のパレットデータ : : : 各々のパレットデータは、 オフセット +&h00 色コード 0 の色データ +&h02 色コード 1 の色データ : +&h1e 色コード 15 の色データ なお、0 番目のパレットデータはテキストパレットと共用である。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 独り言……でもみんなに聞いてほしいな ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 事の発端は、Oh!X '94年11月号の 48ページの下にある小コラム「外部関数 の集大成を」です。内容は、「外部関数はユーザーのアイデア次第でどんどん 拡張していくことができます。理論上はほとんど不可能なことはありません」 「そろそろX-BASICの集大成的なものをまとめる時機にきているのかも しれません」という二文に集約されていると言っていいでしょう。 これを読んですっかり共感した中谷秀洋は、その後このことをすっかり忘れ てしまいました……終わり。 このままでは本当に終わってしまいますが、後から勘定したら、ちょうどこ のコラムを読んだ半月後から ぺけ-BASICを作り始めるのですから、完全 に忘れ去っていたわけではないようです。 それからおよそ半年。ぺけ-BASICの ver.0.01 を公開し、さあて、こ いつをどう展開しようかと考え込んだ中谷の頭をよぎったのが、「ラスタスク ロールの外部関数」です。 それが僕のオリジナルの考えでないことも一緒に思い出したので、Oh!X を ひっくり返してようやく当のコラムを見つけ出したのでした。その時、むくむ くと次のような野望が頭をもたげてきたのです。 「ぺけ-BASICなら『X-BASICの集大成』とやらの、きっかけなり核 なりになれるんでないかい?」 これまで Oh!X や電脳倶楽部等で発表されてきた外部関数は、お世辞にも広 くたくさんの人に使ってもらえているとは言えないでしょう。その理由はいく つかあると思いますが、「他のみんなが持っているとは限らない」「X-BA SICの遅さを補うための関数であるがゆえ、特殊な用途にしか向かない」の 二つが双壁ではないでしょうか。 ところで拙作ぺけ-BASICは、X-BASICでどうにもならなかったこ とがなんとかなる程度の実行速度を持っています。また、ぺけ-BASICに 外部関数を付属させるという格好を取れば、少なくとも ぺけ-BASICを持 っている人は全員、その外部関数も持っていることになります。 当たり前ですが、それらの外部関数が全て中谷の作ったものである必要なん てどこにもありません。今まで発表されてきた外部関数達にも良い物はたくさ んあります。それらの作者の方々の協力が得られれば、自然『X-BASIC の集大成』は実現してしまうでしょう。 今回の外部関数群は、この野望の実現のためにはまだまだ力不足で、ひいき 目に見てやって、ようやく第一歩目というところが関の山です。 こういう事を考えている人間がいる、という事を知ってもらいたい。賛同し てくれる方がいるかもしれないし、いないかもしれない。一つ確実なことは、 一人で始めることが出来たとしても、一人で続けることは出来ないだろうとい う事だけです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 平成 7 年 6 月 16 日 中谷 秀洋 でんでんネット DEN1608 ( AKSTN. ) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━