MSX-DOS のファンクションコールです。Disk BASIC でも使用できます。
主にディスクアクセスの機能へアクセスするためにで使用します。
- MSX-DOS・2 = CALL 0005H
- Disk BASIC = &HF37D を実行
レジスタは基本的に破壊されます。
必要なレジスタはスタックに入れるか領域に保存して下さい。
このページでは MSX-DOS2 上位互換
Nextor のファンクションコールについても触れています。
あえて 1 ページに短くまとめて、
ページ検索で目的のルーチンを見つけられるようにしています。
CP/M や MSX-DOS1 でファイルを管理するために扱う領域です。
MSX-DOS2 でも CP/M・MSX-DOS1 との互換動作として使用可能です。
実行ファイルのパラメータとしてファイル名をいれた場合、
005CH および 006CH に展開されているため、
ここを FCB として開く事ができます。
または実行ファイルの領域内に領域を設けます。
1 ファイルで必要な FCB は 36 バイトです。
- 番地+0 ドライブ番号(0=カレント、1=A:、2=B:、……8=H)
- 1~8 ファイル名(満たない場合はスペース)
- 9~11 拡張子(満たない場合はスペース)
- 12 カレントブロック
- 13 システムで使用
- 14~15 レコードサイズ
- 16~19 ファイルサイズ(バイト)
- 20~21 最終アクセス日付 YYYYYYYM MMMDDDDD
(年 0~99 が +1980 を加えた西暦)
- 22~23 最終アクセス時間 HHHHHMMM MMMSSSSS
(秒 0~29 は 2 倍)
- 24 デバイス ID
- 25 ディレクトリロケーション
- 26~27 先頭クラスタ
- 28~29 最終クラスタ
- 30~31 相対位置
- 32 カレントレコード
- 33~35 ランダムレコード
ファイルを開く場合、0~12 を満たします。12 のカレントブロックは通常 0 です。
ファイルの検索などではファイル名・拡張子として
ワイルドカード ? を使用できます。
ファイルを開くとドライブ番号がカレントだった場合は実ドライブに変更され、
12~31 はファイル情報で満たされます。
ファイルの中身を転送する領域の事です。
CP/M との互換性として 128 バイトが使用され、
デフォルトでは 0080H~00FFH を使用します。
この領域はアプリケーションの空いた領域に割り当てる事で、
ディスクアクセスを減らし、
高速化するなどする事が可能です。
ファンクション番号を C レジスタ、その他必要な入力レジスタを設定し、
MSX-DOS では 00005h、Disk BASIC では F37DH を CALL します。
BDOS では基本的にレジスタは破壊されます。
必要なレジスタは PUSH してスタックに入れるか、
領域へ値を入れて保存して下さい。
-
C=00H _TERM0 システムリセット CP/M
MSX-DOS・Disk BASIC のコマンドレベルへ戻します。
-
C=01H _CONIN コンソール入力 CP/M
・出力レジスタ A=キャラクターコード
1 文字入力します。ない場合は入力待ちになります。
CTRL+C は中断 DOS・BASIC へ戻されます。
CTRL+P はプリンターエコー・CTRL+N はプリンターエコー解除です。
これらのキーは入力対象となりません。
-
C=02H _CONOUT コンソール出力 CP/M
・入力レジスタ E=キャラクターコード
1 文字出力します。
コンソールから CTRL+S が押された時は一時停止し、
キーを押して再開できます。
-
C=03H_AUXIN 補助入力 CP/M
・出力レジスタ A=キャラクターコード
補助入力機器から 1 文字入力します。
補助入力機器がない場合、A には 1AH(EOF)を返します。
-
C=04H _AUXOUT 補助出力 CP/M
・入力レジスタ E=キャラクターコード
補助出力装置へ 1 文字出力します。
補助出力機器がない場合、何もせずに破棄されます。
-
C=05H _LSTOUT プリンタ出力 CP/M
・入力レジスタ E=キャラクターコード
プリンターへ 1 文字出力します。
-
C=06H_DIRIO 直接コンソール入出力 CP/M
・入力レジスタ E=FFH 入力を受け付ける FFH以外 出力するコード
・出力レジスタ A=00H なし 00H 以外 入力されたコード
入力文字はエコーバック・コントロール処理しません。
出力はプリンターへエコーバックしません。
-
C=07H _DIRIN 直接コンソール入力
・出力レジスタ A=キャラクターコード
-
C=08H _INNOE コンソール入力
・出力レジスタ A=キャラクターコード
-
C=09H _STROUT 文字列出力 CP/M
・入力レジスタ DE=文字列開始番地
$ を文字列の終端としてそれ以前までを出力します。$ は出力できません。
Nextor で Fast STROUT モード(C=71H)が有効の場合、
511 バイトまで有効です。
-
C=0AH _BUFIN 文字列入力 CP/M
・入力レジスタ バッファの先頭番地
入力のためのバッファを確保する必要があります。
最大入力は 255 文字ですが、任意に決められます。
バッファの先頭番地 1 バイトには
バッファのバイト-2=入力文字数を入れます。
入力後、先頭番地+1 には入力された文字数、
先頭番地+2 以降に文字列が入ります。
-
C=0BH _CONST コンソール入力状態の確認 CP/M
・出力レジスタ A=FFH 入力あり 00H 入力なし
C=08H では確認を行うだけで、中身は取り出しません。
-
C=0CH _CPMVER CP/M バージョン情報の獲得 CP/M
・出力レジスタ HL=0022H
CP/M との互換として用意されています。
MSX-DOS・2 では常に 0022H 固定です。
-
C=0DH _DSKRST ディスクリセット CP/M
デフォルトドライブを A:、DTA を 0080H に設定します。
ディスクに書き込んでいなかった場合、リセット前に書き込まれます。
-
C=0EH _SELDSK デフォルトドライブの設定 CP/M
・入力レジスタ E=ドライブ番号(A=0、B=1、……、H=7)
ドライブ番号 0 が指定された場合のドライブになります。
接続されていないドライブが指定された場合、変更されません。
-
C=0FH _FOPEN FCB ファイルオープン CP/M
・入力レジスタ DE=FCB 先頭アドレス
・出力レジスタ A=0 オープン成功 FFH=オープン失敗
-
C=10H_FCLOSE FCB ファイルクローズ CP/M
・入力レジスタ DE=FCB 先頭アドレス
・出力レジスタ A=0 オープン成功 FFH=オープン失敗
FCB の内容が書き込まれます。
クローズじた FCB は再度オープンする事ができ、
また、オープンしている FCB として引き続き入出力する事もできます。
-
C=11H _SFIRST FCB ファイル検索 初回 CP/M
・入力レジスタ DE=FCB 先頭アドレス
・出力レジスタ A=0 ファイルが見つかった FFH ファイルが見つからなかった
ファイルが見つかった場合、DTA の領域にドライブ番号、
引き続く 32 バイトにファイルのディレクトリエントリを入れます。
このデータはオープンされていない FCB として使用可能です。
ファイル名には ? が使用できます。
* は使用できないので ? に置き換えて下さい。
-
C=12H _SNEXT FCB ファイル検索 続き CP/M
・出力レジスタ A=0 ファイルが見つかった FFH ファイルが見つからなかった
C=11H でワイルドカード検索をした場合、
同じ条件で更に別のファイルを探します。
ファイルが見つかった場合、DTA の領域にドライブ番号、
引き続く 32 バイトにファイルのディレクトリエントリを入れます。
このデータはオープンされていない FCB として使用可能です。
-
C=13H _FDEL FCB ファイル削除 CP/M
・入力レジスタ DE=FCB 先頭アドレス
・出力レジスタ A=0 削除に成功した FFH 削除に失敗した
ファイル名にワイルドカード ? を使用し、複数ファイルを削除できます。
-
C=14H _RDSEQ FCB シーケンシャル読み出し CP/M
・入力レジスタ DE=FCB 先頭アドレス
・出力レジスタ A=0 読み出しに成功した FFH 読み出しに失敗した
128 バイト単位で読み込まれます。
MSX-DOS の場合、断片部分は 0 で埋められます。
-
C=15H _WRSQEQ FCB シーケンシャル書き込み CP/M
・入力レジスタ DE=FCB 先頭アドレス
・出力レジスタ A=0 書き込みに成功した 1 書き込みに失敗した
-
C=16H _FMAKE FCB ファイル作成 CP/M
・入力レジスタ DE=FCB 先頭アドレス
・出力レジスタ A=0 作成に成功した FFH=作成に失敗した
-
C=17H _FREN FCB ファイル名変更 CP/M
・入力レジスタ DE=FCB 先頭アドレス
・出力レジスタ A=0 変更に成功した FFH=変更に失敗した
-
C=18H _LOGIN ログインベクトルの獲得 CP/M
・出力レジスタ HL ログインベクトル(L bit0=A: bit1=B: …… bit7=H:)
-
C=19H _CURDRV デフォルトドライブの獲得 CP/M
・出力レジスタ A=ドライブ (0=A: 1=B: …… 7=H:)
-
C=1AH _SETDTA ディスク転送アドレスの設定 CP/M
・入力レジスタ DE=ディスク転送アドレス
デフォルトでは 0080H~00FFH がディスク転送アドレスに設定されています。
-
C=1BH _ALLOC ディスク情報の獲得
・入力レジスタ E=ドライブ番号 (0=カレント、1=A:、2=B:……8=H:)
・出力レジスタ A=クラスタあたりのセクタ数 BC=セクタサイズ(常に 512)
DE=ディスク上のクラスタ総数 HL=ディスク上の未使用クラスタ数
IX=DPBへのポインタ IY=最初のFATセクタへのポインタ
Nextor で Reduced Allocation Information モード(C=75H)が有効の場合
32MB 以上の場合は 32MB 未満の値にします。
また SET ZALLOC=ON(Zero Allocation Information モード)の時は
HL を 0 にします。
-
C=21H _RDRND FCB ランダム読み出し CP/M
・入力レジスタ DE=FCB 先頭アドレス
・出力レジスタ A=0 読み出しに成功した 1 読み出しに失敗した
-
C=22H _WRRND FCB ランダム書き込み CP/M
・入力レジスタ DE=FCB 先頭アドレス
・出力レジスタ A=0 書き込みに成功した 1 書き込みに失敗した
-
C=23H _FSIZE FCB ファイルサイズの獲得 CP/M
・入力レジスタ DE=FCB 先頭アドレス
・出力レジスタ A=0 ファイルがいつ買った FFH ファイルが見つからない
-
C=24H _SETRND FCB ランダムレコードの設定 CP/M
・入力レジスタ DE=FCB 先頭アドレス
-
C=26H _WRBLK FCB ランダムブロック書き込み
・入力レジスタ DE=FCB 先頭アドレス HL=書き込むレコード数
・出力レジスタ A=0 書き込みに成功した 1 書き込みに失敗した
-
C=27H _RDBLK FCB ランダムブロック読み出し
・入力レジスタ DE=FCB 先頭アドレス HL=読み出すレコード数
・出力レジスタ A=0 読み出しに成功した 1 読み出しに失敗した
-
C=28H _WRZER FCB ゼロ書き込みを伴うランダム書き込み CP/M
・入力レジスタ DE=FCB 先頭アドレス
・出力レジスタ A=0 書き込みに成功した 1 書き込みに失敗した
ファイルを拡張した場合、拡張したクラスタを 0 で埋めます。
-
C=2AH _GDATE 日付の獲得
・出力レジスタ HL=年(1980~2079) D=月(1~12)
E=日 A=曜日(0=日曜~6=土曜)
-
C=2BH _SDATE 日付の設定
・入力レジスタ HL=年(1980~2079) D=月(1~12) E=日(1~31)
・出力レジスタ A=0 設定成功 FFH 設定失敗
-
C=2CH _GTIME 時刻の獲得
・出力レジスタ H=時( 0~23) L=分(0~59) D=秒(0~59) E=1/100秒(常に0)
-
C=2DH _STIME 時刻の設定
・入力レジスタ H=時( 0~23) L=分(0~59) D=秒(0~59) E=1/100秒(無視)
・出力レジスタ A=0 設定成功 FFH 設定失敗
-
C=2EH _VERIFY ベリファイフラグの設定
・入力レジスタ E=0 ベリファイを無効に 0以外 ベリファイを有効に
-
C=2FH _RDABS 論理セクタの読み出し
・入力レジスタ DE=セクタ番号 L=ドライブ番号(0=A:、1=B:、…… 7=H:)
H 読み出すセクタ数
・出力レジスタ A=0 読み出し成功 0以外 読み出し失敗
Nextor で FAT12 ではないドライブでは “Not a DOS disk” エラーを返します。
代わりに _RDDRV(C=73H) を使用します。
-
C=30H _WRABS 論理セクタの書き込み
・入力レジスタ DE=セクタ番号 L=ドライブ番号)0=A:、1=B:、…… 7=H:)
H 書き込むセクタ数
・出力レジスタ A=0 書き込み成功 0以外 書き込み失敗
Nextor で FAT12 ではないドライブでは “Not a DOS disk” エラーを返します。
代わりに _WRDRV(=74H) を使用します。
MSX-DOS1(CP/M)での FCB に加えて
MSX-DOS2 ではファイルハンドルで管理できます。
ディレクトリを含むパス名をそのまま扱える、
カレント以外のドライブにもアクセスできる、
1 バイトのみで管理できる、などのメリットがあります。
MSX--DOS2 追加のファンクションコールでは
ファイルハンドルを使用する前提になっています。
ディレクトリ内のファイル・サブディレクトリを検索する等の用途で使います。
64 バイトの領域で 最初のエントリ検索・次のエントリ検索・
新しいエントリ検索(C=40H~42H)から新たに得る事ができます。
- 番地+0 常に FFH
- 1~13 ファイル名
- 14 属性 下項目参照
- 15~16 最終変更時刻
bit11~15=時(24 時間)bit5~10=分 bit0~4=秒÷2(0~29)
- 17~18 最終変更日付
bit9~15=年(0=1980~99=2079)bit5~8=月 bit0~4 日
- 19~20 開始クラスタ
- 21~24 ファイルサイズ バイト単位
- 25 論理ドライブ 下項目「ドライブ番号」参照
- 26~63 内部情報(変更不可)
bit0=読み出し専用 bit1=不可視ファイル bit2=システムファイル bit3=ボリューム名
bit4=ディレクトリ bit5=アーカイブ bit6=予約(常に0) bit7=デバイス
ファンクションコールによって、bit7 は別の割り当てになっている場合があります。
0=カレントドライブ 1=A: 2=B: 3=C: 4=D: 5=E: 6=F: 7=G: 8=H:
ファンクションコール等によって、0 は無効の場合があります。
MSX-DOS 2 追加のファンクションコールでは A 固定です。
正常終了は 0 が A に入ります。
0 以外のエラーとなった場合、通常エラーを処理するルーチンを実行します。
ディスクパラメータの獲得(C=31)で取得します。
MSX=DOS2 では次のとおりです。
- DE+1~2 セクタサイズ
- 3 クラスごとのセクタ数 (2 の n 乗。n は 1 以上)
- 4~5 予約セクタ数
- 6 FAT 数
- 7~8 ルートディレクトリのエントリ数
- 9~10 論理セクタ総数
- 11 メディアディスクリプタバイト
- 12 FAT 毎のセクタ数
- 13~14 ルートディレクトリの初期セクタ番号
- 15~16 初期データのセクタ番号
- 17~18 最大クラスタ番号
- 19 ダーティディスクフラグ
- 20~23 ボリューム ID (-1 の場合は ボリューム ID なし)
- 24~31 システム予約
Nextor では次の違いがあります。
- 9~10 論理セクタ総数 65535 を超える場合は 0
- 24~27 論理セクタ総数 (32 ビット)
- 28 ファイルシステムの種類 0=FAT12 1=FAT16 FFH=その他
- 29~31 システム予約
デバイスドライバー情報の取得 (C=78H) で得られる情報です。
- 番地+0 デバイスドライバーのスロット番号
- 1 デバイスドライバーのセグメント番号
(Nextor・Nextor MSX-DOS 1 カーネル内デバイスドライバーは FFH)
- 2 起動時割り当ての論理ドライブ数
- 3 起動時割り当てドライブの一番若い番号
- 4 bit7 が 0=Nextor の MSX-DOS 1 モード用デバイスドライバー
(Nextor の MSX-DOS 1 カーネル内のとき)
bit7 が 1=Nextor 用ドライバー
bit1~6 未使用 (常に 0)
bit0 が 0=Device-based のデバイスドライバー
bit0 が 1=Drive-based のデバイスドライバー
- 5 デバイスドライバーのメジャーバージョン番号
- 6 デバイスドライバーのセカンダリバージョン番号
- 7 デバイスドライバーのリビジョン番号
- 8~39 デバイスドライバー名 (残りは 20H で埋める)
- 40~63 予約 (現在は 0)
ドライブレター情報の取得(C=79H)で得られる情報です。
- 番地+0 ドライブの状態 0 未割り当て 2・3 未使用
1 Nextor・Nextor MSX-DOS 1 モードのストレージデバイスとして割り当て
4 RAM ディスクに割り当て (他のフィールドは 0)
- 1 デバイスドライバーのスロット番号
- 2 デバイスドライバーのセグメント番号
(Nextor・Nextor MSX-DOS 1 カーネル内のデバイスドライバーは FFH)
- 3 このデバイスドライバーで扱うドライブの数
(Device-based デバイスドライバーは FFH)
- 4 デバイス番号 (Drive-based・MSX-DOS1 モード用デバイスドライバーは 00H)
- 5 論理ユニット番号
(Drive-based・MSX-DOS1 モード用デバイスドライバーは 00H)
- 6~9 最初のデバイスセクター番号
(Drive-based・MSX-DOS1 モード用デバイスでは 00H)
- 10~63 予約 (現在は 00H)