home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol065 / dirlst-1.asm < prev    next >
Assembly Source File  |  1984-04-29  |  5KB  |  200 lines

  1. ; PROGRAM TO WRITE A DIRECTORY LISTING TO AN ASCII FILE
  2. ; IN A FORM SUITABLE FOR USE WITH A SUBMIT FILE (AFTER
  3. ; SUITABLE PROCESSING WITH ED).
  4. ;
  5. ; THE COMMAND FORMAT IS:
  6. ;
  7. ;    A>DIRLST  NAME.EXT
  8. ;
  9. ;      WHERE  NAME.EXT IS THE FILE NAME TO SAVE THE DIRECTORY IN.
  10. ;
  11. ;
  12. ;
  13. ;
  14. ;    BY BRUCE KENDALL  1/1980
  15. ;    BUG FIXED 2/9/80
  16. ;         10/4/80
  17. ;          1/11/81    ; ADDED MORE '???' FOR WILD CARD
  18. ;                ;  TO FIX CP/M 2.2 BUG
  19. ;
  20. ;    4/10/81            ;changed formatting to eliminate
  21. ;                ;extraneous characters at start of
  22. ;                ;each file name (Ray Glueck)
  23. ;
  24. ; ---CP/M EQUATES ---
  25. ;
  26. FCB    EQU    5CH
  27. BDOS    EQU    05
  28. FPRT    EQU    9
  29. FCLOSE    EQU    16
  30. DELETE    EQU    19
  31. WRITE    EQU    21
  32. MAKE    EQU    22
  33. SDMA    EQU    26
  34. SRCH    EQU    17
  35. SRCHX    EQU    18
  36. ;
  37. DMA    EQU    80H    ; DMA LOCATION
  38. ;
  39.     ORG    100H    ;CP/M TPA
  40. ;
  41.     LXI    H,0
  42.     DAD    SP
  43.     SHLD    OLDSTK    ;SAVE OLD STACK POINTER
  44. ;
  45. ;
  46. START:    LXI    SP,STACK
  47. ;
  48.     LXI    D,MSG1    ;POINT TO NAME ERROR MESSAGE
  49.     LDA    FCB+1    ;GET FIRST CHAR. OF NAME
  50.     CPI    20H
  51.     JZ    ERROR+3
  52.     JC    ERROR+3    ;IF BAD NAME
  53. ;
  54.     LXI    D,MSG    ;POINT TO STARTUP MESSAGE
  55.     CALL    PTMSG    ;PRINT OUT MESSAGE
  56. ;
  57.     LXI    D,DMA    ;GET STD DMA ADDRESS
  58.     MVI    C,SDMA
  59.     CALL    BDOS
  60. ;
  61.     LXI    D,FCB    ;POINT TO FCB
  62.     MVI    C,DELETE    ;FUNCTION TO DELETE A FILE
  63.     CALL    BDOS
  64. ;
  65.     XRA    A
  66.     STA    FCB+12    ; CLEAR EXTENT BYTE
  67.     STA    FCB+32    ; CLEAR NEXT RECORD BYTE
  68.     LXI    D,FCB
  69.     MVI    C,MAKE
  70.     CALL    BDOS    ;CREATE FILE
  71.     CPI    0FFH
  72.     JZ    ERROR
  73. ;
  74.     LXI    H,BUFF    ;POINT TO START OF MEMORY BUFFER
  75.     SHLD    BUFPTR    ;SAVE POINTER
  76. ;
  77.     MVI    C,SRCH    ;SETUP FOR DIRECTORY SEARCH
  78. LST:    LXI    D,FCB1    ;POINT TO WILD CARD FCB
  79.     CALL    BDOS
  80.     CPI    0FFH    ;TEST FOR END OF DIRECTORY
  81.     JZ    FLZ    ;YES, DUMP BUFFER TO DISC FILE
  82.     ANI    03H    ;NO, SO MASK BYTE ADDRESS
  83.     RLC
  84.     RLC        ;MULTIPLY BY 32 (32 BYTES/FCB)
  85.     RLC
  86.     RLC
  87.     RLC
  88.     ADI    DMA AND 00FFH    ;ADD IN START OF DMA BUFFER
  89.     LXI    D,DMA    ; GET INTO (D,E)
  90.     MOV    E,A
  91.     INX    D    ;POINT TO START OF FILE NAME
  92.     LXI    H,11    ;GET OFFSET TO EXTENT BYTE
  93.     DAD    D    ;POINT TO EXTENT
  94.     MOV    A,M    ;GET IT
  95.     ORA    A    ;IS IT ZERO?
  96.     JNZ    LST1    ;IF NOT FIRST EXTENT
  97. ;    MVI    A,':'    ;GET DELIMITER
  98. ;    CALL    STORE
  99. ;    CALL    STORE
  100. ;    CALL    STORE    ;PUT DELIMITERS AHEAD OF FILE NAME
  101. ;
  102.     MVI    B,8    ;LENGTH OF FILE NAME
  103.     CALL    STOREN    ;SAVE NAME
  104. ;
  105.     MVI    A,'.'    ;DELIMITER BETWEEN NAME AND EXTENT
  106.     CALL    STORE
  107. ;
  108.     MVI    B,3    ;LENGTH OF EXTENT
  109.     CALL    STOREN    ;SAVE EXTENT
  110. ;
  111.     MVI    A,0DH    ;PUT IN CRLF
  112.     CALL    STORE
  113.     MVI    A,0AH
  114.     CALL    STORE
  115. ;
  116. LST1:    MVI    C,SRCHX ;SET TO SEARCH FOR NEXT NAME
  117.     JMP    LST
  118. ;
  119. STOREN: LDAX    D    ;GET CHAR. OF FILE NAME
  120.      CPI    ' '    ;IS IT A SPACE?
  121.      CNZ    STORE    ;NO, SO SAVE IT
  122.     INX    D    ;INCREMENT POINTER
  123.     DCR    B    ;COUNT DOWN CHARACTERS
  124.     JNZ    STOREN    ;LOOP UNTIL DONE
  125.     RET
  126. ;
  127. FLZ:    MVI    A,'Z'-40H    ;GET A CONTROL-Z
  128. CZ1:    CALL    STORE    ;PUT IT IN BUFFER
  129.     JNZ    CZ1    ;FILL OUT SECTOR BUFFER WITH CTL-Z
  130. ;
  131.     LXI    H,BUFF    ;POINT TO START OF BUFFER
  132.     SHLD    WPTR    ;SAVE POINTER
  133. WMORE:    LHLD    WPTR    ;GET POINTER
  134.     XCHG        ;INTO (D,E)
  135.     MVI    C,SDMA    ;SET TO MOVE DMA BUFFER
  136.     CALL    BDOS    ;DO IT
  137.     LXI    D,FCB    ;POINT TO FCB
  138.     MVI    C,WRITE    ;SET TO WRITE DMA BUFFER TO DISC
  139.     CALL    BDOS    ;DO IT
  140.     ORA    A
  141.     JNZ    ERROR    ;IF ERROR, EXIT WITH MESSAGE
  142. ;
  143.     LHLD    WPTR    ;GET BUFFER POINTER
  144.     LXI    D,80H    ;SIZE OF DMA BUFFER
  145.     DAD    D    ;COMPUTE NEW POINTER
  146.     SHLD    WPTR    ;SAVE IT
  147.     LDA    BUFPTR+1    ;GET UPPER ADDRESS OF BUFFER
  148.     CMP    H    ;COMPARE IT WITH CURRENT WRITE POINTER
  149.     JZ    CLOSE    ;CLOSE FILE IF THEY ARE THE SAME
  150.     JNC    WMORE    ;LOOP TO SAVE ALL OF BUFFER TO DISC
  151. ;
  152. CLOSE:    LXI    D,80H    ;GET STD DMA ADDRESS
  153.     MVI    C,SDMA
  154.     CALL    BDOS    ;RESET DMA ADDRESS
  155.     LXI    D,FCB
  156.     MVI    C,FCLOSE
  157.     CALL    BDOS    ;CLOSE FILE
  158. ;
  159. EXIT:    LHLD    OLDSTK    ;GET OLD STACK POINTER BACK
  160.     SPHL
  161.     JMP    0    ;RETURN TO CP/M
  162. ;
  163. STORE:    LHLD    BUFPTR    ;GET BUFFER POINTER
  164.     MOV    M,A    ;SAVE BYTE IN MEMORY BUFFER
  165.     MOV    C,A    ;AND IN (C)
  166.     INX    H    ;POINT TO NEXT LOCATION
  167.     MOV    A,L    ;GET LOWER ADDRESS BYTE
  168.     ORA    A    ;IS IT ZERO?
  169.     MOV    A,C    ;RESTORE BYTE
  170.     SHLD    BUFPTR    ;SAVE NEW BUFFER POINTER
  171.     RET
  172. ;
  173. PTMSG:    MVI    C,FPRT    ;GET CP/M MESSAGE PRINT CODE
  174.     JMP    BDOS    ;EXECUTE PRINT FUNCTION
  175. ;
  176. ERROR:    LXI    D,MSGE    ;POINT TO ERROR MESSAGE
  177.     CALL    PTMSG
  178.     JMP    EXIT    ;RETURN TO CP/M
  179. ;
  180. MSG:    DB    0DH,0AH,' --- DIRECTORY SAVER ver 1.1 ---',0DH,0AH,'$'
  181. MSG1:    DB 0DH,0AH,07,' -- INVALID FILE NAME --',0DH,0AH,0DH,0AH
  182.     DB ' THE PROPER CALLING SEQUENCE IS:',0DH,0AH,0DH,0AH
  183.     DB '        A>DIRLST  NAME.EXT',0DH,0AH,0DH,0AH
  184.     DB '   WHERE  NAME.EXT IS THE FILE NAME TO SAVE THE DIRECTORY IN.'
  185.     DB 0DH,0AH,'$'
  186. MSGE:    DB    0DH,0AH,07,' -- R/W ERROR --',0DH,0AH,'$'
  187. ;
  188. FCB1:    DB 0,'???????????????????'    ;FCB FOR DIRECTORY SEARCH
  189. ;
  190. OLDSTK:    DS    2    ;BUFFER FOR OLD STACK POINTER
  191. BUFPTR:    DS    2    ;BUFFER POINTER FOR FILLING IT
  192. WPTR:    DS    2    ;BUFFER POINTER FOR SAVING IT ON DISC
  193.     DS    80H    ;ROOM FOR STACK
  194. STACK:    DS    1
  195. ;
  196.     ORG    (($+101H) AND 0FF00H)    ;START BUFFER ON PAGE BOUNDARY
  197. BUFF    DB    0
  198. ;
  199.     END
  200.