home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
UTILS
/
FILCPY
/
PIPPAT2.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
4KB
|
123 lines
;
; 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
;