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/DOSCALL
Jump to navigation
Jump to search
- DOS CALL MANUAL - ============================================================================== - List of DOS calls $ff00 _EXIT End program $ff01 _GETCHAR Keyboard input (with echo) $ff02 _PUTCHAR Display character $ff03 _COMINP Read byte from RS-232C $ff04 _COMOUT Write byte to RS-232C $ff05 _PRNOUT Write character to printer $ff06 _INPOUT Character I/O $ff07 _INKEY Get character from keyboard (no break check) $ff08 _GETC Get character from keyboard (with break check) $ff09 _PRINT Print character string $ff0a _GETS Get character string (with break check) $ff0b _KEYSNS Examine key input status $ff0c _KFLUSH Get key input after flushing buffer $ff0d _FFLUSH Disk reset $ff0e _CHGDRV Select working drive $ff0f _DRVCTRL Examine/select drive status $ff10 _CONSNS Inspect screen output $ff11 _PRNSNS Inspect printer output $ff12 _CINSNS Inspect RS-232C input $ff13 _COUTSNS Inspect RS-232C output $ff17 _FATCHK Inspect file allocation status $ff18 _HENDSP Kanji conversion control $ff19 _CURDRV Get working drive $ff1a _GETSS Get character string (no break check) $ff1b _FGETC Read byte from file $ff1c _FGETS Read character string from file $ff1d _FPUTC Write byte to file $ff1e _FPUTS Write character string to file $ff1f _ALLCLOSE Close all files $ff20 _SUPER Set supervisor/user mode $ff21 _FNCKEY Get/set redefinable keys $ff22 _KNJCTRL Function call for kana-kanji conversion $ff23 _CONCTRL Console control / direct output $ff24 _KEYCTRL Inspect console status / direct input $ff25 _INTVCS Set vector handling address $ff26 _PSPSET Make process stack pointer $ff27 _GETTIM2 Get time (longword) $ff28 _SETTIM2 Set time (longword) $ff29 _NAMESTS Expand filename $ff2a _GETDATE Get date $ff2b _SETDATE Set date $ff2c _GETTIME Get time $ff2d _SETTIME Set time $ff2e _VERIFY Set verify flag $ff2f _DUP0 Force-copy file handle $ff30 _VERNUM Get OS version $ff31 _KEEPPR Terminate and stay $ff32 _GETDPB Get drive parameter block $ff33 _BREAKCK Set break check $ff34 _DRVXCHG Drive exchange $ff35 _INTVCG Get vector handling address $ff36 _DSKFRE Get remaining disk space $ff37 _NAMECK Expand filename $ff39 _MKDIR Make subdirectory $ff3a _RMDIR Remove subdirectory $ff3b _CHDIR Change working directory $ff3c _CREATE Create file $ff3d _OPEN Open file $ff3e _CLOSE Close file $ff3f _READ Read from file $ff40 _WRITE Write to file $ff41 _DELETE Delete file $ff42 _SEEK Move file pointer $ff43 _CHMOD Get/set file attributes $ff44 _IOCTRL Device driver ioctrl direct I/O $ff45 _DUP Copy file handle $ff46 _DUP2 Force-copy file handle $ff47 _CURDIR Get working directory $ff48 _MALLOC Reserve memory $ff49 _MFREE Relinquish memory block $ff4a _SETBLOCK Modify memory block $ff4b _EXEC Load and execute program $ff4c _EXIT2 End program with exit code $ff4d _WAIT Get process exit code $ff4e _FILES Find file $ff4f _NFILES Find next file $ff80 _SETPDB Modify process data block $ff81 _GETPDB Get process data block $ff82 _SETENV Set environment variable $ff83 _GETENV Get environment variable $ff84 _VERIFYG Get verify flag $ff85 _COMMON Control common region $ff86 _RENAME Rename/move file $ff87 _FILEDATE Get/set file modified date $ff88 _MALLOC2 Reserve memory $ff8a _MAKETMP Make temporary file $ff8b _NEWFILE Make new file $ff8c _LOCK Lock file $ff8f _ASSIGN Get/set/delete virtual drive/directory allocation $ffaa (unlisted) Set FFLUSH mode (unlisted) $ffab _OS_PATCH Update internal OS handler (unlisted) $ffac _GETFCB Get file control block pointer (unlisted) $ffad _S_MALLOC Reserve memory block under main memory manager $ffae _S_MFREE Relinquish memory block under main memory manager $ffaf _S_PROCESS Set sub-memory manager $fff0 _EXITVC (address to execute at end of program) $fff1 _CTRLVC (address to execute at CTRL+C abort) $fff2 _ERRJVC (address to execute at error abort) $fff3 _DISKRED Block device direct input $fff4 _DISKWRT Block device direct output $fff5 _INDOSFLG Get pointer to OS' work area $fff6 _SUPER_JSR Subroutine call $fff7 _BUS_ERR Inspect bus error occurrence $fff8 _OPEN_PR Register background task $fff9 _KILL_PR Kill this process $fffa _GET_PR Get thread management info $fffb _SUSPEND_PR Force-sleep thread $fffc _SLEEP_PR Sleep $fffd _SEND_PR Send thread commands/data $fffe _TIME_PR Get timer counter value $ffff _CHANGE_PR Yield execution time CAUTION: Calls listed as $ff50-$ff7f in Human68k version 2 were moved to $ff80-$ffaf in version 3 The handler addresses for calls $fff5-$fff7 and $fffa-$fffe cannot be changed (they are ignored). For $fff8 and $ffff, after the original handler exits normally, the address set is executed. $fff9 is called for every thread to kill. ============================================================================== - List of error codes $ffffffff -1 無効なファンクションコードを実行した $fffffffe -2 指定したファイルが見つからない $fffffffd -3 指定したディレクトリが見つからない $fffffffc -4 オープンしているファイルが多すぎる $fffffffb -5 ディレクトリやボリュームラベルはアクセスできない $fffffffa -6 指定したハンドルはオープンされていない $fffffff9 -7 メモリ管理領域が破壊された $fffffff8 -8 実行に必要なメモリがない $fffffff7 -9 無効なメモリ管理ポインタを指定した $fffffff6 -10 不正な環境を指定した $fffffff5 -11 実行ファイルのフォーマットが異常 $fffffff4 -12 オープンのアクセスモードが異常 $fffffff3 -13 ファイル名の指定に誤りがある $fffffff2 -14 無効なパラメータでコールした $fffffff1 -15 ドライブ指定に誤りがある $fffffff0 -16 カレントディレクトリは削除できない $ffffffef -17 ioctrl できないデバイス $ffffffee -18 これ以上ファイルが見つからない $ffffffed -19 指定のファイルは書き込みできない $ffffffec -20 指定のディレクトリは既に登録されている $ffffffeb -21 ファイルがあるので削除できない $ffffffea -22 ファイルがあるのでリネームできない $ffffffe9 -23 ディスクが一杯でファイルが作れない $ffffffe8 -24 ディレクトリが一杯でファイルが作れない $ffffffe7 -25 指定の位置にはシークできない $ffffffe6 -26 スーパーバイザ状態で再びスーパーバイザモードの指定を行った $ffffffe5 -27 同じスレッド名が存在する $ffffffe4 -28 プロセス間通信のバッファが書き込み禁止状態 $ffffffe3 -29 これ以上バックグラウンドプロセスを起動できない $ffffffe0 -32 ロック領域が足りない $ffffffdf -33 ロックされていてアクセスできない $ffffffde -34 指定のドライブはハンドラがオープンされている $ffffffdd -35 シンボリックリンクのネストが16回を超えた(lndrv) $ffffffb0 -80 ファイルが存在する ============================================================================== ============================================================================== $ff00 _EXIT プログラムの終了 プログラムを終了する. オープンしたファイルハンドルはクローズされる. ============================================================================== $ff01 _GETCHAR キーボードの入力を待つ(エコーあり) 返値 キーコード キーの入力を待ち、入力したキーコードを標準出力に出力する. 入力されたキーが ^C(親プロセスに戻る)、^P(以後の標準出力をプリンタにも 出力する)、^N(^P状態をやめる)のいずれかであるか調べる. ============================================================================== $ff02 _PUTCHAR 指定文字コードの表示 引数 CODE.w 1 バイト文字コード 返値 常に 0 CODE で指定した文字コードを標準出力に出力する. 表示中に入力されたキーが ^C、^S、^P、^N であるか調べる. move CODE,-(sp) DOS _PUTCHAR addq.l #2,sp ============================================================================== $ff03 _COMINP RS-232C回線から 1 バイト入力 返値 入力した 1 バイト RS-232C回線から 1 バイト入力する(ブレークチェックあり). ============================================================================== $ff04 _COMOUT RS-232C回線へ 1 バイト出力 引数 CODE.w 1 バイトコード CODE で指定した 1 バイトのコードをRS-232C回線に出力する(ブレークチェッ クあり). move CODE,-(sp) DOS _COMOUT addq.l #2,sp ============================================================================== $ff05 _PRNOUT プリンタへ 1 文字出力 引数 CODE.w 1 バイト文字コード CODE で指定した 1 文字をプリンタへ出力する(ブレークチェックあり). CODE の上位バイトは 0 でなければならないので、漢字は上位・下位の順で 1 バイトずつ出力する. move CODE,-(sp) DOS _PRNOUT addq.l #2,sp ============================================================================== $ff06 _INPOUT キーの入出力 引数 CODE.w 1 バイト文字コード 返値 CODE = $ff,$fe 入力されたキーコード(d0.l = 0 なら入力なし) CODE = その他 d0.l = 0 CODE の値が $ff であればキー入力を行うが、キーが入力されていなければす ぐに終了する. $fe であればキーの先読み入力を行うが、キーが入力されてい てもそのキーはそのままバッファに残る. CODE がその他の値であれば文字コ ードとみなして表示する. move CODE,-(sp) DOS _INPOUT addq.l #2,sp ============================================================================== $ff07 _INKEY キーボードから 1 文字入力(ブレークチェックなし) 返値 キーコード キーが押されるまで待ち、そのキーコードを返す. ============================================================================== $ff08 _GETC キーボードから 1 文字入力(ブレークチェックあり) 返値 キーコード キーが押されるまで待ち、そのキーコードを返す. ^C、^P、^N について調べる. ============================================================================== $ff09 _PRINT 文字列の表示 引数 MESPTR.l 文字列のポインタ 返値 常に 0 MESPTR で指定した文字列を表示する. ^C、^S、^P、^N について調べる. pea (MESPTR) DOS _PRINT addq,l #4,sp ============================================================================== $ff0a _GETS 文字列の入力 引数 BUFFER.l 入力バッファのポインタ 返値 入力文字数 BUFFER で指定した入力バッファに、改行までの入力文字列を書き込む. 改行文字はヌル文字に置き換えられる. ^C、^P、^N について調べる. 最大入力文字数を超えた場合は、警告を出すが終了はしない. 入力バッファの内容は以下の通りで、最大入力文字数を設定してから呼び出す. 同一バッファで続けて実行する場合、前回の実行時に得られた入力文字数をク リアしなければテンプレート機能が使用できる. offset size 0 1.b 最大入力文字数 : n 1 1.b 実際に入力された文字数 2 n+1.b 入力文字列 pea (BUFFER) DOS _GETS addq.l #4,sp ============================================================================== $ff0b _KEYSNS キーの入力状態の検査 返値 入力状態(0:入力なし、-1:入力あり) キーの入力状態を調べる. ^C、^P、^N について調べる. ============================================================================== $ff0c _KFLUSH バッファフラッシュ後キーボードから入力 引数 MODE.w モード CODE.w 処理を撰択するコード BUFFER.l 入力バッファのポインタ 返値 MODE = 1,7,8 入力されたキーコード MODE = 6 CODE = $fe,$ff 入力されたキーコード(0 なら入力なし) CODE = その他 d0.l = 0 MODE = 10 入力文字数 キー入力バッファを空にしてから、キーボードから入力する. MODE の値は DOS コールの下位 1 バイトに対応し、以下の動作をする. MODE = 1 キー入力を待ち、入力されたコードを標準出力に出力する. MODE = 6 CODE = $ff キー入力(入力がなくても待たない)を調べる. CODE = $fe キーの先読み入力を行う. CODE = その他 標準出力に出力する. MODE = 7 キー入力を待つ(ブレークチェックなし). MODE = 8 キー入力を待つ(ブレークチェックあり). MODE = 10 改行までに入力した文字列をバッファに書き込む. MODE = 1,7,8 move MODE,-(sp) DOS _KFLUSH adddq.l #2,sp MODE = 6 move CODE,-(sp) move MODE,-(sp) DOS _KFLUSH adddq.l #4,sp MODE = 10 pea (BUFFER) move MODE,-(sp) DOS _KFLUSH adddq.l #6,sp ============================================================================== $ff0d _FFLUSH ディスクのリセット 返値 常に 0 ディスクバッファの内容と標準入力からの行入力バッファを初期化する. ファ イルのクローズはしない. fflush = off であれば何もしない. ============================================================================== $ff0e _CHGDRV カレントドライブの設定 引数 DRIVE.w ドライブ番号(0:A 1:B … 25:Z) 返値 指定可能ドライブ数(1~26) カレントドライブを変更する. 返値が指定したドライブ番号以下であれば失敗. move DRIVE,-(sp) DOS _CHGDRV addq.l #2,sp ============================================================================== $ff0f _DRVCTRL ドライブの状態検査/設定 引数 MODE.w (MD.b×256+DRIVE.b) MB.b モード DRIVE.b ドライブ番号(0:カレント 1:A 2:B … 26:Z) P1.l 引数 1 P2.l 引数 2 … Pn.l 引数 n 返値 MD = 0 指定ドライブの状態 bit 7 LED 点滅 bit 6 イジェクト禁止 bit 5 バッファあり bit 4 ユーザーによるイジェクト禁止 bit 3 PRO(プロテクト = 1) bit 2 RDY(ノットレディ = 1) bit 1 メディア挿入 bit 0 誤挿入 注: PRO と RDY はメディアが挿入されていた場合のみ返す. モード MD の値に従って、ドライブ番号 DRIVE で指定したドライブの状態を 検査/設定する. MODE の上位 8bit にモード MD、下位 8bit にドライブ番号 DRIVE を指定する. MD = 0 状態検査. MD = 1 排出(オープン中のファイルがあるとエラー). MD = 2 排出禁止(MD = 1 の排出も禁止). MD = 3 排出許可(オープンされているドライブはクローズされず、 バッファは自動的に消去される). MD = 4 ディスク未挿入時に LED 点滅. MD = 5~8 使用禁止. MD = 9 カレントディレクトリをルートにして検索 FAT を先頭に戻す (オープンされているファイルがあるとエラー). MD = 10 検索 FAT を先頭に戻す. MD = 11~15 予約. MD = 16~ 特殊ブロックデバイスに対して使用する(任意の引数が追加可能). MD = 0~4,9,10 move MODE,-(sp) DOS _DRVCTRL addq.l #2,sp MD = 16~ move.l Pn,-(sp) … move.l P1,-(sp) move MODE,-(sp) DOS _DRVCTRL lea (n*4+2,sp),sp ============================================================================== $ff10 _CONSNS 画面出力ができるかの検査 返値 出力状態(0:出力不可、0 以外:出力可能) 画面に出力可能か調べる. ============================================================================== $ff11 _PRNSNS プリンタ出力ができるかの検査 返値 出力状態(0:出力不可、0 以外:出力可能) プリンタに出力可能か調べる. ============================================================================== $ff12 _CINSNS RS-232C回線から入力ができるかの検査 返値 入力状態(0:入力不可、0 以外:入力可能) RS-232C回線から入力可能か調べる. ============================================================================== $ff13 _COUTSNS RS-232C回線へ出力ができるかの検査 返値 出力状態(0:出力不可、0 以外:出力可能) RS-232C回線に出力可能か調べる. ============================================================================== $ff17 _FATCHK ドライブのセクタが連続しているかの検査 引数 FILE.l ファイル名のポインタ BUFFER.l バッファのポインタ LEN.w バッファのバイト数 返値 バッファの使用バイト数(負数ならエラーコード) d0.l = 8 連続([1]でコールした場合) d0.l = 14 連続([2]でコールした場合) FILE で指定したファイルのドライブ番号とセクタの連結状態をバッファに書き 込む. この DOS コールで FAT が連続していることを調べるとともに、DISKRED でデータ部を直接読むことが可能. この DOS コールは、バッファのアドレス BUFFER をスタックに積む時 [1] そのまま積む [2] BUFFER+$80000000 を積む の 2 種類のコール方法があり、[1]の場合はバッファに書き込まれるセクタ番 号とセクタ数のサイズがワードであるが、[2]ではロングワードになる. [2]の場合バッファのバイト数 LEN が引数に必要なので注意すること. バッファに書き込まれる情報は以下の通り. [1] offset size 0 1.w ドライブ番号 : d(1:A 2:B … 26:Z) 2 1.w 先頭セクタ番号 : s1 4 1.w セクタ数 : n1 6 1.w 次のセクタ番号 : s2 8 1.w セクタ数 : n2 … ? 1.w 終わり : 0 [2] offset size 0 1.w ドライブ番号 : d(1:A 2:B … 26:Z) 2 1.l 先頭セクタ番号 : s1 6 1.l セクタ数 : n1 10 1.l 次のセクタ番号 : s2 14 1.l セクタ数 : n2 … ? 1.l 終わり : 0 [1] pea (BUFFER) pea (FILE) DOS _FATCHK addq.l #8,sp [2] move LEN,-(sp) pea (BUFFER+$80000000) pea (FILE) DOS _FATCHK lea (10,sp),sp ============================================================================== $ff18 _HENDSP 漢字変換行の制御 引数 MD.w コントロールモード POS.w ポジション(変換ウィンドウの先頭からの位置) MESPTR.l 変換文字列のポインタ 返値 MD = 0,4,8 ウィンドウの最大文字数 MD = 1,2,5,6,7,10 次のポジション モード MD の値に従って漢字変換行を制御する. この DOS コールは漢字変換を扱うプログラムに使用するが、日本語 FP から 利用するので一般のアプリケーションは使用禁止. MD = 0 モード表示ウィンドウをオープンする. MD = 1 指定位置から文字列をノーマルで表示する. MD = 2 指定位置から文字列をリバースで表示する. MD = 3 モード表示ウィンドウをクローズする. MD = 4 入力ウィンドウをオープンする. MD = 5 指定位置から文字列をノーマルで表示する. MD = 6 指定位置から文字列をリバースで表示する. MD = 7 指定のポジション以降を元に戻す. MD = 8 侯補ウィンドウをオープンする. MD = 9 指定位置から文字列をノーマルで表示する. MD = 10 指定位置から文字列をリバースで表示する. MD = 11 侯補ウィンドウをクローズする. MD = 0,3,4,8,11 move MD,-(sp) DOS _HENDSP addq.l #2,sp MD = 7 move POS,-(sp) move MD,-(sp) DOS _HENDSP addq.l #4,sp MD = 1,2,5,6,9,10 pea (MESPTR) move POS,-(sp) move MD,-(sp) DOS _HENDSP addq.l #8,sp ============================================================================== $ff19 _CURDRV カレントドライブを得る 返値 カレントドライブの番号(0:A 1:B … 25:Z) カレントドライブの値を調べる. ============================================================================== $ff1a _GETSS 文字列の入力 引数 BUFFER.l 入力バッファのポインタ 返値 入力文字数 BUFFER で指定した入力バッファに、改行までの入力文字列を書き込む. 改行文字は、ヌル文字に置き換えられる. ブレークチェックはしない(VOID/NEWLINE で改行しない). 最大入力文字数を超えた場合は、警告を出すが終了はしない. 入力バッファの内容は以下の通り. offset size 0 1.b 最大入力文字数 : n 1 1.b (実際に入力された文字数) 2 n+1.b 入力文字列 pea (BUFFER) DOS _GETSS addq.l #4,sp ============================================================================== $ff1b _FGETC ファイルハンドルから 1 バイト入力 引数 FILENO.w ファイルハンドル 返値 入力した 1 バイトコード FILENO で指定したファイルハンドルから入力があるまで待ち、入力があった らそのコードを返す. ============================================================================== $ff1c _FGETS ファイルハンドルから文字列入力 引数 BUFFER.l 入力バッファのポインタ FILENO.w ファイルハンドル 返値 入力文字数 FILENO で指定したファイルハンドルから改行までの文字列を入力し、BUFFER で指定した入力バッファに書き込む. 改行文字はヌル文字に置き換えられる. ブレークチェックはしない(VOID/NEWLINE で改行しない). 最大入力文字数を超えた場合は、最大入力文字数まで入れて終了する. 入力バッファの内容は以下の通り. offset size 0 1.b 最大入力文字数 : n 1 1.b (実際に入力された文字数) 2 n+1.b 入力文字列 move FILENO,-(sp) pea (BUFFER) DOS _FGETS addq.l #6,sp ============================================================================== $ff1d _FPUTC ファイルハンドルに 1 バイト出力 引数 CODE.w 1 バイトコード FILENO.w ファイルハンドル CODE で指定した 1 バイトコードを、FILENO で指定したファイルハンドルに 出力する. move FILENO,-(sp) move CODE,-(sp) DOS _FPUTC addq.l #4,sp ============================================================================== $ff1e _FPUTS ファイルハンドルに文字列出力 引数 MESPTR.l 文字列のポインタ FILENO.w ファイルハンドル MESPTR で指定した文字列を、FILENO で指定したファイルハンドルに出力する. 文字列の末尾のヌル文字は出力しない. move FILENO,-(sp) pea (MESPTR) DOS _FPUTS addq.l #6,sp ============================================================================== $ff1f _ALLCLOSE 全ファイルのクローズ オープンしたファイルを全てクローズする. ============================================================================== $ff20 _SUPER スーパーバイザ/ユーザーモードの切り替え 引数 STACK.l 切り替えモード(0 若しくは SSP に設定するアドレス) 返値 STACK = 0 前の SSP の値(負数ならエラーコード) 切り替えモード STACK の値に従って、スーパーバイザ/ユーザーモードを切り 替える. STACK = 0 USP の値を SSP に設定し、スーパーバイザモードに切り替える. STACK = その他 STACK を SSP に設定し、ユーザーモードに切り替える. pea (STACK) DOS _SUPER addq.l #4,sp ============================================================================== $ff21 _FNCKEY 再定義可能なキーの読み出し/設定 引数 MODE.w モード及びキー番号(MD.b×256+FNO.b) BUFFER.l データバッファのポインタ 返値 d0.l = 0 正常終了 -1 キー番号が異常 モード MD の値によって、再定義可能なキーの収得/設定をする. この DOS コールは、CON デバイス(コンソール)でサポートされる. MODE の上位 8bit にモード MD、下位 8bit にキー番号 FNO を指定する. MD = 0 収得 MD = 1 設定(同時にファンクションキーの表示も行なうが、32行モードの時 は表示しない) FNO キー名 0 全てのキー 1~10 F01~F10 11~20 SHIFT+F01~F10 21 ROLL UP 22 ROLL DOWN 23 INS 24 DEL 25 UP(↑) 26 LEFT(←) 27 RIGHT(→) 28 DOWN(↓) 29 CLR 30 HELP 31 HOME 32 UNDO BUFFER は収得/設定のためのバッファで、大きさは FNO の値によって異なる. FNO = 0 712 バイト(32×20+6×12 バイト) FNO = 1~20 32 バイト(31 バイト+$00) FNO = 21~32 6 バイト( 5 バイト+$00) pea (BUFFER) move MODE,-(sp) DOS _FNCKEY addq.l #6,sp ============================================================================== $ff22 _KNJCTRL 仮名漢字変換用ファンクションコールの呼び出し この DOS コールは、日本語 FP のファンクションコールで使用する. ============================================================================== $ff23 _CONCTRL コンソールの制御/直接出力 引数 MD.w コントロールモード(この値によって引数が異なる) CODE.w 1 バイトコード MESPTR.l 文字列のポインタ ATR.w 文字属性 X.w カーソル位置指定 Y.w カーソル位置指定 N.w カーソル相対移動指定 MOD.w 画面制御指定 YS.w スクロール範囲指定 YL.w スクロール範囲指定 返値 MD = 0~13,15,17,18 d0.l = 0 (正常終了の場合) MD = 14,16 前のモード コントロールコード MD の値に従って、コンソールから直接入力/制御を行う. この DOS コールは CON デバイスでサポートされる. MD = 0 CODE で指定した 1 バイトコードを表示する(IOCS _B_PUTC). MD = 1 MESPTR で指定した文字列を表示する(IOCS _B_PRINT). MD = 2 ATR で指定した文字属性を設定する(IOCS _B_COLOR). MD = 3 カーソルを X、Y で指定した位置に設定する(IOCS _B_LOCATE). MD = 4 カーソルを 1 行下に移動する. 最下行でスクロールアップする (IOCS _B_DOWN_S). MD = 5 カーソルを 1 行上に移動する. 先頭行でスクロールダウンする (IOCS _B_UP_S). MD = 6 カーソルを N 行上に移動するが、スクロールはしない(IOCS _B_UP). MD = 7 カーソルを N 行下に移動するが、スクロールはしない(IOCS _B_DOWN). MD = 8 カーソルを N 桁右に移動するが、スクロールはしない(IOCS _B_RIGHT). MD = 9 カーソルを N 桁左に移動するが、スクロールはしない(IOCS _B_LEFT). MD = 10 モード MOD の値に従って、画面を消去する(IOCS _B_CLR_ST). MOD = 0 カーソル位置から最終行右端まで MOD = 1 先頭行左端からカーソル位置まで MOD = 2 画面全体(カーソルは先頭行左端に移動する) MD = 11 モード MOD の値に従って、現在行を消去する(IOCS _ERA_ST). MOD = 0 カーソル位置から行の右端まで MOD = 1 行の左端からカーソル位置まで MOD = 2 カーソル行全体 MD = 12 カーソル行に N 行挿入する(IOCS _B_INS). MD = 13 カーソル行から N 行削除する(IOCS _B_DEL). MD = 14 モード MOD の値に従って、ファンクションキー行のモードを設定し、 前のモードを返す. スクロール範囲はリセットされる. MOD = 0 ファンクションキーを表示(スクロール範囲は 0 か ら 31 行分) MOD = 1 シフトファンクションキーを表示(同上) MOD = 2 何も表示しない(同上) MOD = 3 何も表示しない(スクロール範囲は 0 から 32 行分) MOD = -1 現在のモードを調べる. MD = 15 YS、YL でスクロール範囲を設定する. スクロール後、カーソルは先頭行左端に移動する. YS+YL の値は、ファンクションキー行のモードが 3 の時は 32 まで、 それ以外は 31 までの範囲で指定する. 絶対座標の (0,YS) が 論理座標の (0,0) となる. MD = 16 モード MOD に従って画面モードを設定し、前のモードを返す. MOD 表示画面 グラフィック 0 768×512 なし 1 768×512 16 色 2 512×512 なし 3 512×512 16 色 4 512×512 256 色 5 512×512 65536 色 -1 現在のモードを調べる. MD = 17 カーソルを表示するモードにする(IOCS _OS_CURON). MD = 18 カーソルを表示しないモードにする(IOCS _OS_CUROF). MD = 6~9,12~13 で N = 0 を指定した場合は N = 1 として扱われる. MD = 0 move CODE,-(sp) move MD,-(sp) DOS _CONCTRL addq.l #4,sp MD = 1 pea (MESPTR) move MD,-(sp) DOS _CONCTRL addq.l #6,sp MD = 2 move ATR,-(sp) move MD,-(sp) DOS _CONCTRL addq.l #4,sp MD = 3 move Y,-(sp) move X,-(sp) move MD,-(sp) DOS _CONCTRL addq.l #6,sp MD = 4,5,17,18 move MD,-(sp) DOS _CONCTRL addq.l #2,sp MD = 6~9,12~13 move N,-(sp) move MD,-(sp) DOS _CONCTRL addq.l #4,sp MD = 10,11,14,16 move MOD,-(sp) move MD,-(sp) DOS _CONCTRL addq.l #4,sp MD = 15 move YL,-(sp) move YS,-(sp) move MD,-(sp) DOS _CONCTRL addq.l #6,sp ============================================================================== $ff24 _KEYCTRL コンソールの状態検査/直接入力 引数 MD.w コントロールモード(この値によって引数が異なる) GROUP.w キーコードグループ INSMODE.w INS キーのモード(-1:ON 0:OFF) 返値 MD = 0,1 入力されたキーコード MD = 2 シフトキーの状態(bit = 1 で押されている) bit 10 全角 bit 9 ひらがな bit 8 INS bit 7 CAPS bit 6 コード入力 bit 5 ローマ字 bit 4 かな bit 3 OPT.2 bit 2 OPT.1 bit 1 CTRL bit 0 SHIFT MD = 3 キーの状態 コントロールコード MD の値に従って、直接コンソールから入力/状態検査を 行う. この DOS コールは CON デバイスでサポートされる. MD = 0 キーを入力する. MD = 1 キーコードを先読みする. MD = 2 シフトキーの状態を調べる. MD = 3 GROUP で指定したキーコードグループのキー状態を調べる. MD = 4 INS キーを ON/OFF する. MD = 0~2 move MD,-(sp) DOS _KEYCTRL addq.l #2,sp MD = 3 move GROUP,-(sp) move MD,-(sp) DOS _KEYCTRL addq.l #4,sp MD = 4 move INSMODE,-(sp) move MD,-(sp) DOS _KEYCTRL addq.l #4,sp ============================================================================== $ff25 _INTVCS ベクタの処理アドレスの設定 引数 INTNO.w ベクタ番号 JOBADR.l 指定ベクタの処理アドレス 返値 指定ベクタの前の処理アドレス ベクタ番号 INTNO で指定するベクタに JOBADR を設定し、以前の設定アドレ スを返す. INTNO = 0~$00ff 割り込み INTNO = $0100~$01ff IOCS コール INTNO = $ff00~$ffff DOS コール trap #10~14 及び _EXITVC のアドレスを変更した場合、PSP 内のワークも変 更される. また、_ERRJVC では更にアボート時の sr,ssp をこの DOS コール が実行された瞬間のものに変更する. _CTRLVC の場合は _ERRJVC の処理に加 えて CTRL-C によるアボート時の sr,ssp も変更する. pea (JOBADR) move INTNO,-(sp) DOS _INTVCS addq.l #6,sp ============================================================================== $ff26 _PSPSET プロセス管理ポインタの作成 引数 PSPADR.l プロセス管理ポインタのアドレス(メモリ管理ポインタ+16) 返値 常に 0 PSPADR で指定したアドレスに、プログラム終了時の様々な情報を作成する. プロセス管理ポインタ PSPADR はメモリ管理ポインタ+$10 のアドレスでなく てはならず、その大きさは 240 バイト. pea (PSPADR) DOS _PSPSET addq.l #4,sp ============================================================================== $ff27 _GETTIM2 時刻を得る(ロングワード) 返値 現在の時刻 %0000_0000_000t_tttt_00mm_mmmm_00ss_ssss bit 20~16 時(0~23 時) bit 13~ 8 分(0~59 分) bit 5~ 0 秒(0~59 秒) 現在の時刻を調べる. DOS _GETTIME との違いは、秒が 1 秒単位なので返値が ロングワードになっていること. ============================================================================== $ff28 _SETTIM2 時刻の設定(ロングワード) 引数 TIME.l 時刻(形式は DOS _GETTIM2 の返値と同じ) 返値 エラーコード 時刻を TIME の値に設定する. DOS _SETTIME との違いは、秒が 1 秒単位なの で TIME がロングワードになっていること. move.l TIME,-(sp) DOS _SETTIM2 addq.l #4,sp ============================================================================== $ff29 _NAMESTS ファイル名の展開 引数 FILE.l ファイル名のポインタ BUFFER.l バッファのポインタ 返値 エラーコード FILE で指定したファイルを、BUFFER で指定したバッファに展開する. バッファは 88 バイトで、内容は以下の通り. offset size 0 1.b NAMWLD 0:ワイルドカードなし -1:ファイル指定なし (ワイルドカードの文字数) 1 1.b NAMDRV ドライブ番号(A=0,B=1,…,Z=25) 2 65.b NAMPTH パス('\'+あればサブディレクトリ名+'\') 67 8.b NAMNM1 ファイル名(先頭 8 文字) 75 3.b NAMEXT 拡張子 78 10.b NAMNM2 ファイル名(残りの 10 文字) pea (BUFFER) pea (FILE) DOS _NAMESTS addq.l #8,sp ============================================================================== $ff2a _GETDATE 日付を得る 返値 現在の日付 %0000_0000_0000_0www_yyyy_yyym_mmmd_dddd bit 18~16 曜日(0~6) bit 15~ 9 年-1980(0~99) bit 8~ 5 月(1~12 月) bit 4~ 0 日(1~31 日) 現在の日付を調べる. 曜日は 0~6 が日~土曜日を表し、年は西暦から 1980 を引いた値が 0~99 まで設定されている. ============================================================================== $ff2b _SETDATE 日付の設定 引数 DATE.w 日付 返値 エラーコード DATE の値を日付に設定する. DATE の形式は以下の通りで、年は西暦から 1980 を引いた値を 0~99 まで設定する. %yyyy_yyym_mmmd_dddd bit 15~ 9 年-1980(0~99) bit 8~ 5 月(1~12 月) bit 4~ 0 日(1~31 日) move DATE,-(sp) DOS _SETDATE addq.l #2,sp ============================================================================== $ff2c _GETTIME 時刻を得る 返値 現在の時刻(下位ワードのみ意味がある) %tttt_tmmm_mmms_ssss bit 15~11 時 (0~23 時) bit 10~ 5 分 (0~59 分) bit 4~ 0 秒/2(0~29 秒) 現在の時刻を調べる. 返値のうち秒は 2 秒単位で表し、実際の秒を 2 で割っ た値になる. DOS _GETTIM2 との違いは、秒が 2 秒単位なので返値がワードに なっていること. ============================================================================== $ff2d _SETTIME 時刻の設定 引数 TIME.w 時刻(形式は DOS _GETTIME の返値と同じ) 返値 エラーコード 時刻を TIME の値に設定する. このうち秒は 2 秒単位で表し、実際の秒を 2 で割った値になる. したがって、設定する値は 0~29 まで. DOS SETTIM2 と の違いは、秒が 2 秒単位なので TIME がワードになっていること. move TIME,-(sp) DOS _SETTIME addq.l #2,sp ============================================================================== $ff2e _VERIFY ベリファイフラグの設定 引数 FLG.w ベリファイフラグ(0:ベリファイしない、1:する) ベリファイフラグを設定する. move FLG,-(sp) DOS _VERIFY addq.l #2,sp ============================================================================== $ff2f _DUP0 ファイルハンドルの強制複写 引数 FILENO.w ファイルハンドル NEWNO.w 複写先のファイルハンドル 返値 NEWNO の前の値(負数ならエラーコード) ファイルハンドル FILENO を、2 個目の ファイルハンドル NEWNO に強制複写 する. これにより 1 個のファイルに 2 個のファイルハンドルが与えられ、同 一ファイルの操作を複数のファイルハンドルで行うことが出来るようになる. クローズすると元の番号に戻る. 指定できる NEWNO は 0~4 で、それ以上は DUP2 で指定する. move NEWNO,-(sp) move FILENO,-(sp) DOS _DUP0 addq.l #4,sp ============================================================================== $ff30 _VERNUM OS のバージョン検査 返値 バージョン番号 bit 31~24 '6'($36) bit 23~16 '8'($38) bit 15~ 8 バージョン番号の整数部 bit 7~ 0 バージョン番号の小数部 Human68k のバージョン番号を調べる. ============================================================================== $ff31 _KEEPPR 常駐終了 引数 PRGLEN.l 常駐バイト数 CODE.w 終了コード PRGLEN バイトを残して、プロセスを終了する(PSP 部分を含まない). 指定さ れたバイト数が確保できない場合は現在のメモリブロックの大きさのまま常駐 終了する. オープンしたファイルハンドルはクローズされる. 実際にメモリに常駐するサイズは、指定した常駐バイト数+メモリ管理ポイン タ 16 バイト+プロセス管理ポインタ 240 バイトとなる. move CODE,-(sp) move.l PRGLEN,-(sp) DOS _KEEPPR ============================================================================== $ff32 _GETDPB ドライブパラメータブロックの複写 引数 DRIVE.w ドライブ番号(0:カレント 1:A 2:B … 26:Z) DPBPTR.l バッファのポインタ 返値 エラーコード DRIVE で指定したドライブのドライブパラメータブロックを、Human68k version 1 互換の形式に変換して、DPBPTR で指定した 94 バイトのバッファ に複写する. Human68k version 1 互換形式 DPB の内容は以下の通り. offset size 0 1.b ドライブ番号(0:A 1:B … 25:Z) 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 使用フラグ(-1 なら書き込みが行われた) 24 1.l 次の DPB へのポインタ(-1 で末尾) 28 1.w カレントディレクトリのクラスタ番号(0 はルートを表す) 30 64.b カレントディレクトリの文字バッファ pea (DPBPTR) move DRIVE,-(sp) DOS _GETDPB addq.l #6,sp ============================================================================== $ff33 _BREAKCK ブレークチェックの設定 引数 FLG.w 機能及びモード(FUNC.b×256+MODE.b) FLG = -1 の場合は FUNC = 0 と同じ. 返値 設定状況(MODE の 0~2 と同じ) フラグ FLG の値に従って、ブレークチェックを設定する. 返値は今設定した値そのものであるので注意すること. FUNC = 0 DOS コールでのブレークチェックを設定する. MODE = 0 指定の DOS コールのみ検査する. 1 全ての DOS コールで検査する. 2 全ての DOS コールで検査しない. -1 設定状況を調べる. 指定の DOS コールは、ブレークチェックをする以下のコールを指す. $ff01 GETCHAR $ff02 PUTCHAR $ff03 COMINP $ff04 COMOUT $ff05 PRNOUT $ff08 GETC $ff09 PRINT $ff0a GETS $ff0b KEYSNS $ff0c KFLUSH $ff0d FFLUSH $ff1e FPUTS FUNC = 1 CTRL+C のモードを設定する. FUNC = 2 CTRL+N のモードを設定する. FUNC = 3 CTRL+P のモードを設定する. FUNC = 4 CTRL+Q のモードを設定する. FUNC = 5 CTRL+S のモードを設定する. それぞれ MODE の内容は以下の通り. MODE = 0 無効 1 有効 -1 設定状況を調べる. move FLG,-(sp) DOS _BREAKCK addq.l #2,sp ============================================================================== $ff34 _DRVXCHG ドライブの入れ替え 引数 OLD.w ドライブ番号(0:カレント 1:A 2:B … 26:Z) NEW.w ドライブ番号(〃) 返値 OLD = -1、NEW = -1 カレントドライブの新しいドライブ番号(0:A 1:B … 25:Z) その他 エラーコード OLD で指定したドライブと、NEW で指定したドライブを入れ替える. OLD、NEW ともに -1 を指定すると、全てのドライブ変更を元に戻す. move NEW,-(sp) move OLD,-(sp) DOS _DRVXCHG addq.l #4,sp ============================================================================== $ff35 _INTVCG ベクタの処理アドレスを得る 引数 INTNO.w ベクタ番号 返値 指定ベクタの処理アドレス ベクタ番号 INTNO で指定したベクタの処理アドレスを調べる. INTNO = 0~$00ff 割り込み INTNO = $0100~$01ff IOCS コール INTNO = $ff00~$ffff DOS コール move INTNO,-(sp) DOS _INTVCG addq.l #2,sp ============================================================================== $ff36 _DSKFRE ディスクの残り容量を得る 引数 DRIVE.w ドライブ番号 BUFFER.l バッファのポインタ 返値 使用可能なバイト数(最大 2GB、負数ならエラーコード) DRIVE で指定したドライブのディスクの残り容量を調べ、結果を BUFFER で指 定した 8 バイトのバッファに書き込む. offset size 0 1.w 使用可能なクラスタ数 2 1.w 総クラスタ数 4 1.w 1 クラスタ当りのセクタ数 6 1.w 1 セクタ当りのバイト数 pea (BUFFER) move DRIVE,-(sp) DOS _DSKFRE addq.l #6,sp ============================================================================== $ff37 _NAMECK ファイル名の展開 引数 FILE.l ファイル名のポインタ BUFFER.l バッファのポインタ 返値 d0.l = $ff ファイル指定なし d0.l = 0 ワイルドカード指定なし d0.l < 0 エラーコード(BUFFER の内容は意味がない) d0.l = その他 ワイルドカード指定あり(d0.l はワイルドカードの文字数) FILE で指定したファイルを、BUFFER で指定した 91 バイトのバッファに展開 する. offset size 0 1+1.b ドライブ名+':' 2 64+1.b パス名+0 67 18+1.b ファイル名+0 86 1+3+1.b 拡張子('.'+拡張子+0) pea (BUFFER) pea (FILE) DOS _NAMECK addq.l #8,sp ============================================================================== $ff39 _MKDIR サブディレクトリの作成 引数 FILE.l ディレクトリ名のポインタ 返値 エラーコード FILE で指定したサブディレクトリを作成する. 成功した場合の返値は通常 0 であるが、特殊デバイスドライバが対象の時は 正の整数が返る場合がある. pea (FILE) DOS _MKDIR addq.l #4,sp ============================================================================== $ff3a _RMDIR サブディレクトリの削除 引数 FILE.l ディレクトリ名のポインタ 返値 エラーコード FILE で指定したサブディレクトリを削除する. 指定するディレクトリは空で なくてはならず、またカレントディレクトリ・ルートディレクトリやシステム 属性・読み込み専用属性のディレクトリは削除出来ない. 成功した場合の返値は通常 0 であるが、特殊デバイスドライバが対象の時は 正の整数が返る場合がある. pea (FILE) DOS _RMDIR addq.l #4,sp ============================================================================== $ff3b _CHDIR カレントディレクトリの変更 引数 FILE.l ディレクトリ名のポインタ 返値 エラーコード カレントディレクトリを FILE で指定したディレクトリに変更する. 成功した場合の返値は通常 0 であるが、特殊デバイスドライバが対象の時は 正の整数が返る場合がある. Human68k version 3.02 では正常に動作しない(長さが 22 文字のサブディレ クトリへの変更が失敗する). pea (FILE) DOS _CHDIR addq.l #4,sp ============================================================================== $ff3c _CREATE ファイルの作成 引数 FILE.l ファイル名のポインタ ATR.w ファイル属性(%XLAD_VSHR) 返値 作成したファイルのファイルハンドル(負数ならエラーコード) FILE で指定したファイルを ATR で指定した属性で作成する. ATR が 0 の場 合はアーカイブ属性と見なされる. 同名ファイルが既に存在していた場合はそのファイルの内容は失われるが、そ れがディレクトリかボリュームラベル、またはシステム属性・読み込み専用属 性のファイルであった場合には削除せずエラーになる. ATR の最上位ビットを立てると、同名ファイルが存在しても削除せずに新しい ファイルを作成する. move ATR,-(sp) pea (FILE) DOS _CREATE addq.l #6,sp ============================================================================== $ff3d _OPEN ファイルのオープン 引数 FILE.l ファイル名のポインタ MODE.w アクセスモード 返値 オープンしたファイルのファイルハンドル(負数ならエラーコード) FILE で指定したファイルを MODE で指定したアクセスモードでオープンする. システム属性・読み込み専用属性のファイルを書き込み・読み書きモードでオ ープンする事は出来ない. MODE の内容は以下の通り. bit 8 辞書アクセスモード %1 辞書用の特殊なファイルハンドルを使用する (ユーザーは使用禁止). %0 通常 bit 6~4 シェアリングモード %100 常に許可 %011 書き込みのみ許可 %010 読み込みのみ許可 %001 常に禁止 %000 互換モード bit 1~0 リード/ライトモード %10 読み込み/書き込みモード %01 書き込みモード %00 読み込みモード bit 6~4 で指定するシェアリングモードとは、複数のプロセスによるファイ ルの共有を規制するもので、複数のプロセスが並列に実行されている場合、同 一ファイルに対して複数のプロセスが同時に読み書きを行う恐れがあるので、 適切なシェアリングモードを指定して、ファイルアクセスの排他制御を行う必 要がある. move MODE,-(sp) pea (FILE) DOS _OPEN addq.l #6,sp ============================================================================== $ff3e _CLOSE ファイルのクローズ 引数 FILENO.w ファイルハンドル 返値 エラーコード FILENO で指定したファイルハンドルをクローズする. move FILENO,-(sp) DOS _CLOSE addq.l #2,sp ============================================================================== $ff3f _READ ファイルから読み込む 引数 FILENO.w ファイルハンドル BUFFER.l 読み込みバッファのポインタ LEN.l 読み込むバイト数 返値 実際に読み込んだバイト数(負数ならエラーコード) FILENO で指定したファイルハンドルから、LEN で指定するバイト数を BUFFER で指定するバッファに読み込む. 実行後、ファイルポインタは読み込んだバイ ト数だけ後方に移動する. LEN = 0 の場合は現在のファイルポインタ位置以降 を切り捨て、ファイルサイズを縮小する. 返値が指定したバイト数より小さければ、ファイルを終わりまで読み込んだこ とを意味する. move.l LEN,-(sp) pea (BUFFER) move FILENO,-(sp) DOS _READ lea (10,sp),sp ============================================================================== $ff40 _WRITE ファイルへ書き込む 引数 FILENO.w ファイルハンドル BUFFER.l 書き込みバッファのポインタ LEN.l 書き込むバイト数 返値 実際に書き込んだバイト数(負数ならエラーコード) FILENO で指定したファイルハンドルに、LEN で指定するバイト数を BUFFER で指定するバッファから書き込む. 実行後、ファイルポインタは書き込んだバ イト数だけ後方に移動する. 返値が指定したバイト数より小さい時は、ディスクの空き容量が足りなくなっ たことを意味する. move.l LEN,-(sp) pea (BUFFER) move FILENO,-(sp) DOS _WRITE lea (10,sp),sp ============================================================================== $ff41 _DELETE ファイルの削除 引数 FILE.l ファイル名のポインタ 返値 エラーコード FILE で指定したファイルを削除する. ワイルドカードの指定や、ディレクト リかボリュームラベル、またはシステム属性・読み込み専用属性のファイルの 削除は出来ない. pea (FILE) DOS _DELETE addq.l #4,sp ============================================================================== $ff42 _SEEK ファイルポインタの移動 引数 FILENO.w ファイルハンドル OFFSET.l オフセット MODE.w 移動モード 返値 先頭からのオフセット(負数ならエラーコード) FILENO で指定したファイルのポインタを、MODE で指定した位置から OFFSET で指定したバイト数だけ移動する. ポインタをファイル終端以降若しくは先頭 より前方に移動するとエラーになる. キャラクタデバイスはシーク出来ず、現在位置は常に 0 が返る. MODE = 0 先頭 MODE = 1 現在位置(オフセットに負数を指定することで前方にも移動可能) MODE = 2 終端(オフセットは 0 若しくは負数のみ指定可能) move MODE,-(sp) move.l OFFSET,-(sp) move FILENO,-(sp) DOS _SEEK addq.l #8,sp ============================================================================== $ff43 _CHMOD ファイル属性の変更 引数 FILE.l ファイル名のポインタ ATR.w ファイル属性(%XLAD_VSHR) 返値 指定したファイルの属性(負数ならエラーコード) FILE で指定したファイルを ATR で指定した属性に変更する. ATR = -1 の時、ファイルの属性を調べる. move ATR,-(sp) pea (FILE) DOS _CHMOD addq.l #6,sp ============================================================================== $ff44 _IOCTRL デバイスドライバの ioctrl による直接入出力 引数 MD.w コントロールモード(この値によって引数が異なる) FILENO.w ファイルハンドル DT.w 装置情報 DRIVE.w 装置番号 BUFFER.l バッファのポインタ LEN.l 読み書きバイト数 COUNT.w リトライ回数 TIME.w リトライ待機時間 F_CODE.w ファンクション番号 返値 MD = 0,1,10 装置情報 (下位バイトは FCB、上位バイトはデバイスヘッダから収得される) bit 15 0:ブロックデバイス 1:キャラクタデバイス bit 14 0:IOCTRL 不可 1:可能 bit 13 0:ローカル 1:リモート bit 7 0:ブロックデバイス 1:キャラクタデバイス bit 6 0:特殊 IOCTRL 不可 1:可能 (キャラクタデバイスの場合) bit 5 0:COOKED モード 1:RAW モード bit 3 1:CLOCK デバイス bit 2 1: NUL 〃 bit 1 1:標準出力(CON)デバイス bit 0 1:標準入力(CON)〃 (ブロックデバイスの場合) bit 5 0:ローカル 1:リモート bit 4~0 ドライブ番号 MD = 9 装置情報 bit 15 0:ブロックデバイス 1:キャラクタデバイス bit 14 0:IOCTRL 不可 1:可能 bit 13 0:ローカル 1:リモート bit 5 0:ローカル 1:リモート (bit 13 と同じ) MD = 2~5 実際に読み書きしたバイト数 MD = 6 入力ステータス(0:不可 -1:可) MD = 7 出力ステータス(0:不可 -1:可) MD = 11,12,13 デバイスドライバによる. モード MD の値に従って、デバイスドライバに直接入出力する. ただし、デバ イスヘッダの IOCTRL ビットが 0 の場合は、入出力出来ない. MD = 0 FILENO で指定したファイルハンドルの装置情報を調べる. MD = 1 FILENO で指定したファイルハンドルに装置情報を設定する. 変更できるのはキャラクタデバイスの COOKED/RAW モードの属性だけ. MD = 2 FILENO で指定したファイルハンドルから、BUFFER で指定したバッフ ァに LEN で指定したバイト数だけ読み込む. MD = 3 FILENO で指定したファイルハンドルに、BUFFER で指定したバッファ から LEN で指定したバイト数だけ書き込む. MD = 4 DRIVE で指定したドライブから、BUFFER で指定したバッファに LEN で指定したバイト数だけ読み込む. リモートドライブからの入力は常にエラーが返る. MD = 5 DRIVE で指定したドライブに、BUFFER で指定したバッファから LEN で指定したバイト数だけ書き込む. リモートドライブへの出力は常にエラーが返る. MD = 6 FILENO で指定したファイルハンドルの入力ステータスを調べる. リモートファイルの検査は常に失敗する. MD = 7 FILENO で指定したファイルハンドルの出力ステータスを調べる. リモートファイルの検査は常に失敗する. MD = 9 DRIVE で指定したドライブがローカルかリモートかを調べる. 実際には装置情報を調べているだけである. MD = 10 FILE で指定したドライブがローカルかリモートかを調べる. 実際には装置情報を調べているだけである. MD = 11 指定した COUNT 及び TIME をリトライ数/待機時間に設定する. MD = 12 ファイルハンドルによる特殊コントロールを行なう. Human68k version 3.02 では正常に動作しない(キャラクタデバイス に対して特殊 ioctrl が出来るかどうかの検査に失敗する). MD = 13 ドライブによる特殊コントロールを行なう. 特殊 ioctrl に対応しているデバイスドライバは現在確認して いるものでは DISK2HD 及び susie.x がある. MD = 0,6,7,10 move FILENO,-(sp) move MD,-(sp) DOS IOCTRL addq.l #4,sp MD = 1 move DT,-(sp) move FILENO,-(sp) move MD,-(sp) DOS IOCTRL addq.l #6,sp MD = 2,3 move.l LEN,-(sp) pea (BUFFER) move FILENO,-(sp) move MD,-(sp) DOS IOCTRL lea (12,sp),sp MD = 4,5 move.l LEN,-(sp) pea (BUFFER) move DRIVE,-(sp) move MD,-(sp) DOS IOCTRL lea (12,sp),sp MD = 9 move DRIVE,-(sp) move MD,-(sp) DOS IOCTRL addq.l #4,sp MD = 11 move TIME,-(sp) move COUNT,-(sp) move MD,-(sp) DOS IOCTRL addq.l #6,sp MD = 12,13 pea (BUFFER) move F_CODE,-(sp) move FILENO,-(sp) move MD,-(sp) DOS IOCTRL lea (10,sp),sp ============================================================================== $ff45 _DUP ファイルハンドルの複写 引数 FILENO.w ファイルハンドル 返値 新しいファイルハンドル(負数ならエラーコード) ファイルハンドル FILENO を複写して、2 個目のファイルハンドルを作る. 同一ファイルのファイルハンドルは、同じファイルポインタを使用するのでど ちらのファイルハンドルを使ってもファイルの操作が出来るようになる. move FILENO,-(sp) DOS _DUP addq.l #2,sp ============================================================================== $ff46 _DUP2 ファイルハンドルの強制複写 引数 FILENO.w ファイルハンドル NEWNO.w 複写先のファイルハンドル 返値 エラーコード ファイルハンドル FILENO を 2 個目のファイルハンドル NEWNO に強制的に複 写する. NEWNO で指定したファイルハンドルが既にオープンされている場合は、自動的 にクローズしてから複写する. move NEWNO,-(sp) move FILENO,-(sp) DOS _DUP2 addq.l #4,sp ============================================================================== $ff47 _CURDIR カレントディレクトリを得る 引数 DRIVE.w ドライブ番号(0:カレント 1:A 2:B … 26:Z) BUFFER.l バッファのポインタ 返値 エラーコード DRIVE で指定したドライブのカレントディレクトリを、BUFFER で指定した 65 バイトのバッファに書き込む. ドライブ名・ルートディレクトリを表す '\' 及び終端の '\' は付かない. pea (BUFFER) move DRIVE,-(sp) DOS _CURDIR addq.l #6,sp ============================================================================== $ff48 _MALLOC メモリの確保 引数 LEN.l 確保するバイト数 返値 確保したメモリブロックのポインタ(MSP+$10) d0.l = $81?????? 指定した量は確保不可能 ($?????? は確保可能なバイト数). d0.l = $8200000? 完全に確保不可能($? は不定). LEN で指定したバイト数のメモリを確保する. LEN が $1000000 以上の場合は 必ずエラーになり、確保可能な最大バイト数を調べる事が出来る. move.l LEN,-(sp) DOS _MALLOC addq.l #4,sp ============================================================================== $ff49 _MFREE メモリブロックの解放 引数 MEMPTR.l メモリブロックのポインタ 返値 エラーコード MEMPTR で指定したメモリブロックを解放する. MEMPTR = 0 の時、自分が確保したメモリを全て解放する. pea (MEMPTR) DOS _MFREE addq.l #4,sp ============================================================================== $ff4a _SETBLOCK メモリブロックの変更 引数 MEMPTR.l メモリブロックのポインタ LEN.l 変更するバイト数 返値 エラーコード d0.l = $81?????? 変更不可能($?????? は変更可能なバイト数). d0.l = $8200000? 完全に変更不可能($? は不定). MEMPTR で指定したメモリブロックを、LEN で指定した大きさに変更する. LEN が $1000000 以上の場合は必ずエラーになり、変更可能な最大バイト数を 調べる事が出来る. move.l LEN,-(sp) pea (MEMPTR) DOS _SETBLOCK addq.l #8,sp ============================================================================== $ff4b _EXEC プログラムのロード/実行 引数 MD.w モジュール番号及びモード(MODULE.b×256+MODE.w) FILE.l ファイル名のポインタ CMDLINE.l コマンドラインのポインタ LOADADR.l ロードアドレス EXECADR.l 実行アドレス FILE2.l オーバーレイ X ファイル中のファイル名 ENVPTR.l 環境のポインタ LIMIT.l リミットアドレス TYPE.b ファイルタイプ(FILE の上位 8bit) 返値 MODE = 0,4 プロセス終了コード(負数ならエラーコード) プロセスが終了した時 d1-d7/a1-a6 は不定. MODE = 1 d0.l プログラムの実行アドレス(負数ならエラーコード) a0.l メモリ管理ポインタ a1.l プログラムの終わり a2.l コマンドライン a3.l 環境のポインタ a4.l 実行アドレス MODE = 2 エラーコード MODE = 3 プログラムの長さ(負数ならエラーコード) MODE = 5 モジュール番号×256(負数ならエラーコード) モード MODE の値に従って FILE で指定したファイルをロード/実行する. MODE = 0 CMDLINE でコマンドラインを、ENVPTR で環境を指定して、FILE で指 定したファイルをロードし、実行する. MODE = 1 CMDLINE でコマンドラインを、ENVPTR で環境を指定して、FILE で指 定したファイルをロードする. 正常終了した場合は必ず MODE = 4 を 実行すること. MODE = 2 ENVPTR で指定した環境から path を検索して、FILE で指定したコマ ンド行をフルパスのファイル名とコマンドラインに分け、FILE と CMDLINE の各ポインタに設定する. ファイル名バッファ FILE は 90 バイト以上、コマンドラインバッフ ァ CMDLINE は 256 バイト以上必要. MODE = 3 LOADADR でロードアドレスを、LIMIT でリミットアドレスを指定して、 FILE で指定したファイルをロードする. MODE = 4 EXECADR で指定したアドレスからプログラムを実行する. MD = 1 でロードした後、実行する時に使用する. MODE = 5 FILE で指定したオーバーレイ X ファイル中の、FILE2 で指定したフ ァイルのモジュール番号を調べる. バインドリスト先頭からのオフセットが $fffff00 より大きいファイ ルは、オフセット値をビット反転した数をモジュール番号として返す. ただし、このようなオフセット値が負数のファイルはロード出来ない. Human68k version 3.02 では正常に動作しない(FILE2 で指定したフ ァイル名の拡張子 1 バイト目を X に変更したファイル名で検索され る). MODE = 0~2 の時、ENVPTR に 0 を指定した場合は自分の環境を使用する. MODE = 0,1,3 の時、MODULE でオーバーレイ X ファイル中の各ファイルのモ ジュール番号(0~255)を指定することが可能. また、実行ファイル名の拡張子 が .X .Z .R のいずれでもない場合は、FILE の上位 8bit でファイルタイプ TYPE を指定し、それによってファイルの形式を指定する. TYPE = 1 .R TYPE = 2 .Z TYPE = 3 .X MD = 0,1 pea (ENVPTR) pea (CMDLINE) pea (FILE) move.b TYPE,(sp) move MD,-(sp) DOS _EXEC lea (14,sp),sp MD = 2 pea (ENVPTR) pea (CMDLINE) pea (FILE) move MD,-(sp) DOS _EXEC lea (14,sp),sp MD = 3 pea (LIMIT) pea (LOADADR) pea (FILE) move.b TYPE,(sp) move MD,-(sp) DOS _EXEC lea (14,sp),sp MD = 4 pea (EXECADR) move MD,-(sp) DOS _EXEC addq.l #6,sp MD = 5 pea (FILE2) pea (FILE) move MD,-(sp) DOS _EXEC lea (10,sp),sp ============================================================================== $ff4c _EXIT2 終了コードを指定して終了 引数 CODE.w 終了コード CODE で指定した終了コードでプログラムを終了する. オープンしたファイルハンドルはクローズされる. ============================================================================== $ff4d _WAIT プロセスの終了コードを得る 返値 終了コード 実行したプロセスの終了コードを調べる. DOS _EXEC(MODE = 0,4) の返値と同じ. ============================================================================== $ff4e _FILES ファイルを検索し、情報を得る(最初のファイル) 引数 BUFFER.l バッファのポインタ FILE.l ファイル名のポインタ ATR.w ファイル属性(%XLAD_VSHR) 返値 エラーコード ATR で指定した属性で、FILE で指定したファイル名にあてはまるファイルを 検索し、ファイル情報を BUFFER で指定した 53 バイトのバッファに書き込む. ファイル名にはワイルドカードが使用可能. 属性は 1 を指定したビットが 1 個でも一致すれば、そのファイルを返す. ファイル属性の上位バイトを 1 にすると、ファイル名若しくは拡張子がない 場合にワイルドカード '*' で補完する("" の検索は "*.*" になり、"foo" の 検索は "foo.*" として扱われる). バッファアドレスの最上位ビットを 1 にすると、通常の情報に加えて検索す るファイルのパス名をバッファの 53 バイト目からに書き込む. この場合のバ ッファは 141 バイト必要である. Human68k version 3.02 では正常に動作しない(DOS _DRVXCHGでドライブを交 換している場合は絶対ドライブ名で返る). offset size 0 1.b 検索する属性 ┐ 1 1.b 〃 ドライブ番号 │ 2 1.l 検索中のディレクトリのセクタ番号 │Human68k 内部で 6 1.w ディレクトリの残りセクタ数 │使用する. (ルートの場合のみ有効) │破壊すると 8 1.w ディレクトリ上のセクタ先頭からの │_NFILES 出来ない. オフセット(-1 の時該当ファイルなし) │ 10 8.b 検索するファイル名 │ 18 3.b 〃 拡張子 ┘ 21 1.b 属性 22 1.w 最終変更時刻 24 1.w 最終変更月日 26 1.l ファイルサイズ 30 23.b ファイル名(主ファイル名+'.'+拡張子+0) ただし、TwentyOne 常駐時には内部情報の一部が変更され、TwentyOne 内部の ファイル名バッファ EXBUF が不足した場合はエラーコード -8 を返す. offset size 0~9 10.b (標準と同じ) 10 1.l 拡張バッファのアドレス 14 6.b TwentyOne 拡張フラグ 'Twenty' 20 1.b エラーフラグ(0:OK 1:ERR) 21 32.b (標準と同じ) move ATR,-(sp) pea (FIL) pea (BUFFER) DOS _FILES lea (10,sp),sp ============================================================================== $ff4f _NFILES 次のファイルを検索し、情報を得る 引数 BUFFER.l バッファのポインタ 返値 エラーコード _FILES で設定されたファイル情報バッファ BUFFER を使用し、次のファイル を検索してファイル情報を再度書き込む. BUFFER の内容は _FILES と同じ. pea (BUFFER) DOS _NFILES addq.l #4,sp ============================================================================== $ff80 _SETPDB 管理プロセスを移す 引数 PDBADR.l プロセス管理ポインタ 返値 以前のプロセス管理ポインタ PDBADR で指定したプロセスに管理を移す. PDBADR は _GETPDB で得られたアドレスでなければならない. pea (PDBADR) DOS _SETPDB) addq.l #4,sp ============================================================================== $ff81 _GETPDB 現在のプロセス情報を得る 返値 現在のプロセス管理ポインタ 現在のプロセスを表すプロセス管理ポインタを収得する. ============================================================================== $ff82 _SETENV 環境変数の設定 引数 ENVNAME.l 環境変数名のポインタ ENVPTR.l 環境のポインタ ENVVAL.l 変数の値のポインタ 返値 エラーコード ENVPTR で指定した環境の ENVNAME で指定した変数に、ENVVAL で指定した最 大 255 バイトの環境変数を設定する. ただし、ENVVAL = 0 及び ENVVAL に空 文字列を指定した場合は、ENVNAME で指定した変数を消去する. ENVPTR に 0 を指定すると自分の環境を使用する. Human68k version 3.02 では正常に動作しない(環境変数の値が 255 バイトを 超えている時に暴走する). pea (ENVVAL) pea (ENVPTR) pea (ENVNAME) DOS _SETENV lea (12,sp),sp ============================================================================== $ff83 _GETENV 環境変数の内容を得る 引数 ENVNAME.l 環境変数名のポインタ ENVPTR.l 環境のポインタ BUFFER.l バッファのポインタ 返値 エラーコード ENVPTR で指定した環境の、ENVNAME で指定した環境変数の内容を BUFFER で 指定した 256 バイトのバッファに書き込む. ENVPTR に 0 を指定すると自分の環境を使用する. pea (BUFFER) pea (ENVPTR) pea (ENVNAME) DOS _GETENV lea (12,sp),sp ============================================================================== $ff84 _VERIFYG ベリファイフラグを得る 返値 設定状況(0:ベリファイしない 1:ベリファイする) ベリファイフラグを調べる. ============================================================================== $ff85 _COMMON common 領域の制御 引数 MD.w コントロールモード NAME.l common領域名のポインタ POS.l ポジション(common領域の先頭からのバイト数) BUFFER.l バッファのポインタ ID_PSP.l プロセス ID LEN.l バイト長 返値 MD = 0 common領域のバイト数(負数ならエラーコード) MD = 1,2 実際に読み書きしたバイト数(負数ならエラーコード) MD = 3~5 エラーコード モード MD の値に従って common 領域を制御する. この DOS コールによりプロセス間通信が簡単に実現出来る. MD = 0 NAME で指定したcommon領域が存在するか調べ、存在した場合は領域 の大きさを返す. MD = 1 NAME で指定した common 領域の、POS で指定した位置から LEN で指 定したバイト数を、BUFFER で指定したバッファに読み込む. MD = 2 NAME で指定した common 領域に、POS で指定した位置から LEN で指 定したバイト数だけ、BUFFER で指定したバッファから書き込む. NAME で指定した common 領域が存在しない場合は作成する. LEN に 0 を指定すると切り詰める. MD = 3 NAME で指定した common 領域の、POS で指定した位置から LEN で指 定したバイト数を、ID_PSP でプロセスを指定してロックする. ID_PSP で指定されたプロセス以外のアクセスが禁止される. MD = 4 NAME で指定した common 領域の、POS で指定した位置から LEN で指 定したバイト数を、ID_PSP でプロセスを指定してロックを解除する. ID_PSP で指定されたプロセス以外のアクセスが許可される. MD = 5 NAME で指定したcommon領域を削除する. MD = 0,5 pea (NAME) move MD,-(sp) DOS _COMMON addq.l #6,sp MD = 1,2 move.l LEN,-(sp) pea (BUFFER) move.l POS,-(sp) pea (NAME) move MD,-(sp) DOS _COMMON lea (18,sp),sp MD = 3,4 move.l LEN,-(sp) move.l ID_PSP,-(sp) move.l POS,-(sp) pea (NAME) move MD,-(sp) DOS _COMMON lea (18,sp),sp ============================================================================== $ff86 _RENAME ファイル名の変更/移動 引数 OLD.l ファイル名のポインタ NEW.l 新ファイル名のポインタ 返値 エラーコード OLD で指定したファイルを、NEW で指定したファイル名に変更する. システ ム属性・読み込み専用属性のファイルはリネーム出来ない. OLD と NEW のパスが異なる場合はファイルを移動するが、異なるドライブ間 の移動や、ディレクトリやボリュームラベル、隠し属性・読み込み専用属性 のファイルの移動は出来ない. Human68k version 3.02 では正常に動作しない(新旧両方のファイルが存在し、 かつ双方の先頭 FAT 番号及びファイルサイズの上位ワードが等しい場合に、 新ファイル名に変名される). pea (NEW) pea (OLD) DOS _RENAME addq.l #8,sp ============================================================================== $ff87 _FILEDATE ファイルの日付/時間の読み出し/設定 引数 FILENO.w ファイルハンドル DATETIME.l 日付及び時間 返値 DATETIME = 0 ファイルの日時 DATETIME = その他 上位ワードが $ffff の時のみエラーコード このコールでは負数でもエラーコードではない場合がある. FILENO で指定したファイルハンドルの日付と時間の収得/設定をする. DATETIME = 0 の時は収得、それ以外は設定をします. %yyyy_yyym_mmmd_dddd_tttt_tfff_fffs_ssss bit 31~25 年-1980(0~99) bit 24~21 月 (1~12 月) bit 20~16 日 (1~31 日) bit 15~11 時 (0~23 時) bit 10~ 5 分 (0~59 分) bit 4~ 0 秒/2(0~29 秒) 秒は 2 秒単位で表し、実際の秒を 2 で割った値を設定する. move.l DATETIME,-(sp) move FILENO,-(sp) DOS _FILEDATE addq.l #6,sp ============================================================================== $ff88 _MALLOC2 指定の方法によるメモリの確保 引数 MD.w コントロールモード LEN.l 確保するバイト数 PAIR.l 管理するプロセスのプロセス管理ポインタ 返値 確保したメモリブロックのポインタ d0.l = $81?????? 指定された量は確保不可能 ($?????? は確保可能なバイト数). d0.l = $8200000? 完全に確保不可能($? は不定). モード MD で指定した検索方法で、LEN で指定したバイト数のメモリを確保す る. LEN が $1000000 以上の場合は必ずエラーになり、確保可能な最大バイト 数を調べる事が出来る. MD = 0 下位から検索 MD = 1 必要最小ブロックから検索 MD = 2 上位から検索 ただし、MD の最上位ビットが 1 の場合、確保したメモリブロックの親プロセ スのプロセス管理ポインタを呼び出し側が指定できる. その場合、引数として 設定するプロセス管理ポインタのアドレスを渡すこと. [通常] move.l LEN,-(sp) move MD,-(sp) DOS _MALLOC2 addq.l #6,sp [指定モード] pea (PAIR) move.l LEN,-(sp) move MD,-(sp) DOS _MALLOC2 lea (10,sp),sp ============================================================================== $ff8a _MAKETMP テンポラリファイルの作成 引数 FILE.l ファイル名のポインタ ATR.w ファイル属性(%XLAD_VSHR) 返値 作成したファイルのファイルハンドル(負数ならエラーコード) FILE で指定したテンポラリファイルを ATR で指定した属性で作成する. ファイル名には '?' を含めることができ、作成時に数字に置き換えられて存 在しないファイル名になるまで加算して検索される. 数字を指定した場合はそ の数字から検索される. FILE で指定したファイル名はこの DOS コールにより書き換えられるので注意 すること. move ATR,-(sp) pea (FILE) DOS _MAKETMP addq.l #6,sp ============================================================================== $ff8b _NEWFILE ファイルの作成 引数 FILE.l ファイル名のポインタ ATR.w ファイル属性(%XLAD_VSHR) 返値 作成したファイルのファイルハンドル(負数ならエラーコード) d0.l = -80 指定したファイルは既に存在している FILE で指定したファイルを ATR で指定した属性で作成する. ATR が 0 の 場合はアーカイブ属性と見なされる. 指定したファイルが既に存在している場合はエラー(-80)になる. move ATR,-(sp) pea (FILE) DOS _NEWFILE addq.l #6,sp ============================================================================== $ff8c _LOCK ファイルのロック 引数 MD.w コントロールモード FILENO.w ファイルハンドル OFFSET.l ファイル先頭からのオフセット LEN.l ロック/ロック解除するバイト数 返値 エラーコード モード MD の値に従って、FILENO で指定したファイルのに対するアクセスの ロック/ロック解除を行なう. ファイルのロックとは、ファイルアクセスの排他制御で、他のプロセスからの ファイルアクセスを禁止することである. MD = 0 OFFSET で指定した位置から LEN で指定したバイト数だけロックする. MD = 1 OFFSET で指定した位置から LEN で指定したバイト数だけロックを解 除する. move.l LEN,-(sp) move.l OFFSET,-(sp) move FILENO,-(sp) move MD,-(sp) DOS _LOCK lea (12,sp),sp ============================================================================== $ff8f _ASSIGN 仮想ドライブ/ディレクトリの割り当ての収得/設定/解除 引数 MD.w コントロールモード BUFFER1.l 仮想ドライブ・仮想ディレクトリのポインタ BUFFER2.l 実ドライブ・実ディレクトリのポインタ MODE.w 割り当てモード 返値 MD = 0 割り当てモード(負数ならエラーコード) d0.l = $40 割り当てが存在しない d0.l = $50 仮想ドライブの割り当て d0.l = $60 仮想ディレクトリの割り当て MD = 1,4 エラーコード モード MD で指定した値に従って、仮想ドライブ・仮想ディレクトリの割り当 ての収得/設定/解除を行なう. Human68k version 3.02 では正常に動作しない(補完モードで _FILES してい る為、指定していないディレクトリへ割り当てる). MD = 0 BUFFER1 で指定したドライブの割り当てを収得し、BUFFER2 に書き込む. MD = 1 割り当てモード MODE で指定した値に従って、BUFFER1 で指定した ドライブに BUFFER2で指定したディレクトリを割り当てる. MODE = $50(仮想ドライブ) BUFFER1 のドライブに BUFFER2 のディレクトリを割り当てる. MODE = $60(仮想ディレクトリ) BUFFER2 のディレクトリに BUFFER1 のドライブを割り当てる. MD = 4 BUFFER1 で指定したドライブの割り当てを解除する. MD = 0 pea (BUFFER2) pea (BUFFER1) move MD,-(sp) DOS _ASSIGN lea (10,sp),sp MD = 1 move MODE,-(sp) pea (BUFFER2) pea (BUFFER1) move MD,-(sp) DOS _ASSIGN lea (12,sp),sp MD = 4 pea (BUFFER1) move MD,-(sp) DOS _ASSIGN addq.l #6,sp ============================================================================== $ffaa (未公開) FFLUSH モードの設定(未公開) 引数 MODE.w モード MODE = 0 無効 1 有効 -1 収得のみ 返値 変更前のモード Human68k version 3 で新設された未公開コール. _FFLUSH の実行モードを設定/収得する. ============================================================================== $ffab _OS_PATCH OS 内部処理切り換え(未公開) 引数 MODE.w モード及び機能番号(MD.b×256+ID.b) ADR.l アドレス 返値 MD = 0 変更前の分岐命令表のアドレス MD = その他 或は ADR = 0 エラーコード ID = 1 FASTIO.X ID = 2 FASTSEEK.X ID = 3 FASTOPEN.X ID = 4 TwentyOne.x Human68k version 3 で新設された未公開コール. ID で指定した OS の機能を初期化及びパッチして、分岐命令表を ADR で指定 されたアドレスに変更する. MD を 0 以外にするか、アドレスに 0 を指定すると、パッチは行なわずにリ セット処理だけを実行する. また、アドレスに -1 を指定すると、パッチは行 なわずに初期化処理だけを実行する. 分岐命令表は、各機能の処理アドレスに分岐する jmp abs.l 命令を 18 個(ID = 3)または 20 個(それ以外)並べたもの. (注意)この項目の内容はコール名以外は全て独自解析による. pea (ADR) move #MODE,-(sp) DOS _OS_PATCH addq.l #6,sp ============================================================================== $ffac _GETFCB FCB のポインタを得る(未公開) 引数 FILENO.w ファイルハンドル 返値 FCB のポインタ(負数ならエラーコードです) FILENO で指定したファイルの FCB のポインタを返す. FCB の大きさは 96 バイトで、内容は以下の通り. offset size $00 1.b この FCB に対応しているファイルハンドルの数 $01 1.b デバイス情報(bit 7=0 の時は bit 4~0 でドライブ名を保持する) bit 7 0:ブロックデバイス 1:キャラクタデバイス bit 6 更新フラグ bit 5 0:Local 1:Remote ブロックデバイスの場合 bit 5 0:COOKED 1:RAW ┐ bit 3 CLOCK デバイス│ bit 2 NUL 〃 │キャラクタデバイスの場合 bit 1 標準出力〃 │ bit 0 標準入力〃 ┘ $02 1.l ブロックデバイス : DPB のアドレス キャラクタデバイス : デバイスドライバへのポインタ $06 1.l ファイルポインタ $0a 1.l 排他制御情報へのポインタ $0e 1.b アクセスモード $0f 1.b ディレクトリ上の位置(セクタ先頭からの個数:0~31) (キャラクタデバイスでは未使用) $10 1.b アクセス中のクラスタ中のセクタ $11 1.b (未使用) $12 1.w アクセス中のクラスタ番号 $14 1.l アクセス中のセクタ番号 $18 1.l I/O バッファ先頭 $1c 1.l 対応するディレクトリエントリのセクタ番号 (キャラクタデバイスでは未使用) $20 1.l 最終アクセスポインタ(_SEEK しなければファイルポインタと同じ値) $24 8.b ファイル名1(余白は $20) $2c 3.b ファイル名拡張子(〃) $2f 1.b ファイル属性 $30 10.b ファイル名2(〃) $3a 1.w 最終更新時刻 $3c 1.w 最終更新年月日 $3e 1.w 先頭の FAT 番号 $40 1.l ファイルサイズ $44 7.l FAT キャッシュ(上位word:先頭からのクラスタ数 下位word:FAT 番号) move FILENO,-(sp) DOS _GETFCB addq.l #2,sp ============================================================================== $ffad _S_MALLOC メインのメモリ管理下からのメモリブロックの確保する 引数 MD.w コントロールモード LEN.l 確保するバイト数 PAIR.l 管理するプロセスのプロセス管理ポインタ 返値 確保したメモリブロックのポインタ d0.l = $81?????? 指定された量は確保不可能 ($?????? は確保可能なバイト数). d0.l = $8200000? 完全に確保不可能($? は不定) モード MD で指定した検索方法で、メインのメモリ管理下から LEN で指定し たバイト数のメモリを確保する. LEN が $1000000 以上の場合は必ずエラーに なり、確保可能な最大バイト数を調べる事が出来る. この DOS コールは、通常のアプリケーションプログラムで使用してはいけな い. 常駐するプログラムのみ使用出来る. MD = 0 下位から検索 MD = 1 必要最小ブロックから検索 MD = 2 上位から検索 ただし、MD の最上位ビットが 1 の場合、確保したメモリブロックの親プロセ スのプロセス管理ポインタを呼び出し側が指定できる. その場合、引数として 設定するプロセス管理ポインタのアドレスを渡すこと. [通常] move.l LEN,-(sp) move MD,-(sp) DOS _S_MALLOC addq.l #6,sp [指定モード] pea (PAIR) move.l LEN,-(sp) move MD,-(sp) DOS _S_MALLOC lea (10,sp),sp ============================================================================== $ffae _S_MFREE メインのメモリ管理下のメモリブロックの解放 引数 MEMPTR.l メモリ管理ポインタ 返値 エラーコード MEMPTR で指定した、メインのメモリ管理下のメモリブロックを解放する. MEMPTR が S_PROCESS で指定したサブのメモリ管理ポインタで、かつそのスレ ッド ID がカレント ID なら、KILL_PR でプロセスを削除する. その場合サブ のメモリ管理下で常駐終了しているプロセスは、メインのメモリ管理下に入る. MEMPTR に 0 を指定した場合、自分が確保したメモリを全て解放する. pea (MEMPTR) DOS _S_MFREE addq.l #4,sp ============================================================================== $ffaf _S_PROCESS サブのメモリ管理の設定 引数 ID.w スレッド ID START.l サブのメモリ管理ポインタ LENGTH.l メモリブロック全体のバイト数 I_LEN.l 先頭ブロックのバイト数 返値 先頭のメモリブロック(サイズはI_LEN)のポインタ d0.l = $ffff00?? ID エラー($?? は ID の最大値) d0.l = -14 LENGTH が I_LEN+16 より小さい START で指定した先頭アドレスと LENGTH で指定したバイト数で、サブのメモ リ管理を設定する. サブのメモリ管理を新しく設定する際には、必ず先頭から 1 ブロックだけ自動的に確保されるので、そのバイト数 I_LEN を指定する. 以後指定した ID を持つスレッドからのメモリ確保要求は、このサブのメモリ 管理下に限定される. move.l I_LEN,-(sp) move.l LENGTH,-(sp) pea (START) move ID,-(sp) DOS _S_PROCESS lea (14,sp),sp ============================================================================== $fff0 _EXITVC (プログラム終了時の実行アドレス) これは DOS コールではなく、INTVCS でこのベクタに処理アドレスを設定して おくことにより、プログラム終了時にそのアドレスを呼び出すことが出来る. ============================================================================== $fff1 _CTRLVC (CTRL+C によるアボート時の実行アドレス) これは DOS コールではなく、INTVCS でこのベクタに処理アドレスを設定して おくことにより、ブレークでアボートした時にそのアドレスを呼び出すことが 出来る. ============================================================================== $fff2 _ERRJVC (エラーによるアボート時の実行アドレス) これは DOS コールではなく、INTVCS でこのベクタに処理アドレスを設定して おくことにより、エラーでアボートした時にそのアドレスを呼び出すことが出 来る. ============================================================================== $fff3 _DISKRED ブロックデバイスから直接読み込む 引数 BUFFER.l 読み込むバッファのポインタ DRIVE.w ドライブ番号(0:カレント 1:A 2:B … 26:Z) SECT.{w/l} 読み込む最初のセクタ番号 SECTLEN.{w/l} 読み込むセクタ数 DRIVE で指定したブロックデバイスの、SECT で指定したセクタから、SECTLEN で指定したセクタ数だけ BUFFER で指定したバッファに読み込む. 大容量ドライブ・特殊ドライブのために SECT 及び SCETLEN のサイズが ロングワードで指定できるように拡張されている. BUFFER に $80000000 を足すと引数がロングワードになる. 読み込みはセクタ単位で行うので、バッファは 1 セクタ当りのバイト数(通常 ドライブの場合は 1024 バイト)にする. SECT は 0 以上、SECTLEN は 1 以上(上限はメディアによって異なる). 通常のドライブ move SECTLEN,-(sp) move SECT,-(sp) move DRIVE,-(sp) pea (BUFFER) DOS _DISKRED lea (10,sp),sp 大容量・特殊ドライブ move.l SECTLEN,-(sp) move.l SECT,-(sp) move DRIVE,-(sp) pea (BUFFER+$80000000) DOS _DISKRED lea (14,sp),sp ============================================================================== $fff4 _DISKWRT ブロックデバイスへ直接書き込む 引数 BUFFER.l 書き込むバッファのポインタ DRIVE.w ドライブ番号(0:カレント 1:A 2:B … 26:Z) SECT.{w/l} 書き込む最初のセクタ番号 SECTLEN.{w/l} 書き込むセクタ数 BUFFER で指定したバッファから、DRIVE で指定したブロックデバイスの SECT で指定したセクタに、SECTLEN で指定したセクタ数だけ書き込む. 大容量ドライブ・特殊ドライブのために SECT 及び SCETLEN のサイズがロン グワードで指定できるように拡張されている. BUFFER に $80000000 を足すと引数がロングワードになる. 書き込みはセクタ単位で行うので、バッファは 1 セクタ当りのバイト数(通常 ドライブの場合は 1024 バイト)にする. SECT は 0 以上、SECTLEN は 1 以上(上限はメディアによって異なる). 通常のドライブ move SECTLEN,-(sp) move SECT,-(sp) move DRIVE,-(sp) pea (BUFFER) DOS _DISKWRT lea (10,sp),sp 大容量・特殊ドライブ move.l SECTLEN,-(sp) move.l SECT,-(sp) move DRIVE,-(sp) pea (BUFFER+$80000000) DOS _DISKWRT lea (14,sp),sp ============================================================================== $fff5 _INDOSFLG OS ワーク内へのポインタを得る 返値 INDOS_FLG のポインタ OS のワーク INDOS_FLG へのポインタを返す. スーパーバイザ領域のため、ユ ーザーモードではアクセス出来ない. また、INDOS_FLG 以後には OS にとって 重要なワークが存在するので、絶対に書き換えてはいけない. INDOS_FLG の内容は以下の通り. offset size 0 1.w indos_f OS 実行中のレベル 2 1.b doscmd OS 実行中ファンクション番号 3 1.b fat_flg FAT 検索モード(0:標準 2:常に先頭から) 4 1.w retry_count I/O リトライ回数(標準で 3 回) 6 1.w retry_time リトライ待ち時間(標準で 100 = 1 秒) 8 1.w verifyf ベリファイモード(0:Off 1:On) 10 1.b breakf ブレークモード(0:Off 1:On) 11 1.b ctrlpf CTRL+P モード(0:Off 1:On) 12 1.b (未公開) スレッド切り換え要求フラグ 13 1.b wkcurdrv カレントドライブ(A=0,B=1,…,Z=25) ============================================================================== $fff6 _SUPER_JSR スーパーバイザモードでのプログラムのサブルーチンコール 引数 JOBADR.l 処理アドレス d0-d7/a0-a6 処理に依存 返値 d0-d7/a0-a6 処理に依存 JOBADR で指定したプログラムにスーパーバイザモードで jsr する. DOS コールを実行する直前の d0-d7/a0-a6 が渡され、処理が戻るときにはそ の時の d0-d7/a0-a6 が返るが、SR は変化しない. SSP/USP はどのように渡されるか不定なので、スタックを用いて引数を渡すこ とは出来ない. この DOS コールでは、jsr することにより発生する暴走やバスエラーに対す る処理を全く行わない. pea (JOBADR) DOS _SUPER_JSR addq.l #4,sp ============================================================================== $fff7 _BUS_ERR バスエラーが発生するかの検査 引数 SIZE.w アクセスサイズ(1:バイト 2:ワード 4:ロングワード) P1.l 読み込みポインタ P2.l 書き込みポインタ 返値 d0.l = 0 読み書き可能 d0.l = 1 P2 に書き込んだ時にバスエラーが発生 d0.l = 2 P1 から読み込んだ時にバスエラーが発生 d0.l = -1 エラー(引数が異常) SIZE で指定されたサイズで P1 で指定したアドレスから読み込み、そのデータ を P2 で指定したアドレスに書き込んでバスエラーが発生するかどうか調べる. SIZE の値が異常な場合や SIZE = 2,4 で P1,P2 に奇数アドレスを指定した場 合は返値が -1 になる. move SIZE,-(sp) pea (P2) pea (P1) DOS _BUS_ERR lea (10,sp),sp ============================================================================== $fff8 _OPEN_PR バックグラウンドタスクの登録 引数 NAME.l スレッド名のポインタ COUNT.w 実行間隔を決める値 INIT_USP.l USP の初期値 INIT_SSP.l SSP の初期値 INIT_SR.w SR の初期値 INIT_PC.l プログラムの実行アドレス BUFFER.l タスク間通信バッファのポインタ SLEEP_TIME.l 待ち時間(ms) 返値 登録したタスクのスレッド ID(負数ならエラーコード) d0.l = -27 既に同名タスクが存在する. d0.l = -29 これ以上タスクを登録出来ない. NAME で指定した 15 文字以内のスレッド名のバックグラウンドタスクを登録 する. 登録したスレッドはスリープ状態になる. COUNT には、タスクを 1 回実行するのにタイマ割り込みを何回カウントする かの回数を 2~255 で指定する. 0~1 の場合は 2 として扱う. INIT_USP,INIT_SSP,INIT_PC は登録したタスクを実行する時のそれぞれのレジ スタの初期値. システム用のスタックは 6KB 必要. INIT_SR は $0000 若しくは $2000 を指定し、ユーザーモードかスーパーバイ ザーモードのどちらかを撰択する. その他のレジスタの初期値は全て 0. BUFFER はタスク間通信のバッファのアドレスを指定する. SLEEP_TIME は待ち時間をミリ秒単位で指定する. 0 を指定すると永久にスリ ープする. DOS _OPEN_PR によりバックグラウンドタスクとして登録されたスレッドは、 DOS _KEEPPR で常駐終了する. スレッドをメモリ上から消去する場合は DOS _KILL_PR を使用する. BUFFER の内容は以下の通り. offset size 0 1.l LENGTH データ用バッファのバイト数 4 1.l DATABUF データ用バッファの先頭アドレス 8 1.w COMMNAD コマンド番号 10 1.w ID 相手の ID(-1 で通信許可) move.l SLEEP_TIME,-(sp) pea (BUFFER) pea (INIT_PC) move SR,-(sp) pea (INIT_SSP) pea (INIT_USP) move COUNT,-(sp) pea (NAME) DOS _OPEN_PR lea (28,sp),sp ============================================================================== $fff9 _KILL_PR 自分自身のプロセスの削除 返値 エラーコード 自分自身のプロセスを削除する. 常駐終了していたプロセスの場合、同じ プロセス ID を持つスレッド全てを削除し、確保されていたメモリを解放する. この DOS コールを実行する前には、自分でオープンしたファイルは全て クローズし、書き換えたベクタなども元に戻す. システムはスレッドの削除と メモリの解放しか行わない. プロセス内でいくつかの登録したスレッドを実行した後で DOS _EXIT や DOS _EXIT2 で終了する場合、先にオープンしたスレッドを KILL_PR で削除す る. メインのスレッドであるプロセスを削除した場合、その後の動作は保証さ れない. 自分以外のプロセスを削除する場合は、DOS _SEND_PR で KILL コマ ンドを送る. ============================================================================== $fffa _GET_PR スレッドの管理情報を得る 引数 ID.w スレッド ID BUFFER.l 管理情報を書き込むバッファのポインタ 返値 スレッド ID 若しくはエラーコード 指定された ID のスレッドの管理情報を、BUFFER で指定した 116 バイトのバ ッファに複写する. ID に -1 を指定し、BUFFER+96 にスレッドの名前を指定すると、スレッドの ID が返る. また、ID に -2 を指定すると、自分自身の ID が返る. offset size 0 1.l NEXT_PTR 次のスレッドの管理情報格納領域 4 1.b WAIT_FLG 0:Normal -1:Wait 5 1.b COUNT 減算カウンタ 6 1.b MAX_CNT COUNT の初期値 7 1.b DOSCMD DOS コール番号 8 1.l PSP_ID プロセス ID 12 1.l USP 16 8.l D0,D1,D2,D3,D4,D5,D6,D7 48 7.l A0,A1,A2,A3,A4,A5,A6 76 1.w SR 78 1.l PC 82 1.l SSP 86 1.w INDOSF システム予約(OS 実行中レベル) 88 1.l INDOSP システム予約(OS 実行中スタック) 92 1.l BUFF タスク間通信バッファ 96 16.b スレッドの名前 112 1.l WAIT_TIME 待ち時間の残り(ミリ秒) 実際の管理情報の大きさは 124 バイトであるが、そのうち先頭から 116 バイ トだけが得られる. pea (BUFFER) move ID,-(sp) DOS _GET_PR addq.l #6,sp ============================================================================== $fffb _SUSPEND_PR スレッドを強制的にスリープ状態にする 引数 ID.w スレッド ID 返値 エラーコード d0.l = 0 正常終了 d0.l < 0 エラーコード d0.l = -1 スレッド自身のエラー d0.l = $ffff00?? ID が異常($?? は ID の最大値) ID で指定したスレッドを強制的にスリープ状態にする. スリープ状態になっ たスレッドは、DOS SEND_PR で起こされるまでスリープする. move ID,-(sp) DOS _SUSPEND_PR addq.l #2,sp ============================================================================== $fffc _SLEEP_PR スリープ状態に入る 引数 TIME.l 待ち時間(ミリ秒単位) 返値 スレッドの状態 d0.l = -1 待ち時間が経過し、自分で起きた. d0.l = -2 待ち時間が経過した後 DOS _SEND_PR で起こされた. d0.l = その他 残り時間(DOS _SEND_PR で起こされた). TIME で待ち時間を指定してスリープ状態に入る. TIME = 0 の時、永久にスリープする. スリープ状態に入ったスレッドは DOS _SEND_PR を用いて強制的に起こすこと が出来る. DOS _SEND_PR のコマンドが $fffb の場合、タスク間通信バッファ は変化しない. それ以外のコマンドの場合は、以下の通りに設定される. offset size 0 1.l LENGTH データバッファに書き込まれたバイト数 4 1.l DATABUF データバッファのポインタ 8 1.w COMMAND コマンド番号 10 1.w ID 起こしたスレッドの ID スリープする前にデータバッファの内容を処理してからデータバッファのアド レスとバイト数を設定し、ID に -1 を設定する. これにより、他のスレッド からの通信を許可することになる. スリープしていない時でも SEND_PR によりデータが送られた場合は、スリー プするとすぐに起こされ設定した待ち時間を返す. 返値の内容は以下の通り. d0.l = -1 待ち時間が経過して自分で起きた. タスク間通信バッファの内容は変化しない. d0.l = -2 待ち時間が経過したが、DOS _SUSPEND_PR で止められた後 DOS _SEND_PR で起こされた. d0.l = その他 待ち時間は経過していないが、DOS _SEND_PR で起こされた. 返値の単位はミリ秒. move.l TIME,-(sp) DOS _SLEEP_PR addq.l #4,sp ============================================================================== $fffd _SEND_PR スレッドにコマンド/データを送り、スリープしていたら起こす 引数 MY_ID.w 自分のスレッド ID YOUR_ID.w 相手のスレッド ID CMDNO.w 送出するコマンド BUFFER.l 送出するデータのポインタ LEN.l 送出するデータのバイト数 返値 d0.l = 0 正常終了 d0.l < 0 エラーコード d0.l = -28 書き込みエラー d0.l = $ffff00?? 指定 ID が不正($?? は ID の最大値) d0.l = $8000???? データのバイト数が不正($???? は容量の最大値) 指定した ID のスレッドにコマンドやデータを送り、スリープしていたら起こす. MY_ID に自分の ID、YOUR_ID に通信先のスレッドの ID を指定する. CMDNO は通信の内容を表すワード値で、システムで定められているコマンド以 外はそれぞれのスレッド間で定義する. システムで予約しているコマンドは $ff?? で、以下に示す値が定義されている. $fff9 スレッドを消去するように要求する. $fffb 強制スリープ状態から起こすだけで、タスク間通信バッファは変化しない. $fffc スリープするように要求する. 起こされた時にこのコマンドが送られていたら、すぐにタスク間通信 バッファの ID を -1 にしてスリープするべきである. スリープしないでタスク間通信バッファを監視している場合に有効. $ffff 処理が終ったかどうか調べる. -28 が返れば、まだ処理中である. コマンドやデータの転送には、タスク間通信バッファが使用される. バッファの内容は以下の通り. offset size 0 1.l LENGTH データバッファのバイト数 4 1.l DATABUF データバッファのポインタ 8 1.w COMMAND コマンド番号 10 1.w ID ID(-1 で通信許可) YOUR_ID で指定したスレッドの、タスク間通信バッファの ID が -1 に設定さ れていたら、そのバッファは書き込み可能なので、MY_ID と CMDNO をそれぞ れ ID と COMMAND に設定し、BUFFER からのデータを LEN で指定したバイト 数だけ DATABUF に書き込み、LENGTH を LEN にする. また、指定したスレッ ドがスリープしていたら起こす. 特に $fffb のコマンドは特殊処理され、指定したスレッドを起こすだけでタ スク間通信バッファの ID が -1 でなくてもよく、その他のバッファも変化し ない. LEN が LENGTH より大きい時や書き込み不可の時はエラーになる. Human68k version 3.02 では正常に動作しない(ID 検査に失敗する). move.l LEN,-(sp) pea (BUFFER) move CMDNO,-(sp) move YOUR_ID,-(sp) move MY_ID,-(sp) DOS _SEND_PR lea (14,sp),sp ============================================================================== $fffe _TIME_PR タイマのカウンタ値を得る 返値 現在のタイマのカウンタ値 現在のタイマのカウンタ値(ミリ秒単位)を調べる. バックグラウンドで複数のスレッドが平行して動作している場合、プログラム で一定の時間を計るためには、どのスレッドが動作していても一定して変化す るカウンタが必要になる. ロングワードでの最大値を越えると 0 に戻るので、そのまま前回に返された 値との減算で経過時間が分かる. ============================================================================== $ffff _CHANGE_PR 実行権を放棄 バックグラウンドタスクの自分の実行権を放棄する. 次のタスクに切り換わる. ==============================================================================