; WSUFIX VERSION 4 - 11/22/83 by:
;
;                            Ron Mozer
;                    Southwest Computer Center
;                      121 Wyatt Dr. Suite 7
;                      Las Cruces, NM 88001
;                      (505) 523-6037 RCP/M
;                      (505) 526-2842 Voice
;
;
; THIS PROGRAM IS TO BE OVERLAYED WITH WS.COM TO FIX THE PROBLEM
; WITH THE OVERLAY FILES BEING EXPECTED IN THE CURRENT USER.
;
;**NOTICE**NOTICE**  This patch for WS MUST be considered experimental at this
;       time.  It has been tested on a NorthStar Horizon and a Kaypro10 and
;       seems to work as advertised.  Please report any bugs, comments, or
;       suggestions for improvement to the RCP/M listed above or to the
;       Mesilla Valley RCP/M, (505) 522-8856.
;
;
; Known limitations:
;
;       1) The (R)un command has some restrictions that are caused by the fact
;          that WS must be switched to DEFUSR and stay there while the .COM
;          file is executing.  WS returns to the current(start up) user when
;          the first .OVR file is opened upon return to normal WS operation.
;          All .COM files to be run must be in DEFUSR and either DEFDRV or the
;          current drive.  When executing programs such as COMPARE, HEXDIF,
;          BISHOW, etc. that require a filename input on the command line,
;          those files must be in DEFUSR on the CURRENT drive.  Directory
;          programs such as SD will show the directory of the CURRENT drive and
;          DEFUSR.  Calculator programs such as @ or ALLBASE, and disk util-
;          ities such as DU seem to execute with no problem.  The latter are
;          the types of programs one would most likely want to (R)un under
;          Wordstar. (The previous assumes operation under ZCPR2 with DEFUSR/
;          DRV somewhere in the path.)
;
;       2) If you try to edit an .OVR or .COM file under Wordstar(who would
;          want to do that?), the file will be created in the current drive/
;          user, but then cannot be accessed again from that location.  The
;          file, once created, must be in DEFUSR of the CURRENT drive before it
;          can be accessed under WS.
;
;       3) This patch has not been tested with SPELSTAR.OVR.  It is expected
;          that SPELSTAR.DCT would have to be in DEFUSR of the CURRENT drive
;          for it to execute properly.  Who knows where the various work files
;          would wind up.
;
;
; REVISION HISTORY
;
; 11/22/83  Changed logic to look for an .OVR or .COM filetype before switching
; VER #4    to DEFUSR.  In the case of .COM files, WS stays in DEFUSR while
;           the program executes and then returns to the current user when the
;           first .OVR file is again opened.  This allows limited use of the
;           (R)un command.  Moved CURUSR and added COMFLG, both located in a
;           safe memory location outside of the MORPAT area.  This area is
;           overwritten when the (R)un commanbd is used.  Moved code that gets
;           and saves the current user area to a separate routine invoked from
;           INISUB.  The user area saved is that from which WS is invoked.
;           Changed back to 8080 code which uses all but two bytes of MORPAT.
;           (pwc).  Changed to use table driven compare routine.(Ron Mozer).
;
; 11/10/83  Fixed lots of bugs.  Made Z80 code and require MAC
; VER #3    to assemble. (Ron Mozer)
;
; 11/09/83  Changed to make compatible with all wordstars?
;           of varied version numbers.  Still must make sure
; VER #2    you get the right address for INTERC. This code now
;           needs to be simplified since there is only a couple of
;           bytes left in MOPAT, thus no room to include spell star
;           as one of the overlay files to check.
;                                               (Ron Mozer)
;
; 10/03/83  Orignal version 1 (Ron Mozer)
;
; All BDOS calls made by Wordstar except for normal I/O are intercepted
; and sorted out.  If the call is made to open the .OVR files the
; intercept will set the user to DEFUSR.  After the BDOS returns, the
; intercept will set the user back to the current user. (See VER #4 notes above
; for change).
;
; This will allow those people who are running ZCPR, NZCPR, ZCPR2, etc,
; to have only one copy of wordstar on the system and be able to use
; it from any user/drive combination. (Very useful for hard disk machines)
;
; Care must be taken for those people who have already made major changes
; in wordstar.  The area at MORPAT is being used by this program to
; accomadate the intercept.  With VER #4, INISUB is also used.
;
; To implement this program, first edit this file to suit your needs,
; then assemble it with ASM.  You can then overlay this use DDT as follows:
;
;       >DDT WS.COM
;       DDT VERS 2.2
;       NEXT  PC
;       3F00 0100
;       -IWSUFIX.HEX
;       -R
;       NEXT  PC
;       3F00 0000
;       -G0
;       >SAVE 62 WS.COM
;
;
;************************ W A R N I N G **************************
; If you are using a non-standard CP/M (one that does not start the
; TPA at 100H such as TRS-80, HEATH H8, etc.) you will have to change
; MOPAT, INTERC, BDOS, DEFDSK and anything else that may conflict.
;*****************************************************************
;
DEFUSR  EQU     0AH     ;User area which has the .OVR and .COM files
DEFDRV  EQU     1       ;The default disk drive to test for
                       ;the .OVR and .COM files (A=1, B=2, etc.)

BDOS    EQU     5       ;BDOS ENTRY POINT
USRCMD  EQU     32      ;GET/SET USER COMMAND
OPEN    EQU     15      ;OPEN FILE COMMAND

DEFDSK  EQU     02DCH   ;location of DEFDSK in WS.COM
MORPAT  EQU     02E0H   ;location of MORPAT (free space)
inisub  equ     02a4h   ;location of inisub routine called on startup
INTERC  EQU     1824H   ;location of intercept address. NOTE:
                       ;you should check this with your favorite
                       ;debuger to make sure that it is the LSB of
                       ;the BDOS entry point. INTERC-1 should be:
                       ; CD 05 00

;******************************************************************************

;NOTE*****  These locations must be in an unused area of memory.  DO NOT leave
;them in the morpat area as they are overwritten by WS when the (R)un command
;is used.

CURUSR  equ     0FE08H  ;TEMP SAVE AREA for startup user area.
comflg  equ     0FE0AH  ;location of COM file flag

;******************************************************************************

yes     equ     0ffh
no      equ     0

       org     inisub
       jmp     savusr  ;Save user area from which WS is invoked.

       ORG     DEFDSK
       DB      DEFDRV  ;Set the default disk drive in WS.

       ORG     INTERC
       DW      PATCH   ;INSTALL INTERCEPT PATCH

       ORG     MORPAT
PATCH   MOV     A,C     ;GET COMMAND
       CPI     OPEN    ;OPEN???
       JNZ     BDOS    ;LET BDOS HAVE IT IF NOT
       push    h
       push    d
       push    b
       xchg            ;get address of FCB in HL
       lxi     d,9
       dad     d       ;point to filetype
       LXI     D,OVRNM ;Set up to compare filetype with OVR
       CALL    CMPARE  ;check it
       JNZ     TRYCOM  ;NO, check for COMfile
       mvi     a,no    ;is OVR, so indicate not COM
       sta     comflg
       jmp     setdef  ;is OVR so look in def drive/user

trycom  LXI     D,COMNM ;Set up to compare filetype with COM
       CALL    CMPARE  ;check it
       JNZ     RETBDOS ;Not COM so do normal BDOS call
       mvi     a,yes   ;is COM so set flag and fall through to setdef
       sta     comflg

setdef  pop     b
       pop     d
       pop     h
       MVI     A,DEFUSR        ;SELECT DEFAULT USER
       CALL    USER
       CALL    BDOS    ;PROCESS OPEN COMMAND
       PUSH    PSW
       lda     comflg  ;If COM file, must stay in defusr until finished
       cpi     yes     ;return to current du after next OVR file open.
       jz      stay
       LDA     CURUSR  ;GET CURRENT USER BACK
       CALL    USER
       POP     PSW
       RET
;
USER    PUSH    B       ;SAVE EVERYTHING IN SIGHT
       PUSH    D
       PUSH    H
       MOV     E,A
       MVI     C,USRCMD
       CALL    BDOS
       POP     H
       POP     D
       POP     B
       RET

retbdos pop     b
       pop     d       ;restore registers
       pop     h
       jmp     bdos    ;normal bdos call

stay    pop     psw     ;get back open file result and stay in DEFUSR.
       ret

CMPARE  MVI     B,3     ;CHECK THREE BYTES
CMPLP   LDAX    D       ;WHAT WERE CHECKING AGAINST
       CMP     M       ;WHAT WERE CHECKING
       RNZ             ;NOT THE SAME
       INX     H       ;POINT TO NEXT BYTE
       INX     D
       DCR     B       ;DECREMENT COUNTER
       JNZ     CMPLP   ;LOOP TILL DONE
       RET

OVRNM   DB      'OVR'
COMNM   DB      'COM'

;The following routine is jumped to from INISUB

savusr: MVI     A,0FFH  ;REQUEST USER NUMBER
       CALL    USER
       STA     CURUSR  ;SAVE IT
       ret

       end