mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-27 18:34:07 +00:00
Upload
Digital Research
This commit is contained in:
@@ -0,0 +1,826 @@
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 1
|
||||
|
||||
|
||||
ISIS-II PL/M-86 V2.0 COMPILATION OF MODULE SEARCH
|
||||
OBJECT MODULE PLACED IN SEARCH
|
||||
COMPILER INVOKED BY: :F0: SEARCH.PLM DEBUG OBJECT(SEARCH) OPTIMIZE(3) XREF
|
||||
|
||||
|
||||
|
||||
$title ('SDIR - Search For Files')
|
||||
1 search:
|
||||
do;
|
||||
/* search module for extended dir */
|
||||
|
||||
$include (comlit.lit)
|
||||
=
|
||||
2 1 = declare
|
||||
= lit literally 'literally',
|
||||
= dcl lit 'declare',
|
||||
= true lit '0ffh',
|
||||
= false lit '0',
|
||||
= boolean lit 'byte',
|
||||
= forever lit 'while true',
|
||||
= cr lit '13',
|
||||
= lf lit '10',
|
||||
= tab lit '9',
|
||||
= ctrlc lit '3',
|
||||
= ff lit '12',
|
||||
= page$len$offset lit '1ch',
|
||||
= nopage$mode$offset lit '2Ch',
|
||||
= sectorlen lit '128';
|
||||
$include (mon.plm)
|
||||
=
|
||||
= /* definitions for assembly interface module */
|
||||
3 1 = declare
|
||||
= fcb (33) byte external, /* default file control block */
|
||||
= maxb address external, /* top of memory */
|
||||
= buff(128)byte external; /* default buffer */
|
||||
=
|
||||
4 1 = mon1: procedure(f,a) external;
|
||||
5 2 = declare f byte, a address;
|
||||
6 2 = end mon1;
|
||||
=
|
||||
7 1 = mon2: procedure(f,a) byte external;
|
||||
8 2 = declare f byte, a address;
|
||||
9 2 = end mon2;
|
||||
=
|
||||
10 1 = mon3: procedure(f,a) address external;
|
||||
11 2 = declare f byte, a address;
|
||||
12 2 = end mon3;
|
||||
=
|
||||
|
||||
13 1 dcl debug boolean external;
|
||||
|
||||
14 1 dcl first$pass boolean external;
|
||||
15 1 dcl get$all$dir$entries boolean external;
|
||||
16 1 dcl usr$vector address external;
|
||||
17 1 dcl active$usr$vector address external;
|
||||
18 1 dcl used$de address public; /* used directory entries */
|
||||
19 1 dcl filesfound address public; /* num files collected in memory */
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 2
|
||||
|
||||
|
||||
|
||||
$include(fcb.lit)
|
||||
=
|
||||
20 1 = declare
|
||||
= f$drvusr lit '0', /* drive/user byte */
|
||||
= f$name lit '1', /* file name */
|
||||
= f$namelen lit '8', /* file name length */
|
||||
= f$type lit '9', /* file type field */
|
||||
= f$typelen lit '3', /* type length */
|
||||
= f$rw lit '9', /* high bit is R/W attribute */
|
||||
= f$dirsys lit '10', /* high bit is dir/sys attribute */
|
||||
= f$arc lit '11', /* high bit is archive attribute */
|
||||
= f$ex lit '12', /* extent */
|
||||
= f$s1 lit '13', /* module byte */
|
||||
= f$rc lit '15', /* record count */
|
||||
= f$diskmap lit '16', /* file disk map */
|
||||
= diskmaplen lit '16', /* disk map length */
|
||||
= f$drvusr2 lit '16', /* fcb2 */
|
||||
= f$name2 lit '17',
|
||||
= f$type2 lit '25',
|
||||
= f$cr lit '32', /* current record */
|
||||
= f$rrec lit '33', /* random record */
|
||||
= f$rreco lit '35'; /* " " overflow */
|
||||
=
|
||||
$include(xfcb.lit)
|
||||
=
|
||||
21 1 = declare /* XFCB */
|
||||
= xfcb$type lit '10h', /* identifier on disk */
|
||||
= xf$passmode lit '12', /* pass word protection mode */
|
||||
= xf$pass lit '16', /* XFCB password */
|
||||
= passlen lit '8', /* password length */
|
||||
= xf$create lit '24', /* creation/access time stamp */
|
||||
= xf$update lit '28'; /* update time stamp */
|
||||
=
|
||||
22 1 = declare /* directory label: special case of XFCB */
|
||||
= dirlabeltype lit '20h', /* identifier on disk */
|
||||
= dl$password lit '128', /* masks on data byte */
|
||||
= dl$access lit '64',
|
||||
= dl$update lit '32',
|
||||
= dl$makexfcb lit '16',
|
||||
= dl$exists lit '1';
|
||||
=
|
||||
23 1 = declare /* password mode of xfcb */
|
||||
= pm$read lit '80h',
|
||||
= pm$write lit '40h',
|
||||
= pm$delete lit '20h';
|
||||
=
|
||||
|
||||
24 1 declare
|
||||
sfcb$type lit '21H',
|
||||
deleted$type lit '0E5H';
|
||||
|
||||
$include (search.lit)
|
||||
=
|
||||
25 1 = declare /* what kind of file user wants to find */
|
||||
= find$structure lit 'structure (
|
||||
= dir byte,
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 3
|
||||
|
||||
|
||||
= sys byte,
|
||||
= ro byte,
|
||||
= rw byte,
|
||||
= pass byte,
|
||||
= xfcb byte,
|
||||
= nonxfcb byte,
|
||||
= exclude byte)';
|
||||
=
|
||||
26 1 = declare
|
||||
= max$search$files literally '10';
|
||||
=
|
||||
27 1 = declare
|
||||
= search$structure lit 'structure(
|
||||
= drv byte,
|
||||
= name(8) byte,
|
||||
= type(3) byte,
|
||||
= anyfile boolean)'; /* match on any drive if true */
|
||||
=
|
||||
28 1 dcl find find$structure external; /* what kind of files to look for */
|
||||
29 1 dcl num$search$files byte external;
|
||||
30 1 dcl search (max$search$files) search$structure external;
|
||||
/* file specs to match on */
|
||||
|
||||
/* other globals */
|
||||
|
||||
31 1 dcl cur$usr byte external,
|
||||
cur$drv byte external, /* current drive " " */
|
||||
dir$label byte public; /* directory label for BDOS 3.0 */
|
||||
|
||||
|
||||
/* -------- BDOS calls -------- */
|
||||
|
||||
32 1 read$char: procedure byte;
|
||||
33 2 return mon2 (1,0);
|
||||
34 2 end read$char;
|
||||
|
||||
|
||||
/* -------- in sort.plm -------- */
|
||||
|
||||
35 1 mult23: procedure(f$info$index) address external;
|
||||
36 2 dcl f$info$index address;
|
||||
37 2 end mult23;
|
||||
|
||||
|
||||
/* -------- in util.plm -------- */
|
||||
|
||||
38 1 print: procedure(string$adr) external;
|
||||
39 2 dcl string$adr address;
|
||||
40 2 end print;
|
||||
|
||||
41 1 print$char: procedure(char) external;
|
||||
42 2 dcl char byte;
|
||||
43 2 end print$char;
|
||||
|
||||
44 1 pdecimal:procedure(val,prec,zsup) external;
|
||||
45 2 dcl (val, prec) address;
|
||||
46 2 dcl zsup boolean;
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 4
|
||||
|
||||
|
||||
47 2 end pdecimal;
|
||||
|
||||
48 1 printfn: procedure(fnameadr) external;
|
||||
49 2 dcl fnameadr address;
|
||||
50 2 end printfn;
|
||||
|
||||
51 1 crlf: procedure external; /* print carriage return, linefeed */
|
||||
52 2 end crlf;
|
||||
|
||||
53 1 add3byte: procedure(byte3adr,num) external;
|
||||
54 2 dcl (byte3adr,num) address;
|
||||
55 2 end add3byte;
|
||||
|
||||
/* add three byte number to 3 byte accumulater */
|
||||
56 1 add3byte3: procedure(totalb,numb) external;
|
||||
57 2 dcl (totalb,numb) address;
|
||||
58 2 end add3byte3;
|
||||
|
||||
/* divide 3 byte value by 8 */
|
||||
59 1 shr3byte: procedure(byte3adr) external;
|
||||
60 2 dcl byte3adr address;
|
||||
61 2 end shr3byte;
|
||||
|
||||
/* -------- In dpb86.plm -------- */
|
||||
|
||||
$include(dpb.lit)
|
||||
=
|
||||
= /* indices into disk parameter block, used as parameters to dpb procedure */
|
||||
=
|
||||
62 1 = dcl spt$w lit '0',
|
||||
= blkshf$b lit '2',
|
||||
= blkmsk$b lit '3',
|
||||
= extmsk$b lit '4',
|
||||
= blkmax$w lit '5',
|
||||
= dirmax$w lit '7',
|
||||
= dirblk$w lit '9',
|
||||
= chksiz lit '11',
|
||||
= offset$w lit '13';
|
||||
=
|
||||
|
||||
63 1 dcl k$per$block byte external; /* set in dpb module */
|
||||
|
||||
64 1 base$dpb: procedure external;
|
||||
65 2 end base$dpb;
|
||||
|
||||
66 1 dpb$byte: procedure(param) byte external;
|
||||
67 2 dcl param byte;
|
||||
68 2 end dpb$byte;
|
||||
|
||||
69 1 dpb$word: procedure(param) address external;
|
||||
70 2 dcl param byte;
|
||||
71 2 end dpb$word;
|
||||
|
||||
|
||||
/* -------- Some Utility Routines -------- */
|
||||
|
||||
72 1 check$console$status: procedure byte;
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 5
|
||||
|
||||
|
||||
73 2 return mon2 (11,0);
|
||||
74 2 end check$console$status;
|
||||
|
||||
75 1 search$first: procedure (fcb$address) byte public;
|
||||
76 2 declare fcb$address address; /* shared with disp.plm */
|
||||
77 2 return mon2 (17,fcb$address); /* for short display */
|
||||
78 2 end search$first;
|
||||
|
||||
79 1 search$next: procedure byte public; /* shared with disp.plm */
|
||||
80 2 return mon2 (18,0);
|
||||
81 2 end search$next;
|
||||
|
||||
82 1 terminate: procedure external; /* in main.plm */
|
||||
83 2 end terminate;
|
||||
|
||||
84 1 set$vec: procedure(vector,value) external; /* in main.plm */
|
||||
85 2 dcl vector address,
|
||||
value byte;
|
||||
86 2 end set$vec;
|
||||
|
||||
/*break: procedure public; shared with disp.plm */
|
||||
/* dcl x byte;
|
||||
if check$console$status then
|
||||
do;
|
||||
x = read$char;
|
||||
call terminate;
|
||||
end;
|
||||
end break;*/
|
||||
|
||||
|
||||
/* -------- file information record declaration -------- */
|
||||
|
||||
$include(finfo.lit)
|
||||
=
|
||||
= /* file info record for SDIR - note if this structure changes in size */
|
||||
= /* the multXX: routine in the sort.plm module must also change */
|
||||
=
|
||||
87 1 = declare
|
||||
= f$info$structure lit 'structure(
|
||||
= usr byte, name (8) byte, type (3) byte, onekblocks address,
|
||||
= kbytes address, recs$lword address, recs$hbyte byte,
|
||||
= hash$link address, x$i$adr address)';
|
||||
88 1 = declare
|
||||
= x$info$structure lit 'structure (
|
||||
= create (4) byte,
|
||||
= update (4) byte,
|
||||
= passmode byte)';
|
||||
=
|
||||
|
||||
89 1 declare
|
||||
buf$fcb$adr address public, /* index into directory buffer */
|
||||
buf$fcb based buf$fcb$adr (32) byte,
|
||||
/* fcb template for dir */
|
||||
(first$f$i$adr, f$i$adr, last$f$i$adr) address public,
|
||||
/* indices into file$info array */
|
||||
file$info based f$i$adr f$info$structure,
|
||||
sfcb$adr address,
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 6
|
||||
|
||||
|
||||
dir$type based sfcb$adr byte,
|
||||
sfcbs$present byte,
|
||||
x$i$adr address public,
|
||||
xfcb$info based x$i$adr x$info$structure;
|
||||
|
||||
90 1 compare: procedure(length, str1$adr, str2$adr) boolean;
|
||||
91 2 dcl (length,i) byte,
|
||||
(str1$adr, str2$adr) address,
|
||||
str1 based str1$adr (1) byte,
|
||||
str2 based str2$adr (1) byte;
|
||||
/* str2 is the possibly wildcarded filename we are looking for */
|
||||
|
||||
92 2 do i = 0 to length - 1;
|
||||
93 3 if ((str1(i) and 7fh) <> (str2(i) and 7fh)) and str2(i) <> '?' then
|
||||
94 3 return(false);
|
||||
95 3 end;
|
||||
96 2 return(true);
|
||||
97 2 end compare;
|
||||
|
||||
98 1 match: procedure boolean public;
|
||||
99 2 dcl i byte,
|
||||
temp address;
|
||||
100 2 if (i := (buf$fcb(f$drvusr) and 0fh)) <> cur$usr then
|
||||
101 2 if not get$all$dir$entries then /* Not looking for this user */
|
||||
102 2 return(false); /* and not buffering all other*/
|
||||
else /* specified user files on */
|
||||
103 2 do; temp = 0; /* this drive. */
|
||||
105 3 call set$vec(.temp,i);
|
||||
106 3 if (temp and usr$vector) = 0 then /* Getting all dir entries, */
|
||||
107 3 return(false); /* with user number corresp'g */
|
||||
108 3 end; /* to a bit on in usr$vector */
|
||||
|
||||
109 2 if usr$vector <> 0 and i <> 0 and first$pass <> 0 then
|
||||
110 2 call set$vec(.active$usr$vector,i); /* skip cur$usr files */
|
||||
/* build active usr vector for this drive */
|
||||
|
||||
111 2 do i = 0 to num$search$files - 1;
|
||||
112 3 if search(i).drv = 0ffh or search(i).drv = cur$drv then
|
||||
/* match on any drive if 0ffh */
|
||||
113 3 if search(i).anyfile = true then
|
||||
114 3 return(not find.exclude); /* file found */
|
||||
115 3 else if compare(11,.buf$fcb(f$name),.search(i).name(0)) then
|
||||
116 3 return(not find.exclude); /* file found */
|
||||
end;
|
||||
118 2 return(find.exclude); /* file not found */
|
||||
119 2 end match; /* find.exclude = the exclude option value */
|
||||
|
||||
120 1 dcl hash$table$size lit '128', /* must be power of 2 */
|
||||
hash$table (hash$table$size) address at (.memory),
|
||||
/* must be initialized on each*/
|
||||
hash$entry$adr address, /* disk scan */
|
||||
hash$entry based hash$entry$adr address; /* where to put a new entry's */
|
||||
/* address */
|
||||
|
||||
121 1 hash$look$up: procedure boolean;
|
||||
122 2 dcl (i,found,hash$index) byte;
|
||||
123 2 hash$index = 0;
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 7
|
||||
|
||||
|
||||
124 2 do i = f$name to f$namelen + f$typelen;
|
||||
125 3 hash$index = hash$index + (buf$fcb(i) and 7fh); /* attributes may */
|
||||
126 3 end; /* only be set w/ 1st extent */
|
||||
127 2 hash$index = hash$index + cur$usr;
|
||||
128 2 hash$index = hash$index and (hash$table$size - 1);
|
||||
129 2 hash$entry$adr = .hash$table(hash$index); /* put new entry in table if */
|
||||
130 2 f$i$adr = hash$table(hash$index); /* unused ( = 0) */
|
||||
|
||||
131 2 found = false;
|
||||
132 2 do while f$i$adr <> 0 and not found;
|
||||
133 3 if file$info.usr = (buf$fcb(f$drvusr) and 0fh) and
|
||||
compare(f$namelen + f$typelen,.file$info.name(0),.buf$fcb(f$name))
|
||||
then
|
||||
134 3 found = true;
|
||||
else /* table entry used - collison */
|
||||
135 3 do; hash$entry$adr = .file$info.hash$link; /* resolve by linked */
|
||||
137 4 f$i$adr = file$info.hash$link; /* list */
|
||||
138 4 end;
|
||||
139 3 end;
|
||||
140 2 if f$i$adr = 0 then
|
||||
141 2 return(false); /* didn't find it, used hash$entry to keep new info */
|
||||
142 2 else return(true); /* found it, file$info at matched entry */
|
||||
143 2 end hash$look$up;
|
||||
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 8
|
||||
|
||||
|
||||
$eject
|
||||
144 1 store$file$info: procedure boolean;
|
||||
/* Look for file name of last found fcb or xfcb in fileinfo */
|
||||
/* array, if not found put name in fileinfo array. Copy other */
|
||||
/* info to fileinfo or xfcbinfo. The lookup is hash coded with */
|
||||
/* collisions handled by linking up file$info records through */
|
||||
/* the hash$link field of the previous file$info record. */
|
||||
/* The file$info array grows upward in memory and the xfcbinfo */
|
||||
/* grows downward. */
|
||||
/*
|
||||
|
||||
-------------------------<---.memory
|
||||
__ | HASH TABLE |
|
||||
hash = \ of filename -->| root of file$info list|------------>-----------|
|
||||
func /__ letters | . | |
|
||||
| . | |
|
||||
lower memory ------------------------- <-- first$f$i$adr |
|
||||
| file$info entry | |
|
||||
(hash) -----<--| . | <----------------------|
|
||||
(collision) | | . |
|
||||
------->| . |
|
||||
| . |-------------------->|
|
||||
| last file$info entry | <- last$f$i$adr |
|
||||
|-----------------------| |
|
||||
| | |
|
||||
| | |
|
||||
| unused by dsearch, | |
|
||||
| used by dsort | |
|
||||
| for indices | |
|
||||
| | |
|
||||
| | |
|
||||
|-----------------------| |
|
||||
| last$xfcb entry | <- x$i$adr |
|
||||
| . | |
|
||||
| . | |
|
||||
| . | <-------------------|
|
||||
| first xfcb entry |
|
||||
|-----------------------|
|
||||
| un-usuable memory | <- maxb
|
||||
higher memory ------------------------- */
|
||||
|
||||
|
||||
145 2 dcl (i, j, d$map$cnt) byte,
|
||||
temp address;
|
||||
|
||||
146 2 store$file: procedure;
|
||||
147 3 call move(f$namelen + f$typelen, .buf$fcb(f$name),.file$info.name);
|
||||
/* attributes are not in XFCBs to copy again in case */
|
||||
/* XFCB came first in directory */
|
||||
|
||||
148 3 file$info.name(f$arc-1) = file$info.name(f$arc-1) and buf$fcb(f$arc);
|
||||
/* 0 archive bit if it is 0 in any dir entry */
|
||||
149 3 d$map$cnt = 0; /* count kilobytes for current dir entry */
|
||||
150 3 i = 1; /* 1 or 2 byte block numbers ? */
|
||||
151 3 if dpb$word(blk$max$w) > 255 then
|
||||
152 3 i = 2;
|
||||
153 3 do j = f$diskmap to f$diskmap + diskmaplen - 1 by i;
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 9
|
||||
|
||||
|
||||
154 4 temp = buf$fcb(j);
|
||||
155 4 if i = 2 then /* word block numbers */
|
||||
156 4 temp = temp or buf$fcb(j+1);
|
||||
157 4 if temp <> 0 then /* allocated */
|
||||
158 4 d$map$cnt = d$map$cnt + 1;
|
||||
159 4 end;
|
||||
160 3 if d$map$cnt > 0 then
|
||||
161 3 do;
|
||||
162 4 call add3byte
|
||||
(.file$info.recs$lword,
|
||||
d$map$cnt * (dpb$byte(blkmsk$b) + 1) -
|
||||
( (128 - buf$fcb(f$rc)) and dpb$byte(blkmsk$b) )
|
||||
);
|
||||
163 4 file$info.onekblocks = file$info.onekblocks +
|
||||
d$map$cnt * k$per$block -
|
||||
shr( (128 - buf$fcb(f$rc)) and dpb$byte(blkmsk$b), 3 );
|
||||
/* treat each directory entry separately for sparse files */
|
||||
/* if copied to single density diskette, the number of 1kblocks */
|
||||
164 4 file$info.kbytes = file$info.kbytes + d$map$cnt * k$per$block;
|
||||
165 4 end;
|
||||
166 3 end;
|
||||
|
||||
167 2 if buf$fcb(f$drvusr) <> sfcb$type then do; /* don't put SFCB's in table */
|
||||
169 3 if not hash$look$up then /* not in table already */
|
||||
/* hash$entry is where to put adr of new entry */
|
||||
170 3 do; /* copy to new position in file info array */
|
||||
171 4 if (temp := mult23(files$found + 1)) > x$i$adr then
|
||||
172 4 return(false); /* out of memory */
|
||||
173 4 if (temp < first$f$i$adr) then
|
||||
174 4 return(false); /* wrap around - out of memory */
|
||||
175 4 f$i$adr = (last$f$i$adr := last$f$i$adr + size(file$info));
|
||||
176 4 filesfound = filesfound + 1;
|
||||
177 4 call move(f$namelen + f$typelen, .buf$fcb(f$name),.file$info.name);
|
||||
178 4 file$info.usr = buf$fcb(f$drvusr) and 0fh;
|
||||
179 4 file$info.onekblocks,file$info.kbytes,file$info.recs$lword,
|
||||
file$info.recs$hbyte, file$info.x$i$adr,file$info.hash$link = 0;
|
||||
180 4 hash$entry = f$i$adr; /* save the address of file$info */
|
||||
181 4 end; /* zero totals for the new file */
|
||||
182 3 end;
|
||||
|
||||
/* else hash$lookup has set f$i$adr to the file entry already in the */
|
||||
/* hash table */
|
||||
|
||||
183 2 if sfcbs$present then do; /* save sfcb,xfcb or fcb type info */
|
||||
185 3 if (buf$fcb(f$drvusr) and xfcb$type) = 0 then do;
|
||||
187 4 if buf$fcb(f$drvusr) <> sfcb$type then do;
|
||||
189 5 if buf$fcb(f$ex) <= dpb$byte(extmsk$b) then do;
|
||||
/* first extent? then store sfcb info into xfcb table */
|
||||
191 6 if last$f$i$adr + size(file$info) > x$i$adr - size(xfcb$info) then
|
||||
192 6 return(false); /* out of memory */
|
||||
193 6 x$i$adr = x$i$adr - size(xfcb$info);
|
||||
194 6 call move(9,sfcb$adr,.xfcb$info.create);
|
||||
195 6 file$info.x$i$adr = x$i$adr;
|
||||
196 6 end;
|
||||
197 5 call store$file;
|
||||
198 5 end;
|
||||
199 4 end;
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 10
|
||||
|
||||
|
||||
200 3 end;
|
||||
201 2 else do; /* no SFCB's present */
|
||||
202 3 if (buf$fcb(f$drvusr) and xfcb$type) <> 0 then do; /* XFCB */
|
||||
204 4 if last$f$i$adr + size(file$info) > x$i$adr - size(xfcb$info) then
|
||||
205 4 return(false); /* out of memory */
|
||||
206 4 x$i$adr = x$i$adr - size(xfcb$info);
|
||||
207 4 call move(8,.buf$fcb(xf$create),.xfcb$info.create);
|
||||
208 4 xfcb$info.passmode = buf$fcb(xf$passmode);
|
||||
209 4 file$info.x$i$adr = x$i$adr;
|
||||
210 4 end;
|
||||
211 3 else call store$file; /* must be a regular fcb then */
|
||||
212 3 end;
|
||||
213 2 return(true); /* success */
|
||||
214 2 end store$file$info;
|
||||
|
||||
|
||||
/* Module Entry Point */
|
||||
|
||||
215 1 get$files: procedure public; /* with one scan through directory get */
|
||||
216 2 dcl dcnt byte; /* files from currently selected drive */
|
||||
|
||||
217 2 last$f$i$adr = first$f$i$adr - size(file$info);
|
||||
/* after hash table */
|
||||
/* last$f$i$adr is the address of the highest file info record */
|
||||
/* in memory */
|
||||
|
||||
218 2 do dcnt = 0 to hash$table$size - 1; /* init hash table */
|
||||
219 3 hash$table(dcnt) = 0;
|
||||
220 3 end;
|
||||
|
||||
221 2 x$i$adr = maxb; /* top of mem, put xfcb info here */
|
||||
222 2 call base$dpb;
|
||||
223 2 dir$label,filesfound, used$de = 0;
|
||||
|
||||
224 2 fcb(f$drvusr) = '?'; /* match all dir entries */
|
||||
225 2 dcnt = search$first(.fcb);
|
||||
226 2 sfcb$adr = 96 + .buff; /* determine if SFCB's are present */
|
||||
227 2 if dir$type = sfcb$type then
|
||||
228 2 do;
|
||||
229 3 sfcbs$present = true;
|
||||
230 3 used$de = shr(1+dpb$word(dirmax$w),2); /* count all sfcb's once */
|
||||
231 3 end;
|
||||
else
|
||||
232 2 sfcbs$present = false;
|
||||
233 2 do while dcnt <> 255;
|
||||
234 3 buf$fcb$adr = shl(dcnt and 11b,5)+.buff; /* dcnt mod 4 * 32 */
|
||||
235 3 if sfcbs$present then
|
||||
236 3 sfcb$adr = 97 + (dcnt * 10) + .buff; /* SFCB time & date stamp adr */
|
||||
237 3 if (buf$fcb(f$drvusr) <> deleted$type) then
|
||||
238 3 do;
|
||||
239 4 if (buf$fcb(f$drvusr) <> sfcb$type) then
|
||||
240 4 used$de = used$de + 1;
|
||||
241 4 if buf$fcb(f$drvusr) = dirlabel$type then /* dir label ? */
|
||||
242 4 dir$label = buf$fcb(f$ex); /* save label info */
|
||||
243 4 else if match then
|
||||
244 4 do;
|
||||
245 5 if not store$file$info then /* store fcb or xfcb info */
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 11
|
||||
|
||||
|
||||
246 5 do; /* out of space */
|
||||
247 6 call print (.('Out of Memory',cr,lf,'$'));
|
||||
248 6 return;
|
||||
249 6 end;
|
||||
250 5 end;
|
||||
end;
|
||||
/*call break;*/
|
||||
252 3 dcnt = search$next; /* to next entry in directory */
|
||||
253 3 end; /* of do while dcnt <> 255 */
|
||||
|
||||
254 2 end get$files;
|
||||
|
||||
255 1 search$init: procedure public; /* called once from main.plm */
|
||||
256 2 if (first$f$i$adr := (.hash$table + size(hash$table))) + size(file$info)
|
||||
> maxb then
|
||||
257 2 do;
|
||||
258 3 call print(.('Not Enough Memory',cr,lf,'$'));
|
||||
259 3 call terminate;
|
||||
260 3 end;
|
||||
261 2 end search$init;
|
||||
|
||||
262 1 end search;
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 12
|
||||
|
||||
|
||||
CROSS-REFERENCE LISTING
|
||||
-----------------------
|
||||
|
||||
|
||||
DEFN ADDR SIZE NAME, ATTRIBUTES, AND REFERENCES
|
||||
----- ------ ----- --------------------------------
|
||||
|
||||
|
||||
7 0000H 2 A. . . . . . . . . WORD PARAMETER 8
|
||||
10 0000H 2 A. . . . . . . . . WORD PARAMETER 11
|
||||
4 0000H 2 A. . . . . . . . . WORD PARAMETER 5
|
||||
17 0000H 2 ACTIVEUSRVECTOR. . WORD EXTERNAL(10) 110
|
||||
53 0000H ADD3BYTE . . . . . PROCEDURE EXTERNAL(22) STACK=0000H 162
|
||||
56 0000H ADD3BYTE3. . . . . PROCEDURE EXTERNAL(23) STACK=0000H
|
||||
30 000CH 1 ANYFILE. . . . . . BYTE MEMBER(SEARCH) 113
|
||||
64 0000H BASEDPB. . . . . . PROCEDURE EXTERNAL(26) STACK=0000H 222
|
||||
62 BLKMAXW. . . . . . LITERALLY 151
|
||||
62 BLKMSKB. . . . . . LITERALLY 162 163
|
||||
62 BLKSHFB. . . . . . LITERALLY
|
||||
2 BOOLEAN. . . . . . LITERALLY 13 14 15 30 46 90 98 121 144
|
||||
3 0000H 128 BUFF . . . . . . . BYTE ARRAY(128) EXTERNAL(2) 226 234 236
|
||||
89 0000H 32 BUFFCB . . . . . . BYTE BASED(BUFFCBADR) ARRAY(32) 100 115 125 133 147 148
|
||||
154 156 162 163 167 177 178 185 187 189 202 207 208 237
|
||||
239 241 242
|
||||
89 0004H 2 BUFFCBADR. . . . . WORD PUBLIC 89 100 115 125 133 147 148 154 156 162
|
||||
163 167 177 178 185 187 189 202 207 208 234 237 239 241
|
||||
242
|
||||
59 0000H 2 BYTE3ADR . . . . . WORD PARAMETER 60
|
||||
53 0000H 2 BYTE3ADR . . . . . WORD PARAMETER 54
|
||||
41 0000H 1 CHAR . . . . . . . BYTE PARAMETER 42
|
||||
72 000FH 15 CHECKCONSOLESTATUS PROCEDURE BYTE STACK=0008H
|
||||
62 CHKSIZ . . . . . . LITERALLY
|
||||
90 003DH 65 COMPARE. . . . . . PROCEDURE BYTE STACK=0008H 115 133
|
||||
2 CR . . . . . . . . LITERALLY 247 258
|
||||
89 0000H 4 CREATE . . . . . . BYTE ARRAY(4) MEMBER(XFCBINFO) 194 207
|
||||
51 0000H CRLF . . . . . . . PROCEDURE EXTERNAL(21) STACK=0000H
|
||||
2 CTRLC. . . . . . . LITERALLY
|
||||
31 0000H 1 CURDRV . . . . . . BYTE EXTERNAL(15) 112
|
||||
31 0000H 1 CURUSR . . . . . . BYTE EXTERNAL(14) 100 127
|
||||
2 DCL. . . . . . . . LITERALLY
|
||||
216 0020H 1 DCNT . . . . . . . BYTE 218 219 225 233 234 236 252
|
||||
13 0000H 1 DEBUG. . . . . . . BYTE EXTERNAL(6)
|
||||
24 DELETEDTYPE. . . . LITERALLY 237
|
||||
28 0000H 1 DIR. . . . . . . . BYTE MEMBER(FIND)
|
||||
62 DIRBLKW. . . . . . LITERALLY
|
||||
31 0016H 1 DIRLABEL . . . . . BYTE PUBLIC 223 242
|
||||
22 DIRLABELTYPE . . . LITERALLY 241
|
||||
62 DIRMAXW. . . . . . LITERALLY 230
|
||||
89 0000H 1 DIRTYPE. . . . . . BYTE BASED(SFCBADR) 227
|
||||
20 DISKMAPLEN . . . . LITERALLY 153
|
||||
22 DLACCESS . . . . . LITERALLY
|
||||
22 DLEXISTS . . . . . LITERALLY
|
||||
22 DLMAKEXFCB . . . . LITERALLY
|
||||
22 DLPASSWORD . . . . LITERALLY
|
||||
22 DLUPDATE . . . . . LITERALLY
|
||||
145 001FH 1 DMAPCNT. . . . . . BYTE 149 158 160 162 163 164
|
||||
66 0000H DPBBYTE. . . . . . PROCEDURE BYTE EXTERNAL(27) STACK=0000H 162 163 189
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 13
|
||||
|
||||
|
||||
69 0000H DPBWORD. . . . . . PROCEDURE WORD EXTERNAL(28) STACK=0000H 151 230
|
||||
30 0000H 1 DRV. . . . . . . . BYTE MEMBER(SEARCH) 112
|
||||
28 0007H 1 EXCLUDE. . . . . . BYTE MEMBER(FIND) 114 116 118
|
||||
62 EXTMSKB. . . . . . LITERALLY 189
|
||||
4 0000H 1 F. . . . . . . . . BYTE PARAMETER 5
|
||||
10 0000H 1 F. . . . . . . . . BYTE PARAMETER 11
|
||||
7 0000H 1 F. . . . . . . . . BYTE PARAMETER 8
|
||||
2 FALSE. . . . . . . LITERALLY 94 102 107 131 141 172 174 192 205 232
|
||||
20 FARC . . . . . . . LITERALLY 148
|
||||
3 0000H 33 FCB. . . . . . . . BYTE ARRAY(33) EXTERNAL(0) 224 225
|
||||
75 0004H 2 FCBADDRESS . . . . WORD PARAMETER AUTOMATIC 76 77
|
||||
20 FCR. . . . . . . . LITERALLY
|
||||
20 FDIRSYS. . . . . . LITERALLY
|
||||
20 FDISKMAP . . . . . LITERALLY 153
|
||||
20 FDRVUSR. . . . . . LITERALLY 100 133 167 178 185 187 202 224 237 239 241
|
||||
20 FDRVUSR2 . . . . . LITERALLY
|
||||
20 FEX. . . . . . . . LITERALLY 189 242
|
||||
2 FF . . . . . . . . LITERALLY
|
||||
89 0008H 2 FIADR. . . . . . . WORD PUBLIC 89 130 132 133 136 137 140 147 148 162
|
||||
163 164 175 177 178 179 180 195 209
|
||||
89 0000H 23 FILEINFO . . . . . STRUCTURE BASED(FIADR) 133 136 137 147 148 162 163 164
|
||||
175 177 178 179 191 195 204 209 217 256
|
||||
19 0002H 2 FILESFOUND . . . . WORD PUBLIC 171 176 223
|
||||
28 0000H 8 FIND . . . . . . . STRUCTURE EXTERNAL(11) 114 116 118
|
||||
25 FINDSTRUCTURE. . . LITERALLY 28
|
||||
35 0000H 2 FINFOINDEX . . . . WORD PARAMETER 36
|
||||
87 FINFOSTRUCTURE . . LITERALLY 89
|
||||
89 0006H 2 FIRSTFIADR . . . . WORD PUBLIC 173 217 256
|
||||
14 0000H 1 FIRSTPASS. . . . . BYTE EXTERNAL(7) 109
|
||||
20 FNAME. . . . . . . LITERALLY 115 124 133 147 177
|
||||
20 FNAME2 . . . . . . LITERALLY
|
||||
48 0000H 2 FNAMEADR . . . . . WORD PARAMETER 49
|
||||
20 FNAMELEN . . . . . LITERALLY 124 133 147 177
|
||||
2 FOREVER. . . . . . LITERALLY
|
||||
122 001BH 1 FOUND. . . . . . . BYTE 131 132 134
|
||||
20 FRC. . . . . . . . LITERALLY 162 163
|
||||
20 FRREC. . . . . . . LITERALLY
|
||||
20 FRRECO . . . . . . LITERALLY
|
||||
20 FRW. . . . . . . . LITERALLY
|
||||
20 FS1. . . . . . . . LITERALLY
|
||||
20 FTYPE. . . . . . . LITERALLY
|
||||
20 FTYPE2 . . . . . . LITERALLY
|
||||
20 FTYPELEN . . . . . LITERALLY 124 133 147 177
|
||||
15 0000H 1 GETALLDIRENTRIES . BYTE EXTERNAL(8) 101
|
||||
215 043AH 234 GETFILES . . . . . PROCEDURE PUBLIC STACK=0016H
|
||||
120 0000H 2 HASHENTRY. . . . . WORD BASED(HASHENTRYADR) 180
|
||||
120 0012H 2 HASHENTRYADR . . . WORD 120 129 136 180
|
||||
122 001CH 1 HASHINDEX. . . . . BYTE 123 125 127 128 129 130
|
||||
89 0013H 2 HASHLINK . . . . . WORD MEMBER(FILEINFO) 136 137 179
|
||||
121 0146H 189 HASHLOOKUP . . . . PROCEDURE BYTE STACK=000EH 169
|
||||
120 0000H 256 HASHTABLE. . . . . WORD ARRAY(128) AT 129 130 219 256
|
||||
120 HASHTABLESIZE. . . LITERALLY 120 128 218
|
||||
145 001DH 1 I. . . . . . . . . BYTE 150 152 153 155
|
||||
99 0019H 1 I. . . . . . . . . BYTE 100 105 109 110 111 112 113 115
|
||||
122 001AH 1 I. . . . . . . . . BYTE 124 125
|
||||
91 0018H 1 I. . . . . . . . . BYTE 92 93
|
||||
145 001EH 1 J. . . . . . . . . BYTE 153 154 156
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 14
|
||||
|
||||
|
||||
89 000EH 2 KBYTES . . . . . . WORD MEMBER(FILEINFO) 164 179
|
||||
63 0000H 1 KPERBLOCK. . . . . BYTE EXTERNAL(25) 163 164
|
||||
89 000AH 2 LASTFIADR. . . . . WORD PUBLIC 175 191 204 217
|
||||
90 0008H 1 LENGTH . . . . . . BYTE PARAMETER AUTOMATIC 91 92
|
||||
2 LF . . . . . . . . LITERALLY 247 258
|
||||
2 LIT. . . . . . . . LITERALLY 2 20 21 22 23 24 25 27 62 87 88
|
||||
120
|
||||
98 007EH 200 MATCH. . . . . . . PROCEDURE BYTE PUBLIC STACK=000CH 243
|
||||
3 0000H 2 MAXB . . . . . . . WORD EXTERNAL(1) 221 256
|
||||
26 MAXSEARCHFILES . . LITERALLY 30
|
||||
0000H MEMORY . . . . . . BYTE ARRAY(0) 120
|
||||
4 0000H MON1 . . . . . . . PROCEDURE EXTERNAL(3) STACK=0000H
|
||||
7 0000H MON2 . . . . . . . PROCEDURE BYTE EXTERNAL(4) STACK=0000H 33 73 77 80
|
||||
10 0000H MON3 . . . . . . . PROCEDURE WORD EXTERNAL(5) STACK=0000H
|
||||
MOVE . . . . . . . BUILTIN 147 177 194 207
|
||||
35 0000H MULT23 . . . . . . PROCEDURE WORD EXTERNAL(16) STACK=0000H 171
|
||||
89 0001H 8 NAME . . . . . . . BYTE ARRAY(8) MEMBER(FILEINFO) 133 147 148 177
|
||||
30 0001H 8 NAME . . . . . . . BYTE ARRAY(8) MEMBER(SEARCH) 115
|
||||
28 0006H 1 NONXFCB. . . . . . BYTE MEMBER(FIND)
|
||||
2 NOPAGEMODEOFFSET . LITERALLY
|
||||
53 0000H 2 NUM. . . . . . . . WORD PARAMETER 54
|
||||
56 0000H 2 NUMB . . . . . . . WORD PARAMETER 57
|
||||
29 0000H 1 NUMSEARCHFILES . . BYTE EXTERNAL(12) 111
|
||||
62 OFFSETW. . . . . . LITERALLY
|
||||
89 000CH 2 ONEKBLOCKS . . . . WORD MEMBER(FILEINFO) 163 179
|
||||
2 PAGELENOFFSET. . . LITERALLY
|
||||
69 0000H 1 PARAM. . . . . . . BYTE PARAMETER 70
|
||||
66 0000H 1 PARAM. . . . . . . BYTE PARAMETER 67
|
||||
28 0004H 1 PASS . . . . . . . BYTE MEMBER(FIND)
|
||||
21 PASSLEN. . . . . . LITERALLY
|
||||
89 0008H 1 PASSMODE . . . . . BYTE MEMBER(XFCBINFO) 208
|
||||
44 0000H PDECIMAL . . . . . PROCEDURE EXTERNAL(19) STACK=0000H
|
||||
23 PMDELETE . . . . . LITERALLY
|
||||
23 PMREAD . . . . . . LITERALLY
|
||||
23 PMWRITE. . . . . . LITERALLY
|
||||
44 0000H 2 PREC . . . . . . . WORD PARAMETER 45
|
||||
38 0000H PRINT. . . . . . . PROCEDURE EXTERNAL(17) STACK=0000H 247 258
|
||||
41 0000H PRINTCHAR. . . . . PROCEDURE EXTERNAL(18) STACK=0000H
|
||||
48 0000H PRINTFN. . . . . . PROCEDURE EXTERNAL(20) STACK=0000H
|
||||
32 0000H 15 READCHAR . . . . . PROCEDURE BYTE STACK=0008H
|
||||
89 0012H 1 RECSHBYTE. . . . . BYTE MEMBER(FILEINFO) 179
|
||||
89 0010H 2 RECSLWORD. . . . . WORD MEMBER(FILEINFO) 162 179
|
||||
28 0002H 1 RO . . . . . . . . BYTE MEMBER(FIND)
|
||||
28 0003H 1 RW . . . . . . . . BYTE MEMBER(FIND)
|
||||
1 0000H SEARCH . . . . . . PROCEDURE STACK=0000H
|
||||
30 0000H 130 SEARCH . . . . . . STRUCTURE ARRAY(10) EXTERNAL(13) 112 113 115
|
||||
75 001EH 16 SEARCHFIRST. . . . PROCEDURE BYTE PUBLIC STACK=000AH 225
|
||||
255 0524H 30 SEARCHINIT . . . . PROCEDURE PUBLIC STACK=0006H
|
||||
79 002EH 15 SEARCHNEXT . . . . PROCEDURE BYTE PUBLIC STACK=0008H 252
|
||||
27 SEARCHSTRUCTURE. . LITERALLY 30
|
||||
2 SECTORLEN. . . . . LITERALLY
|
||||
84 0000H SETVEC . . . . . . PROCEDURE EXTERNAL(30) STACK=0000H 105 110
|
||||
89 000CH 2 SFCBADR. . . . . . WORD 89 194 226 227 236
|
||||
89 0017H 1 SFCBSPRESENT . . . BYTE 183 229 232 235
|
||||
24 SFCBTYPE . . . . . LITERALLY 167 187 227 239
|
||||
SHL. . . . . . . . BUILTIN 234
|
||||
SHR. . . . . . . . BUILTIN 163 230
|
||||
PL/M-86 COMPILER SDIR - SEARCH FOR FILES PAGE 15
|
||||
|
||||
|
||||
59 0000H SHR3BYTE . . . . . PROCEDURE EXTERNAL(24) STACK=0000H
|
||||
SIZE . . . . . . . BUILTIN 175 191 193 204 206 217 256
|
||||
62 SPTW . . . . . . . LITERALLY
|
||||
146 0338H 258 STOREFILE. . . . . PROCEDURE STACK=000CH 197 211
|
||||
144 0203H 309 STOREFILEINFO. . . PROCEDURE BYTE STACK=0012H 245
|
||||
91 0000H 1 STR1 . . . . . . . BYTE BASED(STR1ADR) ARRAY(1) 93
|
||||
90 0006H 2 STR1ADR. . . . . . WORD PARAMETER AUTOMATIC 91 93
|
||||
91 0000H 1 STR2 . . . . . . . BYTE BASED(STR2ADR) ARRAY(1) 93
|
||||
90 0004H 2 STR2ADR. . . . . . WORD PARAMETER AUTOMATIC 91 93
|
||||
38 0000H 2 STRINGADR. . . . . WORD PARAMETER 39
|
||||
28 0001H 1 SYS. . . . . . . . BYTE MEMBER(FIND)
|
||||
2 TAB. . . . . . . . LITERALLY
|
||||
145 0014H 2 TEMP . . . . . . . WORD 154 156 157 171 173
|
||||
99 0010H 2 TEMP . . . . . . . WORD 104 105 106
|
||||
82 0000H TERMINATE. . . . . PROCEDURE EXTERNAL(29) STACK=0000H 259
|
||||
56 0000H 2 TOTALB . . . . . . WORD PARAMETER 57
|
||||
2 TRUE . . . . . . . LITERALLY 96 113 134 142 213 229
|
||||
89 0009H 3 TYPE . . . . . . . BYTE ARRAY(3) MEMBER(FILEINFO)
|
||||
30 0009H 3 TYPE . . . . . . . BYTE ARRAY(3) MEMBER(SEARCH)
|
||||
89 0004H 4 UPDATE . . . . . . BYTE ARRAY(4) MEMBER(XFCBINFO)
|
||||
18 0000H 2 USEDDE . . . . . . WORD PUBLIC 223 230 240
|
||||
89 0000H 1 USR. . . . . . . . BYTE MEMBER(FILEINFO) 133 178
|
||||
16 0000H 2 USRVECTOR. . . . . WORD EXTERNAL(9) 106 109
|
||||
44 0000H 2 VAL. . . . . . . . WORD PARAMETER 45
|
||||
84 0000H 1 VALUE. . . . . . . BYTE PARAMETER 85
|
||||
84 0000H 2 VECTOR . . . . . . WORD PARAMETER 85
|
||||
28 0005H 1 XFCB . . . . . . . BYTE MEMBER(FIND)
|
||||
89 0000H 9 XFCBINFO . . . . . STRUCTURE BASED(XIADR) 191 193 194 204 206 207 208
|
||||
21 XFCBTYPE . . . . . LITERALLY 185 202
|
||||
21 XFCREATE . . . . . LITERALLY 207
|
||||
21 XFPASS . . . . . . LITERALLY
|
||||
21 XFPASSMODE . . . . LITERALLY 208
|
||||
21 XFUPDATE . . . . . LITERALLY
|
||||
89 000EH 2 XIADR. . . . . . . WORD PUBLIC 89 171 191 193 194 195 204 206 207 208
|
||||
209 221
|
||||
89 0015H 2 XIADR. . . . . . . WORD MEMBER(FILEINFO) 179 195 209
|
||||
88 XINFOSTRUCTURE . . LITERALLY 89
|
||||
44 0000H 1 ZSUP . . . . . . . BYTE PARAMETER 46
|
||||
|
||||
|
||||
|
||||
MODULE INFORMATION:
|
||||
|
||||
CODE AREA SIZE = 0542H 1346D
|
||||
CONSTANT AREA SIZE = 0024H 36D
|
||||
VARIABLE AREA SIZE = 0021H 33D
|
||||
MAXIMUM STACK SIZE = 0016H 22D
|
||||
553 LINES READ
|
||||
0 PROGRAM ERROR(S)
|
||||
|
||||
END OF PL/M-86 COMPILATION
|
||||
Reference in New Issue
Block a user