;
;                       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
;