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
/
KERMIT
/
CP411SRC.ARK
/
cpswld.asm
< prev
next >
Wrap
Assembly Source File
|
1991-04-23
|
7KB
|
223 lines
; CPSWLD.ASM
; KERMIT - (Celtic for "FREE")
;
; This is the CP/M-80 implementation of the Columbia University
; KERMIT file transfer protocol.
;
; Version 4.0
;
; Copyright June 1981,1982,1983,1984
; Columbia University
;
; Originally written by Bill Catchings of the Columbia University Center for
; Computing Activities, 612 W. 115th St., New York, NY 10025.
;
; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
; others.
;
; Multi-file access subroutine. Allows processing of multiple files
; (i.e., *.ASM) from disk. This routine builds the proper name in the
; FCB each time it is called. This command would be used in such pro-
; grams such as modem transfer, tape save, etc. in which you want to
; process single or multiple files.
; Note that it will fail if more than 256 entries match the wildcard.
;
; revision history:
; edit 4: June 20, 1986, by OBSchou. Added stuff at top and tail of routine
; to support multiple FCBs. If the routine get to mfn01 (Search for next)
; then the next file found gets its fcb added to the buffer. Once no
; more files have been found, the mfflg3 flag is set non-zero.
; The first thing to test on entry is whether a disk access
; is needed. Either way, the routine should return the next file name
; in the fcb, or return with the carry flag set if there are no more
; files to do. Once there is a carry flag set for the return, all
; temporary flags are reset. Get all that?
;
; edit 3: July 27, 1984
; support LASM: remove exclamation points, link to CP4CMD.
;
; edit 2: June 7, 1984 (CJC)
; formatting and documentation; add module version string; redo movfcb,
; in preparation for moving DMA buffer (later...).
;
; edit 1: May, 1984 (CJC)
; extracted from CPMBASE.M80 version 3.9; modifications are described
; in the accompanying .UPD file.
;
wldver: db 'CPSWLD.ASM (4) 20-Jun-86$'
; The FCB will be set up with the next name, ready to do normal
; processing (OPEN, READ, etc.) when routine is called.
;
; Carry is set if no more names can be found
;
; MFFLG1 is count/switch [0 for first time thru, pos for all others]
; MFFLG2 is counted down for each successive GETNEXT file call
; MFFLG3 is set to the last remaining FCBs buffered once Search for next
; file fails with files in the buffer.
;
; Technique used is to repeat SFIRST/SNEXT sequence N+1 times for each
; successive call, till sequence fails. CP/M does NOT allow disk-handling
; between SFIRST and SNEXT.
; called by: send, seof, dir
mfname: ora a ; clear carry
push b ;Save registers
push d
push h
jmp mfnam0 ; skip over the next bit (which is entered from elsewhere)
;[4] Get the FCB counter and see if we have any fcbs already.
mfnam1: lxi h,fcb0
shld xfcbptr ; reset the pointer if we are to return an FCB
mfnam0: lda fcbcnt
ana a ; if none, then we may have to get some from disk
jz mfn00 ; see later on
lhld xfcbptr ; we have some, so give the next one to the user
lxi d,fcb ; move from (hl) to (de) for length bc
lxi b,12
call mover
xra a
sta fcbext ; clear fcb extents and such
sta fcbrno ; like record number
lhld xfcbptr ; point to next fcb
lxi d,fcblen
dad d ; yup
shld xfcbptr
lda fcbcnt
dcr a
sta fcbcnt ; decrease the number of fcbs we have
xra a ; clear carry
jmp mffix1 ; and exit as if were all done
mfn00: lda mfflg3 ; no more FCBs for the user, any more on disk?
ana a
jnz mffix2 ; no, then set the carry flag to say so.
lxi h,fcb0 ; now reset the fcb pointers and counter
shld xfcbptr
xra a
sta fcbcnt
;[4] end of this addition. See below as well.
mvi c,setdma ;Init DMA addr, FCB
lxi d,80H
call bdos
xra a ;A = 0
sta fcbext ;clear extension
lda mfflg1 ;find out if "second" call in row
ora a
jnz mfn01 ;Were here before
sta mfflg2
lxi h,fcb
lxi d,mfreq
lxi b,12
call mover ;.from FCB to MFREQ
mvi c,SFIRST ;Search first
lxi d,fcb
call bdos
jmp mfn02 ;and check results
mfn01: dcr a
sta mfflg2 ;store down-counter
lxi h,mfreq ;SFIRST REQ name
lxi d,fcb
lxi b,12
call mover ;.from MFREQ to FCB
mvi c,sfirst ;Search first old one,we got it before
lxi d,fcb
call bdos ;no error's expected -we got that before
mfn01a:
mvi c,snext ;Search next
call bdos
mfn02: push psw
lda mfflg2 ;get "repeat file counter"
ora a
jz mfn02a ;if zero, check if SNEXT had ERROR
dcr a ;count down
sta mfflg2 ;store back
pop psw ;no error-check, we got it before
jmp mfn01a ;next SNEXT
mfn02a: pop psw
ora a
jm mffi2a ;No (more) found
call movfcb ;move data to fcb
lda mfreq ;the original disk-designator
sta fcb ;back into fcb
lda mfflg1 ;get file-flag
inr a ;increment
sta mfflg1 ;and store for next go-around
mvi a,0 ;Setup FCB
sta fcbext ;clean up FCB for OPEN etc
sta fcbrno
lhld xfcbptr ;[4] like here
xchg
lxi h,fcb ;[4] from fcb space
lxi b,12
call mover
lhld xfcbptr ;[4] now lets update the pointers
lxi d,fcblen
dad d
shld xfcbptr ;[4] new pointer
lda fcbcnt ;[4] now the fcb counter
inr a
sta fcbcnt
cpi maxfcb ;[4] any more spare space?
jp mfnam1 ;[4] nope, so get first fcb and return
lxi d,fcb ; else restore the file to serach for
lxi h,mfreq
lxi b,12 ; copy the original fcb to fcb
call mover
jmp mfn01a ; and look for next match.
mffix1: pop h ;restore registers
pop d
pop b
ret ;and return
mffi2a:
sta mfflg3 ;[4] no more FCBs from disks to be had, but
lda fcbcnt ;[4]we have some in the buffer, havet we?
ana a
jnz mfnam1 ;[4] yes, so all's ok. Get an fcb and return,
mffix2: xra a
sta mfflg3 ;[4] clear the new flag (=no more fcbs at all)
sta mfflg2 ;[4] may as well do the others, as we're not comming again
sta mfflg1 ;[4]
stc ;set carry
jmp mffix1 ;return with CARRY set
; copy directory entry to FCB
; called with A/ entry number in directory (0-3)
; directory block in DMA buffer (buff)
movfcb: add a
add a
add a
add a
add a ;* 32
mov c,a ; copy offset to bc
mvi b,0 ; (high byte is zero)
lxi h,buff ; get start of disk buffer
dad b ; calculate start of directory entry
lxi d,fcb
lxi b,12
call mover
ret
; Data storage for MFNAME (multi-file access)
mfreq: DS 12 ;Requested name
mfflg1: DB 0 ;First time thru flag for MFNAME
mfflg2: DB 0 ;Down counter for MFNAME
mfflg3: DB 0 ;[4] Non zero if no more FCBs from disk,
;[4] but we still have some in buffer
;
IF lasm
LINK CPSCMD
ENDIF;lasm