home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol009 / mdir8-17.asm < prev    next >
Assembly Source File  |  1984-04-29  |  10KB  |  464 lines

  1. ;            MDIR.ASM
  2. ;             revised 8/17/80
  3. ;
  4. ;       CP/M-2 MASTER DISK DIRECTORY PROGRAM
  5. ;            by Jeff Hammersley, MD.
  6. ;
  7. ; PRINTS A COMPLETE DISK DIRECTORY INCLUDING ALL USERS,
  8. ; SORTED ALPHABETICALLY AND PRINTED 4 WIDE.
  9. ;
  10. ; Based on 'FMAP' as originally written by Ward Christensen
  11. ; and its subsequent evolution to 'SDIR' by Keith Petersen.
  12. ;
  13. ;---------------------------------------------------------------;
  14. ;                                ;
  15. ; Commands:                            ;
  16. ;                                ;
  17. ; MDIR      returns all files on the default disk under any user.    ;
  18. ;                                ;
  19. ; Note: optional drive name may be specified.            ;
  20. ;                                ;
  21. ;                                ;
  22. ; MDIR FILENAME.FILETYPE    searches for all files that match    ;
  23. ;        in all user areas.                ;
  24. ;                                ;
  25. ; MDIR S???.*  returns all 4 character files with any extention    ;
  26. ;        in any user areas.                ;
  27. ;                                ;
  28. ;_______________________________________________________________;
  29. ;07/02/80 FIXED TO ALLOW MORE THAN 256 NAMES IN DIRECTORY,
  30. ;      PRINT DRIVE NAME, AND ALLOW SPECIFYING DRIVE.
  31. ;      BY KEITH PETERSEN, W8SDZ.
  32. ;
  33. ;07/30/80 FIXED TO ELIMINATE CRASH WHEN NO NAMES ARE IN
  34. ;      DIRECTORY. REPLACED DECIMAL OUTPUT ROUTINE WITH
  35. ;      SIMPLER ONE WHICH IS SMALLER AND ALLOWS USE OF
  36. ;      ONE LESS LEADING SPACE SO DISPLAY CAN BE PRINTED
  37. ;      ON A 72-CHARACTER PRINTER. (KBP)
  38. ;
  39. ;08/17/80 CORRECTED MISSING INR A IN SEARCH FIRST ROUTINE,
  40. ;      WHICH CAUSED DUPLICATE LISTING OF THIRD DIRECTORY
  41. ;      ENTRY. (KBP)
  42. ;
  43. BASE    SET    0
  44. ;
  45. ALTCPM    EQU    0    ;PUT 1 HERE FOR H8 OR TRS-80 CP/M
  46. ;
  47.     IF    ALTCPM
  48. BASE    SET    4200H
  49.     ENDIF
  50. ;
  51. NAMES    EQU    256    ;MAX NUMBER OF NAMES IN DIRECTORY
  52. ;
  53. FCB    EQU    BASE+5CH ;SYSTEM FCB
  54. NPL    EQU    4    ;NUMBER OF NAMES PER LINE
  55. CR    EQU    0DH    ;CARRIAGE RETURN
  56. LF    EQU    0AH    ;LINE FEED
  57. DELIM    EQU    ':'    ;FENCE (DELIMITER) CHARACTER
  58. ;
  59.     ORG    BASE+100H
  60. ;
  61.     JMP    START    ;JUMP AROUND I.D.
  62.     DB    'MDIR.COM 8/17/80 '
  63. ;
  64. ;SAVE THE STACK
  65. START    LXI    H,0
  66.     DAD    SP    ;H=STACK
  67.     SHLD    STACK    ;SAVE IT
  68.     LXI    SP,STACK ;GET NEW STACK
  69.     LDA    FCB
  70.     ORA    A    ;ANY DRIVE SPECIFIED?
  71.     JZ    FSPEC2
  72.     DCR    A    ;CORRECT DISK NUMBER FOR CP/M
  73.     PUSH    PSW    ;SAVE REQUESTED DISK NUMBER
  74.     MVI    C,CURDSK ;FIND OUT WHERE WE'RE LOGGED
  75.     CALL    BDOS
  76.     STA    CDSK    ;SAVE IT FOR LATER
  77.     POP    PSW    ;GET REQUESTED DISK NR.
  78.     MOV    E,A    ;TO E FOR CP/M
  79.     MVI    C,SELDSK ;SELECT DISK REQUESTED
  80.     CALL    BDOS
  81. ;
  82. FSPEC2    MVI    C,CURDSK ;FIND OUT WHERE WE'RE LOGGED
  83.     CALL    BDOS
  84.     ADI    'A'    ;MAKE PRINTABLE
  85.     STA    DRNAME
  86. ;PRINT HEADER
  87.     CALL    FSPEC3
  88.     DB    CR,LF
  89.     DB    '.. MASTER DIRECTORY - DRIVE '
  90. DRNAME    DB    'X:'
  91.     DB    CR,LF,CR,LF,'$'
  92. ;
  93. FSPEC3    POP    D
  94.     MVI    C,PRINT
  95.     CALL    BDOS
  96.     LXI    H,FCB+1
  97.     MOV    A,M    ;GET 1ST CHAR. OF NAME REQUEST
  98.     STA    SAVFCB    ;SAVE FOR LATER
  99. ;
  100. ;MAKE DR FIELD OF FCB '?' TO FORCE RETURN OF ALL USER ENTRIES
  101.     DCX    H    ;POINT TO DR FIELD
  102.     MVI    M,'?'    ;STORE '?' IN FCB
  103. ;
  104. ;RETURN ALL DIRECTORY ENTRIES
  105.     MVI    C,FSRCHF ;GET 'SEARCH FIRST' FNC
  106.     LXI    D,FCB
  107.     CALL    BDOS    ;READ FIRST
  108.     INR    A    ;COMPENSATE FOR LATER DCR
  109.     JMP    SOME    ;GOT SOME (BECAUSE OF ? IN DR FIELD)
  110. ;
  111. ;READ MORE DIRECTORY ENTRIES
  112. MOREDIR    MVI    C,FSRCHN ;SEARCH NEXT
  113.     LXI    D,FCB
  114.     CALL    BDOS    ;READ DIR ENTRY
  115.     INR    A    ;CHECK FOR END (0FFH)
  116.     JZ    SPRINT    ;NO MORE - SORT & PRINT
  117. ;POINT TO DIRECTORY ENTRY 
  118. SOME    DCR    A    ;UNDO PREV 'INR A'
  119.     ANI    3    ;MAKE MODULUS 4
  120.     ADD    A    ;MULTIPLY...
  121.     ADD    A    ;..BY 32 BECAUSE
  122.     ADD    A    ;..EACH DIRECTORY
  123.     ADD    A    ;..ENTRY IS 32
  124.     ADD    A    ;..BYTES LONG
  125.     LXI    H,BASE+80H ;POINT TO BUFFER
  126.     ADD    L    ;POINT TO ENTRY
  127.     MOV    L,A    ;SAVE (CAN'T CARRY TO H)
  128. ;MOVE ENTRY TO TABLE
  129.     MOV    A,M    ;GET DR FIELD
  130.     CPI    0E5H    ;IS IT AN ERASED FILE ?
  131.     JZ    MOREDIR    ;YES, IGNORE AND GET ANOTHER
  132.     MOV    D,H    ;ENTRY TO DE
  133.     MOV    E,L
  134.     MVI    A,12    ;GET OFFSET TO EXTENT BYTE
  135.     ADD    L    ;ADD TO GET CORRECT POINTER
  136.     MOV    L,A
  137.     MOV    A,M    ;GET EXTENT BYTE
  138.     ORA    A    ;IS EXTENT OTHER THAN ZERO ?
  139.     JNZ    MOREDIR    ;IGNORE ALL EXTENTS BEYOND THE FIRST
  140.     LHLD    NEXTT    ;NEXT TABLE ENTRY TO HL
  141.     MVI    B,12    ;ENTRY LENGTH
  142. ;
  143. TMOVE    LDAX    D    ;GET ENTRY CHAR
  144.     ANI    7FH    ;REMOVE ATTRIBUTES
  145.     MOV    M,A    ;STORE IN TABLE
  146.     INX    D
  147.     INX    H
  148.     DCR    B    ;MORE?
  149.     JNZ    TMOVE
  150.     SHLD    NEXTT    ;SAVE UPDATED TABLE ADDR
  151.     LHLD    COUNT    ;GET PREV COUNT
  152.     INX    H    ;ADD ONE
  153.     SHLD    COUNT    ;RESAVE COUNT
  154.     JMP    MOREDIR
  155. ;
  156. ;SORT AND PRINT
  157. SPRINT    LHLD    COUNT    ;GET COUNT
  158.     MOV    A,H
  159.     ORA    L    ;CHECK FOR ZERO COUNT
  160.     JZ    NFEXIT    ;NOTHING IN DIRECTORY, EXIT
  161.     SHLD    OCOUNT    ;SAVE FOR ORDER TABLE COUNT
  162.     SHLD    SCOUNT    ;SAVE FOR SORT COUNT
  163.     LXI    H,ORDER
  164.     LXI    D,TABLE
  165.     LXI    B,12    ;ENTRY LENGTH
  166. ;
  167. BLDORD    MOV    M,E    ;SAVE LO ORD ADDR
  168.     INX    H
  169.     MOV    M,D    ;SAVE HI ORD ADDR
  170.     INX    H
  171.     XCHG        ;TABLE ADDR TO HL
  172.     DAD    B    ;POINT TO NEXT ENTRY
  173.     XCHG        ;NEXT ENTRY TO DE
  174.     PUSH    H
  175.     LHLD    OCOUNT    ;GET COUNT
  176.     DCX    H    ;ONE LESS
  177.     SHLD    OCOUNT    ;SAVE NEW COUNT
  178.     MOV    A,L
  179.     ORA    H    ;MORE?
  180.     POP    H
  181.     JNZ    BLDORD    ;..YES
  182.     LHLD    COUNT    ;GET COUNT
  183.     DCX    H
  184.     MOV    A,L
  185.     ORA    H    ;ONLY 1 ENTRY?
  186.     JZ    DONE    ;..YES, SO SKIP SORT
  187. ;
  188. SORT    XRA    A    ;GET A ZERO
  189.     STA    SWITCH    ;SHOW NONE SWITCHED
  190.     LHLD    SCOUNT    ;GET COUNT
  191.     DCX    H    ;USE 1 LESS
  192.     SHLD    TEMP    ;SAVE # TO COMPARE
  193.     SHLD    SCOUNT    ;SAVE HIGHEST ENTRY
  194.     MOV    A,L
  195.     ORA    H
  196.     JZ    DONE    ;EXIT IF NO MORE
  197.     LXI    H,ORDER ;POINT TO ORDER TABLE
  198. ;
  199. SORTLP    CALL    COMPR    ;COMPARE 2 ENTRIES
  200.     CM    SWAP    ;SWAP IF NOT IN ORDER
  201.     INX    H    ;BUMP ORDER
  202.     INX    H    ;..TABLE POINTER
  203.     PUSH    H
  204.     LHLD    TEMP    ;GET COUNT
  205.     DCX    H    ;ONE LESS
  206.     SHLD    TEMP    ;SAVE COUNT
  207.     MOV    A,L
  208.     ORA    H    ;DONE?
  209.     POP    H
  210.     JNZ    SORTLP    ;CONTINUE
  211. ;ONE PASS OF SORT DONE
  212.     LDA    SWITCH    ;ANY SWAPS DONE?
  213.     ORA    A
  214.     JNZ    SORT
  215. ;
  216. ;SORT IS ALL DONE - PRINT ENTRIES
  217. DONE    LXI    H,ORDER
  218.     SHLD    NEXTT
  219. ;
  220. ;PRINT AN ENTRY
  221.     MVI    C,NPL    ;NR. OF NAMES PER LINE
  222. ;
  223. ENTRY:    PUSH    B
  224.     MVI    C,CONST    ;CK STATUS OF KBD
  225.     CALL    BDOS    ;ANY KEY PRESSED?
  226.     POP    B
  227.     ORA    A
  228.     JNZ    ABORT    ;YES, ABORT
  229.     LHLD    NEXTT    ;GET ORDER TABLE POINTER
  230.     MOV    E,M    ;GET LO ADDR
  231.     INX    H
  232.     MOV    D,M    ;GET HI ADDR
  233.     INX    H
  234.     SHLD    NEXTT    ;SAVE UPDATED TABLE POINTER
  235.     XCHG        ;TABLE ENTRY TO HL
  236.     LDA    SAVFCB    ;GET SAVED 1ST CHAR. OF FCB
  237.     CPI    ' '    ;WAS NAME SPECIFIED?
  238.     JNZ    MATCH    ;YES, GO SEE IF PRESENT
  239. ;PRINT USER #
  240. PTONE    MOV    A,M    ;GET USER NUMBER
  241.     CPI    32    ;IS IT VALID ? (IE.< 32)
  242.     JNC    NULL    ; NO, IGNORE IT
  243.     ORA    A    ;IS IT USER 0 ?
  244.     JNZ    PTONE2    ;NO, SKIP NEXT ROUTINE
  245.     CALL    SPACE2    ;USER 0, FILL WITH SPACES
  246.     JMP    PTONE3    ;SKIP DECOUT PRINT
  247. ;
  248. PTONE2    PUSH    H
  249.     MVI    H,0
  250.     MOV    L,A    ;NUMBER TO L FOR DECOUT
  251.     CPI    10    ;LESS THAN 10?
  252.     CC    SPACE    ;YES, ADD ONE SPACE
  253.     CALL    DECOUT    ;PRINT USER NUMBER
  254.     POP    H
  255. ;
  256. PTONE3    CALL    SPACE    ;MAKE IT LOOK NICE
  257.     INX    H    ;POINT TO NAME
  258.     MVI    B,8    ;FILE NAME LENGTH
  259.     CALL    TYPEIT    ;TYPE FILENAME
  260.     CALL    PERIOD    ;PERIOD AFTER FN
  261.     MVI    B,3    ;GET THE FILETYPE
  262.     CALL    TYPEIT
  263.     DCR    C    ;ONE LESS ON THIS LINE
  264.     PUSH    PSW
  265.     CNZ    FENCE    ;NO CR-LF NEEDED, DO FENCE
  266.     POP    PSW
  267.     CZ    CRLF    ;CR-LF NEEDED
  268. ;SEE IF MORE ENTRIES
  269. NULL    PUSH    H
  270.     LHLD    COUNT
  271.     DCX    H
  272.     SHLD    COUNT
  273.     MOV    A,L
  274.     ORA    H
  275.     POP    H
  276.     JNZ    ENTRY    ;YES, MORE
  277.     JMP    EXIT
  278. ;
  279. MATCH    PUSH    D    ;SAVE DE
  280.     PUSH    H    ;SAVE HL
  281.     LXI    D,FCB    ;GET FCB REQUEST
  282.     INX    H    ;MOVE TO FN.FT
  283.     INX    D    ;
  284.     MVI    B,11    ;GET NUMBER OF CHARACTERS TO COMPARE
  285. ;
  286. MAT1    LDAX    D    ;GET CHARACTER
  287.     CPI    '*'    ;IS FILENAME OR FILETYPE AMBIGUOUS ?
  288.     JZ    WHCH    ; YES, DETERMINE WHICH ONE
  289.     CPI    '?'    ;IS IT A AMBIGUOUS CHARACTER ?
  290.     JZ    AMBC    ; YES
  291.     CMP    M    ;COMPARE TO MEMORY
  292.     JNZ    NOMATCH    ;MATCH FAILURE
  293. ;
  294. AMBC    INX    D
  295.     INX    H    ;GET NEW CHARACTERS
  296.     DCR    B    ;ARE WE DONE ?
  297.     JNZ    MAT1    ;NO, COMPARE NEXT
  298. ;
  299. FTYP    POP    H
  300.     POP    D    ;RESTORE REGISTERS
  301.     JMP    PTONE    ;GO PRINT ONE
  302. ;
  303. WHCH    MOV    A,B    ;GET B
  304.     CPI    3    ;IS IT STILL THE FILENAME ?
  305.     JC    FTYP    ; NO, IT IS ANY TYPE SO WE ARE DONE.
  306.     MVI    B,3    ;YES, LOAD UP TO FILETYPE
  307.     JMP    MAT1    ;RETURN FOR MORE
  308. ;
  309. NOMATCH    POP    H
  310.     POP    D    ;RESTORE REGISTERS
  311.     JMP    NULL    ;GET NEW FILENAME TO TRY
  312. ;
  313. PERIOD    MVI    A,'.'
  314.     JMP    TYPE
  315. ;
  316. FENCE    CALL    SPACE2
  317.     MVI    A,DELIM    ;FENCE CHARACTER
  318.     JMP    TYPE
  319. ;
  320. SPACE3    CALL    SPACE
  321. ;
  322. SPACE2    CALL    SPACE
  323. ;
  324. SPACE    MVI    A,' '
  325. ;
  326. ;TYPE CHAR IN A
  327. TYPE    PUSH    B
  328.     PUSH    D
  329.     PUSH    H
  330.     MOV    E,A
  331.     MVI    C,WRCHR
  332.     CALL    BDOS
  333.     POP    H
  334.     POP     D
  335.     POP    B
  336.     RET
  337. ;
  338. TYPEIT    MOV    A,M
  339.     CALL    TYPE
  340.     INX    H
  341.     DCR    B
  342.     JNZ    TYPEIT
  343.     RET
  344. ;
  345. CRLF    MVI    A,CR    ;CARRIAGE RETURN
  346.     CALL    TYPE
  347.     MVI    A,LF    ;LINE FEED
  348.     CALL    TYPE
  349.     MVI    C,NPL    ;NUMBER OF NAMES PER LINE
  350.     RET
  351. ;
  352. ;DECIMAL OUTPUT ROUTINE
  353. ;
  354. DECOUT:    PUSH    B
  355.     PUSH    D
  356.     PUSH    H
  357.     LXI    B,-10
  358.     LXI    D,-1
  359. ;
  360. DECOU2:    DAD    B
  361.     INX    D
  362.     JC    DECOU2
  363.     LXI    B,10
  364.     DAD    B
  365.     XCHG
  366.     MOV    A,H
  367.     ORA    L
  368.     CNZ    DECOUT
  369.     MOV    A,E
  370.     ADI    '0'
  371.     CALL    TYPE
  372.     POP    H
  373.     POP    D
  374.     POP    B
  375.     RET
  376. ;
  377. ;COMPARE ROUTINE FOR SORT
  378. COMPR    PUSH    H    ;SAVE TABLE ADDR
  379.     MOV    E,M    ;LOAD LO
  380.     INX    H
  381.     MOV    D,M    ;LOAD HI
  382.     INX    H
  383.     MOV    C,M
  384.     INX    H
  385.     MOV    B,M
  386. ;BC, DE NOW POINT TO ENTRIES TO BE COMPARED
  387.     XCHG
  388. CMPLP    LDAX    B
  389.     CMP    M
  390.     INX    H
  391.     INX    B
  392.     JZ    CMPLP
  393.     POP    H
  394.     RET        ;COND CODE TELLS ALL
  395. ;
  396. ;SWAP ENTRIES IN THE ORDER TABLE
  397. SWAP    MVI    A,1
  398.     STA    SWITCH    ;SHOW A SWAP WAS MADE
  399.     MOV    C,M
  400.     INX    H
  401.     PUSH    H    ;SAVE TABLE ADDR+1
  402.     MOV    B,M
  403.     INX    H
  404.     MOV    E,M
  405.     MOV    M,C
  406.     INX    H
  407.     MOV    D,M
  408.     MOV    M,B
  409.     POP    H
  410.     MOV    M,D
  411.     DCX    H    ;BACK POINTER TO CORRECT LOC'N
  412.     MOV    M,E
  413.     RET
  414. ;
  415. NFEXIT    CALL    ERXIT
  416.     DB    '++NO FILES ON THIS DISK',CR,LF,'$'
  417. ;
  418. ;ERROR EXIT
  419. ERXIT    POP    D    ;GET MSG
  420.     MVI    C,PRINT
  421.     JMP    CALLB    ;PRINT MSG, EXIT
  422. ;
  423. ;ABORT - READ CHAR ENTERED
  424. ABORT    MVI    C,RDCHR    ;DELETE THE CHAR
  425. CALLB    CALL    BDOS
  426. ;
  427. ;FALL INTO EXIT
  428. ;EXIT - ALL DONE, RESTORE DISK LOG IN AND STACK
  429. EXIT    LDA    CDSK    ;GET ORIGINAL DISK NR.
  430.     MOV    E,A    ;TO E FOR CP/M
  431.     MVI    C,SELDSK ;RESTORE LOG-IN TO IT
  432.     CALL    BDOS
  433.     LHLD    STACK    ;GET OLD STACK
  434.     SPHL        ;MOVE TO STACK
  435.     RET        ;..AND RETURN
  436. ;
  437. NEXTT    DW    TABLE    ;NEXT TABLE ENTRY
  438. COUNT    DW    0    ;ENTRY COUNT
  439. SWITCH    DB    0    ;SWAP SWITCH FOR SORT
  440. SAVFCB    DS    1    ;SAVED 1ST CHAR. OF FCB
  441. CDSK    DS    1    ;CURRENTLY LOGGED DISK NUMBER
  442. OCOUNT    DS    2    ;# NAMES TO PUT IN ORDER TABLE
  443. SCOUNT    DS    2    ;# TO SORT
  444. TEMP    DS    2    ;SAVE DIR ENTRY
  445. ORDER    DS    NAMES*2    ;ORDER TABLE (TWO BYTES PER NAME)
  446.     DS    60    ;STACK AREA
  447. STACK    DS    2    ;SAVE OLD STACK HERE
  448. TABLE    EQU    $    ;READ ENTRIES IN HERE
  449. ;
  450. ; BDOS EQUATES
  451. ;
  452. RDCHR    EQU    1    ;READ CHAR FROM CONSOLE
  453. WRCHR    EQU    2    ;WRITE CHR TO CONSOLE
  454. PRINT    EQU    9    ;PRINT CONSOLE BUFF
  455. CONST    EQU    11    ;CHECK CONS STAT
  456. SELDSK    EQU    14    ;SELECT DISK DRIVE
  457. FSRCHF    EQU    17    ;   "    "
  458. FSRCHN    EQU    18    ;   "    "
  459. CURDSK    EQU    25    ;CHECK CURRENT DISK 0=A: 1=B:, ETC.
  460. BDOS    EQU    BASE+5
  461. ;
  462.     END
  463.