home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
turbom2
/
long-sub.mod
< prev
next >
Wrap
Text File
|
1994-07-13
|
9KB
|
246 lines
NOTE on a SUBmit utility for ZCPR33 for long submit files.
by Thomas E. Croley II, 2 July 1987
* Corrects ZCPR33 error in submit processing for $$$.SUB
files longer than can be accessed with a single
directory entry.
* Requires modification of ZCPR33 CCP !!!! (see below).
* Requires modification of submit utility, SUB34 (see below).
* XSUB not supported (I can't get XSUB to work properly with
the unchanged SUB34 and ZCPR33 with short submit files
yet, let alone the changed versions with long files!)
Submit file processing is (and has always been?) limited to short *.SUB file
lengths (fewer than 128 lines for disk allocation blocks of 2k, 256 lines
for disk allocation blocks of 4k, ...). This is because ZCPR33 finds the
last record in the $$$.SUB file for processing and attempts to close the file
one record shorter to remove that record (command) from further processing;
to do this, ZCPR33 decrements the record count in the FCB for the file before
the close. This works if there is only one directory entry in the directory
for the $$$.SUB file but it does not work if there are more. If you use a
disk allocation block size of 2k, then one directory entry manages 16k (one
extent) of file space (=128 records) which, at one line per record in a
$$$.SUB file, limits your submit files (*.SUB) to 128 lines. Likewise, a 4k
block size allows one directory entry to manage 32k (two extents) of file
space (=256 records), limiting submit files to 256 lines, and so forth.
Subsequently, for longer $$$.SUB files, ZCPR33 neither finds the end of file
correctly, nor is it able to reduce the file length past the point allocated
to an earlier directory entry. The proper way around this is to implement
direct access ("random access" in old CP/M terminology) file manipulations to
find the end of the file and to keep track of the last record processed. The
SUB utility must be modified also to use this method so that the last record
(first command) to be accessed by the CCP is pointed to in the file (the last
record of the file is used for this purpose here). Also, file append (for
nesting of SUB commands), must properly maintain this pointer.
If you use wish to use long submit files, you must modify BOTH the SUB
command AND your ZCPR33 CCP by changing the following code as instructed
below.
The PENALTY is that it will slow submit file processing (hardly noticeable on
a RAM disk but may be significant on a floppy) since additional disk reads
and writes are required to find and maintain the next-command pointer. These
reads and writes are not to sequential records on the disk since the pointer
is maintained in the last record of the file while commands are taken
successively toward the beginning.
The ADVANTAGE is that it will allow arbitrary length submit files for
processing.
IF YOU DO NOT MODIFY THE SUB COMMAND AND DO NOT MODIFY YOUR ZCPR33 CCP AS
FOLLOWS, THEN _BEWARE_ THAT SUMBIT FILES WITH LINE LENGTHS EXCEEDING THE ABOVE
LIMITS WILL NOT BE POSSIBLE _AND_ THERE IS NO ERROR MESSAGE NOR ERROR CHECKING
FOR THIS CONDITION WITHIN THE CCP.
NOTE also that XSUBZ must be modified to be consistent with the new file
structure for $$$.SUB. I spent a day trying to modify XSUBZ12 but could not
get it to work. There are difficulties already present in XSUBZ12 since I
could not get the unmodified XSUBZ to work correctly with the unmodified
SUB34 and ZCPR33. These difficulties should be resolved before similar
changes are made to XSUBZ to allow direct access of records. For now, XSUBZ
or XSUB cannot be used with the modified SUB routine (nor, apparently, with
the unmodified routine either).
MODIFICATIONS TO ZCPR33.Z80 (may require reconfiguration in Z33HDR.LIB to
make room for the additional code on your machine)
Find the label "subfcr:" in ZCPR33.Z80 and add the code denoted by ";TEC" as
follows:
subfcr:
defs 1 ; Current record number
subfr: ;TEC
defs 3 ;TEC Random record no. (16 bits) + ovrflw byte
Find the label "readbuf:" in ZCPR33.Z80 and modify or add the code as denoted
by ";TEC" as follows:
readbuf:
ld a,(zexrunfl) ; Get ZEX-running flag
or a
jp nz,userinput ; If ZEX running, go directly to user input
if subon ; If submit facility is enabled, check for it
ld a,(subflag) ; Test for submit file running
or a
jr z,shellinput ; If not, go on to possible shell input
xor a ; Log into user 0
call setuser
call defltdma ; Initialize DMA pointer
ld de,subfcb ; Point to submit file FCB
call open ; Try to open file
jr z,readbuf1 ; Branch if open failed
;TEC ld hl,subfrc ; Point to record count in submit FCB
;TEC ld a,(hl) ; Get the number of records in file
;TEC dec a ; Reduce to number of last record
;TEC ld (subfcr),a ; ..and put into current record field
ld c,23h ;TEC "Compute file size" bdos call no.
call bdossave ;TEC DE still => subfcb; get file size in subfr
ld hl,(subfr) ;TEC Get file size
dec hl ;TEC Decrement to get last record no.
ld (subfr),hl ;TEC Replace in random record field
ld c,21h ;TEC "Read random" bdos call no.
call bdossave ;TEC DE still => subfcb; randm read last record
ld hl,(tbuff) ;TEC Get current "last record" from last record
dec hl ;TEC Point to next earlier record to read
ld (tbuff),hl ;TEC Save pointer in actual last record
inc c ;TEC ... and write back to file (c=22h)
call bdossave ;TEC DE still => subfcb; randm write last recrd
ld (subfr),hl ;TEC Now prepare to read new "last record"
dec c ;TEC (c=21h)
call bdossave ;TEC Random read record; DE still => subfcb
;TEC call read ; Attempt to read submit file
;TEC jr nz,readbuf1 ; Branch if read failed
;TEC dec (hl) ; Reduce file record cound
;TEC dec hl ; Point to S2 byte of FCB (yes, this is req'd!)
;TEC ld (hl),a ; Stuff a zero in there (A=0 from call to READ)
ld (subfrc-1),a ;TEC Zero FCB S2 byte (A=0 from previous read)
call close ; Close the submit file one record smaller
jr z,readbuf1 ; Branch if close failed
END of ZCPR33.Z80 changes...
MODIFICATIONS TO SUB34.Z80
Find the label "wrset:" in SUB34.Z80 and modify or add the code denoted by
";TEC" as follows:
;
; SET UP THE $$$.SUB FILE
; FOR WRITING
;
wrset:
call print
db cr,lf,' Writing Command File to Disk',0
ld e,0 ; Set user 0
ld c,20h
call bdos
ld de,subfcb
ld c,openf
call bdos ; Open the file
inc a ; Check cpm return
jp z,none1 ; None exists already
;
; $$$.SUB EXISTS, SO SET
; FCB TO APPEND TO IT
;
ld de,subfcb ;TEC Point to submit file FCB
ld c,23h ;TEC "Compute file size" bdos call no.
call bdos ;TEC Get file size in subfr
ld hl,(subfr) ;TEC Get file size
dec hl ;TEC Decrement to get last record no.
ld (oldfsz),hl ;TEC Save present file last record no.
ld (subfr),hl ;TEC Replace in random record field
ld de,subfcb ;TEC Point to submit file FCB again
ld c,21h ;TEC "Read random" bdos call no.
call bdos ;TEC Random read last record
ld hl,(tbuf) ;TEC Get current "last record" pointer
dec hl ;TEC Decr. to point to last unprocessed record
ld (subfr),hl ;TEC Now read "last record"
ld de,subfcb ;TEC Point to submit file FCB again
ld c,21h ;TEC "Read random" bdos call no.
call bdos ;TEC Random read record
ld de,subfcb ;TEC Prepare for sequential (re)write to update
ld c,15h ;TEC ... DOS pointers for further writes
call bdos ;TEC Write same info back to set DOS pointers
;TEC ld a,(subfcb+fcbrc) ; Get record count
;TEC ld (subfcb+fcbnr),a ; Make next record
ret
oldfsz: ds 2 ;TEC space for "old file size"
;
; COME HERE WHEN NO $$$.SUB EXISTS
;
none1:
xor a ;TEC
ld (oldfsz),a ;TEC Zero "old file size" since it did'nt exist
ld (oldfsz+1),a ;TEC
ld de,subfcb
ld c,makef
call bdos
inc a
jp z,nomake ; 0ffh=can't create file
ret
Find the label "close:" in SUB34.Z80 and add the code denoted by ";TEC" as
follows:
;
; $$$.SUB IS WRITTEN, CLOSE THE FILE
;
close:
ld de,subfcb ;TEC
ld c,24h ;TEC Set random record number for record after
call bdos ;TEC ... last write
ld hl,(subfr) ;TEC Get rndm record no. for last record write
ld (tbuf),hl ;TEC Place in write buffer
ld de,(oldfsz) ;TEC DE = old last record number
xor a ;TEC Clear carry bit
sbc hl,de ;TEC Is new last record number >= old?
jr nc,nfeok ;TEC New file end O.K.
ld (subfr),de ;TEC ... else use old last record number
nfeok: ld de,subfcb ;TEC
ld c,22h ;TEC "Write random" bdos call no.
call bdos ;TEC Write current record no. to last record.
ld de,subfcb
ld c,closef
jp bdos
Find the label "subfcb:" in SUB34.Z80 and modify or add the code denoted by
";TEC" as follows:
;
;
; FCB FOR $$$.SUB
;
subfcb:
db 1 ; Drive specifier (a selected)
db '$$$ '
subtyp:
db 'SUB'
dw 0,0,0,0 ; Initialize rest of fcb
dw 0,0,0,0
;TEC dw 0,0,0,0
dw 0,0 ;TEC
db 0 ;TEC
subfr: dw 0 ;TEC Direct-access 16-bit record number
db 0 ;TEC Overflow byte
;
clbuf: ds 2 ; Ptr to command line buffer
fremem: ds 2 ; Ptr to free memory area
;
end
END of SUB34.Z80 changes...
END OF NOTE on a SUBmit utility for ZCPR33 for long submit files.