ZPrint-80 1.2

Products: ZPRINT-80
Date: 198x
Type: Program
Platform(s): TS 2068
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 RangePurpose
1–2REM containing embedded machine code / display driver data; DEF FN a()
10–90Screen setup and clear-screen subroutines
100–555Main program: intro, user prompts, configuration, save/verify
800–836Interface-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–1200Variable declarations: memory addresses for all patch targets
1300–1360DATA blocks: printer control escape sequences
1500–1650Configuration engine: applies all POKEs and loads DATA into machine code
2000–2070Subroutine: loads “Main Pcontrl Block” using sentinel-terminated READ loop
2200–2250Subroutine: loads “GRAF512 block” using sentinel-terminated READ loop
2400–2440Save-error handler (reached via ON ERR)
2600–2670Copyright/splash screen subroutine
9900–9920Tape-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):

VariableAddressPurpose
Mreset64599Start of printer control block in machine code
lNFDaddr64647Linefeed byte value (0 or 10)
WDTHaddr64012LPRINT/LLIST column width
jmplo / jmphi65128 / 65129Low/high bytes of interface jump address
port65136Port 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.

Content

Appears On

Related Products

Print grey-scale reproduction of color screen to an 80-column printer. Includes high and low memory TS 2068 and Spectrum versions....

Related Articles

Related Content

Image Gallery

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.

People

No people associated with this content.

Scroll to Top