home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug041.arc / TEXT.MAC < prev    next >
Text File  |  1979-12-31  |  8KB  |  325 lines

  1. ;====================================================================
  2. ;
  3. ; TEXT :- Type all files matching afn1.
  4. ;
  5. ;   PROGRAM
  6. ;
  7. ;
  8. ;====================================================================
  9. ;
  10. ; Declare macros :-
  11. ;
  12. ;
  13.     INCLUDE    MACRO.LIB
  14. ;--------------------------------------------------------------------
  15. ;
  16. ; TXT :- Type all files matching a given FCB.
  17. ;
  18. ;   MACRO
  19. ;
  20. ;   Parameters
  21. ;     FCBADDR :- Address at which the FCB for which all matching
  22. ;    files are to be typed is located (only the first 00Ch bytes
  23. ;    are relevant), default is CCPFCB
  24. ;     START :- Address from which TXT may use as a buffer, default
  25. ;    is contents of DE
  26. ;     LIMIT :- First address after the end of the buffer, default is
  27. ;    contents of HL
  28. ;     BUFFER :- Address of start of file buffer, default is CPMBUFF
  29. ;
  30. ;   Returns
  31. ;     BC :- Number of matching files found
  32. ;     DE :- START
  33. ;     HL :- LIMIT
  34. ;
  35. ;   Destroys
  36. ;     file buffer
  37. ;     TYPE data region (BUFF2, TYPEFCB)
  38. ;     DSEARCH data region (BUFF, OFFSET, LENGTH, SCHFCB)
  39. ;     FSEARCH data region (DSKNO, DEFAULT)
  40. ;
  41. ;   TXT requires the inclusion of the subroutines TYPE, FNAME,
  42. ;     FSEARCH and DSEARCH.
  43. ;
  44. ;   If insufficient space is available to store all matching entries
  45. ;     the error is reported and ERREXIT executed.    
  46. ;
  47. ;   If the buffer available for displaying the file is to small the
  48. ;     error is reported and ERREXIT is executed (RECSIZE is the
  49. ;     minimum space required).
  50. ;
  51. ;   If BDOS reports an error in displaying the file ERREXIT is
  52. ;     executed after the error is reported.
  53. ;
  54. ;   Bit 7 is masked out.
  55. ;
  56. ;   Control characters other than CR, HT, LF are shown as Eg. ^G.
  57. ;
  58. ;   While the file is being displayed the following keys may be
  59. ;     used :-
  60. ;    ctrl-S    Pause display (any key to restart)
  61. ;    ctrl-C    Exit program immediately
  62. ;    ESC    Abort display of current file
  63. ;
  64. ;
  65. TXT    MACRO    FCBADDR, START, LIMIT, BUFFER
  66.     IFNB    <BUFFER>    
  67.     LD    BC, BUFFER
  68.     ELSE
  69.     LD    BC, CPMBUFF
  70.     ENDIF
  71.     LD    (BUFF2), BC
  72.     IFNB    <START>
  73.     LD    DE, START
  74.     ENDIF
  75.     PUSH    DE
  76.     LD    (FILE), DE
  77.     FILES    FCBADDR,, LIMIT, BUFFER
  78.     JR    NZ, FILESNG    ; not enough room to hold files
  79.     PUSH    HL
  80.     PUSH    BC
  81. TYPENXT:LD    A, B
  82.     OR    C
  83.     JR    Z, TXTEXIT
  84.     PUSH    BC
  85.     WRITE    'Displaying file '
  86.     LD    BC, (FILE)    ; set FCB address
  87.     CALL    TFNAME
  88.     WRITELN
  89.     CALL    TYPE
  90.     WRITELN
  91.     PUSH    HL
  92.     LD    HL, 00010h
  93.     ADD    HL, BC
  94.     LD    (FILE), HL    ; update address of filename
  95.     POP    HL
  96.     POP    BC
  97.     DEC    BC        ; update number of files remaining
  98.     JR    TYPENXT
  99. FILESNG:WRITELN    'Too many files found for available memory space.'
  100.     JP    ERREXIT
  101. TXTEXIT:POP    BC
  102.     POP    HL
  103.     POP    DE
  104.  
  105.     DSEG
  106. FILE:    DS    WORD    ; address of current filename in buffer
  107.     CSEG
  108.  
  109.     ENDM
  110. ;====================================================================
  111. ;
  112. ; Program :-
  113. ;
  114. ;
  115.     ENTRY
  116.     LD    A, (CPMBUFF)
  117.     OR    A
  118.     JR    NZ, DISP    ; parameter given
  119.     WRITELN 'TEXT :- Type all matching files to the console.'
  120.     WRITELN '  ctrl-C    Abort program'
  121.     WRITELN '  ctrl-S    Suspend display'
  122.     WRITELN '  ESC        Abort display of this file'
  123.     RET
  124. DISP:    TXT
  125.     LD    A, B
  126.     OR    C
  127.     RET    NZ        ; at least one file was found
  128.     WRITELN 'No matching files found.'
  129.     RET
  130. ;====================================================================
  131. ;
  132. ; Subroutines :-
  133. ;
  134. ;
  135. ; TYPE :- Type a text file to the console.
  136. ;
  137. ;   SUBROUTINE
  138. ;
  139. ;   Parameters
  140. ;     BC :- Address of the FCB of the file to be typed (only the
  141. ;    first 00Ch bytes are relevant)
  142. ;     DE :- Address from which TYPE may use as a buffer
  143. ;     HL :- First address after the end of the buffer
  144. ;     BUFF2 :- Address at which address of file buffer is to be
  145. ;    placed prior to calling
  146. ;
  147. ;   Returns
  148. ;     Z flag :- Reset if physical end of file reached.
  149. ;
  150. ;   Conserves
  151. ;     BC
  152. ;     DE
  153. ;     HL
  154. ;
  155. ;   Destroys
  156. ;     file buffer
  157. ;
  158. ;   If the buffer available for displaying the file is to small the
  159. ;     error is reported and ERREXIT is executed (RECSIZE is the
  160. ;     minimum space required).
  161. ;
  162. ;   If BDOS reports an error ERREXIT is executed after the error is
  163. ;     reported.
  164. ;
  165. ;   Bit 7 is masked out.
  166. ;
  167. ;   Control characters other than CR, HT, LF are shown as Eg. ^G.
  168. ;
  169. ;   While the file is being displayed the following keys may be
  170. ;     used :-
  171. ;    ctrl-S    Pause display (any key to restart)
  172. ;    ctrl-C    Exit program immediately
  173. ;    ESC    Abort display of this file
  174. ;
  175. ;
  176. TYPE:    PUSH    BC
  177.     PUSH    HL
  178.     PUSH    DE
  179.     OR    A
  180.     SBC    HL, DE
  181.     JR    C, BUFFNG    ; buffer of negative size
  182.     LD    A, L
  183.     AND    100h - RECSIZE    ; RECSIZE a multiple of 2, hence
  184.     LD    L, A        ;   remainder removed from size of
  185.     OR    H        ;   buffer
  186.     JR    Z, BUFFNG    ; usable buffer of length zero
  187.     ADD    HL, DE        ; HL contains first byte past end of
  188.     PUSH    HL        ;   usable buffer
  189.     LD    H, B
  190.     LD    L, C
  191.     LD    DE, TYPEFCB
  192.     LD    BC, 00Ch
  193.     LDIR
  194.     XOR    A
  195.     LD    (TYPEFCB + ex), A
  196.     LD    (TYPEFCB + s2), A
  197.     SERVICE    OPEN, TYPEFCB    ; Attempt to open file
  198.     INC    A
  199.     JR    Z, OPENERR
  200.     XOR    A
  201.     LD    (TYPEFCB + cr), A    ; set cr to 000h
  202.     POP    HL
  203.     POP    DE
  204.     PUSH    DE
  205. NXTBUFF:CALL    FILL
  206.     PUSH    AF
  207.     CALL    DISPLAY
  208.     JR    NZ, LOGICAL
  209.     POP    AF
  210.     JR    Z, NXTBUFF
  211.     JR    PHYSCAL
  212. LOGICAL:POP    AF
  213.     OR    A        ; set Z flag
  214. PHYSCAL:LD    DE, (BUFF2)
  215.     PUSH    AF
  216.     SERVICE    SETBUFF
  217.     POP    AF        ; conserve Z flag
  218.     POP    DE
  219.     POP    HL
  220.     POP    BC
  221.     RET
  222. BUFFNG:    WRITELN    'Insufficient space available to display file.'
  223.     JR    QUIT
  224. OPENERR:WRITELN    'BDOS could not open file.'
  225. QUIT:    JP    ERREXIT
  226.  
  227. FILL:                ; fill buffer, DE contains start
  228.                 ;   of buffer address, HL contains
  229.                 ;   end of usable buffer address + 1
  230.                 ;   (DE conserved, HL returned as top
  231.                 ;   of file in buffer + 1 (HL
  232.                 ;   conserved except on last fill)).
  233.                 ;   Reset Z flag if BDOS unable to
  234.                 ;   continue filling buffer
  235.                 ;   (generally EOF).
  236.     PUSH    DE
  237.     LD    BC, RECSIZE
  238. NXTREC:    SERVICE    SETBUFF
  239.     SERVICE    READ, TYPEFCB    ; read record in buffer area
  240.     OR    A
  241.     JR    NZ, ENDFILE
  242.     EX    DE, HL
  243.     ADD    HL, BC        ; set address for next read
  244.     EX    DE, HL
  245.     PUSH    HL
  246.     SBC    HL, DE
  247.     POP    HL
  248.     JR    NZ, NXTREC    ; buffer not full yet
  249. ENDFILE:EX    DE, HL        ; HL points to top of file in buffer
  250.     POP    DE
  251.     RET
  252.  
  253. DISPLAY:            ; display buffer, DE contains start
  254.                 ;   of buffer address, HL contains
  255.                 ;   end of buffer address + 1 (DE, HL
  256.                 ;   conserved). Reset Z flag if file
  257.                 ;   ended logically or was aborted.
  258.                 ;   While the file is being displayed
  259.                 ;   the following keys may be used :-
  260.                 ;   ctrl-S    Pause listing
  261.                 ;   ctrl-C    Terminate program
  262.                 ;   ESC        Terminate this file
  263.                 ;     A = 0FFh if ESC else 000h
  264.     PUSH    DE
  265. NXTBYTE:PUSH    HL
  266.     SERVICE    DIRCON, 0FFh
  267.     CP    'S' - 040h
  268.     JR    NZ, NOPAUSE
  269. PAUSE:    SERVICE    DIRCON, 0FFh    ; ^S pressed, pause until keypressed 
  270.     OR    A
  271.     JR    Z, PAUSE
  272. NOPAUSE:CP    'C' - 040h
  273.     JP    Z, EXIT        ; ^C pressed, terminate program
  274.     CP    ESC
  275.     JR    Z, QT        ; ESC pressed, abort typing file
  276.     OR    A
  277.     SBC    HL, DE
  278.     POP    HL
  279.     JR    Z, ENDDSP
  280.     LD    A, (DE)
  281.     CP    EOF
  282.     JR    Z, LOGEND
  283.     AND    07Fh        ; reset bit 7
  284.     CP    ' '
  285.     JR    NC, PRNTBLE    ; if not a control character
  286.     CP    RET
  287.     JR    Z, PRNTBLE    ; if a carriage return
  288.     CP    LF
  289.     JR    Z, PRNTBLE    ; if a line feed
  290.     CP    HT
  291.     JR    Z, PRNTBLE    ; if a horizontal tab        
  292.     ADD    A, '@' - NUL    ; convert to a printable character
  293.     PUSH    AF
  294.     SERVICE    CONOB, '^'
  295.     POP    AF
  296. PRNTBLE:PUSH    DE
  297.     LD    E, A
  298.     SERVICE    CONOB
  299.     POP    DE
  300.     INC    DE
  301.     JR    NXTBYTE
  302. LOGEND:    INC    A        ; reset Z flag (A contained EOF =
  303. ENDDSP:    POP    DE        ;   01Ah)
  304.     LD    A, 000h        ; file has been typed fully
  305.     RET
  306. QT:    POP    HL
  307.     POP    DE
  308.     LD    A, 0FFh        ; file was aborted early
  309.     OR    A        ; reset Z flag
  310.     RET
  311.  
  312.     DSEG
  313. BUFF2:    DS    WORD        ; address at which I/O buffer resides
  314. TYPEFCB:DS    FCBSIZE        ; FCB of file to be typed
  315.     CSEG
  316. ;--------------------------------------------------------------------
  317.  
  318.     TFNAME            ; macro declared subroutines
  319.     FSEARCH
  320.     DSEARCH
  321. ;====================================================================
  322.  
  323. ENDPROG:
  324.     END
  325.