SLANG用NEWファイル入出力ライブラリ

伊藤雅彦
 
 Oh!X1988年10月号のSENTINELでSLANG用ファイル入出力ライブラリが発表されました。先頃,私もこれを使ってプログラムを作ろうと思い,ちょっと使ってみると自分の思っているような動作をしてくれない。そこで,調べてみたら次のような問題点が次々と発見されました。
1) IYレジスタを破壊する(SLANGでは動的変数のポインタとしてIYレジスタを使っているから,IYレジスタを破壊するようなプログラムはSLANG用関数とはいえない)
2) ディレクトリ上のファイルサイズのデータを管理していない(そういう仕様であるが、作成したファイルをエディタなどで読み込めないため用途が格段に狭くなる)
3) 同じデバイスの2つのファイルを同時に書き込みオープンして書き込みを行うと,FATの管理ができずに間抜けなことをする(2つのファイルについて別々にFATを管理しているため)
4) ひとつのファイルを2つのファイルナンバーでオープンするとうまく動作しない(このような事態を想定していないため)
 2)〜4)についてはそういう仕様だといい切れるかもしれませんが,やっぱりプログラムを作るうえで問題となります。確かにそういうものだと納得するのもいいですが僕は思い切ってこれらの問題点を解消して,さらに機能拡張した新関数を作成してしまいました。だだし4)については,ファイルをすべて読み込みオープンした場合のみサポートしています。
 

◆拡張された新関数の機能

 使い方は旧関数と同じで,拡張した機能は以下のとおりとなっています。
1) ファイルナンバーを0〜3の4つに増やした。
2) FSEEK関数以外では,HLレジスタだけでエラーチェックまでできる(HLレジスタの内容はSLANG関数の戻り値になるためエラーチェックまでできると便利)
3) FSEEK関数のシークモードにファイルの終端を基準とするそードを追加した
4) セクタ単位のほかにクラスタ単位でディスクアクセスをすることができる
5) ディレクトリ上のファイルサイズのデータが0000Hであるファイル(つまり旧関数で新規作成されたファイル)をオープンした場合,FATから大雑把なファイルサイズを割り出して管理を行う(ファイルサイズ管理をきちんとしたため旧関数で作成したファイルを正常に扱うことができなくなった点を解消)
 ただし,5)の機能でこれで旧関数で作成したファイルもかなり救われますが,ほとんどの場合はファイルに余計なデータがくっついた格好になります。またエディタなどで作成し,旧関数でデータを追加したファイルは正常に扱えません。この場合にはディスクエディタなどを使ってディレクトリ上のデータを修正してください。
 

◆機能一覧&エラーナンバー&ワークエリア

 それぞれの関数の機能をリファレンスにまとめておきました。なお,アドレスはライブラリ先頭アドレスからのオフセットです。次はエラーナンバーについて説明します。関数でエラーが発生したときにエラーナンバーを返しますが,S-OSで決められているエラ一番号1〜14のほかに15〜20の番号を返す場合があります。それらの意味は表1のとおりです。ワークエリアについては表2にまとめておきました。これらのワークエリアは,ファイルオープン中に書き換えてはいけませんので注意してください。
 なお1989年12月号で紹介された,ファイルリダイレクションライブラリ「DIO.LlB」には対応していませんので注意してください。
〈参考文献〉
Oh!X1988年10月号SENTINEL(禁門真人)
Oh!MZ1987年9月号X68000BASIC入門
「激震のファイル入出力関数」(中森章)
Oh!MZ1987年10月号X68000BASIC入門
「追撃ランダムファイル」(中森章)
Oh!X1990年8月号X-BASICプログラミング調理実習「超入門・ファイル処理」(泉大介)
Oh!X1990年9月号X-BASICプログラミング調理実習「ファイルの魔術師fseek関数」(泉大介)
 
表1 エラーナンバー
15 Bad Device
 デバイスがディスクではない
16 Open Mode Error
 読み込みモードでオプンしたファイルに書き込みを行おうとした。あるいは書き込みモードでオープンしたファイルから読み込みを行おうとした
17 Out of File
 ファイルポインタがファイル外になってしまった
18 Already Open
 オープンしようとしたファイルナンバーがすでにオープン中のファイルに存在する
19 Double Open
 オープンしようとしたファイルがすでにほかのファイルナンバーでオープンされている
20 Too Long File
 ファイルサイズが長すぎる(65535バイトを超えている)
 
表2 ワークエリア
0000H:ディスクアクセスをセクタ単位で行うかクラスタ単位で行うかの指定(初期値は1)
   0:セクタ単位(ランダムっぽいアクセス向き)
   1:クラスタ単位(シーケンシャルっぽいアクセス向き)
0001H:FATバッファの先頭アドレス(下位)
0002H:FATバッファの先頭アドレス(上位)
   このアドレスから400HバイトをFATバッファとして使用。ただし,使用するデバイスが3つ以下の場合には,デバイスの数×100Hバイトを使用
0003H:ファイルアクセス用のデータバッファの先頭アドレス(下位)
0004H;ファイルアクセス用のデータバッファの先頭アドレス(上位)
   ディスクアクセスをセクタ単位で行う場合は,このアドレスから400Hバイトを使用。クラスタ単位の場合は4000Hバイトを使用
   FATバッファの初期値はC800H,データパッファの初期値はCC00Hになっています。
 

SLANG用NEWファイル入出力ライブラリ
リファレンスマニュアル

・FOPEN(FNO,FNAME,MODE)
機能:ファイルをオープンする
アドレス:0048H
 FNO(HL):ファイルナンバー
 FNAME(DE):ファイル名が格納されている先頭アドレス
 MODE(BC):オープンモード
   0:読み込み専用
   1:書き込み専用
   2:読み書き両用
   3:新規オープン
戻り値
正常終了:Cy=0,A=0
    H=0,L=0
エラー  :CY=1,A=エラーナンバー
    H=FFH,L=エラーナンバー
・FSEEK(FNO,OS,MODE)
機能:ファイルポインタを移動する
アドレス:01C5H
 FNO(HL):ファイルナンバー
 OS(DE)ファイルポインタの移動位置のオフセット
 MODE(BC):移動位置の基準
   0:ファイルの先頭(OSの値は0〜65535とみなされる)
   1:現在のファイルポインタの位置(OSの値は-32768〜32767とみなされる)
   2:ファイルの終端(OSの値は-65535〜0とみなされる)
戻り値
正常終了:Cy=0,A=0
    HL=移動後のファイルポインタの位置
エラー  :Cy=1,A=エラーナンバー
    HL=FFFFH
・FPUTC(FNO,CHR)
機能:ファイルに1バイトデータを書き込む
アドレス:0216H
 FNO(HL):ファイルナンバー
 CHR(DE):書き込む1バイトデータ
戻り値
正常終了:Cy=0,A=0
    H=0,L=0
エラー  :Cy=1,A=エラーナンバー
    H=FFH,L=エラーナンバー
・FGETC(FNO)
機能:ファイルから1バイトデータを読み込む
アドレス:0225H
 FNO(HL):ファイルナンバー
戻り値
正常終了:Cy=0,A=0
    H=0,L=読み込んだデータ
エラー  :Cy=1,A=エラーナンバー
    H=FFH,L=エラーナンバー
・FCLOSE(FNO)
機能:ファイルをクローズする
アドレス:030FH
 FNO(HL):ファイルナンバー
戻り値
正常終了:Cy=0,A=0
    H=0,L=0
エラー  :Cy=1,A=エラーナンバー
    H=FFH,L=エラーナンバー
 
(C)1991 Masahiko Itou(original)
(C)1997 Junji Okazaki(edited)
(C)2024 Oh!Ishi,Nibbles Lab.(formatted)