FENIX System Call Manual


FENIX Ver0.2 Copyright (C) 1991-1998 S.Uchida
fsh Ver0.2 Copyright (C) 1991-1998 S.Uchida

FENIXではSVC・FNCがそのまま使えますが、更に新しくFXCというファンクションコールを使用することができます。 これは、RST38Hを用いて呼び出すことができます。
    RST     38H
    DEFB    10H  ← ファンクション番号
のようにSVC・FNCと同様に呼び出して下さい。

ただし、呼び出し時に裏レジスタが破壊されます。

また、一部のファンクションはコモンエリア内のワークエリアを使用しています。

    KEYBUF (0A01H 〜 0B0FH)
    BUF2   (0B10H 〜 0C1FH)
が、主なものです。 使用する場合は明記してありますので、これらのワークエリアを使用する場合は充分注意してください。

なお、各処理にジャンプする前にBREAKチェックを行っています。 そのためFXCを用いている部分では、

        BREAK     ... 一時停止
    shift + BREAK ... ブレーク処理
という処理が可能です。 このBREAKチェックは、FXC .SETHALT (31H) によってON/OFFできます。

FXCをソフトウェアTSRなどでフックして使うこともできます。 例えば .SHELL (30H) がシェルのために用意されています。

FXCは 2003H からジャンプアドレスのテーブルが用意されています。 例えば .SHELL のジャンプアドレスは、

    2003H + 30H * 2 = 2063H
となり、(2063H),(2064H) にアドレスが格納されていることが分かります。 この内容を書き換えることによってジャンプ先を変更することができます。

★★ FXCファンクション一覧 ★★


★ .CHKFILE   No.00H

ファイル名を解釈し、そのステータスを調べる。
入力 :DE ファイル名へのポインタ(アドレス任意、KEYBUF内は不可)
 
出力:Cf=1 ... 指定ファイルが存在しない
 Cf=0 ... 指定ファイルが存在する。
      HL ファイル情報(32byte)へのポインタ
 
破壊:AF,HL
内部で SVC .DEVFN (2DH) を実行していますので、このファンクションを実行後そのままIOCSでファイルアクセスすることも可能です。

KEYBUFが破壊されます。 .TRSFN.SETWILD の後で実行するのは避けて下さい。


★ .CHKOBJ   No.01H

オブジェクト名を解釈し、そのステータスを調べる。
入力 :DE オブジェクト名へのポインタ(End code 00)
 
出力:Cf=1 ... 指定オブジェクトが存在しない
 Cf=0 ... 指定オブジェクトが存在する
      HL オブジェクト管理テーブルへのポインタ
      A  オブジェクトID
 
破壊:AF,HL

★ .TRSFN   No.02H

文字列をコモンエリア内(KEYBUF)に転送し、長さを数える。
入力 :DE 文字列へのポインタ(End code 00)
 
出力:DE KEYBUF
 B  文字列の長さ
 
破壊:AF,B,DE
SVC .COUNT (17H) の代わりに使用して下さい。 ファイル名などがどこのアドレスにあっても解釈できるようになるので便利です。

★ .GETLU   No.03H

IOCS用のLUで、未使用、最小のものを求める。
入力 :---
 
出力:A 未使用LU最小値
 
破壊:A
このファンクションを使えば、ユーザーがLUを設定する必要がなくなります。 標準入出力で常にファイルがオープンされていますので、ユーザーが定めたLUを用いてファイルをアクセスするのは避けて下さい。

★ .U_OPEN   No.04H

統一アクセスのオープン処理を行う。 .CHKFILE(ファイルの場合)か .CHKOBJ.CHNGOBJ(オブジェクトの場合)を実行した後呼び出す。
入力 :A  1...Read open , 2...Write open , 3...Append open
 C  1...OBJ (bin) , 2...BTX (dat), 3...BSD (txt) , 4...BRD
   ()内はオブジェクトの場合の属性。
   ファイルの場合は Write の時のみ必要。
   オブジェクトの場合は Write,Append の時に必要。
 DE セーブ長(OBJ,BTX の Write の時のみ必要)
 
出力:A  LU番号
 
破壊:AF
OBJ,BTX は Append open できません。 カーネルはオブジェクトの名前は気にせず、IDのみで管理します。 既存のオブジェクトと同じ名前のオブジェクトをオープンすると、エラーにならずに同じ名前のオブジェクトが作られます。注意して下さい。

★ .U_READ   No.05H

統一アクセスの読み出し。
入力 :A  LU番号
 HL 入力バッファアドレス(アドレス任意)
 
出力:Cf=1 ... EOF
 
破壊:AF
内部でデータを一旦 BUF2 に読み出し、そこから転送しています。 対象がBRDファイルの場合、最後のデータの次のデータを読み込まないとEOFが返ってきません。注意して下さい。

OBJ,BTX にアクセスすると KEYBUF が破壊されます。


★ .U_WRITE   No.06H

統一アクセスの書き込み。
入力 :A  LU番号
 HL 出力バッファアドレス(アドレス任意)
 
出力:Cf=1 ... EOF(OBJ,BTX時のみ)
 
破壊:AF
内部で BUF2 に転送してから書き込んでいます。 OBJ,BTX にアクセスすると KEYBUF が破壊されます。

★ .U_CLOSE   No.07H

統一アクセスのclose,kill。
入力 :A  LU番号
   A = 0...オープンされている全ファイル/オブジェクトが対象
 B  0...kill , not 0...close
 
出力:---
 
破壊:AF
A=0 で呼び出しても標準入出力はclose,killされません。 また、OBJ,BTX をkillすることはできません。(何も処理されない)

★ .OBJRND   No.08H

統一アクセス(オブジェクト)の読み出しポイント参照/設定。
入力 :A  オブジェクト用のLU(80H 〜 )
 C  1...参照 , 2...設定
 HL ポイント ... L=LMB , H=block(設定時)
 
出力:HL ポイント ... L=LMB , H=block(参照時)
 
破壊:AF,HL
ファイル管理テーブルの構造を参照して下さい。 実際はオブジェクトかどうかの判別は行っていないので、OBJ,BTX のファイルでもランダムアクセスは可能となります。

★ .STDINIT   No.09H

オープンされている全ファイルをcloseし、標準入出力をオープンする。
入力 :---
 
出力:---
 
破壊:AF,BC,DE,HL
シェルが使用しています。ユーザーは不用意に使わないで下さい。

★ .REDIN   No.0AH

標準入力をkillし、リダイレクトオープンを行う。
入力 :DE リダイレクトファイル名へのポインタ
 
出力:---
 
破壊:AF
シェルが使用しています。ユーザーは不用意に使わないで下さい。

★ .REDOUT   No.0BH

標準出力をkillし、リダイレクトオープンを行う。
入力 :DE リダイレクトファイル名へのポインタ
 A  2...write , 10H...append
 
出力:---
 
破壊:AF
シェルが使用しています。ユーザーは不用意に使わないで下さい。

★ .STDIN1   No.0CH

標準入力から1バイト読み込む。
入力 :---
 
出力:A  データ , Cf=1 ... EOF
 
破壊:AF
データが EOF code の場合も EOF を返します。

★ .STDOUT1   No.0DH

標準出力へ1バイト出力する。
入力 :A データ
 
出力:---
 
破壊:AF

★ .STDINL   No.0EH

標準入力から1行読み込む。
入力 :DE 入力バッファ
 
出力:B  長さ , Cf=1 ... EOF
 
破壊:AF,BC
最後の 0DH は取り除かれます。 最初のデータが EOF code の場合も EOF を返します。

バッファは 8000H 以降かコモンエリア内になければなりません。


★ .STDOUTN   No.0FH

標準出力へnバイト出力する。
入力 :DE 出力バッファ
 B  長さ
 
出力:---
 
破壊:AF
バッファは 8000H 以降かコモンエリア内になければなりません。

★ .REDSTAT   No.10H

リダイレクトの状態を調べる。
入力 :---
 
出力:A  bit0 = 1 ... 標準入力がリダイレクトされている。
   bit1 = 1 ... 標準出力がリダイレクトされている。
 
破壊:A

★ .SETSTD   No.11H

標準入出力の各種設定を行う。
入力 :C = 0 ; EOF code を設定する。
 A  EOF code
 
出力:---
 
破壊:---
シェルが使用しています。ユーザーは不用意に使わないで下さい。 Ver0.11 以降で拡張されます。

★ .EXECOBJ   No.12H

オブジェクトを起動する。
入力 :A  オブジェクトID
 HL 現在のマッピングデータへのポインタ
 その他起動に必要な設定(通常 DE に引数へのポインタ)
 
出力:オブジェクトからの返り値
 
破壊:オブジェクトの動作に依存
呼び出し時のマップデータをスタックに積み、オブジェクトを起動します。 したがってこのファンクションは多重呼び出しが可能です。

スワップに対応するため、現在のマッピングデータが必要となります。 フォーマットは .MAPMEM を参照して下さい。

実行許可がないとエラーになります。


★ .KILLOBJ   No.13H

オブジェクトを消去する。
入力 :A  オブジェクトID
 
出力:---
 
破壊:AF,BC,DE,IX
書き込み許可がないか、TSRオブジェクトだとエラーになります。

また、オブジェクトを殺すと同時に、そのオブジェクトが持っている共有メモリ領域も解放します。


★ .CHNGOBJ   No.14H

アクティブオブジェクトの変更、及び統一アクセスオブジェクトの設定。
入力 :A  オブジェクトID
 
出力:Cf=1 ... 未使用オブジェクトを指定した(IDは以前の値を保持)
 
破壊:---
以下のファンクションにおいて、アクティブオブジェクトとはこのファンクションで設定されたオブジェクトのことを指します。

.EXECOBJ を用いれば、起動時にそのオブジェクトのIDに設定されます。


★ .SWOFF   No.15H

アクティブオブジェクトの指定LMBをスワップ不可にする。
入力 :A  LMB番号
 
出力:---
 
破壊:AF
スワップされていればメインRAM内に戻されます。

★ .SWON   No.16H

アクティブオブジェクトの指定LMBをスワップ可にする。
入力 :A  LMB番号
 
出力:---
 
破壊:AF
TSRオブジェクトだと何もしません。

★ .GETMB   No.17H

アクティブオブジェクトの新規MBを確保する。
入力 :A  マッピングモード(括弧内は確保するメモリの優先順位)
   A = 0 ; main のみ      ( main,EMM,VRAM )
   A = 1 ; main 優先 VRAM も可 ( main,VRAM,EMM )
   A = 2 ; VRAM 優先 main も可 ( VRAM,main,EMM )
   A = 3 ; VRAM 優先 main も可 ( EMM,VRAM,main )
 
出力:Cf=0 ... A  確保したMBのLMB番号
      C  確保したMBの実MB番号
 Cf=1 ... メモリがないか、オブジェクトが512KBを越えます。
 
破壊:AF,BC
オブジェクトの書き込み許可がなくても動作します。

★ .RELMB   No.18H

アクティブオブジェクトのLMBを解放する。
入力 :A  LMB番号
 
出力:Cf=1 ... LMB番号オーバー
 
破壊:AF
LMB番号は常に連続です。例えばLMB0〜5を有するオブジェクトのLMB3を解放すると、LMB4,5が3,4に繰り上がります。

★ .LMBNO   No.19H

アクティブオブジェクトのLMBの実MB番号を求める。
入力 :A  LMB番号
 
出力:A  実MB番号(0FFH...存在しないLMBを指定した)
 
破壊:AF

★ .MAXLMB   No.1AH

オブジェクトの最大LMBを求める。
入力 :A  オブジェクトID
 
出力:IX オブジェクト管理テーブルへのポインタ
 A=0FFH ... MBが確保されていない。
 A<>0FFH ... A  最大LMB番号
       B  実MB番号
 
破壊:AF,BC,IX

★ .MAPMEM   No.1BH

アクティブオブジェクトのメモリマッピングを行う。
入力 :HL マッピングデータへのポインタ
 
出力:---
 
破壊:AF
マッピングデータは (HL) 〜 (HL+5) の6バイトから成ります。 それぞれのデータがバンク2〜7に対応しています。 バンク0はコモンエリア、バンク1はカーネルが配置されています。

各データは、

00H 〜 3FH ... LMB
80H 〜 BFH ... 実MB (00H 〜 3FH)
とします。

実MBの書式はPCGやVRAMなどをマッピングする時だけにして下さい。 スワップの関係上RAMを直接呼び出すのは危険です。

メモリマッピングは必ず .MAPMEM.MAPMB1 を用いて行って下さい。 スワップが生じると実MBとLMBの対応が崩れる恐れがありますので、独自にマッピングを行うのはお勧めできません。


★ .MAPMB1   No.1CH

アクティブオブジェクトの1ブロックのマッピングを行う。
入力 :A  MBデータ( .MAPMEM 参照)
 C  バンク(2〜7)
 
出力:---
 
破壊:AF

★ .OBJATTR   No.1DH

オブジェクトのデフォルトアトリビュートを変更する。
入力 :A  アトリビュート
   bit0...x , bit1...w , bit2...r (1で禁止)
 
出力:---
 
破壊:---
オブジェクト生成(.U_OPEN)時に設定されるアトリビュート値です。

★ .LRUTAD   No.1EH

スワップ用LRUリストテーブルへのポインタを求める。
入力 :A  MB(00H 〜 2FH)
 
出力:HL リストテーブルのアドレス
 
破壊:HL
LRUテーブルの構造を参照して下さい。

★ .BLKTAD   No.1FH

メモリブロック管理テーブルへのポインタを求める。
入力 :A  MB(00H 〜 7FH)
 
出力:HL 管理テーブルへのポインタ
 
破壊:HL
管理テーブルの構造を参照して下さい。

★ .FILETAD   No.20H

ファイル・オブジェクトアクセス管理テーブルへのポインタを求める。
入力 :A  LU - 80H(00H 〜 0FH)
 
出力:HL 管理テーブルへのポインタ
 
破壊:AF,HL
管理テーブルの構造を参照して下さい。

★ .OBJTAD   No.21H

オブジェクト管理テーブルへのポインタを求める。
入力 :A  オブジェクトID
 
出力:IX 管理テーブルへのポインタ
 
破壊:IX
管理テーブルの構造を参照して下さい。

★ .ERRMSG   No.22H

エラーメッセージを表示する。
入力 :A  エラーコード
   A < 71 ... IOCSエラー
   A = 71,72 ... カーネルエラー
   A > 72 ... ユーザーエラー , DE メッセージへのポインタ
 
出力 :---
 
破壊 :AF
SVC .ERRX (1BH) の拡張です。詳細はエラー処理を参照して下さい。

★ .CHKMB   No.23H

メモリの使用状況をチェックし、管理テーブルを再構成する。
入力 :---
 
出力:---
 
破壊:AF,BC,DE,HL
NEWONによってメモリを解放したり、独自にコモンエリアのテーブルを用いてメモリを確保するなど、FENIXを介さずにメモリの使用状況を変更した場合に呼び出して下さい。

★ .DIRLIST   No.24H

ワイルドカードを含むファイル名からファイルリストを生成する。
入力 :DE ファイル名へのポインタ(アドレス任意)
 A=0  :"." で始まるファイルに対しては
     ワイルドカードで明示しない限り反応しない
 A<>0 :全てのファイルに反応する
 
出力:A  マッチしたファイル数
 
破壊:AF
A=0 の場合、".*" や ".???" など、"." で始まるファイルであることを明示しているワイルドカードでないと "." で始まるファイルにはマッチしません。

通常、"." で始まるファイルというのはFENIXでは特殊なファイルですので他のファイルと区別します。 サブディレクトリ内で使用した場合 "." や ".." にも反応しないので都合がいい場合があります。

内部ディレクトリバッファ(3800H 〜 3FFFH)にリストを生成します。 .SETWILD で使用します。


★ .SETWILD   No.25H

ワイルドカードを含むファイル名を補完する。
入力 :DE ファイル名へのポインタ(アドレス任意)
 A  ファイルの番号(0 〜 マッチしたファイル数−1)
 
出力:DE ワイルドカードを補完したファイル名へのポインタ
 
破壊:AF,DE
.DIRLIST で生成されたリストを用いて、ワイルドカードを含むファイル名を実際のファイル名に変換します。 入力のファイル名に、デバイス名やパス名が入っていても構いません。

出力バッファには KEYBUF が使用されます。(DE = KEYBUF ではありません。)


★ .OPTSCR   No.26H

option screen を実行する。(BASICマニュアル参照)
入力 :A  モード(1〜4)
 
出力:Cf=1 ... 実行不可
 
破壊:AF
モード4以外を指定すると init "CRT2:320,200,16" が実行されます。 モード4を指定した場合はハードウェアビューポートが閉じられます。 モード4から他の状態に変更することもできます。

★ .LOADOBJ   No.27H

ファイルをロードしてオブジェクトを生成する。
入力 :DE ファイル名へのポインタ
 A  オブジェクトタイプ(0;default , 1;bin , 2;dat , 3;txt)
 
出力:A  オブジェクトID
 
破壊:AF
入力のファイル名に、デバイス名やパス名が入っていても構いません。 オブジェクト名はファイル名と同じになります。 内部ディレクトリバッファ、KEYBUF、BUF2 を破壊します。

入力パラメタとして A=0 を入力した場合、デフォルトタイプロードとなります。 すなわちファイルタイプに応じて自動的にオブジェクトタイプを決定します。 具体的には

OBJ ... bin
BTX,BRD ... dat
BSD ... txt
となります。

★ .SAVEOBJ   No.28H

オブジェクトをファイルにセーブする。
入力 :DE セーブするディレクトリ名へのポインタ
   カレントディレクトリなら (DE)=0 にする。
 A  オブジェクトID
 C  ファイルタイプ
   (1...OBJ , 2...BTX , 3...BSD , 4...BRD)
 
出力:---
 
破壊:AF
ファイル名はオブジェクト名と同じになります。 サイズが64KB以上の場合、強制的にファイルタイプは BRD になります。

内部ディレクトリバッファ、KEYBUF、BUF2 を破壊します。


★ .TSRON   No.29H

アクティブオブジェクトをTSR化する。
入力  出力
A= 8 ; ソフト割り込み(Sft)
    HL オブジェクトコールアドレスHL 割り込みコールアドレス
 
A= 9 ; 0.1秒タイマ割り込み(Tim)
    HL コールアドレスHL コールアドレス
DE タイマテーブルのアドレス
  (コモンエリアのテーブル)
 
A= 10 ; PIO(PIO)
    HL コールアドレス(2個分)HL 割り込みアドレス(2個分)
      へのポインタ  へのポインタ
DE 元の割り込みアドレス
  (2個分)へのポインタ
 
A= 11 ; SIO(SIO)
    HL コールアドレス(8個分)HL 割り込みアドレス(8個分)
      へのポインタ  へのポインタ
DE 元の割り込みアドレス
  へのポインタ(=2F8H)
 
A= 12 ; VBLANK(VBL)
A= 13 ; 8253(INT)
A= 14 ; プリンタ(PRT)
A= 15 ; RTC(RTC)
A= 16 ; 優音(MCP)
    HL コールアドレスHL 割り込みコールアドレス
DE 元の割り込みアドレス
  へのポインタ
 
 
全入力に対して ; Cf=0 ... OK
 Cf=1 ... エラー
 
破壊 :AF,DE,HL
入力に渡すアドレスはオブジェクト内の割り込み処理ルーチンのアドレスで、出力されるアドレスはコモンエリア内の、割り込みが生じたときにコールされるアドレスです。

ハードウェアTSRの場合、元々IOCSが使用していた割り込みベクタが格納されているアドレスも出力されます。 これらのアドレスを元に割り込みの設定を行って下さい。

ファンクション自体は割り込み処理ルーチンをセットするだけで、割り込みを行うための設定は何も行いません。

登録を行うと、そのオブジェクトが書き込み禁止になります。

実際のTSRの使用法については Technical manual を参照して下さい。


★ .TSROFF   No.2AH

アクティブオブジェクトの指定TSRタイプを解除する。
入力 :A  割り込みタイプ(8〜15)
 B  ローカルテーブル番号(Sft,Tim のみ必要)
 
出力:Cf=0 ... A  変更後のオブジェクトタイプ
 Cf=1 ... エラー
 
破壊:AF
タイプがTSRのままだと、.KILLOBJ.SWON が動作しません。 ローカルテーブル番号とは何か、ということについては、Programmer's manual を参照して下さい。

★ .TSRENT   No.2BH

割り込みエントリアドレスを求める。
入力 :A  割り込みタイプ
 C  オブジェクトID
 B  ローカルテーブル番号 (B,C は Sft,Tim の場合のみ有効)
 
出力:Cf=0 ... HL エントリアドレス(PIO,SIO の場合はポインタ)
      B  TSR管理テーブル番号(Sft,Tim の場合のみ)
 Cf=1 ... エラー
 
破壊:AF,BC,HL
ハード割り込みの場合は A の値のみで出力が決定されますが、ソフト割り込みとタイマ割り込みは B,C を設定して呼び出す必要があります。

タイプが PIO,SIO の場合、それぞれ2個分、8個分のエントリアドレスへのポインタが渡されます。(.TSRON で返される HL の値と同じ)

TSR管理テーブル番号については、Programmer's manual を参照して下さい。


★ .TSRTAD   No.2CH

TSR管理テーブルへのポインタを求める。
入力 :A  割り込みタイプ
 B  TSR管理テーブル番号(Sft,Tim の場合のみ)
 
出力:Cf=0 ... HL  管理テーブルへのポインタ
 Cf=1 ... エラー
 
破壊:AF,HL
詳しくはTSR管理テーブルの構造を参照して下さい。 マッピングの細かい変更などに利用できます。

★ .MALLOC   No.2DH

アクティブオブジェクトをオーナーとして共有メモリを確保する。
入力 :HL 確保するサイズ
 
出力:Cf=0 ... 確保成功
      HL 確保した領域の先頭アドレス
 Cf=1 ... 確保失敗
 
破壊:AF,HL
確保した領域の最終アドレスと、現在のスタックポインタとのアドレスの差が32バイト以内になる場合は、安全のため確保失敗と判定されます。

★ .MFREE   No.2EH

共有メモリを解放する。
入力 :HL 解放する領域内アドレス
 
出力:Cf=1 ... 該当領域なし
 
破壊:AF
アクティブオブジェクトがオーナーでなくても動作します。

★ .MEMTAD   No.2FH

共有メモリ管理テーブルへのポインタを求める。
入力 :HL 領域内アドレス
 
出力:Cf=0 ... HL 該当領域の管理テーブルへのポインタ
 Cf=1 ... 該当領域なし
 
破壊:AF
共有メモリ管理テーブルの構造を参照して下さい。

★ .SHELL   No.30H

シェルをソフトウェア割り込みで使用するためのファンクション。
入力 :---
 
出力:Cf=1
 
破壊:F
このファンクションはそのままでは意味がありません。

シェルをソフトウェア割り込みとして登録して、このファンクションの呼び出しアドレスをフックすることによってシェルをソフトウェア割り込みで動かします。 詳しくはシェルのマニュアルを参照して下さい。

この機能は fsh Ver0.11b 以降でサポートされています。


★ .SETHALT   No.31H

FXC 実行時の BREAK チェックの on/off を行う。
入力 :A=0  ; BREAK チェックを off にする。
 A<>0 ; BREAK チェックを on にする。
 
出力:---
 
破壊:F
BREAKチェックを off にすると、いざという時に shift+BREAK で止められなくなりますので、充分に注意して使用して下さい。

★ .EUNE   No.32H

MIDIボード「優音」を制御するためのファンクション。
入力 :---
 
出力:C=0FFH , Cf=1
 
破壊:F,C
このファンクションはそのままでは意味がありません。 オブジェクトをソフトウェア割り込みとして登録して、このファンクションの呼び出しアドレスをフックすることによってソフトウェア割り込みで動かします。

詳しくは優音用シェルのマニュアルを参照して下さい。


現在設定されているファンクションは以上です。
FENIXのメインページに戻る