-----------------------------------
DATE:     April 13,1982

PRODUCT:  WordStar
CATEGORY: CORRECTION
Revision: All
PROBELM:  ETX/ACK & XON/XOFF protocols through CP/M LIST DEVICE
REF:      USER4, LISINP:, XON/XOFF, ETX/ACK, LST:, PRINTER

Description:

This bug only affects printers which are sent output characters through
the standard CP/M list (LST:) device and the users wishes to implement
the XON/OFF or ETX/ACK protocols.

The list device driver in USER 4 includes a patchable item called LISINP:
which is necessary to provide a routine to retreive the ACK character from
the printer.

Unfortunately this routine is never called by WordStar.  The fix is as
follows:

       A>SID WSOVLY1.OVR<CR>
         SID VERS 1.4
         NEXT   PC   END
         8600  0100  BCFF
         #S739B<CR>
         739B  FA CA<CR>
         739C  25 .<CR>
         #S7992<CR>
         7992  FA CA<CR>
         7993  25 .<CR>
         #G0<CR>
       A>SAVE 133 WSOVLY1.OVR<CR>

                                       EAS

            -----------------------------------
;DATE:     April 13,1982
;
;PRODUCT:  WordStar
;CATEGORY: MODIFICATION
;Revision: 3.0 only
;Subject:  SYSTEM FILE DISPLAY SUPPRESSION IN WS DIRECTORY
;
;  THIS PATCH WILL SUPPRESS DISPLAY OF ANY FILES ASSIGNED TO BE SYSTEM FILES
;  UNDER CP/M 2.XX (HAVEN'T TESTED MP/M) WITH THE COMMAND:
;
;               STAT FN.FT $SYS
;
;               PATCH IS FOR WORDSTAR 3.00      EAS  02/03/82
;
;    THE PATCH REPRESENTS 31 BYTES OF CODE IN THE USER PATCH AREA (USER1,
;    MORPAT:) ORGANIZED TO EXIST AT THE HIGHEST LOCATION AVAILABLE SO THAT
;    CURRENTLY EXISTING PATCHES WHICH DO NOT EXTEND PAST LOCATION 33CH WILL
;    NOT BE AFFECTED BY THE INSTALLATION OF THIS SYSTEM FILE SUPPRESSION.
;
;                             Enjoy,
;                                       Evan
;
DELENTX EQU     2C28H
DELENTY EQU     2C2BH
DTAB    EQU     2C69H
DENTPT  EQU     36D1H
DOSNX   EQU     2C8AH
NDTST   EQU     2BF6H

       ORG     33DH
;
MORPAT: PUSH    D
       INX     D
       LDAX    D
       ANI     80H
       POP     D

       JNZ     NODISP
       LXI     H,DTAB

       JMP     DELENTY
;
NODISP: POP     H
       POP     B
       XCHG
       LHLD    DENTPT
       XCHG
       PUSH    H
       CALL    DOSNX
       POP     H
       POP     D
       JMP     NDTST
;
       ORG     DELENTX
;
       JMP     MORPAT
       END

;DATE:     April 13,1982
;
;PRODUCT:  WordStar
;CATEGORY: MODIFICATION
;Revision: 3.0 only
;Subject:  Formmated output from printer driver
;
*************************************************
*       PRINT TO DISK WITH WORDSTAR 3.0         *
*************************************************
;
; THIS PROGRAM TAKES WHAT WORDSTAR SENDS TO THE LIST DEVICE
; TO A FILE CALLED FILEOUT.  THIS MEANS YOU CAN PRINT FILES
; DIRECTLY TO THE DISK AND THEN PRINT THEM LATER USING PIP
; OR AN EQUIVALENT.  ALSO GOOD FOR SEEING EXACTLY WHAT WORDSTAR
; DOES FOR ANY SPECIFIC PRINTER INSTALLATION.  INSTALL
; WORDSTAR FOR THE PRINTER OF YOUR CHOICE, NO PROTOCOL,
; AND CP/M "LST:" DEVICE DRIVER.  THIS PROGRAM USES
; PBGMEM, SO BE SURE TO SAVE ENOUGH PAGES TO HOLD THE
; PATCHES.
;
*************************
*       EQUATES         *
*************************
;
DEFBUF  EQU     0080H           ; DEFAULT BUFFER USED FOR FILE I/O
BDOS    EQU     5               ; LOCATION OF BDOS JUMP VECTOR
CLOSEF  EQU     16              ; CLOSE FILE FUNCTION
DELETEF EQU     19              ; DELETE FILE FUNCTION
MAKEF   EQU     22              ; MAKE FILE FUNCTION
WRITEF  EQU     21              ; WRITE SEQUENTIAL
SETDMA  EQU     26              ; SET DMA ADDRESS
INISUB  EQU     02A4H           ; ADDRESS OF INITIALIZATION SUBR IN WS 3.0
UNISUB  EQU     02A7H           ;    "    "  DEINITIALIZATION SUBR IN 3.0
PRINIT  EQU     070DH           ;    "    "  PRINTER INITIALIZATION SUBR
PRFINI  EQU     0710H           ;    "    "  "       DEINITIALIZATION SUBR
MORPAT  EQU     02E0H           ;    "    "  EXTRA PATCHING AREA IN ROOT
LISEND  EQU     071DH           ;    "    "  LST: PRINTER DRIVER IN WS
PBGMEM  EQU     035CH           ;    "    "  POINTER TO FREE MEMORY
MEM     EQU     7900H           ; WHERE THE ABOVE POINTER POINTS TO INITIALLY
;
       ORG     INISUB
       JMP     INITA           ; CHANGE BDOS VECTOR TO GO TO OUR ROUTINE
                               ; WHICH CHECKS FOR WS CHANGING DMA ADDRESS
                               ; SO WE CAN RESET IT AFTER WE WRITE OUR FILE
                               ; TO THE DISK.
;
       ORG     UNISUB
       JMP     DEINITA         ; CHANGE BDOS VECTOR BACK TO WHAT IT WAS
                               ; ORIGINALLY.
;
       ORG     PRINIT
       JMP     INITB           ; DELETE THE FILE IF IT EXISTS, AND CREATE
                               ; A NEW ONE.
;
       ORG     PRFINI
       JMP     DEINITB         ; WRITE LAST SECTOR TO, AND CLOSE FILEOUT
;
       ORG     LISEND
       JMP     PFILE           ; PRINT FILE TO DISK
;
       ORG MORPAT
INITA:  LHLD    BDOS+1          ; GET BDOS VECTOR
       SHLD    CBDOS+1         ; STORE IT FOR USE AFTER CHECKING FOR
                               ; CHANGE DMA ADDRESS
       LXI     H,TRANS         ; POINT TO TRANSLATE ROUTINE
       SHLD    BDOS+1          ; MAKE 6 & 7 POINT THERE SO
                               ; THAT WE CAN DO TRANSLATION
       RET                     ; AND RETURN
;
INITB:  MVI     C,DELETEF       ; DELETE "FILEOUT"
       LXI     D,FILE          ; IF IT EXISTS
       CALL    BDOS            ; NOTE, NO ERROR CHECKING
       MVI     C,MAKEF         ; CREATE THE FILE ON CURRENTLY LOGGED DRIVE
       LXI     D,FILE
       CALL    BDOS
       INR     A               ; IF NO DIRECTORY SPACE
       JZ      EXIT            ; RETURN TO OPERATING SYSTEM
       RET                     ; ELSE DONE
;
DEINITA:LHLD    CBDOS+1         ; POINT TO ORIGINAL JMP ADDRESS
       SHLD    BDOS+1          ; STORE IT BACK
       RET
;
DEINITB:LXI     D,DEFBUF        ; POINT TO BUFFER
       MVI     C,SETDMA        ; CHANGE DMA
       CALL    CBDOS
       LXI     D,FILE          ; POINT TO FCB
       MVI     C,WRITEF        ; WRITE IT OUT
       CALL    CBDOS
       ORA     A               ; ERROR IF NON-ZERO
       JNZ     EXIT            ; RETURN TO OPERATING SYSTEM
       LXI     H,DEFBUF-1      ; POINT TO 80H
       SHLD    COUNT           ; STORE NEW COUNT
       LHLD    NEWDMA          ; GET WS'S DMA ADDRESS
       XCHG                    ; PUT IN DE
       MVI     C,SETDMA        ; TO SET DMA AND
       CALL    CBDOS           ; CHANGE IT BACK
       MVI     C,CLOSEF        ; CLOSE THE FILE
       LXI     D,FILE
       CALL    CBDOS
       INR     A               ; CHANGED DISKS ON US?
       JZ      EXIT            ; IF SO, REBOOT
       RET                     ; ELSE DONE
;
TRANS:  PUSH    PSW             ; SAVE ACCUMULATOR
       MOV     A,C             ; GET BDOS FUNCTION NUMBER
       CPI     SETDMA          ; IF SETTING DMA, WE WANT TO KNOW WHERE TO
       JZ      STODMA          ;
       POP     PSW             ; ELSE RESTORE ACC
CBDOS:  JMP     0000H           ; AND JMP TO THE BDOS (ADDRESS PUT IN AT INITA)
;
STODMA: XCHG                    ; GET NEW DMA IN HL
       SHLD    NEWDMA          ; STORE IT FOR FUTURE USE
       XCHG                    ; RESTORE DE & HL TO ORIGINAL VALUES
       POP     PSW             ; RESTORE ACCUMULATOR
       JMP     CBDOS           ; AND JUMP TO BDOS
;
NEWDMA: DW      0000H           ; THIS IS WHERE WS'S DMA IS (PUT IN FROM
                               ; STODMA ROUTINE ABOVE
;
       ORG     PBGMEM
       DW      LEN + MEM       ; STORE NEW POINTER TO END OF MEMORY AT PBGMEM
;
       ORG     MEM             ; START WHERE PBGMEM ORIGINALLY POINTED TO
                               ; BECAUSE THERE'S NOT ENOUGH SPACE TO DO
                               ; ALL THIS IN MORPAT
;
; ACTUAL ROUTINE TO PRINT FILE TO DISK
;
PFILE:  LHLD    COUNT           ; GET COUNT
       INX     H               ; INCREMENT IT
       MOV     B,A             ; SAVE CHARACTER BEING PRINTED
       MOV     A,H             ; GET HI ORDER COUNT
       CPI     1               ; GONE TO 100H?
       JZ      WRITIT          ; YES, TIME TO WRITE A SECTOR
       SHLD    COUNT           ; NO, STORE NEW COUNT
       MOV     M,B             ; STORE CHARACTER
       RET                     ; AND RETURN
WRITIT: PUSH    B               ; SAVE LAST CHARACTER
       LXI     D,DEFBUF        ; POINT TO BUFFER
       MVI     C,SETDMA        ; CHANGE DMA
       CALL    CBDOS
       LXI     D,FILE          ; POINT TO FCB
       MVI     C,WRITEF        ; WRITE IT OUT
       CALL    CBDOS
       ORA     A               ; ERROR IF NON-ZERO
       JNZ     EXIT            ; RETURN TO OPERATING SYSTEM
       LXI     H,DEFBUF-1      ; POINT TO 80H
       SHLD    COUNT           ; STORE NEW COUNT
       LHLD    NEWDMA          ; GET WS'S DMA ADDRESS
       XCHG                    ; PUT IN DE
       MVI     C,SETDMA        ; TO SET DMA AND
       CALL    CBDOS           ; CHANGE IT BACK
       POP     B               ; GET LAST CHARACTER
       MOV     A,B             ; INTO A
       JMP     PFILE           ; AND START AGAIN
;
EXIT:   CALL    DEINITA         ; RESTORE BDOS VECTOR
       JMP     0000            ; AND REBOOT
;
COUNT:  DW      80H-1           ; INITIALIZE TO BEGINNING - 1
FILE:   DB      0
       DB      'FILEOUT ','   '; FCB FOR OUTPUT FILE
       DB      0,0,0,0,0,0,0,0
       DB      0,0,0,0,0,0,0,0
       DB      0,0,0,0,0,0,0,0
       DW      -1              ; TO MARK END
LEN     EQU     $-PFILE
END
;