home *** CD-ROM | disk | FTP | other *** search
- 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.