;
;******************************************************************************
;
	title	'WS-USER -- Patch for Wordstar Overlay Files'
;
;		(New, shorter version, (shrunk it so my other,
;		 printer status patch would fit with this one
;		 in the MORPAT area), added values for WS v3.3)
;
;					 -- Kim Levitt  11/13/84
;
;******************************************************************************
;
;	WS.COM can be made to work with ZCPR/ZCPR2/ZCPR3/etc.	 04/17/84
;
;  You know how irritating the @@@@'s get when you try to open a file in a 
; user area that does not have the *.OVR files present ?????  I had been 
; pipping everything to a given user area to edit and then back again. ARRGH.
; To make a long story short, a few hours with DDT revealed several key areas
; within WS.COM that should interest a true hacker. Seems as how the FCB for
; WSOVLY1.OVR is at 364Dh, WSMSGS.OVR is at 3784h, the only BDOS entry vector
; is at 1823h and finally, the area between 02E0h and 035Bh inclusive is a 
; safe patch area. Well, well well....... A real simple kludge of mushware will
; set a default drive and user area every time WS.COM looks for an *.OVR file
; and then set it back again after the DOS operation. The infernal thing can 
; find the *.OVR files from any drive and user area A dream come true and
; it is really painless......
;
;//////////////////////////////////////////////////////////////////////////////
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;
;		Copyright (c) 1984 .... Oak Brook Design 
;   
;	  		     All rights reserved.
;
;	Permission  is  hereby  granted  to copy and distribute this
;	program  for  any  non-commercial  purpose. Any use of this
;	material  for  commercial  advantage  without  prior written
;	consent of John P Sojak acting on behalf of Oak Brook Design 
;	is prohibited. 
;
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;//////////////////////////////////////////////////////////////////////////////
;
;	You MUST examine your Wordstar under SID or DCON to verify several
;	locations within the memory image.... > denotes a console input
;	(You can use ZSID or DDT also, of course... -- KL)
;
;>	A0>DCON
;
;	--- dcon banner and some other gook ---
;
;>	#F100 5000 00		; clear the ram out
;>	#IWS.COM		; set up for read
;>	#R	
;
;>	#P0000			; set a break at warmboot 
;>	#G100
;
; 	--- you will get the usual WS menu.... Just eXit with 'X'
;
;	01 PASS 0000
;	 -Z-E- A=00 B=1800 D=0006 H=3441 S=3443 P=0000	
;	 ----- A'=00 B'=00 D'0000 H'0000 X=0000 Y=0000 JMP XXXX
;	*XXXX
;
;>	#D3780 3790
;	3780: 00 00 00 00 03 57 53 47 53 20 20 4F 56 52 .....WSMSGS  OVR
;	3790: 00	   \	
;		             there it is... 
;				
;					          here it is..
;>	#D3640 3660				/   
;	3640: 00 00 00 00 00 00 00 00 00 00 00 00 57 53 ..............WS
;	3650: 4F 56 4C 59 31 20 4F 56 52 00 00 00 00 00 OVLY1 OVR.......
;	3660: 00 . 	
;
;
;>	#L1820
;	1820   	INX  	H
;	1821	PUSH 	D	
;	1822	PUSH	H
;	1823	CALL	0005	--- here is the DOS entry @ 1823h  
;	1826	POP	H
;	1827	POP	D
;	1829	XTHL
;	182A	RET
;
;>	#-P		; clear the pass point at warmboot
;>	#G0		; and exit to CCP
;
;	A0>
;
;	Now you can assemble the file, I used Mac. M80 / L80 has a problem with
;	extranious 00 between the two ORGs. Dont use it. 
;
;	Use the same procedure to load WS.COM into memory again but this time,
;	dont set any pass point at 0000. Set up for the read with IWSUSER.HEX
;	and then do a R to overlay the hex file. Exit to the CCP and then
;	
;	A0>SAVE 64 WS-TEST.COM
;	(Note: For 3.3 versions, use 69 usually, could be more if your
;	version has been customized with code in the secondary user
;	patch space PGBMEM.)
;
;	Thats it..... WS  will, or should now, work with all user areas and 
;	drives.
;
;****************************************************************************
;
;	NOTE: WS v3.3 values I found in CP/M-80 version:
;
;		FILE/ADDRESS	FCB ADDR
;		============    ========
;		WSMSGS.OVR	3769H
;		WSOVLY1.OVR	3630H
;		CALL BDOS	1835H
;		PATCH AREA	02CBH	(check for previous patches first)
;
;				-- Kim Levitt
;				   (MBBS HQ RCP/M (213) 653-6398)
;
;****************************************************************************
;
; (Always 0005, this is entry point for BDOS function calls)
;
bdos		equ	0005	;BDOS function caller
;
;==============================================================================
;
; The WSMSGS.OVR fcb address:
;
msgfcb		equ	3784h	;(use 3769h for v3.3)
;
;==============================================================================
;
; The WSOVLY1.OVR fcb address:
;
ovrfcb		equ	364Dh	;(use 3630h for v3.3)
;
;==============================================================================
;
; The original BDOS vector call address:
;
bdosvec		equ	1823h	;(use 1835 for v3.3)
;
;==============================================================================
;
; The user patch space where patch code gets loaded:
;
morpat		equ	02E0h	;(use 02CB for v3.3)
;
;	(This value is the MORPAT value obtained from WS.COM)
;
moroff		equ	0	;(normally zero if virgin WS.COM)
;
;	(This value may have to be adjusted if you have a custom patch
;	already in the MORPAT area. If you have the printer status
;	check routine as listed in WSPAT-33.DQC, for instance, and the
;	patch for that starts at MORPAT then this patch would have to
;	start at MORPAT+11h, so you'd have to set MOROFF equ 11h)
;
moron		equ	not moroff	;(dummy equate, used for user)
;
;==============================================================================
;
; Set these to your desired default drive and user for the *.OVR files
;
ovruser		equ	15	; User area...  0-31
ovrdrv		equ	01	; Drive Spec... A:-> 01, B:-> 02 etc
;
;******************************************************************************
;
;		the patch gets called here
;
;******************************************************************************
;
		org	bdosvec	; remove the existing DOS hook
;
;	intercept the call to DOS before actual entry ... 
;
		call	morpat+moroff
;
;******************************************************************************
;
;		the patch gets loaded here
;
;******************************************************************************
;
		org	morpat	; patch area is here
;
;	check BDOS function and FCB address
;
		push	b		; save function code (c)
		mov	a,c		; check it
		cpi	15		; open file?
		jz	chkit
		cpi	16		; close?
		jz	chkit
		cpi	17		; search first?
		jz	chkit
		cpi	18		; search next?
		jz	chkit
		cpi	20		; read next?
		jz	chkit
		cpi	33		; read random?
		jz	chkit
;
;	pass the call on without further hassle, its not for us
;
passit:		pop	b		; restore stack
		jmp	bdos		; and return
;
;******************************************************************************
;
;	check <de> for the two OVR fcb addresses, set <cy> if not found
;
;
chkit:		mvi	a,(LOW msgfcb)	;  fcb for WSMSGS.OVR 
		cmp	e
		jnz	nogood
		mvi	a,(HIGH msgfcb)
		cmp	d
		jz	good
;		
nogood:		mvi	a,(LOW ovrfcb)	;  fcb for WSOVLY1.OVR 
		cmp	e
		jnz	passit
		mvi	a,(HIGH ovrfcb)
		cmp	d
		jnz	passit
;
;	found one of the FCB's... set the user and drive 
;
good:		push	d		; save FCB
;
		xchg			; put FCB in HL
		mvi	a,ovrdrv	; find the overlays on this drive
		mov	m,a		; (stuff in FCB)
;
		mvi	c,32		; get the current user number
		mvi	e,0FFh
		call	bdos
		sta	user		; save it
;
		mvi	c,32		
		mvi	e,ovruser	; find the overlays in this user
		call	bdos
;
		pop	d		; original fcb addr
		pop	b		; original function code
;
		call	bdos		; finally we get there...
;
		push	b		; save bc
		push	psw		; save the result flags for later
;
		mvi	c,32		; set the old user... maybe funnies
		lda	user
		mov	e,a
		call	bdos
;
		pop	psw		; get error flags
		pop	b		; restore c
;
		ret			; back to Wordstar
;
user:		db	(HIGH moron)	; (non-zero to mark end)
;
		end
;
