-
LIBRARIES PUBLIC DOCUMENT MDOS2LIB
HI-TECH C用MSX-DOS2ディスク入出力関数ライブラリ By Tatsuhiko Syoji 1996,1997
目次
これは何か?
HI-TECH Cは元は、CP/M用のCコンパイラなので、ディスク入出力は、 CP/Mの機能を使って行います。しかし、これでは、ファイルサイズが128バイト単位に なってしまうので、特に、バイナリファイルを扱うときに支障が生じます。 更に、MSX-DOS2の階層化ディレクトリにも対応できません。 我々が使っているOSはMSX-DOS2なので、MSX-DOS2の機能を使って、 ディスク入出力を行なうことで、この問題を解決することができます。 そこで、本ライブラリでは、低水準入出力関数をHI-TECH Cに元々付いてきた ものから、自作のMSX-DOS2の機能を使うものに交換して、1バイト単位の ディスクアクセスをするようにします。更に、階層化ディレクトリにも 対応します。 また、それに伴って、高水準入出力のテキストモードでEOFを不都合なく扱うよう、 一部の高水準入出力関数にも手を加えています。
ファイルリスト
- * .OBJ
- MSX-DOS用に改良した関数の納められたオブジェクトファイルです。
- MSXIO .H
- 低水準入出力関数などを定義したヘッダファイルです。
- DOS2 .H
- MSX-DOS2に依存するMSX-DOSファンクションコール代行関数の
ヘッダファイルです。
- MDOS2 .L
- 本ライブラリのソースファイルです。拙作ELIBR用のソースファイルに
なっています。
- AREL .BAT
- MDOS2.LからOBJファイルを生成するためのELIBR用バッチファイルです。
- CREL .BAT
- 同上
- REPLIB .BAT
- ELIBR等により、生成された.OBJファイルをLIBC.LIBの中の.OBJ
ファイルと差し替えます。
- MDOS2LIB.DOC
- このファイルです。
- CRT2 .AS
- 起動時にDOSのバージョンチェックを行なうスタートアップモジュールの
ソースファイルです。
- CRT2 .O
- 起動時にDOSのバージョンチェックを行なうスタートアップモジュール
- GETARGS2.C
- 引数のワイルドカード展開モジュールのソースファイルです。
- GETARGS2.O
- 引数のワイルドカード展開モジュールです。
- DOS .H
- MSX-DOSファンクションコール代行関数のヘッダファイルです。
- DOS2 .L
- MSX-DOSファンクションコール代行関数のソースファイルです。
拙作ELIBR用のソースファイルになっています。
インストール法+プログラムの組み方
まず、HI-TECH CのLIBC.LIBのオリジナルのバックアップを取ります。 次に、HI-TECH CのLIBR.COMとLIBC.LIB、本パッケージの*.OBJとREPLIB.BATを 同じディスクに入れ、REPLIB.BATを実行します。 後は、プログラムを組む際に、ソースファイルを書く際は、低水準入出力関数を 使う場合は、本セットのMSXIO.Hをインクルードし、高水準入出力関数を使う場合は、 従来通りのヘッダファイルをインクルードします。 そして、リンクの時に、更新されたLIBC.LIBをリンクすることで、 皆さんのHI-TECH Cで組んだプログラムで、MSX-DOS2の機能を利用した関数が 利用できます。
機能拡張
本セットをインストールすると、新たに、これらの関数が利用できます。
#include <msxio.h>
- unsigned char msx_bdos(int no,unsigned short de,unsigned short hl);
- unsigned short msx_bdosh(int no,unsigned short de,unsigned short hl);
- DEレジスタに引数deの内容を、HLレジスタに引数hlの内容を入れてno番目の
BDOS機能を呼び出します。msx_bdosでは、BDOSから戻ってきた際のAレジスタの内容を、同じくmsx_bdoshでは、BDOSから戻ってきた際のHLレジスタの内容を関数の値として返します。 MSX-C V1.1のbdos,bdosh関数の移植版ですが、DOS2はBレジスタをシステムコールに多用したりするので、(最初の引数の上位8バイトをBレジスタに入れているけど)DOS2で有用かどうかは疑問です。
MSX-DOSファンクションコール代行関数
これらの関数を使う場合は、使用するプログラムで、#define DOS2とした後、 DOS.Hをインクルードし、LIBC.LIBの前にLIBD2.LIBをリンクすることで、以下の 関数が利用できます。
- unsigned _dos_getver(void);
- MSX-DOSのバージョン番号を上位バイトに主バージョン番号、、下位バイトに2桁のバージョン番号がBCD値で返ります。また、MSX-DOS1では、0100Hを、MSX-DOSでない場合は0000Hを返します。
- unsigned _dos_getftime(int fd,unsigned *date,unsigned *time);
- ファイルハンドルfdで示されるファイルの日付を*dateに、更新時刻を*timeにセットします。
- unsigned _dos_setftime(int fd,unsigned date,unsigned time);
ファイルハンドルfdで示されるファイルの日付をdateに、更新時刻をtimeの値に変更します。
以下の関数は、MSX-DOS2固有の機能を使っているので、MSX-DOS2専用と なっています。
- int findfirst(unsigned char *path,unsigned attr,MSXFIB *fib);
- int findnext(MSXFIB *fib);
- findfirst()はMSX-DOS2システムコール0x40により、パス名pathとファイル属性attrに一致する最初のファイルを探します。最初に一致したファイルの情報は*fibにセットされます。
- findnext()はMSX-DOS2システムコール0x41により、findfirst()で指定したファイルの検索を続行します。見つかった検索条件に一致するファイルの情報は*fibにセットされます。MSXFIB型は<dos2.h>で次のように定義されています。
typedef struct { unsigned char ff; /* 0xff(FIBの証) */ unsigned char name[13]; /* ファイル名(ASCIIZ) */ unsigned char attr; /* ファイル属性 */ unsigned int time; /* 最終更新時刻 */ unsigned int date; /* 最終更新日付 */ unsigned int cl; /* 開始クラスタ番号 */ long size; /* ファイルサイズ */ unsigned char drive; /* 論理ドライブ番号 */ unsigned char internal[38]; /* 内部情報(変更不可) */ } MSXFIB;
- unsigned setfileattr(char *path, unsigned attr);
- MSX-DOS2システムコール0x50により、pathで示されるファイルの属性を
attrに変更します。成功すると0を返し、失敗するとerrnoをセットして、MSX-DOS2のエラーコードを返します。
MSX-DOS2における変更点
また、chmod,exit,_exit関数が変更されています。
#include <msxio.h>
- int chmod(char *path,int mode);
- MSX-DOS2システムコール0x50により、pathで示されるファイルのモードをmodeに変更します。
- modeには、msxio.hに定義された以下の指定ができます。
- S_IWRITE:書き込み可能
- S_IREAD :読みだし可能(read only)
- S_IREAD | S_IWRITE :読み書き可能
- ただし、MSX-DOS2ではファイルを読み出し禁止にはできませんので、S_IWRITEとS_IREAD | S_IWRITEとは等価になります。
- 成功すると0を返し、失敗するとerrnoをセットして、0以外の値を返します。
- S_IREAD及び、S_IWRITEの定義はオリジナルのSTAT.Hの定義と等価です。
- exit,_exit関数はMSX-DOS2システムコール62Hを使ってエラー番号を伴う終了を行ないます。80Hを引数にして呼び出すことで、バッチファイルが止まります。
この改良により、main関数の引数もMSX-DOS2システムコール62Hの引数になります。main関数は必ず値を返すようにしてください。main関数は正常終了時は0を、異常終了時はそれ以外の値を返すようにしてください。
また、高/低水準入出力関数が失敗したときにエラーの種類をerrnoに セットします。errnoをMSX-DOS2のシステムコール66Hに渡すことでエラーの 種類が説明できます。
CRT2.Oについて
CRT2.OはHI-TECH C標準のCRT.Oの改造版で、起動時にDOSのバージョンをMSX-DOS2システムコール6FHを使って調べ、MSX-DOSのバージョンが2より小さい場合、
Sorry,this program needs MSX-DOS version 2.xx or later.
と表示するだけでプログラムを終了します。MSX-DOS2専用プログラムで 使用してください。
GETARGS2について
GETARGS2はHI-TECH C付属の引数のワイルドカード展開+MSX-DOS1での リダイレクトエミュレーションモジュール、GETARGSの改造版です。改良点と しては、MSX-DOS2の階層化ディレクトリ対応とファイル名の文字コードを 全ビット有効にした事、MSX-DOS2は最初からI/Oリダイレクション機能を 持っているので、リダイレクトエミュレーション機能を削ったことです。 更新後のLIBC.LIBの前にリンクして使います。 例)
LINK -Z -Ptext=0,data,bss -C100H -OSAMPLE.COM CRT.O SAMPLE.O GETARGS2.O LIBC.LIB
制限事項
本ライブラリでは、exec系の関数をサポートしていません。作者自身が実現方法を知らないせいです。m(..)mすんません。
互換性
MSX-DOS1用ライブラリを使うときとソースレベルで互換性を取るには
次の事に気を付ける必要があります。
- 1.DOS2.Hで宣言されている関数、定数を使わない。
- MSX-DOS2に特有な関数、定数の定義をDOS2.Hにまとめています。その為、DOS2.Hで宣言されている関数、定数を使った場合、DOS1用ライブラリをリンクするときなどでエラーが出ます。
- 2.グローバル変数errnoを入出力後に参照しない。
- MSX-DOS1用ライブラリやCP/M用ライブラリでは入出力を行なう際に、errnoに値をセットしていません。
- 3.MSX-DOSファンクションコール代行関数を利用する際は、DOS.Hをインクルードする。
- MSX-DOS1とMSX-DOS2では、ファイルをアクセスする方法が異なっているので、同じ機能を持つ関数でも、関数名が異なっています。そこで、DOS.Hでは、DOS2の定義の有無を見て、同じ機能を持つMSX-DOSファンクションコール代行関数に対し、同じ名前を付けるようにしています。これにより、同一の関数名で、各バージョンのMSX-DOSの能力を生かした関数を利用することができます。
- 更に、低水準入出力関数を使うときのヘッダーファイルに気を付けるとCP/M用ライブラリと互換性を取る事ができると思います。
何故、互換性についてわざわざ述べるかと言うと、それは一言、「必ずしもMSX-DOS2が必要な訳ではないのに、DOS2専用にするプログラムが 多くないか?」という事からです。 本ライブラリは、なるべくMSX-DOS1用とMSX-DOS2用ライブラリの仕様を 同じにして、同じソースファイルからリンクするライブラリを変えることで MSX-DOS1用とMSX-DOS2用プログラムが同じ機能を持ちつつ、DOSの能力にあったディスク入出力を行なう事ができるプログラム製作環境の実現を図って 製作しました。(chmod関数なんか典型的な例ですね。) この環境で、MSX-DOS1/MSX-DOS2両方で使える有用なプログラムが増える 事を期待します。 今からMSX-DOS2やMSX-DOS2内蔵マシンを手に入れるのは面倒ですから...。
著作権他
本ライブラリのライセンスはHI-TECH C for CP/M Version 3.09のヘッダファイルを改変しているためHI-TECH C for CP/M Version 3.09のライセンスに従います。
オリジナルのZ80READ.MEより引用
The HI-TECH Z80 CP/M C compiler V3.09 is provided free of charge for any use, private or commercial, strictly as-is. No warranty or product
support is offered or implied.
You may use this software for whatever you like, providing you acknowledge that the copyright to this software remains with HI-TECH Software.
追加した関数については作者であるTatsuが著作権を所有しています。