---
title: "Vidio Artist"
id: 71088
type: "computer_media"
slug: "vidio-artist"
url: "http://localhost/computer_media/vidio-artist/"
markdown_url: "http://localhost/computer_media/vidio-artist.md"
published_at: "2026-08-27T21:02:17+00:00"
modified_at: "2026-08-27T21:03:46+00:00"
author: "David Anderson"
featured_image:
url: "http://localhost/wp-content/uploads/2026/08/vidio-artist-1.png"
alt: "Vidio Artist screen"
excerpt: "A full-featured freehand drawing suite with joystick control, circles, arcs, magnified text, UDG support, and tape save/load — all driven by a two-letter command menu."
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/"
indiv:
- name: "James DuPuy"
slug: "james-dupuy"
taxonomy: "indiv"
url: "http://localhost/indiv/james-dupuy/"
genre:
- name: "Art"
slug: "art"
taxonomy: "genre"
url: "http://localhost/type/art/"
media_type: "Program"
programmers:
- name: "James DuPuy"
slug: "james-dupuy"
taxonomy: "indiv"
url: "http://localhost/indiv/james-dupuy/"
download_url: "https://archive.org/download/timex-sinclair-software-archive/Vidio%20Artist%20%281984%29%28Dupuy%2C%20James%29%28TS2068%29%28US%29%28Program%29.zip"
mediadate: "1984"
images:
- url: "http://localhost/wp-content/uploads/2026/08/vidio-artist-1.png"
alt: "Vidio Artist screen"
- url: "http://localhost/wp-content/uploads/2026/08/vidio-artist-2.png"
alt: "Vidio Artist screen"
media_type_tags: "Art"
---
# Vidio Artist
Vidio Artist is a comprehensive drawing program that provides multiple input modes including pixel-level plotting, character-based “graphic” plotting, circle drawing, line drawing with arc support, rectangle/square drawing, and text entry — all controlled through two-letter instruction codes entered at a menu prompt. The program uses STICK to read a joystick for freehand cursor movement and the fire button (STICK 2) to toggle between draw and erase modes using OVER 1 XOR plotting. A string variable `f$` pre-builds an AT/INK escape sequence used repeatedly to position status readouts on the bottom lines of the screen without disturbing the drawing area. The magnified character print routines (pr8 and prm) decode the ROM character set directly from address 15616 by PEEKing each character’s 8-byte bitmap and rendering each pixel as a filled block using DRAW commands scaled by a multiplier of 1×, 2×, 3×, or 4×. User-defined graphics can be loaded from tape via a companion program called AUTOGRAFIX, stored in a 21×8 array and POKEd into UDG memory.
***
### Program Structure
The program is organized as a command dispatcher centered on lines 100–300. After initialization and a splash/intro sequence, the user enters two- to five-letter instruction codes at an INPUT prompt. Each code branches to a self-contained subroutine block:
| Code | Line | Function |
| --- | --- | --- |
| pl | 500 | Pixel plot with joystick |
| gr | 1000 | Character-stamp plot with joystick |
| ci | 1500 | Circle drawing |
| li | 2000 | Line/arc drawing |
| sq | 2500 | Pixel rectangles |
| gs | 3000 | Character rectangles |
| pr | 5000 | On-screen text entry |
| pr8 | 6000 | 8× magnified character render |
| prm | 7000 | 2–4× magnified character render |
| bo | 350 | Border color change |
| sv | 400 | SAVE SCREEN$ |
| ld | 430 | LOAD SCREEN$ |
| ldg | 460 | Load UDG data array |
| co | 190 | COPY to printer (inline) |
| pi | 8900 | Print instructions |
| clear | 180 | CLS (inline) |
### Status Bar Technique
The variable `f$` is initialized at line 22 as a pre-built escape string: `CHR$ 22 + CHR$ 21 + CHR$ 0 + CHR$ 19 + CHR$ 1`. This encodes AT 21,0 followed by INK 1, positioning the cursor at the bottom status line. By PRINTing `f$` as a prefix, every routine can update the status display cheaply without a full AT calculation each time. A double `PRINT f$,,` scrolls past the status area to leave the drawing untouched.
### Joystick-Driven Movement
The shared movement subroutine at lines 800–960 (for pixel mode) and 1400–1490 (for character mode) reads STICK(1,1) into `s` and uses boolean arithmetic to update coordinates. For example:
- `LET x=x+(s=9)+(s=8)+(s=10)-(s=4)-(s=5)-(s=6)` — each parenthesized comparison evaluates to 1 (true) or 0 (false), so direction is accumulated without IF statements.
- STICK(2,1) is polled in the draw loop to detect the fire button, toggling between OVER 0 (draw) and OVER 1 (erase) modes.
Coordinate clamping is handled by a chain of IF guards after movement (lines 920–950 and 1480–1486).
### Bitmap Magnification Routines
The `pr8` routine (line 6000) and `prm` routine (line 7000) both decode ROM character bitmaps directly from address 15616 using `PEEK`. For each character, the 8-byte font data is extracted and each bit tested against a descending power-of-two mask (`v`, halved each step). A set bit causes a filled block to be drawn; a clear bit prints a space.
In `pr8`, each pixel is rendered as a single inverse block graphic character (`"\::"` — a full block) at the corresponding AT position, producing an 8× grid fill. In `prm`, each pixel is rendered by a subroutine dispatched via computed GO SUB: `GO SUB 7600+(10*ml)`, selecting line 7620, 7630, or 7640 for multipliers 2, 3, or 4. Each of these subroutines draws a pixel-sized filled square using a sequence of PLOT and DRAW commands sized to the multiplier.
### ON ERR Usage
The program uses ON ERR RESET at line 105 as a global error trap at the top of the main menu loop. Individual routines that risk errors (such as CIRCLE with out-of-range radii or LOAD from tape) install local handlers with ON ERR GO TO, redirecting to safe recovery points (e.g., line 100 or line 1570). This layered error handling prevents the program from crashing during tape operations or bad drawing parameters.
### Text Entry Subsystem (pr)
The `pr` routine (lines 5000–5600) implements a rudimentary word-processor-style text editor. It maintains a 2D string array `p$(23,33)` storing the typed characters, and reads keystrokes via INKEY$ in a tight loop. Cursor movement is handled by checking character codes: code 8 (backspace), 9 (tab right), 10 (cursor down), 11 (cursor up), 12 (delete), 13 (enter). Wrapping from the right border to the next line and backtracking across line boundaries is implemented at lines 5550–5560. Notably, the code checks `z$="AT "` (SYMBOL SHIFT+I = INPUT token) and `z$=" OR "` (SYMBOL SHIFT+U = IF token) as triggers for changing INK and PAPER colors respectively, exploiting keyword tokens as control characters.
### UDG Loading
The `ldg` routine (lines 460–490) loads a 21×8 numeric array `a()` from tape, then iterates over all 21 UDG slots. For each slot, it computes `CHR$(code+64)` (yielding “A” through “U”) and uses `POKE USR x$+n, a(code,n+1)` to install the 8-byte bitmap. This expects data saved by a companion program called AUTOGRAFIX.
### Rectangle Drawing
Both the pixel rectangle (`sq`, line 2500) and the character rectangle (`gs`, line 3000) routines support two input modes: coordinate entry (“C”) and plot-centered sizing (“P”). The pixel rectangle is drawn by a chain of PLOT + four DRAW commands forming a closed path (lines 2630–2632). The character rectangle uses nested FOR loops printing the border character at each edge position (lines 3120–3170), with corner fixup applied during erase (line 3175).
### Notable Anomalies
- Line 2700 in the `sq` routine is referenced by `GO TO 2700` from line 2520, but the actual plot-mode entry code begins at line 2710. Line 2700 does not exist, so execution falls through to 2710 — this is an intentional technique.
- Line 3200 is similarly referenced but absent; execution falls through to 3210, the plot-mode entry for the graphic square routine.
- The `prm` erase branch at line 7235 checks `IF a$="e"`, but at that point in the flow `a$` holds the result of an earlier INPUT unrelated to erase — the erase prompt is actually at line 7240. The condition at 7235 will rarely trigger as intended.
- The INK color prompt in the `pr` routine at line 5040 accepts values 0–8 (8 is BRIGHT), which is non-standard but consistent with how the program uses it elsewhere in that routine.
- Line 9999 (`CLEAR : SAVE "DRAW" LINE 1`) is an auto-save/autostart line never reached during normal execution.
## Source Code
```
10 REM Program "draw" Updated 3/16/84 by James G. DuPuy
12 PAPER 7: INK 0: BORDER 1: CLS
15 POKE 23609,20
20 LET m=3.14: LET p=7: LET i=0: LET x=128: LET y=88: LET zd=i: LET l=11: LET c=15: LET b=6: LET xd=zd: LET yd=zd
22 DIM a(21,8): LET f$=CHR$ 22+CHR$ 21+CHR$ 0+CHR$ 19+CHR$ 1
26 LET g$="": LET h$=""
29 BEEP .5,20
30 CLS : PRINT FLASH 1;" STOP TAPE!!!",''''''''" Program- ""VIDIO ARTIST"" by:",,,''" James G. DuPuy 3/16/84",
40 PAUSE 300: CLS
50 PRINT '' FLASH 1;" Welcome to VIDIO ARTIST!",
60 PRINT ''''"You will be able to draw by"'"using the instruction sheet,"'"the LEFT joystick, and, of-"'"course, your imagination.";f$;" HAVE FUN!!!",
70 INPUT "Press ENTER to continue or press (I) to print instructions.";a$: CLS : IF a$="i" THEN GO SUB 9000
80 BORDER b
100 REM Intruction detect
101 PRINT f$,,
103 BEEP .1,30
105 ON ERR RESET
107 PRINT f$;"Plot:";x;",";y;",";zd;" Line:";l;",Col:";c
110 INPUT "Enter Instruction code:";a$: IF a$=" STOP " THEN STOP
120 IF a$="pl" THEN GO TO 500
130 IF a$="gr" THEN GO TO 1000
140 IF a$="ci" THEN GO TO 1500
150 IF a$="bo" THEN GO SUB 350
160 IF a$="sv" THEN GO SUB 400
170 IF a$="ld" THEN GO SUB 430
175 IF a$="ldg" THEN GO SUB 460
180 IF a$="clear" THEN CLS : GO TO 100
190 IF a$="co" THEN INPUT "HOW MANY COPIES?:";copy: FOR n=1 TO copy: PRINT f$,,: COPY : LPRINT ''': PAUSE 0: NEXT n
200 IF a$="li" THEN GO TO 2000
210 IF a$="sq" THEN GO TO 2500
220 IF a$="gs" THEN GO TO 3000
230 IF a$="pr8" THEN GO TO 6000
240 IF a$="pr" THEN GO TO 5000
250 IF a$="prm" THEN GO TO 7000
260 IF a$="pi" THEN GO SUB 8900
290 PRINT f$;"Plot:";x;",";y;",";zd;" Line:";l;",Col:";c
300 GO TO 100
350 INPUT "Enter Border color:";b
360 IF b>7 THEN GO TO 350
370 BORDER b: RETURN
400 INPUT "DRAWING name?";n$: IF LEN n$>10 THEN GO TO 400
410 SAVE n$SCREEN$
420 RETURN
430 INPUT "Drawing Name?";n$: IF LEN n$>10 THEN GO TO 430
435 ON ERR GO TO 100
440 CLS : LOAD n$SCREEN$
450 RETURN
460 ON ERR GO TO 100
465 INPUT "UDG set name?";n$: IF LEN n$>10 THEN GO TO 465
468 PRINT AT 20,0;
470 LOAD n$ DATA a()
475 FOR z=1 TO 21: LET code=z: LET x$=CHR$ (code+64)
478 FOR n=0 TO 7: POKE USR x$+n,a(code,n+1): NEXT n
480 NEXT z
490 RETURN
500 REM Plot Routine
510 INPUT "New coor.?(Y/ENT):";a$: IF a$="n" OR a$="" THEN GO TO 530
520 INPUT "Enter X then Y:";x;"-";y: IF x<0 OR x>255 OR y<8 OR y>175 THEN GO TO 520
530 PRINT f$,,
550 PRINT AT 21,27; BRIGHT 1;" DRAW"
555 PLOT OVER 0; INK i; PAPER p;x,y
560 GO SUB 800
565 IF INKEY$="m" THEN GO TO 100
570 IF STICK (2,1) THEN PAUSE 10: GO TO 700
580 PLOT OVER 1; INK i; PAPER p;x,y: PAUSE 1
590 GO TO 555
700 PRINT AT 21,27; BRIGHT 1;"ERASE"
705 PLOT OVER 1; INK i;x,y: GO SUB 800
710 IF INKEY$="m" THEN GO TO 100
720 IF STICK (2,1)=1 THEN PAUSE 10: GO TO 550
740 PLOT OVER 0; INK i;x,y: PAUSE 1
750 GO TO 705
800 LET s= STICK (1,1)
820 LET x=x+(s=9)+(s=8)+(s=10)-(s=4)-(s=5)-(s=6)
830 LET y=y+(s=1)+(s=5)+(s=9)-(s=2)-(s=6)-(s=10)
840 IF INKEY$="i" THEN INPUT "Enter Ink color:";i
845 IF INKEY$="p" THEN INPUT "Enter Paper color:";p
850 IF INKEY$="x" THEN INPUT "Enter X coor.(0-255):";x
860 IF INKEY$="y" THEN INPUT "Enter Y coor.(8-175):";y
920 IF x<0 THEN LET x=0
930 IF x>255 THEN LET x=255
940 IF y<8 THEN LET y=8
950 IF y>175 THEN LET y=175
955 PRINT f$;"X=";x;",Y=";y;" PLOT "
960 RETURN
1000 REM Graphic PLOT Routine
1005 LET ig=i: LET pg=p
1010 INPUT "New Coor.?(Y/ENT):";a$: IF a$="" THEN GO TO 1030
1020 INPUT "Enter LINE then COL:";l;"-";c: IF l<0 OR l>20 OR c<0 OR c>31 THEN GO TO 1020
1030 PRINT f$,,
1031 IF g$="" THEN GO TO 1035
1032 PRINT f$;" Character: ";g$
1033 INPUT "Use Same CHAR.?(ENT/N):";a$: IF a$="" THEN GO TO 1050
1035 INPUT "Enter Character:";g$: IF LEN g$=0 THEN GO TO 1035
1050 PRINT AT 21,27; BRIGHT 1;" DRAW"
1060 PRINT AT l,c; OVER 0; PAPER pg; INK ig;g$
1070 IF STICK (2,1)=1 THEN PAUSE 15: GO TO 1200
1080 GO SUB 1400
1090 IF INKEY$="m" THEN GO TO 100
1110 PRINT AT l,c; OVER 1; PAPER pg; INK ig;g$: PAUSE 2
1120 GO TO 1060
1200 PRINT AT 21,27; BRIGHT 1;"ERASE"
1210 PRINT AT l,c; OVER 1; INK ig;g$
1220 IF STICK (2,1)=1 THEN PAUSE 15: GO TO 1050
1240 GO SUB 1400
1260 IF INKEY$="m" THEN GO TO 100
1290 PRINT AT l,c; OVER 0; INK ig;g$: PAUSE 2
1300 GO TO 1210
1400 LET s= STICK (1,1)
1410 LET l=l+(s=2)+(s=6)+(s=10)-(s=1)-(s=5)-(s=9)
1420 LET c=c+(s=8)+(s=9)+(s=10)-(s=4)-(s=5)-(s=6)
1430 IF INKEY$="i" THEN INPUT "Enter INK color(0-7):";ig
1435 IF INKEY$="p" THEN INPUT "Enter PAPER color(0-7):";pg
1440 IF INKEY$="l" THEN INPUT "Enter LINE(0-20):";l
1450 IF INKEY$="c" THEN INPUT "Enter COLUMN(0-31):";c
1460 IF INKEY$="g" THEN INPUT "Enter New CHARACTER:";g$
1480 IF l<0 THEN LET l=0
1482 IF l>20 THEN LET l=20
1484 IF c<0 THEN LET c=0
1486 IF c>31 THEN LET c=31
1488 PRINT f$;"Line:";l;", COL:";c;" GRAPHIC "
1490 RETURN
1500 REM CIRCLE Routine
1510 INPUT "Use Plot COOR.?(ENT/N):";a$: IF a$="" OR a$="y" THEN LET xc=x: LET yc=y: GO TO 1530
1520 INPUT "Enter X then Y :";xc;"-";yc
1530 INPUT "Enter Diameter(2-167):";r: IF r>167 THEN GO TO 1530
1535 LET r=r/2
1536 LET ic=i: LET pc=p
1540 INPUT "Use same INK color(ENT/N):";a$: IF a$="n" THEN INPUT "Enter INK color(0-7):";ic
1550 INPUT "Use same PAPER color(ENT/N):";a$: IF a$="n" THEN INPUT "Enter PAPER color(0-7):";pc
1555 ON ERR GO TO 1570
1560 CIRCLE OVER 0; PAPER pc; INK ic;xc,yc,r
1570 INPUT "Circle OK(ENT),ERASE(E):";a$: IF a$="e" THEN CIRCLE OVER 1; PAPER pc; INK ic;xc,yc,r
1580 INPUT "Another Circle?(ENT/N):";a$: IF a$<>"n" THEN GO TO 1510
1600 GO TO 100
2000 REM DRAW LINE Routine
2002 LET xd=0: LET yd=xd
2010 INPUT "Use Same Plot Coor.(ENT/N):";a$: IF a$="y" OR a$="" THEN LET xl=x: LET yl=y: GO TO 2025
2020 INPUT "Enter new X then Y:";xl;"-";yl: IF xl>255 OR yl>175 OR yl<8 THEN GO TO 2020
2025 IF xd=0 AND yd=0 THEN GO TO 2040
2030 INPUT "Same DRAW coor.?(ENT/N):";a$: IF a$<>"n" THEN GO TO 2050
2040 INPUT "Where to?(X then Y):";xd;",";yd
2050 INPUT "Want an ARC?(ENT/N):";a$: IF a$="n" THEN LET zd=0: GO TO 2062
2052 IF zd=0 THEN GO TO 2060
2055 INPUT "Same ARC?(ENT/N):";a$: IF a$="" THEN GO TO 2070
2060 INPUT "Enter ARC (m=PI):";zd
2062 LET id=i
2065 INPUT "Change INK color?(Y/ENT):";a$: IF a$="y" THEN INPUT "Enter INK color:";id
2070 PRINT f$;"Plot:";xl;",";yl;" Draw:";xd;",";yd;",";zd,
2075 ON ERR GO TO 2100
2080 PLOT OVER 0; INK id;xl,yl
2090 DRAW OVER 0; INK id;xd,yd,zd
2100 INPUT "Line OK(ENT)?,Erase(E):";a$: IF a$="e" THEN PLOT OVER 1; INK id;xl,yl: DRAW OVER 1; INK id;xd,yd,zd
2105 INPUT "MOVE PLOT-end-LINE(Y/ENT)";a$: IF a$="y" THEN LET x=xl+xd: LET y=yl+yd
2110 INPUT "Another LINE?(ENT/N):";b$: IF b$="n" THEN GO TO 100
2120 INPUT "From Last line?(ENT/N):";b$: IF b$="" AND a$<>"e" THEN LET xl=xl+xd: LET yl=yl+yd: GO TO 2030
2130 IF b$="" AND a$="e" THEN GO TO 2030
2140 GO TO 2010
2500 REM Squares & Rectangles
2510 INPUT "Use PLOT(P),or COOR.(C):";a$: IF a$="c" THEN GO TO 2540
2520 IF a$="p" THEN GO TO 2700
2530 GO TO 2510
2540 INPUT "Enter LEFT edge(0-254):";xls: IF xls>254 THEN GO TO 2540
2550 INPUT "Enter RIGHT edge(1-255):";xrs: IF xrs>255 OR xls>=xrs THEN GO TO 2550
2560 INPUT "Enter UPPER edge(9-175):";yus: IF yus<9 OR yus>175 THEN GO TO 2560
2570 INPUT "Enter LOWER edge(8-174):";yds: IF yds<8 OR yds>=yus THEN GO TO 2570
2580 PRINT f$;"LFT:";INT xls;",RT:";INT xrs;",UP:";INT yus;",DN:";INT yds,
2590 INPUT "COOR. OK?(ENT/N):";a$: IF a$="n" THEN GO TO 2510
2600 LET is=i
2610 INPUT "Change INK color?(Y/ENT):";a$: IF a$="y" THEN INPUT "Enter INK color:";is
2620 LET o=0
2630 PLOT OVER o; INK is;xls,yds: DRAW OVER o; INK is;xrs-xls,0: DRAW OVER o; INK is;0,yus-yds: DRAW OVER o; INK is;xls-xrs,0: DRAW OVER o; INK is;0,yds-yus
2632 PLOT OVER o; INK is;xls,yds
2635 IF o=1 THEN GO TO 2650
2640 INPUT "OK(ENT), ERASE(E):";a$: IF a$="e" THEN LET o=1: GO TO 2630
2650 INPUT "Another SQUARE?(ENT/N):";a$: IF a$="" THEN GO TO 2500
2660 GO TO 100
2710 INPUT "Enter HORZ(up-dn)length:";h: LET yus=y+(h/2): LET yds=y-(h/2): IF yus>175 OR yds<8 THEN GO TO 2710
2720 INPUT "Enter VERT(lft-rt)length:";v: LET xls=x-(v/2): LET xrs=x+(v/2): IF xls<0 OR xrs>255 THEN GO TO 2720
2730 GO TO 2580
3000 REM Graphic SQUARE Routine
3005 LET h$=g$
3010 INPUT "PLOT(P), or COOR.(C):";a$: IF a$="c" THEN GO TO 3040
3020 IF a$="p" THEN GO TO 3200
3030 GO TO 3010
3040 INPUT "Enter LEFT edge(0-30):";cl: IF cl>30 THEN GO TO 3040
3050 INPUT "Enter RIGHT edge(1-31):";cr: IF cr>31 OR cr<=cl THEN GO TO 3050
3060 INPUT "Enter UPPER edge(0-19):";lu: IF lu>19 THEN GO TO 3060
3070 INPUT "Enter LOWER edge(1-20):";ld: IF ld>20 OR ld<=lu THEN GO TO 3070
3080 PRINT f$,,f$;"LFT:";INT cl;",RT:";INT cr;",UP:";INT lu;",DN:";INT ld;", CH:";h$
3090 INPUT "COOR. OK?(ENT/N):";a$: IF a$="n" THEN GO TO 3010
3095 LET is=i
3096 IF h$="" THEN GO TO 3098
3097 INPUT "Use Same CHAR.?(ENT/N):";a$: IF a$="" THEN GO TO 3100
3098 INPUT "Enter 1 CHAR. to be used:";h$: IF h$="" THEN GO TO 3098
3100 INPUT "Change INK color?(Y/ENT):";a$: IF a$="y" THEN INPUT "Enter INK color(0-7):";is
3110 LET o=0
3120 FOR n=cl TO cr
3130 PRINT AT lu,n; OVER o; INK is;h$;AT ld,n; OVER o; INK is;h$
3140 NEXT n
3150 FOR n=lu TO ld
3160 PRINT AT n,cl; OVER o; INK is;h$;AT n,cr; OVER o; INK is;h$
3170 NEXT n
3175 IF o=1 THEN PRINT AT lu,cl; OVER o; INK is;h$;AT lu,cr;h$;AT ld,cl;h$;AT ld,cr;h$
3176 IF o=1 THEN GO TO 3190
3180 INPUT "G-Square OK?(ENT),ERASE(E):";a$: IF a$="e" THEN LET o=1: GO TO 3120
3190 INPUT "Another G-Square?(ENT/N):";a$: IF a$="" THEN GO TO 3010
3195 GO TO 100
3210 INPUT "Enter HORZ(up-dn):";h: LET lu=l-(h/2): LET ld=l+(h/2): IF ld>20 OR lu<0 THEN GO TO 3210
3220 INPUT "Enter VERT(LFT-RT):";v: LET cl=c-(v/2): LET cr=c+(v/2): IF cl<0 OR cr>31 THEN GO TO 3220
3230 GO TO 3080
5000 REM Printing Routine
5002 DIM p$(23,33)
5010 INPUT "Enter LINE then COLUMN:";li;"-";co: IF li>20 OR co>31 THEN GO TO 5010
5012 LET ub=li
5015 LET bl=co
5017 INPUT "Enter RIGHT border(1-31):";br: IF br>31 OR br<=bl THEN GO TO 5017
5030 PRINT f$,,
5040 INPUT "Change INK color?(Y/ENT):";a$: LET ip=0: IF a$="y" THEN INPUT "Enter INK color(0-8):";ip
5045 INPUT "Change PAPER color(Y/ENT):";a$: LET pp=7: IF a$="y" THEN INPUT "Enter PAPER color(0-7):";pp
5047 PAUSE 30
5050 PRINT AT li,co; FLASH 1; INK 0;p$(li+1,co+1)
5052 PRINT f$;"LINE-";li;", COLUMN-";co;" "
5055 LET z$=INKEY$
5060 IF z$<>"" THEN BEEP .01,40
5065 IF z$="" THEN GO TO 5055
5070 IF CODE z$>123 OR CODE z$<14 THEN GO SUB 5500
5075 IF CODE z$>13 AND CODE z$<123 THEN LET p$(li+1,co+1)=z$: PRINT AT li,co; PAPER pp; INK ip;p$(li+1,co+1): LET co=co+1
5080 IF INKEY$<>"" THEN PAUSE 5
5085 IF co>br THEN LET co=bl: LET li=li+1: IF li>20 THEN LET li=20
5090 GO TO 5050
5500 PRINT AT li,co; PAPER pp; INK ip;p$(li+1,co+1)
5505 IF CODE z$=13 AND li<20 THEN LET li=li+1: LET co=bl
5510 IF CODE z$=8 AND co>bl THEN LET co=co-1
5520 IF CODE z$=9 AND co
0 THEN LET li=li-1
5550 IF CODE z$=12 THEN LET co=co-1: IF co>=bl THEN LET p$(li+1,co+1)=" "
5555 IF coub THEN LET co=br: LET li=li-1: LET p$(li+1,co+1)=" "
5560 IF co8 THEN GO TO 5570
5575 IF z$=" OR " THEN INPUT "Enter PAPER color(0-7):";pp: IF pp>7 THEN GO TO 5575
5580 IF z$=" AND " THEN GO TO 100
5600 RETURN
6000 REM Printing 8X Routine
6005 LET i8=0
6010 INPUT "Coor.(C),G-plot(G):";a$: IF a$="c" THEN GO TO 6018
6012 IF a$="g" THEN LET l8=l: LET c8=c: IF l8>13 THEN LET l8=13
6014 IF a$="g" AND c8>24 THEN LET c8=24
6016 IF a$="g" THEN GO TO 6030
6017 GO TO 6010
6018 INPUT "Enter LINE Coor.(0-13):";l8: IF l8>13 THEN GO TO 6018
6020 INPUT "Enter COLUMN Coor.(0-24):";c8: IF c8>24 THEN GO TO 6020
6030 INPUT "Enter 1 Character:";r$: IF CODE r$>127 OR CODE r$<32 THEN GO TO 6030
6040 INPUT "Change INK color?(Y/ENT):";a$: IF a$="y" THEN INPUT "Enter INK color(0-7)";i8: IF i8>7 THEN GO TO 6040
6050 LET d8=15616+(CODE r$-32)*8
6060 FOR h=0 TO 7
6070 LET p8=PEEK (d8+h): LET v=128
6080 FOR g=0 TO 7
6090 IF p84 OR ml<2 THEN GO TO 7005
7010 INPUT "COOR(C),PLOT(P):";a$: IF a$="c" THEN GO TO 7065
7020 IF a$<>"p" THEN GO TO 7010
7030 LET xl=x: LET yl=y
7040 IF xl>255-(ml*8+ml) THEN LET xl=255-(ml*8-ml)
7050 IF yl255-(8*ml+ml) THEN GO TO 7065
7070 INPUT "Enter Y COOR.:";yl: IF yl>175 OR yl<(8+ml+ml*8) THEN GO TO 7070
7075 LET x4=xl
7080 PRINT f$,,
7090 PRINT f$;"LFT:";INT (xl/(8*ml));",RT:";INT ((256-xl)/(ml*8));",UP:";INT ((175-yl)/(ml*8));",DN:";INT ((yl-8)/(ml*8))
7100 INPUT "Enter 1 CHARACTER:";r$: IF CODE r$>127 OR CODE r$<32 THEN GO TO 7100
7130 LET oo=0
7140 LET d4=15616+(CODE r$-32)*8
7150 FOR h=0 TO 7
7160 LET p4=PEEK (d4+h): LET v=128
7170 FOR g=0 TO 7
7180 IF p48+(ml*8) THEN LET yl=yl-(ml*8): LET xl=x4: GO TO 7080
7290 INPUT "END(E),COOR.(C):";a$: IF a$="e" THEN GO TO 100
7295 IF a$<>"c" THEN GO TO 7290
7300 GO TO 7000
7620 PLOT OVER oo;g*ml+xl,yl-h*ml: DRAW OVER oo;1,0: DRAW OVER oo;0,-1: DRAW OVER oo;-1,0: RETURN
7630 PLOT OVER oo;g*ml+xl,yl-h*ml: DRAW OVER oo;2,0: DRAW OVER oo;0,-2: DRAW OVER oo;-2,0: DRAW OVER oo;0,1: DRAW OVER oo;1,0: RETURN
7640 PLOT OVER oo;g*ml+xl,yl-h*ml: DRAW OVER oo;3,0: DRAW OVER oo;0,-3: DRAW OVER oo;-3,0: DRAW OVER oo;0,2: DRAW OVER oo;2,0: DRAW OVER oo;0,-1: DRAW OVER oo;-1,0: RETURN
8900 PRINT AT 21,0;"If inst. go on the screen, your"
8910 INPUT "drawing will clear!>Press ENT"; LINE a$
9000 REM Print instructions
9001 INPUT "INST. to screen>S,TO printer>P"; LINE a$: IF a$="p" THEN GO TO 9005
9002 GO TO 9020
9005 OPEN #2,"p"
9010 INPUT "Turn PRINTER on, Press ENT:";a$
9020 PRINT '"This is the instructions to use the program: DRAW. \* 3/17/84 By James G. DuPuy 216-661-4105 "
9030 PRINT ''"When the Prompt asking for an INSTRUCTION CODE is present, thefollowing CODES in LOWER case will do the following."
9040 PRINT ''"PL - To draw THIN lines useing LEFT JOYSTICK. Pressing the FIREbutton will alternately allow you to DRAW or ERASE."
9050 PRINT '"Pressing""M"" will go back to"'"the MENU (Instruction codes)"
9060 PRINT """X"" for new X COOR.,""Y"" for new"'"Y COOR., ""I""for new INK color"'"""P"" for new PAPER color."
9070 PRINT ''"GR - To draw THICK lines using aCHAR(character) of your choice."''"""M"",""I"",""P"", and the FIRE button"'"are the same as PLOT ROUTINE."
9080 PRINT """C"" for new COLUMN, ""L"" for new"
9090 PRINT "LINE, ""G"" for new GRAPHIC CHAR."
9100 PRINT ''"BO - to change BORDER color."
9110 PRINT '"CI - To Draw CIRCLES. Just obey the prompts at the bottom."
9120 PRINT '"LI - to QUICKLY draw THIN lines.Follow the prompts."
9130 PRINT '"SQ - To QUICKLY draw SQARES or RECTANGLES. Follow prompts."
9140 PRINT '"GS - to QUICKLY draw GRAPHIC SQARES or RECTANGLES. Follow theprompts and use only ONE CHAR."
9150 PRINT '"CLEAR - to CLEAR the drawing."
9160 PRINT '"CO - To COPY your drawing on theT/S-2040 PRINTER."
9170 PRINT '"SV - to SAVE your drawing on TAPE. Follow the prompts and youcan't use over 10 CHAR for NAME."
9180 PRINT '"LD - To LOAD a drawing from TAPE. Have tape ready. If you don't remember the name, just press ENTER for the name."
9182 PRINT '"LDG - To LOAD a set of USER DEFINED GRAPHICS as set up on tape by the program AUTOGRAFIX."
9185 PRINT '"PI - To PRINT the INSTRUCTIONS on the T/S-2040 printer."
9190 PRINT ''"PR - To PRINT in the drawing. You will be prompted to enter LINE,& COLUMN, and-RIGHT BORDER.This will be the limit where theprinting will stop and go to thenext line. Left border is the COLUMN coor."
9200 PRINT '"Using CAPS SHIFT and the ARROW keys will move thecursor in thatdirection. DELETE will backspaceand erase. EDIT will ask for newCoor. SYMBL SHIFT and:"
9210 PRINT "Y(RETRN) will go back to MENU. I(INPUT) will ask for new INK. U(IF) will ask for new PAPER."
9212 PRINT '"PR8 - Will print at 8 times normal size. Just follow the prompts. When you enter COOR or from PLOT you will be at the upper left corner."
9214 PRINT '"PRM - Will print at multples of 2,3,or 4. Follow the prompts."
9220 PRINT ''"To STOP the program, just push SYMBL SHIFT and the ""A""key(STOP)"
9225 PRINT '"If the program STOPS at any timewith an ERROR code, just type: GOTO 100"
9230 PRINT '''
9240 CLOSE #2
9300 RETURN
9999 CLEAR : SAVE "DRAW" LINE 1
```