home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv004.ark / XDIR6-28.ASM < prev   
Encoding:
Assembly Source File  |  1984-04-29  |  7.7 KB  |  423 lines

  1. ;
  2. ;             XDIR.ASM
  3. ;             Revised 6/28/80
  4. ;
  5. ;        EXTENDED (SORTED) DIRECTORY PROGRAM
  6. ;        by Keith Petersen, W8SDZ
  7. ;
  8. ;PRINTS A 3-WIDE DIRECTORY, SORTED ALPHABETICALLY,
  9. ;SHOWING EXTENT NUMBERS AND EXTENT SIZE.  BASED ON
  10. ;'FMAP' BY WARD CHRISTENSEN AND XDIR BY B. RATOFF.
  11. ;
  12. ;XDIR FILENAME.FILETYPE or just XDIR
  13. ;ALLOWS '*' OR '?' TYPE SPECIFICATIONS
  14. ;DRIVE NAME MAY ALSO BE SPECIFIED
  15. ;
  16. ;07/31/79 CORRECTED ERROR IN CONSTAT TEST
  17. ;      FOR ABORTING PRINT.  (KBP)
  18. ;
  19. ;08/16/79 ADD CONDITIONAL ASSEMBLY FOR CP/M
  20. ;      ON H8 OR TRS-80.  (KBP)
  21. ;
  22. ;05/21/80 ADD ANI 7FH TO REMOVE FILE ATTRIBUTES
  23. ;      TO MAKE COMPATIBLE WITH CPM-2. (KBP)
  24. ;
  25. ;06/28/80 FIX ERROR IN FILE SIZE PRINTOUTS. (KBP)
  26. ;
  27. FALSE    EQU    0
  28. TRUE    EQU    NOT FALSE
  29. ;
  30. BASE    SET    0
  31. ;
  32. ALTCPM    EQU    FALSE    ;PUT TRUE HERE FOR H8 OR TRS-80 CP/M
  33. ;
  34.     IF    ALTCPM
  35. BASE    SET    4200H
  36.     ENDIF
  37. ;
  38. FCB    EQU    BASE+5CH ;SYSTEM FCB
  39. EXTENT    EQU    BASE+68H ;FCB EXTENT BYTE
  40. NPL    EQU    3    ;NUMBER OF NAMES PER LINE
  41. DELIM    EQU    7CH    ;FENCE (DELIMITER) CHARACTER
  42. ;
  43.     ORG    BASE+100H
  44. ;
  45.     JMP    START    ;JMP AROUND I.D.
  46.     DB    'XDIR.COM 6/27/80 '
  47. ;
  48. ;SAVE THE STACK
  49. START    LXI    H,0
  50.     DAD    SP    ;H=STACK
  51.     SHLD    STACK    ;SAVE IT
  52.     LXI    SP,STACK ;GET NEW STACK
  53. ;NO FCB SPECIFIED?
  54.     LXI    H,FCB+1
  55.     MOV    A,M
  56.     CPI    ' '
  57.     JNZ    GOTFCB
  58. ;NO FCB - MAKE FCB ALL '?'
  59.     MVI    B,11    ;FN+FT COUNT
  60. QLOOP    MVI    M,'?'    ;STORE '?' IN FCB
  61.     INX    H
  62.     DCR    B
  63.     JNZ    QLOOP
  64. ;LOOK UP THE FCB IN THE DIRECTORY
  65. GOTFCB    MVI    A,'?'    ;MATCH ALL EXTENTS
  66.     STA    EXTENT
  67.     MVI    C,FSRCHF ;GET 'SEARCH FIRST' FNC
  68.     LXI    D,FCB
  69.     CALL    BDOS    ;READ FIRST
  70.     INR    A    ;WERE THERE ANY?
  71.     JNZ    SOME    ;GOT SOME
  72.     CALL    ERXIT
  73.     DB    '++NOT FOUND$'
  74. ;
  75. ;READ MORE DIRECTORY ENTRIES
  76. MOREDIR    MVI    C,FSRCHN ;SEARCH NEXT
  77.     LXI    D,FCB
  78.     CALL    BDOS    ;READ DIR ENTRY
  79.     INR    A    ;CHECK FOR END (0FFH)
  80.     JZ    SPRINT    ;NO MORE - SORT & PRINT
  81. ;POINT TO DIRECTORY ENTRY 
  82. SOME    DCR    A    ;UNDO PREV 'INR A'
  83.     ANI    3    ;MAKE MODULUS 4
  84.     ADD    A    ;MULTIPLY...
  85.     ADD    A    ;..BY 32 BECAUSE
  86.     ADD    A    ;..EACH DIRECTORY
  87.     ADD    A    ;..ENTRY IS 32
  88.     ADD    A    ;..BYTES LONG
  89.     LXI    H,BASE+81H ;POINT TO BUFFER
  90.             ;(SKIP TO FN/FT)
  91.     ADD    L    ;POINT TO ENTRY
  92.     MOV    L,A    ;SAVE (CAN'T CARRY TO H)
  93. ;MOVE ENTRY TO TABLE
  94.     XCHG        ;ENTRY TO DE
  95.     LHLD    NEXTT    ;NEXT TABLE ENTRY TO HL
  96.     MVI    B,11    ;LENGTH OF NAME
  97. ;
  98. TMOVE    LDAX    D    ;GET ENTRY CHAR
  99.     ANI    7FH    ;REMOVE ATTRIBUTES
  100.     MOV    M,A    ;STORE IN TABLE
  101.     INX    D
  102.     INX    H
  103.     DCR    B    ;MORE?
  104.     JNZ    TMOVE
  105.     MVI    B,20    ;LENGTH OF REST OF ENTRY
  106. ;
  107. TMOVE2    LDAX    D    ;GET ENTRY CHARACTER
  108.     MOV    M,A    ;STORE IN TABLE
  109.     INX    D
  110.     INX    H
  111.     DCR    B    ;MORE?
  112.     JNZ    TMOVE2
  113.     SHLD    NEXTT    ;SAVE UPDATED TABLE ADDR
  114.     LDA    COUNT    ;GET PREV COUNT
  115.     INR    A
  116.     STA    COUNT
  117.     JMP    MOREDIR
  118. ;
  119. ;SORT AND PRINT
  120. SPRINT    LDA    COUNT    ;INIT THE ORDER TABLE
  121.     LXI    H,ORDER
  122.     LXI    D,TABLE
  123.     LXI    B,31    ;ENTRY LENGTH
  124. ;
  125. BLDORD    MOV    M,E    ;SAVE LO ORD ADDR
  126.     INX    H
  127.     MOV    M,D    ;SAVE HI ORD ADDR
  128.     INX    H
  129.     XCHG        ;TABLE ADDR TO HL
  130.     DAD    B    ;POINT TO NEXT ENTRY
  131.     XCHG
  132.     DCR    A    ;MORE?
  133.     JNZ    BLDORD    ;..YES
  134.     LDA    COUNT    ;GET COUNT
  135.     STA    SCOUNT    ;SAVE AS # TO SORT
  136.     DCR    A    ;ONLY 1 ENTRY?
  137.     JZ    DONE    ;..YES, SO SKIP SORT
  138. ;
  139. SORT    XRA    A    ;GET A ZERO
  140.     STA    SWITCH    ;SHOW NONE SWITCHED
  141.     LDA    SCOUNT    ;GET COUNT
  142.     DCR    A    ;USE 1 LESS
  143.     STA    TEMP    ;SAVE # TO COMPARE
  144.     STA    SCOUNT    ;SAVE HIGHEST ENTRY
  145.     JZ    DONE    ;EXIT IF NO MORE
  146.     LXI    H,ORDER ;POINT TO ORDER TABLE
  147. ;
  148. SORTLP    CALL    COMPR    ;COMPARE 2 ENTRIES
  149.     CM    SWAP    ;SWAP IF NOT IN ORDER
  150.     INX    H    ;BUMP ORDER
  151.     INX    H    ;..TABLE POINTER
  152.     LDA    TEMP    ;GET COUNT
  153.     DCR    A
  154.     STA    TEMP
  155.     JNZ    SORTLP    ;CONTINUE
  156. ;ONE PASS OF SORT DONE
  157.     LDA    SWITCH    ;ANY SWAPS DONE?
  158.     ORA    A
  159.     JNZ    SORT
  160. ;SORT IS ALL DONE - PRINT ENTRIES
  161. DONE    LXI    H,ORDER
  162.     SHLD    NEXTT
  163. ;
  164. ;PRINT AN ENTRY
  165.     MVI    C,NPL    ;NR. OF NAMES PER LINE
  166. ;
  167. ENTRY:    PUSH    B
  168.     MVI    C,CONST    ;CK STATUS OF KB
  169.     CALL    BDOS    ;ANY KEY PRESSED?
  170.     POP    B
  171.     ORA    A
  172.     JNZ    ABORT    ;YES, ABORT
  173.     LHLD    NEXTT    ;GET ORDER TABLE POINTER
  174.     MOV    E,M    ;GET LO ADDR
  175.     INX    H
  176.     MOV    D,M    ;GET HI ADDR
  177.     INX    H
  178.     SHLD    NEXTT    ;SAVE UPDATED TABLE POINTER
  179.     XCHG        ;TABLE ENTRY TO HL
  180.     MVI    B,8    ;FILE NAME LENGTH
  181.     CALL    TYPEIT    ;TYPE FILENAME
  182.     CALL    PERIOD    ;PERIOD AFTER FN
  183.     MVI    B,3    ;GET THE FILETYPE
  184.     CALL    TYPEIT
  185.     MOV    A,M    ;GET EXTENT NUMBER
  186.     ADI    '0'    ;CONVERT TO ASCII
  187.     CPI    ':'    ;ABOVE ASCII '9' ?
  188.     JC    ENTRY2
  189.     ADI    7
  190. ;
  191. ENTRY2    CPI    '0'    ;IS EXTENT NUMBER ZERO?
  192.     JNZ    ENTRY3    ;NO, PRINT '+' THEN NUMBER
  193.     CALL    TWOSPCE    ;IT'S ZERO - PRINT 2 SPACES
  194.     JMP    ENTRY4    ;THEN PRINT SIZE
  195. ;
  196. ENTRY3    PUSH    PSW    ;SAVE EXTENT NUMBER
  197.     MVI    A,'+'
  198.     CALL    TYPE    ;PRINT '+'
  199.     POP    PSW    ;GET EXTENT NUMBER
  200.     CALL    TYPE    ;PRINT IT
  201. ;
  202. ENTRY4    CALL    SPACE    ;SPACE OVER ONE
  203.     INX    H
  204.     INX    H
  205.     INX    H
  206.     MOV    A,M    ;GET EXTENT SIZE
  207.     PUSH    B
  208.     CALL    PDEC    ;PRINT IT
  209.     POP    B
  210.     DCR    C    ;ONE LESS ON THIS LINE
  211.     PUSH    PSW
  212.     CNZ    FENCE    ;NO CR-LF NEEDED, DO FENCE
  213.     POP    PSW
  214.     CZ    CR    ;CR-LF NEEDED
  215. ;SEE IF MORE ENTRIES
  216.     LDA    COUNT
  217.     DCR    A
  218.     STA    COUNT
  219.     JNZ    ENTRY    ;YES, MORE
  220.     JMP    EXIT
  221. ;
  222. ;PRINT VALUE IN A IN UNSIGNED DECIMAL FORMAT
  223. ;
  224. PDEC:    STA    DTEMP    ;SAVE THE NUMBER
  225.     MVI    A,100
  226.     STA    Q
  227.     XRA    A    ;CLEAR LEADING ZERO FLAG
  228.     STA    LEAD0FL
  229. ;DIVIDE A BY Q
  230. ;
  231. PDEC2:    LDA    DTEMP
  232.     MOV    C,A
  233.     LDA    Q
  234.     MOV    D,A
  235.     CALL    BDIV
  236.     MOV    A,B
  237.     STA    DTEMP    ;SAVE REMAINDER
  238.     MOV    A,C
  239.     ADI    0
  240.     JNZ    PDEC3
  241.     LDA    LEAD0FL
  242.     ADI    0
  243.     JZ    PDEC4
  244. PDEC3:    MOV    A,C
  245.     ADI    '0'    ;CONVERT TO ASCII
  246.     CALL    TYPE    ;PRINT QUOTIENT
  247.     MVI    A,1    ;STOP SUPRESSING ZEROS
  248.     STA    LEAD0FL
  249.     JMP    PDEC5
  250. PDEC4:    CALL    SPACE
  251. PDEC5:    LDA    Q
  252.     MOV    C,A
  253.     MVI    D,10
  254.     CALL    BDIV    ;DIVIDE Q BY 10
  255.     MOV    A,C
  256.     STA    Q
  257.     LDA    Q
  258.     CPI    1
  259.     JNZ    PDEC2
  260.     LDA    DTEMP
  261.     ADI    '0'    ;CONVERT TO ASCII
  262.     JMP    TYPE    ;PRINT IT THEN RETURN
  263. ;BYTE DIVISION ROUTINE
  264. ;
  265. BDIV:    MVI    B,0
  266.     MVI    L,8
  267. BDIVLP:    STC
  268.     CMC
  269.     MOV    A,C
  270.     RAL
  271.     MOV    C,A
  272.     MOV    A,B
  273.     RAL
  274.     MOV    B,A
  275.     MOV    A,B
  276.     SUB    D
  277.     JM    BDIV2
  278.     MOV    B,A
  279.     MOV    A,C
  280.     ORI    1
  281.     MOV    C,A
  282. BDIV2:    DCR    L
  283.     JNZ    BDIVLP
  284.     RET
  285. ;
  286. PERIOD    MVI    A,'.'
  287.     JMP    TYPE
  288. ;
  289. FENCE    CALL    SPACE
  290.     MVI    A,DELIM    ;FENCE CHARACTER
  291.     CALL    TYPE
  292. ;
  293. TWOSPCE    CALL    SPACE
  294. ;
  295. SPACE    MVI    A,' '
  296. ;
  297. ;TYPE CHAR IN A
  298. TYPE    PUSH    B
  299.     PUSH    D
  300.     PUSH    H
  301.     ANI    7FH    ;REMOVE ATTRIBUTES
  302.     MOV    E,A
  303.     MVI    C,WRCHR
  304.     CALL    BDOS
  305.     POP    H
  306.     POP     D
  307.     POP    B
  308.     RET
  309. ;
  310. WRCON    MVI    C,PRINT
  311.     JMP    BDOS
  312. ;
  313. TYPEIT    MOV    A,M
  314.     CALL    TYPE
  315.     INX    H
  316.     DCR    B
  317.     JNZ    TYPEIT
  318.     RET
  319. ;
  320. CR    MVI    E,13    ;PRINT
  321.     MVI    C,2    ;C/R
  322.     CALL    BDOS
  323.     MVI    E,10    ;LF
  324.     MVI    C,2
  325.     CALL    BDOS
  326.     MVI    C,NPL    ;NUMBER OF NAMES PER LINE
  327.     RET
  328. ;
  329. ;COMPARE ROUTINE FOR SORT
  330. COMPR    PUSH    H    ;SAVE TABLE ADDR
  331.     MOV    E,M    ;LOAD LO
  332.     INX    H
  333.     MOV    D,M    ;LOAD HI
  334.     INX    H
  335.     MOV    C,M
  336.     INX    H
  337.     MOV    B,M
  338. ;BC, DE NOW POINT TO ENTRIES TO BE COMPARED
  339.     XCHG
  340. CMPLP    LDAX    B
  341.     CMP    M
  342.     INX    H
  343.     INX    B
  344.     JZ    CMPLP
  345.     POP    H
  346.     RET        ;COND CODE TELLS ALL
  347. ;
  348. ;SWAP ENTRIES IN THE ORDER TABLE
  349. SWAP    MVI    A,1
  350.     STA    SWITCH    ;SHOW A SWAP WAS MADE
  351.     MOV    C,M
  352.     INX    H
  353.     PUSH    H    ;SAVE TABLE ADDR+1
  354.     MOV    B,M
  355.     INX    H
  356.     MOV    E,M
  357.     MOV    M,C
  358.     INX    H
  359.     MOV    D,M
  360.     MOV    M,B
  361.     POP    H
  362.     MOV    M,D
  363.     DCX    H    ;BACK POINTER TO CORRECT LOC'N
  364.     MOV    M,E
  365.     RET
  366. ;
  367. ;ERROR EXIT
  368. ERXIT    POP    D    ;GET MSG
  369.     MVI    C,PRINT
  370.     JMP    CALLB    ;PRINT MSG, EXIT
  371. ;
  372. ;ABORT - READ CHAR ENTERED
  373. ABORT    MVI    C,RDCHR
  374. CALLB    CALL    BDOS    ;DELETE THE CHAR
  375. ;
  376. ;FALL INTO EXIT
  377. ;EXIT - ALL DONE , RESTORE STACK
  378. EXIT    LHLD    STACK    ;GET OLD STACK
  379.     SPHL        ;MOVE TO STACK
  380.     RET        ;..AND RETURN
  381. ;
  382. NEXTT    DW    TABLE    ;NEXT TABLE ENTRY
  383. COUNT    DB    0    ;ENTRY COUNT
  384. SCOUNT    DB    0    ;# TO SORT
  385. SWITCH    DB    0    ;SWAP SWITCH FOR SORT
  386. BUFAD    DW    BASE+80H ;OUTPUT ADDR
  387. ORDER    DS    256    ;ORDER TABLE (ROOM FOR 128 NAMES)
  388.     DS    60    ;STACK AREA
  389. STACK    DS    2    ;SAVE OLD STACK HERE
  390. Q    DS    1    ;FOR DIVIDER ROUTINE
  391. DTEMP    DS    1    ;FOR DIVIDER ROUTINE
  392. LEAD0FL    DS    1    ;LEADING ZERO FLAG
  393. TEMP    DS    1    ;SAVE DIR ENTRY
  394. TABLE    EQU    $    ;READ ENTRIES IN HERE
  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. ERASE    EQU    19    ;NO RET CODE
  407. FREAD    EQU    20    ;0=OK, 1=EOF
  408. FWRTE    EQU    21    ;0=OK, 1=ERR, 2=?, 255=NO DIR SPC
  409. FMAKE    EQU    22    ;255=BAD
  410. FREN    EQU    23    ;255=BAD
  411. FDMA    EQU    26
  412. BDOS    EQU    BASE+5
  413. REBOOT    EQU    BASE+0
  414. ;
  415.     END
  416.