annotate level1/cmds/dirsort.asm @ 1958:df97c336e737

Converted to UNIX terminators
author robert
date Wed, 21 Dec 2005 13:59:09 +0000
parents 6b282e7c880f
children 0e6b61d99cac
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1958
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
1 ******************************************************************
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
2 * dirsort - Directory sorting utility
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
3 *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
4 * This is an asm version of a Basic09 directory sort
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
5 * that was published in a Coco newsletter.
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
6 * Original and ml routine by Robert Gault, Nov. 2005
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
7 *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
8 * The program uses a version of Shellsort published
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
9 * in a May 1983, BYTE article by Terry Barron and
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
10 * George Diehr (both at University of Washington)
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
11 *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
12 * Edt/Rev YYYY/MM/DD Modified by
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
13 * Comment
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
14 * -------------------------------------------------------------
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
15 * 1 2005/12/19 Robert Gault
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
16 * Very fast and fairly simple
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
17 * 2 2005/12/20 Robert Gault
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
18 * Minor change of use /dd/defs/defsfile to use defsfile. The first
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
19 * was for my OS-9 system. The current one is for the NitrOS-9
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
20 * project.
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
21
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
22 NAM dirsort
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
23 * This ensures the assembler knows predefined OS-9 terms
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
24 IFP1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
25 USE defsfile
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
26 ENDC
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
27
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
28 * If you want built-in help change the next line.
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
29 HELP SET FALSE
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
30
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
31 TyLg SET Prgrm+Objct program object code
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
32 * Re-entrant means multiple users possible
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
33 AtRev SET ReEnt+Rev re-entrant, revision 1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
34 Rev SET 1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
35
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
36 * Create module header, needed by all OS-9 modules
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
37 MOD Eom,Name,TyLg,AtRev,Start,Size
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
38 * Data area
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
39 DPptr RMB 2 pointer to our direct page
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
40 dirsize RMB 2 size of the directory less 64 bytes
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
41 count RMB 2 number of directory entries
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
42 entryI RMB 2 pointer to nameI
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
43 entryJ RMB 2 pointer to nameJ
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
44 entryID RMB 2 pointer to name(I+D)
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
45 Tx RMB 32 buffer for transfer
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
46 i RMB 2 index
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
47 j RMB 2 index
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
48 NminusD RMB 2 holds last value of FOR I/NEXT loop
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
49 path RMB 1 value for path to the directory
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
50 D RMB 2 shellsort constant
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
51 RMB 40
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
52 stack EQU .
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
53 Size EQU . This initial data space will be increased as OS-9
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
54 * assigns space in pages of 256 bytes. Initially the stack will
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
55 * not be here.
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
56 buffer EQU . This will be the start of the data array in memory
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
57 * to be requested from OS-9 as needed.
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
58
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
59 Name EQU *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
60 FCS /dirsort/
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
61 FCB 1 edition number
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
62 * Ego stroking :) identifier
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
63 FCC /Written by Robert Gault, 2005/
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
64
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
65 * Default directory name, dot, or current directory
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
66 default FCB C$PERD,C$CR
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
67
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
68 * Solutions for N,2^INT(LN(N)) -1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
69 * We don't need general logs just specifc values so
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
70 * they were pre-calculated
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
71 Dtable FDB 2,0
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
72 FDB 7,1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
73 FDB 20,3
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
74 FDB 54,7
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
75 FDB 148,15
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
76 * If your directory has more entries than several hundred, you
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
77 * need to learn how to organize your disk/drive.
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
78 FDB 403,31
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
79 FDB 1096,63
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
80 * This next will exceed normal memory limits but is needed
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
81 * for values up to about 2000. We could just put $FFFF/32=
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
82 * 2047 but there are size checks in the code.
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
83 FDB 2980,127
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
84 DTEnd EQU *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
85
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
86 Start EQU *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
87 stu <DPptr save the direct page pointer
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
88 leas stack,u put the stack where we want it or it will be
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
89 * inside the directory buffer and crash the program.
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
90 cmpd #0 are there any parameters?
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
91 beq noprm
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
92 l1 lda ,x+ skip over spaces, if any
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
93 cmpa #C$SPAC
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
94 beq l1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
95 cmpa #C$CR if only spaces, same as noprm
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
96 bne a1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
97 noprm leax default,pcr point to default directory, dot
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
98 bra a9
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
99 IFNE HELP
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
100 a1 cmpa #'? if "?" then show syntax
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
101 lbeq syntax
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
102 cmpa #'- if attempt at options, syntax
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
103 lbeq syntax
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
104 leax -1,x
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
105 ELSE
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
106 a1 leax -1,x backstep to first character of directory
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
107 ENDC
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
108 a9 lda #%11000011 directory, single user access, update
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
109 os9 I$Open attempt to open a path to the directory
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
110 lbcs error
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
111 sta <path save the path #
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
112 ldb #SS.Size get the size of the directory
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
113 os9 I$GetStt size reported in regs X&U
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
114 cmpx #0 MSB of size
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
115 lbne Tlarge too big to sort
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
116 tfr u,d evaluate the size
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
117 cmpd #128 two entries other than .. and .
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
118 lblo getreal can't sort 1 item or less
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
119 subd #64 reduce size by 64 bytes for .. and .
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
120 std <dirsize save size in bytes
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
121 addd #Size we need current data + directory buffer
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
122 os9 F$Mem request space for the buffer
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
123 lbcs Tlarge can't get enough memory
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
124 lda <path recover path to the directory
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
125 ldx #0 MSB position
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
126 ldu #64 LSB, past the entries .. and .
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
127 os9 I$Seek skip over the entries
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
128 ldu <DPptr recover DP pointer
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
129 ldy <dirsize data size in bytes
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
130 leax buffer,u point to our buffer
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
131 os9 I$Read transfer the directory information to buffer
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
132 * Calculate the number of directory entries
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
133 * Divide size by 32 bytes per entry. INT(size/32)must=size/32 or
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
134 * the directory is corrupted. So, ignore remainder.
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
135 ldx #0 initialize counter
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
136 ldd <dirsize this does not include . and ..
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
137 IFNE H6309
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
138 lsrd
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
139 lsrd
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
140 lsrd
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
141 lsrd
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
142 lsrd
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
143 ELSE
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
144 lsra
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
145 rorb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
146 lsra
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
147 rorb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
148 lsra
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
149 rorb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
150 lsra
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
151 rorb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
152 lsra
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
153 rorb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
154 ENDC
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
155 std <count
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
156 leax Dtable,pcr precalculated constants
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
157 leay DTEnd,pcr
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
158 pshs y
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
159 l3 cmpd ,x
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
160 bls a4 if fewer or equal # of entries get D
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
161 leax 4,x move to next table entry
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
162 cmpx ,s have we exhausted the table?
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
163 bne l3
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
164 leas 2,s restore the stack
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
165 lbra Tlarge should not be possible to get here in code
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
166 a4 leas 2,s restore the stack
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
167 ldd 2,x get shellsort D from table
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
168 std <D save working value
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
169 * Sort starts here
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
170 * Directory entries can't have duplicate names or the directory
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
171 * is corrupted. That means a<b is as good as a<=b when testing.
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
172 s2 ldd #1 initialize FOR/NEXT loop
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
173 std <i
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
174 ldd <count same as n in Basic09 program
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
175 subd <D
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
176 std <NminusD save value
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
177 * calculated pointer for entryID
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
178 s6 ldd <i FOR i=1 TO n-D STEP 1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
179 addd <D get pointer for entry(i+D)
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
180 lbsr point get the pointer value
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
181 stx <entryID
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
182 tfr x,y
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
183 * calculate pointer for entryI
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
184 ldd <i
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
185 lbsr point
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
186 stx <entryI
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
187 * Compare the entry pointed to by regX against that for regY
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
188 lbsr compare is name(i) < name(i+D)
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
189 bcs s20
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
190 ldx <entryID
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
191 leay Tx,u shellsort swap name holder
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
192 lbsr movexy name(Tx)=name(i+D)
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
193 ldx <entryI
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
194 ldy <entryID
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
195 bsr movexy name(i+D)=name(i)
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
196 ldd <i
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
197 cmpd <D
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
198 bhi s4 this was a Basic09 IF/THEN
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
199 ldy <entryI inside the IF/THEN
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
200 leax Tx,u
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
201 bsr movexy name(i)=name(Tx)
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
202 bra s20 ends the IF/THEN
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
203 s4 ldd <i initialize FOR/NEXT loop
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
204 subd <D
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
205 std <j
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
206 s5 bsr point FOR j=i-D TO 1 STEP -D
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
207 stx <entryJ
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
208 tfr x,y
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
209 leax Tx,u
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
210 lbsr compare is entry(Tx) > entry(j)
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
211 bcc s10
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
212 ldd <j
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
213 addd <D name(j+D)
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
214 bsr point
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
215 tfr x,y
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
216 ldx <entryJ
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
217 bsr movexy name(j+D)=name(j)
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
218 ldd <j NEXT j
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
219 subd <D STEP -D
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
220 std <j
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
221 cmpd #1 stop if less than 1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
222 bge s5
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
223 s10 leay Tx,u
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
224 ldd <j
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
225 addd <D
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
226 bsr point
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
227 exg x,y
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
228 bsr movexy name(j+D)=name(Tx)
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
229 s20 ldd <i NEXT i
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
230 addd #1 STEP +1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
231 std <i
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
232 cmpd <NminusD
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
233 bls s6 stop if i>(n-D)
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
234 ldd <D D=D/2
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
235 IFNE H6309
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
236 lsrd
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
237 ELSE
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
238 lsra
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
239 rorb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
240 ENDC
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
241 std <D
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
242 cmpd #1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
243 lbhs s2 WHILE D>0
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
244 lda <path rewind to just after .. & .
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
245 ldx #0
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
246 ldu #64
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
247 os9 I$Seek
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
248 lda <path
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
249 ldu <DPptr
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
250 leax buffer,u write out sorted directory
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
251 ldy <dirsize
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
252 os9 I$Write
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
253 clrb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
254 os9 F$Exit release memory, close paths, and return to OS-9
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
255
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
256 IFNE H6309
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
257 movexy ldw #32
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
258 tfm x+,y+
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
259 rts
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
260 ELSE
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
261 movexy ldb #16 move the entry pointed to in regX to
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
262 pshs b
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
263 sw1 ldd ,x++ that pointed to by regY
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
264 std ,y++
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
265 dec ,s if not finished, continue
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
266 bne sw1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
267 puls b,pc
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
268 ENDC
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
269
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
270 * Converts an index in regD to a memory offset in regX
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
271 * This could easily overflow but there are size checks
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
272 * in the above code so there is no overflow test.
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
273 point leax buffer,u
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
274 subd #1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
275 IFNE H6309
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
276 lsld
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
277 lsld
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
278 lsld
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
279 lsld
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
280 lsld
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
281 ELSE
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
282 lslb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
283 rola
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
284 lslb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
285 rola
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
286 lslb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
287 rola
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
288 lslb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
289 rola
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
290 lslb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
291 rola
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
292 ENDC
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
293 leax d,x
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
294 rts
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
295
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
296 compare ldb #29 size of name field
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
297 pshs b save counter
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
298 cloop ldb ,y+ get character
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
299 lda ,x+ get character
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
300 beq c1 if deleted go
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
301 tstb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
302 beq c2 if deleted go
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
303 tsta
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
304 bmi c5 if last character go
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
305 tstb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
306 bmi c6 if last character go
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
307 pshs b
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
308 cmpa ,s+
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
309 beq c4 if equal, test next character
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
310 bra cx
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
311 c1 clra
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
312 bra cx return +
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
313 c2 coma
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
314 bra cx return -
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
315 c3 anda #$7f
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
316 andb #$7f
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
317 pshs b
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
318 cmpa ,s+
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
319 rts
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
320 c5 bsr c3
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
321 beq c2
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
322 bra cx
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
323 c6 bsr c3
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
324 beq c1
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
325 bra cx return result
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
326 c4 dec ,s
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
327 bne cloop
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
328 clra should not be able to get here in code
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
329 cx puls b,pc return result
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
330
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
331 error leax nodir,pcr
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
332 ldy #endnd-nodir
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
333 write lda #1 screen
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
334 os9 I$Write
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
335 clrb
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
336 os9 F$Exit
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
337 nodir EQU *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
338 FCC /Directory does not exist!/
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
339 FCB C$CR,C$LF
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
340 endnd EQU *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
341
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
342 Tlarge leax big,pcr
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
343 ldy #endbig-big
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
344 bra write
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
345 big EQU *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
346 FCC /Either the directory is too large or there is insufficient /
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
347 FCC /memory./
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
348 FCB C$CR,C$LF
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
349 endbig EQU *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
350
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
351 getreal leax huh,pcr
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
352 ldy #endhuh-huh
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
353 clr ,-s
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
354 bra write
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
355 huh EQU *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
356 FCC /Get real! You can't sort less than 2 items./
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
357 FCB C$CR,C$LF
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
358 endhuh EQU *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
359
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
360 IFNE HELP
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
361 syntax leax usage,pcr
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
362 ldy #enduse-usage
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
363 clr ,-s
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
364 lbra write
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
365 usage FCC /USAGE: dirsort will sort any directory. If no directory/
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
366 FCB C$CR,C$LF
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
367 FCC / name is given, the current directory will be sorted./
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
368 FCB C$CR,C$LF
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
369 FCC /EX: dirsort dirsort . dirsort ../
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
370 FCB C$CR,C$LF
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
371 FCC " dirsort /dd/cmds"
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
372 FCB C$CR,C$LF
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
373 enduse EQU *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
374 ENDC
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
375
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
376 EMOD
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
377 Eom EQU *
df97c336e737 Converted to UNIX terminators
robert
parents: 1957
diff changeset
378 END