home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol004 / dirs10-1.asm < prev    next >
Assembly Source File  |  1983-08-29  |  8KB  |  396 lines

  1. ;
  2. ;            DIRS.ASM
  3. ;             revised 10/1/80
  4. ;
  5. ;        SORTED DIRECTORY PROGRAM
  6. ;        by Keith Petersen, W8SDZ
  7. ;
  8. ;DISPLAY FORMAT IS SAME AS CP/M 2.x DIR, EXCEPT IS SORTED
  9. ;ALPHABETICALLY. SUGGESTED AS A REPLACEMENT FOR THE "DIR"
  10. ;COMMAND IN CP/M-2. PRESENT VERSION ALLOWS MAX. OF 256 NAMES.
  11. ;
  12. ;PRINTS A 4-WIDE DIRECTORY, SORTED ALPHABETICALLY.
  13. ;COMPATIBLE WITH CP/M 1.4 AND 2.x. IGNORES "SYS" FILES.
  14. ;
  15. ;BASED ON 'FMAP' BY WARD CHRISTENSEN.
  16. ;
  17. ;DIRS FILENAME.FILETYPE or just DIRS
  18. ;
  19. ;ALLOWS '*' OR '?' TYPE SPECIFICATIONS
  20. ;DRIVE NAME BY ALSO BE SPECIFIED
  21. ;
  22. ; 09/07/80 - Modified to assemble with RMAC and externalized
  23. ;        page 0 for use with MP/M.  (Must be linked
  24. ;        with PG0EQU.ASM)
  25. ;         Also modified to allow (via conditional assembly)
  26. ;        'S' option to display system files.
  27. ;         (by Bruce R. Ratoff)
  28. ; 09/08/80 - CHKUSR conditional assembly added to force match of
  29. ;        current user number, as required in MP/M to
  30. ;        prevent user 0 files from showing up in all
  31. ;        areas.  Also used in CP/M 2.2 systems containing
  32. ;        BDOSPAT.  (BRR)
  33. ; 10/01/80 - Say 'File not found.' instead of 'NO FILE' and
  34. ;        display user number heading if CHKUSR enabled.
  35. ;        Take 'NO FILE' path if first search succeeds,
  36. ;        but nothing qualifies for the sort.
  37. ;        (BRR)
  38. ;
  39. ;
  40. FALSE    EQU    0        ;DEFINE LOGICAL FALSE
  41. TRUE    EQU    NOT FALSE    ;DEFINE LOGICAL TRUE
  42. ;
  43. ALTCPM    EQU    FALSE    ;PUT TRUE HERE FOR H8 OR TRS-80
  44. RMAC    EQU    FALSE    ;PUT TRUE HERE FOR ASSEMBLY BY RMAC
  45. SOPT    EQU    FALSE    ;PUT TRUE TO ALLOW 'DIR *.* S' FORM
  46. CHKUSR    EQU    FALSE    ;PUT TRUE IF USER # MATCH REQUIRED
  47. ;
  48.     IF    ALTCPM
  49. BASE    EQU    4200H
  50. TPA    EQU    4300H
  51.     ENDIF
  52.     IF    RMAC
  53.     EXTRN    BASE,FCB,BDOS    ;MAKE BASE EXTERNAL
  54.     ENDIF
  55.     IF    (NOT ALTCPM) AND (NOT RMAC)
  56. BASE    EQU    $    ;WILL DEFAULT TO 0 (OR 100H WITH MAC +R OPTION)
  57. TPA    EQU    100H
  58.     ENDIF
  59. ;
  60.     IF    NOT RMAC
  61. FCB    EQU    BASE+5CH
  62. BDOS    EQU    BASE+5
  63.     ENDIF
  64. ;
  65. NPL    EQU    4    ;NUMBER OF NAMES PER LINE
  66. DELIM    EQU    ':'    ;FENCE (DELIMITER) CHARACTER
  67. ;
  68.     IF    NOT RMAC
  69.     ORG    TPA
  70.     ENDIF
  71. ;
  72. ;SAVE THE STACK
  73. START    LXI    H,0
  74.     DAD    SP    ;H=STACK
  75.     SHLD    STACK    ;SAVE IT
  76.     LXI    SP,STACK ;GET NEW STACK
  77. ;
  78.     IF    SOPT
  79.     LDA    FCB+17    ;SAVE S OPTION FLAG
  80.     STA    SOPFLG    ;(BLANK OR LETTER S)
  81.     ENDIF
  82. ;
  83.     IF    CHKUSR
  84.     MVI    E,0FFH
  85.     MVI    C,CURUSR    ;INTERROGATE USER NUMBER
  86.     CALL    BDOS
  87.     STA    USERNO
  88.     LXI    D,USRMSG    ;DISPLAY IT
  89.     MVI    C,PRINT
  90.     CALL    BDOS
  91.     LDA    USERNO
  92.     CPI    10
  93.     JC    DUX
  94.     MVI    A,'1'
  95.     CALL    TYPE
  96.     LDA    USERNO
  97.     SUI    10
  98. DUX    ADI    '0'
  99.     CALL    TYPE
  100.     LXI    D,USRMS2
  101.     MVI    C,PRINT
  102.     CALL    BDOS
  103.     ENDIF
  104. ;
  105.     LXI    H,FCB
  106.     MOV    A,M    ;GET DRIVE NAME
  107.     ORA    A    ;ANY SPECIFIED?
  108.     JNZ    START2    ;YES SKIP NEXT ROUTINE
  109.     MVI    C,CURDSK
  110.     CALL    BDOS    ;GET CURRENT DISK NR
  111.     INR    A    ;MAKE A:=1
  112. ;
  113. START2    ADI    'A'-1    ;MAKE IT PRINTABLE
  114.     STA    DRNAM    ;SAVE FOR LATER
  115.     LXI    H,FCB+1    ;POINT TO NAME
  116.     MOV    A,M    ;ANY SPECIFIED?
  117.     CPI    ' '
  118.     JNZ    GOTFCB
  119. ;NO FCB - MAKE FCB ALL '?'
  120.     MVI    B,11    ;FN+FT COUNT
  121. QLOOP    MVI    M,'?'    ;STORE '?' IN FCB
  122.     INX    H
  123.     DCR    B
  124.     JNZ    QLOOP
  125. ;LOOK UP THE FCB IN THE DIRECTORY
  126. GOTFCB    MVI    C,FSRCHF ;GET 'SEARCH FIRST' FNC
  127.     LXI    D,FCB
  128.     CALL    BDOS    ;READ FIRST
  129.     INR    A    ;WERE THERE ANY?
  130.     JNZ    SOME    ;GOT SOME
  131. NONE    CALL    ERXIT
  132.     IF    NOT CHKUSR
  133.     DB    'NO FILE$'
  134.     ENDIF
  135.     IF    CHKUSR
  136.     DB    'File not found.$'
  137. ;
  138. USRMSG    DB    'Directory for user $'
  139. USRMS2    DB    ':',13,10,'$'
  140.     ENDIF
  141. ;
  142. ;READ MORE DIRECTORY ENTRIES
  143. MOREDIR    MVI    C,FSRCHN ;SEARCH NEXT
  144.     LXI    D,FCB
  145.     CALL    BDOS    ;READ DIR ENTRY
  146.     INR    A    ;CHECK FOR END (0FFH)
  147.     JZ    SPRINT    ;NO MORE - SORT & PRINT
  148. ;POINT TO DIRECTORY ENTRY 
  149. SOME    DCR    A    ;UNDO PREV 'INR A'
  150.     ANI    3    ;MAKE MODULUS 4
  151.     ADD    A    ;MULTIPLY...
  152.     ADD    A    ;..BY 32 BECAUSE
  153.     ADD    A    ;..EACH DIRECTORY
  154.     ADD    A    ;..ENTRY IS 32
  155.     ADD    A    ;..BYTES LONG
  156.     LXI    H,BASE+81H ;POINT TO BUFFER
  157.             ;(SKIP TO FN/FT)
  158.     ADD    L    ;POINT TO ENTRY
  159.     ADI    9    ;POINT TO SYS BYTE
  160.     MOV    L,A    ;SAVE (CAN'T CARRY TO H)
  161. ;
  162.     IF    SOPT
  163.     LDA    SOPFLG    ;DID USER REQUEST SYS FILES?
  164.     CPI    'S'
  165.     JZ    SYSFOK
  166.     ENDIF
  167. ;
  168.     MOV    A,M    ;GET SYS BYTE
  169.     ANI    80H    ;CHECK BIT 7
  170.     JNZ    MOREDIR    ;SKIP THAT FILE
  171. SYSFOK    MOV    A,L    ;GO BACK NOW
  172.     SUI    9    ;BACK TO FT/FN START
  173.     MOV    L,A    ;HL POINTS TO ENTRY NOW
  174. ;
  175.     IF    CHKUSR
  176.     DCX    H    ;POINT TO USER BYTE IN FCB
  177.     LDA    USERNO    ;GET CURRENT USER
  178.     CMP    M
  179.     JNZ    MOREDIR    ;IGNORE IF DIFFERENT
  180.     INX    H
  181.     ENDIF
  182. ;
  183. ;MOVE ENTRY TO TABLE
  184.     XCHG        ;ENTRY TO DE
  185.     LHLD    NEXTT    ;NEXT TABLE ENTRY TO HL
  186.     MVI    B,11    ;ENTRY LENGTH
  187. TMOVE    LDAX    D    ;GET ENTRY CHAR
  188.     ANI    7FH    ;REMOVE ATTRIBUTES
  189.     MOV    M,A    ;STORE IN TABLE
  190.     INX    D
  191.     INX    H
  192.     DCR    B    ;MORE?
  193.     JNZ    TMOVE
  194.     SHLD    NEXTT    ;SAVE UPDATED TABLE ADDR
  195.     LDA    COUNT    ;GET PREV COUNT
  196.     INR    A
  197.     STA    COUNT
  198.     JMP    MOREDIR
  199. ;
  200. ;SORT AND PRINT
  201. SPRINT    LDA    COUNT    ;GET FILE NAME COUNT
  202.     ORA    A    ;ANY FOUND?
  203.     JZ    NONE    ;NO, EXIT
  204. ;INIT THE ORDER TABLE
  205.     LXI    H,ORDER
  206.     LXI    D,TABLE
  207.     LXI    B,11    ;ENTRY LENGTH
  208. BLDORD    MOV    M,E    ;SAVE LO ORD ADDR
  209.     INX    H
  210.     MOV    M,D    ;SAVE HI ORD ADDR
  211.     INX    H
  212.     XCHG        ;TABLE ADDR TO HL
  213.     DAD    B    ;POINT TO NEXT ENTRY
  214.     XCHG
  215.     DCR    A    ;MORE?
  216.     JNZ    BLDORD    ;..YES
  217.     LDA    COUNT    ;GET COUNT
  218.     STA    SCOUNT    ;SAVE AS # TO SORT
  219.     DCR    A    ;ONLY 1 ENTRY?
  220.     JZ    DONE    ;..YES, SO SKIP SORT
  221. SORT    XRA    A    ;GET A ZERO
  222.     STA    SWITCH    ;SHOW NONE SWITCHED
  223.     LDA    SCOUNT    ;GET COUNT
  224.     DCR    A    ;USE 1 LESS
  225.     STA    TEMP    ;SAVE # TO COMPARE
  226.     STA    SCOUNT    ;SAVE HIGHEST ENTRY
  227.     JZ    DONE    ;EXIT IF NO MORE
  228.     LXI    H,ORDER ;POINT TO ORDER TABLE
  229. SORTLP    CALL    COMPR    ;COMPARE 2 ENTRIES
  230.     CM    SWAP    ;SWAP IF NOT IN ORDER
  231.     INX    H    ;BUMP ORDER
  232.     INX    H    ;..TABLE POINTER
  233.     LDA    TEMP    ;GET COUNT
  234.     DCR    A
  235.     STA    TEMP
  236.     JNZ    SORTLP    ;CONTINUE
  237. ;ONE PASS OF SORT DONE
  238.     LDA    SWITCH    ;ANY SWAPS DONE?
  239.     ORA    A
  240.     JNZ    SORT
  241. ;SORT IS ALL DONE - PRINT ENTRIES
  242. DONE    LXI    H,ORDER
  243.     SHLD    NEXTT
  244. ;
  245. ;PRINT AN ENTRY
  246.     CALL    DRPRNT    ;PRINT DRIVE NAME
  247.     MVI    C,NPL    ;NR. OF NAMES PER LINE
  248. ENTRY:    PUSH    B
  249.     MVI    C,CONST    ;CK STATUS OF KB
  250.     CALL    BDOS    ;ANY KEY PRESSED?
  251.     POP    B
  252.     ORA    A
  253.     JNZ    ABORT    ;YES, ABORT
  254.     CALL    FENCE    ;PRINT FENCE CHAR AND SPACE
  255.     LHLD    NEXTT    ;GET ORDER TABLE POINTER
  256.     MOV    E,M    ;GET LO ADDR
  257.     INX    H
  258.     MOV    D,M    ;GET HI ADDR
  259.     INX    H
  260.     SHLD    NEXTT    ;SAVE UPDATED TABLE POINTER
  261.     XCHG        ;TABLE ENTRY TO HL
  262.     MVI    B,8    ;FILE NAME LENGTH
  263.     CALL    TYPEIT    ;TYPE FILENAME
  264.     CALL    PERIOD    ;PERIOD AFTER FN
  265.     MVI    B,3    ;GET THE FILETYPE
  266.     CALL    TYPEIT
  267.     CALL    SPACE    ;SPACE OVER ONE
  268. ;SEE IF MORE ENTRIES
  269.     LDA    COUNT
  270.     DCR    A
  271.     JZ    EXIT
  272.     STA    COUNT
  273.     DCR    C    ;ONE LESS ON THIS LINE
  274.     CZ    CRLF    ;PRINT CR-LF AND DRIVE NAME
  275.     JMP    ENTRY
  276. ;
  277. PERIOD    MVI    A,'.'
  278.     JMP    TYPE
  279. ;
  280. DRPRNT    LDA    DRNAM    ;GET SAVED DRIVE NAME
  281.     JMP    TYPE    ;PRINT IT
  282. ;
  283. FENCE    MVI    A,DELIM    ;FENCE CHARACTER
  284.     CALL    TYPE    ;PRINT IT, FALL INTO SPACE
  285. ;
  286. SPACE    MVI    A,' '
  287. ;
  288. ;TYPE CHAR IN A
  289. TYPE    PUSH    B
  290.     PUSH    D
  291.     PUSH    H
  292.     MOV    E,A
  293.     MVI    C,WRCHR
  294.     CALL    BDOS
  295.     POP    H
  296.     POP     D
  297.     POP    B
  298.     RET
  299. ;
  300. TYPEIT    MOV    A,M
  301.     CALL    TYPE
  302.     INX    H
  303.     DCR    B
  304.     JNZ    TYPEIT
  305.     RET
  306. ;
  307. CRLF    MVI    A,13    ;PRINT
  308.     CALL    TYPE
  309.     MVI    A,10    ;LF
  310.     CALL    TYPE
  311.     CALL    DRPRNT
  312.     MVI    C,NPL    ;NUMBER OF NAMES PER LINE
  313.     RET
  314. ;
  315. ;COMPARE ROUTINE FOR SORT
  316. COMPR    PUSH    H    ;SAVE TABLE ADDR
  317.     MOV    E,M    ;LOAD LO
  318.     INX    H
  319.     MOV    D,M    ;LOAD HI
  320.     INX    H
  321.     MOV    C,M
  322.     INX    H
  323.     MOV    B,M
  324. ;BC, DE NOW POINT TO ENTRIES TO BE COMPARED
  325.     XCHG
  326. CMPLP    LDAX    B
  327.     CMP    M
  328.     INX    H
  329.     INX    B
  330.     JZ    CMPLP
  331.     POP    H
  332.     RET        ;COND CODE TELLS ALL
  333. ;
  334. ;SWAP ENTRIES IN THE ORDER TABLE
  335. SWAP    MVI    A,1
  336.     STA    SWITCH    ;SHOW A SWAP WAS MADE
  337.     MOV    C,M
  338.     INX    H
  339.     PUSH    H    ;SAVE TABLE ADDR+1
  340.     MOV    B,M
  341.     INX    H
  342.     MOV    E,M
  343.     MOV    M,C
  344.     INX    H
  345.     MOV    D,M
  346.     MOV    M,B
  347.     POP    H
  348.     MOV    M,D
  349.     DCX    H    ;BACK POINTER TO CORRECT LOC'N
  350.     MOV    M,E
  351.     RET
  352. ;
  353. ;ERROR EXIT
  354. ERXIT    POP    D    ;GET MSG
  355.     MVI    C,PRINT
  356.     JMP    CALLB    ;PRINT MSG, EXIT
  357. ;
  358. ;ABORT - READ CHAR ENTERED
  359. ABORT    MVI    C,RDCHR
  360. CALLB    CALL    BDOS    ;DELETE THE CHAR
  361. ;
  362. ;FALL INTO EXIT
  363. ;EXIT - ALL DONE , RESTORE STACK
  364. EXIT    LHLD    STACK    ;GET OLD STACK
  365.     SPHL        ;MOVE TO STACK
  366.     RET        ;..AND RETURN
  367. ;
  368. NEXTT    DW    TABLE    ;NEXT TABLE ENTRY
  369. COUNT    DB    0    ;ENTRY COUNT
  370. SCOUNT    DB    0    ;# TO SORT
  371. SWITCH    DB    0    ;SWAP SWITCH FOR SORT
  372. BUFAD    DW    BASE+80H ;OUTPUT ADDR
  373. ORDER    DS    512    ;ORDER TABLE (ROOM FOR 256 NAMES)
  374.     DS    60    ;STACK AREA
  375. STACK    DS    2    ;SAVE OLD STACK HERE
  376. SOPFLG    DS    1    ;SET TO 'S' TO ALLOW SYS FILES TO PRINT
  377. USERNO    DS    1    ;CONTAINS CURRENT USER NUMBER
  378. DRNAM    DS    1    ;SAVE DRIVE NAME HERE
  379. TEMP    DS    1    ;SAVE DIR ENTRY
  380. TABLE    EQU    $    ;READ ENTRIES IN HERE
  381. ;
  382. ; BDOS EQUATES
  383. ;
  384. RDCHR    EQU    1    ;READ CHAR FROM CONSOLE
  385. WRCHR    EQU    2    ;WRITE CHR TO CONSOLE
  386. PRINT    EQU    9    ;PRINT CONSOLE BUFF
  387. CONST    EQU    11    ;CHECK CONS STAT
  388. FOPEN    EQU    15    ;0FFH=NOT FOUND
  389. FCLOSE    EQU    16    ;   "    "
  390. FSRCHF    EQU    17    ;   "    "
  391. FSRCHN    EQU    18    ;   "    "
  392. CURDSK    EQU    25    ;GET CURRENTLY LOGGED DISK NAME
  393. CURUSR    EQU    32    ;GET CURRENTLY LOGGED USER NUMBER (2.X ONLY)
  394. ;
  395.     END
  396.