If you are still using the old URL (datacrystal.romhacking.net), please update your bookmarks! The old URL may stop working soon.
The current URL is datacrystal.tcrf.net.
The current URL is datacrystal.tcrf.net.
X68k/FS
Jump to navigation
Jump to search
- FILE SYSTEM MANUAL - ============================================================================== ・Human68k ファイルシステムの概要 Human68k のファイルシステムは MS-DOS を基本とし、FAT によってディスクを管理 している. Human68k version 3.02 ではネットワークや CD-ROM に対応する為、内蔵の ファイルシステムを使わず、ユーザの組み込んだデバイスドライバにファイル処理を任 せる事ができるようになっている. 従来からの FAT による管理を行うドライブをローカルドライブ、ディスク管理をデ バイスドライバ内で行うドライブはリモートドライブと呼ぶ. CD-ROM などはメディア が遠隔地にあるわけではないが、Human68k がディスク管理を行わないという点でネッ トワークドライブと同じなのでリモートドライブとなる. ・ローカルドライブ ┌───────────────────────────────┐ │ユーザプログラム │ ├───────────────────────────────┤ │DOS コール │ ├─┬─────────────┬─┬─────────────┤ │ │ファイルシークドライバ │ │ファイルオープンドライバ │ │ │(Human68k内蔵/fastseek.x) │ │(Human68k内蔵/fastopen.x) │ │ └───────────┬─┤ └───────────┬─┘ │ディスク入出力ドライバ │ │ファイル名ドライバ │ │(Human68k内蔵/fastio.x) │ │(Human68k内蔵/TwentyOne.x)│ ├─────────────┤ └─────────────┘ │デバイスドライバ │ │(Human68k内蔵/*.sys) │ ├─────────────┤ │低水準入出力ルーチン(IOCS)│ ├─────────────┤ │ハードウェア │ └─────────────┘ ユーザプログラムが DOS コールを介してファイル入出力を行う場合、Human68k はま ずファイル名が正常か否かをファイル名ドライバによって調べる. 次に対象ディレクト リ/ファイルの先頭クラスタ番号を得るためにファイルオープンドライバを呼び出す. ファイルオープンドライバがエラーを返したり、ファイルのシークを伴う場合はファイ ルシークドライバを呼び出して対象クラスタ番号を調べる. このようにして高水準ファ イル入出力要求を低水準ディスク入出力に置き換え、ディスク入出力ドライバに対して 入出力を行う. ディスク入出力ドライバはデバイスドライバに対してセクタ単位で入出 力を行い、デバイスドライバがハードウェア(FDD、HDD、MO、メモリ等)に対し IOCS に よる入出力を実行する. ・リモートドライブ ┌───────────────────────────────┐ │ユーザプログラム │ ├───────────────────────────────┤ │DOS コール │ ├─────────────┬─┬─────────────┬─┘ │デバイスドライバ │ │ファイル名ドライバ │ │(susie.x等) │ │(Human68k内蔵/TwentyOne.x)│ ├─────────────┤ └─────────────┘ │低水準入出力ルーチン(IOCS)│ ├─────────────┤ │ハードウェア │ └─────────────┘ リモートドライブに対する入出力の場合、ローカルドライブと比べて DOS コールか ら IOCS の間の処理が全く違う. ローカルドライブであれば Human68k 内蔵、あるいは 常駐プログラムとして組み込まれたドライバがディスク管理を行うのに対し、リモート ドライブでは相当する処理は全てデバイスドライバが行う. デバイスドライバ自体もロ ーカルドライブの場合はセクタ単位で入出力を行うが、リモートドライブでは通常 Human68k が行っているファイルシステムの管理をデバイスドライバが処理しなければ ならない. DOS コールが呼び出された時、Human68k は引数の検査(ファイル名が正常か否かなど) や表面上の変換(仮想ドライブ・ディレクトリの展開など)だけしか行わなわず、リモー トドライブへの処理を直接デバイスドライバに渡す. デバイスドライバでは Human68k では扱えないファイルシステムを処理し、ハードウェア(CD-ROM、ネットワークドライ ブ等)に対し IOCS または独自の低水準入出力ルーチンによる入出力を実行する. この 為、リモートドライブでは高速化ドライバ fast*.x が影響しない. なお、キャラクタデバイスへの入出力の場合はリモートドライブの場合と同様である. ============================================================================== ・各ドライバのインターフェース ファイル名ドライバ、ファイルオープンドライバ、ファイルシークドライバ、ディス ク入出力ドライバによる処理が必要となった時、Human68k はレジスタに必要な引数を 設定して分岐命令表に対して jsr (offset,an) 命令で各処理を呼び出す(an は通常 a4 で分岐命令表の先頭アドレスを指し、offset は機能番号×6 の数値で 0~114 の範囲). 各ドライバが呼び出される時、ドライバごとに固有のワークである OS サービスエン トリのアドレスが a5 レジスタに設定される(一部の機能では設定されない). OS サー ビスエントリは Human68k からのパラメータの受け渡しや他のドライバへの呼び出しを 行う為の情報を設定した構造体である. 分岐命令表・OS サービスエントリのアドレスは Human68k のみが知っており、前者 は DOS _OS_PATCH で変更する事が出来るが、後者はアドレス固定である. また、OS サ ービスエントリは呼び出された時にアドレスが渡されるが、他のドライバからは一切そ のアドレスを知ることは出来ない. ほかのドライバの機能を使用する場合は OS サービ スエントリ内にその機能の処理アドレスが設定されているので、それを参照する. なお、Human68k からの呼び出しは以下のようなコードで呼ばれる. call_xxx: movem.l reg,-(sp) movea.l (jmp_table),a4 lea (os_service_entry),a5 jsr (FUNC_NO*6,a4) movem.l (sp)+,reg rts ============================================================================== ・ディスク入出力ドライバ ディスクに対するセクタ単位での読み書きを行う. DOS _OS_PATCH における ID は 1. Human68k が内蔵しているが、代りにこの機能を処理するドライバとして fastio.x が ある. ディスク入出力管理を変更するには DOS _OS_PATCH に分岐命令表を渡せばよい. 分 岐命令表は以下の 0~19 番の処理へ分岐する命令を並べる. ただし、11~19 は将来拡 張用の現在使用されていないダミーである. ・OS サービスエントリ offset size 0 6.b セクタ読み込みルーチンへの分岐命令(jmp abs.l) 6 6.b セクタ書き込み〃 12 6.b メディア排出禁止〃 18 6.b メディア排出許可〃 24 1.l I/O バッファ先頭アドレス 28 1.l I/O バッファのセクタ数 32 1.l I/O バッファのセクタサイズ 36 1.l I/O バッファの LRU 管理の先頭(最新)アドレス ・セクタ読み込みルーチン in d1.l 先頭セクタ番号 d2.l セクタ数 a0.l DPB a2.l バッファアドレス out d0.l ステータス ローカルドライブの指定セクタからデータを読み込む. ・セクタ書き込みルーチン in d1.l 先頭セクタ番号 d2.l セクタ数 a0.l DPB a2.l バッファアドレス out d0.l ステータス ローカルドライブの指定セクタへデータを書き込む. ・メディア排出禁止ルーチン in a0.l DPB 指定ドライブの排出を OS レベルで禁止する. ・メディア排出許可ルーチン in a0.l DPB 指定ドライブの排出を OS レベルで許可する. ・I/O バッファ先頭アドレス I/O バッファは、セクタサイズ+16(ヘッダ分)バイトの領域がセクタ数だけ 並んだものであるが、その先頭アドレスが保存されている. ・I/O バッファのセクタ数 CONFIG.SYS の buffers 第一引数で指定した値. 1 セクタ分のバッファがこ の数だけ並んでいる. ・I/O バッファのセクタサイズ CONFIG.SYS の buffers 第二引数で指定した値. このサイズより大きいセク タサイズのメディアにはアクセス出来ず、また小さいセクタサイズであればそ の差は使用されずに無駄になる. ・I/O バッファの LRU 管理の先頭(最新)アドレス 少ないバッファでメディアのキャッシュを行う為、I/O バッファの管理には 最長不使用法でバッファの破棄/確保が行われている. その LRU は双方向リス トによって実現されているが、その先頭(最新)のバッファアドレスを設定する. なお、OS サービスエントリ内の後半 4 個のパラメータは Human68k 内蔵の ディスク入出力ドライバで使用される. 他のドライバを組み込んだ場合は独自 にバッファ管理を行ってよい(fastio.x では独自の管理になっている). 以下にファイルシークドライバの各機能を解説する. No.0 (offset 0) diskio_reset in a5.l OS サービスエントリのアドレス out d0.l -1 なにもしない(名称からドライバを初期状態に戻す機能のように思われるが、 初期化は diskio_init/close である). Human68k から呼ばれることはなく DOS _OS_PATCH でアドレス 0、若しくは 0 以外のコマンドが渡された時に呼 び出される. No.1 (offset 6) diskio_init in a5.l OS サービスエントリのアドレス out a0.l I/O バッファの末尾アドレス+1 ドライバを初期化する. ドライバを変更した直後に呼ばれる. Human68k 内蔵のファイルオープンドライバでは、OS サービスエントリから バッファ先頭アドレスを取り出し、そのアドレスからを I/O バッファとみな して初期化する. 指定セクタ分のバッファを確保したら末尾のアドレス+1 を 返す. No.2 (offset 12) diskio_close in a5.l OS サービスエントリのアドレス ドライバの終了処理を行う. ドライバを変更する直前や、DOS _FFLUSH が呼 び出された時、stop キーが押された時、再起動する場合などに実行される. Human68k 内蔵のファイル名ドライバでは、I/O バッファの全てのセクタに ついて、書き込みが保留されていればそれを書き出し、いずれにせよバッファ を未使用状態にする(因に LRU は初期化されない). No.3 (offset 18) diskio_readfat in d1.l セクタ番号 a0.l DPB a5.l OS サービスエントリのアドレス out a1.l 読み込んだデータの I/O バッファアドレス FAT の指定セクタを I/O バッファに読み込み、バッファアドレスを返す. どのバッファに読み込むかはドライバが決定する. 既に指定セクタが I/O バ ッファに読み込まれていたら、メディアからの読み込みは行わずにアドレスを 返す. なお、diskio_makefat に相当するものは FAT が固定領域に確保されている 為に存在しない. また、Human68k 内蔵のドライバでは FAT、ディレクトリ、 ファイルのいずれであっても扱いは全く同じである. No.4 (offset 24) diskio_readdir in d1.l セクタ番号 a0.l DPB a5.l OS サービスエントリのアドレス out a1.l 読み込んだデータの I/O バッファアドレス ディレクトリの指定セクタを I/O バッファに読み込み、バッファアドレス を返す. どのバッファに読み込むかはドライバが決定する. 既に指定セクタが I/O バッファに読み込まれていたら、メディアからの読み込みは行わずにアド レスを返す. No.5 (offset 30) diskio_makedir in d1.l セクタ番号 a0.l DPB a5.l OS サービスエントリのアドレス out a1.l 確保した I/O バッファアドレス 指定セクタをディレクトリに使用するとして I/O バッファを確保する. 指 定セクタがバッファに読み込まれていなくても確保だけを行い、メディアから の読み込みは行われない. No.6 (offset 36) diskio_readfile in d1.l セクタ番号 a0.l DPB a5.l OS サービスエントリのアドレス out a1.l 読み込んだデータの I/O バッファアドレス ファイルの指定セクタを I/O バッファに読み込み、バッファアドレスを返 す. どのバッファに読み込むかはドライバが決定する. 既に指定セクタが I/O バッファに読み込まれていたら、メディアからの読み込みは行わずにアドレス を返す. No.7 (offset 42) diskio_makefile in d1.l セクタ番号 a0.l DPB a5.l OS サービスエントリのアドレス out a1.l 確保した I/O バッファアドレス 指定セクタをファイルに使用するとして I/O バッファを確保する. 指定セ クタがバッファに読み込まれていなくても確保だけを行い、メディアからの読 み込みは行われない. Human68k ではファイルの拡大時であっても常に diskio_readfile を呼び出 し、diskio_makefile が使用される事はないので効率が悪くなっている. No.8 (offset 48) diskio_compare in d1.l セクタ番号 a0.l DPB a1.l I/O バッファのデータアドレス a5.l OS サービスエントリのアドレス out ccrZ 0:不一致 1:一致 指定したドライブのセクタが I/O バッファが示すドライブ/セクタ番号と同 一であるか比較する. No.9 (offset 54) diskio_write in a1.l I/O バッファのデータアドレス a5.l OS サービスエントリのアドレス 指定した I/O バッファのデータをメディアに書き込み、書き込み保留フラ グをクリアする. No.10 (offset 60) diskio_setflag in a1.l I/O バッファのデータアドレス a5.l OS サービスエントリのアドレス 指定した I/O バッファの書き込み保留フラグをセットし、メディアの排出 を禁止する. No.11 (offset 66) diskio_flush in a0.l DPB a5.l OS サービスエントリのアドレス I/O バッファの全てのセクタについて、指定ドライブで書き込みが保留され ているものがあればそれを書き出して書き込み保留フラグをクリアし、メディ アの排出を許可する. No.12 (offset 72) diskio_clear in a0.l DPB a5.l OS サービスエントリのアドレス I/O バッファの全てのセクタについて、指定ドライブのものがあればその内 容を破棄してバッファを未使用状態にする. 書き込みが保留されていてもデー タの書き出しは行わない. No.13 (offset 78) diskio_ioread in d1.l 先頭セクタ番号 d2.l セクタ数 a0.l DPB a2.l バッファアドレス a5.l OS サービスエントリのアドレス out d0.l ステータス 複数セクタを指定したバッファに読み込む. I/O バッファに指定範囲内のデ ータが書き込み保留状態であれば、それを書き出してから読み込む. No.14 (offset 84) diskio_iowrite in d1.l 先頭セクタ番号 d2.l セクタ数 a0.l DPB a2.l データアドレス a5.l OS サービスエントリのアドレス out d0.l ステータス 指定したデータを複数セクタに書き込む. I/O バッファに指定範囲内のデー タがあれば、それを破棄して未使用状態にしてから書き込む. No.15 (offset 90) diskio_dummy15 No.16 (offset 96) diskio_dummy16 No.17 (offset 102) diskio_dummy17 No.18 (offset 108) diskio_dummy18 No.19 (offset 114) diskio_dummy19 in a5.l OS サービスエントリのアドレス out d0.l -1 将来拡張用のダミー. 現在は全てエラーを返す. 編注 名称及び機能は Human68k のコードから推測しています. ============================================================================== ・ファイルシークドライバ FAT の参照・変更などを行う. DOS _OS_PATCH における ID は 2. Human68k が内蔵 しているが、代りにこの機能を処理するドライバとして fastseek.x がある. FAT 管理を変更するには DOS _OS_PATCH に分岐命令表を渡せばよい. 分岐命令表は 以下の 0~19 番の処理へ分岐する命令を並べる. ただし、11~19 は将来拡張用の現在 使用されていないダミーである. ・OS サービスエントリ offset size 0 6.b エラー処理呼び出しルーチンへの分岐命令(jmp abs.l) 6 6.b diskio_readfat 呼び出しルーチンへの分岐命令(jmp abs.l) 12 6.b diskio_setflag 〃 18 1.w NEWFAT の値(0 若しくは 2) ・エラー処理呼び出しルーチン FAT の内容が異常であった場合に実行する為の、エラー処理呼び出しルーチ ン. エラー番号は $1005(ディスクの管理領域が破壊されている、中止のみ). ・NEWFAT 空きクラスタ検索方法を指定するワークで、Human68k によって 0 か 2 が 設定される. 値が 0 の時は前回検索終了位置から続けて検索し、値が 2 の時 は常に先頭クラスタから検索する. 以下にファイルシークドライバの各機能を解説する. No.0 (offset 0) fileseek_reset in a5.l OS サービスエントリのアドレス out d0.l -1 なにもしない(名称からドライバを初期状態に戻す機能のように思われるが、 初期化は fileseek_init/close である). Human68k から呼ばれることはなく DOS _OS_PATCH でアドレス 0、若しくは 0 以外のコマンドが渡された時に呼 び出される. No.1 (offset 6) fileseek_init in a5.l OS サービスエントリのアドレス out d0.l ステータス(0 で正常終了) ドライバを初期化する. ドライバを変更した直後に呼ばれる. Human68k 内蔵のファイルオープンドライバでは何もしない. No.2 (offset 12) fileseek_close in a5.l OS サービスエントリのアドレス ドライバの終了処理を行う. ドライバを変更する直前に呼ばれる. Human68k 内蔵のファイル名ドライバでは何もしない. No.3 (offset 18) fileseek_seek in d0.w クラスタ位置(目的位置までのクラスタ数) d2.l ファイルサイズ d3.w モード(0:read $ffff:write) a0.l DPB a1.l FCB のアドレス+68(FAT キャッシュ) a5.l OS サービスエントリのアドレス out d0.l ステータス d2.w FAT(クラスタ)番号 FAT の繋がりを読み取って、ファイルの指定位置のクラスタ番号を得る. フ ァイルサイズより後方に移動しようとした場合、read モードではエラーが返 るが、write モードでは自動的に空きクラスタを検索してファイルサイズを拡 大させる. この時の引数 d3.w=$ffff は FAT の終わりを表わしている. No.4 (offset 24) fileseek_fatchk in d1.w FAT(クラスタ)番号 d2.w 検索する最大クラスタ数(通常は 65535) d3.w モード(0:read $ffff:write) a0.l DPB a5.l OS サービスエントリのアドレス out d0.l 次の FAT(クラスタ)番号 d2.w 連続したクラスタ数 FAT の繋がりを読み取って、指定のクラスタからいくつ連続したクラスタに 存在するかを調べる. 引数の d3.w は fileseek_seek と同じ. No.5 (offset 30) fileseek_nextfat in d0.w FAT(クラスタ)番号 a0.l DPB a5.l OS サービスエントリのアドレス out d0.w 次の FAT(クラスタ)番号($ffff ならファイルの終わり) FAT の繋がりを読み取って、指定したクラスタの次に位置するクラスタ番号 を得る. No.6 (offset 36) fileseek_getfat in a0.l DPB a5.l OS サービスエントリのアドレス out d0.l FAT(クラスタ)番号 FAT から未使用クラスタを検索して確保する. 確保したクラスタの FAT に は繋がりの末尾を示す $fff 若しくは $ffff が書き込まれる. 空きクラスタ の検索は通常前回の検索位置からであるが、NEWFAT = 2 の場合は常に第 2 ク ラスタから始まる. No.7 (offset 42) fileseek_dskfre in a0.l DPB a5.l OS サービスエントリのアドレス out d0.l 空きクラスタ数 FAT を読み込んで、指定ドライブの空きクラスタ数を調べる. No.8 (offset 48) fileseek_freechain in d0.w FAT(クラスタ)番号 a0.l DPB a5.l OS サービスエントリのアドレス out d0.l ステータス 指定したクラスタと、そのクラスタから繋がる以降のクラスタ全てを解放し、 未使用状態にする. 解放されたクラスタには未使用を示す 0 が書き込まれる. No.9 (offset 54) fileseek_freefat in d0.w FAT(クラスタ)番号 a0.l DPB a5.l OS サービスエントリのアドレス out d0.l 次の FAT(クラスタ)番号 指定したクラスタを解放し、未使用状態にする. Human68k 内蔵のドライバでは fileseek_freechain から呼び出されるが、 現在の Human68k から直接呼び出される事はない. No.10 (offset 60) fileseek_chgfat in d0.w 次の FAT(クラスタ)番号として書き込むデータ d1.w 対象の FAT(クラスタ)番号 a0.l DPB a5.l OS サービスエントリのアドレス out d0.l 以前書き込まれていた、次の FAT(クラスタ)番号 指定クラスタの、次に位置する FAT(クラスタ)番号を任意の番号に変更する. No.11 (offset 66) fileseek_dummy11 No.12 (offset 72) fileseek_dummy12 No.13 (offset 78) fileseek_dummy13 No.14 (offset 84) fileseek_dummy14 No.15 (offset 90) fileseek_dummy15 No.16 (offset 96) fileseek_dummy16 No.17 (offset 102) fileseek_dummy17 No.18 (offset 108) fileseek_dummy18 No.19 (offset 114) fileseek_dummy19 in a5.l OS サービスエントリのアドレス out d0.l -1 将来拡張用のダミー. 現在は全てエラーを返す. 編注 名称及び機能は Human68k のコードから推測しています. ============================================================================== ・ファイルオープンドライバ ディレクトリ名を管理する. DOS _OS_PATCH における ID は 3. 他のドライバと違い この機能が全てダミーであってもディスクアクセスが多くなるだけで正常に動作する. Human68k が内蔵しているものは何も行わないダミールーチンなので、参照の度にディ スクアクセスを行う. 代りにこの機能を処理するドライバとして fastopen.x がある. ディレクトリ名管理を変更するには DOS _OS_PATCH に分岐命令表を渡せばよい. 分 岐命令表は以下の 0~17 番の処理へ分岐する命令を並べる. ただし、9~17 は将来拡 張用の現在使用されていないダミーである(9 番は使用されている?). ・OS サービスエントリ offset size 0 6.b namecheck_namebf_cmp 呼び出しルーチンへの分岐命令(jmp abs.l) 6 6.b namecheck_knj_case_cmp 〃 以下にファイルオープンドライバの各機能を解説する. No.0 (offset 0) fileopen_reset in a5.l OS サービスエントリのアドレス out d0.l -1 なにもしない(名称からドライバを初期状態に戻す機能のように思われるが、 初期化は fileopen_init/close である). Human68k から呼ばれることはなく DOS _OS_PATCH でアドレス 0、若しくは 0 以外のコマンドが渡された時に呼 び出される. No.1 (offset 6) fileopen_init in a5.l OS サービスエントリのアドレス out d0.l ステータス(0 で正常終了) ドライバを初期化する. ドライバを変更した直後に呼ばれる. Human68k 内蔵のファイルオープンドライバでは何もしない. No.2 (offset 12) fileopen_close in a5.l OS サービスエントリのアドレス ドライバの終了処理を行う. ドライバを変更する直前に呼ばれる. Human68k 内蔵のファイル名ドライバでは何もしない. No.3 (offset 18) (不明) in a0.l DPB a1.l カレントディレクトリ表 a2.l ファイル名バッファ(namests 形式) a5.l OS サービスエントリのアドレス out d0.l ステータス 機能不明(恐らく指定ディレクトリからのファイル検索だと思われる). Human68k 内蔵のファイル名ドライバでは、常に -1 を返す. No.4 (offset 24) (不明) in d1.l セクタ番号 d2.w 参照クラスタ中の残りセクタ数-1 d4.w 先頭からのオフセット a2.l ファイル名バッファ(namests 形式) a5.l OS サービスエントリのアドレス 機能不明(恐らく検索成功位置の通知だと思われる). Human68k 内蔵のファイル名ドライバでは何もしない. No.5 (offset 30) (不明) in a0.l DPB a1.l ディレクトリエントリを読み込んだバッファアドレス a2.l ファイル名バッファ(namests 形式) a5.l OS サービスエントリのアドレス 機能不明(恐らく削除位置の通知か検索位置の初期化の通知だと思われる). Human68k 内蔵のファイル名ドライバでは何もしない. No.6 (offset 36) (不明) in a0.l DPB a1.l カレントディレクトリ表 a2.l ファイル名バッファ(namests 形式) a5.l OS サービスエントリのアドレス out d0.l ステータス d1.l 先頭セクタ番号 d2.w 1 クラスタ当りのセクタ数-1 ディレクトリの先頭セクタ番号を収得する. Human68k 内蔵のファイル名ドライバでは、常に -1 を返す. No.7 (offset 42) (不明) in d1.l ディレクトリの先頭セクタ番号 d2.l アクセス中のクラスタ中のセクタ位置 a0.l DPB a5.l OS サービスエントリのアドレス 機能不明(恐らく参照ディレクトリの先頭セクタ番号の通知だと思われる). Human68k 内蔵のファイル名ドライバでは何もしない. No.8 (offset 48) (不明) in a0.l DPB a2.l ディレクトリ名バッファ(namests 形式) a5.l OS サービスエントリのアドレス 機能不明(恐らくディレクトリの削除通知だと思われる). Human68k 内蔵のファイル名ドライバでは何もしない. No.9 (offset 54) (不明) in a0.l DPB a5.l OS サービスエントリのアドレス out d0.l ステータス 機能不明(恐らく指定ドライブの全ての情報の破棄だと思われる). Human68k 内蔵のファイル名ドライバでは何もしない. No.10 (offset 60) fileopen_dummy10 No.11 (offset 66) fileopen_dummy11 No.12 (offset 72) fileopen_dummy12 No.13 (offset 78) fileopen_dummy13 No.14 (offset 84) fileopen_dummy14 No.15 (offset 90) fileopen_dummy15 No.16 (offset 96) fileopen_dummy16 No.17 (offset 102) fileopen_dummy17 in a5.l OS サービスエントリのアドレス out d0.l -1 将来拡張用のダミー. 現在は全てエラーを返す. 編注 名称及び機能は Human68k のコードから推測しています. ただし、Human68k 内蔵のドライバは有効な機能が全くないので引数や返値が 保証できません. 確実な情報を得るためには fastopen.x を解析して下さい. ============================================================================== ・ファイル名ドライバ ファイル名の検査・比較などを行う. DOS _OS_PATCH における ID は 4. Human68k が内蔵しているが、代りにこの機能を処理するドライバとして TwentyOne.x がある. ファイル名管理を変更するには DOS _OS_PATCH に分岐命令表を渡せばよい. 分岐命 令表は以下の 0~19 番の処理へ分岐する命令を並べる. ただし、15~19 は将来拡張用 の現在使用されていないダミーである. ・OS サービスエントリ offset size 0 6.b キャラクタデバイス検索ルーチンへの分岐命令(jmp abs.l) 6 1.l 使用不可能文字表のアドレス 10 1.b 拡張子フラグ(pathok で拡張子があった場合に 1 にする) 11 1.b 補完文字コード(' 'または'?') ・キャラクタデバイス検索ルーチン in a0.l デバイス名 out d0.l デバイスヘッダのアドレス(見つからなければ -1 を返す) 指定されたキャラクタデバイスを検索する. ・使用不可能文字表 offset size 0 1.b パスの区切り記号(通常は'\'、0 であればドライバ依存) 1 1.b 〃 (通常は 0、'/'を設定する為のワーク) 2 1.w ファイル名先頭に使用できない文字(通常は'-') ファイル名の先頭には使用できないが、ファイル名の途中には使用で きる文字を設定する. 通常はハイフン('-')が設定されている. 4 1.w 以下の文字数-1 6 ?.b ファイル名に使用できない文字の列(通常は"'+,;<=>[]|) ファイル名のどの位置でも使用できない文字を並べる. ・拡張子フラグ namecheck_pathok が呼び出される前に 0 にされる. 対象のファイル名に拡 張子があれば 1 をセットして返る. DOS _NAMECK の内部処理で参照される. ・補完文字コード namecheck_pathok で主ファイル名若しくは拡張子がなかった場合に代わり に書き込む文字. 通常は 0 だが DOS _FILES を補完モードで呼び出した場合 は'?'になる. 以下にファイル名ドライバの各機能を解説する. No.0 (offset 0) namecheck_reset in a5.l OS サービスエントリのアドレス out d0.l -1 なにもしない(名称からドライバを初期状態に戻す機能のように思われるが、 初期化は namecheck_init/close である). Human68k から呼ばれることはなく DOS _OS_PATCH でアドレス 0、若しくは 0 以外のコマンドが渡された時に呼 び出される. No.1 (offset 6) namecheck_init in a5.l OS サービスエントリのアドレス out d0.l ステータス(0 で正常終了) ドライバを初期化する. ドライバを変更した直後に呼ばれる. Human68k 内蔵のファイル名ドライバでは、使用不可能文字表のアドレス設 定だけを行っている. No.2 (offset 12) namecheck_close in a5.l OS サービスエントリのアドレス ドライバの終了処理を行う. ドライバを変更する直前に呼ばれる. Human68k 内蔵のファイル名ドライバでは何もしない. No.3 (offset 18) namecheck_chrdevck in a2.l ファイル名バッファ(namests 形式) a5.l OS サービスエントリのアドレス out d0.l デバイスヘッダのアドレス(見つからなければ -1 を返す) 指定されたファイル名がキャラクタデバイスであるか調べる. No.4 (offset 24) namecheck_dir_cmp in d0.b ファイル名 1 の先頭 1 文字($05 は $e5 に戻してある) a1.l ファイル名 1 のディレクトリバッファ a2.l 〃 2 〃($e5 は $05 にしない) a5.l OS サービスエントリのアドレス out ccrZ 0:不一致 1:一致 指定バッファの内容がドライブ上の内容と同じかどうか比較する. ファイル名 2 にはワイルドカード'?'が使用できる. No.5 (offset 30) namecheck_namebf_cmp in a2.l ファイル名バッファ 1(namests 形式) a3.l 〃 2(〃) a5.l OS サービスエントリのアドレス out ccrZ 0:不一致 1:一致 指定バッファのファイル名を比較する. ファイル排他処理とファイルオープンドライバから呼ばれる. No.6 (offset 36) namecheck_knj_case_cmp in d0.w 比較するバイト数-1 a4.l 文字列 1 a5.l 〃 2 out d2.b 最後の文字 a4.l 比較終了時の文字の次のアドレス a5.l 〃 ccrZ 0:不一致 1:一致 文字列を比較する. namecheck_namebf_cmp や ファイルオープンドライバの OS サービスエントリから呼び出される. OS サービスエントリは渡されない(呼び出し元によっては渡される事もある). No.7 (offset 42) namecheck_pathset in d0.b 先頭の文字 d2.w バイト数 a0.l バッファ先頭アドレス a1.l ディレクトリ名の先頭アドレス+1 a3.l 書き込み開始バッファアドレス a5.l OS サービスエントリのアドレス out d0.l ステータス a1.l 読み取ったディレクトリ名の末尾+1 a3.l バッファに書き込んだディレクトリ名の末尾+1 DOS _NAMESTS の内部処理でドライブ名とファイル名の間のディレクトリ名 をバッファに書き込む為に呼び出される. 因にドライブ名は DOS _NAMESTS、 ファイル名は namecheck_pathok がそれぞれ処理する. 引数の a3.l は namecheck_pathset がディレクトリ名を処理して書き込む バッファのアドレスである. このアドレスの直前には、もしあれば、カレント ディレクトリ名が予め書き込まれている. a0.l はこのバッファの先頭アドレ スを指す. カレントディレクトリがルートであれば a0.l=a3.l となり、それ より下層のディレクトリであれば a0.l<a3.l となる. "."や".."を処理する 場合、a3 を a0 より前に行かない範囲で遡ってよい. No.8 (offset 48) namecheck_pathok in a0.l ディレクトリ名先頭アドレス a1.l ファイル名の先頭アドレス a2.l ファイル名バッファ(namests 形式) a3.l ディレクトリ名の末尾+1('\'の次) a5.l OS サービスエントリのアドレス out d0.l ステータス DOS _NAMESTS の内部処理でファイル名をバッファに書き込む為に呼び出さ れる. ワイルドカード'*'は'?'に変換する. また、ワイルドカードの文字数を バッファに書き込む(ただし、ファイル名がない場合は -1 とする). 拡張子が あるファイル名の場合は OS サービスエントリ内の拡張子フラグを 1 にセッ トする. また、主ファイル名または拡張子がない場合は補完文字コードを代り に書き込む. 引数の a0.l/a3.l は namecheck_pathset の返値そのものであり、ファイル 名として".."が与えられた場合は a3 を遡ってよい. No.9 (offset 54) namecheck_files_set in a1.l 検索バッファ(files 形式) a2.l ファイル名バッファ(namests 形式) a5.l OS サービスエントリのアドレス out d0.l ステータス DOS _FILES が成功した場合に呼び出され、検索バッファに DOS _NFILES 用 の検索ファイル名を設定する. その他の検索条件は DOS コール内で設定され るので関与しなくてよい. Human68k 内蔵のファイル名ドライバでは、主ファイル名(8 文字)と拡張子 を書き込み、常に 0 を返す. No.10 (offset 60) namecheck_files_get in a2.l 検索バッファ(files 形式) a5.l OS サービスエントリのアドレス out d0.l ステータス a2.l ファイル名のアドレス DOS _NFILES で検索バッファから検索ファイル名を得るために呼び出される. Human68k 内蔵のファイル名ドライバでは、検索バッファのアドレス+10 を a2 に返すだけである. No.11 (offset 66) namecheck_files_err in a1.l 検索バッファ(files 形式) a5.l OS サービスエントリのアドレス out なし DOS _FILES でワイルドカードを使用していないファイル名で検索した時と DOS _NFILES で検索が失敗した時に呼び出される. 以後は次検索が行われる事 はないので検索用の拡張バッファなどを確保していた場合などは、ここで解放 する. Human68k 内蔵のファイル名ドライバでは何もしない. No.12 (offset 72) namecheck_files_ent in d1.w モード(0:mkdir/chdir 1:files) a1.l 参照するファイル名バッファ(主ファイル名 8 文字+拡張子 3 文字+(属性)+主ファイル名 10 文字) a2.l 書き込むファイル名バッファ a5.l OS サービスエントリのアドレス out d0.l ステータス a2.l ファイル名の末尾+1 8+3+10 文字ずつに分割されているファイル名をピリオドを含めて連続した 22 文字のファイル名に変換する. 引数の d1.w が 0 の時は mkdir/chdir の為に a1.l に namests バッファ 先頭アドレス+67 が渡される. d1.w が 1 の時は files の為に a1.l にディ レクトリエントリをそのまま読み込んだバッファが渡される. この場合前者に 比べて拡張子とファイル名 2 の間にファイル属性が 1 バイト格納されている ので、その分を補正しなければならない. No.13 (offset 78) namecheck_errchr in d0.b 文字 a5.l OS サービスエントリのアドレス out ccrZ 0:可 1:不可 指定の文字がファイル名として使用可能かどうか調べる. Human68k 内蔵のファイル名ドライバでは、/-"' の各文字が使用不可である. No.14 (offset 84) namecheck_yenslh in a1.l ファイル名のアドレス a4.l バッファアドレス a5.l OS サービスエントリのアドレス out d0.l ステータス ファイル名を検査しながらバッファに転送する. ファイル名は最大で 90 バ イトまで. 通常は DOS コール処理内で文字表から一文字ずつ調べていくが、 使用不可能文字表の 1 バイト目が 0 であった時に呼び出される. Human68k 内蔵のファイル名ドライバでは何もしない(文字表の先頭が常に '\'なので呼び出される事はない). No.15 (offset 90) namecheck_dummy15 No.16 (offset 96) namecheck_dummy16 No.17 (offset 102) namecheck_dummy17 No.18 (offset 108) namecheck_dummy18 No.19 (offset 114) namecheck_dummy19 in a5.l OS サービスエントリのアドレス out d0.l -1 将来拡張用のダミー. 現在は全てエラーを返す. 編注 名称及び機能は TwentyOne.x を参考にしています. ============================================================================== ・デバイスドライバ デバイスヘッダ offset size 0 1.l 次のドライバへのリンクポインタ 1 個のデバイスドライバの中で 2 個以上のデバイスをサポートする 場合には、次のデバイスヘッダアドレスをセットする. そのヘッダで 終りの場合及び 1 個しかサポートしない場合、-1 にする. 4 1.w デバイス属性 bit 15 0:ブロックデバイス 1:キャラクタデバイス bit 14 0:IOCTRL 不可 1:可能 bit 13 0:ローカル 1:リモート bit 6 0:特殊 IOCTRL 不可 1:可能 bit 5 0:COOKED MODE(1 バイトずつ処理) 1:RAW MODE(指定バイトずつ) bit 3 1:CLOCK デバイス bit 2 1:NUL デバイス bit 1 1:標準出力 デバイス bit 0 1:標準入力 デバイス bit 12~7,4 は未使用です. bit 0~5 は bit 15 = 1 の場合のみ有効です. 6 1.l ストラテジルーチンのエントリポインタ リクエストヘッダのポインタは a5 で与えられる. 10 1.l 割り込みルーチンのエントリポインタ 14 8.b キャラクタデバイスの場合、デバイス名 ブロックデバイスの場合は先頭 1 バイトを $20 以下のコードにし、 残り 7 バイトにはデバイス名を入れてもかまわない. BPB(Bios Parameter Block) offset size 0 1.w 1 セクタ当りのバイト数 2 1.b 1 クラスタ当りのセクタ数 3 1.b FAT 領域の個数 bit 7 = 1 で MS-DOS 形式 FAT(16bit Intel 配列) 4 1.w 予約セクタ数(FAT 先頭以前にあるセクタ数) 6 1.w ルートディレクトリのエントリ数 8 1.w 全領域のセクタ数 10 1.b メディアバイト 11 1.b FAT 領域 1 個当りのセクタ数 12 1.l 全領域のセクタ数(拡張) 全領域のセクタ数が 65535 を超えてワードで表現出来ない場合、8 バイト目からの 1 ワードは 0 にし、12 バイト目からの 1 ロングワードにセクタ数を設定する. ワー ドで表現できる場合は 12 バイト目からは不要である. ・メディアバイト $e0 2DD/10 $e5 1D/9 $e6 2D/9 $e7 1D/8 $e8 2D/8 $ea 2HT $eb 2HS $ec 2HDE $ee 1DD/9 $ef 1DD/8 $f4 DAT $f5 CD-ROM $f6 MO $f7 SCSI-HD $f8 SASI-HD $f9 RAMDISK $fa 2HQ $fb 2DD/8 $fc 2DD/9 $fd 2HC $fe 2HD 注意 $e0~$ef は 9SCDRV.X による拡張. ・エラーコード $0000: 処理完了 上位バイト $10~$1f エラー(中止のみ) $20~$2f エラー(再実行のみ) $30~$3f エラー(中止&再実行) $40~$4f エラー(無視のみ) $50~$5f エラー(中止&無視) $60~$6f エラー(再実行&無視) $70~$7f エラー(中止&再実行&無視) 下位バイト $01 ユニット番号が不正 $02 ドライブの準備が出来ていない $03 コマンドコードが不正 $04 CRC エラー $05 ディスクの管理領域が破壊されている $06 シークエラー $07 無効なメディア $08 セクタが見つからない $09 プリンタオフライン $0a 書き込みエラー $0b 読み込みエラー $0c その他のエラー $0d ライトプロテクト(取り替え不可) $0e 書き込み不可(取り替え可能)、又はディスクが入ってない ・デバイスドライバの構造 デバイスドライバは以下のモジュールから構成される. デバイスヘッダ デバイスドライバの先頭に位置し、デバイスの種類を示すと同時にデータ処 理ルーチンへのポインタ及びデバイス名(キャラクタデバイスの場合のみ)を持 つ. ストラテジルーチン OS の要求ごとに呼び出され、処理内容や返値の受け渡しに使用するリクエ ストヘッダのアドレスをレジスタ a5 で渡される. アドレスを保存したらすぐ に帰る. レジスタは全て保存すること. 割り込みルーチン ストラテジルーチンが受け取ったリクエストヘッダを実際に処理する. リク エストヘッダからコマンドを取り出して処理を行い、エラーコードをリクエス トヘッダにセットして帰る. 実際に入出力を行うコマンドではリクエストヘッ ダ内にバッファのアドレスが設定されており、指定されたバッファを使用して データの受け渡しを行う. レジスタは全て保存すること. 注意 標準入出力デバイス(CON)を作成する場合は、以下の4つの OS ファンクシ ョンを処理するルーチンを作成したうえ、DOS _INTVCS によって処理ルーチン を登録しなければならない. $ff21(_FNCKEY),$ff22(_KNJCTRL),$ff23(_CONCTRL),$ff24(_KEYCTRL) ============================================================================== ・デバイスドライバ(キャラクタデバイス) キャラクタデバイスのデバイスドライバはコマンド 0~12、19 が使用される. Command.0 初期化 in (offset size) 0 1.b 定数(22、内蔵デバイスドライバの初期化時は 23) 2 1.b コマンド(0) 18 1.l パラメータアドレス out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 14 1.l デバイスドライバの終了アドレス+1 システム起動時に一回だけ呼ばれる. タイトルを表示し初期化動作を行った 後、デバイスドライバの終わりのアドレス+1 を設定して返る. パラメータの 内容は以下の通り. .dc.b 'ファイル名',0 ;デバイスドライバのファイル名 .dc.b '引数 1',0 ;半角スペースで区切られた引数 .dc.b '引数 2',0 …… .dc.b '引数 n',0 .dc.b 0 ;引数列の終わり Command.3 IOCTRL による入力 in (offset size) 0 1.b 定数(26) 2 1.b コマンド(3) 14 1.l バッファアドレス 18 1.l バイト数 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) バッファに指定バイト数だけ IOCTRL によりデータを読み込む. Command.4 入力 in (offset size) 0 1.b 定数(26) 2 1.b コマンド(4) 14 1.l バッファアドレス 18 1.l バイト数 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l 実際に入力したバイト数 バッファに指定バイト数だけデータを読み込む. データが用意できていない 場合は、デーアが揃うまで待機する. 内蔵デバイスドライバの場合、常に指定したバイト数だけ入力される. Command.5 先読み入力 in (offset size) 0 1.b 定数(26) 2 1.b コマンド(5) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 13 1.b 読み込んだデータ デバイスからデータを 1 バイト先読みし、リクエストヘッダに書き込む. データが入力されていない場合は待たずに 0 を書き込んで返る. 入力したデ ータはバッファから取り除かずに、次回に入力できるようにしておく. Command.6 入力ステータス検査 in (offset size) 0 1.b 定数(26) 2 1.b コマンド(6) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) デバイスからの入力が可能か否かを調べる. 入力可能であればエラーコード (下位)に 0 を返し、入力不可能であれば 0 以外を返す. Command.7 入力バッファ消去 in (offset size) 0 1.b 定数(26) 2 1.b コマンド(7) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) それまでに入力されてバッファに溜っていたデータを全て破棄する. Command.8 出力(verify off) in (offset size) 0 1.b 定数(26) 2 1.b コマンド(8) 14 1.l データアドレス 18 1.l バイト数 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l 実際に出力したバイト数 データを指定バイト数だけデバイスに書き込む. 内蔵デバイスドライバの場合、常に指定したバイト数だけ出力される. Command.9 出力(verify on) in (offset size) 0 1.b 定数(26) 2 1.b コマンド(9) 14 1.l データアドレス 18 1.l バイト数 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l 実際に出力したバイト数 データを指定バイト数だけデバイスに書き込む. 書き出した後にそのデータ を読み込んで、実際に書き出せている事を確認する. 内蔵デバイスドライバの場合、常に指定したバイト数だけ出力される. Command.10 出力ステータス検査 in (offset size) 0 1.b 定数(26) 2 1.b コマンド(10) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) デバイスへの出力が可能か否かを調べる. 出力可能であればエラーコード (下位)に 0 を返し、出力不可能であれば 0 以外を返す. Command.12 IOCTRL による出力 in (offset size) 0 1.b 定数(26) 2 1.b コマンド(12) 14 1.l データアドレス 18 1.l バイト数 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) データを指定バイト数だけ IOCTRL によりデバイスに書き込む. Command.19 特殊 IOCTRL による制御 in (offset size) 0 1.b 定数(26) 2 1.b コマンド(19) 14 1.l バッファアドレス 18 1.w 内部コマンド out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) デバイスドライバの特殊制御を行う. 処理内容はデバイスドライバによって 異なる. ============================================================================== ・デバイスドライバ(ローカルドライブ) ローカルドライブのデバイスドライバはコマンド 0~12、19 が使用される. Command.0 初期化 in (offset size) 0 1.b 定数(22、内蔵デバイスドライバの初期化時は 23) 2 1.b コマンド(0) 18 1.l パラメータアドレス 22 1.b ドライブ番号 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 13 1.b ユニット数 14 1.l デバイスドライバの終了アドレス+1 18 1.l BPB ポインタ配列のアドレス キャラクタデバイスでの初期化処理に加え、デバイスドライバが管理するユ ニットの数と、そのユニット数分の BPB へのポインタを並べた配列のアドレ スを返す. 自分のドライブ番号が渡され、タイトルの表示等に使用できる. Command.1 メディア交換検査 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド(1) 13 1.b メディアバイト out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 14 1.b 交換フラグ 前回のアクセス以降にメディアが交換されたか否かを調べる. 交換されてい る場合は正数(通常は 1)を返し、交換されていなければ負数(通常は -1)を返 す. 交換されたかどうか不明な場合は負数を返すこと. デバイスドライバでエ ラーが発生した場合(エラーコードの下位が 0 以外の時)は交換されたと見な される. このコマンドはシステム内部の I/O バッファのデータが有効であるかを知 る為に呼び出される. Command.2 BPB 再構築 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド(2) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l BPB ポインタのアドレス 指定されたユニット番号のメディアのフォーマットを調べ、BPB を返す. 初 期化コマンドと違い、BPB 及び BPB へのポインタは指定されたユニットのも のだけを返せばよい. このコマンドはメディアが交換された時に呼び出される. エラーコードが 0 でなくても、エラー処理が呼び出されることはなく無視される. Command.3 IOCTRL による入力 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド(3) 14 1.l バッファアドレス 18 1.l バイト数 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) バッファに指定バイト数だけ IOCTRL によりデータを読み込む. Command.4 入力 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド(4) 13 1.b メディアバイト 14 1.l バッファアドレス 18 1.l セクタ数 22 1.l 開始セクタ番号 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 指定されたセクタから、指定されたセクタ数だけバッファに読み込む. Command.5 ドライブ制御/状態検査 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド(5) 13 1.b 内部コマンド 14 1.l 引数列のアドレス out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 13 1.b ドライブの状態 ドライブの動作を指定し、状態を返す. 内部コマンドは以下の通りで、これ は IOCS _B_DRVCHK の引数に相当する. Command.0 状態検査 1 Command.1 排出(排出禁止状態なら無視) Command.2 排出禁止 1(ユーザ用) Command.3 排出許可 1(ユーザ用、排出禁止 1 を解除) Command.4 メディア未挿入時に LED 点灯 Command.5 〃 消灯 Command.6 排出禁止 2(OS 用) Command.7 排出許可 2(OS 用、排出禁止 2 を解除) Command.9 状態検査 2 返値のドライブの状態は以下の通り. bit 7 LED 点灯 bit 6 排出禁止 bit 5 排出禁止 2(OS バッファ有り) bit 4 〃 1(ユーザー指定) bit 3 書き込み禁止 bit 2 ドライブノットレディ bit 1 メディア挿入 bit 0 メディア誤挿入 ただし、ノットレディとライトプロテクトはコマンド 0 の場合のみ有効. また、この時メディア未挿入なら両方のビットが 1 になる. Command.8 出力(verify off) in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド(8) 14 1.l データアドレス 18 1.l セクタ数 22 1.l 開始セクタ番号 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 指定されたセクタに、指定されたセクタ数だけデータを書き込む. Command.9 出力(verify on) in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド(9) 14 1.l データアドレス 18 1.l セクタ数 22 1.l 開始セクタ番号 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 指定されたセクタに、指定されたセクタ数だけデータを書き込む. 書き出し た後にそのデータを読み込んで、実際に書き出せている事を確認する. Command.12 IOCTRL による出力 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド(12) 14 1.l データアドレス 18 1.l バイト数 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) データを指定バイト数だけ IOCTRL によりデバイスに書き込む. Command.19 特殊 IOCTRL による制御 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド(19) 14 1.l バッファアドレス 18 1.w 内部コマンド out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) デバイスドライバの特殊制御を行う. 処理内容はデバイスドライバによって 異なる. ============================================================================== ・デバイスドライバ(リモートドライブ) リモートドライブのデバイスドライバはコマンド $40~$58 が使用される. ただし、 ベリファイを行う場合はコマンドの最上位ビットを 1 にして $c0~$d8 が使用される. Command.$40 初期化 in (offset size) 0 1.b 定数(22) 2 1.b コマンド($40/$c0) 18 1.l パラメータアドレス 22 1.b ドライブ番号 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 13 1.b ユニット数 14 1.l デバイスドライバの終了アドレス+1 ローカルドライブのコマンド 0 と同様に組み込み時に呼ばれるが、BPB 及 びそのポインタの配列を用意する必要はない. Command.$41 ディレクトリ検索 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($41/$c1) 14 1.l ディレクトリ名バッファ(namests 形式) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス 指定されたディレクトリが存在するか調べる. ローカルドライブで実行され る、ディレクトリの検査と共にその先頭 FAT を収得するルーチンに相当する が、リモートドライブの場合は FAT 番号を返す必要はない. Command.$42 ディレクトリ作成 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($42/$c2) 14 1.l ディレクトリ名バッファ(namests 形式) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス 指定されたディレクトリを作成する. 既に同名のディレクトリが存在した場 合はエラーを返すこと. Command.$43 ディレクトリ削除 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($43/$c3) 14 1.l ディレクトリ名バッファ(namests 形式) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス 指定されたディレクトリを削除する. ディレクトリ内にファイルがある場合 はエラーを返すこと. Command.$44 ファイル名変更 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($44/$c4) 14 1.l 旧ファイル名バッファ(namests 形式) 18 1.l 新ファイル名〃 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス ファイル名を変更する. パスが違う場合はディレクトリも移動する. 新ファ イル名が既に存在する場合はエラーを返すこと. ディレクトリ・ボリュームラ ベル・隠しファイル・書き込み禁止ファイルは移動できず、またシステムファ イル・書き込み禁止ファイルはファイル名を変更できない(システムファイル のディレクトリを移動しながらのファイル名変更は可能). Command.$45 ファイル削除 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($45/$c5) 14 1.l ファイル名バッファ(namests 形式) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス 指定されたファイルを削除する. ディレクトリ・ボリュームラベル・システ ムファイル・書き込み禁止ファイルは削除できない. Command.$46 ファイル属性収得/設定 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($46/$c6) 13 1.b 設定する属性(-1 なら収得) 14 1.l ファイル名バッファ(namests 形式) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス ファイルの属性を収得/設定する. Command.$47 FILES in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($47/$c7) 13 1.b 検索属性 14 1.l ファイル名バッファ(namests 形式) 18 1.l 検索バッファ(files 形式) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス ディレクトリから指定ファイルを検索する. DOS _FILES から呼び出される. 検索に失敗した場合、若しくは検索に成功してもワイルドカードが使われて いない場合は、次回検索時に必ず失敗させる為に検索バッファのオフセットに -1 を書き込む. 検索が成功した場合は見つかったファイルの情報を設定する と共に、次検索用の情報のセクタ番号、オフセット、ルートディレクトリの場 合は更に残りセクタ数を設定する. 検索ドライブ・属性、パス名は DOS コー ル処理内で設定されるので書き込む必要はない. Command.$48 NFILES in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($48/$c8) 18 1.l 検索バッファ(files 形式) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス ディレクトリから指定ファイルを検索する. DOS _FILES から呼び出される. オフセットが -1 になっていたらエラーを返す他は FILES と同じ. Command.$49 ファイル作成 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($49/$c9) 13 1.b ファイル属性 14 1.l ファイル名バッファ(namests 形式) 18 1.l モード(0:newfile 1:create) 22 1.l FCB out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス 指定されたファイルを作成する. newfile モードで同名ファイルが既に存在 していたらエラーを返し、create モードでは既存ファイルを削除してからフ ァイルを作成する. また、ボリュームラベルを作成する場合はデータが書き込 まれる事はないのでクラスタを確保しない. Command.$4a ファイルオープン in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($4a/$ca) 14 1.l ファイル名バッファ(namests 形式) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス 指定されたファイルをオープンする. ディレクトリ・ボリュームラベルはオ ープン出来ない. システムファイル・書き込み禁止ファイルは読み込みモード 以外ではオープン出来ない. オープンに成功した場合はファイル名、更新日時、ファイルサイズを FCB に設定すること. Command.$4b ファイルクローズ in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($4b/$cb) 22 1.l FCB out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス 指定されたファイルをクローズする. 最終変更時刻を更新すること. Command.$4c ファイル読み込み in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($4c/$cc) 14 1.l バッファアドレス 18 1.l バイト数 22 1.l FCB out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス ファイルから指定バイト数だけ読み込む. Command.$4d ファイル書き込み in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($4d/$cd) 14 1.l データアドレス 18 1.l バイト数 22 1.l FCB out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス ファイルに指定バイト数だけ書き込む. Command.$4e ファイルシーク in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($4e/$ce) 13 1.b モード(0:先頭から 1:現在位置から 2:末尾から) 18 1.l オフセット 22 1.l FCB out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス ファイルポインタを移動する. Command.$4f ファイル更新時刻の収得/設定 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($4f/$cf) 18 1.l 日付・時刻(0 なら収得) 22 1.l FCB out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス ファイルの最終変更日時を収得/設定する. 特に問題がなければ FCB を操作 するだけでよい. 日時を変更した場合はファイル属性の更新フラグを立てるこ と. Command.$50 容量収得 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($50/$d0) 14 1.l バッファアドレス out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス メディアの総容量/空き容量、クラスタ/セクタサイズを収得する. バッファ に書き込む内容は以下の通り. リザルトステータスとして使用可能なバイト数 を返すこと. offset size 0 1.w 使用可能なクラスタ数 2 1.w 総クラスタ数 4 1.w 1 クラスタ当りのセクタ数 6 1.w 1 セクタ当りのバイト数 Command.$51 ドライブ制御/状態検査 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($51/$d1) 13 1.b 内部コマンド 14 1.l 引数列のアドレス out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 13 1.b ドライブの状態 18 1.l リザルトステータス ドライブの動作を指定し、状態を返す. ブロックデバイスの場合と同じ. Command.$52 DPB 収得 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($52/$d2) 14 1.l バッファアドレス(先頭アドレス+2 を指す) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス 指定メディアの情報を v1 形式 DPB で返す. このコマンドで設定する必要 がある情報は以下の通り(括弧内は DOS コールが設定する). ただし、バッフ ァアドレスはオフセット 2 を指したアドレスが渡されるので注意すること. offset size 0 1.b (ドライブ番号) 1 1.b (ユニット番号) 2 1.w 1 セクタ当りのバイト数 4 1.b 1 クラスタ当りのセクタ数-1 5 1.b クラスタ→セクタのシフト数 bit 7 = 1 で MS-DOS 形式 FAT(16bit Intel 配列) 6 1.w FAT の先頭セクタ番号 8 1.b FAT 領域の個数 9 1.b FAT の占めるセクタ数(複写分を除く) 10 1.w ルートディレクトリに入るファイルの個数 12 1.w データ領域の先頭セクタ番号 14 1.w 総クラスタ数+1 16 1.w ルートディレクトリの先頭セクタ番号 18 1.l (ドライバヘッダのアドレス) 22 1.b (小文字の物理ドライブ名) 23 1.b (DPB 使用フラグ:常に 0) 24 1.l (次の DPB のアドレス) 28 1.w (カレントディレクトリのクラスタ番号:常に 0) 30 64.b (カレントディレクトリ名) なおリザルトステータスでエラーが返ると、DOS コールでは小文字の物理ド ライブ名、DPB 使用フラグ、カレントディレクトリ名を設定しない. Command.$53 IOCTRL による入力 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($53/$d3) 13 1.b メディアバイト 14 1.l バッファアドレス 18 1.l セクタ数 22 1.l 開始セクタ番号 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス バッファに指定バイト数だけ IOCTRL によりデータを読み込む. Command.$54 IOCTRL による出力 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($54/$d4) 13 1.b メディアバイト 14 1.l データアドレス 18 1.l セクタ数 22 1.l 開始セクタ番号 out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス データを指定バイト数だけ IOCTRL によりデバイスに書き込む. Command.$55 特殊 IOCTRL による制御 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($55/$d5) 14 1.l バッファアドレス 18 1.w 内部コマンド out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス デバイスドライバの特殊制御を行う. 処理内容はデバイスドライバによって 異なる. Command.$56 アボート in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($56/$d6) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス DOS _FFLUSH が実行された時にドライブごとに呼び出される. fflush = off の時は呼び出されない. キャッシュの破棄などを行う. Command.$57 メディア交換検査 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($57/$d7) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス メディアが交換されたか否かを調べる. 交換されていた場合のフォーマット 確認はこのコマンド内で行うこと. Command.$58 排他制御の確認 in (offset size) 0 1.b 定数(26) 1 1.b ユニット番号 2 1.b コマンド($58/$d8) 13 1.b モード(0:設定 1:解除) 14 1.l バイト数 18 1.l オフセット 22 1.l FCB out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 18 1.l リザルトステータス DOS _LOCK が実行された時に呼び出される. 実際のファイル排他制御は全て DOS コールの処理内で行われるので、特に問題がなければ正常終了すること. ============================================================================== ・DISK2HD Human68k 内蔵のデバイスドライバ、DISK2HD には以下の固有機能がある. Command.3 IOCTRL による入力 指定されたバッファにメディア判別ルーチン/メディア交換フラグ初期化ル ーチンへの分岐命令(jmp abs.l)を収得する. バッファは 12 バイト必要で、 内容は以下の通り. offset size 0 6.b jmp ??? (メディア判別ルーチンへの分岐命令) 6 6.b jmp ??? (メディア交換フラグ初期化ルーチンへの分岐命令) Command.12 IOCTRL による出力 メディア判別ルーチンへの分岐命令(jmp abs.l)を設定する. データの内容 は以下の通りで、データは 6バイト必要. offset size 0 6.b jmp ??? (メディア判別ルーチンへの分岐命令) Command.19 特殊 IOCTRL による制御 内部コマンドによって以下の入出力を行う. Command.0 メディアバイトを収得する. バッファは 2 バイト必要. メディア バイトはワードサイズで返り、その上位バイトは常に 0 となる. Command.1 装置情報を収得する. バッファは 18 バイト必要で、内容は以下の 通り. offset size 0 1.l IOCS _B_READID の返値 4 1.w 1 セクタ当りのバイト数 ┐ 6 1.b 1 クラスタ当りのセクタ数 │ 7 1.b FAT 領域の個数 │ 8 1.w 予約セクタ数 │BPB 10 1.w ルートディレクトリのエントリ数 │ 12 1.w 全領域のセクタ数 │ 14 1.b メディアバイト │ 15 1.b FAT 領域 1 個当りのセクタ数 ┘ 16 1.b ユニット番号(?) 17 1.b メディア交換フラグ Command.2 メディア交換フラグを設定する. データは 1 バイト必要で、-1 な ら前回のアクセスからメディア交換あり、1 なら交換なしを表わす. 0 であれば IOCS 依存に戻す. Command.$ffff(-1) デバイスドライバの種類/バージョンを収得する. バッファは 8 バ イト必要. Human68k version 3.02 の場合、バッファには'DISKdev1' が返る. ============================================================================== ・CLOCK Human68k 内蔵のデバイスドライバ、CLOCK は現在日時の収得/設定をする為のデバイ スドライバで、Human68k から直接呼び出される. このデバイスがサポートするコマン ドは通常の入出力だけであるが、対象を日付と時刻のどちらかに選択する為に内部コマ ンドを必要とする. また、入出力のサイズは 4 バイト固定となっている. Command.4 入力 in (offset size) 0 1.b 定数(26) 2 1.b コマンド(4) 14 1.l バッファアドレス 22 1.l 内部コマンド(0:日付の収得 0 以外:時刻の収得) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) バッファに 4 バイトの日付もしくは時刻をバイナリ形式(IOCS _B_TIMEBIN/ _DATEBIN の返値)で返す. Command.8/9 出力(verify off/on) in (offset size) 0 1.b 定数(26) 2 1.b コマンド(8) 14 1.l データアドレス 22 1.l 内部コマンド(0:日付の設定 0 以外:時刻の設定) out (offset size) 3 1.b エラーコード(下位) 4 1.b 〃 (上位) 日付もしくは時刻を 4 バイトのバイナリ形式(IOCS _TIMESET/DATESET の引 数)で指定された値に設定する. =============================================================================