home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv009.ark / DIRS1015.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  8.6 KB  |  410 lines

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