iPROTCCP COMJPROTCCP FOR|PROTCCP Z80":] (**|8 }"6#s#r7  This program protects the command processor until the next warm boot. Use it just before running a debugger if you want to examine the command processor. $ Command processor already protected. $ Command processor now protected until next warm boot. $; This program changes the BDOS entry vector at address 6 so that a program ; running after it will not overwrite the command processor. This program ; is useful when one wants to debug the operation of the command processor and ; wants to force a debugger such as DDT or DSD to load below rather than over ; the command processor. ; The program works by reading the current BDOS and BIOS vectors in page 0. ; The command processor address is calculated by subtracting 1603h from the ; BIOS warmboot address stored at 0001h. If the current BDOS vector stored at ; 0006h is less than this, then no further protection is needed. If it is not, ; then an address just below the command processor is calculated. A jump ; instruction is placed three bytes below the command processor, and the BDOS ; vector is changed to point to that instruction. Until the next warm boot ; restores the page-0 vectors, programs that run after PROTCCP will think that ; the usable TPA extends only as far as the command processor (actually, ; slightly below it). org 100h ld a,(05dh) ; See if anything in command tail cp ' ' jr nz,help ; If so, display built-in help ld hl,(1) ; Get BIOS warmboot address ld de,-1606h ; Calculate address three bytes below add hl,de ; ..the command processor ex de,hl ; Put it into DE ld hl,(6) ; Get BDOS entry address ld a,h ; See if BDOS already points below CPR cp d ; If carry, CPR address is above protected jr c,noneed ; ..address, and we're all set jr nz,prot1 ; If nonzero, we have work to do ld a,l ; If zero, we have to check low bytes cp e noneed: ; CPR already safe ld de,noneedmsg ; Tell the user jr print prot1: ; We have to work to protect CPR ex de,hl ; Now HL has address for new BDOS vectoring ld (6),hl ; Put it in place in page zero ; Put jump instruction at vector address ld (hl),0c3h ; JP opcode inc hl ld (hl),e ; Store low byte of real BDOS address inc hl ld (hl),d ; Save high byte of real address ld de,protmsg ; Tell user that CPR is protected jr print ret help: ld de,helpmsg print: ld c,9 ; BDOS print-string function jp 5 ; Invoke BDOS and quit helpmsg: db 13,10,10 ; CR,LF,LF db 'This program protects the command processor until the' db 13,10 db 'next warm boot. Use it just before running a debugger' db 13,10 db 'if you want to examine the command processor.' db 13,10,10 db '$' noneedmsg: db 13,10,10 db 'Command processor already protected.' db 13,10,10 db '$' protmsg: db 13,10,10 db 'Command processor now protected until next warm boot.' db 13,10,10 db '$' end From the time you run PROTCCP until the next warm boot, the system will think that the BDOS is below the CCP so that transient programs, and notably debuggers, will not overwrite the CCP. I wrote this program to help me debug the new ZCPR command processor that I am readying for release. I just enter the command line PROTCCP;DSDZ XCPR.SYM, and I can perform in situ, full-screen, symbolic debugging of the command processor. Jay Sage, 02/05/87