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 / CCP / PATCHCPM.LBR / PATCHCPM.AQM / PATCHCPM.ASM
Assembly Source File  |  2000-06-30  |  6KB  |  330 lines

  1. ;
  2. ;    PROGRAM  PATCHCPM
  3. ;    12-22-83 JOD
  4. ;
  5. ;    PURPOSELY WRITTEN IN 8080 CODE SO ALL CAN USE
  6. ;
  7. ;    FEEL FREE TO ADD ANY OTHER PATCHES YOU HAVE COME ACROSS - IF
  8. ;    YOU DO THEN HOW ABOUT SHARING THEM WITH ME? THANKS.
  9. ;
  10. ;            JIM DREHER
  11. ;            1937 ARMORY ROAD
  12. ;            BARSTOW, CA
  13. ;            92311
  14. ;
  15. ;    **********  PATCHCPM LIMITATIONS  **********
  16. ;
  17. ; 1.    THIS PROGRAM CANNOT LOAD PAST 08FFH OR IT WILL OVERWRITE
  18. ;    THE MEMORY IMAGE OF THE CCP YOU ARE PATCHING - IF NECESSARY
  19. ;    REMOVE SOME OF THE LESS USEFUL PATCHES TO INCLUDE YOURS
  20. ;
  21. ; 2.    IF YOU ANSWER 'N' TO A QUESTION IT WILL NOT RESTORE THE CCP
  22. ;    TO IT'S ORIGINAL STATE.  IF YOU WISH TO REMOVE THE PATCH THEN
  23. ;    START WITH A "FRESH" CP/M SYSTEM.
  24. ;
  25. ; 3.    NOTE THAT IF YOU DISABLE ONE OF THE BUILT-IN COMMANDS YOU MUST
  26. ;    HAVE A .COM FILE OF THAT NAME ON THE DISK FOR THAT COMMAND TO
  27. ;    WORK.  FOR EXAMPLE YOU MAY WANT TO DISABLE THE BUILT-IN "DIR"
  28. ;    COMMAND AND PUT "SD.COM" RENAMED TO "DIR.COM" ON THE DISK.
  29. ;
  30.  
  31.  
  32. ; *** CHANGE MEMSIZE AND BASE TO MEET YOUR SYSTEM REQUIREMENTS ***
  33.  
  34. MEMSIZE    EQU    62        ; CP/M SYSTEM SIZE IN K BYTES
  35. BASE    EQU    0        ; START OF RAM ON YOUR SYSTEM
  36.  
  37. BIAS    EQU    (MEMSIZE-20)*1024
  38. CCP    EQU    3400H + BIAS + BASE    ; START OF CCP
  39.  
  40. TPABOOT EQU    0900H            ; WHERE SYSGEN PUTS BOOT IN THE TPA
  41. TPACCP    EQU    0980H            ; AND THE CCP...
  42. TPABDOS EQU    1180H            ; AND THE BDOS...
  43. TPABIOS EQU    1F80H            ; AND THE BIOS
  44.  
  45. CTRLC    EQU    3
  46. LF    EQU    10
  47. CR    EQU    13
  48. CTLZ    EQU    26
  49. ESC    EQU    27
  50. BEL    EQU    7
  51.  
  52.     ORG    0100H
  53.  
  54. START:    CALL    ILPRT
  55.     DB    CR,LF,LF
  56.     DB    'PATCHCPM  22-DEC-83  JOD'
  57.     DB    CR,LF
  58.     DB    0
  59.  
  60. ;.....
  61.  
  62.           CALL    ILPRT
  63.     DB    CR,LF,LF
  64.     DB    'Need help (Y/N)? '
  65.     DB    0
  66.  
  67.     CALL    GETANS        ; SKIP IF HELP NOT NEEDED
  68.     JZ    ONE
  69.  
  70. ;         1234567890123456789012345678901234567890
  71. HELP:    CALL    ILPRT
  72.     DB    CR,LF,LF
  73.     DB    'PATCHCPM is a collection of useful patches'
  74.     DB    ' for CP/M 2.X systems.  To use:'
  75.     DB    CR,LF,LF
  76.     DB    '1.  Run SYSGEN to get your CP/M system into memory'
  77.     DB    CR,LF
  78.     DB    '2.  Run PATCHCPM and select the desired patches.'
  79.     DB    CR,LF
  80.     DB    '3.  When PATCHCPM finishes it prints '
  81.     DB    '"Ready for SYSGEN or SAVE 34 CPMXX.PAT"'
  82.     DB    CR,LF
  83.     DB    '4.  Save your patches with SYSGEN or SAVE.'
  84.     DB    CR,LF,LF
  85.     DB    'Continue with PATCHCPM (Y/N)? '
  86.     DB    0
  87.  
  88.     CALL    GETANS            ; WARM START IF NOT READY
  89.     JZ    0000H
  90.  
  91. ;.....
  92.  
  93. ONE:    CALL    ILPRT
  94.     DB    CR,LF,LF
  95.     DB    '* Do you want DELETE to work like BACK SPACE (Y/N)? '
  96.     DB    0
  97.  
  98.     CALL    GETANS        ; IF NO THEN SKIP
  99.     JZ    TWO
  100.  
  101. ; THANKS TO LEWIS MOSELEY
  102.  
  103.     LXI    H,TPACCP + 0A1BH    ; HL = ADDRESS TO PATCH
  104.     LXI    D,PAT1            ; DE = ADDRESS OF NEW CODE
  105.     MVI    B,3            ; B  = NUMBER OF BYTES TO MOVE
  106.     CALL    MOVE            ; MAKE THE PATCH
  107.  
  108. ;.....
  109.  
  110. TWO:    CALL    ILPRT
  111.     DB    CR,LF,LF
  112.     DB    'If desired, the next patch causes drive A to'
  113.     DB    ' become the "system drive".'
  114.     DB    CR,LF
  115.     DB    'It will force the CCP to look on Drive A when'
  116.     DB    ' you are logged into a drive'
  117.     DB    CR,LF
  118.     DB    'other than A and call for a .COM file that does not'
  119.     DB    ' exist on that drive.'
  120.     DB    CR,LF,LF
  121.     DB    '* Do you want drive A to be the "system drive" (Y/N)? '
  122.     DB    0
  123.  
  124.     CALL    GETANS        ; SKIP IF ANSWER IS NO
  125.  
  126. ; THANKS TO ????
  127.  
  128.     LXI    H,TPACCP + 06DBH    ; SAME AS ABOVE
  129.     LXI    D,PAT2
  130.     MVI    B,3
  131.     CALL    MOVE
  132.  
  133.     LXI    H,TPACCP + 07F2H
  134.     LXI    D,PAT2A
  135.     MVI    B,14
  136.     CALL    MOVE
  137.  
  138. ;.....
  139.  
  140. THREE:    CALL    ILPRT
  141.     DB    CR,LF,LF
  142.     DB    '* Disable CCP built-in DIR (Y/N)? '
  143.     DB    0
  144.  
  145.     CALL    GETANS        ; SKIP IF NO
  146.     JZ    THREEA
  147.  
  148.     LXI    H,TPACCP + 0310H
  149.     LXI    D,PAT3
  150.     MVI    B,4
  151.     CALL    MOVE
  152.  
  153. ;.....
  154.  
  155. THREEA:    CALL    ILPRT
  156.     DB    CR,LF,LF
  157.     DB    '* Disable CCP built-in ERA (Y/N)? '
  158.     DB    0
  159.  
  160.     CALL    GETANS        ; SKIP IF NO
  161.     JZ    THREEB
  162.  
  163.     LXI    H,TPACCP + 0314H
  164.     LXI    D,PAT3
  165.     MVI    B,4
  166.     CALL    MOVE
  167.  
  168. ;.....
  169.  
  170. THREEB:    CALL    ILPRT
  171.     DB    CR,LF,LF
  172.     DB    '* Disable CCP built-in TYPE (Y/N)? '
  173.     DB    0
  174.  
  175.     CALL    GETANS        ; SKIP IF NO
  176.     JZ    THREEC
  177.  
  178.     LXI    H,TPACCP + 0318H
  179.     LXI    D,PAT3
  180.     MVI    B,4
  181.     CALL    MOVE
  182.  
  183. ;.....
  184.  
  185. THREEC:    CALL    ILPRT
  186.     DB    CR,LF,LF
  187.     DB    '* Disable CCP built-in SAVE (Y/N)? '
  188.     DB    0
  189.  
  190.     CALL    GETANS        ; SKIP IF NO
  191.     JZ    THREED
  192.  
  193.     LXI    H,TPACCP + 031CH
  194.     LXI    D,PAT3
  195.     MVI    B,4
  196.     CALL    MOVE
  197.  
  198. ;.....
  199.  
  200. THREED:    CALL    ILPRT
  201.     DB    CR,LF,LF
  202.     DB    '* Disable CCP built-in REN (Y/N)? '
  203.     DB    0
  204.  
  205.     CALL    GETANS        ; SKIP IF NO
  206.     JZ    THREEE
  207.  
  208.     LXI    H,TPACCP + 0320H
  209.     LXI    D,PAT3
  210.     MVI    B,4
  211.     CALL    MOVE
  212.  
  213. ;.....
  214.  
  215. THREEE:    CALL    ILPRT
  216.     DB    CR,LF,LF
  217.     DB    '* Disable CCP built-in USER (Y/N)? '
  218.     DB    0
  219.  
  220.     CALL    GETANS        ; SKIP IF NO
  221.     JZ    FOUR
  222.  
  223.     LXI    H,TPACCP + 0324H
  224.     LXI    D,PAT3
  225.     MVI    B,4
  226.     CALL    MOVE
  227.  
  228. ;.....
  229.  
  230. FOUR:    NOP            ; PATCH NUMBER FOUR GOES HERE
  231.     NOP
  232.     NOP
  233.     NOP
  234.  
  235. ;.....
  236.  
  237. DONE:    CALL    ILPRT
  238.     DB    CR,LF,LF
  239.     DB    'Ready for SYSGEN or SAVE 34 CPMXX.PAT'
  240.     DB    CR,LF
  241.     DB    0
  242.  
  243.          JMP    0        ; WARM START
  244.  
  245. ;
  246. ;    SUBROUTINE MOVE
  247. ;
  248. ;    FUNCTION:    MOVE A BLOCK OF MEMORY
  249. ;
  250. ;    ENTRY:        HL = SOURCE ADDRESS
  251. ;            DE = DESTINATION ADDRESS
  252. ;            B  = NUMBER OF BYTES TO MOVE
  253. ;
  254. ;    EXIT:        N/A
  255. ;
  256.  
  257. MOVE:    LDAX    D        ; GET BYTE
  258.     MOV    M,A        ; MOVE IT
  259.     INX    H        ; ADVANCE POINTERS
  260.     INX    D
  261.     DCR    B        ; DONE?
  262.     JNZ    MOVE         ; NO - KEEP GOING
  263.     RET            ; YES- DONE
  264.  
  265. ;
  266. ;    SUBROUTINE GETANS
  267. ;
  268. ;    FUNCTION:    GETS AN INPUT FROM THE CONSOLE, CHECKS FOR 'Y'
  269. ;            OR 'N' ONLY.  DOES A WARM START IF CTRL-C ENTERED.
  270. ;
  271. ;    ENTRY:        N/A
  272. ;
  273. ;    EXIT:        Z FLAG IS SET   IF ANSWER IS 'N'
  274. ;            Z FLAG IS CLEAR IF ANSWER IS 'Y'
  275.  
  276. GETANS:    MVI    C,1        ; BDOS CONSOLE INPUT
  277.     CALL    5        ; GET ANSWER
  278.  
  279.     CPI    CTRLC        ; WANT TO QUIT?
  280.     JZ    0        ; YES- WARM START
  281.  
  282.     CPI    'Y'
  283.     JZ    GA1
  284.     CPI    'N'
  285.     JZ    GA1
  286.  
  287.     CALL    ILPRT
  288.     DB    BEL,CR,LF
  289.     DB    'Please answer Y or N : '
  290.     DB    0
  291.     JMP    GETANS
  292.  
  293. GA1:     SUI    'N'        ; SET Z FLAG ACCORDINGLY
  294.     RET
  295.  
  296. ;
  297. ;    VANILLA FLAVORED ILPRT ROUTINE
  298. ;
  299. ILPRT:    POP    H        ; GET ADDRESS OF CHARACTER
  300.     MOV    A,M        ; GET CHARACTER
  301.     INX    H        ; POINT TO NEXT CHARACTER
  302.     ORA    A        ; NULL?
  303.     JZ    ILPRT$DONE    ; YES- EXIT
  304.     MOV    E,A        ; GET CHAR IN E
  305.     PUSH    H        ; SAVE POINTER
  306.     MVI    C,2        ; BDOS CONSOLE OUTPUT
  307.     CALL    5         ; SEND IT
  308.     JMP    ILPRT        ; DO ANOTHER CHARACTER
  309. ILPRT$DONE:
  310.     PCHL            ; RETURN TO CALLING PROGRAM
  311.  
  312. ;
  313. ;    STORAGE FOR PATCHES
  314. ;
  315.  
  316. PAT1:    JMP    CCP + 0A07H    ; JUMP TO THE BACK SPACE ROUTINE (AFTER
  317.                 ; DELETE IS ENTERED)
  318.  
  319. PAT2:    JZ    CCP + 07F2H
  320. PAT2A:    LXI    H,CCP + 07F0H
  321.     ORA    M        ; ACCUM WAS 0 ON ENTRY, SO THIS FETCHES DRIVE
  322.     JNZ    CCP + 076BH    ; COMMAND HAS EXPLICIT DRIVE ... GIVE ERROR
  323.     INR    M        ; FORCE EXPLICIT REFERENCE TO DRIVE A
  324.     LXI    D,CCP + 07D6H    ; WE NEED TO SETUP DE TO RE-ENTER CCP
  325.     JMP    CCP + 06CDH    ;
  326.  
  327. PAT3:    DB    0,0,0,0        ; WHOOPIE
  328.  
  329. ENDDAT:    END            ; *** MUST BE < 0900H ***
  330.