mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 09:54:20 +00:00
274 lines
14 KiB
Plaintext
274 lines
14 KiB
Plaintext
PL/M-86 COMPILER SDIR - SORT MODULE PAGE 1
|
||
|
||
|
||
ISIS-II PL/M-86 V2.0 COMPILATION OF MODULE SORT
|
||
OBJECT MODULE PLACED IN SORT
|
||
COMPILER INVOKED BY: :F0: SORT.PLM DEBUG OBJECT(SORT) OPTIMIZE(3) XREF
|
||
|
||
|
||
|
||
$title ('SDIR - Sort Module')
|
||
1 sort:
|
||
do;
|
||
/* sort 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';
|
||
|
||
3 1 print: procedure(str$adr) external; /* in util.plm */
|
||
4 2 dcl str$adr address;
|
||
5 2 end print;
|
||
|
||
6 1 dcl sorted boolean public; /* set by this module if successful sort */
|
||
|
||
$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 */
|
||
=
|
||
7 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)';
|
||
8 1 = declare
|
||
= x$info$structure lit 'structure (
|
||
= create (4) byte,
|
||
= update (4) byte,
|
||
= passmode byte)';
|
||
=
|
||
|
||
9 1 declare
|
||
buf$fcb$adr address external, /* index into directory buffer */
|
||
buf$fcb based buf$fcb$adr (32) byte,
|
||
/* fcb template for dir */
|
||
|
||
PL/M-86 COMPILER SDIR - SORT MODULE PAGE 2
|
||
|
||
|
||
(f$i$adr, first$f$i$adr, last$f$i$adr, x$i$adr, filesfound)
|
||
address external,
|
||
/* indices into file$info array */
|
||
file$info based f$i$adr f$info$structure,
|
||
|
||
mid$adr address,
|
||
mid$file$info based mid$adr f$info$structure;
|
||
|
||
|
||
10 1 mult23: procedure(index) address public;
|
||
11 2 dcl index address; /* return address of file$info numbered by index */
|
||
12 2 return shl(index, 4) + shl(index,2) + shl(index,1) + index + first$f$i$adr;
|
||
/* index * size(file$info) + base of file$info array */
|
||
13 2 end mult23;
|
||
|
||
14 1 lessthan: procedure( str1$adr, str2$adr) boolean;
|
||
15 2 dcl (i,c1,c2) byte, /* true if str1 < str2 */
|
||
(str1$adr, str2$adr) address, /* sorting on name and type field */
|
||
str1 based str1$adr (1) byte, /* only, assumed to be first in */
|
||
str2 based str2$adr (1) byte; /* file$info record */
|
||
16 2 do i = 1 to 11;
|
||
17 3 if (c1:=(str1(i) and 7fh)) <> (c2:=(str2(i) and 7fh)) then
|
||
18 3 return(c1 < c2);
|
||
19 3 end;
|
||
20 2 return(false);
|
||
21 2 end lessthan;
|
||
|
||
22 1 dcl f$i$indices$base address public,
|
||
f$i$indices based f$i$indices$base (1) address;
|
||
|
||
23 1 qsort: procedure(l,r); /* no recursive quick sort, sorting largest */
|
||
24 2 dcl (l,r,i,j,temp) address,/* partition first */
|
||
stacksiz lit '14', /* should always be able to sort 2 ** stacksiz */
|
||
stack (stack$siz) structure (l address, r address),
|
||
sp byte;
|
||
|
||
25 2 sp = 0; stack(0).l = l; stack(0).r = r;
|
||
|
||
28 2 do while sp < stack$siz - 1;
|
||
29 3 l = stack(sp).l; r = stack(sp).r; sp = sp - 1;
|
||
32 3 do while l < r;
|
||
33 4 i = l; j = r;
|
||
35 4 mid$adr = mult23(f$i$indices(shr(l+r,1)));
|
||
36 4 do while i <= j;
|
||
37 5 f$i$adr = mult23(f$i$indices(i));
|
||
38 5 do while lessthan(f$i$adr,mid$adr);
|
||
39 6 i = i + 1;
|
||
40 6 f$i$adr = mult23(f$i$indices(i));
|
||
41 6 end;
|
||
42 5 f$i$adr = mult23(f$i$indices(j));
|
||
43 5 do while lessthan(mid$adr,f$i$adr);
|
||
44 6 j = j - 1;
|
||
45 6 f$i$adr = mult23(f$i$indices(j));
|
||
46 6 end;
|
||
47 5 if i <= j then
|
||
48 5 do; temp = f$i$indices(i); f$i$indices(i) = f$i$indices(j);
|
||
51 6 f$i$indices(j) = temp;
|
||
PL/M-86 COMPILER SDIR - SORT MODULE PAGE 3
|
||
|
||
|
||
52 6 i = i + 1;
|
||
53 6 if j > 0 then j = j - 1;
|
||
55 6 end;
|
||
56 5 end; /* while i <= j */
|
||
57 4 if j - l < r - i then /* which partition is larger */
|
||
58 4 do; if i < r then
|
||
60 5 do; sp = sp + 1; stack(sp).l = i; stack(sp).r = r;
|
||
64 6 end;
|
||
65 5 r = j; /* continue sorting left partition */
|
||
66 5 end;
|
||
else
|
||
67 4 do; if l < j then
|
||
69 5 do; sp = sp + 1; stack(sp).l = l; stack(sp).r = j;
|
||
73 6 end;
|
||
74 5 l = i; /* continue sorting right partition */
|
||
75 5 end;
|
||
76 4 end; /* while l < r */
|
||
77 3 end; /* while sp < stack$siz - 1 */
|
||
78 2 if sp <> 255 then
|
||
79 2 call print(.(cr,lf,lf,'Sort Stack Overflow',cr,lf,'$'));
|
||
80 2 else sorted = true;
|
||
81 2 end qsort;
|
||
|
||
82 1 sort: procedure public;
|
||
83 2 dcl i address;
|
||
84 2 f$i$indices$base = last$f$i$adr + size(file$info);
|
||
85 2 if filesfound < 2 then
|
||
86 2 return;
|
||
87 2 if shr((x$i$adr - f$i$indices$base),1) < filesfound then
|
||
88 2 do;
|
||
89 3 call print(.('Not Enough Memory for Sort',cr,lf,'$'));
|
||
90 3 return;
|
||
91 3 end;
|
||
92 2 do i = 0 to filesfound - 1;
|
||
93 3 f$i$indices(i) = i; /* initialize f$i$indices */
|
||
94 3 end;
|
||
95 2 call qsort(0,filesfound - 1);
|
||
96 2 sorted = true;
|
||
97 2 end sort;
|
||
|
||
98 1 end sort;
|
||
PL/M-86 COMPILER SDIR - SORT MODULE PAGE 4
|
||
|
||
|
||
CROSS-REFERENCE LISTING
|
||
-----------------------
|
||
|
||
|
||
DEFN ADDR SIZE NAME, ATTRIBUTES, AND REFERENCES
|
||
----- ------ ----- --------------------------------
|
||
|
||
|
||
2 BOOLEAN. . . . . . LITERALLY 6 14
|
||
9 0000H 32 BUFFCB . . . . . . BYTE BASED(BUFFCBADR) ARRAY(32)
|
||
9 0000H 2 BUFFCBADR. . . . . WORD EXTERNAL(1) 9
|
||
15 0046H 1 C1 . . . . . . . . BYTE 17 18
|
||
15 0047H 1 C2 . . . . . . . . BYTE 17 18
|
||
2 CR . . . . . . . . LITERALLY 79 89
|
||
2 CTRLC. . . . . . . LITERALLY
|
||
2 DCL. . . . . . . . LITERALLY
|
||
2 FALSE. . . . . . . LITERALLY 20
|
||
2 FF . . . . . . . . LITERALLY
|
||
9 0000H 2 FIADR. . . . . . . WORD EXTERNAL(2) 9 37 38 40 42 43 45
|
||
22 0000H 2 FIINDICES. . . . . WORD BASED(FIINDICESBASE) ARRAY(1) 35 37 40 42 45 49
|
||
50 51 93
|
||
22 0002H 2 FIINDICESBASE. . . WORD PUBLIC 22 35 37 40 42 45 49 50 51 84
|
||
87 93
|
||
9 0000H 23 FILEINFO . . . . . STRUCTURE BASED(FIADR) 84
|
||
9 0000H 2 FILESFOUND . . . . WORD EXTERNAL(6) 85 87 92 95
|
||
7 FINFOSTRUCTURE . . LITERALLY 9
|
||
9 0000H 2 FIRSTFIADR . . . . WORD EXTERNAL(3) 12
|
||
2 FOREVER. . . . . . LITERALLY
|
||
9 0013H 2 HASHLINK . . . . . WORD MEMBER(MIDFILEINFO)
|
||
9 0013H 2 HASHLINK . . . . . WORD MEMBER(FILEINFO)
|
||
15 0045H 1 I. . . . . . . . . BYTE 16 17
|
||
24 0004H 2 I. . . . . . . . . WORD 33 36 37 39 40 47 49 50 52 57 59 62
|
||
74
|
||
83 0042H 2 I. . . . . . . . . WORD 92 93
|
||
10 0004H 2 INDEX. . . . . . . WORD PARAMETER AUTOMATIC 11 12
|
||
24 0006H 2 J. . . . . . . . . WORD 34 36 42 44 45 47 50 51 53 54 57 65
|
||
68 72
|
||
9 000EH 2 KBYTES . . . . . . WORD MEMBER(MIDFILEINFO)
|
||
9 000EH 2 KBYTES . . . . . . WORD MEMBER(FILEINFO)
|
||
23 0006H 2 L. . . . . . . . . WORD PARAMETER AUTOMATIC 24 26 29 32 33 35 57 68
|
||
71 74
|
||
24 0000H 2 L. . . . . . . . . WORD MEMBER(STACK) 26 29 62 71
|
||
9 0000H 2 LASTFIADR. . . . . WORD EXTERNAL(4) 84
|
||
14 0025H 66 LESSTHAN . . . . . PROCEDURE BYTE STACK=0006H 38 43
|
||
2 LF . . . . . . . . LITERALLY 79 89
|
||
2 LIT. . . . . . . . LITERALLY 2 7 8 24
|
||
9 0000H 2 MIDADR . . . . . . WORD 9 35 38 43
|
||
9 0000H 23 MIDFILEINFO. . . . STRUCTURE BASED(MIDADR)
|
||
10 0000H 37 MULT23 . . . . . . PROCEDURE WORD PUBLIC STACK=0004H 35 37 40 42 45
|
||
9 0001H 8 NAME . . . . . . . BYTE ARRAY(8) MEMBER(MIDFILEINFO)
|
||
9 0001H 8 NAME . . . . . . . BYTE ARRAY(8) MEMBER(FILEINFO)
|
||
2 NOPAGEMODEOFFSET . LITERALLY
|
||
9 000CH 2 ONEKBLOCKS . . . . WORD MEMBER(MIDFILEINFO)
|
||
9 000CH 2 ONEKBLOCKS . . . . WORD MEMBER(FILEINFO)
|
||
2 PAGELENOFFSET. . . LITERALLY
|
||
3 0000H PRINT. . . . . . . PROCEDURE EXTERNAL(0) STACK=0000H 79 89
|
||
23 0067H 373 QSORT. . . . . . . PROCEDURE STACK=000EH 95
|
||
PL/M-86 COMPILER SDIR - SORT MODULE PAGE 5
|
||
|
||
|
||
23 0004H 2 R. . . . . . . . . WORD PARAMETER AUTOMATIC 24 27 30 32 34 35 57 59
|
||
63 65
|
||
24 0002H 2 R. . . . . . . . . WORD MEMBER(STACK) 27 30 63 72
|
||
9 0012H 1 RECSHBYTE. . . . . BYTE MEMBER(MIDFILEINFO)
|
||
9 0012H 1 RECSHBYTE. . . . . BYTE MEMBER(FILEINFO)
|
||
9 0010H 2 RECSLWORD. . . . . WORD MEMBER(MIDFILEINFO)
|
||
9 0010H 2 RECSLWORD. . . . . WORD MEMBER(FILEINFO)
|
||
2 SECTORLEN. . . . . LITERALLY
|
||
SHL. . . . . . . . BUILTIN 12
|
||
SHR. . . . . . . . BUILTIN 35 87
|
||
SIZE . . . . . . . BUILTIN 84
|
||
1 0000H SORT . . . . . . . PROCEDURE STACK=0000H
|
||
82 01DCH 102 SORT . . . . . . . PROCEDURE PUBLIC STACK=0012H
|
||
6 0044H 1 SORTED . . . . . . BYTE PUBLIC 80 96
|
||
24 0048H 1 SP . . . . . . . . BYTE 25 28 29 30 31 61 62 63 70 71 72 78
|
||
24 000AH 56 STACK. . . . . . . STRUCTURE ARRAY(14) 26 27 29 30 62 63 71 72
|
||
24 STACKSIZ . . . . . LITERALLY 24 28
|
||
15 0000H 1 STR1 . . . . . . . BYTE BASED(STR1ADR) ARRAY(1) 17
|
||
14 0006H 2 STR1ADR. . . . . . WORD PARAMETER AUTOMATIC 15 17
|
||
15 0000H 1 STR2 . . . . . . . BYTE BASED(STR2ADR) ARRAY(1) 17
|
||
14 0004H 2 STR2ADR. . . . . . WORD PARAMETER AUTOMATIC 15 17
|
||
3 0000H 2 STRADR . . . . . . WORD PARAMETER 4
|
||
2 TAB. . . . . . . . LITERALLY
|
||
24 0008H 2 TEMP . . . . . . . WORD 49 51
|
||
2 TRUE . . . . . . . LITERALLY 80 96
|
||
9 0009H 3 TYPE . . . . . . . BYTE ARRAY(3) MEMBER(MIDFILEINFO)
|
||
9 0009H 3 TYPE . . . . . . . BYTE ARRAY(3) MEMBER(FILEINFO)
|
||
9 0000H 1 USR. . . . . . . . BYTE MEMBER(MIDFILEINFO)
|
||
9 0000H 1 USR. . . . . . . . BYTE MEMBER(FILEINFO)
|
||
9 0015H 2 XIADR. . . . . . . WORD MEMBER(MIDFILEINFO)
|
||
9 0015H 2 XIADR. . . . . . . WORD MEMBER(FILEINFO)
|
||
9 0000H 2 XIADR. . . . . . . WORD EXTERNAL(5) 87
|
||
8 XINFOSTRUCTURE . . LITERALLY
|
||
|
||
|
||
|
||
MODULE INFORMATION:
|
||
|
||
CODE AREA SIZE = 0242H 578D
|
||
CONSTANT AREA SIZE = 0036H 54D
|
||
VARIABLE AREA SIZE = 0049H 73D
|
||
MAXIMUM STACK SIZE = 0012H 18D
|
||
149 LINES READ
|
||
0 PROGRAM ERROR(S)
|
||
|
||
END OF PL/M-86 COMPILATION
|