countersince January 6, 2001X68000 LIBRARYEnglish
更新日: 2011 年 11 月 15 日
X68000 LIBRARY > ソフトウェアライブラリ > プログラミング > BASIC > ぺけ‐BASIC > ぺけ‐BASIC の外部関数とライブラリの説明

ぺけ‐BASIC の外部関数とライブラリの説明

説明

ぺけ‐BASIC の外部関数とライブラリの説明です。

XBFNC.DOC
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        外部関数とそのライブラリについてのドキュメント

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━



  ぺけ-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. )
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━