TEST AL,14H JPE SKIP XOR AL,14H SKIP:Parityフラグは下位8ビットについての結果を反映するため、この方法は8ビットレジスタにしか使えない。
ADD AX,(9Fh-21h)*256+(42h-21h) SHR AL,1 JC SKIP CMP AH,60h+(9Fh-21h) SBB AH,9Fh-40h-1 SKIP: XOR AL,0A0h
AND AL,3Fh SHL AL,1 SUB AH,9FH JAE SKIP DEC AX CMP AH,80h-9Fh ADC AH,9Fh-40h-1 SKIP: ADD AX,2120h
ルートディレクトリの先頭セクタは、ファンクション32hの結果を見ればわかる。ファンクション32hは、DOS 5で公開されたファンクションだが、DOS 2以降で使用可能である。ただし、DOS 4以降は仕様が変更されている。仕様は次の通りである(Ralf BrownのInterrupt Listより抜粋)。
--------D-2132------------------------------- INT 21 - DOS 2+ - GET DOS DRIVE PARAMETER BLOCK FOR SPECIFIC DRIVE AH = 32h DL = drive number (00h = default, 01h = A:, etc) Return: AL = status 00h successful DS:BX -> Drive Parameter Block (DPB) for specified drive FFh invalid or network drive 注意書きなど省略 Format of DOS Drive Parameter Block: Offset Size Description 00h BYTE drive number (00h = A:, 01h = B:, etc) 01h BYTE unit number within device driver 02h WORD bytes per sector 04h BYTE highest sector number within a cluster 05h BYTE shift count to convert clusters into sectors 06h WORD number of reserved sectors at beginning of drive 08h BYTE number of FATs 09h WORD number of root directory entries 0Bh WORD number of first sector containing user data 0Dh WORD highest cluster number (number of data clusters + 1) 16-bit FAT if greater than 0FF6h, else 12-bit FAT 0Fh BYTE number of sectors per FAT 10h WORD sector number of first directory sector 以下略 ---DOS 4.0-6.0--- 0Fh WORD number of sectors per FAT 11h WORD sector number of first directory sector 以下略ルートディレクトリの先頭セクタ番号は、DS:[BX+10h]またはDS:[BX+11h]にあることがわかる。なお、セクタ数はbytes per sectorとnumber of root directory entriesから計算してもよいが、number of first sector containing user dataの直前までがルートディレクトリなので、これを使うほうが簡単である。
ファイルやサブディレクトリの先頭クラスタを知るには、FCBを使ってファイルを検索するファンクション11hと12hを使う。見つかったファイルのディレクトリエントリがDTAのオフセット1から、または8から(拡張FCBを使ったとき)入っているので、その中の先頭クラスタを使う。ディレクトリエントリの形式は次の通りである(Ralf BrownのInterrupt Listより)。
Format of directory entry: Offset Size Description 00h 8 BYTEs blank-padded filename 08h 3 BYTEs blank-padded file extension 0Bh BYTE attributes 0Ch 10 BYTEs reserved used by DR-DOS to store file password 16h WORD time of creation or last update (see AX=5700h) 18h WORD date of creation or last update (see AX=5700h) 1Ah WORD starting cluster number 1Ch DWORD file sizeクラスタ番号ではなくセクタ番号が必要なときには、次の式を使う。変換に必要なパラメタは、上で説明したファンクション32hで得られる。
SHIFT_COUNT: shift count to convert clusters into sectors DATA_START_SECTOR: number of first sector containing user data セクタ番号 = (クラスタ番号-2)*2^SHIFT_COUNT + DATA_START_SECTOR先頭以外のクラスタ番号またはセクタ番号を知りたいときには、FATのチェーンをたどっていけばよい。