home *** CD-ROM | disk | FTP | other *** search
- ;
- ; PIPPAT2.ASM
- ;
- ; PIP patch to add '(E)xit', '(R)eset Disks' and '(Q)uick Repeat'
- ; functions.
- ;
- ;The R- and Q-commands are from:
- ;Kelly Smith, Lifelines, Vol. III No. 3 (1982) pg. 15.
- ;
- ;The E-command added by P.L.Kelley
- ;
- ;E-command: Exit, to allow exit from PIP in SUBMIT files.
- ;R-command: Reset disks, ie. log in freshly inserted disks.
- ;Q-command: Reset disks and repeat last operation.
- ;
- ;
- BDOS EQU 0005H ;BDOS entry address
- FCB EQU 005CH ;default file control block address
- DFCB EQU 0080H ;default disk/command buffer
- ;
- PMESSG EQU 09H ;print message function
- RDCBUF EQU 0AH ;read console buffer function
- RSETDSK EQU 0DH ;reset disk system function
- ;
- START$PIP EQU 04CEH ;normal start of pip
- CON$BUFF EQU 1ECBH ;pip's internal console buffer
- PIP$CR$LF EQU 082EH ;pip's internal cr/lf output routine
- PIP$PROMPT EQU 053CH ;pip's command parser entry address
- PIP$EXIT EQU 0554H ;pip's exit routine
- PIP$PATCH EQU 096FH ;pip gets patched at this address
- ;
- LF EQU 0AH ;linefeed character
- CR EQU 0DH ;carriage return character
- ;
- ;
- ORG 0100H
- ;
- JMP BEGIN ;jump over INP:/OUT: vectors and EOF
- ;
- ORG 010AH
- ;
- BEGIN:
- ;
- LDA DFCB ;filename specified?
- ORA A ;zero, if no filename
- LXI D,MSG1 ;and sign in please
- CZ PRNT$MESSG ;print message
- JMP START$PIP ;and off to pip
- ;
- ADDED:
- ;
- LXI H,CON$BUFF ;point to pip's console buffer
- MVI M,80H ;set up for 128 character command string
- XCHG ;pointer swapped to [DE] for CP/M
- MVI C,RDCBUF ;read console buffer function
- CALL BDOS ;let CP/M do the work
- LDA CON$BUFF+1 ;check how many characters typed
- CPI 1 ;just one?
- JNZ SAVE$CHR$CNT ;if not, save character count and return
- LDA CON$BUFF+2 ;get single character command
- ANI 05FH ;force to upper case character
- CPI 'E' ;exit?
- JZ PIP$EXIT ;go exit if so
- CPI 'Q' ;repeat pip function last specified?
- JNZ RESET$DSK$SYS ;if not, check for reset disk system
- LHLD CHAR$CNT ;get character count
- SHLD CON$BUFF+1 ;stuff back to console buffer
- LXI D,MSG3 ;tell'em repeating last process
- CALL PRNT$MESSG ;print message
- LXI H,CON$BUFF+1 ;point to last command entry in console buffer
- MOV C,M ;get command length to calculate offset
- MVI B,0 ;clean up high byte bias
- INX H ;bump to start of command string address
- DAD B ;add bias to locate end of string
- MVI M,'$' ;tag end of command string for message
- LXI D,CON$BUFF+2 ;point to command string for message
- CALL PRNT$MESSG ;print message
- MVI C,RSETDSK ;reset disk system function
- CALL BDOS ;let CP/M do the work
- RET
- ;
- RESET$DSK$SYS:
- ;
- CPI 'R' ;reset disk system?
- JNZ SAVE$CHR$CNT ;if not, restore character count and return
- LXI D,MSG2 ;tell'em all disks are set to R/W
- CALL PRNT$MESSG ;print message
- MVI C,RSETDSK ;reset disk system function
- CALL BDOS ;let CP/M do the work
- CALL PIP$CR$LF ;do cr/lf
- POP H ;clean the stack for pip restart
- JMP PIP$PROMPT ;do pip '*' prompt and wait for command
- ;
- SAVE$CHR$CNT:
- ;
- LHLD CON$BUFF+1 ;get character count and character
- SHLD CHAR$CNT ;save character count
- RET
- ;
- PRNT$MESSG:
- ;
- MVI C,PMESSG ;print message function
- CALL BDOS ;let CP/M do the work
- RET
- ;
- MSG1 DB CR,LF,'PIP 1.5 with (E)xit, (R)eset Disks and (Q)uick repeat.'
- DB CR,LF,'$'
- ;
- MSG2 DB CR,LF,'Resetting all disks to R/W$'
- ;
- MSG3 DB CR,LF,'Repeating: $'
- ;
- CHAR$CNT DW 0 ;console buffer character count
- ;
- ORG PIP$PATCH ;patch to get added code goes here
- ;
- JMP ADDED ;check for new commands
- ;
- ;
- END
- ;
-