You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

264 lines
7.6 KiB

;
TITLE ZMDEL.Z80 - 09/29/88 - ZMD Sysop Transfer Log Purge Utility
; Copyrighted (c) 1987, 1988
; Robert W. Kramer III
PAGE
;- -;
; Update History ;
; ;
; Date Release Comments ;
; -------- ------- ---------------------------------------------- ;
; ;
; 09/29/88 v1.50 - No change(s) made to this file ;
; 03/18/88 v1.49 - No change(s) made to this file ;
; 03/13/88 v1.48 - Had a small problem with TPA fix which has been ;
; corrected. CHKTPA was calculating the total ;
; number of bytes available for DBUF, but wasn't ;
; clearing register L (forcing an even amount of ;
; sectors before initializing OUTSIZ buffer limit ;
; comparison word). This may have introduced ;
; minimal garbage to your FOR file if your FOR ;
; file is large enough to fill available TPA with ;
; ZMD, ZFORS or to the log file if running ZMDEL. ;
; - Rewrote OUTCHR routine in ZMDSUBS. ;
; - Redefined buffer table at end of programs. STACK;
; and filename buffers now EQUated with offsets ;
; from the last switch/toggle in program instead ;
; of with DS directive. ;
; - Some systems which do NOT have an interrupt ;
; driven keyboard may have noticed problems when ;
; an invalid key was entered in the ZNEWP, ZFORP ;
; and ZMDEL programs. In ZNEWP and ZFORP, if a ;
; CR was entered to pause the output, output was ;
; limited to one line at a time per key pressed. ;
; If an invalid key was hit, output would have ;
; remained in a paused state until one of the ;
; abort keys were pressed. This was difficult to ;
; find since my keyboard is interrupt driven and ;
; I could not duplicate the problem on my own ;
; system. ;
; 02/25/88 v1.47 - Fixed line count display routine. Number of ;
; lines read was being improperly decremented ;
; before displaying. Same fix included removing ;
; code that added an extra CR,LF to the beginning ;
; of the file. Count is now right. ;
; 01/27/88 v1.46 - Some changes were made to the ZMDSUBS file that ;
; are not directly related to this file ;
; 01/17/88 v1.45 - First public release ;
; 11/20/87 v1.00 - Initial version ;
;- -;
;-------------------------------------------------------------------------;
; EXTERNAL Declarations: |
;-------------------------------------------------------------------------;
EXTRN CKABRT,CLEARIT,CLRLIN,DBUF,DECOUT,ERXIT,EXIT,ILPRTB
EXTRN INPUT,NOFILE,NOLOG,NOROOM,OLDDRV,OLDUSR,OUTCHR,PRINTV
EXTRN RECAR1,RECDR1,RENFCB,RERROR,RSDMA,SHONM4,STACK,STDMA
EXTRN TDONE,TYPE,UCASE
;
;-------------------------------------------------------------------------;
; Program Starts Here |
;-------------------------------------------------------------------------;
.Z80
ASEG
ORG 100H ; Program starts
JP BEGIN ; Jump around configuration table
INCLUDE ZMDHDR.Z80 ; Include the ZMD header overlay
.REQUEST ZMDSUBS ; Include the ZMD subroutines
;
;
; Save CP/M stack, initialize new one for this program
;
BEGIN: LD (STACK),SP ; Save return address to CCP
LD SP,STACK
;
; Save current drive/user
;
LD A,255 ; Get user function
CALL RECAR1
LD (OLDUSR),A ; Save user area for later
LD C,CURDRV ; Get current drive function
CALL BDOS
LD (OLDDRV),A ; Save drive for later
;
; Tell em who we are and ask if they want to continue
;
LD HL,PRGUTL
CALL PRINTV
LD A,(LOGCAL) ; Log file enabled?
OR A
JP Z,NOLOG ; No, then don't run program
CALL ILPRTB
DB 'Purge all except "R" entries from log? ',0
LD A,0
LD (DESWAIT),A ; Disable sleepy caller timout
CALL INPUT
CALL UCASE
CP 'Y' ; Continue?
JP NZ,EXIT ; No, exit to CP/M
CALL CLRLIN
;
; Now log into drive/user area of ZMD.LOG
;
LD A,(LOGUSR) ; Get user area to find ZMD.LOG file
CALL RECAR1
LD A,(LOGDRV) ; Get drive to find ZMD.LOG file
CALL RECDR1
;
; Open the 'ZMD .LOG' file
;
LD DE,LOGNAM ; Point to LOG filename
LD HL,FILE ; Destination is internal FCB1
CALL RENFCB ; Initialize FCB
LD DE,FILE ; Point to ZMD.LOG FCB
LD C,OPEN ; Open file
CALL BDOS
INC A ; Does file exist?
LD HL,LOGNAM ; Point to log filename
JP Z,NOFILE ; No, inform user and abort to CP/M
;
; Open the ' .$$$' file
;
LD DE,TEMPFIL ; Point to temporary filename
LD HL,DEST ; Destination is internal FCB2
CALL RENFCB ; Initialize FCB
LD HL,FILE ; Point to default FCB
LD DE,DEST ;
LD BC,9 ; Move drive and filename bytes
LDIR
LD C,DELETE ; Delete possible '$$$' temporary file
LD DE,DEST
CALL BDOS
LD C,MAKE ; And make new one for this session
LD DE,DEST
CALL BDOS
INC A ; Successful create?
JP Z,NOROOM ; No, inform user and exit to CP/M
CALL ILPRTB ; Warn them of the wait
DB CR
DB 'Cleaning ',0
LD HL,LOGNAM
CALL SHONM4
RDRECD: CALL RSDMA ; Reset DMA
LD DE,FILE ; Read a record from ZMD.LOG
LD C,READ
CALL BDOS
OR A ; Read ok?
JP NZ,RERROR ; No, inform user and exit
LD HL,TBUF ; Point to first character in read buffer
GETBYT: LD A,(HL) ; Get a byte from read buffer
AND 7FH ; Strip parity bit
CP 7FH ; Del (Rubout)
JP Z,NEXT ; Yes, ignore it
CP EOF ; End of file marker
JP Z,TDONE ; Transfer done. Close and exit
LD B,A ; Save character
CP LF ; Was it a line feed?
JP Z,NEWLIN ; Yes toggle line counters, start new line
;
; LOGMODE is set to 0 everytime a line feed is encountered. If LOGMODE is
; is 0 at this point, the current byte is anylized as this log entry's
; mode of transfer. Only entries made in the 'R' receive mode are written
; to the new ZMD.$$$ file. Encountering an 'R' when LOGMODE is 0 causes
; KEEPER to be set non zero
;
LD A,(LOGMODE) ; Start of new line?
OR A
JP NZ,NXTBYT ; No, then we don't care what this byte is
INC A
LD (LOGMODE),A ; Else show we are not on LOGMODE byte anymore
LD A,B ; Get the character back
CP 'R' ; Is this an upload entry?
LD (KEEPER),A ; Indicate saving byte just in case
JP Z,NXTBYT ; Yes, leave KEEPER non-zero so it's written
XOR A
LD (KEEPER),A ; Else 0 keep flag (0=don't keep this entry)
NXTBYT: LD A,(KEEPER) ; Keeping this log entry?
OR A
JP Z,NEXT ; No, get next byte
;
; Place current byte in buffer and write to disk if buffer full
;
WRTBYT: LD A,B
CALL OUTCHR
NEXT: INC L ; Done with sector?
JP Z,RDRECD ; Yes, get another sector
JP GETBYT ; Else get another byte
NEWLIN: XOR A ; Zero accumulator
LD (LOGMODE),A ; Show current byte is log mode byte
LD IY,(LNSREAD) ; Get lines read counter
INC IY ; Add one more
LD (LNSREAD),IY
LD A,1 ; Disable page pauses
CALL CKABRT ; User abort?
LD A,(KEEPER) ; Are we keeping this entry?
OR A
JP Z,NEXT ; No, read another byte
LD IY,(LNSWROT) ; Get lines written count
INC IY ; Add one more
LD (LNSWROT),IY
JP WRTBYT
;
DONE:: CALL CLRLIN
CALL ILPRTB
DB CR,'Finished.'
DB CR,LF
DB ' ',0
LD HL,(LNSREAD)
CALL DECOUT
CALL ILPRTB
DB TAB
DB 'original lines',CR,LF
DB ' ',0
LD HL,(LNSWROT)
CALL DECOUT
CALL ILPRTB
DB TAB
DB 'retained lines ',0
JP EXIT
;
; These next are dummy routines to satisfy external ZMDSUBS requests.
; They do nothing, but leave alone.
;
TIME:: RET
KEEPER: DB 0
LOGMODE:DB 0
LNSREAD:DW 0
LNSWROT:DW 0
END