Sign Designer

Products: Sign Designer
Date: 1986
Type: Program
Platform(s): TS 2068
Tags: Graphics

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:

AddressFunction label
49535PRNTtop — print one copy of sign
49444clrwnd — clear print window
50156STRPRNT — string/text print
50041ICONdep — deposit icon on sign image
50000BORDER — render border
48800icons2buf — copy icons to save buffer
48812buf2icons — restore icons from buffer
50453IFcntrl — interface control setup
50595Idef2Scrn (Graphics Designer)
50683Dplt — plot dot
50631Dunplt — unplot dot
50851CLRicon
50862STRicon — store icon
50900INVRTdot — 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 554 from 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 RETURN that 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’s ON ERR RESET and 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 slice 17 TO will assign to columns 17, 18, 19 of the continuation row, resetting justification and font flags when switching back from double-height.
  • The OVER 1 mode 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<=2 and k=3 respectively but then both call the same subroutine GO 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

Appears On

Related Products

Create signs that include text and graphics.

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 \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.

People

No people associated with this content.

Scroll to Top