dos_compilers/Microsoft Pascal v1/FINKXM
2024-06-30 06:59:54 -07:00

142 lines
5.5 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ 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 <file variable>.<field>}
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;