; ;****************************************************************************** ; 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 for the two OVR fcb addresses, set 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 ;