Sign Designer is a multi-module banner and sign creation system that combines a BASIC front-end with a large machine code package loaded from tape.
The main program loads a 19,606-byte code block (“Scode”) at address 45928, then uses RANDOMIZE USR with a DEF FN to locate and call routines within it for tasks including border rendering, icon placement, text formatting, and printer control.
Sign data is serialized by POKEing a 13×19-character text array and a 36-byte icon layout map into a buffer at address 60000 before SAVEing as a 1,082-byte CODE block.
The printer configuration section supports at least five dot-matrix printers (Epson RX/FX, Gemini, Memotech/Panasonic/compatible, Seikosha GP250, and Prowriter 8510) across four parallel interface types, with initialization data stored in string variables and copied to fixed memory addresses via a block-transfer subroutine.
A companion Graphics Designer module (“Gdesign”) runs separately, providing a pixel-level editor that draws a 3-pixel-per-cell grid and calls machine code routines for plot, unplot, cursor inversion, and icon store/clear operations on 256-byte graphic tiles.
Program Analysis
Program Structure
The listing contains three distinct BASIC programs sharing the same file. The primary program (“Sdesign”) spans lines 1–9999 and handles the sign editing workflow. A small loader stub (lines 1–300 in the second block) sets colors, displays a splash screen, and chains to the main program. The third block is the Graphics Designer (“Gdesign”, lines 1–9999), a standalone pixel-level tile editor that can run independently or be launched from the sign system.
The main program’s flow is menu-driven, with a top-level menu at line 84 and a sub-menu for editing at line 200. All major functions are implemented as subroutines or branched-to sections, called via GO TO or GO SUB. Machine code does the heavy lifting for rendering, printing, and icon management.
Machine Code Integration
A 19,606-byte machine code block (“Scode”) is loaded at address 45928 (line 12). A companion graphics code block (“Gcode”) is loaded at 45128 in the Graphics Designer. All machine code entry points are called with RANDOMIZE USR at fixed absolute addresses:
| Address | Function label |
|---|---|
| 49535 | PRNTtop — print one copy of sign |
| 49444 | clrwnd — clear print window |
| 50156 | STRPRNT — string/text print |
| 50041 | ICONdep — deposit icon on sign image |
| 50000 | BORDER — render border |
| 48800 | icons2buf — copy icons to save buffer |
| 48812 | buf2icons — restore icons from buffer |
| 50453 | IFcntrl — interface control setup |
| 50595 | Idef2Scrn (Graphics Designer) |
| 50683 | Dplt — plot dot |
| 50631 | Dunplt — unplot dot |
| 50851 | CLRicon |
| 50862 | STRicon — store icon |
| 50900 | INVRTdot — invert cursor dot |
The function DEF FN a()=PEEK 23635+256*PEEK 23636+5 (line 2) computes the base address of the loaded code block from the system variable PROG (23635–23636), adding 5 to skip the BASIC header. This allows the machine code to be called even if the load address shifts slightly.
Data Representation
Sign text is stored in a two-dimensional string array t$(26,19). Each row represents one text line; columns 1–15 hold character data, column 17 encodes justification (0=L, 1=R, 2=C), column 18 encodes font style (0=standard, 1=outline), and column 19 encodes size/double-height flags (0=normal, 1=double-height top, 255=double-height bottom/hidden continuation row).
The icon layout map F$(36) is a 36-character string where each character’s code is either 0 (empty) or 1 (filled), representing a 6×6 grid of graphic tile positions. When large graphics are selected (ISIZEf=1), the grid shrinks to 3×3 (width=2) and tile positions are spaced further apart.
Save/Load Serialization
Rather than SAVEing the BASIC variables directly, the program manually serializes sign data to a scratch area at address 60000 before saving as a raw CODE block of 1,082 bytes. The save subroutine (lines 5020–5520) iterates over t$(1..13, 1..19) with nested FOR loops, then skips 246 bytes, writes F$(1..36), skips 35 more bytes, then writes BORDf and ISIZEf at fixed offsets. The load routine mirrors this layout exactly. The gaps are reserved for data that the machine code routine at 48800 (icons2buf) fills separately.
Printer Configuration
The printer selection subsystem (lines 2300–2740) supports five printer models and four parallel interface types. Initialization data for each printer is held in string variables (e$, g$, p$) which are copied byte-by-byte into a fixed block of memory starting at address 49098 by the subroutine at line 2230. A sentinel byte of 254 advances to the next 8-byte sub-block; 255 signals end of data. Line-feed byte injection (code 10) at addresses 49146–49153 is toggled based on user choice. The interface type (0–3) is POKEd to address 49016 and the machine code routine at 50453 (IFcntrl) is then called to apply it.
Cursor and Navigation Idioms
Both the text editor and the position editor use a computed GO SUB dispatch for arrow key handling. In the position editor, GO SUB ((k-8)*10)+1100 maps key codes 8–11 to subroutines at 1100, 1110, 1120, 1130. The text editor uses a similar pattern at GO SUB ((k-8)*5)+1680. The main key dispatch in the text editor uses a jump table variable z(k) at line 1570, whose values are precomputed to route each key code to the appropriate handler line.
Error Handling
Tape operations use a consistent pattern: LET DerrRet=<return line>: ON ERR GO TO 5800 before any LOAD or SAVE, with ON ERR RESET after success. The tape error handler at line 5800 displays a flashing message and waits for ENTER, then does ON ERR RESET : GO TO DerrRet to retry. The print routine at line 2007 sets ON ERR GO TO 2212 to catch print errors, and line 2212 clears the error handler and calls clrwnd before returning to the main menu.
Graphics Designer Module
The Graphics Designer draws a pixel editing grid by plotting lines every 3 pixels using PLOT/DRAW loops (lines 3730–3755), creating a 32×56 cell grid where each cell is 3×3 screen pixels. Cursor movement wraps around both axes. The coordinate system maps screen pixel coordinates directly to machine code parameters: POKE 49002, x/3 and POKE 49003, ABS(((y-9)/3)-55) convert from screen pixel space to tile-cell space before calling the plot/unplot routines. Each 256-byte tile is stored starting at 45928 + (icon-1)*256, with high/low byte split performed by the subroutine at line 3900.
Notable Anomalies
- Line 554 is labeled “Select Graphic size” as a REM but is also the target of
GO SUB 554from line 569, which falls through into the INPUT at line 555 — the REM acts as an entry point for the subroutine. - Line 561 has a
RETURNthat makes the size-selection block a proper subroutine when called from line 569, but when entered via line 550 the code also falls through to line 553’sON ERR RESETand then line 554, effectively re-entering the size dialog. - Line 1884 uses
t$(db+l-3,17 TO )=CHR$ 2+CHR$ 0+CHR$ 0— the open-ended slice17 TOwill assign to columns 17, 18, 19 of the continuation row, resetting justification and font flags when switching back from double-height. - The
OVER 1mode is left active throughout the position editor main loop (set at line 935), so all cursor prints use XOR mode — this is intentional for non-destructive cursor rendering but could cause unexpected display results if not carefully managed. - Lines 2342 and 2346 both check for
k<=2andk=3respectively but then both call the same subroutineGO SUB 2433(Epson setup), meaning printers 1, 2, and 3 all receive Epson-style initialization with only minor POKE differences applied afterward at lines 2441/2443.
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 \a8p\aSTR$ 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 BA\ePI 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
12 LOAD "Scode"CODE 45928,19606
84 REM Main Menu
85 CLS : POKE 23728,0: POKE 23729,1: POKE 23723,3
86 RANDOMIZE USR FN a()
87 REM " SIGN DESIGNER"
120 PRINT AT 5,8;"1 - Edit Sign"
130 PRINT AT 7,8;"2 - Print Sign"
138 PRINT AT 9,8;"3 - Erase Sign"
140 PRINT AT 11,8;"4 - Save Sign"
150 PRINT AT 13,8;"5 - Load Sign"
152 PRINT AT 15,8;"6 - Select Printer"
154 PRINT AT 21,5; INVERSE 1;"< press #no to select >"
160 LET k$=INKEY$
170 IF k$="1" THEN GO TO 200
180 IF k$="2" THEN GO TO 1950
182 IF k$="3" THEN GO SUB 4200: GO TO 85
183 IF k$="4" THEN GO TO 5000
185 IF k$="5" THEN GO TO 6000
187 IF k$="6" THEN GO SUB 2300: GO TO 85
195 GO TO 160
200 REM Create Poster
285 IF INKEY$>"" THEN GO TO 285
290 CLS : POKE 23728,2: POKE 23729,0: POKE 23723,2
300 RANDOMIZE USR FN a()
310 REM " EDIT SIGN"
340 PRINT AT 7,6;"1 - Edit Text"
350 PRINT AT 9,6;"2 - Select Border"
360 PRINT AT 11,6;"3 - Select Graphic"
370 PRINT AT 13,6;"4 - Edit Graphic Layout"
375 PRINT AT 15,6;"5 - Main Menu"
380 PRINT AT 21,4; INVERSE 1;"< press #no to select >"
390 LET k$=INKEY$
400 IF k$="1" THEN GO TO 500
410 IF k$="2" THEN GO TO 516
420 IF k$="3" THEN GO TO 540
430 IF k$="4" THEN GO TO 562
432 IF k$="5" THEN GO TO 442
440 GO TO 390
442 IF INKEY$>"" THEN GO TO 442
444 GO TO 85
500 REM Edit Text
510 GO SUB 1300
512 GO TO 285
515 REM Select Border
516 CLS : LET n=BORDf
518 PRINT AT 2,7;"SELECT SIGN BORDER"
520 PRINT AT 7,10;"1 - BOX"
521 PRINT AT 8,10;"2 - SOLID"
522 PRINT AT 9,10;"3 - BEAD"
523 PRINT AT 10,10;"4 - KALEIDOSCOPE"
524 PRINT AT 11,10;"5 - STARS"
525 PRINT AT 12,10;"6 - TILES"
526 PRINT AT 13,10;"7 - HEARTS"
527 PRINT AT 14,10;"8 - FLOWERS": PRINT AT 15,10;"9 - NONE"
528 GO SUB 538
530 LET k$=INKEY$: IF k$="" THEN GO TO 530
532 IF k$>="1" AND k$<="9" THEN GO TO 534
533 GO TO 530
534 GO SUB 538: LET n=VAL k$-1: GO SUB 538
535 LET BORDf=n
537 PAUSE 50: GO TO 285
538 PRINT AT n+7,10; INVERSE 1; OVER 1;" "; OVER 0; INVERSE 0
539 RETURN
540 REM Select Graphic
541 REM
542 CLS
544 PRINT AT 2,7;"SELECT SIGN GRAPHIC"
546 INPUT "Graphic Name?";k$: IF k$="" THEN GO TO 285
547 IF k$="none" THEN GO TO 750
548 PRINT AT 18,0; BRIGHT 1;"Place Graphics cassette intoyour recorder, cue to start ofdesired Graphic, and play Tape"
549 LET DerrRet=540: ON ERR GO TO 5800
550 LOAD k$+".G"CODE 45928,256
553 ON ERR RESET : GO TO 285
554 REM Select Graphic size
555 INPUT "New Graphic Size?(s or l)";k$
556 IF k$="s" THEN LET n=0
557 IF k$="l" THEN LET n=1
558 IF k$<>"s" AND k$<>"l" THEN GO TO 555
559 LET ISIZEf=n
561 RETURN
562 REM Select Layout
563 CLS
564 LET n=ISIZEf
565 IF n=0 THEN PRINT AT 17,5; BRIGHT 1;"Small graphic selected"
566 IF n=1 THEN PRINT AT 17,5; BRIGHT 1;"large graphic selected"
569 GO SUB 554
570 GO SUB 810
580 GO TO 285
600 STOP
750 REM No Graphic
760 LET ICONf=12
780 GO TO 285
810 REM Position Editor
821 CLS
822 POKE 23728,0: POKE 23729,6: POKE 23723,2: RANDOMIZE USR FN a()
823 REM "GRAPHIC LAYOUT EDITOR"
824 PRINT AT 15,3;"------- Control Keys -------"
825 PRINT ,,TAB 6;"p - select location"
826 PRINT TAB 6;"o - deselect location"
829 PRINT TAB 6;"CS/x - exit editor"
830 PRINT TAB 6;"^ - Arrow keys to move"
832 LET ISIZE=ISIZEf
840 LET wdth=5
845 LET bl=7: LET bc=13
847 BRIGHT 1
872 BRIGHT 0
880 IF ISIZE=1 THEN LET bl=10: LET bc=15: LET wdth=2
885 LET i=1
890 FOR l=bl TO bl+wdth
900 FOR c=bc TO bc+wdth
914 IF CODE F$(i)=1 THEN PRINT AT l,c;"\b"
916 IF CODE F$(i)=0 THEN PRINT AT l,c;"\a"
918 LET i=i+1
920 NEXT c
930 NEXT l
935 OVER 1
940 LET l=0: LET c=0
942 REM Main Loop
950 PRINT AT l+bl,c+bc; FLASH 1;" "
980 LET k=CODE INKEY$
985 IF k=88 THEN RETURN
990 IF k=0 THEN GO TO 950
995 IF k=111 THEN OVER 0: PRINT AT l+bl,c+bc;"\a": OVER 1: GO SUB 1200
1000 IF k=112 THEN OVER 0: PRINT AT l+bl,c+bc;"\b": OVER 1: GO SUB 1200
1010 IF k>=8 AND k<=11 THEN GO SUB 1050
1030 GO TO 950
1050 REM Cmove
1051 PRINT AT l+bl,c+bc; FLASH 0;" "
1052 GO SUB ((k-8)*10)+1100
1054 RETURN
1100 REM Cleft
1101 LET c=c-1
1102 IF c<0 THEN LET c=wdth: LET l=l-1
1104 IF l<0 THEN LET l=wdth
1106 RETURN
1110 REM Cright
1111 LET c=c+1
1112 IF c=wdth+1 THEN LET c=0: LET l=l+1
1114 IF l=wdth+1 THEN LET l=0
1116 RETURN
1120 REM Cdown
1122 LET l=l+1
1124 IF l=wdth+1 THEN LET l=0
1126 RETURN
1130 REM Cup
1132 LET l=l-1
1134 IF l<0 THEN LET l=wdth
1136 RETURN
1200 REM Update Icon Map
1230 LET n=(l*(6/(ISIZE+1)))+c
1240 LET F$(n+1)=CHR$ (k-111)
1255 GO SUB 1110
1256 RETURN
1310 REM Lettering Editor
1330 CLS
1340 POKE 23728,0: POKE 23729,5: POKE 23723,1
1345 RANDOMIZE USR FN a()
1350 REM "TEXT EDITOR"
1355 BRIGHT 1
1375 BRIGHT 0
1400 PRINT AT 3,8;" "
1410 PRINT AT 17,8;" "
1415 FOR l=4 TO 16
1420 PRINT AT l,8;" ";AT l,24;" "
1421 NEXT l
1422 LET j=2: LET fm=0: LET fS=0: LET db=1
1423 PRINT AT 18,0;"--------- Control Keys ---------"
1424 PRINT "CS/S-toggle size CS/C-clear text"
1425 PRINT "CS/F-toggle font ENTER-nxt line"
1426 PRINT "CS/J-toggle Just CS/X-exit "
1430 REM Display Cur Text
1435 LET l=4
1440 FOR q=db TO db+12
1443 LET a=CODE t$(q,17)
1444 LET a$="LRC"
1445 PRINT AT l,25;a$(a+1)
1450 LET a=CODE t$(q,18)
1452 LET a$="SO"
1454 PRINT AT l,7;a$(a+1)
1455 GO SUB 3100
1459 LET l=l+1
1460 NEXT q
1490 OVER 1
1492 LET l=4: LET c=9
1499 IF INKEY$<>"" THEN GO TO 1499
1500 REM Main Loop
1510 PRINT AT l,c; FLASH 1;" "
1560 LET k=CODE INKEY$
1562 IF k=0 THEN LET k=1
1570 GO TO z(k)
1595 BEEP .005,20
1596 LET cnt=10: IF INKEY$<>"" AND rs=1 THEN GO TO 1500
1597 LET cnt=cnt-1: LET rs=1: IF cnt=0 THEN GO TO 1500
1598 IF INKEY$<>"" THEN GO TO 1597
1599 LET rs=0: GO TO 1500
1600 REM Print Char
1610 IF k>64 THEN LET k=k-32
1620 PRINT AT l,c; OVER 0;CHR$ k; OVER 1
1630 LET t$(db+l-4,c-8)=CHR$ k
1632 GO SUB 1685
1634 GO TO 1595
1640 INPUT BRIGHT 1;"Clear Text(y or n)?";k$: IF k$<>"y" THEN GO TO 1499
1641 GO SUB 3000: GO TO 1330
1642 RETURN
1650 REM Cmove
1651 PRINT AT l,c; FLASH 0;" "
1660 GO SUB ((k-8)*5)+1680
1670 GO TO 1595
1680 REM Left
1682 LET c=c-1
1683 IF c=8 THEN LET c=9
1684 RETURN
1685 LET c=c+1: IF t$(db+l-4,19)=CHR$ 1 THEN GO TO 1688
1686 IF c=24 THEN LET c=23
1687 RETURN
1688 IF c=17 THEN LET c=16
1689 RETURN
1690 LET l=l+1: IF l=17 THEN LET l=4: GO TO 1693: REM Down
1691 IF t$(db+l-4,19)=CHR$ 255 THEN LET l=l+1
1692 IF l>=17 THEN LET l=4
1693 LET fS=CODE t$(db+l-4,19): LET fm=CODE t$(db+l-4,18): LET j=CODE t$(db+l-4,17)
1694 RETURN
1695 REM Up
1696 LET l=l-1: IF l=3 THEN LET l=16
1697 IF t$(db+l-4,19)= CHR$ 255 THEN LET l=l-1
1698 IF l<=3 THEN LET l=16: GO TO 1697
1699 LET fS=CODE t$(db+l-4,19): LET fm=CODE t$(db+l-4,18): LET j=CODE t$(db+l-4,17): RETURN
1700 REM Next Ln
1701 PRINT AT l,c; FLASH 0;" "
1704 LET l=l+1: IF l=17 THEN LET l=4: GO TO 1710
1705 IF t$(db+l-4,19)=CHR$ 255 THEN LET l=l+1
1706 IF l>=17 THEN LET l=4
1710 LET fS=CODE t$(db+l-4,19): LET fm=CODE t$(db+l-4,18): LET c=9: LET j=CODE t$(db+l-4,17)
1730 GO TO 1595
1740 REM Delete
1741 PRINT AT l,c; FLASH 0;" "
1742 GO SUB 1680
1744 PRINT AT l,c; OVER 0;" "; OVER 1
1746 LET t$(db+l-4,c-8)=" "
1748 GO TO 1595
1750 REM JUST mode step
1760 OVER 0
1762 LET j$="LRC"
1766 LET j=j+1
1768 IF j=3 THEN LET j=0
1770 PRINT AT l,25;j$(j+1)
1780 LET t$(db+l-4,17)=CHR$ j
1782 OVER 1
1784 GO TO 1595
1790 REM FONT mode toggle
1792 OVER 0
1794 LET fm=1*(fm=0)
1795 IF fm=0 THEN LET m$="S"
1796 IF fm=1 THEN LET m$="O"
1797 PRINT AT l,7;m$
1798 LET t$(db+l-4,18)=CHR$ fm
1799 OVER 1: GO TO 1595
1863 REM FONT size tobble
1864 OVER 0: IF l=16 THEN GO TO 1500
1865 IF l=15 THEN GO TO 1867
1866 OVER 0: IF t$(db+l-2,19)=CHR$ 255 THEN OVER 1: GO TO 1500
1867 LET fS=1*(fS=0)
1868 IF fS=0 THEN GO TO 1880
1870 LET t$(db+l-4,19)=CHR$ 1
1871 LET t$(db+l-3,19)=CHR$ 255
1872 LET t$(db+l-4,9 TO 15)=" "
1873 LET t$(db+l-3,1 TO 15)=" "
1874 BRIGHT 1: PRINT AT l,17;" ";AT l+1,9;" ": BRIGHT 0
1876 PRINT AT l+1,7;" ";AT l+1,25;" "
1877 IF c>16 THEN LET c=16
1878 OVER 1: GO TO 1595
1880 REM small
1882 LET t$(db+l-4,19)=CHR$ 0
1884 LET t$(db+l-3,17 TO )=CHR$ 2+CHR$ 0+CHR$ 0
1885 PRINT AT l,17;" ";AT l+1,9;" "
1886 PRINT AT l+1,7;"S";AT l+1,25;"C"
1888 OVER 1: GO TO 1595
1890 RETURN
1900 REM Lettering Printer
1902 FOR n=db TO db+12
1904 FOR o=15 TO 1 STEP -1
1906 IF t$(n,o)>" " THEN GO TO 1910
1908 NEXT o
1912 FOR m=1 TO o
1914 POKE 49074+m,CODE t$(n,m)
1918 NEXT m
1919 POKE 49074+m,254
1920 POKE 49035,n-db
1922 POKE 49036,CODE t$(n,17)
1923 POKE 49095,CODE t$(n,18)
1924 POKE 49096,CODE t$(n,19)
1925 RANDOMIZE USR 50156: REM STRPRNT
1926 IF t$(n,19)=CHR$ 1 THEN LET n=n+1
1930 NEXT n
1940 RETURN
1950 REM Print Poster
1960 IF INKEY$>"" THEN GO TO 1960
1965 CLS
1970 POKE 23728,4: POKE 23729,10: POKE 23723,2
1980 RANDOMIZE USR FN a()
1990 REM " PRINT SIGN"
2003 PRINT AT 9,3;"< Press ENTER to abort; >";AT 10,3;"< any other to proceed >"
2004 PAUSE 4e4: IF INKEY$=CHR$ 13 THEN GO TO 85
2006 OVER 0: PRINT AT 9,0;" ": OVER 1: INPUT "How many Copies? ";k
2007 ON ERR GO TO 2212
2008 CLS : PRINT AT 10,5; FLASH 1;" BUILDING SIGN IMAGE "
2010 POKE 49028,BORDf
2020 POKE 49029,ICONf
2040 POKE 49030,ISIZEf
2060 POKE 49033,32
2070 POKE 49034,56
2075 IF ISIZEf=1 THEN POKE 49033,64: POKE 49034,112
2080 FOR n=1 TO 36
2082 POKE 49038+n,CODE F$(n)
2084 NEXT n
2100 IF ICONf<>12 THEN RANDOMIZE USR 50041: REM ICONdep
2110 IF BORDf<>9 THEN RANDOMIZE USR 50000: REM BORDER
2111 LET db=1: GO SUB 1900
2112 OVER 0: PRINT AT 10,5; FLASH 1;" PRINTING": OVER 1
2114 FOR p=1 TO k
2120 RANDOMIZE USR 49535: REM PRNTtop
2202 NEXT p
2204 RANDOMIZE USR 49444: REM clrwnd
2210 ON ERR RESET : GO TO 85
2212 CLS : ON ERR GO TO 2212: ON ERR RESET : RANDOMIZE USR 49444: GO TO 85
2229 REM Load pcntrl Blocks
2230 LET a=0
2231 FOR m=49098 TO 49098+55 STEP 8
2232 LET daddr=m
2233 LET a=a+1: LET n=CODE b$(a): IF n=254 THEN GO TO 2236
2234 IF n=255 THEN RETURN
2235 POKE daddr,n: LET daddr=daddr+1: GO TO 2233
2236 NEXT m
2239 RETURN
2300 REM Printer Custom
2302 LET p4=49700
2310 CLS
2320 PRINT ,,,,,," * 80 Column Printer *"
2322 PRINT " ---------------------"
2324 PRINT ,,
2326 PRINT " Epson RX/FX ......1"
2328 PRINT " Gemini 10x/SG10 ..2"
2330 PRINT " Memotech DMX80 ...3"
2332 PRINT " Panasonic 1090 ...3"
2333 PRINT " Spirit-80 ........3"
2334 PRINT " Legend 808 .......3"
2338 PRINT " Seikosha GP250 ...4"
2339 PRINT " Prowriter 8510 ...5"
2340 INPUT ,,,," Select (1-5) ";k
2341 PRINT AT 20,9; FLASH 1;" Please Wait "
2342 IF k<=2 THEN GO SUB 2433
2346 IF k=3 THEN GO SUB 2433
2347 IF k=4 THEN GO SUB 2600
2348 IF k=5 THEN GO SUB 2700
2349 IF k<1 OR k>5 THEN GO TO 2340
2350 CLS
2352 PRINT ,,,,,," * Parallel Interface *"
2354 PRINT " ----------------------"
2356 PRINT ,,
2358 PRINT " AERCO ..........1"
2359 PRINT " TASMAN-b .......2"
2360 PRINT " TASMAN-c .......3"
2361 PRINT " A&J ............4"
2362 INPUT ,,,," Select (1 or 4) ";k
2364 IF k<1 OR k>4 THEN GO TO 2362
2365 CLS : POKE 49016,k-1: RANDOMIZE USR 50453: REM IFcntrl
2368 INPUT "Do you want LineFeed codes sent (Y or N)? ";k$
2370 IF k$<>"Y" AND k$<>"y" AND k$<>"N" AND k$<>"n" THEN GO TO 2368
2380 IF k$="Y" OR k$="y" THEN POKE 49124,10: LET k=1
2382 IF k$="N" OR k$="n" THEN POKE 49124,0: LET k=0
2390 FOR n=49146 TO 49153
2392 IF k=0 AND PEEK n=10 THEN POKE n,0
2393 IF k=1 AND PEEK n=0 THEN POKE n,10
2396 NEXT n
2397 RETURN
2400 REM Alter code
2430 POKE p4+1,62
2431 POKE 49097,1: REM set double density
2432 RETURN
2433 REM Epson
2435 LET b$=e$
2437 GO SUB 2230: REM load block
2439 GO SUB 2430: REM alter code
2441 IF k=1 THEN POKE 49132,108: POKE 49140,108
2443 IF k=3 THEN POKE 49130,5: POKE 49132,68: POKE 49134,0: POKE 49135,9: POKE 49138,5: POKE 49140,68: POKE 49142,0: POKE 49143,9
2444 RETURN
2600 REM Seik250
2610 LET b$=g$
2620 GO SUB 2230
2630 POKE p4+1,63
2635 POKE 49097,0: REM set single density
2640 RETURN
2700 REM Prowriter
2710 LET b$=p$
2720 GO SUB 2230
2730 GO SUB 2430: POKE p4+1,63
2740 RETURN
3000 REM Clear Text
3010 FOR n=db TO db+12
3020 LET t$(n,1 TO 15)=" "
3030 LET t$(n,17)=CHR$ 2
3040 LET t$(n,18)=CHR$ 0
3050 LET t$(n,19)=CHR$ 0
3060 NEXT n
3070 RETURN
3100 REM Display Text
3140 PRINT AT l,9;t$(q,1 TO 15)
3160 IF CODE t$(q,19)<>1 THEN RETURN
3170 IF l=16 THEN RETURN
3180 BRIGHT 1: PRINT AT l,17;" ";AT l+1,9;" ": BRIGHT 0
3190 PRINT AT l+1,7;" ";AT l+1,25;" "
3192 LET l=l+1: LET q=q+1
3194 RETURN
4200 REM Declare Vars
4201 CLS
4202 POKE 23728,4: POKE 23729,9: POKE 23723,2
4203 RANDOMIZE USR FN a()
4204 REM "ERASE POSTER"
4205 PRINT AT 9,3;"< Press ENTER to abort; >";AT 10,3;"< any other to proceed >"
4206 PAUSE 4e4: IF INKEY$=CHR$ 13 THEN RETURN
4209 CLS : PRINT AT 10,8; FLASH 1;" ERASING POSTER "
4220 LET BORDf=0
4230 LET ICONf=0
4250 LET ISIZEf=0
4270 DIM t$(26,19): LET db=1: GO SUB 3000
4272 DIM F$(36)
4274 FOR n=1 TO 36
4276 LET F$(n)=CHR$ 0
4278 NEXT n
4279 CLS
4280 RETURN
5000 REM Save Sign
5010 CLS : INPUT "Name for Sign to SAVE?";n$
5012 IF n$="" THEN GO TO 85
5013 GO SUB 5020: CLS
5014 LET DerrRet=5000: ON ERR GO TO 5800
5016 SAVE n$+".S"CODE 60000,1082
5018 ON ERR RESET : RANDOMIZE USR 49444: GO TO 85
5020 PRINT AT 18,0; FLASH 1;" Collecting Sign Parts Please Wait "
5030 LET dest=60000
5040 FOR n=1 TO 13
5050 FOR m=1 TO 19
5060 POKE dest,CODE t$(n,m)
5070 LET dest=dest+1
5080 NEXT m
5090 NEXT n
5092 LET dest=dest+246
5100 FOR n=1 TO 36
5110 POKE dest,CODE F$(n)
5120 LET dest=dest+1
5130 NEXT n
5140 LET dest=dest+35
5300 POKE dest,BORDf
5320 POKE dest+2,ISIZEf
5400 RANDOMIZE USR 48800: REM icons2buf
5520 RETURN
5800 REM Tape Error
5815 PRINT AT 8,10; FLASH 1;" TAPE ERROR "
5820 PRINT AT 10,3;" press ENTER to try again"
5821 PAUSE 4e4
5822 ON ERR GO TO 5822
5830 ON ERR RESET : GO TO DerrRet
6000 REM Load Sign
6010 CLS : INPUT "Name of Sign to LOAD?";n$
6012 IF n$="" THEN GO TO 85
6013 LET DerrRet=6000: ON ERR GO TO 5800: PRINT AT 18,0; FLASH 1;" LOADing Sign """;n$;""" "
6014 LOAD n$+".S"CODE 60000,1082
6018 ON ERR RESET
6020 PRINT AT 18,0; FLASH 1;" Restoring Sign Parts Please Wait "
6030 LET src=60000
6040 FOR n=1 TO 13
6050 FOR m=1 TO 19
6060 LET t$(n,m)=CHR$ PEEK src
6070 LET src=src+1
6080 NEXT m
6090 NEXT n
6092 LET src=src+246
6100 FOR n=1 TO 36
6110 LET F$(n)=CHR$ PEEK src
6120 LET src=src+1
6130 NEXT n
6140 LET src=src+35
6300 LET BORDf=PEEK src
6320 LET ISIZEf=PEEK (src+2)
6400 RANDOMIZE USR 48812: REM buf2icons
6432 RANDOMIZE USR 49444: REM CLRwnd
6440 GO TO 85
9000 REM **** SAVE PROGRAM ****
9990 SAVE "Sdesign" LINE 12
9991 BEEP 1,40
9992 SAVE "Scode"CODE 45928,19606
9993 LOAD *"startg"
9999 FOR n=1 TO LEN g$: PRINT n;" ";CODE g$(n): NEXT n
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 \a8p\aSTR$ 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 BA\ePI 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: INK 0: CLS : CLEAR 45928
16 POKE 23728,7: POKE 23729,2: POKE 23723,2
17 RANDOMIZE USR FN a()
20 REM " GRAPHICS DESIGNER UTILITY"
42 PRINT AT 19,7;"ZEBRA SYSTEMS, INC."
44 PRINT AT 18,7;"COPYRIGHT (C) 1985"
210 POKE 23728,13: POKE 23729,13: POKE 23723,2
220 RANDOMIZE USR FN a()
230 REM "LOADING"
240 PRINT AT 13,11; FLASH 1; OVER 1;" "
250 PRINT AT 14,11; FLASH 1; OVER 1;" "
252 OVER 0
300 LOAD "Gdesign"
999 SAVE "startg" LINE 1: LOAD *"gcode"CODE : LOAD *"gdesign"
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 \a8p\aSTR$ 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 BA\ePI 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
12 LOAD "Gcode"CODE 45128: POKE 23606,72: POKE 23607,175
20 LET icon=1
3000 REM Icon Designer
3002 LET q$="Rose"
3006 LET rtn=3310
3007 IF INKEY$<>"" THEN GO TO 3007
3009 CLS : POKE 23723,2: POKE 23728,0: POKE 23729,5
3010 RANDOMIZE USR FN a()
3011 REM "GRAPHICS DESIGNER MENU"
3012 PRINT AT 6,7;"1 - Edit Graphic"
3013 PRINT AT 8,7;"2 - Load Graphic"
3014 PRINT AT 10,7;"3 - Save Graphic";AT 17,4;"< press no# to select >"
3015 LET k$=INKEY$: IF k$="" THEN GO TO 3015
3016 IF k$="1" THEN GO TO 3022
3017 IF k$="2" THEN GO TO 4000
3018 IF k$="3" THEN GO TO 4100
3020 LET q$=n$
3021 ON ERR RESET : GO TO 3009
3022 OVER 0: CLS
3050 LET Cflag=0
3055 GO SUB 3700
3057 GO TO 3065
3060 ON ERR RESET : CLS : PRINT AT 10,10; FLASH 1;" TAPE ERROR "; FLASH 0,,,;" press ENTER to try again": PAUSE 4e4: GO TO 3009
3100 REM Main Loop
3105 LET LSTx=x: LET LSTy=y
3115 GO SUB 3620
3120 LET k=CODE INKEY$
3125 IF k>=8 AND k<=11 THEN GO TO 3310
3140 IF CHR$ k="p" THEN GO TO 3240
3145 IF CHR$ k="o" THEN GO TO 3275
3150 IF CHR$ k="C" THEN GO TO 3475
3155 IF CHR$ k="S" THEN GO SUB 3425: GO TO 3065
3166 IF CHR$ k="X" THEN GO SUB 5000: GO TO 3009
3167 IF CHR$ k="P" THEN COPY
3168 IF k=13 THEN GO SUB 3421
3170 GO TO 3100
3240 REM plot dot
3241 BEEP .005,20
3245 POKE 49002,(x/3)
3250 POKE 49003,ABS (((y-9)/3)-55)
3255 RANDOMIZE USR 50683: REM Dplt
3260 LET Cflag=0
3265 LET k=9
3270 GO TO rtn
3275 REM unplot dot
3276 BEEP .005,10
3280 POKE 49002,(x/3)
3285 POKE 49003,ABS (((y-9)/3)-55)
3290 RANDOMIZE USR 50631: REM Dunplt
3295 LET Cflag=0
3300 LET k=9
3305 GO TO rtn
3310 REM Cursor Move
3315 GO SUB 3635
3320 GO SUB 3340+((k-8)*20)
3325 LET Cflag=0
3330 GO TO 3100
3340 REM Cursor Left
3342 LET x=x-3
3345 IF x<0 THEN LET x=94: LET y=y+3
3350 IF y>174 THEN LET y=9
3355 RETURN
3360 REM Cursor right
3365 LET x=x+3
3370 IF x>96 THEN LET x=1: LET y=y-3
3375 IF y<9 THEN LET y=174
3378 RETURN
3380 REM Cursor Down
3390 LET y=y-3
3395 IF y<9 THEN LET y=174
3398 RETURN
3400 REM Cursor Up
3410 LET y=y+3
3415 IF y>174 THEN LET y=9
3420 RETURN
3421 REM Next Line
3422 GO SUB 3635: LET X=96
3423 LET Cflag=0: GO SUB 3360
3424 RETURN
3425 REM Store Icon
3430 GO SUB 3635
3435 LET num=45928+((icon-1)*256)
3440 GO SUB 3900
3442 POKE 49000,lo
3445 POKE 49001,hi
3450 RANDOMIZE USR 50862: REM STRicon
3455 POKE 49000,232
3460 POKE 49001,253
3465 GO SUB 3545
3466 GO SUB 3520
3470 RETURN
3475 REM Clear Icon
3476 INPUT BRIGHT 1;"Clear graphic(y or n)?";k$
3477 IF k$<>"y" THEN GO TO 3512
3480 GO SUB 3635
3485 LET num=45928+((icon-1)*256)
3487 GO SUB 3900
3490 POKE 49000,lo
3495 POKE 49001,hi
3500 RANDOMIZE USR 50851: REM CLRicon
3505 LET q$=" ": GO SUB 3520
3510 LET x=1: LET y=174
3512 GO SUB 3794
3515 GO TO 3100
3520 REM Icon def to scrn
3522 PRINT AT 6,23-INT ((LEN q$)/2);q$
3525 LET num=45928+((icon-1)*256)
3527 GO SUB 3900
3530 POKE 49000,lo
3535 POKE 49001,hi
3545 RANDOMIZE USR 50595: REM Idef2Scrn
3550 LET Cflag=0
3555 RETURN
3620 REM Invrt Cursor
3625 LET Cflag=(Cflag=0)*1
3630 GO TO 3645
3635 REM Cursor off
3640 IF Cflag=0 THEN RETURN
3645 POKE 49002,x
3650 POKE 49003,y
3655 RANDOMIZE USR 50900: REM INVRTdot
3660 RETURN
3665 REM Orgn state
3670 IF Cflag=0 THEN RETURN
3675 POKE 49002,LSTx
3680 POKE 49003,LSTy
3685 RANDOMIZE USR 50900: REM INVRTdot
3690 LET Cflag=0
3695 RETURN
3700 REM Grid Draw
3705 POKE 23728,1: POKE 23729,15
3710 RANDOMIZE USR FN a()
3715 REM "GRAPHIC DESIGNER"
3725 PLOT 0,175: DRAW 0,-168: DRAW 96,0: DRAW 0,168: DRAW -96,0
3730 FOR n=0 TO 95 STEP 3
3735 PLOT n,175: DRAW 0,-168
3740 NEXT n
3745 FOR n=175 TO 7 STEP -3
3750 PLOT 0,n: DRAW 96,0
3755 NEXT n
3760 FOR n=8 TO 14
3765 PRINT AT n,21; BRIGHT 1;" "; BRIGHT 0
3770 NEXT n
3780 GO SUB 3520
3782 PRINT AT 16,14; INVERSE 1;" Control Keys "
3784 PRINT AT 17,14;"p=Plot o=Unplot"
3786 PRINT AT 18,14;"CS/s=Store graphic"
3788 PRINT AT 19,14;"CS/c=Clear graphic"
3790 PRINT AT 20,14;"CS/x=Exit"
3792 PRINT AT 21,14;"CS/p=Copy screen"
3794 PRINT #0;AT 0,0;" Arrow keys to move ENTER=Next line"
3810 RETURN
3900 REM Convert
3910 LET hi=INT (num/256)
3920 LET lo=num-(hi*256)
3930 RETURN
4000 REM Load Graphic
4010 ON ERR GO TO 3060
4020 INPUT "Name of Graphic to LOAD?";n$
4025 IF n$="" THEN GO TO 3020
4026 PRINT AT 18,0; BRIGHT 1;"Place Graphics Library tape into your recorder, Rewind to the start, and play Tape."
4030 LOAD n$+".G"CODE 45928,256
4040 GO TO 3020
4100 REM Save Graphic
4110 ON ERR GO TO 3060
4120 INPUT "Name of Graphic to SAVE?";n$
4125 IF n$="" THEN GO TO 3020
4126 PRINT AT 20,0; FLASH 1;" SAVEing graphic""";n$;""""
4130 SAVE n$+".G"CODE 45928,256
4140 PRINT AT 20,0; FLASH 1;" Rewind and play for VERIFY ": ON ERR GO TO 3060: VERIFY ""CODE
4150 GO TO 3020
5000 REM Exit to Menu
5010 INPUT AT 0,0; BRIGHT 1;"Store graphic before Exiting?(y or n)?";k$
5030 IF k$<>"y" THEN GO TO 5090
5040 PRINT AT 4,16; FLASH 1;" AUTO-STORING ": GO SUB 3425
5090 GO TO 3794
9900 REM Save to Tape
9910 SAVE "Gdesign" LINE 10
9920 SAVE "Gcode"CODE 45128,5900
9998 STOP
9999 SAVE "Gdesign" LINE 10: LOAD *"code2tap"
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
