8070 IF COMAND$="r" THEN RADIUS=SQR((CURSOR1X-CURSOR2X)^2+(CURSOR1Y-CURSOR2Y)^2):CIRCLE (CURSOR1X,CURSOR1Y),RADIUS,COLOR.
8080 IF COMAND$="d" THEN MIDX=(CURSOR1X+CURSOR2X)/2:MIDY=(CURSOR1Y-CURSOR2Y)/2:RADIUS=SQR((CURSOR1X-MIDX)^2+(CURSOR1Y-MIDY)^2):CIRCLE(MIDX,MIDY),RADIUS,COLOR.
8090 IF COMAND$="e" THEN AXIS1=ABS(CURSOR2Y-CURSOR1Y): AXIS2=ABS(CURSOR2X-CURSOR1X): IF AXIS1/AXIS2>1 THEN CIRCLE(CURSOR2X,CURSOR1Y),AXIS1,COLOR.,,,AXIS1/AXIS2 ELSE CIRCLE (CURSOR2X,CURSOR1Y),AXIS2,COLOR.,,, AXIS1/AXIS2
8095 if comand$="e" or comand$="r" or comand$="e" then mode=oldmode
8100 IF CURSOR1SHOW THEN GOSUB 24700
8110 IF CURSOR2SHOW THEN GOSUB 24720
8600 RETURN
9000 '
9001 ' select pattern
9002 '
9003 ' reads 1 digits
9004 ' returns to previous mode
9010 message$="Pick 0-9":gosub 27000:for delay=1 to delaysize:next:gosub 27500
10003 ' move curser with arrow keys into area to fill
10010 GOSUB 23010
10020 IF NOT INSERT THEN 10600
10025 message$="Pick Border 0-3":gosub 27000:for delay=1 to delaysize:next:gosub 27500
10030 IF CURSOR1SHOW THEN GOSUB 24700
10040 BKGD$=INKEY$: WHILE LEN(BKGD$)=0 AND STRIG(3)=0: BKGD$=INKEY$:WEND:BKGD=VAL(BKGD$):IF BKGD$="" THEN BKGD=COLOR.
10050 IF PATTERN=1 THEN PAINT(CURSOR1X,CURSOR1y),0,BKGD ELSE PAINT(CURSOR1X,CURSOR1y),PATTERNS$(PATTERN),BKGD
10060 IF CURSOR1SHOW THEN GOSUB 24700
10600 RETURN
11000 '
11001 ' pen
11002 '
11003 ' set up angle and length of nib using cursors as for drawing
11004 ' lines - drawing mode beginbs after pressing second insert
11005 ' press delete at any time to restart
11006 ' when drawing move pen with arrow keys, insets toggles draw mode
11007 '
11010 GOSUB 23010 'move cursors
11020 IF DELETE. THEN CURCURSOR=0: INSCNT=0: BASEINS=0: IF CURSOR2SHOW THEN GOSUB 24720:CURSOR2SHOW=FALSE:GOTO 11600 ELSE GOTO 11600
11030 IF NOT INSERT THEN 11100
11040 INSCNT=BASEINS+(INSCNT+1) MOD 2
11050 IF INSCNT=1 THEN CURCURSOR=1: CURSOR2X=CURSOR1X:CURSOR2Y=CURSOR1Y
11060 IF INSCNT=0 THEN BASEINS=2: CURCURSOR=0: XSTEP=CURSOR2X-CURSOR1X:YSTEP=CURSOR2Y-CURSOR1Y: IF CURSOR2SHOW THEN GOSUB 24720:CURSOR2SHOW=FALSE
11100 IF INSCNT<>3 THEN 11600
11110 IF CURSOR1SHOW THEN GOSUB 24700
11120 LINE (CURSOR1X,CURSOR1Y) - STEP (XSTEP,YSTEP), COLOR.
11130 IF CURSOR1SHOW THEN GOSUB 24700
11600 RETURN
12000 '
12001 ' air brush
12002 '
12003 ' sprays part of current pattern onto screen
12004 ' move spray with arrow keys
12005 ' insert toggles spray/ don't spray
12006 '
12010 GOSUB 23010
12020 IF INSERT THEN PLOT=NOT PLOT
12030 IF NOT PLOT THEN 12600
12040 ANDPOS=CURSOR1X MOD RESOLUTION: IF RESOLUTION =4 THEN ANDPOS=ANDPOS*2
12050 FOR POSITION = 1 TO 8
12060 VALUE= (ASC(MID$(PATTERNS$(PATTERN),1+(CURSOR1Y+POSITION) MOD LEN(PATTERNS$(PATTERN)),1)))*2^ANDPOS
12070 PUSHEDVALUE=(VALUE AND &HFF) / 256
12080 VALUE=(VALUE AND &HFF) OR PUSHEDVALUE:VALUE = VALUE AND &HFFFF
12090 IF RESOLUTION=8 THEN VALUE=FNSM(VALUE) AND FNSM(SPRAYHIGH(POSITION)) ELSE VALUE = (FNSM(VALUE) AND FNSM(FNSM(SPRAYMED(2,POSITION)))+(FNSM(VALUE)) AND FNSM(SPRAYMED(1,POSITION))) *256:IF VALUE > 32766 THEN VALUE=FNSM(VALUSE)
12100 PATTERN%(2+POSITION)=VALUE
12110 NEXT
12120 IF CURSOR1SHOW THEN GOSUB 24700
12130 IF (CURSOR1X>=0) AND (CURSOR1X<(MAXXRES-PATTERN%(1)*RESOLUTION /8)) AND (CURSOR1Y>=0) AND (CURSOR1Y<MAXYRES-PATTERN%(2)) THEN PUT (CURSOR1X,CURSOR1Y),PATTERN%,OR
12140 IF CURSOR1SHOW THEN GOSUB 24700
12600 RETURN
13000 '
13001 ' cut a figure for pasting or copying
13002 '
13003 ' position cursors of corners of area to cut
13004 ' press ' ' to cut
13005 '
13010 GOSUB 23010 ' move cursors
13020 IF INSERT THEN INSCNT=INSCNT+1: IF INSCNT=1 THEN CURSOR2X=CURSOR1X: CURSOR2Y=CURSOR1Y:CURCURSOR=1:GOTO 13600 ELSE CURCURSOR=1:GOTO 13600
13030 IF DELETE. THEN CURCURSOR=0: GOTO 13600
13040 IF INSCNT<2 THEN 13600
13050 IF (CURSOR1X<0) OR (CURSOR1X>MAXXRES) OR (CURSOR1Y<0) OR (CURSOR1Y>MAXYRES) OR (CURSOR2X<0) OR (CUROSR2X>MAXXRES) OR (CURSOR2Y<0) OR (CURSOR2Y>MAXYRES) THEN 13600
13060 IF CURSOR2X< CURSOR1X THEN OLDCUTX=CURSOR2X ELSE OLDCUTX=CURSOR1X
13070 IF CURSOR2Y < CURSOR1Y THEN OLDCUTY=CURSOR2Y ELSE OLDCUTY=CURSOR1Y
14003 ' copy maxtix to cursor location xor until insert pressed
14004 ' then store
14005 '
14010 GOSUB 23010 ' move cursor
14020 IF LEN(COMAND$)<>2 OR CUT%(1)=0 THEN 14600
14030 IF INSERT THEN 14200
14040 IF (CURCUTX=OLDCUTX) AND (CURCUTY=OLDCUTY) THEN 14060
14050 IF CUTSHOW THEN PUT(CURCUTX,CURCUTY),CUT%:CUTSHOW=FALSE
14060 IF (CURSOR1X=OLDCUTX) AND (CURSOR1X=OLDCUTY) THEN 14600
14070 IF (CURSOR1X>=0) AND (CURSOR1X < (MAXXRES-CUT%(1)*RESOLUTION/8)) AND (CURSOR1Y>=0) AND (CURSOR1Y<MAXYRES-CUT%(2)) THEN PUT(CURSOR1X,CURSOR1Y),CUT%:CUTSHOW=TRUE
14080 CURCUTX=CURSOR1X:CURCUTY=CURSOR1Y
14090 GOTO 14600
14200 IF NOT((CURSOR1X>=0) AND (CURSOR1X < (MAXXRES-CUT%(1)*RESOLUTION/8)) AND (CURSOR1Y>=0) AND (CURSOR1Y<MAXYRES-CUT%(2))) THEN 14600
14210 IF CUTSHOW AND (CURCUTX<>OLDCUTX) AND (CURCUTY<>OLDCUTY) THEN PUT(CURCUTX,CURCUTY),CUT%
14220 PUT (CURSOR1X,CURSOR1Y),CUT%,PSET:CURSOR1SHOW=FALSE:OLDCUTX=CURSOR1X:OLDCUTY=CURSOR1Y:CUTSHOW=TRUE
14600 RETURN
15000 '
15001 ' move
15002 '
15003 ' same as copy but last drawn cut is erased
15004 '
15005 '
15010 GOSUB 23010 ' move cursor
15020 IF LEN(COMAND$)<>2 OR CUT%(1)=0 THEN 15600
15030 IF INSERT THEN 15200
15040 IF (CURCUTX=OLDCUTX) AND (CURCUTY=OLDCUTY) THEN 15060
15050 IF CUTSHOW THEN PUT(CURCUTX,CURCUTY),CUT%:CUTSHOW=FALSE
15060 IF (CURSOR1X=OLDCUTX) AND (CURSOR1X=OLDCUTY) THEN 15600
15070 IF (CURSOR1X>=0) AND (CURSOR1X < (MAXXRES-CUT%(1)*RESOLUTION/8)) AND (CURSOR1Y>=0) AND (CURSOR1Y<MAXYRES-CUT%(2)) THEN PUT(CURSOR1X,CURSOR1Y),CUT%:CUTSHOW=TRUE
15080 CURCUTX=CURSOR1X:CURCUTY=CURSOR1Y
15090 GOTO 15600
15200 PUT (OLDCUTX,OLDCUTY),CUT%
15210 IF NOT((CURSOR1X>=0) AND (CURSOR1X < (MAXXRES-CUT%(1)*RESOLUTION/8)) AND (CURSOR1Y>=0) AND (CURSOR1Y<MAXYRES-CUT%(2))) THEN 15600
15220 IF CUTSHOW AND (CURCUTX<>OLDCUTX) AND (CURCUTY<>OLDCUTY) THEN PUT(CURCUTX,CURCUTY),CUT%
15230 PUT (CURSOR1X,CURSOR1Y),CUT%,PSET:CURSOR1SHOW=FALSE:OLDCUTX=CURSOR1X:OLDCUTY=CURSOR1Y:CUTSHOW=TRUE
15600 RETURN
21000 '
21001 'set up
21002 '
21010 FOR KEY. = 1 TO 10: KEY KEY.,"": NEXT :' disable function keys
21020 DIM CURSOR1%(6) : FOR POSTION=1 TO 6: READ CURSOR1%(POSTION):NEXT 'arrow
21030 DIM CURSOR2%(6) : FOR POSTION=1 TO 6: READ CURSOR2%(POSTION):NEXT
21140 FOR POSITION=1 TO 8: READ SPRAYHIGH(POSITION):NEXT
21150 FOR POSITION=1 TO 8: READ SPRAYMED(1,POSITION),SPRAYMED(2,POSITION):NEXT
21200 CLS
21210 PRINT
21220 PRINT " Joystick/Keyboard "
21230 PRINT " Color draw "
21240 PRINT " Based on drawing program "
21250 PRINT " designed by "
21260 PRINT " Michael L. Hyman."
21270 PRINT " in his ";CHR$(34);"Advanced IBM PC Graphics";CHR$(34)
21280 PRINT " To activate Joystick control "
21290 PRINT " and to center joystick hit J "
21295 print " Menu is activated by M, deactivated by N"
21300 WHILE INKEY$="":WEND
21310 CLS
21320 JOYSTICKACTIVE=FALSE
21330 FORCECOMAND=FALSE
21400 READ COMMANDLEN
21410 FOR POSITION=1 TO COMMANDLEN: READ MENU%(POSITION) :NEXT
21420 get(0,0)-(32,199),extra%
21430 menuactive=false
21440 delaysize=7500
21450 comand$=chr$(0)+chr$(f1)
21460 forcecomand=true
21600 RETURN
22000 '
22001 ' get command
22002 '
22010 IF FORCECOMAND THEN FORCECOMAND=FALSE ELSE COMAND$=INKEY$
22015 IF JOYSTICKACTIVE THEN GOSUB 30000
22020 IF LEN(COMAND$)=0 THEN 22600
22030 IF ASC(COMAND$)=ESC THEN FINISHED=TRUE
22040 IF COMAND$="J" OR COMAND$="j" THEN JOYSTICKACTIVE=TRUE:JOYXCENTER=STICK(0):JOYYCENTER=STICK(1)
22050 IF COMAND$="K" OR COMAND$="k" THEN JOYSTICKACTIVE=FALSE
22053 IF joystickactive and COMAND$="M" OR COMAND$="m" and menuactive=false THEN MENUACTIVE=TRUE:GET(0,0)-(32,199),EXTRA%:PUT(0,0),MENU%,PSET
22055 IF COMAND$="N" OR COMAND$="n" and menuactive=true THEN MENUACTIVE=FALSE:PUT(0,0),EXTRA%,PSET
22060 IF LEN(COMAND$)<>2 THEN 22500 ELSE COMAND$=RIGHT$(COMAND$,1)+" "
22070 OLDMODE=MODE
22080 IF ASC(COMAND$)=F1 THEN MODE=1
22090 IF ASC(COMAND$)=F2 THEN MODE=2
22100 IF ASC(COMAND$)=F4 THEN MODE=3
22110 IF ASC(COMAND$)=F6 THEN MODE=4
22120 IF ASC(COMAND$)=F8 THEN MODE=5
22130 IF ASC(COMAND$)=F3 THEN MODE=6
22140 IF ASC(COMAND$)=F5 THEN MODE=7
22150 IF ASC(COMAND$)=F7 THEN MODE=8
22160 IF ASC(COMAND$)=ALTF2 THEN MODE=9
22170 IF ASC(COMAND$)=ALTF1 THEN MODE=10
22180 IF ASC(COMAND$)=F9 THEN MODE=11
22190 IF ASC(COMAND$)=ALTF3 THEN MODE=12
22200 IF ASC(COMAND$)=ALTF5 THEN MODE=13
22210 IF ASC(COMAND$)=ALTF7 THEN MODE=14
22220 IF ASC(COMAND$)=ALTF9 THEN MODE=15
22230 IF ASC(COMAND$)=ALTF10 THEN MODE=16
22240 IF ASC(COMAND$)=F10 THEN MODE=17
22500 IF NOT JOYSTICKACTIVE THEN DUMMY$=INKEY$: WHILE (LEN(DUMMY$)<>0) : DUMMY$=INKEY$: WEND 'clear buffer
22600 RETURN
23000 '
23001 ' move cursor
23002 '
23003 ' arrrow keys move cursor
23004 ' INSERT goes true if insert pressed
23010 IF NOT CURSOR1SHOW THEN IF (CURSOR1X>=0) AND (CURSOR1X <(MAXXRES-CURSOR1%(1)*RESOLUTION /8)) AND (CURSOR1Y >=0) AND (CURSOR1Y<MAXYRES-CURSOR1%(2)) THEN PUT (CURSOR1X,CURSOR1Y), CURSOR1% :CURSOR1SHOW=TRUE
23015 IF JOYSTICKACTIVE THEN IF LEN(COMAND$)=0 THEN COMAND$=" ":GOTO 23030 ELSE GOTO 23030
23020 IF LEN(COMAND$) <>2 THEN INSERT=FLASE: DELETE.=FALSE :GOTO 23600
23030 IF ASC(COMAND$)=INS THEN INSERT=TRUE ELSE INSERT=FALSE
23040 IF ASC(COMAND$)=DEL THEN DELETE.=TRUE ELSE DELETE.=FALSE
23110 IF CURSOR1SHOW THEN PUT (CURSOR1X,CURSOR1Y),CURSOR1%:CURSOR1SHOW=FALSE
23120 CURSOR1X=NEWCURSOR1X: CURSOR1Y=NEWCURSOR1Y
23130 IF (CURSOR1X>=0) AND (CURSOR1X <(MAXXRES-CURSOR1%(1)*RESOLUTION /8)) AND (CURSOR1Y >=0) AND (CURSOR1Y<MAXYRES-CURSOR1%(2)) THEN PUT (CURSOR1X,CURSOR1Y), CURSOR1% :CURSOR1SHOW=TRUE
23210 IF CURSOR2SHOW THEN PUT(CURSOR2X,CURSOR2Y),CURSOR2%: CURSOR2SHOW=FALSE
23220 CURSOR2X=NEWCURSOR2X: CURSOR2Y=NEWCURSOR2Y
23230 IF (CURSOR2X>=0) AND (CURSOR2X< (MAXXRES-CURSOR2%(1)*RESOLUTION/8)) AND (CURSOR2Y >=0) AND (CURSOR2Y<MAXYRES-CURSOR2%(2)) THEN PUT(CURSOR2X,CURSOR2Y),CURSOR2%:CURSOR2SHOW=TRUE
23600 RETURN
24000 '
24001 'get movement values
24002 '
24003 ' movement according to direction of arrow keys
24004 '
24010 IF JOYSTICKACTIVE THEN GOSUB 31000:GOTO 24600
24015 IF ASC(COMAND$)=CURSLFT THEN XCHANGE=-DELTA:YCHANGE=0:GOTO 24600
24020 IF ASC(COMAND$)=CURSRT THEN XCHANGE=DELTA:YCHANGE=0:GOTO 24600
24030 IF ASC(COMAND$)=CURSUP THEN YCHANGE=-DELTA:XCHANGE=0:GOTO 24600
24040 IF ASC(COMAND$)=CURSDWN THEN YCHANGE=DELTA:XCHANGE=0:GOTO 24600
24050 IF ASC(COMAND$)=HOME THEN XCHANGE=-DELTA:YCHANGE=-DELTA:GOTO 24600
24060 IF ASC(COMAND$)=END. THEN XCHANGE=-DELTA:YCHANGE=DELTA:GOTO 24600
24070 IF ASC(COMAND$)=PGUP THEN XCHANGE=DELTA:YCHANGE=-DELTA:GOTO 24600
24080 IF ASC(COMAND$)=PGDWN THEN XCHANGE=DELTA:YCHANGE=DELTA:GOTO 24600
24090 XCHANGE=0: YCHANGE=0
24600 RETURN
24700 PUT (CURSOR1X,CURSOR1Y),CURSOR1%
24710 RETURN
24720 PUT (CURSOR2X,CURSOR2Y),CURSOR2%
24730 RETURN
25000 '
25001 ' reset parameters to clear screen of junk if mode is changed
25002 ' gets rid of any cursorts showing resets counters
25003 '
25010 IF CURSOR1SHOW THEN PUT (CURSOR1X,CURSOR1Y),CURSOR1%:CURSOR1SHOW=FALSE
25020 IF CURSOR2SHOW THEN PUT (CURSOR2X,CURSOR2Y),CURSOR2%:CURSOR2SHOW=FALSE