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 keywordIFin appearance but is valid as a numeric variable since BASIC variable names are case-sensitive in this implementation. Lines 1530–1560 reference it asIFin conditions, creating visually confusing constructs likeIF 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$>55correctly 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.
Content
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
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

