home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / UTILS / DIRUTL / DIRF.AQM / DIRF.ASM
Assembly Source File  |  2000-06-30  |  5KB  |  202 lines

  1. ;            DIRF.ASM ver 1.3
  2. ;        by Keith Petersen, W8SDZ
  3. ;           (revised 12/19/80)
  4. ;
  5. ;    DIRECTORY FUNCTION FOR CP/M 1.4 OR 2.x PROGRAMS
  6. ;
  7. ;This file contains routines which can be included in any
  8. ;CP/M program to allow listing the directory.  No sorting
  9. ;is done because that would require use of more memory above
  10. ;the program.  These routines use the 80h default buffer for
  11. ;all operations so if you have data there be sure to move it
  12. ;before running this directory function.  Assume all registers
  13. ;destroyed when calling 'DIRF'.
  14. ;
  15. ;This module may be assembled as a stand-alone program for
  16. ;testing.  Execute program from CP/M, not DDT or L80.  It
  17. ;will return to the CCP after finishing.
  18. ;
  19. ;Remove the following ORG statement and the END statement
  20. ;when including this module in other programs
  21.     ORG    100H     ;TEMPORARY ORG FOR TESTING
  22. ;
  23. ;--->DIRF.LIB STARTS HERE
  24. ;
  25. NPL    EQU    4     ;NUMBER OF NAMES PER LINE
  26. TAB    EQU    9     ;HORIZONTAL TAB
  27. CR    EQU    0DH     ;CARRIAGE RETURN
  28. LF    EQU    0AH     ;LINE FEED
  29. ;
  30. ;BDOS Equates
  31. ;
  32. RDCHR    EQU    1     ;READ CHAR FROM CONSOLE
  33. WRCHR    EQU    2     ;WRITE CHR TO CONSOLE
  34. PRINT    EQU    9     ;PRINT CONSOLE BUFF
  35. CONST    EQU    11     ;CHECK CONS STAT
  36. FSRCHF    EQU    17     ;0FFH=NOT FOUND
  37. FSRCHN    EQU    18     ;   "         "
  38. CURDSK    EQU    25     ;GET CURRENT DISK NAME
  39. BDOS    EQU    5
  40. FCB    EQU    5CH
  41. ;
  42. ;First, we preserve old stack pointer and set a new one
  43. ;because some functions take more stack space than may
  44. ;be available in the calling program.
  45. DIRF:    LXI    H,0
  46.     DAD    SP     ;GET OLD STACK POINTER
  47.     SHLD    STACK     ;SAVE FOR LATER
  48.     LXI    SP,STACK ;SET NEW STACK POINTER
  49. ;
  50. ;Check FCB for drive request
  51.     LDA    FCB     ;GET DRIVE NAME FROM FCB
  52.     ORA    A     ;ANY REQUESTED? (0=NO)
  53.     JNZ    GOTDRV     ;NOT ZERO MEANS WE HAVE NAME
  54. ;
  55. ;Get drive name
  56.     MVI    C,CURDSK ;GET CURRENT DRIVE NAME
  57.     CALL    BDOS
  58.     INR    A     ;MAKE 'A' RELATIVE TO 1 NOT 0
  59. ;
  60. ;Print signon message and drive name
  61. GOTDRV:    ADI    40H     ;MAKE IT ASCII
  62.     STA    DNAME     ;SAVE IT IN MESSAGE
  63.     LXI    D,MSG     ;POINT TO MESSAGE
  64.     MVI    C,PRINT     ;PRINT IT
  65.     CALL    BDOS
  66. ;
  67. ;Make FCB all '?' to match any file
  68.     LXI    H,FCB+1
  69.     MVI    B,11     ;FN+FT COUNT
  70. ;
  71. QLOOP:    MVI    M,'?'     ;STORE '?' IN FCB
  72.     INX    H
  73.     DCR    B
  74.     JNZ    QLOOP
  75. ;
  76. ;Initialize number of names per line counter
  77.     MVI    A,NPL     ;NR. NAMES PER LINE
  78.     STA    NNAMS     ;INIT COUNTER
  79. ;
  80. ;Look up the FCB in the directory
  81.     MVI    C,FSRCHF ;GET 'SEARCH FIRST' FNC
  82.     LXI    D,FCB
  83.     CALL    BDOS     ;READ FIRST
  84.     INR    A     ;WERE THERE ANY?
  85.     JNZ    SOME     ;GOT SOME
  86.     CALL    ERXIT
  87.     DB    '++NOT FOUND$'
  88. ;
  89. ;Read more directory entries
  90. MORDIR:    MVI    C,FSRCHN ;SEARCH NEXT
  91.     LXI    D,FCB
  92.     CALL    BDOS     ;READ DIR ENTRY
  93.     INR    A     ;CHECK FOR END (0FFH)
  94.     JZ    EXIT     ;NO MORE - EXIT
  95. ;
  96. ;Point to directory entry
  97. SOME:    DCR    A     ;UNDO PREV 'INR A'
  98.     ANI    3     ;MAKE MODULUS 4
  99.     ADD    A     ;MULTIPLY...
  100.     ADD    A     ;..BY 32 BECAUSE
  101.     ADD    A     ;..EACH DIRECTORY
  102.     ADD    A     ;..ENTRY IS 32
  103.     ADD    A     ;..BYTES LONG
  104.     LXI    H,81H     ;POINT TO BUFFER
  105.              ;(SKIP TO FN/FT)
  106.     ADD    L     ;POINT TO ENTRY
  107.     MOV    L,A     ;SAVE (CAN'T CARRY TO H)
  108. ;
  109. ;Check for console break
  110.     PUSH    H     ;SAVE NAME POINTER
  111.     MVI    C,CONST     ;CK STATUS OF KBD
  112.     CALL    BDOS
  113.     POP    H     ;RESTORE NAME POINTER
  114.     ORA    A     ;ANY KEY PRESSED?
  115.     JNZ    ABORT     ;YES, ABORT
  116. ;
  117. ;Print an entry
  118.     MVI    B,8     ;FILE NAME LENGTH
  119.     CALL    TYPEIT     ;TYPE FILENAME
  120.     MVI    A,'.'     ;PERIOD AFTER FN
  121.     CALL    TYPE
  122.     MVI    B,3     ;GET THE FILETYPE
  123.     CALL    TYPEIT
  124.     LXI    H,NNAMS     ;POINT TO NAMES COUNTER
  125.     DCR    M     ;ONE LESS ON THIS LINE
  126.     PUSH    PSW
  127.     CNZ    FENCE     ;NO CR-LF NEEDED, DO FENCE
  128.     POP    PSW
  129.     CZ    CRLF     ;CR-LF NEEDED
  130.     JMP    MORDIR
  131. ;
  132. ;Print two spaces, fence character, then two more spaces
  133. FENCE:    CALL    TWOSPC
  134.     MVI    A,':'     ;FENCE CHARACTER
  135.     CALL    TYPE
  136. ;
  137. ;Print two spaces
  138. TWOSPC:    CALL    SPACE
  139. ;
  140. ;Print one space
  141. SPACE:    MVI    A,' '
  142. ;
  143. ;Type char in A register
  144. TYPE:    PUSH    B
  145.     PUSH    D
  146.     PUSH    H
  147.     MOV    E,A     ;CHAR TO E FOR CP/M
  148.     MVI    C,WRCHR     ;WRITE CHAR TO CONSOLE FUNC
  149.     CALL    BDOS
  150.     POP    H
  151.     POP     D
  152.     POP    B
  153.     RET
  154. ;
  155. ;Type (B) characters from memory (HL)
  156. TYPEIT:    MOV    A,M
  157.     ANI    7FH     ;REMOVE CP/M 2.x ATTRIBUTES
  158.     CALL    TYPE
  159.     INX    H
  160.     DCR    B
  161.     JNZ    TYPEIT
  162.     RET
  163. ;
  164. ;CR-LF routine. HL=NNAMS upon entry
  165. CRLF:    MVI    A,CR     ;CR
  166.     CALL    TYPE
  167.     MVI    A,LF     ;LF
  168.     CALL    TYPE
  169.     MVI    M,NPL     ;NUMBER OF NAMES PER LINE
  170.     RET
  171. ;
  172. ;Error exit
  173. ERXIT:    POP    D     ;GET MSG
  174.     MVI    C,PRINT
  175.     JMP    CALLB     ;PRINT MSG, EXIT
  176. ;
  177. ;Abort - read char entered to clear it from CP/M buffer
  178. ABORT:    MVI    C,RDCHR     ;DELETE THE CHAR
  179. ;
  180. ;Fall into CALLB
  181.  
  182. CALLB:    CALL    BDOS
  183. ;
  184. ;Fall into EXIT
  185. ;
  186. ;Exit - All done, return to caller
  187. EXIT:    LHLD    STACK     ;GET OLD STACK
  188.     SPHL         ;MOVE TO STACK
  189.     RET         ;...AND RETURN
  190. ;
  191. MSG:    DB    TAB,TAB,'    Directory for drive '
  192. DNAME:    DB    'X:',CR,LF,'$'
  193. ;
  194. ;Temporary storage area
  195. NNAMS:    DS    1     ;NAMES PER LINE COUNTER
  196.     DS    40     ;ROOM FOR STACK
  197. STACK:    DS    2     ;OLD STACK STORED HERE
  198. ;
  199. ;Temporary end statement used only for testing DIRF module.
  200. ;Remove before including module in other programs.
  201.     END    DIRF
  202.