The Print Factory

Products: Print Factory
Date: 1989
Type: Program
Platform(s): TS 2068

A desktop publishing suite of eleven programs that share one pointer-and-icon interface. FIRST EDITION lays out pages of text, headline lettering and clip art; THE PRESS lays out a scrolling page that can take in whole screens and pictures; LETTER-PERFECT writes letters; THE LABELER designs labels; CARD MAKER builds four-panel greeting cards; QUICK SCREEN composes a single screen; and THE BANNER PRINTER prints long banners of text and large graphic designs. THE CREATOR draws and edits the graphic libraries the other programs use, THE FILE KEEPER sorts graphics between libraries, and THE TRANSLATOR loads icon files and turns them into graphic designs. The arrow is moved with Q, A, O and P and SPACE selects; every program has a FILE menu for loading and saving its work, and the layout programs have a PRINT menu.

The REM lines credit FIRST EDITION (versions 1.0 and 1.1), CARD MAKER, QUICK SCREEN and THE CREATOR to Eric Boisvert, and THE PRESS, LETTER-PERFECT, THE LABELER, THE FILE KEEPER and THE TRANSLATOR to Kristian Boisvert, all “Copyright 1989 BYTE POWER”. THE BANNER PRINTER v2.0 is also by Eric Boisvert. On the Oliger disks it survives only as a JLO state save, but a Larken disk of The Print Factory has its program files, and it is now on the program tape.

The download holds six tapes. The program tape starts with a menu (keys A to L) that loads any of the programs, plus the 320-byte ZX DRIVER, a relocatable LPRINT driver that loads at 64000. DEMO PAGE (for FIRST EDITION), PRESSDEMO, a dithered photograph for THE PRESS, and EXAMPL.CC, a sample card for CARD MAKER, follow their programs. The second tape holds the graphics disk that came with the package: the clip-art libraries ANIMALS, OFFICE, TRANSPORT, ARTS, MISC., COMICS and DIGITIZED, three frames, and FONT 1 to FONT 13, saved in the same graphic-library format as the clip art. The third tape adds 48 more libraries from two further graphics disks, whose artists are not named, along with UPDATE magazine logo files, three of them QUICK SCREEN screens.

Program Analysis

Structure

Each program is a short BASIC shell around a large machine-code block loaded at 28000 or above. The machine code runs the whole screen interface and drops back into BASIC only for file work. It jumps to fixed line numbers: 1000 to save, 1500 or 2000 to load a page, 2500 to load graphics and 3000 to load fonts. Each of these routines asks for a file name with INPUT "FILE NAME:"; LINE N$, does one LOAD or SAVE with a fixed address and length, and re-enters the machine code with LET l=USR .... When the machine code needs to tell BASIC where to load, it puts the address in the SEED system variable, which BASIC reads back with PEEK 23670+256*PEEK 23671.

Loaders

The auto-run lines (8000, 8010, 9995 or 9998) set white paper, CLEAR 27999 (or higher), print “STILL LOADING…” and then switch to INK 7, so the tape headers that follow are printed white on white and stay hidden. Line 9999 in each program is the publisher’s mastering line that saved the BASIC and its code blocks.

Data formats

Graphic libraries are saved from 28000 by THE CREATOR, with the length worked out from a pointer in the machine code. The other programs load them at their own working addresses: 43404 for FIRST EDITION, 44800 for CARD MAKER, 40288 for QUICK SCREEN and 39592 for THE FILE KEEPER. QUICK SCREEN saves 6144-byte bitmaps and can load an ordinary SCREEN$. THE BANNER PRINTER saves a banner as 24475 bytes from 39525 and loads graphics at 41829. THE TRANSLATOR saves its output in two parts when it is longer than 12204 bytes.

Notable Techniques

  • Almost every number in the BASIC is written as VAL "n", and zero as NOT PI, to save memory.
  • Loader messages are hidden by switching to INK 7 on white paper before LOAD.
  • LETTER-PERFECT works out its save length with VAL "USR 62141-27999", which calls the machine code to find the end of the text.
  • The ZX DRIVER finds its own address (by calling a RET in ROM and reading the stack) and patches the printer channel so LPRINT output goes through its routine.

Potential Issues

  • The CARD MAKER code file “C” is damaged on both Oliger Print Factory disks: it holds disk directory sectors and zeros instead of program code. The first edition of this archive used code recovered from a JLO state save of CARD MAKER; the tape now uses the intact copy from the Larken disk.
  • CARD MAKER’s auto-run line 9995 loaded the next code block (GRAFIX4) at 42496, which is the card area, so the sample graphics appeared as noise on the card. The state save shows GRAFIX4 belongs at 44800, so line 9995 now loads it there through the graphics loader at line 2515.
  • THE PRESS line 2090 had a Larken RANDOMIZE USR 100 in front of the font LOAD, a leftover that would crash without a Larken interface. It was removed.
  • FIRST EDITION 1.0 and 1.1 load pages with different lengths (22900 and 24436 bytes), so a page saved from 1.1 may be too long to load into 1.0.

These programs come from the Oliger (JLO SAFE) disk edition of The Print Factory, except THE BANNER PRINTER, the CARD MAKER code and the sample card, which come from the Larken disk edition. They were converted to run from tape: the “/” and Larken disk syntax was removed from every LOAD and SAVE, CARD MAKER’s loader was repaired, and a menu was added. The machine code makes no disk calls; all file work goes through BASIC. Every program was tested in ZEsarUX on a TS2068, loading and saving pages, graphics and screens from tape.

The download also holds three more clip-art tapes, taken from Larken disks labelled Print Factory Collection 4, 5 and 6. Collection 4 has the miscellaneous libraries mis17+ to mis33+ (17 libraries, 184 graphics); Collection 5 has more people, faces, sports and holiday art (men4+ to men7d, wmen3+, face5+ to fac10+, sprt3+ to sprt5-, hday4+ and hday5-; 16 libraries, 176 graphics); and Collection 6 has cartoons, animals, Christmas art, transport and computers (funy5+ to funy7d, anim8+ to ani13+, xmas3+ to xmas5-, tran3+ to tran5- and comp2+; 16 libraries, 168 graphics). They are in the same graphic-library format as the rest of the clip art: each library is a series of pictures, each stored as its height and width in character cells followed by eight bytes per cell. The ending of a library’s name gives its size: “+” libraries hold 8 pictures, “–” libraries 16, and “d” libraries 6 to 16. Each file keeps its disk name without the .C1 ending, so it loads by that name through each program’s graphics loading option; the names are in lower case, so CAPS LOCK has to be switched off before typing one. Who drew these libraries is not recorded. The Sinclair Desktop Publishing Journal reported on extra Print Factory graphics in New Print Factory Graphics Now Available and reviewed John McMichael’s graphics disks in Graphic Design Files for The Print Factory family of programs.

A fourth Larken disk, Print Factory Collection 1, holds the GRAPHICS 1 libraries (misc1+ to mis11+, men1+ to men3d, wmen1+ and wmen2+). Compared with it, ten of the libraries first taken from the Oliger GRAPHICS 1+2 disk held the wrong data: each one contained the graphics of the library that follows it on the disk (the file named men1+ held men2+, men2+ held men3d, and so on), and the blank sectors in the old men3d and misc8+ files belonged to those misplaced copies, not to the libraries themselves. The Larken copies are complete, so all sixteen GRAPHICS 1 libraries on the GR1-GR3 tape now come from that disk, including misc1+, misc7- and wmen1+, which were missing before. Collections 2 and 3 on the Larken disks are identical to the GRAPHICS 2 and GRAPHICS 3 libraries already on that tape. The new libraries were checked by loading one into THE CREATOR in ZEsarUX.

The Banner Printer

THE BANNER PRINTER v2.0 by Eric Boisvert (menu key F) composes a banner from lines of text and large graphic designs and prints it sideways on a continuous strip of paper. Its icon bar has HOME, FILE, TEXT, PRINT, END, LEFT, GRAPHIC DESIGNS and RIGHT. TEXT types lines in Font I, II or III, at normal or double size, or with the Super Set, and EDIT (CAPS SHIFT and 1) ends the typing. GRAPHIC DESIGNS steps through the designs with Next and Previous, and Select picks one up so the arrow can place it. The designs loaded with the program are large headline letters followed by further designs. PRINT prints the banner on a large printer or the T/S 2040, with Aerco, Tasman B or other interface drivers and a Customize option. FILE saves, loads and clears banners, loads graphics and fonts, and sets the banner size and arrow speed.

The program follows the same plan as the other modules. Line 1010 saves a banner as 24475 bytes from 39525, line 2010 loads one, line 2510 loads graphics at 41829 (up to 21100 bytes), and line 3010 loads a 768-byte font at the address the machine code leaves in SEED. Its design file, GRAFX2.CG (10134 bytes), starts with the same headline letters as FONT 1 on the graphics tape. On the Oliger disks THE BANNER PRINTER survives only as a JLO state save. The tape version comes from a Larken (LKDOS) disk of The Print Factory, which has the program files BANNER.B1, BANNER.C1 and GRAFX2.CG. For tape, the Larken LET L=USR 100: and RANDOMIZE USR 100 prefixes were removed from the LOAD and SAVE lines, the CAT before the file-name prompt was dropped, the loader line 9998 now hides the tape headers like the other loaders, and Quit Program ends with NEW instead of reloading the Larken menu. In ZEsarUX it loaded from the tape menu, took text and a design, saved a banner to tape and loaded it back, and ran its print routine with the T/S 2040 driver.

The Larken disk edition

The same Larken disk holds the other ten programs at the same version numbers as the Oliger disks. Their code files are identical, or differ only in a few dozen bytes of work space and settings that the programs keep in memory; the graphic libraries, DEMO PAGE and PRESSDEMO are identical. The BASIC differs only in the disk syntax and in Quit, which loads the disk’s own two-page menu (MENU.B1) instead of using NEW. The Larken disk has no copy of the 4856-byte GRAFIX library that FIRST EDITION 1.0 and THE LABELER load on the Oliger disks; there THE LABELER loads the 8268-byte library instead. A second Larken disk, a 720K copy, holds the same files.

The Oliger copy of the CARD MAKER code was damaged, and the first edition of this tape used code recovered from a JLO state save. The Larken disk has the intact file, CARD.C1, and the tape now uses it as C. It matches the recovered code except in its work areas. The Larken disk also has a sample card, EXAMPL.CC (“For Someone Special”), which now follows CARD MAKER on the tape and loads with Load Card.

Related Products

Print any type of document (poster, etc).

Related Content

Image Gallery

Source Code

REM ===== PFACTORY =====
   10 BORDER 7: PAPER 7: INK 0: CLS 
   20 PRINT AT 0,7;"THE PRINT FACTORY";AT 1,5;"* 1989 BYTE POWER (tape)"
   30 PRINT AT 3,1;"A  FIRST EDITION 1.1  (layout)";AT 4,1;"B  FIRST EDITION 1.0 + demo";AT 5,1;"C  THE PRESS 2.0 + demo";AT 6,1;"D  LETTER-PERFECT 2.0";AT 7,1;"E  THE LABELER 2.0";AT 8,1;"F  CARD MAKER 1.0";AT 9,1;"G  QUICK SCREEN 1.0";AT 10,1;"H  THE CREATOR 2.0 (graphics)";AT 11,1;"I  THE FILE KEEPER 1.0";AT 12,1;"J  THE TRANSLATOR 1.0";AT 13,1;"K  ZX DRIVER (2040 LPRINT)"
   40 PRINT AT 15,1;"Programs by Eric and Kristian";AT 16,1;"Boisvert. Graphics and fonts";AT 17,1;"are on the second tape file.";AT 19,1;"Press A-K, then PLAY the tape"
   50 LET k$=INKEY$: IF k$>="a" AND k$<="k" THEN LET k$=CHR$ (CODE k$-32)
   60 IF k$<"A" OR k$>"K" THEN GO TO 50
   70 CLS : PRINT AT 10,4;"Searching the tape..."
   80 IF k$="A" THEN LOAD "FIRST 1.1"
   81 IF k$="B" THEN LOAD "FIRST 1.0"
   82 IF k$="C" THEN LOAD "PRESS"
   83 IF k$="D" THEN LOAD "LETTER"
   84 IF k$="E" THEN LOAD "LABELER"
   85 IF k$="F" THEN LOAD "CARD MAKER"
   86 IF k$="G" THEN LOAD "QUICK SCRN"
   87 IF k$="H" THEN LOAD "CREATOR"
   88 IF k$="I" THEN LOAD "FILEKEEPER"
   89 IF k$="J" THEN LOAD "TRANSLATOR"
   90 IF k$="K" THEN CLEAR 63999: LOAD "ZX DRIVER"CODE 64000: RANDOMIZE USR 64000: CLS : PRINT AT 10,1;"ZX DRIVER loaded at 64000 and";AT 11,1;"started (RANDOMIZE USR 64000).": STOP 

REM ===== FIRST 1.1 =====
    0 REM FIRST EDITION  Version 1.1Written by Eric Boisvert   Copyright *1989 BYTE POWER
    1 GO TO VAL "1030"
 1000 REM  SAVE PAGE 
 1010 GO SUB VAL "4e3": SAVE n$CODE VAL "41100",a
 1030 PRINT ;: LET l=USR VAL "31609"
 2000 REM  LOAD PAGE 
 2005 GO SUB VAL "4e3"
 2010 LET a=USR VAL "28577": LOAD n$CODE VAL "41100",VAL "24436": GO TO VAL "2530"
 2500 REM  LOAD GRAPHICS 
 2510 GO SUB VAL "4e3"
 2520 LET a=USR VAL "28577": LOAD N$CODE VAL "43404",VAL "13968"
 2530 PRINT ;: INK NOT PI: LET l=USR VAL "31303"
 3000 REM  LOAD FONTS 
 3010 GO SUB VAL "4E3": LOAD N$CODE A,VAL "768": GO TO VAL "1030"
 4000 REM  INPUT FILE NAME 
 4010 INPUT "FILE NAME:"; LINE N$: IF LEN N$>VAL "10" THEN GO TO VAL "4e3"
 4020 LET A=VAL "PEEK 23670+256*PEEK 23671": RETURN 
 9000 REM  QUIT 
 9010 PAUSE VAL "60": CLEAR VAL "65535": NEW 
 9998 INK NOT PI: PAPER VAL "7": BORDER VAL "7": CLEAR VAL "27999": PRINT AT VAL "10",VAL "8";"STILL LOADING...": INK VAL "7": LOAD "F1"CODE : LET N$="GRAFIX1": GO TO VAL "2520"
 9999 SAVE "FIRST 1.1" LINE VAL "9998": SAVE "F1"CODE VAL "28E3",VAL "15404": SAVE "GRAFIX1"CODE VAL "43404",VAL "8268": RUN 

REM ===== FIRST 1.0 =====
    0 REM FIRST EDITION  Version 1.0Written by Eric Boisvert   Copyright *1989 BYTE POWER
    1 GO TO VAL "1030"
 1000 REM  SAVE PAGE 
 1010 GO SUB VAL "4e3": SAVE n$CODE VAL "41100",a
 1030 PRINT ;: LET l=USR VAL "31609"
 2000 REM  LOAD PAGE 
 2005 GO SUB VAL "4e3"
 2010 LET a=USR VAL "28577": LOAD n$CODE VAL "41100",VAL "22900": GO TO VAL "2530"
 2500 REM  LOAD GRAPHICS 
 2510 GO SUB VAL "4e3"
 2520 LET a=USR VAL "28577": LOAD N$CODE VAL "43404",VAL "12432"
 2530 PRINT ;: INK NOT PI: LET l=USR VAL "31303"
 3000 REM  LOAD FONTS 
 3010 GO SUB VAL "4E3": LOAD N$CODE A,VAL "768": GO TO VAL "1030"
 4000 REM  INPUT FILE NAME 
 4010 INPUT "FILE NAME:"; LINE N$: IF LEN N$>VAL "10" THEN GO TO VAL "4e3"
 4020 LET A=VAL "PEEK 23670+256*PEEK 23671": RETURN 
 9000 REM  QUIT 
 9010 PAUSE VAL "60": CLEAR VAL "65535": NEW 
 9900 INK NOT PI: PAPER VAL "7": BORDER VAL "7": CLEAR VAL "27999": PRINT AT VAL "10",VAL "8";"STILL LOADING...": INK VAL "7": LOAD ""CODE : LET N$="DEMO PAGE": GO TO VAL "2010"
 9998 INK NOT PI: PAPER VAL "7": BORDER VAL "7": CLEAR VAL "27999": PRINT AT VAL "10",VAL "8";"STILL LOADING...": INK VAL "7": LOAD "F"CODE : LET N$="GRAFIX": GO TO VAL "2520"
 9999 SAVE "FIRST 1.0" LINE VAL "9998": SAVE "F"CODE VAL "28E3",VAL "15404": SAVE "GRAFIX"CODE VAL "43404",VAL "8268": RUN 

REM ===== PRESS =====
    0 REM THE PRESS Version 2.0  Program by Kristian Boisvert   Copyright *1989 BYTE POWER
  100 PRINT ;: LET L=USR VAL "51075"
 1000 REM  SAVE FILE 
 1010 GO SUB VAL "5E3": IF a$="" THEN GO TO VAL "1010"
 1020 SAVE A$CODE VAL "28000",VAL "PEEK 28000*PEEK 28001*8+2"
 1030 PRINT ;: LET L=USR VAL "51109"
 1500 REM  LOAD FILE 
 1510 GO SUB VAL "5e3"
 1520 LOAD A$CODE VAL "28000",VAL "23042"
 1530 PRINT ;: INK NOT PI: LET L=USR VAL "54484"
 2000 REM  FONTS 
 2005 PRINT AT 8,1;"STANDARD OR DOUBLE HEIGHT SET?"
 2010 PAUSE NOT PI: LET a=VAL "PEEK 23556"
 2020 LET ad=VAL "PEEK 23670+256*PEEK 23671": LET l=VAL "768": IF a=CODE "D" THEN LET ad=VAL "59471": LET l=VAL "1536"
 2080 PRINT AT VAL "8",NOT PI,,: GO SUB VAL "5e3"
 2090 LOAD A$CODE ad,l
 2100 GO TO VAL "1030"
 2250 REM  SCREEN$ 
 2510 GO SUB VAL "5e3"
 2520 LOAD A$SCREEN$ 
 2530 PRINT ;: LET L=USR VAL "55299"
 3500 REM  NEW 
 3510 PAUSE VAL "120": CLEAR VAL "65535": NEW 
 5000 REM GET NAME
 5010 INPUT "ENTER FILENAME: "; LINE A$: IF LEN A$>VAL "10" THEN GO TO VAL "5010"
 5020 RETURN 
 8500 INK NOT PI: PAPER VAL "7": BORDER VAL "7": CLEAR VAL "27999": PRINT AT VAL "10",VAL "8";"STILL LOADING...": INK VAL "7": LOAD ""CODE : LET L=USR VAL "63274": LET A$="": GO TO VAL "1520"
 9998 INK NOT PI: PAPER VAL "7": BORDER VAL "7": CLEAR VAL "27999": PRINT AT VAL "10",VAL "8";"STILL LOADING...": INK 0: LOAD "P"CODE : LET L=USR VAL "63274": RUN 
 9999 SAVE "PRESS" LINE VAL "9998": SAVE "P"CODE VAL "51054",VAL "12946": RUN 

REM ===== LETTER =====
    0 REM LETTER-PERFECT Version 2.0  Program by Kristian Boisvert     Copyright *1989 BYTE POWER
  100 POKE VAL "27999",NOT PI: PRINT ;: LET L=USR VAL "43554"
 1000 REM  SAVE FILE 
 1010 GO SUB VAL "5e3": IF a$="" THEN GO TO VAL "1010"
 1020 SAVE A$CODE VAL "28000",VAL "USR 62141-27999"
 1030 PRINT ;: LET L=USR VAL "43582"
 1500 REM  LOAD FILE 
 1510 GO SUB VAL "5e3"
 1520 LOAD A$CODE VAL "28000",VAL "15360"
 1530 GO TO VAL "100"
 2000 REM  FONTS 
 2010 GO SUB VAL "5e3"
 2090 LOAD A$CODE VAL "58274",VAL "3600"
 2100 GO TO VAL "1030"
 3000 REM  STOP 
 3010 STOP 
 3500 REM  NEW 
 3510 PAUSE VAL "120": CLEAR VAL "65535": NEW 
 5000 REM GET NAME
 5010 INPUT "ENTER FILENAME: "; LINE A$: IF LEN A$>VAL "10" THEN GO TO VAL "5010"
 5020 RETURN 
 8000 REM  LOAD 
 8010 INK NOT PI: PAPER VAL "7": BORDER VAL "7": CLEAR VAL "27998": PRINT AT VAL "10",VAL "8";"STILL LOADING...": INK VAL "7": LOAD "L"CODE : INK NOT PI: POKE VAL "27999",NOT PI: LET L=USR VAL "62154": RUN 
 9998 REM  SAVE 
 9999 SAVE "LETTER" LINE VAL "8E3": SAVE "L"CODE VAL "43500",VAL "20500": RUN 

REM ===== LABELER =====
    0 REM THE LABELER Version 2.0  Program by Kristian Boisvert   Copyright *1989 BYTE POWER
  100 PRINT ;: LET L=USR VAL "51412"
 1000 REM  SAVE LABEL 
 1010 GO SUB VAL "5e3": IF a$="" THEN GO TO VAL "1010"
 1020 SAVE A$CODE VAL "47203",VAL "4097"
 1030 GO TO VAL "100"
 1500 REM  LOAD LABEL 
 1510 GO SUB VAL "5e3"
 1520 LOAD A$CODE VAL "47203",VAL "4097"
 1530 PRINT ;: LET L=USR VAL "54526"
 2000 REM  LOAD FONTS 
 2010 GO SUB VAL "5e3"
 2015 LET set=PEEK VAL "58246": IF set=NOT PI THEN POKE VAL "58246",SGN PI: LET set=SGN PI
 2020 LET set=VAL "set*768+58102"
 2025 LOAD A$CODE set,VAL "768"
 2030 GO TO VAL "100"
 2500 REM  LOAD GRAPHIC DESIGNS 
 2510 GO SUB VAL "5e3"
 2520 LOAD "GRAFIX2"CODE VAL "28000",VAL "19200"
 2530 PRINT ;: INK NOT PI: LET L=USR VAL "54625"
 3000 REM  BREAK TO BASIC 
 3010 STOP 
 3500 REM  QUIT PROGRAM 
 3510 PAUSE VAL "120": CLEAR VAL "65535": NEW 
 5000 REM  INPUT STRING 
 5010 INPUT "ENTER FILENAME: "; LINE A$: IF LEN A$>VAL "10" THEN GO TO VAL "5010"
 5020 RETURN 
 8000 REM  LOAD CUSTOMIZED 
 8010 INK NOT PI: PAPER VAL "7": BORDER VAL "7": CLEAR VAL "27999": PRINT AT VAL "10",VAL "8";"STILL LOADING...": INK VAL "7": LOAD "L2"CODE : LET L=VAL "USR 61373+USR 61718+USR 58448": LET A$="": GO TO VAL "2520"
 9998 REM  SAVE CUSTOMIZED 
 9999 SAVE "LABELER" LINE VAL "8e3": SAVE "L2"CODE VAL "51317",VAL "12683": SAVE "GRAFIX2"CODE VAL "28000",VAL "4856": RUN 

REM ===== CARD MAKER =====
    0 REM CARD MAKER   Version 1.0Written by Eric Boisvert   Copyright *1989 BYTE POWER
  100 PRINT ;: INK NOT PI: LET l=USR VAL "31505"
 1000 REM  SAVE 
 1010 GO SUB VAL "5e3"
 1020 SAVE A$CODE VAL "42496",A
 1030 RUN 
 2000 REM  LOAD 
 2010 GO SUB VAL "5e3"
 2020 LOAD A$CODE VAL "42496",VAL "19200"
 2030 RUN 
 2500 REM  LOAD GRAPHICS 
 2510 GO SUB VAL "5e3"
 2515 LET l=USR VAL "30958"
 2520 LOAD A$CODE VAL "44800",VAL "15300"
 2530 RUN 
 3000 REM  LOAD FONTS 
 3010 GO SUB VAL "5e3"
 3020 LOAD A$CODE A,VAL "768"
 3030 RUN 
 5000 REM  GET FILE NAME 
 5010 LET A=VAL "PEEK 23670+256*PEEK 23671"
 5020 INPUT "FILE NAME:"; LINE a$: IF LEN a$>VAL "10" THEN GO TO VAL "5020"
 5030 RETURN 
 9000 REM  QUIT PROGRAM 
 9010 PAUSE VAL "60": CLEAR VAL "65535": NEW 
 9995 BORDER VAL "7": INK NOT PI: PAPER VAL "7": CLEAR VAL "27999": PRINT AT VAL "10",VAL "8";"STILL LOADING...": INK VAL "7": LOAD "C"CODE : LET a$="": GO TO VAL "2515"
 9998 BORDER VAL "7": INK NOT PI: PAPER VAL "7": CLEAR VAL "27999": PRINT AT VAL "10",VAL "8";"STILL LOADING...": INK VAL "7": LOAD "GRAFIX4"CODE : LET a$="": GO TO VAL "2515"
 9999 SAVE "CARD MAKER" LINE VAL "9995": SAVE "C"CODE VAL "28E3",VAL "14436": SAVE "GRAFIX4"CODE VAL "44800",VAL "7492": RUN 

REM ===== QUICK SCRN =====
    0 REM QUICK SCREEN Version 1.0Written by Eric Boisvert   Copyright *1989 BYTE POWER
   10 GO TO 1030
  100 INK 0: PAPER 7: BORDER 7: CLEAR 27999: PRINT AT 10,8;"STILL LOADING...": INK 7: LOAD "QUICK SCRN"CODE : LOAD "GRAFIX5"CODE 
  110 PRINT ;: INK 0: LET l=USR 50303
 1000 REM  SAVE SCREEN 
 1010 GO SUB 4e3: SAVE n$CODE 34144,6144
 1030 PRINT ;: LET l=USR 50374
 2000 REM  LOAD SCREEN 
 2010 GO SUB 4E3: LOAD n$CODE 28000,6912: LET l=USR 61704+USR 61209: GO TO 1030
 2500 REM  LOAD GRAPHICS 
 2510 GO SUB 4e3
 2520 LET l=USR 61249: LOAD n$CODE 40288,9500: PRINT ;: LET l=USR 50350
 3000 REM  LOAD FONTS 
 3010 GO SUB 4E3: LOAD N$CODE A,768: GO TO 1030
 4000 REM  ENTER FILE NAME 
 4010 INPUT "FILE NAME:"; LINE N$: IF LEN N$>10 THEN GO TO 4010
 4020 LET A=PEEK 23670+256*PEEK 23671: RETURN 
 9000 REM  QUIT 
 9010 PAUSE 60: CLEAR 65535: NEW 
 9999 SAVE "QUICK SCRN" LINE 100: SAVE "QUICK SCRN"CODE 50240,13760: SAVE "GRAFIX5"CODE 40288,4126: RUN 

REM ===== CREATOR =====
    0 REM THE CREATOR  Version 2.0Program by Eric Boisvert   Copyright *1989 BYTE POWER
   10 GO TO VAL "2040"
 1000 REM  SAVE FILE 
 1010 GO SUB VAL "3E3": IF N$="" THEN GO TO VAL "1E3"
 1020 LET LEN=VAL "PEEK 23670+256*PEEK 23671"
 1030 PRINT ''"   SAVING ";N$;", LEN ";LEN
 1040 SAVE N$CODE VAL "28E3",LEN
 1050 PRINT ;: LET L=USR VAL "51461"
 2000 REM  LOAD FILE 
 2020 GO SUB VAL "3E3": LET L=USR VAL "59077"
 2030 LOAD N$CODE VAL "28E3",VAL "21690"
 2040 PRINT ;: LET L=USR VAL "51443"
 3000 REM  ENTER FILE NAME 
 3010 INPUT "ENTER FILENAME:"; LINE N$: IF LEN N$>VAL "10" THEN GO TO VAL "3E3"
 3020 RETURN 
 5000 REM  LOAD SCREEN 
 5020 GO SUB VAL "3E3"
 5030 LOAD N$SCREEN$ 
 5040 PRINT ;: LET L=USR VAL "53881"
 9000 REM  QUIT PROGRAM 
 9010 PAUSE VAL "60": CLEAR 65535: NEW 
 9998 INK NOT PI: PAPER VAL "7": BORDER VAL "7": CLEAR VAL "27999": PRINT AT VAL "10",VAL "8";"STILL LOADING...": POKE VAL "23658",VAL "8": INK VAL "7": LOAD "CREATOR"CODE : INK NOT PI: PRINT ;: LET L=VAL "USR 51353"
 9999 SAVE "CREATOR" LINE VAL "9998": SAVE "CREATOR"CODE VAL "51353",VAL "12647": RUN 

REM ===== FILEKEEPER =====
    0 REM THE FILE KEEPER  Version 1.0  Program by Kristian Boisvert   Copyright *1989 BYTE POWER
  100 POKE 23296,22: POKE 23297,6: PRINT ;: LET l=USR 32639
 1000 REM  SAVE 
 1010 GO SUB 5000: IF a$="" THEN GO TO 1010
 1015 LET a=PEEK 35535+256*PEEK 35536-51796
 1016 PRINT AT 8,0;"   SAVING ";A$;", LEN ";A
 1020 SAVE a$CODE 51796,a
 1030 GO TO 100
 1500 REM  LOAD 
 1510 GO SUB 5000
 1520 LOAD a$CODE 39592,12204
 1530 PRINT ;: LET l=USR 33726
 2000 REM  STOP 
 2010 STOP 
 2500 REM  NEW 
 2510 PAUSE 120: CLEAR 65535: NEW 
 5000 REM GET NAME
 5010 INPUT "ENTER FILENAME: "; LINE a$: IF LEN a$>10 THEN GO TO 5010
 5020 RETURN 
 8000 REM  LOAD 
 8010 INK 0: PAPER 7: BORDER 7: CLEAR 32599: PRINT AT 10,8;"STILL LOADING...": INK 7: LOAD "FILEKEEPER"CODE : INK 0: POKE 23296,22: POKE 23297,6: PRINT ;: LET l=USR 32600
 9998 REM  SAVE 
 9999 SAVE "FILEKEEPER" LINE 8000: SAVE "FILEKEEPER"CODE 32600,6992

REM ===== TRANSLATOR =====
    1 REM THE TRANSLATOR Version 1.0  Written by Kristian Boisvert   Copyright *1989 BYTE POWER
  100 POKE 23296,5: POKE 23297,6: PRINT ;: LET l=USR 29400
 1000 REM  SAVE 
 1005 LET a=PEEK 32852+256*PEEK 32853: IF a>12204 THEN GO TO 1100
 1010 GO SUB 5000: IF a$="" THEN GO TO 1010
 1020 PRINT AT 10,0;"   SAVING ";a$;",LEN ";a: SAVE a$CODE 35273,a
 1030 PRINT ;: LET l=USR 29440
 1100 PRINT AT 10,4;"SAVING IN 2 SECTIONS..."
 1105 INPUT "ENTER FILENAME #1: "; LINE b$: IF B$="" THEN GO TO 1105
 1106 INPUT "ENTER FILENAME #2: "; LINE a$: IF a$="" THEN GO TO 1106
 1110 LET B=226*INT (a/452): LET A=A-B: PRINT AT 13,0;"   SAVING ";B$;", LEN ";a: SAVE b$CODE 35273,A
 1120 PRINT AT 15,0;"   SAVING ";a$;", LEN ";b: SAVE a$CODE 35273+a,B
 1130 GO TO 1030
 1500 REM  LOAD 
 1510 GO SUB 5000
 1520 LOAD a$CODE 35272,28728
 1530 PRINT ;: LET l=USR 30185
 2000 REM  STOP 
 2010 STOP 
 2500 REM  NEW 
 2510 PAUSE 120: CLEAR 65535: NEW 
 5000 REM GET NAME
 5010 INPUT "ENTER FILENAME: "; LINE a$: IF LEN a$>10 THEN GO TO 5010
 5020 RETURN 
 8000 REM  LOAD 
 8010 INK 0: PAPER 7: BORDER 7: CLEAR 29399: PRINT AT 10,8;"STILL LOADING...": INK 7: LOAD "TRANSLATOR"CODE : INK 0: RUN 
 9998 REM  SAVE 
 9999 SAVE "TRANSLATOR" LINE 8000: SAVE "TRANSLATOR"CODE 29400,5872

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.