;Date: 22 Jun 1981 (Monday) 1041-PST
;From: Neil Maron
;To:   All
;Re:   A safe public USER 0 for .COM files patch for CP/M 2.2
;
;This patch includes CCPPATCH so that the system will look on
;drive A: if your .COM file isn't on the logged in drive.  In
;addition, it makes "USER 0" public.  I consider it safer than
;the "BDOS22.PAT" which makes "USER 0" public but also may have
;certain bad side effects.  This of course is tested and is up
;in my system.
;
;This is for CP/M 2.2 .
;
;Patchfile>>>
;
;N.Maron 19jun81
;Patch to look on A: for .COM file then look on USER 0
;or look on USER 0 if d: given explicitly in command.
;
msize   equ     54         ;CP/M system size in kilobytes
;
;Set for your system
;
delta   equ     0000h      ;offset from standard CP/M size (probably 0 in
                          ; your case
bias    equ     (msize-20)*1024-delta  ; offset from 20k CP/M
ccp     equ     3400h+bias
;
coa     equ     ccp+8ch    ;CCP console output routine from A
gtusr   equ     CCP+113h   ;CCP get user number routine
stusr   equ     CCP+115h   ;CCP set user number routine
ocpmfcb equ     ccp+0d0h   ;CCP open file @ cpmfcb$ routine
cpmtype$ equ    ccp+7d6h   ;type field in cpmfcb$
cmdsk$  equ     ccp+7f0h   ;loc of disk given in command
cmderr  equ     ccp+76bh   ;loc to type error in command
win     equ     ccp+6deh   ;go here if we get file open
;
patcharea equ   ?????      ;patch area in your CBIOS
                          ;(not in CCP or BDOS)
;
       org     ccp+6dbh
       jz      patch      ;replace "jz cpm+76bh"=jz cmderr
;
       org     ccp+7f2h   ;replaces an unused area of NOP's
;
patch:  lxi     h,cmdsk$   ;get drive from current command
       ora     m          ;A=0 on entry, so fetches drive
       jnz     patch1     ;if explicit drive given go try USER 0
                          ;(this will be escape even if we force A:)
       inr     m          ;force explicit reference to drive A
       lxi     d,cpmtype$ ;need DE set up to this on entry to CCP
       jmp     ccp+6cdh   ;now go reenter CCP
;
;This is the addition to the above patch
;
       org     patcharea  ;patch area in memory
;
;Arrive here because explicit drive set or can't find file on A:
;
patch1: call    gtusr      ;get user code
       ora     a          ;set flags
       jz      cmderr     ;already user 0 so lose
       mov     e,a        ;get old value into E for later
       push    d          ;save it
       mvi     e,0        ;set USER=0
       call    stusr
       call    ocpmfcb    ;try open again
       pop     d          ;get old user code back before we save flags
       push    psw        ;now save flags from call
       call    stusr      ;now go set back to old user number
       pop     psw        ;get flags back from OPEN call
       jnz     win        ;go to win if we won
       jmp     cmderr     ;too bad we lose
;
       end
;
;<<<<End of patch file