{ Pascal File Control Block, DOS Specific Version } INTERFACE; UNIT FILKQQ (FCBFQQ, FILEMODES, SEQUENTIAL, TERMINAL, DIRECT, DEVICETYPE, CONSOLE, LDEVICE, DISK, DOSEXT, DOSFCB, FNLUQQ, SCTRLNTH); CONST {$INCONST:SCPDOS Seattle Computer Products versions } FNLUQQ = 21; { length of a DOS filename } {$IF SCPDOS $THEN} SCTRLNTH = 512; { length of a disk sector } {$ELSE} SCTRLNTH = 128; { length of a disk sector } {$END} TYPE DOSEXT = RECORD { DOS file control block extension } PS [0]: BYTE; { boundary byte, not in extension } FG [1]: BYTE; { flag; must be 255 in extension } XZ [2]: ARRAY [0..4] OF BYTE; { padding, internal use } AB [7]: BYTE; { attribute bits } END; DOSFCB = RECORD { DOS file control block (normal) } DR [0]: BYTE; { drive number, 0=def, 1=A etc } FN [1]: STRING (8); { file name - 8 bytes } FT [9]: STRING (3); { file extension - 3 bytes } EX [12]: BYTE; { current extent, lo byte } E2 [13]: BYTE; { current extent, hi byte } S2 [14]: BYTE; { sector size, lo byte } RC [15]: BYTE; { sector size, hi hyte (ext sect) } Z1 [16]: WORD; { file size, lo word; readonly } Z2 [18]: WORD; { file size, hi word; readonly } DA [20]: WORD; { date, bits DDDDDMMMMYYYYYYY } DN [16]: ARRAY [0..9] OF BYTE; { reserved for DOS } CR [32]: BYTE; { current sector within extent } RN [33]: WORD; { direct sector number lo word } R2 [35]: BYTE; { direct sector number hi byte } R3 [36]: BYTE; { hi byte (iff sect size < 64) } PD [37]: BYTE; { pad to a word boundary, not DOS } END; DEVICETYPE = (CONSOLE, LDEVICE, DISK); { physical device type } FILEMODES = (SEQUENTIAL, TERMINAL, DIRECT); { access mode for file } TYPE FCBFQQ = RECORD {byte offsets start every field comment} {fields accessible by Pascal user as .} TRAP: BOOLEAN; {00 Pascal user trapping errors if true} ERRS: WRD(0)..15; {01 error status, set only by all units} MODE: FILEMODES; {02 user file mode; not used in unit U} MISC: BYTE; {03 pad to word bound, special user use} {fields shared by units F, V, U; ERRC / ESTS are write-only} ERRC: WORD; {04 error code, error exists if nonzero} {1000..1099: set for unit U errors} {1100..1199: set for unit F errors} {1200..1299: set for unit V errors} ESTS: WORD; {06 error specific data usually from OS} CMOD: FILEMODES; {08 system file mode; copied from MODE} {fields set / used by units F and V, and read-only in unit U} TXTF: BOOLEAN; {09 true: formatted / ASCII / TEXT file} {false: not formatted / binary file} SIZE: WORD; {10 record size set when file is opened} {DIRECT: always fixed record length} {others: max length (UPPER (BUFFA))} MISB: WORD; {12 unused, exists for historic reasons} OLDF: BOOLEAN; {14 true: must exist before open; RESET} {false: can create on open; REWRITE} INPT: BOOLEAN; {15 true: user is now reading from file} {false: user is now writing to file} RECL: WORD; {16 DIRECT record number, lo order word} RECH: WORD; {18 DIRECT record number, hi order word} USED: WORD; {20 number bytes used in current record} {field used internally by units F and V not needed by unit U} LINK: ADR OF FCBFQQ;{22 DS offset address of next open file} {fields used internally by unit F not needed by units V or U} BADR: ADRMEM; {24 ADR of buffer variable (end of FCB)} TMPF: BOOLEAN; {26 true if temp file; delete on CLOSE} FULL: BOOLEAN; {27 buffer lazy evaluation status, TEXT} MISA: BYTE; {28 unused, exists for historic reasons} OPEN: BOOLEAN; {29 file opened; RESET / REWRITE called} {fields used internally by unit V not needed by units F or U} FUNT: INTEGER; {30 Unit V's unit number always above 0} ENDF: BOOLEAN; {32 last operation was the ENDFILE stmt} {fields set / used by unit U, and read-only in units F and V} REDY: BOOLEAN; {33 buffer ready if true; set by F / U} BCNT: WORD; {34 number of data bytes actually moved} EORF: BOOLEAN; {36 true if end of record read, written} EOFF: BOOLEAN; {37 end of file flag set after EOF read} {unit U (operating system) information starts here} NAME: LSTRING (FNLUQQ); { 38 DOS file name for this file } DEVT: DEVICETYPE; { 60 type of device accessed by this file } RDFC: BYTE; { 61 function code to read from a device } WRFC: BYTE; { 62 function code to write to a device } CHNG: BOOLEAN; { 63 true if data in sbuf was changed } SPTR: WORD; { 64 pointer (index) into sbuf } LNSB: WORD; { 66 # of valid bytes in sbuf } DOSX: DOSEXT; { 68 extended DOS file control block } DOSF: DOSFCB; { 76 normal DOS file control block } IEOF: BOOLEAN; {114 true if eoff should be true next get } FNER: BOOLEAN; {115 true if a filename error has occured } SBFL: BYTE; {116 max length of textfile line in sbuf } SBFC: BYTE; {117 number of chars read into sbuf } SBUF: ARRAY [WRD(0)..SCTRLNTH-1] OF BYTE; {118 sector buffer } PMET: ARRAY [0..3] OF BYTE; {118 + sctrlnth: reserved pad } BUFF: CHAR; { Pascal buffer variable, (component) } {end of section for unit U specific OS information} END; END;