home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug047.ark / DIRS9_8.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  8KB  |  368 lines

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