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 / PROTCCP.LBR / PROTCCP.ZZ0 / PROTCCP.Z80
Text File  |  2000-06-30  |  3KB  |  85 lines

  1. ; This program changes the BDOS entry vector at address 6 so that a program
  2. ; running after it will not overwrite the command processor.  This program
  3. ; is useful when one wants to debug the operation of the command processor and
  4. ; wants to force a debugger such as DDT or DSD to load below rather than over
  5. ; the command processor.
  6.  
  7. ; The program works by reading the current BDOS and BIOS vectors in page 0.
  8. ; The command processor address is calculated by subtracting 1603h from the
  9. ; BIOS warmboot address stored at 0001h.  If the current BDOS vector stored at
  10. ; 0006h is less than this, then no further protection is needed.  If it is not,
  11. ; then an address just below the command processor is calculated.  A jump
  12. ; instruction is placed three bytes below the command processor, and the BDOS
  13. ; vector is changed to point to that instruction.  Until the next warm boot
  14. ; restores the page-0 vectors, programs that run after PROTCCP will think that
  15. ; the usable TPA extends only as far as the command processor (actually,
  16. ; slightly below it).
  17.  
  18.  
  19.     org    100h
  20.  
  21.     ld    a,(05dh)    ; See if anything in command tail
  22.     cp    ' '
  23.     jr    nz,help        ; If so, display built-in help
  24.  
  25.     ld    hl,(1)        ; Get BIOS warmboot address
  26.     ld    de,-1606h    ; Calculate address three bytes below
  27.     add    hl,de        ; ..the command processor
  28.     ex    de,hl        ; Put it into DE
  29.  
  30.     ld    hl,(6)        ; Get BDOS entry address
  31.     ld    a,h        ; See if BDOS already points below CPR
  32.     cp    d        ; If carry, CPR address is above protected
  33.     jr    c,noneed    ; ..address, and we're all set
  34.     jr    nz,prot1    ; If nonzero, we have work to do
  35.     ld    a,l        ; If zero, we have to check low bytes
  36.     cp    e
  37.  
  38. noneed:                ; CPR already safe
  39.     ld    de,noneedmsg    ; Tell the user
  40.     jr    print
  41.  
  42. prot1:                ; We have to work to protect CPR
  43.  
  44.     ex    de,hl        ; Now HL has address for new BDOS vectoring
  45.     ld    (6),hl        ; Put it in place in page zero
  46.                 ; Put jump instruction at vector address
  47.     ld    (hl),0c3h    ; JP opcode
  48.     inc    hl
  49.     ld    (hl),e        ; Store low byte of real BDOS address
  50.     inc    hl
  51.     ld    (hl),d        ; Save high byte of real address
  52.     ld    de,protmsg    ; Tell user that CPR is protected
  53.     jr    print
  54.     ret
  55.  
  56. help:
  57.     ld    de,helpmsg
  58. print:
  59.     ld    c,9        ; BDOS print-string function
  60.     jp    5        ; Invoke BDOS and quit
  61.  
  62. helpmsg:
  63.     db    13,10,10    ; CR,LF,LF
  64.     db    'This program protects the command processor until the'
  65.     db    13,10
  66.     db    'next warm boot.  Use it just before running a debugger'
  67.     db    13,10
  68.     db    'if you want to examine the command processor.'
  69.     db    13,10,10
  70.     db    '$'
  71.  
  72. noneedmsg:
  73.     db    13,10,10
  74.     db    'Command processor already protected.'
  75.     db    13,10,10
  76.     db    '$'
  77.  
  78. protmsg:
  79.     db    13,10,10
  80.     db    'Command processor now protected until next warm boot.'
  81.     db    13,10,10
  82.     db    '$'
  83.  
  84.     end
  85.