--- title: "ZPrint-80 1.2" id: 50571 type: "computer_media" slug: "zprint-80-1-2" url: "http://localhost/computer_media/zprint-80-1-2/" markdown_url: "http://localhost/computer_media/zprint-80-1-2.md" published_at: "2023-06-18T17:35:33+00:00" modified_at: "2026-04-03T07:59:24+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2019/02/20230809-041332.jpg" excerpt: "A fully interactive configuration utility patches a Centronics printer driver in machine code, letting you choose your printer model, interface, column width, and linefeed behavior before saving a custom binary to tape." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" - name: "Zebra Systems" slug: "zebra-systems" taxonomy: "post_tag" url: "http://localhost/tag/zebra-systems/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" genre: - name: "Printer" slug: "printer" taxonomy: "genre" url: "http://localhost/type/printer/" media_type: "Program" download_url: "https://archive.org/download/timex-sinclair-software-archive/ZPrint-80%201.2%20%28198x%29%28Zebra%20Systems%29%28TS2068%29%28US%29%28Program%29.zip" mediadate: "198x" producer_company: - id: 11469 title: "Zebra Systems, Inc." type: "company" url: "http://localhost/company/zebra-systems/" images: - url: "http://localhost/wp-content/uploads/2023/06/SCR-20260401-gnja.png" - url: "http://localhost/wp-content/uploads/2023/06/SCR-20260401-gngw.png" related_products: - id: 14692 title: "ZPRINT-80" type: "product" url: "http://localhost/product/zprint-80/" media_type_tags: "Printer" --- ZPrint-80 1.2 is a BASIC configuration utility for the “Zprnt80” Centronics printer driver, a 1300-byte Z80 machine code module available in two memory-resident versions: low (base address 27000) and high (base address 64000). The program loads the selected machine code module to address 64000 for editing, then patches specific bytes via POKE to configure the printer model (Gemini 10X/SG10, Memotech, Panasonic, Epson RX/FX, Spirit-80, or Prowriter 8510), the printer interface (Aerco, Tasman-b/c, or A&J), the LPRINT/LLIST output width (1–80 columns), and whether the driver itself should emit a linefeed byte (ASCII 10) after each carriage return. Printer control escape-sequence blocks are stored as DATA statements and written into the machine code using a sentinel-based READ loop that uses 254 as a “next segment” marker and 255 as a terminator. After patching, the configured code is SAVEd back to tape with the correct load address POKEd into the header bytes at offsets 64169–64170, and a VERIFY pass is attempted with ON ERR error recovery. The display routine uses RANDOMIZE USR with a DEF FN that calculates an address from system variables 23635–23636 to call a custom character-set rendering routine loaded separately as “chars” CODE 51200. *** ## Program Analysis ### Program Structure The program is organized into well-commented subroutine blocks spanning a wide line-number range. Execution begins at line 100 (via `SAVE "customize" LINE 100` at line 9910). The overall flow is linear: copyright splash → welcome screen → version selection → machine code load → printer selection → interface selection → width input → linefeed option → patching → save → verify. | Line Range | Purpose | | --- | --- | | 1–2 | REM containing embedded machine code / display driver data; DEF FN a() | | 10–90 | Screen setup and clear-screen subroutines | | 100–555 | Main program: intro, user prompts, configuration, save/verify | | 800–836 | Interface-specific POKE subroutines (Aerco, Tasman, A&J) — defined but not called directly; logic inlined at 1530–1560 | | 900–940 | “Press any key to continue” page-flip subroutine | | 1000–1200 | Variable declarations: memory addresses for all patch targets | | 1300–1360 | DATA blocks: printer control escape sequences | | 1500–1650 | Configuration engine: applies all POKEs and loads DATA into machine code | | 2000–2070 | Subroutine: loads “Main Pcontrl Block” using sentinel-terminated READ loop | | 2200–2250 | Subroutine: loads “GRAF512 block” using sentinel-terminated READ loop | | 2400–2440 | Save-error handler (reached via ON ERR) | | 2600–2670 | Copyright/splash screen subroutine | | 9900–9920 | Tape-save block for the BASIC program and character set | ### Machine Code Interface The program loads and patches a 1300-byte Z80 machine code module. Both variants (lo and hi) are always loaded to address 64000 for in-place editing; before saving, lines 480–490 POKE the correct destination load address into the tape header area at bytes 64169–64170: - `POKE 64169,134: POKE 64170,105` → sets load address to 27000 (lo version: 105×256+134 = 26,886 — note this is likely little-endian: 134 + 256×105 = 26,894… the exact intent is a header patch) - `POKE 64169,14: POKE 64170,250` → sets load address to 64000 (hi version) The custom character rendering routine is invoked repeatedly via `RANDOMIZE USR FN a()`. The DEF FN at line 2 computes the call address as `PEEK 23635 + 256*PEEK 23636 + 5`, which derives a pointer from the system variable PROG (the start of the BASIC program area) plus an offset of 5, targeting binary data embedded in the line 1 REM statement. ### Patch Target Addresses All patch addresses are declared as named variables in the subroutine at lines 1000–1200, making the patching logic at 1500–1560 readable. Key addresses (relative to the hi-memory base at 64000): | Variable | Address | Purpose | | --- | --- | --- | | `Mreset` | 64599 | Start of printer control block in machine code | | `lNFDaddr` | 64647 | Linefeed byte value (0 or 10) | | `WDTHaddr` | 64012 | LPRINT/LLIST column width | | `jmplo` / `jmphi` | 65128 / 65129 | Low/high bytes of interface jump address | | `port` | 65136 | Port number byte (Tasman-c: set to 251) | ### DATA Block and Sentinel Protocol Printer escape-sequence data is stored in six DATA lines (1310–1360). The READ loops at lines 2000–2070 and 2200–2250 use two sentinel values: `254` signals “advance to next 8-byte segment” (triggering a `NEXT m` in the FOR loop), and `255` signals end-of-block and causes a `RETURN`. This allows variable-length escape sequences to be packed into fixed-stride memory regions. The main block loop steps in increments of 8 (`STEP 8`) from `Mreset` to `Mreset+31`, giving four sub-blocks; the GRAF512 block at `Mreset+32` is written linearly without stride. ### Screen Management The subroutine at line 60 uses a clever technique to clear the text area: `DIM a$(544+32)` creates a 576-character string pre-filled with spaces, which is then PRINTed at row 4. Since the screen is 32 columns wide, this overwrites 18 rows (576 ÷ 32) of the display in a single PRINT statement. The `FLASH f` modifier at line 70 allows the clearing pass to also flash or not, controlled by the variable `f`. ### Error Handling The program uses `ON ERR GO TO 2400` (line 501) to trap tape verify errors, and `ON ERR RESET` (line 503/2410) to clear the handler after it fires or when no longer needed. The error handler at 2400 prompts the user to try again and branches back to line 460 to re-attempt the save sequence. ### Notable Anomalies and Observations - The variable name `If` (line 340) shadows the BASIC keyword `IF` in appearance but is valid as a numeric variable since BASIC variable names are case-sensitive in this implementation. Lines 1530–1560 reference it as `IF` in conditions, creating visually confusing constructs like `IF IF=1 THEN`. - The subroutines at lines 800–836 (Aerco, Tasman, A&J) are defined but never called via GO SUB; their logic is duplicated inline at lines 1530–1560. Line 820 (`GO TO 810`) is dead code. - The REM comment at line 1500 spells “Configuration” as “Cofiguration” — a minor typo. - Both Zprnt variants are always loaded to address 64000 regardless of their final destination, which means the lo-memory version (27000) is edited at the wrong base address; the address constants in lines 1000–1086 correctly account for this by providing two sets of values depending on `v$`. - Line 260 accepts printer selections 1–7 (CODE 49–55) but the displayed menu only shows entries 1–7; the range check `CODE k$>55` correctly rejects “8” and above. - The GRAF512 Epson data at line 1340 (`27,108` = ESC l) differs from the Gemini data at 1330 (`27,77` = ESC M) and Memotech/Panasonic/Spirit-80 at 1320 (`27,68` = ESC D), reflecting genuine differences in 512-dot graphics initialization between printer families. ## Source Code ``` 1 REM !VAL \ FREE !CODE \ RETURN ( RETURN ( THEN '. THEN AND *U\>"PEEK #( IF RESTORE !LEN \N!@ RESTORE !VAL \ FREE NEW o>& THEN % THEN gSTR$ RESTORE !VAL \ FREE LLIST RETURN 8 RETURN "TAB \ LLIST RESTORE FREE = OR RETURN a8paSTR$ X COPY OR ao> THEN % THEN gSTR$ RESTORE !ATTR \ FREE LLIST RETURN (j CAT OR RESTORE FREE W!ATTR \ FREE RETURN z(u*TAB \r#s+ OR STR$ "TAB \ LLIST #STR$ OR RESTORE x RETURN !!CODE \ THEN F PI GO SUB B"TAB \*TAB \ LPRINT PI GO SUB B"TAB \ LLIST STR$ !CODE \ THEN F*TAB \(PI GO SUB BAePI GO SUB B\ RETURN #"TAB \ LLIST #>"PEEK >= DATA :'! THEN ? THEN THEN - THEN ? THEN THEN ,T]!ATTR \ FREE RETURN ( FLASH OR RESTORE FREE VERIFY *TAB \r#s+"TAB \ LLIST #STR$ *TAB \ RETURN PI GO SUB B"TAB \ LLIST #>"PEEK >=b LLIST #>"PEEK >=bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2 DEF FN a()=PEEK 23635+256*PEEK 23636+5 10 BORDER 6: PAPER 6: CLS 12 LET x=4 18 PRINT AT 0,0; PAPER x;" " 20 PRINT AT 1,0; PAPER x;" " 22 PRINT AT 2,0; PAPER x;" " 23 PRINT AT 3,0; PAPER x;" " 24 POKE 23728,1: POKE 23729,1: POKE 23723,2 26 RANDOMIZE USR FN a() 28 REM "Zprint80 Customization Program" 30 PLOT 0,175: DRAW 255,0 40 PLOT 0,144: DRAW 255,0 42 LET f=1: GO SUB 60 44 POKE 23728,11: POKE 23729,3: POKE 23723,3 45 RANDOMIZE USR FN a() 46 REM "STOP THE TAPE" 47 FOR n=1 TO 6: BEEP .1,-30: PAUSE 5: NEXT n 48 PRINT AT 14,0; FLASH f;" Press ENTER to proceed" 49 PAUSE 4e4: LET f=0 50 RETURN 60 DIM a$(544+32) 70 PRINT AT 4,0; FLASH f;a$ 80 PRINT AT 5,0; 90 RETURN 100 REM main start 101 GO SUB 2600: INK 2: LOAD "chars"CODE 51200: POKE 23607,199: INK 0 110 GO SUB 10 115 IF INKEY$>"" THEN GO TO 115 120 GO SUB 60 130 PRINT " The purpose of this program is to allow you to configure the 'Zprnt80' machine code to work with your particular printer and printer interface, and set LPRINT/LLIST output width appropriately for your desired application." 140 PRINT ,," 'Zprnt80' comes in two versions; one resides in low memory at address 27000, the other in high memory at address 64000. Both versions are 1300 bytes long." 150 GO SUB 900 160 PRINT ,,,,,," So which version do you want to LOAD from Tape and configure?",,,,,," 1 = ""Zprnt-lo"" (base=27000)",,," 2 = ""Zprnt-hi"" (base=64000)" 170 PRINT AT 21,0; INVERSE 1;" press no# to select " 180 LET k$=INKEY$: IF k$="" THEN GO TO 180 181 IF k$<>"1" AND k$<>"2" THEN GO TO 180 182 GO SUB 60 184 PRINT AT 10,0;" Start the tape so your"," selected 'Zprnt' machine"," code module can load" 190 IF k$="1" THEN LOAD "Zprnt-lo"CODE 64000 200 IF k$="2" THEN LOAD "Zprnt-hi"CODE 64000 210 LET v$=k$ 220 GO SUB 60 230 PRINT AT 7,0;" Which printer do you use?" 240 PRINT ,,,," 1 = Gemini 10X"," 2 = Gemini SG10"," 3 = Memotech"," 4 = Panasonic"," 5 = Epson RX/FX"," 6 = Spirit-80"," 7 = Prowriter 8510" 250 PRINT AT 21,0; INVERSE 1;" press no# to select " 260 LET k$=INKEY$: IF CODE k$<49 OR CODE k$>55 THEN GO TO 260 270 LET prntr=CODE k$-48 300 GO SUB 60 305 IF INKEY$>"" THEN GO TO 305 310 PRINT AT 8,0;" Which printer interface"," do you use?" 315 PRINT AT 12,0;" 1 = Aerco"," 2 = Tasman-b"," 3 = Tasman-c"," 4 = A & J" 320 PRINT AT 21,0; INVERSE 1;" press no# to select " 330 LET k$=INKEY$: IF k$="" THEN GO TO 330 335 IF k$<>"1" AND k$<>"2" AND k$<>"3" AND k$<>"4" THEN GO TO 330 340 LET If=CODE k$-48 350 GO SUB 60 360 PRINT AT 11,0;" What printing width would you"," like for LPRINT/LLIST output?" 370 INPUT "Width?";k 380 LET wdth=k 390 IF wdth<1 OR wdth>80 THEN GO TO 370 410 GO SUB 60 420 PRINT AT 6,0;" Many printers come from the factory setup to provide an automatic linefeed after each carriage return. Usually you can enable/disable this auto linefeed feature via a DIP switch. If auto-linefeed is enabled on your printer you will not want the 'Zprnt' software to provide a linefeed code." 430 INPUT "Should 'Zprint80' provide a linefeed?(y or n)";k$ 435 IF CODE k$>97 THEN LET k$=CHR$ (CODE k$-32) 440 IF k$<>"Y" AND k$<>"N" THEN GO TO 430 450 IF k$="Y" THEN LET lnfd=10 452 IF k$="N" THEN LET lnfd=0 455 GO SUB 60 456 PRINT AT 21,0; FLASH 1;"Please Wait, making mods to code" 457 GO SUB 1500 460 GO SUB 60 470 PRINT AT 8,0;" You have finished the configuration process, so put a blank tape in your recorder, start recording and press any key to SAVE your custom version of the 'Zprnt' code." 480 IF v$="1" THEN POKE 64169,134: POKE 64170,105: SAVE "zprnt-lo"CODE 64000,1300 490 IF v$="2" THEN POKE 64169,14: POKE 64170,250: SAVE "zprnt-hi"CODE 64000,1300 495 GO SUB 60 500 PRINT AT 21,0; FLASH 1;"Rewind Tape and Play for VERIFY " 501 ON ERR GO TO 2400 502 PRINT AT 5,0;: INK 6: VERIFY ""CODE : INK 0 503 ON ERR RESET 510 GO SUB 60 520 PRINT AT 7,0;" The Tape save was good. You now have a custom configured version of the 'Zprnt' code on Tape. In the future use the following command to LOAD it ..." 530 IF v$="1" THEN PRINT ,,,," < LOAD ""zprnt-lo"" CODE 27000 >" 540 IF v$="2" THEN PRINT ,,,," < LOAD ""zprnt-hi"" CODE 64000 >" 550 PRINT AT 21,0; INVERSE 1;" Customization is now Complete " 555 GO TO 555 799 STOP 800 REM Aerco 802 POKE jmplo,aercolo 804 POKE jmphi,aercohi 806 RETURN 810 REM Tasman 812 POKE jmplo,taslo 813 POKE jmphi,tashi 814 IF k$="3" THEN POKE port,251 817 RETURN 820 GO TO 810 830 REM A & J 832 POKE jmplo,ajlo 834 POKE jmphi,ajhi 836 RETURN 900 REM page flip 910 PRINT AT 21,0; INVERSE 1;" press any key to continue " 920 IF INKEY$="" THEN GO TO 920 930 GO SUB 60 940 RETURN 1000 REM Declarations 1005 LET Mreset=64599 1010 LET lNFDaddr=64647 1020 LET WDTHaddr=64012 1030 LET jmplo=65128 1040 LET jmphi=65129 1050 LET port=65136 1060 IF v$="1" THEN LET taslo=226 1061 IF v$="1" THEN LET tashi=109 1062 IF v$="2" THEN LET taslo=106 1063 IF v$="2" THEN LET tashi=254 1070 IF v$="1" THEN LET aercolo=2 1071 IF v$="1" THEN LET aercohi=110 1072 IF v$="2" THEN LET aercolo=138 1073 IF v$="2" THEN LET aercohi=254 1080 IF v$="1" THEN LET ajlo=20 1082 IF v$="1" THEN LET ajhi=110 1084 IF v$="2" THEN LET ajlo=156 1086 IF v$="2" THEN LET ajhi=254 1200 RETURN 1300 REM Pcontrl Blocks 1310 DATA 2,27,64,254,4,27,76,192,3,254,3,27,65,6,254,3,27,65,8,255: REM common Main block 1320 DATA 11,27,68,21,0,9,0,0,27,76,0,2,255: REM GRAF512 for Mem/Pan/Spir80 1330 DATA 11,27,77,21,0,0,0,0,27,76,0,2,255: REM GRAF512 for Gem 10X/SG10 1340 DATA 11,27,108,21,0,0,0,0,27,76,0,2,255: REM GRAF512 for Epson RX/FX 1350 DATA 13,27,40,48,50,49,46,9,27,83,48,53,49,50,255: REM GRAF512 for Prowr 8510 1360 DATA 2,27,62,254,6,27,83,48,57,54,48,254,4,27,84,49,50,254,4,27,84,49,54,255: REM Prowr Main block 1500 REM Cofiguration Mods 1502 GO SUB 1000 1510 POKE LNFDaddr,lnfd 1520 POKE WDTHaddr,wdth 1530 IF IF=1 THEN POKE jmplo,aercolo: POKE jmphi,aercohi 1540 IF IF=2 OR IF=3 THEN POKE jmplo,taslo: POKE jmphi,tashi 1550 IF IF=3 THEN POKE port,251 1560 IF IF=4 THEN POKE jmplo,ajlo: POKE jmphi,ajhi 1570 IF prntr<=6 THEN RESTORE 1310 1580 IF prntr=7 THEN RESTORE 1360 1590 GO SUB 2000 1600 IF prntr=3 OR prntr=4 OR prntr=6 THEN RESTORE 1320 1610 IF prntr=1 OR prntr=2 THEN RESTORE 1330 1620 IF prntr=7 THEN RESTORE 1350 1630 IF prntr=5 THEN RESTORE 1340 1640 GO SUB 2200 1650 RETURN 2000 REM Load Main Pcntrl Blck 2010 FOR m=Mreset TO Mreset+31 STEP 8 2020 LET Daddr=m 2030 READ n: IF n=254 THEN GO TO 2060 2040 IF n=255 THEN RETURN 2050 POKE Daddr,n: LET Daddr=Daddr+1: GO TO 2030 2060 NEXT m 2070 RETURN 2200 REM Load GRAF512 block 2210 LET m=Mreset+32 2220 READ n 2230 IF n=255 THEN RETURN 2240 POKE m,n: LET m=m+1 2250 GO TO 2220 2400 REM Save Error 2410 ON ERR RESET 2420 INK 0: GO SUB 60 2430 PRINT AT 10,0;" SAVE was Bad!",,," Press ENTER to try again" 2440 PAUSE 4e4: GO TO 460 2600 REM Copyrigt message 2610 BORDER 2: PAPER 2: INK 7: CLS 2620 POKE 23728,3: POKE 23729,2: POKE 23723,3 2630 RANDOMIZE USR FN a() 2640 REM "** Zprint80 **" 2641 PLOT 10,125: DRAW 235,0: PLOT 10,162: DRAW 235,0 2642 POKE 23728,8: POKE 23729,0: POKE 23723,2 2644 RANDOMIZE USR FN a() 2646 REM " Centronics Printer Support" 2650 PRINT AT 13,8;"Copyright * 1985" 2660 PRINT ,," ZEBRA SYSTEMS, INC." 2670 RETURN 9900 REM Save to Tape 9910 SAVE "customize" LINE 100 9920 SAVE "chars"CODE 51200,2000 1 REM !VAL \ FREE !CODE \ RETURN ( RETURN ( THEN '. THEN AND *U\>"PEEK #( IF RESTORE !LEN \N!@ RESTORE !VAL \ FREE NEW o>& THEN % THEN gSTR$ RESTORE !VAL \ FREE LLIST RETURN 8 RETURN "TAB \ LLIST RESTORE FREE = OR RETURN a8paSTR$ X COPY OR ao> THEN % THEN gSTR$ RESTORE !ATTR \ FREE LLIST RETURN (j CAT OR RESTORE FREE W!ATTR \ FREE RETURN z(u*TAB \r#s+ OR STR$ "TAB \ LLIST #STR$ OR RESTORE x RETURN !!CODE \ THEN F PI GO SUB B"TAB \*TAB \ LPRINT PI GO SUB B"TAB \ LLIST STR$ !CODE \ THEN F*TAB \(PI GO SUB BAePI GO SUB B\ RETURN #"TAB \ LLIST #>"PEEK >= DATA :'! THEN ? THEN THEN - THEN ? THEN THEN ,T]!ATTR \ FREE RETURN ( FLASH OR RESTORE FREE VERIFY *TAB \r#s+"TAB \ LLIST #STR$ *TAB \ RETURN PI GO SUB B"TAB \ LLIST #>"PEEK >=b LLIST #>"PEEK >=bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2 DEF FN a()=PEEK 23635+256*PEEK 23636+5 10 BORDER 6: PAPER 6: CLS 12 LET x=4 18 PRINT AT 0,0; PAPER x;" " 20 PRINT AT 1,0; PAPER x;" " 22 PRINT AT 2,0; PAPER x;" " 23 PRINT AT 3,0; PAPER x;" " 24 POKE 23728,1: POKE 23729,1: POKE 23723,2 26 RANDOMIZE USR FN a() 28 REM "Zprint80 Customization Program" 30 PLOT 0,175: DRAW 255,0 40 PLOT 0,144: DRAW 255,0 42 LET f=1: GO SUB 60 44 POKE 23728,11: POKE 23729,3: POKE 23723,3 45 RANDOMIZE USR FN a() 46 REM "STOP THE TAPE" 47 FOR n=1 TO 6: BEEP .1,-30: PAUSE 5: NEXT n 48 PRINT AT 14,0; FLASH f;" Press ENTER to proceed" 49 PAUSE 4e4: LET f=0 50 RETURN 60 DIM a$(544+32) 70 PRINT AT 4,0; FLASH f;a$ 80 PRINT AT 5,0; 90 RETURN 100 REM main start 101 GO SUB 2600: INK 2: LOAD "chars"CODE 51200: POKE 23607,199: INK 0 110 GO SUB 10 115 IF INKEY$>"" THEN GO TO 115 120 GO SUB 60 130 PRINT " The purpose of this program is to allow you to configure the 'Zprnt80' machine code to work with your particular printer and printer interface, and set LPRINT/LLIST output width appropriately for your desired application." 140 PRINT ,," 'Zprnt80' comes in two versions; one resides in low memory at address 27000, the other in high memory at address 64000. Both versions are 1300 bytes long." 150 GO SUB 900 160 PRINT ,,,,,," So which version do you want to LOAD from Tape and configure?",,,,,," 1 = ""Zprnt-lo"" (base=27000)",,," 2 = ""Zprnt-hi"" (base=64000)" 170 PRINT AT 21,0; INVERSE 1;" press no# to select " 180 LET k$=INKEY$: IF k$="" THEN GO TO 180 181 IF k$<>"1" AND k$<>"2" THEN GO TO 180 182 GO SUB 60 184 PRINT AT 10,0;" Start the tape so your"," selected 'Zprnt' machine"," code module can load" 190 IF k$="1" THEN LOAD "Zprnt-lo"CODE 64000 200 IF k$="2" THEN LOAD "Zprnt-hi"CODE 64000 210 LET v$=k$ 220 GO SUB 60 230 PRINT AT 7,0;" Which printer do you use?" 240 PRINT ,,,," 1 = Gemini 10X"," 2 = Gemini SG10"," 3 = Memotech"," 4 = Panasonic"," 5 = Epson RX/FX"," 6 = Spirit-80"," 7 = Prowriter 8510" 250 PRINT AT 21,0; INVERSE 1;" press no# to select " 260 LET k$=INKEY$: IF CODE k$<49 OR CODE k$>55 THEN GO TO 260 270 LET prntr=CODE k$-48 300 GO SUB 60 305 IF INKEY$>"" THEN GO TO 305 310 PRINT AT 8,0;" Which printer interface"," do you use?" 315 PRINT AT 12,0;" 1 = Aerco"," 2 = Tasman-b"," 3 = Tasman-c"," 4 = A & J" 320 PRINT AT 21,0; INVERSE 1;" press no# to select " 330 LET k$=INKEY$: IF k$="" THEN GO TO 330 335 IF k$<>"1" AND k$<>"2" AND k$<>"3" AND k$<>"4" THEN GO TO 330 340 LET If=CODE k$-48 350 GO SUB 60 360 PRINT AT 11,0;" What printing width would you"," like for LPRINT/LLIST output?" 370 INPUT "Width?";k 380 LET wdth=k 390 IF wdth<1 OR wdth>80 THEN GO TO 370 410 GO SUB 60 420 PRINT AT 6,0;" Many printers come from the factory setup to provide an automatic linefeed after each carriage return. Usually you can enable/disable this auto linefeed feature via a DIP switch. If auto-linefeed is enabled on your printer you will not want the 'Zprnt' software to provide a linefeed code." 430 INPUT "Should 'Zprint80' provide a linefeed?(y or n)";k$ 435 IF CODE k$>97 THEN LET k$=CHR$ (CODE k$-32) 440 IF k$<>"Y" AND k$<>"N" THEN GO TO 430 450 IF k$="Y" THEN LET lnfd=10 452 IF k$="N" THEN LET lnfd=0 455 GO SUB 60 456 PRINT AT 21,0; FLASH 1;"Please Wait, making mods to code" 457 GO SUB 1500 460 GO SUB 60 470 PRINT AT 8,0;" You have finished the configuration process, so put a blank tape in your recorder, start recording and press any key to SAVE your custom version of the 'Zprnt' code." 480 IF v$="1" THEN POKE 64169,134: POKE 64170,105: SAVE "zprnt-lo"CODE 64000,1300 490 IF v$="2" THEN POKE 64169,14: POKE 64170,250: SAVE "zprnt-hi"CODE 64000,1300 495 GO SUB 60 500 PRINT AT 21,0; FLASH 1;"Rewind Tape and Play for VERIFY " 501 ON ERR GO TO 2400 502 PRINT AT 5,0;: INK 6: VERIFY ""CODE : INK 0 503 ON ERR RESET 510 GO SUB 60 520 PRINT AT 7,0;" The Tape save was good. You now have a custom configured version of the 'Zprnt' code on Tape. In the future use the following command to LOAD it ..." 530 IF v$="1" THEN PRINT ,,,," < LOAD ""zprnt-lo"" CODE 27000 >" 540 IF v$="2" THEN PRINT ,,,," < LOAD ""zprnt-hi"" CODE 64000 >" 550 PRINT AT 21,0; INVERSE 1;" Customization is now Complete " 555 GO TO 555 799 STOP 800 REM Aerco 802 POKE jmplo,aercolo 804 POKE jmphi,aercohi 806 RETURN 810 REM Tasman 812 POKE jmplo,taslo 813 POKE jmphi,tashi 814 IF k$="3" THEN POKE port,251 817 RETURN 820 GO TO 810 830 REM A & J 832 POKE jmplo,ajlo 834 POKE jmphi,ajhi 836 RETURN 900 REM page flip 910 PRINT AT 21,0; INVERSE 1;" press any key to continue " 920 IF INKEY$="" THEN GO TO 920 930 GO SUB 60 940 RETURN 1000 REM Declarations 1005 LET Mreset=64599 1010 LET lNFDaddr=64647 1020 LET WDTHaddr=64012 1030 LET jmplo=65128 1040 LET jmphi=65129 1050 LET port=65136 1060 IF v$="1" THEN LET taslo=226 1061 IF v$="1" THEN LET tashi=109 1062 IF v$="2" THEN LET taslo=106 1063 IF v$="2" THEN LET tashi=254 1070 IF v$="1" THEN LET aercolo=2 1071 IF v$="1" THEN LET aercohi=110 1072 IF v$="2" THEN LET aercolo=138 1073 IF v$="2" THEN LET aercohi=254 1080 IF v$="1" THEN LET ajlo=20 1082 IF v$="1" THEN LET ajhi=110 1084 IF v$="2" THEN LET ajlo=156 1086 IF v$="2" THEN LET ajhi=254 1200 RETURN 1300 REM Pcontrl Blocks 1310 DATA 2,27,64,254,4,27,76,192,3,254,3,27,65,6,254,3,27,65,8,255: REM common Main block 1320 DATA 11,27,68,21,0,9,0,0,27,76,0,2,255: REM GRAF512 for Mem/Pan/Spir80 1330 DATA 11,27,77,21,0,0,0,0,27,76,0,2,255: REM GRAF512 for Gem 10X/SG10 1340 DATA 11,27,108,21,0,0,0,0,27,76,0,2,255: REM GRAF512 for Epson RX/FX 1350 DATA 13,27,40,48,50,49,46,9,27,83,48,53,49,50,255: REM GRAF512 for Prowr 8510 1360 DATA 2,27,62,254,6,27,83,48,57,54,48,254,4,27,84,49,50,254,4,27,84,49,54,255: REM Prowr Main block 1500 REM Cofiguration Mods 1502 GO SUB 1000 1510 POKE LNFDaddr,lnfd 1520 POKE WDTHaddr,wdth 1530 IF IF=1 THEN POKE jmplo,aercolo: POKE jmphi,aercohi 1540 IF IF=2 OR IF=3 THEN POKE jmplo,taslo: POKE jmphi,tashi 1550 IF IF=3 THEN POKE port,251 1560 IF IF=4 THEN POKE jmplo,ajlo: POKE jmphi,ajhi 1570 IF prntr<=6 THEN RESTORE 1310 1580 IF prntr=7 THEN RESTORE 1360 1590 GO SUB 2000 1600 IF prntr=3 OR prntr=4 OR prntr=6 THEN RESTORE 1320 1610 IF prntr=1 OR prntr=2 THEN RESTORE 1330 1620 IF prntr=7 THEN RESTORE 1350 1630 IF prntr=5 THEN RESTORE 1340 1640 GO SUB 2200 1650 RETURN 2000 REM Load Main Pcntrl Blck 2010 FOR m=Mreset TO Mreset+31 STEP 8 2020 LET Daddr=m 2030 READ n: IF n=254 THEN GO TO 2060 2040 IF n=255 THEN RETURN 2050 POKE Daddr,n: LET Daddr=Daddr+1: GO TO 2030 2060 NEXT m 2070 RETURN 2200 REM Load GRAF512 block 2210 LET m=Mreset+32 2220 READ n 2230 IF n=255 THEN RETURN 2240 POKE m,n: LET m=m+1 2250 GO TO 2220 2400 REM Save Error 2410 ON ERR RESET 2420 INK 0: GO SUB 60 2430 PRINT AT 10,0;" SAVE was Bad!",,," Press ENTER to try again" 2440 PAUSE 4e4: GO TO 460 2600 REM Copyrigt message 2610 BORDER 2: PAPER 2: INK 7: CLS 2620 POKE 23728,3: POKE 23729,2: POKE 23723,3 2630 RANDOMIZE USR FN a() 2640 REM "** Zprint80 **" 2641 PLOT 10,125: DRAW 235,0: PLOT 10,162: DRAW 235,0 2642 POKE 23728,8: POKE 23729,0: POKE 23723,2 2644 RANDOMIZE USR FN a() 2646 REM " Centronics Printer Support" 2650 PRINT AT 13,8;"Copyright * 1985" 2660 PRINT ,," ZEBRA SYSTEMS, INC." 2670 RETURN 9900 REM Save to Tape 9910 SAVE "customize" LINE 100 9920 SAVE "chars"CODE 51200,2000 ```