Commit | Line | Data |
---|---|---|
10577efa KT |
1 | / ls -- list file or directory |
2 | ||
3 | .globl flush | |
4 | .globl fopen | |
5 | .globl getw | |
6 | .globl getc | |
7 | .globl putc | |
8 | .globl ctime | |
9 | .globl end | |
10 | ||
11 | sys break; end+512. | |
12 | mov $1,obuf | |
13 | mov sp,r5 | |
14 | mov (r5)+,count | |
15 | tst (r5)+ | |
16 | dec count | |
17 | mov count,ocount | |
18 | bgt loop | |
19 | mov $dotp,r5 | |
20 | loop: | |
21 | mov (r5)+,r4 | |
22 | cmpb (r4)+,$'- | |
23 | bne 1f | |
24 | dec ocount | |
25 | 3: | |
26 | movb (r4)+,r0 | |
27 | beq eloop | |
28 | cmp r0,$'l | |
29 | bne 4f | |
30 | inc longf | |
31 | br 3b | |
32 | 4: | |
33 | cmpb r0,$'t | |
34 | bne 4f | |
35 | mov $14.,sortoff | |
36 | br 3b | |
37 | 4: | |
38 | cmpb r0,$'a | |
39 | bne 4f | |
40 | inc allflg | |
41 | br 3b | |
42 | 4: | |
43 | cmpb r0,$'s | |
44 | bne 4f | |
45 | incb longf+1 | |
46 | br 3b | |
47 | 4: | |
48 | cmpb r0,$'d | |
49 | bne 3b | |
50 | inc dirflg | |
51 | br 3b | |
52 | 1: | |
53 | dec r4 | |
54 | jsr pc,do | |
55 | eloop: | |
56 | dec count | |
57 | bgt loop | |
58 | tst dnp | |
59 | bne 1f | |
60 | mov $dotp,r5 | |
61 | br loop | |
62 | 1: | |
63 | jsr r5,flush; obuf | |
64 | sys exit | |
65 | ||
66 | do: | |
67 | clr tblocks | |
68 | mov $end,r1 | |
69 | mov $filnam,r3 | |
70 | mov r4,dnp | |
71 | clr isadir | |
72 | tst dirflg | |
73 | bne nondir | |
74 | sys stat; dnp: 0; statb | |
75 | bec 1f | |
76 | jsr r5,questf; < nonexistent\n\0>; .even | |
77 | rts pc | |
78 | 1: | |
79 | bit $40000,statb+2 /test directory | |
80 | beq nondir | |
81 | inc isadir | |
82 | mov r4,r0 | |
83 | jsr r5,fopen; dbuf | |
84 | bcc 1f | |
85 | jsr r5,questf; < unreadable\n\0>; .even | |
86 | rts pc | |
87 | 1: | |
88 | movb (r4)+,(r3)+ | |
89 | bne 1b | |
90 | dec r3 | |
91 | cmpb -1(r3),$'/ | |
92 | beq 1f | |
93 | movb $'/,(r3)+ | |
94 | 1: | |
95 | jsr r5,getw; dbuf | |
96 | bcs pass2 | |
97 | mov $4,-(sp) | |
98 | tst r0 | |
99 | bne 2f | |
100 | 3: | |
101 | jsr r5,getw; dbuf | |
102 | dec (sp) | |
103 | bne 3b | |
104 | tst (sp)+ | |
105 | br 1b | |
106 | 2: | |
107 | mov r3,r2 | |
108 | 2: | |
109 | jsr r5,getw; dbuf | |
110 | mov r0,(r1)+ | |
111 | movb r0,(r2)+ | |
112 | swab r0 | |
113 | movb r0,(r2)+ | |
114 | dec (sp) | |
115 | bne 2b | |
116 | tst (sp)+ | |
117 | clrb (r2)+ | |
118 | tst allflg | |
119 | bne 2f | |
120 | cmpb (r3),$'. | |
121 | bne 2f | |
122 | sub $8.,r1 | |
123 | br 1b | |
124 | 2: | |
125 | jsr r5,gstat | |
126 | br 1b | |
127 | nondir: | |
128 | mov r3,r2 | |
129 | 1: | |
130 | movb (r4)+,(r2)+ | |
131 | bne 1b | |
132 | 1: | |
133 | cmp r2,r3 | |
134 | blos 1f | |
135 | cmpb -(r2),$'/ | |
136 | bne 1b | |
137 | inc r2 | |
138 | 1: | |
139 | mov $8.,-(sp) | |
140 | 1: | |
141 | movb (r2)+,(r1)+ | |
142 | bne 2f | |
143 | dec r2 | |
144 | 2: | |
145 | dec (sp) | |
146 | bne 1b | |
147 | jsr r5,gstat | |
148 | tst (sp)+ | |
149 | ||
150 | pass2: | |
151 | mov dbuf,r0 | |
152 | sys close | |
153 | mov $end,r2 | |
154 | cmp r1,r2 | |
155 | bne 1f | |
156 | rts pc | |
157 | 1: | |
158 | mov r5,-(sp) | |
159 | mov r1,-(sp) | |
160 | add sortoff,r2 | |
161 | 1: | |
162 | mov r2,(r1)+ | |
163 | add $20.,r2 | |
164 | cmp r2,(sp) | |
165 | blo 1b | |
166 | mov (sp),r2 | |
167 | tst -(r1) | |
168 | 1: | |
169 | mov r2,r3 | |
170 | 2: | |
171 | tst (r3)+ | |
172 | cmp r3,r1 | |
173 | bhi 2f | |
174 | mov (r2),r4 | |
175 | mov (r3),r5 | |
176 | tst sortoff | |
177 | beq 4f | |
178 | cmp (r4)+,(r5)+ | |
179 | blo 3f | |
180 | bhi 2b | |
181 | cmp (r4)+,(r5)+ | |
182 | blo 3f | |
183 | br 2b | |
184 | 4: | |
185 | 4: | |
186 | cmpb (r4)+,(r5)+ | |
187 | bhi 3f | |
188 | blo 2b | |
189 | dec r0 | |
190 | br 4b | |
191 | 3: | |
192 | mov (r2),-(sp) | |
193 | mov (r3),(r2) | |
194 | mov (sp)+,(r3) | |
195 | br 2b | |
196 | 2: | |
197 | tst (r2)+ | |
198 | cmp r2,r1 | |
199 | blo 1b | |
200 | 1: | |
201 | mov (sp)+,r2 | |
202 | mov (sp)+,r5 | |
203 | ||
204 | pass3: | |
205 | cmp ocount,$1 | |
206 | ble 1f | |
207 | tst isadir | |
208 | beq 2f | |
209 | mov dnp,0f | |
210 | jsr r5,pstring; 0:.. | |
211 | jsr r5,pstring; colon | |
212 | 1: | |
213 | tst longf | |
214 | beq 1f | |
215 | jsr r5,pstring; totmes | |
216 | mov tblocks,r0 | |
217 | jsr r5,decimal; 4 | |
218 | jsr r5,pstring; nl | |
219 | 2: | |
220 | tstb longf | |
221 | beq 1f | |
222 | mov $passwd,r0 | |
223 | jsr r5,fopen; iobuf | |
224 | bes 1f | |
225 | mov $uidbuf,r3 | |
226 | 3: | |
227 | 2: | |
228 | jsr r5,getc; iobuf | |
229 | bes 3f | |
230 | movb r0,(r3)+ | |
231 | cmpb r0,$': | |
232 | bne 2b | |
233 | 2: | |
234 | jsr r5,getc; iobuf | |
235 | cmpb r0,$': | |
236 | bne 2b | |
237 | 2: | |
238 | jsr r5,getc; iobuf | |
239 | cmpb r0,$': | |
240 | beq 2f | |
241 | movb r0,(r3)+ | |
242 | br 2b | |
243 | 2: | |
244 | movb $'\n,(r3)+ | |
245 | cmp r3,$euidbuf | |
246 | bhis 3f | |
247 | 2: | |
248 | jsr r5,getc; iobuf | |
249 | cmpb r0,$'\n | |
250 | bne 2b | |
251 | br 3b | |
252 | 3: | |
253 | mov r3,euids | |
254 | sys close | |
255 | 1: | |
256 | cmp r2,r1 | |
257 | bhi 1f | |
258 | mov (r2)+,r3 | |
259 | sub sortoff,r3 | |
260 | jsr r5,pentry | |
261 | mov $8.,-(sp) | |
262 | 2: | |
263 | movb (r3)+,r0 | |
264 | beq 2f | |
265 | jsr r5,putc; obuf | |
266 | dec (sp) | |
267 | bne 2b | |
268 | 2: | |
269 | tst (sp)+ | |
270 | jsr r5,pstring; nl | |
271 | br 1b | |
272 | 1: | |
273 | cmp ocount,$1 | |
274 | ble 1f | |
275 | tst isadir | |
276 | beq 1f | |
277 | jsr r5,pstring; nl | |
278 | 1: | |
279 | rts pc | |
280 | ||
281 | pentry: | |
282 | mov r2,-(sp) | |
283 | tstb longf | |
284 | bne listl | |
285 | tstb longf+1 | |
286 | bne 2f | |
287 | mov (sp)+,r2 | |
288 | rts r5 | |
289 | 2: | |
290 | mov 12.(r3),r0 | |
291 | jsr r5,calcb | |
292 | jsr r5,decimal; 3 | |
293 | jsr r5,pstring; space | |
294 | mov (sp)+,r2 | |
295 | rts r5 | |
296 | pstring: | |
297 | mov r5,-(sp) | |
298 | mov (r5),r5 | |
299 | 1: | |
300 | movb (r5)+,r0 | |
301 | beq 1f | |
302 | jsr r5,putc; obuf | |
303 | br 1b | |
304 | 1: | |
305 | mov (sp)+,r5 | |
306 | tst (r5)+ | |
307 | rts r5 | |
308 | ||
309 | questf: | |
310 | mov r4,0f | |
311 | jsr r5,pstring; 0:.. | |
312 | mov r5,0f | |
313 | jsr r5,pstring; 0:.. | |
314 | 1: | |
315 | tstb (r5)+ | |
316 | bne 1b | |
317 | inc r5 | |
318 | bic $1,r5 | |
319 | rts r5 | |
320 | listl: | |
321 | mov 18.(r3),r0 / inode | |
322 | jsr r5,decimal; 4 | |
323 | jsr r5,pstring; space | |
324 | mov r3,r4 | |
325 | add $8.,r4 / get to flags | |
326 | bit $10000,(r4) /large | |
327 | beq 2f | |
328 | jsr r5,mode; 'l | |
329 | br 3f | |
330 | 2: | |
331 | jsr r5,mode; 's | |
332 | 3: | |
333 | bit $40000,(r4) /directory | |
334 | beq 2f | |
335 | jsr r5,mode; 'd | |
336 | br 3f | |
337 | 2: | |
338 | bit $40,(r4) /set uid | |
339 | beq 2f | |
340 | jsr r5,mode; 'u | |
341 | br 3f | |
342 | 2: | |
343 | bit $20,(r4) /executable | |
344 | beq 2f | |
345 | jsr r5,mode; 'x | |
346 | br 3f | |
347 | 2: | |
348 | jsr r5,mode; '- | |
349 | 3: | |
350 | bit $10,(r4) /read owner | |
351 | beq 2f | |
352 | jsr r5,mode; 'r | |
353 | br 3f | |
354 | 2: | |
355 | jsr r5, mode; '- | |
356 | 3: | |
357 | bit $4,(r4) /write owner | |
358 | beq 2f | |
359 | jsr r5,mode; 'w | |
360 | br 3f | |
361 | 2: | |
362 | jsr r5,mode; '- | |
363 | 3: | |
364 | bit $2,(r4) /read non-owner | |
365 | beq 2f | |
366 | jsr r5,mode; 'r | |
367 | br 3f | |
368 | 2: | |
369 | jsr r5,mode; '- | |
370 | 3: | |
371 | bit $1,(r4)+ /write non-owner | |
372 | beq 2f | |
373 | jsr r5,mode; 'w | |
374 | br 3f | |
375 | 2: | |
376 | jsr r5,mode; '- | |
377 | 3: | |
378 | jsr r5,pstring; space | |
379 | movb (r4)+,r0 | |
380 | jsr r5,decimal; 2 | |
381 | movb (r4)+,r2 | |
382 | jsr pc,puid | |
383 | mov (r4)+,r0 | |
384 | jsr r5,decimal; 5 | |
385 | jsr r5,pstring; space | |
386 | mov r1,-(sp) | |
387 | mov (r4)+,r0 | |
388 | mov (r4)+,r1 | |
389 | sub $16.,sp | |
390 | mov sp,r2 | |
391 | jsr pc,ctime | |
392 | mov sp,r2 | |
393 | mov $15.,-(sp) | |
394 | 1: | |
395 | movb (r2)+,r0 | |
396 | jsr r5,putc; obuf | |
397 | dec (sp) | |
398 | bne 1b | |
399 | add $18.,sp | |
400 | mov (sp)+,r1 | |
401 | jsr r5,pstring; space | |
402 | mov (sp)+,r2 | |
403 | rts r5 | |
404 | ||
405 | puid: | |
406 | mov r1,-(sp) | |
407 | mov $uidbuf,r1 | |
408 | 1: | |
409 | cmp r1,euids | |
410 | bhis 1f | |
411 | mov r1,0f | |
412 | 2: | |
413 | tstb (r1)+ | |
414 | beq 3f | |
415 | cmpb -1(r1),$': | |
416 | bne 2b | |
417 | clrb -1(r1) | |
418 | 3: | |
419 | clr -(sp) | |
420 | 3: | |
421 | movb (r1)+,r0 | |
422 | sub $'0,r0 | |
423 | cmp r0,$9. | |
424 | bhi 3f | |
425 | mov r1,-(sp) | |
426 | mov 2(sp),r1 | |
427 | mpy $10.,r1 | |
428 | add r0,r1 | |
429 | mov r1,2(sp) | |
430 | mov (sp)+,r1 | |
431 | br 3b | |
432 | 3: | |
433 | mov (sp)+,r0 | |
434 | cmp r0,r2 | |
435 | bne 1b | |
436 | jsr r5,pstring; space | |
437 | jsr r5,pstring; 0:.. | |
438 | mov 0b,r1 | |
439 | mov $6,-(sp) | |
440 | 3: | |
441 | tstb (r1)+ | |
442 | beq 3f | |
443 | dec (sp) | |
444 | br 3b | |
445 | 3: | |
446 | jsr r5,pstring; space | |
447 | dec (sp) | |
448 | bgt 3b | |
449 | tst (sp)+ | |
450 | mov (sp)+,r1 | |
451 | rts pc | |
452 | 1: | |
453 | jsr r5,pstring; space | |
454 | mov r2,r0 | |
455 | jsr r5,decimal; 3 | |
456 | jsr r5,pstring; space3 | |
457 | mov (sp)+,r1 | |
458 | rts pc | |
459 | ||
460 | mode: | |
461 | mov (r5)+,r0 | |
462 | jsr r5,putc; obuf | |
463 | rts r5 | |
464 | ||
465 | ||
466 | gstat: | |
467 | mov r1,-(sp) | |
468 | add $512.,r1 | |
469 | cmp r1,0f | |
470 | blo 1f | |
471 | mov r1,0f | |
472 | sys break; 0: end+512. | |
473 | 1: | |
474 | mov (sp)+,r1 | |
475 | tst longf | |
476 | bne 2f | |
477 | tst sortoff | |
478 | beq 1f | |
479 | 2: | |
480 | sys stat; filnam; statb | |
481 | bec 2f | |
482 | mov r4,-(sp) | |
483 | mov $filnam,r4 | |
484 | jsr r5,questf; < unstatable\n\0>; .even | |
485 | mov (sp)+,r4 | |
486 | add $12.,r1 | |
487 | rts r5 | |
488 | 2: | |
489 | mov $statb+2,r0 | |
490 | mov (r0)+,(r1)+ /flags | |
491 | mov (r0)+,(r1)+ /nlinks, uid | |
492 | mov r0,-(sp) | |
493 | mov (r0),r0 | |
494 | jsr r5,calcb | |
495 | add r0,tblocks | |
496 | mov (sp)+,r0 | |
497 | mov (r0)+,(r1)+ /size | |
498 | add $20.,r0 /dska, ctim | |
499 | mov (r0)+,(r1)+ /mtim | |
500 | mov (r0)+,(r1)+ | |
501 | mov statb,(r1)+ /inode | |
502 | rts r5 | |
503 | 1: | |
504 | add $12.,r1 | |
505 | rts r5 | |
506 | ||
507 | decimal: | |
508 | mov r1,-(sp) | |
509 | mov r2,-(sp) | |
510 | mov r3,-(sp) | |
511 | mov $6,r2 | |
512 | mov $numbuf+6,r3 | |
513 | 1: | |
514 | mov r0,r1 | |
515 | clr r0 | |
516 | dvd $10.,r0 | |
517 | add $'0,r1 | |
518 | movb r1,-(r3) | |
519 | sob r2,1b | |
520 | 1: | |
521 | cmp r3,$numbuf+5 | |
522 | beq 1f | |
523 | cmpb (r3),$'0 | |
524 | bne 1f | |
525 | movb $' ,(r3)+ | |
526 | br 1b | |
527 | 1: | |
528 | mov $numbuf+6,r1 | |
529 | sub (r5),r1 | |
530 | mov (r5)+,-(sp) | |
531 | 1: | |
532 | movb (r1)+,r0 | |
533 | jsr r5,putc; obuf | |
534 | dec (sp) | |
535 | bne 1b | |
536 | tst (sp)+ | |
537 | mov (sp)+,r3 | |
538 | mov (sp)+,r2 | |
539 | mov (sp)+,r1 | |
540 | rts r5 | |
541 | ||
542 | calcb: | |
543 | add $511.,r0 | |
544 | clrb r0 | |
545 | swab r0 | |
546 | asr r0 | |
547 | cmp r0,$8 | |
548 | blo 1f | |
549 | inc r0 | |
550 | 1: | |
551 | 1: | |
552 | rts r5 | |
553 | ||
554 | ||
555 | dotp: dot | |
556 | euids: uidbuf | |
557 | ||
558 | dot: <.\0> | |
559 | nl: <\n\0> | |
560 | totmes: <total \0> | |
561 | space3: < > | |
562 | space: < \0> | |
563 | passwd: </etc/passwd\0> | |
564 | colon: <:\n\0> | |
565 | .even | |
566 | ||
567 | .bss | |
568 | ||
569 | count: .=.+2 | |
570 | ocount: .=.+2 | |
571 | longf: .=.+2 | |
572 | sortoff: .=.+2 | |
573 | allflg: .=.+2 | |
574 | dirflg: .=.+2 | |
575 | isadir: .=.+2 | |
576 | filnam: .=.+32. | |
577 | statb: .=.+34. | |
578 | dbuf: .=.+518. | |
579 | obuf: .=.+518. | |
580 | numbuf: .=.+6 | |
581 | tblocks: .=.+2 | |
582 | uidbuf: .=.+1024. | |
583 | euidbuf: | |
584 | iobuf: .=.+518. | |
585 | ||
586 | (sp)+,r3 | |
587 | mov (sp)+,r2 | |
588 | mov (sp)+,r1 | |
589 | rts r5 | |
590 | ||
591 | calcb: | |
592 | add $511.,r0 | |
593 | clrb r0 | |
594 | swab r0 | |
595 | asr r0 | |
596 | cmp r0,$8 | |
597 | blo 1f | |
598 | inc r0 | |
599 | 1: | |
600 | 1: | |
601 | rts r5 | |
602 | ||
603 | ||
604 | dotp: dot | |
605 | euids: uidbuf | |
606 | ||
607 | dot: <.\0> | |
608 | nl: <\n\0> | |
609 | totmes: <total \0> | |
610 | space3: < > | |
611 | space: < \0> | |
612 | passwd: </etc/passwd\0> | |
613 | colon: <:\n\0> | |
614 | .even | |
615 | ||
616 | .bss | |
617 | ||
618 | count: .=.+2 | |
619 | ocount: .=.+2 | |
620 | longf: .=.+2 | |
621 | sortoff: .=.+2 | |
622 | allflg: .=.+2 | |
623 | dirflg: .=.+2 | |
624 | isadir: .=.+2 | |
625 | filnam: .=.+32. | |
626 | statb: .=.+34. | |
627 | dbuf: .=.+518. | |
628 | obuf: .=.+518. | |
629 | numbuf: .=.+6 | |
630 | tblocks: .=.+2 | |
631 | uidbuf: .=.+1024. | |
632 | euidbuf: | |
633 | iobuf: .=.+518. |