--- title: "GYPSY V2" id: 72652 type: "computer_media" slug: "gypsy-v2" url: "http://localhost/computer_media/gypsy-v2/" markdown_url: "http://localhost/computer_media/gypsy-v2.md" published_at: "2026-10-26T23:19:33+00:00" modified_at: "2026-10-27T15:57:45+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/10/gypsy-menu.png" excerpt: "Screen editor with brushes, lines, arcs, circles and ellipses, plus a configurable 9-pin Epson screen copier for four printer interfaces." post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "Jack Dohany" slug: "jack-dohany" taxonomy: "post_tag" url: "http://localhost/tag/jack-dohany/" - 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: "Jack Dohany" slug: "jack-dohany" taxonomy: "indiv" url: "http://localhost/indiv/jack-dohany/" genre: - name: "Graphics" slug: "graphics" taxonomy: "genre" url: "http://localhost/type/graphics/" media_type: "Program" programmers: - name: "Jack Dohany" slug: "jack-dohany" taxonomy: "indiv" url: "http://localhost/indiv/jack-dohany/" download_url: "https://archive.org/download/timex-sinclair-software-archive/GYPSY%20V2%20%281989%29%28Dohany%2C%20Jack%29%28TS2068%29%28US%29%28Program%29.zip" tsrun_member: "GYPSY V2 (1989)(Dohany, Jack)(TS2068)(US)(Program)/GYPSY V2 (1989)(Dohany, Jack)(TS2068)(US)(Program).tap" mediadate: "1989" producer_company: - id: 10976 title: "Jack Dohany" type: "company" url: "http://localhost/company/jack-dohany/" images: - url: "http://localhost/wp-content/uploads/2026/10/gypsy-menu.png" - url: "http://localhost/wp-content/uploads/2026/10/gypsy-edit.png" article_media: - id: 21130 title: "LLIST Graphic Characters" type: "article" url: "http://localhost/article/llist-graphic-characters/" - id: 58876 title: "A Novel Card" type: "article" url: "http://localhost/article/a-novel-card/" media_type_tags: "Graphics" license: false --- # GYPSY V2 A screen editor and screen copier. The editor draws with a cursor moved by joystick or the number keys, in move, write and erase modes. It draws lines and arcs between two marked points, circles and tilted ellipses, and text, and its brushes come in six shapes with an adjustable line pattern and radius. Other commands set the cursor’s step size and limits, colour or clear the screen, and flip it to a negative. The copier dumps any rectangle of the screen to an Epson-type 9-pin printer through a TS2040, AERCO, Tasman B or C, or A&J interface, with settings for size, density, margin, shading and line-feed gap. Screens can be loaded, saved and viewed, the working screen is kept safe in a buffer, and several pages of help screens are built in. REM lines date the program “GYPSY V2 FEB 21,1989” and credit Jack Dohany. The help screens add that the machine code is mostly BASIC compiled with NovelSoft’s TIMACHINE compiler. The original manual from the disk is in the download as a text file. ## Program Analysis ### Structure Line 900 initialises the program: `CLEAR 43500`, the colour settings and the addresses of the machine-code parts. These are the screen buffer at 43500, the print drivers SD3, SD5 and SD9 at 50500, 51200 and 51400, the buffer routines at 65200 and the editor at 52000 and 52012. Lines 10 to 70 show the main menu and act on single keys. Lines 700 to 898 are the help pages, chained through `LET more=...: GO TO 90`. Lines 5000 to 5599 are the screen copier’s parameter screen, which `POKE`s its settings into SD9’s parameter table and checks that the dot count will fit on a printer line before calling `RANDOMIZE USR sd9`. ### Device handling One program serves cassette and four disk systems. Variable `sys` (line 910) picks the system, and the file routines branch with computed jumps such as `GO TO dev+VAL "8211"`, which reaches one of five versions of each `LOAD` and `SAVE` line: cassette, AERCO, Larken, Oliger and Zebra. When `sys` is 0 the “use disc?” question is skipped. ### Notable Techniques - Keys are read by poking LAST_K (23560) to zero and waiting for it to change, with a short `BEEP` as a key click. - `ON ERR GO TO` and `ON ERR RESET`, both TS2068 statements, catch errors from the editor and the disk catalog. - A numeric variable called `if` holds the printer interface number (`LET IF=PEEK (SD3+5)`). - Subroutine and jump targets are kept in variables (`put`, `get`, `flp`, `t`) and the constants 0 and 1 in `z` and `o`, which saves memory. - The backup command saves the BASIC with `LINE 8900` and the whole machine code from 43500 to 65535, screen buffer included. ### Potential Issues - The machine code was saved with its screen buffer, so the editor starts with the last screen edited on the original disk, an UPDATE! magazine logo. - Lines 8800 to 8820 are a memory-peeking loop that nothing calls, apparently left over from debugging. This copy comes from an Oliger (JLO SAFE) disk and was converted for tape: the “/” disk syntax was removed, line 910 now selects cassette, and the reload line 8900 loads the code by name. It was tested in ZEsarUX on a TS2068: the menu, the editor and saving a screen to tape. The download also holds GYPSY V1, Dohany’s earlier version, found on RMG Enterprises’ UPDATES disk of February 1991. It is the AERCO disk version: its menu has fewer options (view, load, save, backup, edit, help, copy and kolor), and its file commands used the AERCO DOS’s `CAT` and `MOVE`. They have been changed to tape `LOAD` and `SAVE`, so screens load and save as `SCREEN$` and the code file is called `gypsy`; the view-catalogue option does nothing on tape. The address in its REM lines was removed. It was tested in ZEsarUX. ## Source Code ``` 1 REM GYPSY V2 FEB 21,1989 2 REM by Jack Dohany 5 GO TO VAL "900" 10 CLS : PRINT INK 9;" *** GYPSY MAIN MENU ***" 15 PRINT ' INK 9; BRIGHT o;" Press "; BRIGHT z;'" e to edit the screen"'" d to see the disc catalog"'" l to load a screen"'" s to save the screen"'" b to save the program"'" h to get HELP" 16 PRINT INK 9;'" m to see this menu"'" v to view the screen"'" f to flip the screen"'" c to copy the screen"'" q to stop the program"'" k to color the screen" 18 PRINT INK 9;'" (screen is safe in a buffer)"''"In case of error, RUN to RESTART" 20 ON ERR RESET : PRINT #z;AT z,z; FLASH z; BRIGHT z; INK 9; PAPER brd;" edit disc load save bkup help menu view flip copy quit kolor " 25 GO SUB 8011 50 IF k$="E" AND warm THEN GO TO VAL "100" 52 IF k$="E" AND NOT warm THEN GO TO VAL "200" 54 IF k$="L" THEN GO TO VAL "300" 55 IF k$="S" THEN GO TO VAL "400" 56 IF k$="K" THEN GO TO VAL "1000" 58 IF k$="B" THEN GO TO VAL "500" 60 IF k$="Q" THEN STOP 62 IF k$="C" THEN GO TO VAL "5000" 64 IF k$="H" THEN GO TO VAL "700" 65 IF k$="V" THEN GO SUB get 66 IF k$="D" THEN LET dev=sys: GO SUB VAL "8100" 67 IF k$="F" THEN GO SUB flp 68 IF k$="" OR k$="M" THEN GO TO t 70 GO TO t+t 90 PRINT #z;"more copy quit" 91 GO SUB VAL "8011" 94 IF k$="C" AND IF>1 THEN RANDOMIZE USR sd5: GO TO 90 95 IF K$="C" AND IF=1 THEN COPY : GO TO VAL "90" 97 IF k$="Q" THEN GO TO HQ 98 CLS : GO TO more 99 REM warm start 100 GO SUB get 110 ON ERR GO TO VAL "150" 120 RANDOMIZE USR 52012 130 INPUT ;: GO SUB put 140 GO TO t+t 150 ON ERR RESET 160 BEEP .1,1: INPUT ;: PRINT #z; FLASH o;" error ": PAUSE VAL "100": GO TO VAL "110" 199 REM cold start 200 ON ERR GO TO VAL "150" 210 GO SUB get 220 RANDOMIZE USR VAL "52000" 230 LET warm=o 240 GO TO VAL "130" 299 REM LOAD 300 LET cds=VAL "16384": LET cdl=VAL "6912" 305 GO SUB VAL "8000": IF k$="" THEN GO TO t+t 310 GO SUB VAL "8020": IF n$="" AND dev THEN GO TO t+t 311 IF dev=2 THEN GO SUB VAL "8030" 315 GO SUB VAL "8220" 320 GO SUB put 330 GO TO t+t 399 REM SAVE 400 LET cds=buf: LET cdl=VAL "6912" 402 GO SUB VAL "8000": IF k$="" THEN GO TO t+t 405 GO SUB VAL "8020": IF n$="" THEN GO TO t+t 410 GO SUB get 420 GO SUB VAL "8320" 430 GO TO t+t 499 REM BACKUP 500 GO SUB VAL "8000": IF k$="" THEN GO TO t+t 505 LET n$="GYPSY": LET asl=VAL "8900": LET cds=buf: LET cdl=VAL "65536"-buf 510 GO SUB VAL "8300" 530 GO SUB VAL "8310" 540 IF dev THEN GO TO t+t 550 PRINT #z;AT z,z;"Verify? y/n" 551 IF INKEY$="" THEN GO TO VAL "551" 552 IF INKEY$<>"Y" AND INKEY$<>"y" THEN GO TO t+t 560 CLS : PRINT AT t,z;"VERIFYING": VERIFY "": VERIFY ""CODE : GO TO t 699 REM HELP 700 LET HQ=T: CLS : PRINT " *** EDITOR COMMAND KEYS *** "''"*ENTER or SPACE: FLIP EDIT MENU"'" m:MOVE mode (harmless cursor)"'" w:WRITE mode"'" e:ERASE mode" 710 PRINT "*1:change mode (= joystick FIRE)"'"*3 to 0/stick: cursor control"''" f:FAST on/off (move ON, h&v=5)"'" b:BRUSH on/off"'"*B:go to BRUSH menu" 720 PRINT '" x:Select cursor hor. position"'" y:Select cursor ver. position"''" h:Select cursor hor. travel"'" v:Select cursor ver. travel" 730 PRINT '" q:return to main menu"''"* means: not shown on edit menus" 740 LET more=750: GO TO 90 750 PRINT "*** MORE EDITOR COMMAND KEYS ***" 752 PRINT '" Z:ZAP SCREEN (CLS)" 754 PRINT " d:go to DRAW menu"'" c:go to CIRCLE menu"'" t:enter TEXT mode"''" s:select SPEED: 0>9 slow>fast" 756 PRINT " l:set LIMITS on cursor travel" 758 PRINT " p:PAUSE on/off (stick only)"'" k:KEYCLICK on/off" 762 PRINT ''" *** BRUSH COMMAND KEYS ***" 764 PRINT '" t:change brush TYPE (+_!/\o)" 766 PRINT " i:INVERT dots of brush line"'" l:redefine brush LINE" 768 PRINT " r:select RADIUS of brush 'o'"''" q:return to edit menu" 770 LET more=772: GO TO 90 772 PRINT " *** DRAW COMMAND KEYS ***" 774 PRINT '" 1:mark POINT 1 (= cursor)"'" 2:mark POINT 2 (= cursor)"''" 3:Draw line (or arc if deg>0)"'" from point 1 to point 2"''" 4:draw line (or arc if deg>0)"'" from point 2 to point 1" 776 PRINT '" d:set DEGREES (0-360) of arc"'"*R:set RADIANS (0-2) of arc" 778 PRINT '" i:INFORMATION on p1,p2,d & R" 780 PRINT '" q:return to edit menu" 782 PRINT '"NOTE: start with SMALL values"'"for d or R; 20 degrees or"'".5 radians." 790 LET more=800: GO TO 90 800 PRINT " *** CIRCLE COMMAND KEYS ***" 802 PRINT '" 0:mark CENTER (= cursor)"'" 1:mark HORIZONTAL RADIUS"'" (= center to cursor)" 804 PRINT " 2:mark VERTICAL RADIUS"'" (= center to cursor)" 810 PRINT '" c:draw CIRCLE using center & hr" 812 PRINT '" e:draw ELLIPSE using center,"'" hr, vr, degrees & p" 814 PRINT '" d:set DEGREES for ellipse"'" (0-360 tilt)"'" p:set PRECISION for ellipse"'" (p1=fast,few dots > p8=slow)" 816 PRINT '" i:INFORMATION (hr, vr, deg & p)" 820 PRINT '" q:return to edit menu" 829 LET more=830: GO TO 90 830 PRINT "EXAMPLE: DRAWING A LINE" 832 PRINT '"At edit menu:"''"-Select MOVE mode."'"-Move cursor to a point 'p1'."'"-Press d 1 q." 834 PRINT '"-Move cursor to a point 'p2'."'"-Press d 2 3 y to draw a line"'" from 'p1' to 'p2'." 836 PRINT '"Note: all values remain the same"'"until you change them." 838 PRINT '"Thus you can change just one"'"point, and draw a line between"'"the 'old' point and the 'new'"'"point, in either direction." 839 LET more=840: GO TO 90 840 PRINT "EXAMPLE: DRAWING A CIRCLE" 842 PRINT '"At edit menu:"''"-Move cursor to desired center." 844 PRINT "-Press c 0 q."''"-Move cursor (in any direction)"'" to desired radius point."'"-Press c 1 c y." 846 PRINT ''"Notes:"'"-If the circle would go off"'" screen, it won't be drawn." 847 PRINT "-All values remain the same"'" until you change them." 848 PRINT "-To draw same size circle else-"'" where, just change center."'"-To draw concentric circles,"'" just change radius 'hr'." 849 LET more=850: GO TO 90 850 PRINT "EXAMPLE: DRAWING AN ELLIPSE" 852 PRINT '"From edit menu:"''"-Move cursor to desired center." 854 PRINT "-Press c 0 q."''"-Move cursor (in any direction)"'" to desired hor. radius point." 856 PRINT "-Press c 1 q." 858 PRINT '"-Move cursor (in any direction)"'" to desired vert. radius point."'"-Press c 2 e y." 860 PRINT '"NOTES:"'"If ellipse would exceed LIMITS,"'"as much of ellipse will be drawn"'"as possible."''"(more notes follow)" 869 LET more=870: GO TO 90 870 PRINT "MORE ELLIPSE NOTES"''"Before pressing e to draw an"'"ellipse, you may wish to alter"'"values of DEGREES and/or"'"PRECISION, by pressing d or p." 872 PRINT '"DEGREES: a positive value from"'"0 to 360, governing TILT of"'"ellipse from horizontal axis." 874 PRINT '"PRECISION: a positive value from"'"1 to 8 governing how many points"'"will be plotted."''"A precision of 1 means the"'"ellipse will be drawn as quickly"'"as possible, with few dots." 876 PRINT '"All values remain the same"'"until you change them." 879 LET more=880: GO TO 90 880 PRINT TAB 8;"*** BRUSHES ***"''"There are 6 brush types:"''"1 with 2 lines: +"'"4 with 1 line: ! - / \ "'"1 with a radius: o (a circle)." 881 PRINT '"A brush works only in WRITE and"'"ERASE mode. The LINE pattern is"'"applied only is WRITE mode. In"'"ERASE mode the line is used as"'"though it were all 0's." 882 PRINT '"Radius of brush 'o': 0 to 50"'"Line length (others): 2 to 25" 885 PRINT TAB 6;" Please experiment! "'"A great many effects can be"'"gotten by using different brush"'"types, line patterns and various"'"values of h (horizontal travel)"'"and v (vertical travel)." 886 LET more=887: GO TO 90 887 PRINT " *** THE KOLOR MENU ***"''"Press b p i B f o I to change"'"any permanent screen attribute."''"Any changes will be used in all"'"subsequent screen activity." 888 PRINT '"Press a to apply any PAPER,"'"INK, BRIGHT or FLASH changes to"'"the entire existing screen."''"press Z to clear the screen"'"using any changes."''"Press q to return to main menu." 890 LET more=VAL "891": GO TO VAL "90" 891 PRINT " *** GYPSY MEMORY USAGE ***" 893 PRINT '"52000-65535 gypsy code"''"50500-51999 print drivers"''"43500-50411 screen buffer" 894 PRINT '"26710-43499 GYPSY basic" 896 PRINT '"The gypsy machine code is mostly"'"compiled BASIC. Source available"'"upon request. Thanks be to"'"NOVELSOFT for the TIMACHINE"'"compiler." 897 PRINT '"Jack Dohany 415-367-7781" 898 LET more=VAL "700": GO TO 90 899 REM INIT 900 CLEAR 43500 901 LET z=0: LET o=1: LET t=10 910 LET sys=0: LET dev=sys: REM 0=cas,1=aer,2=larken,3=oliger,4=zebra 920 DIM n(8): LET n(1)=480: LET n(2)=960: LET n(3)=960: LET n(4)=1280: LET n(5)=640: LET n(6)=576: LET n(7)=720: LET n(8)=1280 930 POKE 23658,z: LET warm=z 940 LET brd=6: LET pap=7: LET ink=0: LET brt=0: LET fla=0: LET ovr=0: LET inv=0 950 BORDER brd: PAPER pap: INK ink: BRIGHT brt: FLASH fla: OVER ovr: INVERSE inv 960 LET key=VAL "23560": LET buf=VAL "43500": LET sd3=VAL "50500": LET sd5=VAL "51200": LET sd9=VAL "51400": LET sd14=VAL "65200" 965 LET IF=PEEK (SD3+5) 970 LET put=VAL "2000": LET get=put+o: LET flp=get+o 980 POKE (sd3+6),o: RANDOMIZE USR sd3 990 GO TO t 1000 INPUT ; 1005 PRINT #z;AT z,z; FLASH z; BRIGHT z; PAPER brd; INK 9;"border";brd;" "; PAPER pap; INK 9;"paper";pap; PAPER brd;" "; PAPER ink; INK 9;"ink";ink; PAPER brd;" "; BRIGHT brt;"Bright";brt; BRIGHT z;" ZAP" 1010 PRINT #z;AT o,z; FLASH z; BRIGHT z; PAPER brd; INK 9;"quit "; FLASH fla;"flash"; FLASH z;fla;" ";"over";ovr;" "; INVERSE inv;"Inv"; INVERSE z;inv;" apply" 1020 POKE key,z 1021 IF NOT PEEK key THEN GO TO 1021 1025 BEEP .002,t 1030 LET k$=CHR$ PEEK key 1050 IF k$="b" THEN GO TO 1100 1052 IF k$="p" THEN GO TO 1110 1054 IF k$="i" THEN GO TO 1120 1056 IF k$="B" THEN LET brt=NOT brt: BRIGHT brt: GO TO 1005 1058 IF k$="f" THEN LET fla=NOT fla: FLASH fla: GO TO 1010 1060 IF k$="o" THEN LET ovr=NOT ovr: OVER ovr: GO TO 1010 1062 IF k$="I" THEN LET inv=NOT inv: INVERSE inv: GO TO 1010 1064 IF k$="Z" THEN RANDOMIZE USR 65220: CLS : GO TO 1000 1066 IF k$="q" THEN GO TO 20 1068 IF k$="a" THEN GO TO 1080 1070 GO TO VAL "1000" 1080 LET k=z 1081 IF ink<8 THEN LET k=ink 1082 IF pap<8 THEN LET k=k+8*pap 1083 LET k=k+64*brt 1084 LET k=k+128*fla 1085 GO SUB get 1087 FOR i=22528 TO 23295: POKE i,k: NEXT i 1090 GO SUB put: GO TO VAL "1000" 1100 LET brd=brd+o: IF brd>7 THEN LET brd=z 1102 BORDER brd: GO TO VAL "1005" 1110 LET pap=pap+o: IF pap>9 THEN LET pap=z 1111 IF pap<8 AND pap=ink THEN LET ink=7-pap 1112 PAPER pap: INK ink: GO TO VAL "1005" 1120 LET ink=ink+o: IF ink>9 THEN LET ink=z 1121 GO TO VAL "1111" 2000 LET x=z: GO TO VAL "2003" 2001 LET x=2: GO TO VAL "2003" 2002 LET x=4 2003 RANDOMIZE buf: RANDOMIZE USR (x+sd14): RETURN 5000 LET tas=sd3+598: LET tb=VAL "16": CLS : PRINT TAB 5;"*** SCREEN COPIER ***" 5005 PRINT '" parameters values" 5010 PRINT " 0: Interface"'" 1: Linefeed"'" 2: From Line"'" 3: To Line"'" 4: From Column"'" 5: To Column" 5012 PRINT " 6: Left Margin"'" 7: Horiz Size"'" 8: Density"'" 9: Vert Size"'"10: Shading"'"11: Autostop"'"12: LF SIZE" 5015 PRINT '" ----------commands------------" 5020 PRINT " Copy screen","View screen"'" Kopy menu","Flip screen"'" Quit","HELP" 5030 GO SUB VAL "5095" 5035 LET lf=PEEK (sd3+9): PRINT AT 4,tb;"YES" AND lf;"NO " AND NOT lf 5040 FOR i=3 TO t: PRINT AT VAL "2"+i,tb;PEEK (sd9+i);" ": NEXT i 5041 PRINT AT VAL "13",tb;"YES" AND PEEK (sd9+11);"NO " AND NOT PEEK (sd9+11) 5042 PRINT AT VAL "14",tb;PEEK (sd9+12) 5045 PRINT AT VAL "15",tb;PEEK (sd9+220);"/216""";" " 5049 PLOT z,z: DRAW z,175: DRAW 255,z: DRAW z,-175: DRAW -255,z 5050 INPUT "Parameter/Command: ";k$: IF k$="" THEN GO TO VAL "5000" 5051 IF k$(o)>="a" AND k$(o)<="z" THEN LET k$(o)=CHR$ (CODE k$(o)-VAL "32") 5052 IF k$(o)="V" THEN GO TO VAL "5200" 5054 IF k$(o)="F" THEN GO TO VAL "5300" 5055 IF k$(o)="H" THEN GO TO VAL "6000" 5056 IF k$(o)="K" THEN LET x=z: GO TO VAL "5500" 5058 IF k$(o)="Q" THEN GO TO t 5060 IF k$(o)="C" THEN LET x=o: GO TO VAL "5500" 5070 FOR i=o TO LEN k$: IF k$(i)<"0" OR k$(i)>"9" THEN GO TO VAL "5000" 5071 NEXT i: LET k=VAL k$: IF k12 THEN GO TO VAL "5000" 5072 GO TO VAL "5100"+k 5090 IF if=3 AND PEEK tas=191 THEN POKE tas,251: GO TO VAL "5095" 5091 POKE tas,191: POKE (sd3+5),if+o 5095 LET if=PEEK (sd3+5): IF if>4 THEN LET if=o: POKE (sd3+5),if 5096 PRINT AT 3,tb;"2040" AND if=o;"Aerco" AND if=2;"Tasman " AND if=3;"B" AND if=3 AND PEEK tas=191;"C" AND if=3 AND PEEK tas=251;"A&J" AND if=4;TAB 30;: RETURN 5100 GO SUB VAL "5090": GO TO VAL "5050" 5101 POKE (sd3+9),NOT lf: GO TO VAL "5035" 5102 LET k1=z: LET k2=23: LET m$="From Line": GO TO VAL "5150" 5103 LET k1=z: LET k2=23: LET m$="To Line": GO TO VAL "5150" 5104 LET k1=z: LET k2=31: LET m$="From Column": GO TO VAL "5150" 5105 LET k1=z: LET k2=31: LET m$="To Column": GO TO VAL "5150" 5106 LET k1=z: LET k2=79: LET m$="Left Margin": GO TO VAL "5150" 5107 LET k1=o: LET k2=9: LET m$="Horiz Size": GO TO VAL "5150" 5108 LET k1=z: LET k2=7: LET m$="Density": GO TO VAL "5150" 5109 LET k1=o: LET k2=4: LET m$="Vertical Size": GO TO VAL "5150" 5110 POKE (sd9+11),NOT PEEK (sd9+11): GO TO VAL "5040" 5111 LET k1=z: LET k2=2: LET m$="Autostop": GO TO VAL "5150" 5112 LET k=219: LET k1=o: LET k2=50: LET m$="LF Size [norm 23] ": GO TO VAL "5150" 5150 INPUT (m$;"(";k1;"-";k2;"): "); LINE k$: IF k$="" THEN GO TO VAL "5000" 5151 FOR i=o TO LEN k$: IF k$(i)<"0" OR k$(i)>"9" THEN GO TO VAL "5150" 5152 NEXT i: LET x=VAL k$: IF xk2 THEN GO TO VAL "5150" 5153 POKE (sd9+k+o),x: GO TO VAL "5040" 5200 GO SUB get 5210 GO SUB VAL "8011": GO TO VAL "5000" 5300 GO SUB flp: GO TO VAL "5210" 5500 REM error tests 5502 LET fl=PEEK (sd9+3): LET tl=PEEK (sd9+4): LET fc=PEEK (sd9+5): LET tc=PEEK (sd9+6) 5504 IF fc>tc THEN PRINT #z;AT z,z;"ERROR: From-col > To-col": GO TO VAL "5599" 5506 IF fl>tl THEN PRINT #z;AT z,z;"ERROR: From-line > To-line": GO TO VAL "5599" 5510 LET nmax=n(o+PEEK (sd9+9)): LET ndots=(12*PEEK (sd9+7))+(8*(o+tc-fc)*PEEK (sd9+8)) 5520 IF ndots<=nmax THEN GO TO 5550 5522 PRINT AT 17,o;ndots;" > ";nmax;TAB 31;AT 18,o;"-reduce Lmarg/To-col/Hor-size";AT 19,o;"-or increase From-col/Density ";AT 20,o;"OVERFLOW. TRY ANYHOW? y/n " 5525 GO SUB 8011: IF k$<>"Y" THEN GO TO VAL "5000" 5550 IF x THEN GO SUB get 5555 POKE (sd3+6),z 5556 POKE (sd3+9),z: POKE (sd9+2),z: IF lf THEN POKE (sd9+2),t 5560 RANDOMIZE USR sd9 5561 POKE (sd3+6),o: POKE (sd3+9),lf 5570 GO TO VAL "5000" 5599 PAUSE VAL "300": GO TO VAL "5000" 6000 LET HQ=VAL "5000": CLS : PRINT TAB 6;"*** COPY-HELP ***"'"To select a COMMAND, type its"'"first letter, then press ENTER." 6002 PRINT '"To modify a PARAMETER, type"'"0 to 12, then press ENTER." 6004 PRINT '"-----PARAMETER DEFINITIONS------"'"0 indicates your interface."''"1 (linefeed) should be NO if the"'"printer supplies its own LF." 6005 PRINT '"2 to 5 describe a rectangular"'"area of the screen to be copied."''"6 specifies left margin." 6006 PRINT '"7 governs horiz. magification."''"8 governs horiz. dot spacing, by"'"selecting a bit-image mode." 6009 LET MORE=VAL "6010": GO TO VAL "90" 6010 PRINT "9 governs vert. magnification."''"10 Shading can be used for"'"copying colored screens." 6012 PRINT '"11 Autostop:"'"-If 0, no lines are skipped."''"-If 1, blank lines at bottom of"'" 21-line screen are skipped."''"-If 2, blank lines at bottom of"'" 23-line screen are skipped." 6014 PRINT '"12 LF Size governs the GAP"'"between screen lines as they are"'"copied to paper. A value of 23"'"generally works best, but other"'"values may work better on your"'"printer." 6019 LET MORE=VAL "6020": GO TO VAL "90" 6020 PRINT "The FLIP command inverts all"'"screen pixels, but leaves"'"attributes unchanged." 6022 PRINT '"This turns a positive image into"'"a negative, and vice-versa." 6028 LET MORE=VAL "6000": GO TO VAL "90" 6029 GO SUB VAL "8010" 6030 GO TO VAL "5000" 8000 IF sys=z THEN RETURN 8001 PRINT #z;AT z,z;"Use ";"cassette" AND NOT dev;"Aerco" AND dev=o;"Larken" AND dev=2;"Oliger" AND dev=3;"Zebra" AND dev=4;" disc" AND dev;"? (y/n)": GO SUB VAL "8011": IF k$="Y" THEN GO TO 8005 8002 IF k$<>"N" THEN LET k$="": RETURN 8003 IF dev=sys THEN LET dev=z: GO TO VAL "8001" 8004 LET dev=sys: GO TO VAL "8001" 8005 IF dev=1 THEN OUT 244,1 8006 IF dev=2 THEN REM 8008 RETURN 8009 REM GET KEY 8010 PRINT #z;AT z,z;m$;" "; FLASH o;">" 8011 POKE key,z 8012 IF NOT PEEK key THEN GO TO VAL "8012" 8013 LET k$=CHR$ PEEK key 8014 INPUT ;: BEEP VAL ".002",t 8015 IF k$>="A" AND INKEY$<>"" THEN GO TO VAL "8015" 8016 IF k$>="a" AND k$<="z" THEN LET k$=CHR$ (CODE k$-VAL "32") 8017 IF k$=CHR$ 13 THEN LET k$="" 8018 RETURN 8019 REM GET NAME 8020 INPUT "File name: ";n$: RETURN 8030 FOR i=o TO LEN n$: IF n$(i)="." THEN RETURN 8031 NEXT i: LET n$=n$+".CD": RETURN 8099 REM CAT 8100 ON ERR GO TO VAL "8190" 8105 GO TO 8110+10*dev 8110 RETURN 8120 BORDER pap: GO TO VAL "8190" 8130 CLS 8140 RETURN 8150 RETURN 8190 ON ERR RESET 8191 BORDER brd 8192 RETURN 8209 REM LOAD CODE 8210 GO TO dev+VAL "8211" 8211 LOAD n$CODE cds,cdl: RETURN 8212 LET k$=n$+".BIN"","+STR$ cds: RETURN 8213 LOAD n$CODE cds,cdl: RETURN 8214 LOAD n$CODE cds,cdl: RETURN 8215 LOAD *n$CODE cds,cdl: RETURN 8219 REM LOAD SCREEN$ 8220 GO TO dev+VAL "8221" 8221 LOAD n$SCREEN$ : RETURN 8222 LET k$=n$+".SCR"",": RETURN 8223 LOAD n$SCREEN$ : RETURN 8224 LOAD n$SCREEN$ : RETURN 8225 LOAD *n$SCREEN$ : RETURN 8299 REM SAVE 8300 GO TO dev+VAL "8301" 8301 SAVE n$ LINE asl: RETURN 8302 LET k$=n$+".BAS"","+STR$ asl: MOVE "k$",: RETURN 8303 SAVE n$+".BA" LINE asl: RETURN 8304 SAVE n$ LINE asl: RETURN 8305 SAVE *n$ LINE asl: RETURN 8309 REM SAVE CODE 8310 GO TO dev+VAL "8311" 8311 SAVE n$CODE cds,cdl: RETURN 8312 LET k$=n$+".BIN"","+STR$ cds+","+STR$ cdl: MOVE "k$",: RETURN 8313 SAVE n$+".CD"CODE cds,cdl: RETURN 8314 SAVE n$CODE cds,cdl: RETURN 8315 SAVE *n$CODE cds,cdl: RETURN 8319 REM SAVE SCREEN$ 8320 GO TO dev+VAL "8321" 8321 SAVE n$SCREEN$ : RETURN 8322 LET k$=n$+".SCR"",": MOVE "k$",: RETURN 8323 SAVE n$+".CD"SCREEN$ : RETURN 8324 SAVE n$SCREEN$ : RETURN 8325 SAVE *n$SCREEN$ : RETURN 8800 INPUT x 8810 PRINT x;" ";PEEK x;TAB 12;CHR$ PEEK x AND PEEK x>31 8820 LET x=x+1: GO TO 8810 8899 REM RELOAD 8900 CLEAR 43499: LOAD "GYPSY"CODE 43500: RUN 8905 GO SUB VAL "8210" 8910 RUN ```