        Name feed
        Title   feed
        page    ,132
comment /

        This program is a filter that reads the parameter line
        for a file spec.  If it finds one it opens all matching
        files and sends them to standard output.  This is good
        for processing more than one file, find, translat, etc.
/
;===================================================================
code    segment public
;===================================================================
;
;       command line is at 80h of psp - first byte is length
;
        org     80h
;parmsize       db      ?
;parm           db      7fh dup (?)
dta     db      21 dup (?)
attrib  db      ?
ftime   dw      ?
fdate   dw      ?
fsize   dd      ?
fname   db      13 dup (?)      ; dta asciiz filename from dos.
;
; .com starts at 100h - but must jump around any data area
;
        org     100h                    ; com file starts here
        assume  cs:code,ds:code,es:code
feed:
        jmp     clear
;===================================================================
;
; data area for .com programs
;
handle  dw      0h                      ; assume standard input
bufsiz  equ     255
buffer  db      bufsiz dup (?)
;
;===================================================================
clear:
;
; start of actual code is here (clear)
;
;
; now figure out which file to read from - parm line or standard input
;
        cmp     dta,0h          ; if zero, no parm
        jz      nomore          ; must have parm to read
;
; parm length is not zero - assume the parm is a file name.  If not
; found, quit.
;
        mov     al,dta          ; get size of parm
        xor     ah,ah           ; zero out top part of accum.
        mov     si,ax           ; use length as a pointer into the dta
        mov     [si]+dta+1,0h   ; to tack on a zero byte (asciiz).
;
; Use the default dta at 80h.  Find first matching filename.
;
        lea     dx,dta+2        ; address of 'filename'
        xor     cx,cx           ; attributes of file - (normal)
        mov     ah,4Eh          ; dos
        int     21h             ; invoke function
        jc      nomore          ; error or no match - quit
;
; fname should now contain the first byte of an asciiz filename that
; matches the filespec from the parmline. open the file and send it
; to standard output.
;
again:
;
; open the file
;
        lea     dx,fname        ; point at asciiz filename
        mov     al,0h           ; open for reading
        mov     ah,3dh          ; read function call
        int     21h             ; invoke dos
        jc      oops
        mov     handle,ax       ; save file handle.
;
; now use the handle to read the file.  AX will contain the # of
; characters returned from the file after the read.
; if ax=0 eof.
;
readloop:
        mov     bx,handle       ; read from standard input or file
        mov     cx,bufsiz       ; # of characters to read
        lea     dx,buffer       ; seg:off address of buffer area
        mov     ah,3fh          ; dos read function
        int     21h             ; invoke function
        jc      oops            ; error!
        cmp     ax,0h           ; if zero, end of file
        jz      oops
;
        mov     cx,ax           ; cx (and ax) contain # characters read
        lea     si,buffer       ; offset of buffer
;
        mov     bx,1h           ; standard output device
        mov     ah,40h          ; dos write function
        int     21h             ; invoke dos function

        jmp     readloop        ; repeat until end of file or error
oops:
;
; end of file or access error
; jump to next filename
;
        mov     ah,4fh          ; this call takes no input.
        int     21h             ; if carry set, no more files.
        jnc     again           ; if no carry, go transfer this one
nomore:
        int     20h             ; return to dos
code    ends
        end     feed
