--- title: "Sign Designer" id: 51571 type: "computer_media" slug: "sign-designer" url: "http://localhost/computer_media/sign-designer/" markdown_url: "http://localhost/computer_media/sign-designer.md" published_at: "2023-08-13T13:17:14+00:00" modified_at: "2026-04-03T07:59:18+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2020/12/Sign-Designer.png" excerpt: "A full sign-making studio with text layout, border styles, graphic tile editing, and multi-printer support — all driven by a substantial machine code engine loaded from tape." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" genre: - name: "Graphics" slug: "graphics" taxonomy: "genre" url: "http://localhost/type/graphics/" media_type: "Program" download_url: "https://archive.org/download/timex-sinclair-software-archive/Sign%20Designer%201%20%281986%29%28Zebra%20Systems%29%28US%29%28TS2068%29%28Program%29%28Sides%201%20and%202%29.zip" mediadate: "1986" producer_company: - id: 11469 title: "Zebra Systems, Inc." type: "company" url: "http://localhost/company/zebra-systems/" images: - url: "http://localhost/wp-content/uploads/2020/12/Sign-Designer.png" related_products: - id: 35027 title: "Sign Designer" type: "product" url: "http://localhost/product/sign-designer/" media_type_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: | 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=: 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. ## 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 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 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: 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 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 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" ```