Odd/Even: Two sided printing with WordStar and NewWord by Randy Brook, 13742 41st Av. NE, Seattle, WA 98125 Version 1.1 11/3/85 This file explains how to modify WordStar versions 3.0 and 3.3 (CP/M) and NewWord version 2.x (CP/M) to print double sided documents on continuous form paper. Great for long documents. Credit for the basic coding idea goes to Chuck Somerville. These patches assume you are using the CP/M list device for sending output to your printer. This is the norm for standard printer installations available through WordStar's and NewWord's installation menus. If you are using a custom printer driver, you will need to adapt these patches to fit your driver. The principle of the patches is very simple. Characters directed to the printer are intercepted by the new code. A "flag" byte determines whether the character will then be sent on to the printer. When the flag is 00h, no characters are printed. When it's 01h, they are printed. When a form feed is intercepted, the flag byte is toggled (i.e. from 00h to 01h or vice versa). Thus, two version of the main program (*.COM) are necessary. In one the flag starts at 00h; in the other it starts at 01h. When printing, the "Use form feeds?" question must always be answered yes. Assuming your disk has the room, you can put both modified program versions on the same disk. You will only need one set of the overlays. The modified programs will function normally in all respects (except printing), and you can use either for creating or editing documents. [One minor variation: If you use the "R"un command, the "Press any key to return to WordStar/NewWord" feature will misfunction. It looks for the .COM file as it was named when you installed the program (eg. WS.COM, NW.COM).] To use the modified programs, run the odd .COM file, print pages 1,3,5, etc., turn over the continuous form paper, and run the even document. Restart the program for each document, to ensure that you reinitialize the flag byte properly. REMEMBER: You must "Use form feeds - Yes" when printing. I recommend a trial run for practice. I found with NewWord, for example, that I get an extra blank page (form feed sent to printer) when I start printing the even pages, so I have to adjust by starting my odd print after rolling an extra blank page through my printer. With WordStar, I get an extra page with both odd and even. Note that this patch runs faster with NewWord than with WordStar. This is because WordStar's printer driver is just plain slow. For example, it cannot keep up with my printer (200 cps), while NewWord even works with the HP laser jet. Similarly, WordStar is much slower than NewWord in skipping over the non-printing pages. DIRECTIONS 1. Use a disk with NewWord or WordStar on it. You will need the overlay files to test your results, but you will not need the WordStar or NewWord Install program. You will also need DDT.COM. 2. Load the .COM with DDT. NW WS 3.0 WS 3.3 ---- ------ ------ A>DDT NW.COM A>DDT WS.COM A>DDT WS.COM DDT VERS 2.2 DDT VERS 2.2 DDT VERS 2.2 NEXT PC NEXT PC NEXT PC 3500 0100 3F00 0100 4600 0100 I'll save you a little arithmetic: NewWord is 52 "pages," WordStar 3.0 is 62, and WordStar 3.3 is 69. ******************** NEWWORD VERSION 2.X *********************** (User listings for "Version 2", tested with version 2.16) 3. Verify that the area chosen for the patch is unused and that the print/noprint flag will start at 00h: -S0431 0431 00 . (you type the period to end this function) If you see anything other than the "00", you will probably have to relocate the patch (see Technical note to paragraph 5 below). 4. Assemble a jump instruction in the place NewWord checks for special printer routines. NOTE: The parentheticals aren't typed. -A056D (assemble the jump patch in subroutine) ( ULOSTO in the User Area Listing) 056D JMP 0432 (go to the special printer routines) 0570 (hit RETURN to end this assembly) 5. The special printer routine: -A0432 (start point of new code, at start of) ( MORPAT in the User Area Listing) 0432 MOV E,A (char in E register for BDOS call) 0433 CPI 0C (is char a form feed?) 0435 LDA 0431 (load the print/noprint flag) 0438 JNZ 0440 (char not a form feed, skip next step) 043B XRI 01 (is form feed, toggle print/noprint flag) 043D STA 0431 (put flag back) 0440 ORA A (check if "print" or "noprint") 0441 RZ ("0" flag is noprint, return from subroutine) 0442 MVI C,05 (flag was print, BDOS print function #5) 0444 CALL 0005 (call for print driver) 0447 RET (return from subroutine) 0448 (hit RETURN to end this assembly) Technical note: I have placed this routine at the beginning of the MORPAT area, since it is generally unused. There are 64 bytes available in MORPAT. The new code uses only 23 bytes, and can easily be relocated elsewhere in MORPAT (or in CRTPAT, which also allows 64 bytes) if necessary to find other unused space. 6. Leave DDT and save the modified NewWord: -G0 (exits to CP/M) A>SAVE 52 NWEVEN.COM You now have a new NewWord .COM file, just for printing even numbered pages. 7. Create a NewWord file for printing odd numbered pages. First repeat step 2, this time loading the modified file: A>DDT NWEVEN.COM Now repeat step 3, but this time set the print/no print flag to start at 01h: -S0431 0431 00 01 (change this flag to 1) 0432 * . (ignore whatever appears at the *) ( the period ends this function) Finally, repeat step 6, saving the new file: -G0 (exits to CP/M) A>SAVE 52 NWODD.COM **************************** WORDSTAR ************************** 3. Verify that the area chosen for the patch is unused and that the print/noprint flag will start at 00h: -S0320 0320 00 . (you type the period to end this function) If you see anything other than the "00", you will probably have to relocate the patch (see Technical note to paragraph 5 below). 4. Now assemble a jump instruction in the place WordStar sends a character to the printer. NOTE: The parentheticals aren't typed. WS 3.0 WS3.3 Explanation ------------- ------------- ------------------------------- -A071D -A071C (assemble the jump patch at) ( LISEND in User Area Listing) 071D JMP 0321 071C JMP 0321 (go to special printer routine) 0720 071F (hit RETURN to end this assembly) 5. The special printer routine ["*" means same as for WS 3.0]: WS 3.0 WS 3.3 Explanation ------------- ------------- ------------------------------------ -A0321 * (start point of new code, near top) ( of MORPAT in User Area Listing) 0321 MOV E,A * (char in E register for BDOS call) 0322 CPI 0C * (is char a form feed?) 0324 LDA 0320 * (load the print/noprint flag) 0327 JNZ 032F * (char not form feed, skip next step) 032A XRI 01 * (is form feed, toggle print/noprint) 032C STA 0320 * (put flag back) 032F ORA A * (check if "print" or "noprint") 0330 JZ 0723 0330 JZ 0722 (flag is noprint, ret. for next char) 0333 MVI C,05 * (flag was print, BDOS function #5) 0335 JMP 0720 0335 JMP 071F (back to print driver) 0338 * (hit RETURN to end this assembly) Technical note: I have placed this routine near the end of the MORPAT area, past the point likely to be taken up by custom screen drivers (eg. memory mapping routines). There are 128 bytes available in MORPAT, starting at 02E0h (WS 3.0) or 02CBh (WS 3.3). The new code uses only 24 bytes, and can easily be relocated elsewhere in MORPAT if necessary to find unused space. 6. Leave DDT and save the modified WordStar: -G0 (exits to CP/M) A>SAVE ** WS-ODD.COM ** Use 62 for WS 3.0 or 69 for WS 3.3. You now have a new WordStar, just for printing odd numbered pages. 7. Create a WordStar file for printing odd numbered pages. First repeat step 2, this time loading the modified file: A>DDT WS-ODD.COM Now repeat step 3. This time start the print/noprint flag at 01h: -S0320 0320 00 01 (change this flag to 1) 0321 * . (ignore whatever appears at the *) ( the period ends this function) Finally, repeat step 6, saving the new file: -G0 (exits to CP/M) A>SAVE ** WS-EVEN.COM ** = 62 for WS 3.0, 69 for WS 3.3.