Pixel Sketch and Graphic Editor v2.0 is a full-featured pixel art and graphic editing program for the TS2068. It supports three video modes—Standard, Extended Color, and High Resolution—selected at startup, with the High Resolution mode loading an additional machine code block from tape. The program relies heavily on a companion machine code file (“PS/GE C”) loaded at line 19, with nearly all graphics operations delegated to over 19 distinct machine code routines whose entry points are initialized in subroutine 9998 into variables r1 through r19. Features include block copy, block erase, block rotate, mirror image, inverse, wide view, zoom, digitize, circle and arc drawing, fill/shade with custom 8-bit shade codes, screen save/load/merge, hard copy to either a 2040 or full-size printer, four loadable text fonts, joystick-driven menu navigation using the TS2068 STICK function, and a “connect” mode that draws lines between successive joystick positions using PLOT/DRAW.
Program Analysis
Program Structure
The BASIC listing is organized into functional blocks by line number range. Startup and initialization occupy lines 19–29, the main editing loop runs at lines 30–55, toggle/state subroutines are at lines 60–190, the menu and dispatcher system lives at lines 400–925, and individual feature implementations fill lines 1000–9650. The machine code entry-point table is set up entirely in subroutine 9998 (lines 9998), and the save/load routine for the program itself is at line 9999.
Machine Code Architecture
Almost every non-trivial operation is delegated to one of 19 named machine code routines, whose addresses are stored in variables r1 through r19 and called via RANDOMIZE USR rN. The addresses are assigned in subroutine 9998 using VAL "number" string-encoded literals, which saves tokenized BASIC space. A partial mapping of these routines is:
| Variable | Address | Inferred Function |
|---|---|---|
r1 | 56000 | Clear/reset display buffer |
r2 | 56014 | Set attribute / color mode |
r3 | 56031 | Restore display state |
r4 | 56045 | Redraw / refresh screen |
r5 | 56057 | Save display buffer |
r6 | 56069 | Restore display buffer |
r7 | 56081 | Swap display buffers |
r8 | 56093 | Alternate buffer operations |
r9 | 58000 | Rotate block |
r10 | 58509 (or 58535 in hi-res) | Cursor/joystick move |
r11 | 60656 (or 61585 in hi-res) | Print character at cursor |
r12 | 61077 | Zoom/close view |
r13 | 61666 | Wide view expand |
r14 | 62304 | Block erase / wide view copy |
r15 | 62497 | Block copy |
r16 | 49386 | Fill/shade |
r17 | 56243 | Mirror image |
r18 | 57148 | Digitize scan |
r19 | 57667 | Inverse block |
Two alternate addresses for r10 and r11 are set at line 24 when High Resolution mode is selected, reflecting the different code entry points needed for the hi-res display driver loaded from tape.
Video Mode Handling
The program supports three video modes, selected at startup (line 20–21) and stored in the variable mode. Mode 0 is Standard, mode 1 is Extended Color, and mode 2 triggers loading of a separate hi-res machine code file (“hi res”CODE) from tape. The value written to address 57988 controls which mode the machine code routines operate in. For High Resolution mode, mode is recalculated as matr/2, where matr encodes the paper color attribute (6+8*(7-patr)). The OUT 255,2*mode instruction, used extensively throughout the program, appears to select the active video page or bank on the TS2068 hardware.
Communication with Machine Code via Memory-Mapped Parameters
Parameters are passed to and from machine code routines through a dedicated block of memory starting around address 57980. The known assignments include:
57980— cursor speed/mode flag57981–57982— X coordinate (high/low bytes for hi-res; low byte only for standard)57983–57987— block region coordinates (destination Y, source X/Y, destination X, destination Y for block ops)57988— video mode selector57989— Y coordinate or character code57990— X coordinate (source)57991— plot/erase mode flag ((1-e)*(s+1))57992— saved pixel byte at cursor57993— current attribute byte57994— joystick/fire button state57995–57996— cursor address (high/low bytes)57997— pixel byte with cursor indicator toggled57998–57999— cursor X and Y pixel coordinates57970–57978— 8-bit shade/fill pattern bytes
Menu and Navigation System
The menu system (lines 800–925) presents a two-column list of 14 functions and uses the TS2068 STICK function (the | keyword) for joystick-driven navigation. Lines 500–550 read both joystick ports (|(1,1)+|(1,2) for combined up/down, |(2,1) and |(2,2) for fire buttons), and the fire button triggers dispatch via a computed GO TO at line 450: GO TO (900+8100*lft), jumping to either line 900 (right column) or line 9000 (left column). A left/right arrow indicator is printed next to the current selection.
Key BASIC Idioms
NOT PIis used throughout as a constant for 0 (sinceNOT 3.14159…= 0 in Sinclair BASIC), andSGN PIevaluates to 1.VAL "number"is used pervasively for numeric literals, a deliberate tokenized-space optimization technique.- The attribute byte is packed as
atr + 64*b + 128*f(ink+paper in low 6 bits, bright in bit 6, flash in bit 7), matching the Spectrum/TS2068 hardware attribute format. - The string array
a$(2,3)stores"On "and"Off"and is indexed asa$(2-flag, 1 TO 3)to produce a toggle label without conditional branches. - The
ON ERR GO TOconstruct (TS2068{keyword) is used at line 25 and line 200 to catch out-of-bounds pixel access gracefully, routing to the error handler at line 9300. - The expression
POKE 57991,(1-e)*(s+1)encodes the combined erase/plot mode as a computed value: 0 when erasing (e=1), 0 when not plotting (s=0), or 2 when plotting without erase.
Window Selection Subsystem
The block-region window selector (lines 1000–1190) is a sophisticated interactive routine that draws an outlined rectangle on screen and allows the user to reposition and resize it using either joystick or keyboard. It supports three modes controlled by dbl (double/block) and mi (mirror), drawing a half-divider line inside the window when either flag is set. Boundary clamping is applied at lines 1110–1185 to keep the window on-screen, and minimum size enforcement (7 or 15 pixels depending on bl) prevents degenerate zero-size selections. An aspect-ratio constraint (IF NOT key AND xl>yl THEN LET xl=yl) enforces a square selection for operations that require it.
Digitize Function
The digitize routine (lines 1505–1570) is notable: it scans a selected rectangular region cell by cell, calling machine code routine r18 (address 57148) for each pixel row, then reads back 8 bytes of pixel data from addresses 57971–57979 and displays them enlarged on screen for visual verification. The UDG character \m (char 157 per TS2068 UDG mapping) is printed at position (0,20) as a live preview icon, with the UDG definition being poked via POKE USR "m"+y-i, PEEK 57979 each row.
Printer Support
The hard copy subsystem (lines 9505–9650, 9810) supports two printer types selected at runtime: a ZX Printer/2040-compatible device (using the standard COPY command) and a “Full Size Printer” driven by a machine code routine at address 62823. The full-size path allows the user to specify picture size, a custom graphics command byte sequence, and leading blank columns, giving fine control over the print format.
Anomalies and Notable Points
- Line 50 references
GO SUB VAL "77"but no line 77 exists in the listing; the ink-color subroutine begins at line 75, so this is likely a bug — the intended target was probably line 76 or 80, causing a crash when a digit 0–7 is pressed in the main loop. - Line 130 uses uppercase
BandFin the string expressionVAL "atr+B*64+128*F", which will evaluate as 0 since BASIC variables are case-sensitive and the active variables are lowercasebandf, so Flash mode will always write attribute byteatrwithout flash or bright. - The program listing appears duplicated in the source — the entire program from line 10 to line 820 is repeated verbatim, which is a formatting artifact of the source file rather than a functional issue.
- Line 640’s boundary check
IF b$<="0" OR b$>="5"is inverted logic — it loops back if the key is ≤ “0” OR ≥ “5”, which means it accepts only “1”–”4″ correctly but also inadvertently accepts any character between “0” and “5” exclusive. This is actually correct for the intended range but the condition structure would also reject “0” and “5” as expected. - The startup sound at line 20 plays a two-pass frequency sweep using nested
FORloops over variablesjandi, producing a distinctive rising-and-falling tone sequence while the tape is loading.
Content
Source Code
10 REM Pixel Sketck and Graphic Editor v 2.0\* by S D Lemke 1985 2144 White Oak Wichita, KS 67207
19 PRINT AT VAL "19",NOT PI;" ": LOAD "PS/GE C"CODE
20 DIM a$(2,PI): LET a$(SGN PI,SGN PI TO PI)="On ": LET a$(VAL "2",VAL "1" TO PI)="Off": PAPER VAL "1": BORDER VAL "1": INK VAL "7": CLS : PRINT AT VAL "10",VAL "10";"Stop Tape": FOR j=SGN PI TO PI: FOR i=VAL "20" TO -20 STEP -1: BEEP .001,i+5*j: NEXT i: FOR i=-20 TO VAL "20" STEP VAL "2": BEEP .01,i+VAL "5"*j: NEXT i: NEXT j: GO SUB VAL "9990": PRINT AT VAL "10",NOT PI;"Press 0 for Standard Video Mode 1 for Extended Color Mode 2 for High Resolution Mode"
21 PAUSE NOT PI: LET p$=INKEY$: IF p$<"0" OR p$>"2" THEN GO TO VAL "21"
23 LET mode=VAL p$: POKE VAL "57988",mode: POKE VAL "23609",VAL "10": LET cnct=NOT PI: RANDOMIZE USR VAL "48488": POKE VAL "23606",VAL "84": POKE VAL "23607",VAL "185"
24 IF mode=VAL "2" THEN POKE VAL "57988",matr: LET mode=matr/VAL "2": PRINT AT VAL "14",VAL "10";"Start Tape": LOAD "hi res"CODE : LET atr=NOT PI: LET patr=NOT PI: LET p0=NOT PI: LET r10=VAL "58535": LET r11=VAL "61585"
25 DIM f$(32): LET f$="Active Fctns:": CLS : GO SUB VAL "100": ON ERR GO TO VAL "9300": POKE VAL "57980",SGN PI: POKE VAL "57981",NOT PI: POKE VAL "57982",NOT PI: LET k=NOT PI: LET s=SGN PI: LET pr=k: LET b=k: LET f=b: LET e=b
26 POKE VAL "57993",VAL "atr+64*b+128*f": POKE VAL "57998",NOT PI: POKE VAL "57999",NOT PI: LET L=VAL "22432": POKE VAL "57995",VAL "87": POKE VAL "57996",VAL "160": LET X=NOT PI: LET Y=x
27 POKE VAL "57992",PEEK l: IF PEEK l>=VAL "128" THEN POKE VAL "57997",PEEK l-VAL "128": GO TO VAL "29"
28 POKE VAL "57997",PEEK l+VAL "128"
29 BEEP .05,VAL "50"
30 POKE L,PEEK 57992: POKE 57991,(1-e)*(s+1)
33 RANDOMIZE USR r10: LET l=VAL "256*PEEK 57995+PEEK 57996": PRINT #0;AT 0,0;"X = ";VAL "256*PEEK 57981+PEEK 57998";TAB 22;"Y = ";PEEK 57999;TAB 29;" "'f$: POKE l,PEEK 57997
35 LET buton=PEEK VAL "57994": IF buton AND cnct THEN GO TO VAL "610"
36 IF buton THEN GO TO VAL "150"
40 IF INKEY$="" THEN GO TO 30
45 LET b$=INKEY$: IF b$="e" OR b$="E" THEN GO SUB VAL "125": GO TO VAL "30"
46 IF b$="k" OR b$="K" THEN GO SUB VAL "115": GO TO VAL "30"
50 IF b$>="0" AND b$<="7" THEN LET a=VAL b$: GO SUB VAL "77": GO TO VAL "30"
55 GO TO VAL "840"
60 LET pr=SGN PI: GO SUB VAL "190": GO TO VAL "200"
72 PRINT #0;AT NOT PI,VAL "5";"Indicate Paper Color. ": PAUSE NOT PI: LET p$=INKEY$: IF p$<"0" OR p$>"7" THEN GO TO VAL "72"
73 LET pv=VAL p$: LET matr=VAL "6"+VAL "8"*(VAL "7"-pv): LET p$="Paper = "+p$+" ": GO SUB VAL "160": LET p$=STR$ pv: LET b$="p": IF mode>=VAL "2" THEN LET mode=matr/VAL "2": PAPER pv: BORDER pv: INK VAL "7"-pv: CLS : RETURN
74 LET ik=atr-patr*VAL "8": LET patr=VAL p$(1): LET atr=patr*VAL "8"+ik: POKE VAL "57993",VAL "atr+64*b+128*f": RETURN
75 PRINT #0;AT VAL "0",VAL "5";"Indicate Ink Color. ": PAUSE VAL "0": LET p$=INKEY$: IF p$<"0" OR p$>"7" THEN GO TO VAL "75"
76 LET a=VAL p$
80 LET p$="Ink = "+STR$ a+" ": GO SUB VAL "160": LET atr=patr*VAL "8"+a: POKE VAL "57993",VAL "atr+64*b+128*f"
90 RETURN
100 RANDOMIZE USR VAL "56105": POKE VAL "57993",atr: RANDOMIZE USR r2: IF mode<=VAL "1" THEN OUT 255,2*mode: RETURN
110 RANDOMIZE USR r7: OUT 255,2*mode: RETURN
115 LET k=NOT k: LET p$="Curser: "+a$(VAL "2"-k,VAL "1" TO VAL "3"): GO SUB VAL "160": POKE VAL "57980",VAL "(3*k+1)": RETURN
120 LET b=NOT b: LET p$="Bright: "+a$(VAL "2"-b,VAL "1" TO VAL "3"): GO SUB VAL "160": POKE VAL "57993",VAL "atr+64*b+128*f": RETURN
125 LET e=NOT e: LET p$=" Erase: "+a$(VAL "2"-e,VAL "1" TO VAL "3"): GO SUB VAL "160": IF e THEN LET f$(20 TO 24)="Erase"
126 IF NOT e THEN LET f$(20 TO 24)=" "
127 RETURN
130 LET f=NOT f: LET p$=" Flash: "+a$(VAL "2"-f,VAL "1" TO VAL "3"): GO SUB VAL "160": POKE VAL "57993",VAL "atr+B*64+128*F": RETURN
131 RANDOMIZE USR r5: RANDOMIZE USR r7: RANDOMIZE USR r1: CLS : RANDOMIZE USR r4: OUT 255,0: PRINT #0;AT VAL "0",VAL "11";"Rotate": PAUSE VAL "100": GO SUB VAL "1000": RANDOMIZE USR r4
132 RANDOMIZE USR r9: RANDOMIZE USR r4: GO TO VAL "7020"
133 PAUSE NOT PI: LET p$=INKEY$
135 IF p$="Y" OR p$="y" THEN POKE VAL "57993",p0: RANDOMIZE USR r2: PRINT #0;AT VAL "0",VAL "0";TAB VAL "31": OUT 255,2*mode: GO TO VAL "26"
136 RANDOMIZE USR r6: POKE VAL "57993",p0: RANDOMIZE USR r2: RANDOMIZE USR r3: OUT 255,2*mode: PRINT #0;AT NOT PI,NOT PI,,: GO TO VAL "26"
140 IF A=VAL "13" THEN GO TO VAL "200"
150 LET s=NOT s: LET k=NOT PI: POKE VAL "57980",SGN PI: LET p$=" Plot: "+a$(s+1,1 TO PI): GO SUB VAL "160": IF NOT s THEN LET f$(15 TO 18)="Plot"
151 IF s THEN LET f$(15 TO 18)=" "
152 GO TO VAL "30"
160 PRINT #0;AT NOT PI,NOT PI,,: PRINT #0;AT NOT PI,VAL "5";" ";p$: FOR w=NOT PI TO VAL "100": NEXT w: PRINT #0;AT NOT PI,NOT PI,,: RETURN
190 LET p$=" Print: "+a$(VAL "2"-pr,VAL "1" TO PI): GO SUB VAL "160": POKE VAL "57993",VAL "atr+64*b+128*f": POKE VAL "57990",SGN PI: RETURN
200 ON ERR GO TO 200: PAUSE NOT PI: LET p$=INKEY$: IF CODE p$<=31 THEN LET pr=NOT PI: GO SUB VAL "190": POKE VAL "57997",NOT PI: POKE VAL "57992",VAL "PEEK (256*PEEK 57995+PEEK 57996)": ON ERR GO TO 9300: GO TO VAL "30"
210 IF mode<=1 THEN POKE 57989,CODE p$: RANDOMIZE USR r11: PRINT #0;AT NOT PI,NOT PI;"X = ";PEEK 57998;TAB 22;"Y = ";PEEK 57999,: GO TO 200
220 IF mode>=2 THEN POKE 57989,CODE p$: RANDOMIZE USR r11: PRINT #0;AT NOT PI,NOT PI;"X = ";VAL "256*PEEK 57981+PEEK 57998";TAB 22;"Y = ";PEEK 57999,: GO TO 200
300 PRINT #0;AT NOT PI,NOT PI,,: RANDOMIZE USR r5: RANDOMIZE USR r1: CLS : OUT 255,0: RETURN
310 PRINT #0;AT NOT PI,NOT PI,,: RANDOMIZE USR r7: RANDOMIZE USR r1: CLS : RANDOMIZE USR r4: OUT 255,0: RETURN
320 RANDOMIZE USR r6: RANDOMIZE USR r3: OUT 255,2*mode: RETURN
400 LET lft=VAL "1"
405 IF lft THEN PRINT AT chs+VAL "3",VAL "12";"<= "
406 IF NOT lft THEN PRINT AT chs+VAL "3",VAL "12";" =>"
407 LET lchs=chs: GO TO VAL "500"
410 IF chs<=VAL "0" THEN LET chs=chss
420 IF chs>chss THEN LET chs=VAL "1"
430 IF chs<>lchs THEN PRINT AT lchs+VAL "3",VAL "12";" "
440 GO TO VAL "405"
450 GO TO (VAL "900"+VAL "8100"*lft)
500 LET stk=|(1,1)+|(1,2): IF |(2,1) OR |(2,2) THEN GO TO VAL "450"
510 IF stk=VAL "1" OR stk=VAL "5" OR stk=VAL "9" THEN LET chs=chs-VAL "1"
520 IF stk=VAL "2" OR stk=VAL "6" OR stk=VAL "10" THEN LET chs=chs+VAL "1"
530 IF stk=VAL "4" THEN LET lft=VAL "1"
540 IF stk=VAL "8" THEN LET lft=VAL "0"
550 GO TO VAL "410"
600 LET p$=" Connect: "+a$(cnct+SGN PI,SGN PI TO PI): LET cnct=NOT cnct: GO SUB VAL "160": LET xk1=PEEK VAL "57998": LET yk1=PEEK VAL "57999": IF cnct THEN LET f$(VAL "26" TO VAL "32")="Connect"
601 IF NOT cnct THEN LET f$(VAL "26" TO VAL "32")=" "
602 RETURN
610 PLOT xk1,yk1: DRAW (PEEK VAL "57998")-xk1,(PEEK VAL "57999")-yk1: LET xk1=PEEK VAL "57998": LET yk1=PEEK VAL "57999": POKE VAL "57992",PEEK l: GO TO VAL "30"
630 CLS : PRINT ''''"Press 1-4 to select a Text Font."''TAB VAL "12";"1 -- Standard";TAB VAL "12";"2 -- Bold";TAB VAL "12";"3 -- Modern";TAB VAL "12";"4 -- Italics"
640 PAUSE NOT PI: LET b$=INKEY$: IF b$<="0" OR b$>="5" THEN GO TO VAL "640"
650 CLS : GO TO (VAL "650"+VAL "10"*VAL b$)
660 RANDOMIZE USR VAL "48488": RETURN
670 RANDOMIZE USR VAL "47616": RETURN
680 RANDOMIZE USR VAL "47617": RETURN
690 RANDOMIZE USR VAL "47618": RETURN
700 PRINT ''TAB VAL "10";"Load Font": INPUT "File Name? ";n$: LOAD n$CODE VAL "47700",VAL "768": CLS : RETURN
800 LET mi=NOT PI: LET key=SGN PI: LET dbl=mi: PRINT AT VAL "2",VAL "8";"PS/GE Functions";AT VAL "4",mi;"Ink Color","Block Copy"'"Bright","Digitize"'"Flash","Block Erase"'"Paper Color","Fill (shade)"
810 PRINT AT VAL "8",NOT PI;"Circle","Hard Copy"'"Draw","Inverse"'"Pixel Erase","Screen Load"'"Text","Screen Merge"
820 PRINT AT VAL "12",NOT PI;"Curser Spd.","Paint"'"Video Mode","Block Rotate"'"Connect","Screen Save"'"Change Fonts","Wide View"'"Load Font","Mirror Image"'"Return","Zoom (close)"
830 RETURN
840 GO SUB VAL "300"
850 GO SUB VAL "800": LET chs=SGN PI: LET chss=VAL "14": GO TO VAL "400"
900 LET mi=NOT PI: LET dbl=mi: LET key=SGN PI: IF mode>=VAL "2" THEN GO TO VAL "920"
901 GO SUB VAL "320": GO TO (VAL "901"+chs)
902 GO TO VAL "2000"
903 GO TO VAL "1500"
904 GO TO VAL "3000"
905 GO TO VAL "960"
906 GO SUB VAL "9500": GO TO VAL "30"
907 GO TO VAL "3300"
908 GO TO VAL "3100"
909 GO TO VAL "4000"
910 GO TO VAL "951"
911 LET key=NOT PI: GO TO VAL "131"
912 GO TO VAL "5000"
913 LET dbl=SGN PI: GO TO VAL "6000"
914 GO TO VAL "3200"
915 LET dbl=SGN PI: GO TO VAL "7000"
916 GO TO VAL "30"
920 GO SUB VAL "320": IF chs=VAL "3" THEN CLS : RANDOMIZE USR r7: GO TO VAL "30"
921 IF chs=VAL "7" THEN GO TO VAL "3100"
922 IF chs=VAL "11" THEN GO TO VAL "5000"
923 IF chs=VAL "5" THEN GO SUB VAL "9500": GO TO VAL "30"
925 GO TO VAL "30"
951 POKE VAL "57990",PEEK VAL "57998": POKE VAL "57989",PEEK VAL "57999": POKE l,PEEK VAL "57992": LET x$="11111111": GO TO VAL "961"
960 POKE VAL "57990",PEEK VAL "57998": POKE VAL "57989",PEEK VAL "57999": POKE l,PEEK VAL "57992": INPUT #0;AT NOT PI,NOT PI;"Input Shade Code: ";x$: IF LEN x$<>VAL "8" THEN GO TO VAL "960"
961 FOR i=SGN PI TO VAL "8": IF x$(i)<"0" OR x$(i)>"1" THEN PRINT #0;AT NOT PI,NOT PI;"Improper Data, Try again! ": PAUSE VAL "90": GO TO VAL "960"
962 POKE (VAL "57970"+i),VAL x$(i): NEXT i: RANDOMIZE USR r16: GO TO VAL "9200"
999 GO TO VAL "30"
1000 LET set=NOT PI: LET bl=NOT PI: IF dbl OR mi THEN LET bl=SGN PI
1002 POKE VAL "57994",NOT PI: POKE VAL "57986",SGN PI: LET xo=VAL "96": LET xf=VAL "159": LET yo=VAL "119": LET yf=VAL "56": LET xl=VAL "63": LET yl=VAL "63": POKE VAL "57998",VAL "128": POKE VAL "57999",VAL "88": GO TO VAL "1009"
1005 POKE VAL "57994",NOT PI: POKE VAL "57986",SGN PI: POKE VAL "57998",VAL "128": POKE VAL "57999",VAL "88": LET set=SGN PI: LET key=NOT PI
1009 LET ks=VAL "0": IF key OR set THEN LET ks=VAL "1"
1010 RANDOMIZE USR r4: PRINT #0;AT NOT PI,NOT PI;"X= ";xo;" to ";xf;TAB VAL "18";"Y= ";yo;" to ";yf,;" Position Window, then Press Fire": PLOT xo,yo: DRAW xf-xo,NOT PI: DRAW NOT PI,yf-yo: DRAW xo-xf,NOT PI: DRAW NOT PI,yo-yf: IF dbl THEN DRAW VAL "(xl+1)/2-1",NOT PI: DRAW NOT PI,(yf-yo)/VAL "2": DRAW (xo-xf)/VAL "2",NOT PI
1015 IF mi THEN DRAW VAL "(xl+1)/2-1",NOT PI: DRAW NOT PI,(yf-yo)
1020 RANDOMIZE USR r10: IF PEEK 57994=1 THEN POKE 57994,NOT PI: POKE VAL "57986",NOT PI: POKE VAL "57990",xo: POKE VAL "57989",yo: POKE VAL "57985",xf: POKE VAL "57987",yf: RETURN
1030 LET dxj=SGN (128-PEEK 57998): LET dyj=SGN (88-PEEK 57999): LET xo=xo-dxj*8: LET yo=yo-dyj*8: POKE 57998,128: POKE 57999,88
1040 IF dxj<>0 OR dyj<>0 THEN GO TO 1110
1050 IF set THEN GO TO 1020
1060 LET c$=INKEY$: IF c$="" THEN GO TO 1020
1065 IF c$>="5" AND c$<="8" AND key=VAL "0" THEN GO TO VAL "1020"
1070 IF c$="L" OR c$="l" OR c$="8" THEN LET xl=xl+8+bl*8
1080 IF c$="L" OR c$="l" OR c$="7" THEN LET yl=yl+8+bl*8
1090 IF c$="S" OR c$="s" OR c$="6" THEN LET yl=yl-8-bl*8
1100 IF c$="S" OR c$="s" OR c$="5" THEN LET xl=xl-8-bl*8
1105 IF NOT key AND xl>yl THEN LET xl=yl
1110 IF xo+xl>255 THEN LET xo=255-xl
1120 IF xo<0 THEN LET xo=0
1130 IF yo-yl<0 THEN LET yo=yl
1140 IF yo>175 THEN LET yo=175
1150 LET xf=xo+xl: IF xf>255 THEN LET xf=255: LET xl=xf-xo
1160 IF xl<7+bl*8 THEN LET xl=7+bl*8: LET xf=xo+xl
1170 LET yf=yo-yl: IF yf<0 THEN LET yf=0: LET yl=yo
1180 IF yl<7+bl*8 THEN LET yl=7+bl*8: LET yf=yo-yl
1185 IF NOT (key OR set) AND xl>yl THEN LET xl=yl
1190 GO TO 1010
1305 IF mode<=VAL "1" THEN RANDOMIZE USR r5: RANDOMIZE USR r1
1310 INPUT "Input X distance. ";x$:
1315 IF PEEK VAL "57998"+VAL x$>VAL "255" OR PEEK VAL "57998"+VAL x$<VAL "0" THEN PRINT #0;AT VAL "1",VAL "0";"X value goes off screen! ": PAUSE VAL "120": GO TO VAL "1310"
1320 INPUT "Input Y distance. ";y$:
1340 IF PEEK VAL "57999"+VAL y$>VAL "175" OR PEEK VAL "57999"+VAL y$<VAL "0" THEN PRINT #0;AT VAL "1",VAL "0";"Y value goes off screen! ": PAUSE VAL "120": GO TO VAL "1320"
1350 INPUT "Input ""Arc"" Command. ";z$
1390 LET ik=atr-8*patr: PLOT INK ik;PEEK VAL "57998",PEEK VAL "57999": DRAW INK ik;VAL x$,VAL y$,VAL z$: GO TO VAL "9200"
1505 RANDOMIZE USR r8
1510 GO SUB VAL "310": PRINT #0;AT VAL "0",VAL "10";"Digitize": PAUSE VAL "50": GO SUB VAL "1000"
1515 LET yf=yf+4
1520 LET rz=INT ((VAL "175"-yo)/VAL "8"): LET cz=INT (xo/VAL "8"): FOR y=yo TO yf STEP -8: LET r=INT ((175-y)/8): FOR x=xo TO xf STEP 8: LET c=INT (x/8): CLS : PRINT AT 0,10;"Digitize";AT 3,2;"Row: ";r-rz+1;AT 3,17;"Column: ";c-cz+1: FOR i=y TO (y-7) STEP -1: POKE VAL "57990",x: POKE VAL "57989",i
1525 RANDOMIZE USR r18
1530 FOR j=0 TO 7: PRINT AT (5+(y-i)*2),(2+j*2);PEEK (57971+j): NEXT j
1540 PRINT AT (5+(y-i)*2),25;PEEK VAL "57979": POKE USR "m"+y-i,PEEK VAL "57979": NEXT i: PRINT AT 0,20;"\m"
1550 PRINT #0;AT NOT PI,NOT PI;"Press C to Copy, any other key to continue Digitize."
1560 PAUSE NOT PI: LET b$=INKEY$: IF b$="C" OR b$="c" THEN GO SUB VAL "9500": CLS
1570 NEXT x: NEXT y: RANDOMIZE USR r6: RANDOMIZE USR r8: RANDOMIZE USR r7: RANDOMIZE USR r6: RANDOMIZE USR r3: OUT 255,mode*2: GO TO VAL "26"
1605 IF mode<=VAL "1" THEN RANDOMIZE USR r5: RANDOMIZE USR r1
1610 INPUT "Input Circle Radius.";x$
1620 IF PEEK VAL "57998"<VAL x$ OR PEEK VAL "57999"<VAL x$ OR (PEEK VAL "57998"+VAL x$)>=VAL "256" OR (PEEK VAL "57999"+VAL x$)>=VAL "176" THEN PRINT #0;AT VAL "1",VAL "0";"Circle goes off screen! ": PAUSE VAL "120": GO TO VAL "1610"
1630 LET ik=atr-VAL "8"*patr: CIRCLE INK ik;PEEK VAL "57998",PEEK VAL "57999",VAL x$: GO TO VAL "9200"
2010 GO SUB VAL "310": PRINT #0;AT NOT PI,VAL "8";"Block Copy: FROM": PAUSE VAL "100": GO SUB VAL "1000": RANDOMIZE USR r6: PRINT #0;AT VAL "0",VAL "8";"Block Copy: TO": PAUSE VAL "100": LET sxo=xo: LET sxf=xf: LET syo=yo: LET syf=yf: GO SUB VAL "1005": POKE VAL "57984",xo: POKE VAL "57983",yo: POKE VAL "57990",sxo: POKE VAL "57989",syo: POKE VAL "57985",sxf: POKE VAL "57987",syf: RANDOMIZE USR r4: RANDOMIZE USR r15: RANDOMIZE USR r4
2020 GO TO VAL "7020"
2100 INPUT #0;AT NOT PI,NOT PI;"File Name ? ";n$: IF n$=" " THEN LET n$=""
2110 RETURN
3010 GO SUB VAL "310": PRINT #0;AT VAL "0",VAL "8";"Block Erase": PAUSE VAL "100": GO SUB VAL "1000": RANDOMIZE USR r4: POKE VAL "57984",VAL "0": RANDOMIZE USR r14
3020 GO TO VAL "7020"
3105 OUT 255,0: CLS : PRINT AT VAL "0",VAL "10";"Start Tape"
3110 OUT VAL "255",VAL "0": GO SUB VAL "2100": LOAD n$SCREEN$
3120 IF mode>=VAL "1" THEN RANDOMIZE USR r5: LOAD n$CODE VAL "24576",VAL "6912": RANDOMIZE USR r6
3130 OUT VAL "255",VAL "2"*mode: GO TO VAL "30"
3210 LET mi=VAL "1": GO SUB VAL "310": PRINT #0;AT VAL "0",VAL "8";"Mirror Image": PAUSE VAL "100": GO SUB VAL "1000": RANDOMIZE USR r4: POKE VAL "57985",xo+(xl+VAL "1")/VAL "2"-VAL "1": RANDOMIZE USR r17: RANDOMIZE USR r4
3220 GO TO VAL "7020"
3310 GO SUB VAL "310": PRINT #0;AT VAL "0",VAL "12";"Inverse": PAUSE VAL "100": GO SUB VAL "1000": RANDOMIZE USR r4: RANDOMIZE USR r19
3320 GO TO VAL "7020"
4005 GO SUB VAL "300": GO SUB VAL "2100": PRINT AT NOT PI,VAL "10";"Start Tape": LOAD n$SCREEN$ : RANDOMIZE USR r7: CLS : PRINT AT VAL "6",NOT PI;"Press: 0 -- to merge the new screen into the old."'TAB VAL "8";"1 -- to merge the old screen into the new."'TAB VAL "8";"2 -- to erase the new screen and return."'TAB VAL "8";"3 -- to erase the old screen and return."
4006 PAUSE VAL "0": LET p$=INKEY$: IF CODE p$<CODE "0" OR CODE p$>CODE "4" THEN : GO TO VAL "4006"
4007 IF CODE p$=CODE "0" THEN RANDOMIZE USR r4: GO TO VAL "4015"
4008 IF CODE p$=CODE "1" THEN RANDOMIZE USR r6: RANDOMIZE USR r8: GO TO VAL "4015"
4009 IF CODE p$=CODE "2" THEN GO TO VAL "136"
4010 IF CODE p$=CODE "3" THEN RANDOMIZE USR r8: CLS : RANDOMIZE USR r1: GO TO VAL "136"
4015 RANDOMIZE USR r7: CLS : RANDOMIZE USR r4: PRINT #0;AT VAL "0",VAL "8";"Picture Merge: FROM": PAUSE VAL "100": GO SUB VAL "1000": RANDOMIZE USR r6: PRINT #0;AT VAL "0",VAL "8";"Picture Merge: TO": RANDOMIZE USR r8: PAUSE VAL "100": LET sxo=xo: LET sxf=xf: LET syo=yo: LET syf=yf: RANDOMIZE USR r7: GO SUB VAL "1005": POKE VAL "57984",xo: POKE VAL "57983",yo: POKE VAL "57990",sxo: POKE VAL "57989",syo: POKE VAL "57985",sxf: POKE VAL "57987",syf: RANDOMIZE USR r6: RANDOMIZE USR r8: RANDOMIZE USR r15: RANDOMIZE USR r4
4020 GO TO VAL "7020"
5010 RANDOMIZE USR r5: RANDOMIZE USR r3: OUT VAL "255",VAL "0": GO SUB VAL "2100": SAVE n$SCREEN$
5020 IF mode>=VAL "1" THEN SAVE n$CODE VAL "24576",VAL "6912"
5030 OUT VAL "255",VAL "2"*mode: GO TO VAL "30"
6010 GO SUB VAL "310": PRINT #0;AT VAL "0",VAL "10";"Wide View": PAUSE VAL "100": GO SUB VAL "1000": RANDOMIZE USR r4: PRINT #0;AT VAL "0",VAL "10";" Working ": POKE VAL "57984",VAL "32"
6020 RANDOMIZE USR r14: RANDOMIZE USR r13: RANDOMIZE USR r4: GO TO VAL "7020"
7010 GO SUB VAL "310": PRINT #0;AT VAL "0",VAL "10";"Close View": PAUSE VAL "100": GO SUB VAL "1000": RANDOMIZE USR r4: POKE VAL "57985",VAL "xo+(xl+1)/2-1": POKE VAL "57987",VAL "yo-(yl+1)/2-1": RANDOMIZE USR r12: RANDOMIZE USR r4
7020 PRINT #0;AT NOT PI,NOT PI;" Save ?"," Press ""Y"" or ""N""",: GO TO VAL "133"
9000 IF chs=VAL "5" OR chs=VAL "6" OR chs=VAL "8" OR chs>=VAL "14" THEN GO SUB VAL "320"
9020 GO TO (VAL "9020"+chs)
9021 GO SUB VAL "75": GO TO VAL "850"
9022 GO SUB VAL "120": GO TO VAL "850"
9023 GO SUB VAL "130": GO TO VAL "850"
9024 GO SUB VAL "72": GO TO VAL "850"
9025 GO TO VAL "1600"
9026 GO TO VAL "1300"
9027 GO SUB VAL "125": GO TO VAL "850"
9028 GO TO VAL "60"
9029 GO SUB VAL "115": GO TO VAL "850"
9030 GO SUB VAL "9100": GO TO VAL "850"
9031 GO SUB VAL "600": GO TO VAL "850"
9032 GO SUB VAL "630": GO TO VAL "850"
9033 GO SUB VAL "700": GO TO VAL "850"
9034 GO TO VAL "30"
9100 IF mode>=VAL "2" THEN RETURN
9105 CLS : PRINT AT 10,NOT PI;"Press 0 for Standard Video Mode 1 for Extended Color Mode"
9110 PAUSE NOT PI: LET p$=INKEY$: IF p$<"0" OR p$>"1" THEN GO TO VAL "9110"
9130 LET mode=VAL p$: IF mode=2 THEN LET mode=matr/2
9140 POKE VAL "57988",mode: CLS : RETURN
9200 PRINT #0;AT NOT PI,NOT PI;" Save ?"," Press ""Y"" or ""N""",
9210 PAUSE NOT PI: LET p$=INKEY$
9230 IF p$="Y" OR p$="y" THEN POKE VAL "57993",p0: PRINT #0;AT NOT PI,NOT PI,,: OUT 255,2*mode: GO TO VAL "26"
9240 RANDOMIZE USR r6: POKE VAL "57993",p0: RANDOMIZE USR r3: OUT 255,2*mode: PRINT #0;AT NOT PI,NOT PI,,: GO TO VAL "26"
9300 IF mode>=VAL "2" THEN ON ERR RESET : STOP
9305 OUT 255,NOT PI: PRINT #0;AT NOT PI,NOT PI;"Error! Error! Error! Error! ": FOR w=VAL "1" TO VAL "100": NEXT w: PRINT #0;AT SGN PI,NOT PI;" Press Enter to Continue "
9310 PAUSE NOT PI: ON ERR RESET : IF INKEY$=CHR$ 13 THEN ON ERR GO TO VAL "9300": GO TO VAL "136"
9320 STOP
9505 GO SUB VAL "9800": PRINT #0;AT NOT PI,NOT PI,,,,
9510 IF pt=VAL "2" THEN GO TO VAL "9600"
9515 IF mode<=VAL "2" THEN COPY : RETURN
9520 RANDOMIZE USR VAL "56150": RETURN
9610 LET cs=VAL "55945": INPUT AT NOT PI,NOT PI;"Input Picture Size. (0 = Small Size, 1 = Large Size): ";sz: POKE cs,NOT sz: LET sz=VAL "0": IF mode>=VAL "2" THEN LET sz=VAL "1"
9615 POKE cs+VAL "1",sz
9620 LET cs=VAL "55977": INPUT AT NOT PI,NOT PI;"Input Number of Bytes to define the Graphics Comnd: ";sz
9630 IF sz THEN POKE cs,sz: FOR w=VAL "1" TO sz: INPUT ("Input Byte ";w;" of ";sz;" ";);gc: POKE cs+w,gc: NEXT w
9635 LET cs=VAL "55997": INPUT AT NOT PI,NOT PI;" Input Number of leading Blank Columns: ";sz: POKE cs,sz+VAL "1"
9640 INPUT AT NOT PI,NOT PI;" Ready? Enter 0 to Abort. Enter 1 to print. ";gc: IF NOT gc THEN RETURN
9650 RANDOMIZE USR VAL "62823": RETURN
9810 PRINT #0;AT NOT PI,NOT PI;"Press 1 for the 2040 Printer 2 for a Full Size Printer "
9830 PAUSE NOT PI: LET p$=INKEY$: IF p$<"1" OR p$>"2" THEN GO TO VAL "9830"
9840 LET pt=VAL p$: RETURN
9991 GO SUB VAL "9998": CLS : RANDOMIZE USR r6: PAUSE VAL "30": POKE VAL "57990",NOT PI: POKE VAL "57985",VAL "255": POKE VAL "57989",VAL "175": POKE VAL "57987",NOT PI: RANDOMIZE USR r19: RANDOMIZE USR r19: PAUSE VAL "90": CLS : PRINT AT 10,NOT PI;" Indicate Paper Color. Press a number (0 to 7)."
9992 PAUSE NOT PI: LET p$=INKEY$: IF p$<"0" OR p$>"7" THEN GO TO VAL "9992"
9993 LET patr=VAL p$: PAPER patr: BORDER patr: INK VAL "9": CLS : LET atr=ATTR (NOT PI,NOT PI): LET p0=atr
9994 LET matr=VAL "6+8*(7-patr)"
9997 RETURN
9998 LET r1=VAL "56000": LET r2=VAL "56014": LET r3=VAL "56031": LET r4=VAL "56045": LET r5=VAL "56057": LET r6=VAL "56069": LET r7=VAL "56081": LET r8=VAL "56093": LET r9=VAL "58000": LET r10=VAL "58509": LET r11=VAL "60656": LET r12=VAL "61077": LET r13=VAL "61666": LET r14=VAL "62304": LET r15=VAL "62497": LET r16=VAL "49386": LET r17=VAL "56243": LET r18=VAL "57148": LET r19=VAL "57667": RETURN
9999 SAVE "PS/GE" LINE VAL "10": SAVE "PS/GE C"CODE 47616,15500: STOP
10 REM Pixel Sketck and Graphic Editor v 2.0\* by S D Lemke 1985 2144 White Oak Wichita, KS 67207
19 PRINT AT VAL "19",NOT PI;" ": LOAD "PS/GE C"CODE
20 DIM a$(2,PI): LET a$(SGN PI,SGN PI TO PI)="On ": LET a$(VAL "2",VAL "1" TO PI)="Off": PAPER VAL "1": BORDER VAL "1": INK VAL "7": CLS : PRINT AT VAL "10",VAL "10";"Stop Tape": FOR j=SGN PI TO PI: FOR i=VAL "20" TO -20 STEP -1: BEEP .001,i+5*j: NEXT i: FOR i=-20 TO VAL "20" STEP VAL "2": BEEP .01,i+VAL "5"*j: NEXT i: NEXT j: GO SUB VAL "9990": PRINT AT VAL "10",NOT PI;"Press 0 for Standard Video Mode 1 for Extended Color Mode 2 for High Resolution Mode"
21 PAUSE NOT PI: LET p$=INKEY$: IF p$<"0" OR p$>"2" THEN GO TO VAL "21"
23 LET mode=VAL p$: POKE VAL "57988",mode: POKE VAL "23609",VAL "10": LET cnct=NOT PI: RANDOMIZE USR VAL "48488": POKE VAL "23606",VAL "84": POKE VAL "23607",VAL "185"
24 IF mode=VAL "2" THEN POKE VAL "57988",matr: LET mode=matr/VAL "2": PRINT AT VAL "14",VAL "10";"Start Tape": LOAD "hi res"CODE : LET atr=NOT PI: LET patr=NOT PI: LET p0=NOT PI: LET r10=VAL "58535": LET r11=VAL "61585"
25 DIM f$(32): LET f$="Active Fctns:": CLS : GO SUB VAL "100": ON ERR GO TO VAL "9300": POKE VAL "57980",SGN PI: POKE VAL "57981",NOT PI: POKE VAL "57982",NOT PI: LET k=NOT PI: LET s=SGN PI: LET pr=k: LET b=k: LET f=b: LET e=b
26 POKE VAL "57993",VAL "atr+64*b+128*f": POKE VAL "57998",NOT PI: POKE VAL "57999",NOT PI: LET L=VAL "22432": POKE VAL "57995",VAL "87": POKE VAL "57996",VAL "160": LET X=NOT PI: LET Y=x
27 POKE VAL "57992",PEEK l: IF PEEK l>=VAL "128" THEN POKE VAL "57997",PEEK l-VAL "128": GO TO VAL "29"
28 POKE VAL "57997",PEEK l+VAL "128"
29 BEEP .05,VAL "50"
30 POKE L,PEEK 57992: POKE 57991,(1-e)*(s+1)
33 RANDOMIZE USR r10: LET l=VAL "256*PEEK 57995+PEEK 57996": PRINT #0;AT 0,0;"X = ";VAL "256*PEEK 57981+PEEK 57998";TAB 22;"Y = ";PEEK 57999;TAB 29;" "'f$: POKE l,PEEK 57997
35 LET buton=PEEK VAL "57994": IF buton AND cnct THEN GO TO VAL "610"
36 IF buton THEN GO TO VAL "150"
40 IF INKEY$="" THEN GO TO 30
45 LET b$=INKEY$: IF b$="e" OR b$="E" THEN GO SUB VAL "125": GO TO VAL "30"
46 IF b$="k" OR b$="K" THEN GO SUB VAL "115": GO TO VAL "30"
50 IF b$>="0" AND b$<="7" THEN LET a=VAL b$: GO SUB VAL "77": GO TO VAL "30"
55 GO TO VAL "840"
60 LET pr=SGN PI: GO SUB VAL "190": GO TO VAL "200"
72 PRINT #0;AT NOT PI,VAL "5";"Indicate Paper Color. ": PAUSE NOT PI: LET p$=INKEY$: IF p$<"0" OR p$>"7" THEN GO TO VAL "72"
73 LET pv=VAL p$: LET matr=VAL "6"+VAL "8"*(VAL "7"-pv): LET p$="Paper = "+p$+" ": GO SUB VAL "160": LET p$=STR$ pv: LET b$="p": IF mode>=VAL "2" THEN LET mode=matr/VAL "2": PAPER pv: BORDER pv: INK VAL "7"-pv: CLS : RETURN
74 LET ik=atr-patr*VAL "8": LET patr=VAL p$(1): LET atr=patr*VAL "8"+ik: POKE VAL "57993",VAL "atr+64*b+128*f": RETURN
75 PRINT #0;AT VAL "0",VAL "5";"Indicate Ink Color. ": PAUSE VAL "0": LET p$=INKEY$: IF p$<"0" OR p$>"7" THEN GO TO VAL "75"
76 LET a=VAL p$
80 LET p$="Ink = "+STR$ a+" ": GO SUB VAL "160": LET atr=patr*VAL "8"+a: POKE VAL "57993",VAL "atr+64*b+128*f"
90 RETURN
100 RANDOMIZE USR VAL "56105": POKE VAL "57993",atr: RANDOMIZE USR r2: IF mode<=VAL "1" THEN OUT 255,2*mode: RETURN
110 RANDOMIZE USR r7: OUT 255,2*mode: RETURN
115 LET k=NOT k: LET p$="Curser: "+a$(VAL "2"-k,VAL "1" TO VAL "3"): GO SUB VAL "160": POKE VAL "57980",VAL "(3*k+1)": RETURN
120 LET b=NOT b: LET p$="Bright: "+a$(VAL "2"-b,VAL "1" TO VAL "3"): GO SUB VAL "160": POKE VAL "57993",VAL "atr+64*b+128*f": RETURN
125 LET e=NOT e: LET p$=" Erase: "+a$(VAL "2"-e,VAL "1" TO VAL "3"): GO SUB VAL "160": IF e THEN LET f$(20 TO 24)="Erase"
126 IF NOT e THEN LET f$(20 TO 24)=" "
127 RETURN
130 LET f=NOT f: LET p$=" Flash: "+a$(VAL "2"-f,VAL "1" TO VAL "3"): GO SUB VAL "160": POKE VAL "57993",VAL "atr+B*64+128*F": RETURN
131 RANDOMIZE USR r5: RANDOMIZE USR r7: RANDOMIZE USR r1: CLS : RANDOMIZE USR r4: OUT 255,0: PRINT #0;AT VAL "0",VAL "11";"Rotate": PAUSE VAL "100": GO SUB VAL "1000": RANDOMIZE USR r4
132 RANDOMIZE USR r9: RANDOMIZE USR r4: GO TO VAL "7020"
133 PAUSE NOT PI: LET p$=INKEY$
135 IF p$="Y" OR p$="y" THEN POKE VAL "57993",p0: RANDOMIZE USR r2: PRINT #0;AT VAL "0",VAL "0";TAB VAL "31": OUT 255,2*mode: GO TO VAL "26"
136 RANDOMIZE USR r6: POKE VAL "57993",p0: RANDOMIZE USR r2: RANDOMIZE USR r3: OUT 255,2*mode: PRINT #0;AT NOT PI,NOT PI,,: GO TO VAL "26"
140 IF A=VAL "13" THEN GO TO VAL "200"
150 LET s=NOT s: LET k=NOT PI: POKE VAL "57980",SGN PI: LET p$=" Plot: "+a$(s+1,1 TO PI): GO SUB VAL "160": IF NOT s THEN LET f$(15 TO 18)="Plot"
151 IF s THEN LET f$(15 TO 18)=" "
152 GO TO VAL "30"
160 PRINT #0;AT NOT PI,NOT PI,,: PRINT #0;AT NOT PI,VAL "5";" ";p$: FOR w=NOT PI TO VAL "100": NEXT w: PRINT #0;AT NOT PI,NOT PI,,: RETURN
190 LET p$=" Print: "+a$(VAL "2"-pr,VAL "1" TO PI): GO SUB VAL "160": POKE VAL "57993",VAL "atr+64*b+128*f": POKE VAL "57990",SGN PI: RETURN
200 ON ERR GO TO 200: PAUSE NOT PI: LET p$=INKEY$: IF CODE p$<=31 THEN LET pr=NOT PI: GO SUB VAL "190": POKE VAL "57997",NOT PI: POKE VAL "57992",VAL "PEEK (256*PEEK 57995+PEEK 57996)": ON ERR GO TO 9300: GO TO VAL "30"
210 IF mode<=1 THEN POKE 57989,CODE p$: RANDOMIZE USR r11: PRINT #0;AT NOT PI,NOT PI;"X = ";PEEK 57998;TAB 22;"Y = ";PEEK 57999,: GO TO 200
220 IF mode>=2 THEN POKE 57989,CODE p$: RANDOMIZE USR r11: PRINT #0;AT NOT PI,NOT PI;"X = ";VAL "256*PEEK 57981+PEEK 57998";TAB 22;"Y = ";PEEK 57999,: GO TO 200
300 PRINT #0;AT NOT PI,NOT PI,,: RANDOMIZE USR r5: RANDOMIZE USR r1: CLS : OUT 255,0: RETURN
310 PRINT #0;AT NOT PI,NOT PI,,: RANDOMIZE USR r7: RANDOMIZE USR r1: CLS : RANDOMIZE USR r4: OUT 255,0: RETURN
320 RANDOMIZE USR r6: RANDOMIZE USR r3: OUT 255,2*mode: RETURN
400 LET lft=VAL "1"
405 IF lft THEN PRINT AT chs+VAL "3",VAL "12";"<= "
406 IF NOT lft THEN PRINT AT chs+VAL "3",VAL "12";" =>"
407 LET lchs=chs: GO TO VAL "500"
410 IF chs<=VAL "0" THEN LET chs=chss
420 IF chs>chss THEN LET chs=VAL "1"
430 IF chs<>lchs THEN PRINT AT lchs+VAL "3",VAL "12";" "
440 GO TO VAL "405"
450 GO TO (VAL "900"+VAL "8100"*lft)
500 LET stk=|(1,1)+|(1,2): IF |(2,1) OR |(2,2) THEN GO TO VAL "450"
510 IF stk=VAL "1" OR stk=VAL "5" OR stk=VAL "9" THEN LET chs=chs-VAL "1"
520 IF stk=VAL "2" OR stk=VAL "6" OR stk=VAL "10" THEN LET chs=chs+VAL "1"
530 IF stk=VAL "4" THEN LET lft=VAL "1"
540 IF stk=VAL "8" THEN LET lft=VAL "0"
550 GO TO VAL "410"
600 LET p$=" Connect: "+a$(cnct+SGN PI,SGN PI TO PI): LET cnct=NOT cnct: GO SUB VAL "160": LET xk1=PEEK VAL "57998": LET yk1=PEEK VAL "57999": IF cnct THEN LET f$(VAL "26" TO VAL "32")="Connect"
601 IF NOT cnct THEN LET f$(VAL "26" TO VAL "32")=" "
602 RETURN
610 PLOT xk1,yk1: DRAW (PEEK VAL "57998")-xk1,(PEEK VAL "57999")-yk1: LET xk1=PEEK VAL "57998": LET yk1=PEEK VAL "57999": POKE VAL "57992",PEEK l: GO TO VAL "30"
630 CLS : PRINT ''''"Press 1-4 to select a Text Font."''TAB VAL "12";"1 -- Standard";TAB VAL "12";"2 -- Bold";TAB VAL "12";"3 -- Modern";TAB VAL "12";"4 -- Italics"
640 PAUSE NOT PI: LET b$=INKEY$: IF b$<="0" OR b$>="5" THEN GO TO VAL "640"
650 CLS : GO TO (VAL "650"+VAL "10"*VAL b$)
660 RANDOMIZE USR VAL "48488": RETURN
670 RANDOMIZE USR VAL "47616": RETURN
680 RANDOMIZE USR VAL "47617": RETURN
690 RANDOMIZE USR VAL "47618": RETURN
700 PRINT ''TAB VAL "10";"Load Font": INPUT "File Name? ";n$: LOAD n$CODE VAL "47700",VAL "768": CLS : RETURN
800 LET mi=NOT PI: LET key=SGN PI: LET dbl=mi: PRINT AT VAL "2",VAL "8";"PS/GE Functions";AT VAL "4",mi;"Ink Color","Block Copy"'"Bright","Digitize"'"Flash","Block Erase"'"Paper Color","Fill (shade)"
810 PRINT AT VAL "8",NOT PI;"Circle","Hard Copy"'"Draw","Inverse"'"Pixel Erase","Screen Load"'"Text","Screen Merge"
820 PRINT AT VAL "12",NOT PI;"Curser Spd.","Paint"'"Video Mode","Block Rotate"'"Connect","Screen Save"'"Change Fonts","Wide View"'"Load Font","Mirror Image"'"Return","Zoom (close)"
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
