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 >
Assembly Source File  |  2000-06-30  |  4KB  |  123 lines

  1. ;
  2. ;            PIPPAT2.ASM
  3. ;
  4. ; PIP patch to add '(E)xit', '(R)eset Disks' and '(Q)uick Repeat'
  5. ; functions.
  6. ;
  7. ;The R- and Q-commands are from:
  8. ;Kelly Smith, Lifelines, Vol. III No. 3 (1982) pg. 15.
  9. ;
  10. ;The E-command added by P.L.Kelley
  11. ;
  12. ;E-command: Exit, to allow exit from PIP in SUBMIT files.
  13. ;R-command: Reset disks, ie. log in freshly inserted disks.
  14. ;Q-command: Reset disks and repeat last operation.
  15. ;
  16. ;
  17. BDOS        EQU    0005H    ;BDOS entry address
  18. FCB        EQU    005CH    ;default file control block address
  19. DFCB        EQU    0080H    ;default disk/command buffer
  20. ;
  21. PMESSG        EQU    09H    ;print message function
  22. RDCBUF        EQU    0AH    ;read console buffer function
  23. RSETDSK        EQU    0DH    ;reset disk system function
  24. ;
  25. START$PIP    EQU    04CEH    ;normal start of pip
  26. CON$BUFF    EQU    1ECBH    ;pip's internal console buffer
  27. PIP$CR$LF    EQU    082EH    ;pip's internal cr/lf output routine
  28. PIP$PROMPT    EQU    053CH    ;pip's command parser entry address
  29. PIP$EXIT    EQU    0554H    ;pip's exit routine
  30. PIP$PATCH    EQU    096FH    ;pip gets patched at this address
  31. ;
  32. LF        EQU    0AH    ;linefeed character
  33. CR        EQU    0DH    ;carriage return character
  34. ;
  35. ;
  36.     ORG    0100H
  37. ;
  38.     JMP    BEGIN        ;jump over INP:/OUT: vectors and EOF
  39. ;
  40.     ORG    010AH
  41. ;
  42. BEGIN:
  43. ;
  44.     LDA    DFCB        ;filename specified?
  45.     ORA    A        ;zero, if no filename
  46.     LXI    D,MSG1        ;and sign in please
  47.     CZ    PRNT$MESSG    ;print message
  48.     JMP    START$PIP    ;and off to pip
  49. ;
  50. ADDED:
  51. ;
  52.     LXI    H,CON$BUFF    ;point to pip's console buffer
  53.     MVI    M,80H        ;set up for 128 character command string
  54.     XCHG            ;pointer swapped to [DE] for CP/M
  55.     MVI    C,RDCBUF    ;read console buffer function
  56.     CALL    BDOS        ;let CP/M do the work
  57.     LDA    CON$BUFF+1    ;check how many characters typed
  58.     CPI    1        ;just one?
  59.     JNZ    SAVE$CHR$CNT    ;if not, save character count and return
  60.     LDA    CON$BUFF+2    ;get single character command
  61.     ANI    05FH        ;force to upper case character
  62.     CPI    'E'        ;exit?
  63.     JZ    PIP$EXIT    ;go exit if so
  64.     CPI    'Q'        ;repeat pip function last specified?
  65.     JNZ    RESET$DSK$SYS    ;if not, check for reset disk system
  66.     LHLD    CHAR$CNT    ;get character count
  67.     SHLD    CON$BUFF+1    ;stuff back to console buffer
  68.     LXI    D,MSG3        ;tell'em repeating last process
  69.     CALL    PRNT$MESSG    ;print message
  70.     LXI    H,CON$BUFF+1    ;point to last command entry in console buffer
  71.     MOV    C,M        ;get command length to calculate offset
  72.     MVI    B,0        ;clean up high byte bias
  73.     INX    H        ;bump to start of command string address
  74.     DAD    B        ;add bias to locate end of string
  75.     MVI    M,'$'        ;tag end of command string for message
  76.     LXI    D,CON$BUFF+2    ;point to command string for message
  77.     CALL    PRNT$MESSG    ;print message
  78.     MVI    C,RSETDSK    ;reset disk system function
  79.     CALL    BDOS        ;let CP/M do the work
  80.     RET
  81. ;
  82. RESET$DSK$SYS:
  83. ;
  84.     CPI    'R'        ;reset disk system?
  85.     JNZ    SAVE$CHR$CNT    ;if not, restore character count and return
  86.     LXI    D,MSG2        ;tell'em all disks are set to R/W
  87.     CALL    PRNT$MESSG    ;print message
  88.     MVI    C,RSETDSK    ;reset disk system function
  89.     CALL    BDOS        ;let CP/M do the work
  90.     CALL    PIP$CR$LF    ;do cr/lf
  91.     POP    H        ;clean the stack for pip restart
  92.     JMP    PIP$PROMPT    ;do pip '*' prompt and wait for command
  93. ;
  94. SAVE$CHR$CNT:
  95. ;
  96.     LHLD    CON$BUFF+1    ;get character count and character
  97.     SHLD    CHAR$CNT    ;save character count
  98.     RET
  99. ;
  100. PRNT$MESSG:
  101. ;
  102.     MVI    C,PMESSG    ;print message function
  103.     CALL    BDOS        ;let CP/M do the work
  104.     RET
  105. ;
  106. MSG1    DB    CR,LF,'PIP 1.5 with (E)xit, (R)eset Disks and (Q)uick repeat.'
  107.     DB    CR,LF,'$'
  108. ;
  109. MSG2    DB    CR,LF,'Resetting all disks to R/W$'
  110. ;
  111. MSG3    DB    CR,LF,'Repeating:  $'
  112. ;
  113. CHAR$CNT    DW    0    ;console buffer character count
  114. ;
  115.     ORG    PIP$PATCH    ;patch to get added code goes here
  116. ;
  117.     JMP    ADDED        ;check for new commands
  118. ;
  119. ;
  120.     END
  121. ;
  122.  
  123.