home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug004.ark / WDIR.M80 < prev    next >
Encoding:
Text File  |  1984-04-29  |  2.6 KB  |  118 lines

  1. /* WDIR - WIDE DIRECTORY LISTING */
  2. /* B.RATOFF  -  9/11/77 */
  3.  
  4. [INT FCB]
  5. [FCB := 5CH]
  6. [MACRO BUFF '80H']
  7. [MACRO MONLOC '5']
  8. [MACRO CR '0DH']
  9. [MACRO LF '0AH']
  10. [MACRO PCFUN '2']
  11. [MACRO ZERO '30H']
  12. [MACRO COLON '3AH']
  13. [MACRO SPACE '20H']
  14. [MACRO SFIRST '11H']
  15. [MACRO SNEXT '12H']
  16.  
  17. [MACRO PSHALL 'STACK = HL; STACK = DE; STACK = BC; STACK = PSW;']
  18. [MACRO POPALL 'PSW = STACK; BC = STACK; DE = STACK; HL = STACK;']
  19.  
  20.     DECLARE OSTACK(2) BYTE;
  21.  
  22. /* PRINT CHARACTER IN REGISTER E */
  23. PCHAR: PROCEDURE;
  24.     [PSHALL]
  25.     C = [PCFUN];
  26.     CALL [MONLOC];
  27.     [POPALL]
  28.     END    PCHAR;
  29.  
  30. /* PRINT A CR-LF SEQUENCE */
  31. CRLF:    PROCEDURE;
  32.     E = [CR];
  33.     CALL    PCHAR;
  34.     E = [LF];
  35.     CALL    PCHAR;
  36.     END    CRLF;
  37.  
  38. /* PRINT A SPACE */
  39. SPACE1:    PROCEDURE;
  40.     E = [SPACE];
  41.     CALL PCHAR;
  42.     END SPACE1;
  43.  
  44. /* PRINT 2 SPACES */
  45. SPACE2:    PROCEDURE;
  46.     CALL SPACE1;
  47.     CALL SPACE1;
  48.     END SPACE2;
  49.  
  50. /* PRINT B CHARS STARTING AT HL */
  51. DOSTR:    PROCEDURE;
  52.     REPEAT;
  53.        E=M(HL);
  54.        CALL PCHAR;
  55.        HL=HL+1;
  56.     UNTIL (B=B-1) ZERO;
  57.     END DOSTR;
  58.  
  59. /* FIND A FILENAME AND PRINT IT */
  60. DONAME:    PROCEDURE;
  61.     DE=[HEX FCB];
  62.     CALL [MONLOC];
  63.     IF (A::255) ZERO THEN    /* END OF DIRECTORY? */
  64.        DO; SP = (HL = OSTACK);
  65.            RETURN;        /* RESTORE CP/M'S SP & QUIT */
  66.        END;
  67.     B = 0;    /* CONVERT OFFSET RETURNED BY CP/M (0-3) */
  68.     A = A & 3;    /* INTO ADDRESS (BUFF+1,33,65,OR 97) */
  69.     A = >>A;
  70.     A = >>A;
  71.     A = >>A;
  72.     A = A + 1;
  73.     C = A;
  74.     HL = [BUFF] + BC;
  75.     B = 8;    /* PRINT FILENAME */
  76.     CALL DOSTR;
  77.     CALL SPACE1;
  78.     B = 3;    /* PRINT FILETYPE */
  79.     CALL DOSTR;
  80.     A=M(HL)+[ZERO];    /* PRINT EXTENT # IF NON-ZERO */
  81.     IF (A::[COLON]) !CY THEN A=A+7;
  82.     IF (A::[ZERO]) ZERO THEN
  83.        CALL SPACE2
  84.     ELSE DO; E='+';
  85.          CALL PCHAR;
  86.          E=A;
  87.          CALL PCHAR;
  88.          END;
  89.     END DONAME;
  90.  
  91. /* MAINLINE STARTS HERE */
  92. MAIN:    DECLARE NSTACK(20) BYTE;
  93.     OSTACK = (HL = 0 + SP);    /* SAVE CP/M'S SP FOR RETURN */
  94.     SP = .NSTACK(20);    /* SET UP OUR OWN STACK */
  95.     /* WAS A FILE SPEC GIVEN? */
  96.     IF (HL=[HEX FCB+1]; A=[SPACE]; A::M(HL)) ZERO THEN
  97.     DO; B = 11;    /* NO, SO FORCE IT TO ????????.??? */
  98.         REPEAT;
  99.         M(HL) = '?';
  100.         HL = HL + 1;
  101.         UNTIL (B = B - 1) ZERO;
  102.     END;
  103.     M([HEX FCB+12])=(A='?');    /* MATCH ALL EXTENTS */
  104.     C = [SFIRST];    /* GIVE INITIAL SEARCH CALL */
  105.     CALL DONAME;
  106.     CALL SPACE2;
  107.     STACK = (BC = 300H);    /* 3 MORE NAMES ON THIS LINE */
  108. DLOOP:    C = [SNEXT];    /* 'FIND NEXT' FDOS CALL */
  109.     CALL DONAME;
  110.     IF (BC = STACK; B=B-1; STACK = BC) !ZERO THEN
  111.         CALL SPACE2    /* MORE ON THIS LINE */
  112.     ELSE    DO; BC = STACK;    /* GO TO NEXT LINE */
  113.             STACK = (BC = 400H);
  114.             CALL CRLF;
  115.         END;
  116.     GOTO DLOOP;    /* EITHER WAY, GO GET ANOTHER NAME */
  117. EOF
  118.