home *** CD-ROM | disk | FTP | other *** search
- /* WDIR - WIDE DIRECTORY LISTING */
- /* B.RATOFF - 9/11/77 */
-
- [INT FCB]
- [FCB := 5CH]
- [MACRO BUFF '80H']
- [MACRO MONLOC '5']
- [MACRO CR '0DH']
- [MACRO LF '0AH']
- [MACRO PCFUN '2']
- [MACRO ZERO '30H']
- [MACRO COLON '3AH']
- [MACRO SPACE '20H']
- [MACRO SFIRST '11H']
- [MACRO SNEXT '12H']
-
- [MACRO PSHALL 'STACK = HL; STACK = DE; STACK = BC; STACK = PSW;']
- [MACRO POPALL 'PSW = STACK; BC = STACK; DE = STACK; HL = STACK;']
-
- DECLARE OSTACK(2) BYTE;
-
- /* PRINT CHARACTER IN REGISTER E */
- PCHAR: PROCEDURE;
- [PSHALL]
- C = [PCFUN];
- CALL [MONLOC];
- [POPALL]
- END PCHAR;
-
- /* PRINT A CR-LF SEQUENCE */
- CRLF: PROCEDURE;
- E = [CR];
- CALL PCHAR;
- E = [LF];
- CALL PCHAR;
- END CRLF;
-
- /* PRINT A SPACE */
- SPACE1: PROCEDURE;
- E = [SPACE];
- CALL PCHAR;
- END SPACE1;
-
- /* PRINT 2 SPACES */
- SPACE2: PROCEDURE;
- CALL SPACE1;
- CALL SPACE1;
- END SPACE2;
-
- /* PRINT B CHARS STARTING AT HL */
- DOSTR: PROCEDURE;
- REPEAT;
- E=M(HL);
- CALL PCHAR;
- HL=HL+1;
- UNTIL (B=B-1) ZERO;
- END DOSTR;
-
- /* FIND A FILENAME AND PRINT IT */
- DONAME: PROCEDURE;
- DE=[HEX FCB];
- CALL [MONLOC];
- IF (A::255) ZERO THEN /* END OF DIRECTORY? */
- DO; SP = (HL = OSTACK);
- RETURN; /* RESTORE CP/M'S SP & QUIT */
- END;
- B = 0; /* CONVERT OFFSET RETURNED BY CP/M (0-3) */
- A = A & 3; /* INTO ADDRESS (BUFF+1,33,65,OR 97) */
- A = >>A;
- A = >>A;
- A = >>A;
- A = A + 1;
- C = A;
- HL = [BUFF] + BC;
- B = 8; /* PRINT FILENAME */
- CALL DOSTR;
- CALL SPACE1;
- B = 3; /* PRINT FILETYPE */
- CALL DOSTR;
- A=M(HL)+[ZERO]; /* PRINT EXTENT # IF NON-ZERO */
- IF (A::[COLON]) !CY THEN A=A+7;
- IF (A::[ZERO]) ZERO THEN
- CALL SPACE2
- ELSE DO; E='+';
- CALL PCHAR;
- E=A;
- CALL PCHAR;
- END;
- END DONAME;
-
- /* MAINLINE STARTS HERE */
- MAIN: DECLARE NSTACK(20) BYTE;
- OSTACK = (HL = 0 + SP); /* SAVE CP/M'S SP FOR RETURN */
- SP = .NSTACK(20); /* SET UP OUR OWN STACK */
- /* WAS A FILE SPEC GIVEN? */
- IF (HL=[HEX FCB+1]; A=[SPACE]; A::M(HL)) ZERO THEN
- DO; B = 11; /* NO, SO FORCE IT TO ????????.??? */
- REPEAT;
- M(HL) = '?';
- HL = HL + 1;
- UNTIL (B = B - 1) ZERO;
- END;
- M([HEX FCB+12])=(A='?'); /* MATCH ALL EXTENTS */
- C = [SFIRST]; /* GIVE INITIAL SEARCH CALL */
- CALL DONAME;
- CALL SPACE2;
- STACK = (BC = 300H); /* 3 MORE NAMES ON THIS LINE */
- DLOOP: C = [SNEXT]; /* 'FIND NEXT' FDOS CALL */
- CALL DONAME;
- IF (BC = STACK; B=B-1; STACK = BC) !ZERO THEN
- CALL SPACE2 /* MORE ON THIS LINE */
- ELSE DO; BC = STACK; /* GO TO NEXT LINE */
- STACK = (BC = 400H);
- CALL CRLF;
- END;
- GOTO DLOOP; /* EITHER WAY, GO GET ANOTHER NAME */
- EOF
-