home *** CD-ROM | disk | FTP | other *** search
-
- ;*************************************
- ;* *
- ;* "WSPATCH" *
- ;* *
- ;* LEE SWORDY 12/5/82 *
- ;* *
- ;* Revised by Jim Woolley, FOG Disk *
- ;* Librarian, 9/82 *
- ;* w/changes for DD and off Screen *
- ;* from FOGHORN (6/84) *
- ;*************************************
- ;
- FCB EQU 5CH ; DEFAULT FILE CTRL BLOCK
- DIVERT1 EQU 1D33H ; DIVERSION FROM WS CONSOLE I/P ROUTINE
- DIVERT2 EQU 0100H ; DIVERSION FROM WS START-UP ROUTINE
- ; divert2 will not be used
- inisub equ 02a4h ; instead use ws inisub location
- PATCHSP EQU 02E0H ; WORDSTAR FREE PATCH AREA
- ;
- ORG 0100H
- JMP START
- ;
- MSG1 DB 1AH,' WSPATCH REV. 1.0',0DH,0AH
- DB 'INSTALLATION PROGRAM FOR WORDSTAR PATCHES:',0DH,0AH
- DB ' -BLINKING CURSOR',0DH,0AH
- DB ' -ARROW KEY RE-DEFINITION',0DH,0AH
- DB 'FOR OSBORNE CP/M 2.2A-00F & WORDSTAR 2.26-01D',0DH,0AH,0AH,0AH
- DB 'ENTER DESIRED BLINK RATE (0 TO 9)',0DH,0AH
- DB '0 IS VERY FAST, 9 IS VERY SLOW',0DH,0AH
- DB 0DH,0AH,0AH
- DB ' BLINK RATE ? $'
- ;
- MSG2 DB 0DH,0AH,0AH,'**** MODIFICATIONS COMPLETED SUCCESSFULLY ****',0DH,0AH
- DB '$'
- ;
- ; BODY OF PATCHES LOCATED HERE
- ;
- ORG PATCHSP
- PATCHST
- ;******** CURSOR BLINK ROUTINE
- ;
- PATCH1 CPI 06H ; IS THIS AN I/P FROM CONSOLE CALL ?
- JNZ RETRN1 ; NO: RETURN TO WS
- PUSH H
- CALL 0E7F6H ; REPOSITION SCREEN SO CURSOR IS ALWAYS VISIBLE
- TIMSET LXI D,0000H ; BLINK RATE TIMR (FILLED IN BY INSTAL ROUTINE)
- LOOP3 PUSH D
- CALL 0E106H ; BIOS CALL TO GET CONS STATUS
- POP D
- ORA A
- JNZ RETRN2 ; RETURN TO WS IF CHAR. READY
- DCR E
- JNZ LOOP3
- DCR D
- JNZ LOOP3 ; DECR. TIMER AND LOOP UNTIL READY
- LHLD 0EF5AH ; GET BIOS CURSOR POINTER
- MOV A,M
- XRI 80H ; TOGGLE CURSOR (UNDERLINE ON/OFF)
- MOV M,A
- JMP TIMSET ; RESTART TIMER
- ;
- RETRN2 LHLD 0EF5AH ; CURSOR POINTER
- MOV A,M
- ORI 80H ; TURN ON CURSOR BEFORE LEAVING
- MOV M,A
- POP H
- MVI A,06 ; RESTORE 'A' CONTENTS
- RETRN1 CALL 173FH ; WS INST. THAT DIVERSION REPLACED
- RET ; RETURN TO WORDSTAR
- ;
- ;******** ARROW KEY REDEFINITION ROUTINE
- ;
- PATCH2 LHLD 0E17FH ; BIOS ARROW KEY DEF'N POINTER
- MVI M,05H ; ^E
- INX H
- MVI M,04H ; ^D
- INX H
- MVI M,18H ; ^X
- INX H
- MVI M,13H ; ^S
- ; JMP 2D10H ; WS INST THAT DIVERSION REPLACED (ALSO RETURN TO WS)
- ret ; above changed to return
- ;
- ; following patch resets cp/m arrow keys
- ;
- patch3 lhld 0E17fh
- mvi m,0bh ; ^k
- inx h
- mvi m,0ch ; ^l
- inx h
- mvi m,0ah ; ^j
- inx h
- mvi m,08h ; ^h
- ret
- PATCHND
- ;
- ; END OF BODY OF PATCHES
- ;
- ; START OF PATCH INSERTION ROUTINE
- ;
- ;**** CHECK VALIDITY OF FILENAME
- START LXI SP,STACK ; LOCAL STACK
- LDA FCB+1 ; FILENAME GIVEN ?
- CPI 20H
- JNZ ONEFILE ; YES: OK
- ;
- MVI C,9
- LXI D,ERR5 ; 'NO FILE' MESSAGE TO CONSOLE
- CALL 0005
- JMP EXIT
- ;
- ONEFILE LDA FCB+17 ; 2 FILENAMES GIVEN ?
- CPI 20H
- JZ GOODFIL ; NO: OK
- ;
- MVI C,9
- LXI D,ERR6 ; 'TWO FILENAME' MSG TO CONSOLE
- CALL 0005
- JMP EXIT
- ;
- GOODFIL MVI C,9
- LXI D,MSG1 ; HEADER MESSAGE TO CONSOLE
- CALL 0005 ; AND REQUEST BLINK RATE
- ;
- RETRY1 MVI C,1
- CALL 0005 ; INPUT BLINK RATE (1 DIGIT 0 TO 9)
- CPI 03H ; ^C ?
- JZ EXIT ; YES: ABORT
- CPI 30H ; LESS THAN ASCII ZERO ?
- JP CHECK1 ; NO: OK
- ;
- CHERROR MVI C,9
- LXI D,ERR1 ; VALUE ERROR MSG TO CONSOLE
- CALL 0005
- JMP RETRY1
- ;
- CHECK1 CPI 3AH ; GRTR THAN ASCII 9 ?
- JP CHERROR ; YES: ERROR
- SUI 30H ; CONVERT TO BCD
- INR A ; +1
- STA TIMSET+2 ; IMBED VALUE IN PATCH1
- ;
- MVI C,0DH ; RESET DISK DRIVES
- CALL 0005
- ;
- LXI D,FCB
- MVI C,0FH ; TRY TO OPEN WS FILE
- CALL 0005
- INR A ; FF BECOMES 0 = ERROR
- JNZ FILEOK ; IF NO ERROR
- ;
- NOFILE MVI C,9
- LXI D,ERR2 ; 'FILE NOT FOUND' MSG TO CONSOLE
- CALL 0005
- JMP EXIT
- ;
- ;**** READ WORDSTAR INTO CORE
- FILEOK LXI H,1000H ; READ BUFFER BASE ADRS
- LOOP1 SHLD DMAADRS ; SAVE IT
- ;
- MVI A,H
- CPI 0B0H ; READ BUFFER OVERFLOW (OVER B000H) ?
- JNZ NOFLOW ; NO: OK
- ;
- MVI C,9
- LXI D,ERR3 ; 'OVERFLOW ERROR' MSG TO CONS
- CALL 0005
- JMP EXIT
- ;
- NOFLOW XCHG
- MVI C,1AH ; CALL TO ST DMA ADRS
- CALL 0005
- ;
- MVI C,14H
- LXI D,FCB ; READ A RECORD INTO READ BUFFER
- CALL 0005
- ;
- ORA A ; END OF FILE ?
- JNZ INSERT ; YES: INSERT PATCHES
- ;
- LHLD DMAADRS
- LXI D,128
- DAD D ; INC DMA ADR BY 128 BYTES
- JMP LOOP1 ; READ NEXT RECORD
- ;
- ;**** INSERT DIVERSION FOR PATCH1 (BLINK)
- INSERT LXI D,0F00H ; MOD BIAS (100H = 1000H)
- LXI H,DIVERT1 ; DIVERSION FRM WS TO PATCH1
- DAD D ; +BIAS
- DCX H ; TEST FOR CORRECT VERSION OF WORDSTAR-
- MOV A,M ; CHECK INST BEFORE DIVERTION LOCATION.
- CPI 00
- JZ CHECK2 ; SAME VERSION: OK
- ;
- VERSERR MVI C,9
- LXI D,ERR4 ; 'VERSION ERR' MSG TO CONS
- CALL 0005
- JMP EXIT
- ;
- CHECK2 DCX H
- MOV A,M
- CPI 01 ; CHECK ANOTHER BYTE TO BE SURE
- JNZ VERSERR ; IF ERROR
- ;
- INX H
- INX H
- INX H
- LXI B,PATCH1 ; PATCH1 ST ADRS
- MOV M,C ; INSERT INTO WS
- INX H
- MOV M,B
- ;
- ;**** INSERT DIVERSION TO PATCH2
- ; LXI H,DIVERT2 ; ADRS OF DIVERSION TO PATCH2
- lxi h,inisub ; patch2 diversion changed to inisub
- DAD D ; +BIAS
- mvi m,0c3h ; store jmp at inisub
- INX H
- LXI B,PATCH2 ; PATCH2 ST ADRS
- MOV M,C ; INSERT INTO WS
- INX H
- MOV M,B
- inx h
- mvi m,0c3h ; store jmp at unisub = inisub + 3
- inx h
- lxi b,patch3 ; patch3 st adrs
- mov m,c ; insert into ws
- inx h
- mov m,b
- ;
- ;**** INSERT BODY OF patches INTO WS FREE PATCH AREA
- LXI H,PATCHSP ; DESTINATION ADRS
- DAD D ; +BIAS
- XCHG
- LXI H,PATCHSP ; SOURCE ADRS
- LXI B,PATCHND-PATCHST ; BYTE COUNT
- ; byte count above must be < 124 decimal (07ch)
- ;
- DB 0EDH,0B0H ; Z80 'LDIR' BLOCK MOVE INST
- ;
- ;**** PREPARE TO WRITE WORDSTAR BACK TO DISK
- LXI H,0100 ; RESET FCB
- SHLD FCB+14
- LXI H,0000
- SHLD FCB+12
- SHLD FCB+32
- SHLD FCB+34
- ;
- MVI C,0FH
- LXI D,FCB ; OPEN WORDSTAR FILE
- CALL 0005
- INR A ; FF BECOMES 0 = ERROR
- JZ NOFILE
- ;
- LXI H,1000H ; WRITE BUFFER ST ADRS
- SHLD WRTADRS
- XCHG
- ;
- LOOP2 MVI C,1AH ; CALL TO SET DMA ADRS
- CALL 0005
- ;
- MVI C,15H
- LXI D,FCB ; WRITE ONE RECORD TO DISK
- CALL 0005
- ;
- LHLD WRTADRS
- LXI D,128
- DAD D ; INC DMA ADR BY 128 BYTES
- SHLD WRTADRS
- XCHG
- LHLD DMAADRS ; IF WRTADRS = END OF READ BFR THEN ALL DONE
- MOV A,L
- CMP E
- JNZ LOOP2 ; IF NOT EQUAL: CONTINUE
- MOV A,H
- CMP D
- JNZ LOOP2 ; IF NOT EQUAL: CONTINUE
- ;
- MVI C,10H
- LXI D,FCB ; CLOSE FILE
- CALL 0005
- ;
- MVI C,9
- LXI D,MSG2 ; 'TERMINATION MSG' TO CONS
- CALL 0005
- ;
- EXIT JMP 0000 ; CP/M WARM START ENTRY
- ;
- ;**** STORAGE AND MESSAGES
- ;
- DMAADRS DW 0 ; READ BFR POINTER
- WRTADRS DW 0 ; WRITE BFR POINTER
- ;
- ERR1 DB 08H,' WRONG!',8,8,8,8,8,8,8,8,'$'
- ERR2 DB 0DH,0AH,0AH,'ERROR: FILE NOT FOUND, RESTART AND TRY AGAIN!'
- DB 0DH,0AH,'$'
- ERR3 DB 0DH,0AH,0AH,'ERROR: READ BUFFER OVERFLOW, BAD SOURCE FILE ?'
- DB 0DH,0AH,'$'
- ERR4 DB 0DH,0AH,0AH,'ERROR: WORDSTAR FILE CORRUPT OR VERSION IS DIFFERENT'
- DB 0DH,0AH,'FROM VERSION EXPECTED BY PATCH (SEE ABOVE)',0DH,0AH,'$'
- ERR5 DB 1AH,' WSPATCH REV 1.0',0DH,0AH
- DB 'ERROR: WORDSTAR FILENAME.EXT AND SOURCE DRIVE MUST',0DH,0AH
- DB 'BE SPECIFIED IN COMMAND LINE. --EG:',0DH,0AH
- DB ' ',1BH,6CH,'WSPATCH B:WS.COM',1BH,6DH,' --TRY AGAIN!',0DH,0AH
- DB '$'
- ERR6 DB 1AH,' WSPATCH REV 1.0',0DH,0AH
- DB 'ERROR: TWO FILENAMES GIVEN IN COMMAND LINE, SOURCE',0DH,0AH
- DB 'FILE MUST BE SAME AS DESTINATION FILE. --TRY AGAIN!',0DH,0AH,'$'
- ;
- ; STACK AREA
- DS 64
- STACK
- END
-