'
' SPROGH:A SPIROGRAPH SIMULATOR BY PHIL PAUSTIAN
'
'       VERSION 3.2
'       COPYRIGHT 1989
'
' PROGRAM INDEX                STARTS ON LINE
'    INTRODUCTORY SCREEN...................40
'    DRAW INITIAL MENU....................120
'    SET MENU.............................142
'    COMMAND CHOOSING.....................177
'    SET DISK GEARS.......................185
'    SET RING GEARS.......................210
'    SET PEN POSITION.....................235
'    MOVE.................................250
'    SIZE.................................300
'    TURN.................................340
'    OVAL.................................350
'    HUE (LINE COLOR).....................360
'    WIPE (PAINT FILL)....................370
'    FORM (GEARS OR DEGREES)..............430
'    LOAD/SAVE............................440
'    INITIALIZE (RESET VARIABLES).........515
'    VERSION..............................525
'    EXAMPLES.............................550
'    AGAIN (MACRO COMMANDS)...............582
'    BLANK MENU...........................610
'    CLEAR SCREEN.........................615
'    GO  (DRAW DESIGN)....................620
'    QUIT.................................705
'    ERROR TRAPPPING (FILE INPUT).........750
'    LOGO.................................787
'    NUMBER INPUT SUBROUTINE..............820
'    WORD INPUT SUBROUTINE................885
'    MACRO INPUT (AGAIN COMMAND)..........932
'    WIPE: COLOR CHANGES SUBROUTINE.......940
'    TILE PATTERNS........................992
'    END.................................1106

'    Intro Screen
' INITIALIZE VARIABLES AND DRAW SAMPLE IMAGE
$STACK &H4000
SCREEN 2:KEY OFF:CLS
WINDOW SCREEN (-150,-100)-(150,110)
PI=ATN(1)/45:DSKANGL=-12*PI:RNGANGL=9.5*PI
GDTOGL%=1:PENINPUT=.55:CIR=360*PI:REP%=1
SIZOPT%=0:SIZOPT$="auto "
OVALNESS=1.7:ROTAT=0:MOVHORIZ=0
MOVVERT=0:SIZ=1.25:HUE%=1:ZERO=.01:WD=4:HG=8.4
DIM WNDW%(3500), BLANKLINE%(1000), MENUWNDW%(3500), TILER%(5)
DIM REFRESHA%(15000), CROSSHAIRS%(100), TILE$(150)
GET (-150,102)-(150,110),BLANKLINE%
SEE$=COMMAND$:IF SEE$<>"" THEN GOTO SCRENE

INTROSCREEN:
GET (-150,-100)-(150,100),REFRESHA%
CLS:STOG=ABS(STOG-1)
LINE (-148,-98)-(146,99),,B
LINE (-146,-100)-(148,97),,B
IF STOG=1 THEN S1=5.3:S2=-55:S3=12:S4=-34 ELSE S1=4:S2=-40:S3=8:S4=-24
GOSUB LOGO

LOCATE 23,3:PRINT "by Phil Paustian"
LOCATE 23,55:PRINT "Press any key to begin";
GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%

'   DRAW TWO SAMPLE DESIGNS
DSKANGL=-DSKANGL:PENINPUT=ABS(PENINPUT-1.4):KY$="G":GOTO SET

SCRENE:
'   INPUT SCREEN TYPE
DEF SEG=&H40:SCRNTYPE=PEEK(&H10) AND 48
IF SCRNTYPE=48 THEN
   SCREEN 2: FILESIZ=40000:DEF SEG=&HB000:EXT$=".HRC":LINELENGTH%=76
ELSE
   IF SEE$<>"" THEN
     SCRN$=MID$(SEE$,LEN(SEE$)-3,2)
     IF SCRN$=".C" OR SCRN$=".M" THEN SCRN$=RIGHT$(SCRN$,1):GOTO 1
   END IF
   LOCATE 23,55:PRINT "(C)olor or (M)onochrome?";
   WHILE NOT INSTAT:WEND:KK$=INKEY$
   SCRN$=UCASE$(KK$):IF SCRN$<>"C" AND SCRN$<>"M" THEN GOTO SCRENE
1  IF SCRN$="C" THEN
       SCREEN 1,0:FILESIZ=16384
       DEF SEG=&HB800:EXT$=".COL":WD=7:LINELENGTH%=36
   ELSE
       SCREEN 2:FILESIZ=16384
       DEF SEG=&HB800:EXT$=".MON":LINELENGTH%=76
   END IF
END IF
WINDOW SCREEN (-150,-100)-(150,110):CLS
GET (-150,102)-(150,110),BLANKLINE%
GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
IF SCRN$="C" THEN
 GET (-150,-100)-(150,100),REFRESHA%
END IF
' DRAW CROSSHAIRS FOR USE IN MOVING THE CENTER OF THE DESIGN
LINE (-148,-93)-(-138,-93):LINE (-143,-98)-(-143,-88)
CIRCLE (-143,-93),5
GET (-150,-100)-(-137,-87),CROSSHAIRS%:PUT (-150,-100),CROSSHAIRS%
IF SEE$<>"" THEN
 FIL$=SEE$
 GOSUB FILEXIST
 IF FILECONTINUE=1 THEN
  BLOAD SEE$,0
  GET (-150,-100)-(150,100),REFRESHA%
  GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
  WHILE NOT INSTAT:WEND:KK$=INKEY$
  PUT (-150,-100),WNDW%
 END IF
  PUT (-150,102),BLANKLINE%,PSET
END IF
'    REINITIALIZE VARIABLES
LOCATED$="":SIZ=1:PENPOS=1:RATIO=1:SAMPLE%=0:SAMPL%=0:REP%=0
IF SEE$="" THEN FIL$="SPIRO1"+EXT$
OVALNESS=1:DSKANGL=0:RNGANGL=0:MENU%=1:PENINPUT=1

LOCATE 25,1:PRINT "Hit Command Letter:";

'    PRINTING THE MENU
LINE (-150,-100)-(14*WD-150,24*HG-104),,B
LINE (-148,-98)-(14*WD-148,24*HG-102),,B
LOCATE 2,2:PRINT "Disk"
LOCATE 4,2:PRINT "Ring"
LOCATE 6,2:PRINT "Pen position"
LOCATE 8,2:PRINT "Move center"
LOCATE 10,2:PRINT "Size:"
LOCATE 12,2:PRINT "Turn:"
LOCATE 13,2:PRINT "Oval:"
LOCATE 14,2:PRINT "Hue:"
LOCATE 15,2:PRINT "Form:"
LOCATE 16,2:PRINT "Again"
LOCATE 17,2:PRINT "Wipe"
LOCATE 18,2:PRINT "Load/save"
LOCATE 19,2:PRINT "Examples"
LOCATE 20,2:PRINT "Blank menu"
LOCATE 21,2:PRINT "Clear screen"
LOCATE 22,2:PRINT "Go"
LOCATE 23,2:PRINT "Quit";
GET (-150,-100)-(14*WD-146,24*HG-100),MENUWNDW%

STARTING:
IF MENU%=1 THEN
  PUT (-150,-100),MENUWNDW%,PSET
  IF GDTOGL%=1 THEN
    LOCATE 2,7:PRINT "gears"
    LOCATE 3,3:PRINT FIX((DSKGR+.001*SGN(DSKGR))*100)/100
    LOCATE 4,7:PRINT "gears"
    LOCATE 5,3:PRINT FIX((RNGGEAR+.001*SGN(RNGGEAR))*100)/100
  ELSE
    RATIO=1
    LOCATE 2,7:PRINT "degrees"
    LOCATE 3,3:PRINT FIX((DSKDEG+.001*SGN(DSKDEG))*100)/100
    LOCATE 4,7:PRINT "degrees"
    LOCATE 5,3:PRINT FIX((RNGDEG+.001*SGN(RNGDEG))*100)/100
  END IF
    LOCATE 7,3:PRINT FIX((PENINPUT+.001*SGN(PENINPUT))*100)/100
    LOCATE 9,4:PRINT LOCATED$
    IF GDTOGL%=1 THEN
      IF DSKANGL*RNGANGL<>0 THEN RATIO=DSKANGL/RNGANGL
      IF RATIO<>-1 THEN PENPOS=PENINPUT/(RATIO+1)*RATIO ELSE PENPOS=-PENINPUT
    ELSE
      RATIO=1:PENPOS=PENINPUT
    END IF
   LOCATE 10,7:PRINT SIZOPT$
   LOCATE 11,3:PRINT FIX((SIZ+.001*SGN(SIZ))*100)/100
   LOCATE 12,7:PRINT FIX((ROTAT+.001*SGN(ROTAT))*100)/100
   LOCATE 13,7:PRINT FIX((OVALNESS+.001*SGN(OVALNESS))*100)/100
   LOCATE 14,6:PRINT INT(HUE%)
   IF GDTOGL%=0 THEN
    LOCATE 15,7:PRINT "degrees"
   ELSE
    LOCATE 15,7:PRINT "gears"
   END IF
END IF

'   SEND THE PROGRAM TO THE APPROPRIATE ROUTINE
WHILE NOT INSTAT:WEND
KY$=UCASE$(INKEY$)
SET:
KOUT$=INKEY$
IF KOUT$=CHR$(27) THEN REP%=0:GOTO STARTING
SELECT CASE KY$

CASE ="D"
'      DISK SUBROUTINE
' THIS MUST BE SET TO ANY NUMBER EXCEPT 0 BEFORE YOU CAN DRAW A DESIGN.
' SEE THE 'EXAMPLES' COMMAND FOR SOME POSSIBLE SETTINGS.  SEE THE 'FORM'
' COMMAND FOR THE DIFFERENCES BETWEEN INPUTTING  BY 'DISK GEARS' AND
' INPUTTING BY 'DISK DEGREES.'
 IF GDTOGL%=1 THEN
    PROMP$="Disk gears ["+STR$(FIX((DSKGR+.001*SGN(DSKGR))*100)/100)+"]: "
    DEFAU$=STR$(DSKGR):GOSUB INNUM
    IF ABORT%=1 THEN GOTO STARTING
    IF PLUS%=1 THEN ASKNUM=ASKNUM+DSKGR
    IF ASKNUM<>0 THEN DSKGR=ASKNUM:DSKDEG=360/DSKGR:DSKANGL=-DSKDEG*PI
 ELSE
    PROMP$="Disk degrees ["+STR$(FIX((DSKDEG+.001*SGN(DSKDEG))*100)/100)+"]: "
    DEFAU$=STR$(DSKDEG)
    GOSUB INNUM
    IF ABORT%=1 THEN GOTO STARTING
    IF PLUS%=1 THEN ASKNUM=ASKNUM+DSKDEG
    IF ASKNUM<>0 AND ABS(ASKNUM)<32768 THEN
     IF ASKNUM=>360 THEN ASKNUM=(ASKNUM/360-INT(ASKNUM/360))*360
     IF ASKNUM<>0 THEN DSKDEG=ASKNUM
     DSKGR=360/DSKDEG:DSKANGL=DSKDEG*PI
    END IF
 END IF

CASE ="R"
'      RING SUBROUTINE
' THIS MUST BE SET AT ANY NUMBER OTHER THAN 0 BEFORE YOU CAN DRAW A DESIGN
' SEE THE 'FORM' COMMAND FOR THE DIFFERENCES BETWEEN INPUT BY GEARS AND
' INPUT BY DEGREES
 IF GDTOGL%=1 THEN
   PROMP$="Ring gears ["+STR$(FIX((RNGGEAR+.001*SGN(RNGGEAR))*100)/100)+"]: "
   DEFAU$=STR$(RNGGEAR)
   GOSUB INNUM
   IF ABORT%=1 THEN GOTO STARTING
   IF PLUS%=1 THEN ASKNUM=ASKNUM+RNGGEAR
   IF ASKNUM<>0 THEN RNGGEAR=ASKNUM:RNGDEG=360/RNGGEAR:RNGANGL=RNGDEG*PI
 ELSE
   PROMP$="Ring degrees ["+STR$(FIX((RNGDEG+.001*SGN(RNGDEG))*100)/100)+"]: "
   DEFAU$=STR$(RNGDEG)
   GOSUB INNUM
   IF ABORT%=1 THEN GOTO STARTING
   IF PLUS%=1 THEN ASKNUM=ASKNUM+RNGDEG
   IF ASKNUM<>0 AND ABS(ASKNUM)<32768 THEN
    IF ASKNUM=>360 THEN ASKNUM=(ASKNUM/360-INT(ASKNUM/360))*360
    IF ASKNUM<>0 THEN RNGDEG=ASKNUM
    RNGGEAR=360/RNGDEG:RNGANGL=RNGDEG*PI
   END IF
 END IF

CASE ="P"
'      PEN POSITION SUBROUTINE
' WHEN PENINPUT IS 0 THE PEN SITS AT THE CENTER OF THE DISK.  WHEN PEN IS
' SET AT 1 THE PEN SITS AT THE EDGE OF THE DISK.  YOU CAN SET THE PEN
' ANYWHERE BETWEEN THOSE TWO POINTS, OR EVEN SET IT OUTSIDE THE DISK WITH
' NUMBERS GREATER THAN 1
 PROMP$="Pen position ["+STR$(FIX((PENINPUT+.001*SGN(PENINPUT))*100)/100)+"]: "
 DEFAU$=STR$(PENINPUT)
 GOSUB INNUM
 IF ABORT%=1 THEN GOTO STARTING
 IF PLUS%=1 THEN ASKNUM=ASKNUM+PENINPUT
 PENINPUT=ASKNUM



CASE ="M"
'      MOVE SUBROUTINE
 PUT (-150,-100),WNDW%,PSET
 IF REP%=0 THEN PUT (MOVHORIZ-7,MOVVERT-7),CROSSHAIRS%
 PROMP$=LOCATED$+":Move (U,D,L,R)? "
 DEFAU$=""
 CHOIC$="UDLR"
 GOSUB INWORD
 IF ABORT%=1 THEN
   IF REP%=0 THEN PUT (MOVHORIZ-7,MOVVERT-7),CROSSHAIRS%
   GOTO STARTING
 END IF
 PROMP$=""
 SELECT CASE ASKWRD$
        CASE ="U"
        PROMP$="up"
        CASE ="D"
        PROMP$="down"
        CASE ="L"
        PROMP$="left"
        CASE ="R"
        PROMP$="right"
 END SELECT
 IF PROMP$="" THEN
  IF REP%=0 THEN PUT (MOVHORIZ-7,MOVVERT-7),CROSSHAIRS%
  GOTO STARTING
 END IF
 PROMP$=LOCATED$+":How far? ("+PROMP$+") "
 DEFAU$=""
 GOSUB INNUM
 IF REP%=0 THEN PUT (MOVHORIZ-7,MOVVERT-7),CROSSHAIRS%
 IF ABORT%=1 THEN GOTO STARTING
 SELECT CASE ASKWRD$
        CASE ="U"
         IF ABS(MOVVERT-ASKNUM)<91 THEN MOVVERT=MOVVERT-ASKNUM
        CASE ="D"
	 IF ABS(MOVVERT+ASKNUM)<91 THEN MOVVERT=MOVVERT+ASKNUM
        CASE ="L"
         IF ABS(MOVHORIZ-ASKNUM)<141 THEN MOVHORIZ=MOVHORIZ-ASKNUM
        CASE ="R"
         IF ABS(MOVHORIZ+ASKNUM)<141 THEN MOVHORIZ=MOVHORIZ+ASKNUM
 END SELECT
 IF REP%=0 THEN PUT (MOVHORIZ-7,MOVVERT-7),CROSSHAIRS%
 LOCATED$=""
 IF MOVVERT<0 THEN LOCATED$="U"+STR$(ABS(MOVVERT))+" "
 IF MOVVERT>0 THEN LOCATED$="D"+STR$(MOVVERT)+" "
 IF MOVHORIZ<0 THEN LOCATED$=LOCATED$+"L"+STR$(ABS(MOVHORIZ))+" "
 IF MOVHORIZ>0 THEN LOCATED$=LOCATED$+"R"+STR$(MOVHORIZ)+" "
 IF REP%=0 THEN DELAY 1:PUT (MOVHORIZ-7,MOVVERT-7),CROSSHAIRS%

CASE ="S"
'      SIZE SUBROUTINE
' "AUTO" CALCULATES SIZE AUTOMATICALLY ACCORDING TO THE SCALE SET BY 'SIZ'
' "FIXED" FIXES THE RING AT ITS CURRENT POSITION ON THE SCREEN SO THAT ALL
'   SUBSEQUENT DRAWINGS WILL BE SCALED TO FIT AROUND IT
' "NESTED" DETERMINES THE SIZE OF THE HOLE IN THE MIDDLE OF THE SCREEN AND
'   ADJUSTS 'SIZ' TO FIT SUBSEQUENT DRAWINGS INSIDE
'   NESTED RESETS TO THE "AUTO" SETTING
  PROMP$="Auto, Fixed or Nested ["+SIZOPT$+"]:"
  CHOIC$="AFN"
  DEFAU$=""
  GOSUB INWORD
  IF ABORT%=1 THEN GOTO STARTING
  SELECT CASE ASKWRD$
   CASE ="A"
    SIZOPT%=0:SIZOPT$="auto "
    PROMP$="Size ["+STR$(FIX((SIZ+.001*SGN(SIZ))*100)/100)+"]:"
    DEFAU$=STR$(SIZ)
    GOSUB INNUM
    IF ABORT%=1 THEN GOTO STARTING
    IF ASKNUM<>0 THEN SIZ=ASKNUM+SIZ*PLUS%
   CASE ="F"
    IF SIZOPT%=0 THEN
      SIZOPT%=1:SIZOPT$="fixed"
      SIGN=SGN(DSKANGL)*SGN(RNGANGL)
      IF PENINPUT=0 THEN PENINPUT=.001
      LINEUP=(ABS(RATIO)-ABS(PENPOS/PENINPUT)*SIGN)/(ABS(RATIO)+ABS(PENPOS))
    END IF
   CASE ="N"
    IF SIZOPT%=1 THEN
      SIGN=SGN(DSKANGL)*SGN(RNGANGL)
      IF PENINPUT=0 THEN PENINPUT=.001
      NEWLINEUP=(ABS(RATIO)-ABS(PENPOS/PENINPUT)*SIGN)/(ABS(RATIO)+ABS(PENPOS))
      FIXLINEUP=LINEUP/NEWLINEUP
    END IF
    NEST=(ABS(RATIO)-ABS(PENPOS))/(ABS(RATIO)+ABS(PENPOS))
    IF SIZOPT%=1 THEN NEST=FIXLINEUP*NEST
    SIZOPT%=0:SIZOPT$="auto ":SIZ=SIZ*NEST
  END SELECT

CASE ="T"
'      TURN SUBROUTINE
' SETS ROTAT AS THE STARTING ROTATION OF THE RING, INPUT BY THE NUMBER OF
' DEGREES TO TURN, WHEN SET AT 999, DRAWING CONTINUES FROM WHERE STOPPED IT
 PROMP$="Turn ["+STR$(FIX((ROTAT+.001*SGN(ROTAT))*100)/100)+"]: "
 DEFAU$=STR$(ROTAT):GOSUB INNUM
 IF ABORT%=1 THEN GOTO STARTING
 IF PLUS%=1 THEN ASKNUM=ASKNUM+ROTAT
 ROTAT=ASKNUM

CASE ="O"
'      OVAL SUBROUTINE
' AN OVALNESS GREATER THAN 1 MAKES THE IMAGE THE NORMAL WIDTH, BUT DIVIDES
' HEIGHT BY OVALNESS GIVING YOU A WIDE, SHORT OVAL.  AN OVALNESS LESS THAN
' ONE MULTIPLIES THE WIDTH BY OVALNESS, GIVING YOU A TALL, NARROW OVAL
 PROMP$="Oval ["+STR$(FIX((OVALNESS+.001*SGN(OVALNESS))*100)/100)+"]: "
 DEFAU$=STR$(OVALNESS):GOSUB INNUM
 IF ABORT%=1 THEN GOTO STARTING
 OVALNESS=ASKNUM+OVALNESS*PLUS%

CASE ="H"
'      HUE SUBROUTINE
' IN MONOCHROME ODD NUMBERS DRAW IN WHITE, EVEN NUMBERS IN BLACK
' IN COLOR IT IS UNTESTED, SINCE I USE A HERCULES MONITOR
 PROMP$="Hue ["+STR$(INT(HUE%+.001))+"]: "
 DEFAU$=STR$(HUE%):GOSUB INNUM
 IF ABORT%=1 THEN GOTO STARTING
 HUE%=ASKNUM+HUE%*PLUS%:WHILE HUE%>255:HUE%=HUE%-256:WEND
 IF EXT$=".COL" THEN COL=HUE% MOD 7:COLOR ,INT(COL/3.6)

CASE ="W"
 '     WIPE
 'PAINT SUBROUTINE: PAINTS AT CROSSHAIRS
 'ENTER NUMBER OF COLOR OR PATTERN (0-99),
 'OR, AFTER ENTERING A NEGATIVE NUMBER, ENTER A SERIES
 'OF NUMBERS TO INDICATE USER-DEFINED PATTERN
 TILECOLOR%=0:PUT (-150,-100),WNDW%,PSET
 PROMP$="Wipe color? (0-99) ":DEFAU$=STR$(WIPED%):
 GOSUB INNUM
 IF ABORT%=1 THEN GOTO STARTING
 WIPE%=ASKNUM+WIPE%*PLUS%:PROMP$="Pattern? ":WIPED%=WIPE%
 IF WIPE%>9 THEN
   IF TILE$(10)="" THEN
    PUT (-150,102),BLANKLINE%,PSET
    LOCATE 25,1:PRINT "Loading Patterns...";
    FOR X=10 TO 150:READ Y
     WHILE Y<>999
      IF Y=-1 THEN GOTO JUMPOUT
      TILE$(X)=TILE$(X)+CHR$(Y)
      READ Y
     WEND
    NEXT X
   END IF
   JUMPOUT:
   IF WIPE%>100 THEN TILECOLOR%=INT(WIPE%/100):WIPE%=WIPE% MOD 100
   IF WIPE%<>9 THEN WIPE$=TILE$(WIPE%)
 END IF
 IF WIPE%<0 THEN
   WIPE$="":WIPENUM%=0
   WHILE WIPENUM%<256
   DEFAU$=STR$(WIPENUM%):GOSUB INNUM
   IF ABORT%=1 AND NONUM%=0 THEN GOTO STARTING
   IF NONUM%=1 THEN ASKNUM=999
   WIPENUM%=ASKNUM+WIPENUM%*PLUS%
   IF WIPENUM%<0 THEN
     WIPE$=OLDWIPE$:OLDPROMP$="Pattern? "
     FOR X=1 TO LEN(WIPE$)
     OLDPART$=STR$(ASC(MID$(WIPE$,X,1)))
     OLDPROMP$=OLDPROMP$+MID$(OLDPART$,2,LEN(OLDPART$)-1)+CHR$(249)
     NEXT X:PROMP$=OLDPROMP$
   ELSE
    IF WIPENUM%<256 THEN WIPE$=WIPE$+CHR$(WIPENUM%)
    PROMP$=PROMP$+RIGHT$(STR$(WIPENUM%),LEN(STR$(WIPENUM%))-1)+CHR$(249)
   END IF
   WEND
 END IF
 IF TILECOLOR%<>0 THEN GOSUB COLORTILE
 IF WIPE%<9 AND WIPE%=>0 THEN
  IF EXT$=".COL" THEN COLOR ,INT(WIPE%/4.1)
  ON ERROR GOTO STACKSPACE
  PAINT (MOVHORIZ,MOVVERT),WIPE%,HUE%
 ELSE
  PAINT (MOVHORIZ,MOVVERT),WIPE$,HUE%
  OLDWIPE$=WIPE$
  ON ERROR GOTO 0
 END IF
 GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
 PUT (-150,102),BLANKLINE%,PSET
 LOCATE 25,1:PRINT ">";

CASE ="F"
'      FORM SUBROUTINE
' TOGGLE BETWEEN INPUT BY NUMBER OF GEARS AND INPUT BY NUMBER OF DEGREES
' WHEN FORM IS 'DEGREES' THERE ARE A COUPLE DIFFERENCES IN THE WAY THE IMAGE
' IS DRAWN.  1. THE SIZE OF THE DISK AND RING ARE NOT SET IN PROPORTION
' TO THE NUMBER OF GEARS. 2. THE DISK SIMPLY TURNS X NUMBER OF DEGREES, IT
' DOES NOT ROLL INSIDE THE RING.
 GDTOGL%=ABS(GDTOGL%-1):PUT (-150,102),BLANKLINE%,PSET
 LOCATE 25,1:IF GDTOGL%=1 THEN PRINT "Form:gears"; ELSE PRINT "Form:degrees";

CASE ="L"
'      LOAD/SAVE SUBROUTINE
 IF REP%=1 THEN GOTO REPEAT
 PROMP$="(D)isk or (M)emory?"
 CHOIC$="DM":DEFAU$=""
 GOSUB INWORD
 SCREENSAVE$=ASKWRD$
 SELECT CASE SCREENSAVE$
        CASE ="D"
          PROMP$="(L)oad or (S)ave?"
          CHOIC$="SL"
          DEFAU$=""
          GOSUB INWORD
          IF ABORT%=1 THEN GOTO STARTING
          IF ASKWRD$<>"" THEN
            SL$=ASKWRD$
            PROMP$="File name ["+FIL$+"]: "
            CHOIC$=""
            DEFAU$=FIL$
            GOSUB INWORD
            IF ABORT%=1 THEN GOTO STARTING
            IF ASKWRD$<>"" THEN FIL$=ASKWRD$
            GOSUB FILEXIST
            IF FILECONTINUE=1 THEN
             SELECT CASE SL$
                    CASE ="S"
                      IF MENU%=1 THEN PUT (-150,-100),WNDW%,PSET
                      ON ERROR GOTO CANTSAVE
                      BSAVE FIL$,0,FILESIZ
                      ON ERROR GOTO 0
                    CASE ="L"
                      BLOAD FIL$,0
                      GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
                      WHILE NOT INSTAT:WEND
                      KK$=INKEY$
             END SELECT
            END IF
          END IF
        CASE ="M"
'               VIDEO-REFRESH
           PROMP$="Save or Restore:"
           CHOIC$="SR"
           DEFAU$=""
           GOSUB INWORD
           IF ABORT%=1 THEN GOTO STARTING
           FRESH$=ASKWRD$
           SELECT CASE FRESH$
                  CASE ="S"
                    PUT (-150,-100),WNDW%,PSET
                    GET (-150,-100)-(150,100),REFRESHA%
                  CASE ="R"
                    PROMP$="Restore, Negative, Sum, Icon? "
                    CHOIC$="RNSI"
                    DEFAU$=""
                    GOSUB INWORD
                    IF ABORT%=1 THEN GOTO STARTING
                    PUT (-150,-100),WNDW%,PSET
                    SELECT CASE  ASKWRD$
                           CASE ="R"
                             PUT (-150,-100),REFRESHA%,PSET
                             GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
                           CASE ="N"
                             PUT (-150,-100),REFRESHA%,PRESET
                             GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
                           CASE ="S"
                             PUT (-150,-100),REFRESHA%,OR
                             GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
                           CASE ="I"
                             PUT (-150,-100),REFRESHA%,XOR
                             GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
                    END SELECT
           END SELECT
           IF REP%=2 THEN GOTO REPEAT
 END SELECT

 CASE ="I"
'       INITIALIZE SUBROUTINE, RESETS MOST VARIABLES TO THEIR STARTING VALUES
' DOES NOT EFFECT DISK, RING, FORM, OR AGAIN COMMANDS
 MOVVERT=0:MOVHORIZ=0:ROTAT=0:SIZ=1
 PENPOS=1:RATIO=1:PENINPUT=1:MENU%=1
 OVALNESS=1:HUE%=1:SIZOPT%=0:SIZOPT$="auto"
 LOCATED$="":FIL$="SPIRO1"+EXT$
 PUT (-150,102),BLANKLINE%,PSET
 LOCATE 25,1:PRINT "Initialized!";

  CASE ="V"
 '       VERSION: A BASICALLY USELESS SUBROUTINE
  PUT (-150,-100),WNDW%,PSET:PUT (-150,-100),WNDW%
  LOCATE 3,1:PRINT "SPROGH!"
  LOCATE 5,1:PRINT "version 3.1"
  LOCATE 9,1:PRINT "by"
  LOCATE 10,1:PRINT "Phil Paustian"
  LOCATE 11,1:PRINT "Box 644"
  LOCATE 12,1:PRINT "Terry, MT"
  LOCATE 13,4:PRINT "59349"
  LOCATE 15,2:PRINT "REGISTER"
  LOCATE 16,7:PRINT "NOW!"
  LOCATE 19,1:PRINT "Send $4.37 if"
  LOCATE 20,1:PRINT "you enjoyed"
  LOCATE 21,1:PRINT "this program."
  PUT (-150,102),BLANKLINE%,PSET
  LOCATE 25,1:PRINT "Press any key to continue";
  WHILE NOT INSTAT:WEND:V$=INKEY$
  PUT (-150,-100),WNDW%,PSET

CASE ="Z"
'      ZERO: DOES NOTHING BUT WAITS ONE SECOND AND BEEPS
' THE ONLY CONCEIVABLE USE IS TO PUT A DELAY INTO "AGAIN" COMMANDS
  DELAY 1:SOUND 100,4

CASE ="E"
' EXAMPLES SUBROUTINE
 IF GDTOGL%=1 THEN
   SELECT CASE SAMPLE%
   CASE =0
     CLS:GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
INMACRO$="ID16R72P.4GP.5H3GP.6H5GSNT+20H7GP.8H1GP1H3GSNP1.5H5GP2.1H7GP2.7H1G"
     MACRO$=INMACRO$:MACRO%=1:REP%=2
   CASE =1
     REP%=2:MACRO%=11:PENINPUT=1.1:SIZOPT%=0:SIZOPT$="auto ":siz=1
     CLS:GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
     INMACRO$="D40R60SFP+-.1G":MACRO$=INMACRO$
   CASE =2
     PENINPUT=.4:ROTAT=-3:REP%=2
     CLS:GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
     INMACRO$="D20R60SA1T+3P+.05G":REP%=2:MACRO%=30:MACRO$=INMACRO$
   END SELECT
   SAMPLE%=SAMPLE%+1:IF SAMPLE%>2 THEN SAMPLE%=0
  ELSE
   ROTAT=0:REP%=2:MACRO%=1
   SELECT CASE SAMPL%
   CASE =0
    INMACRO$="ID124R2P.9CGZD2R60P1H3CGZE":MACRO$=INMACRO$
   CASE =1
    INMACRO$="D58R266P1H7CGZD141R141H1CGW93MR135W93ML135ZE":MACRO$=INMACRO$
   CASE =2
    INMACRO$="LMRNH0D44R278SA1.5O1.5LMRSGZD4R93LMRNLMRSGZE":MACRO$=INMACRO$
   END SELECT
   SAMPL%=SAMPL%+1:IF SAMPL%>2 THEN SAMPL%=0
  END IF
  GOTO REPEAT

CASE ="A"
'    AGAIN SUBROUTINE
' ALLOWS INPUT OF MACRO$ FOR AUTOMATIC REPETITION OF COMMANDS
' AN 'A' ANYWHERE WITHIN MACRO$ WILL RESET MACRO$ AND PUT YOU
' IN AN ENDLESS LOOP (HITTING ESCAPE, OR ANY KEY WILL END LOOP)
 IF REP%=2 THEN MACRO$=INMACRO$:GOTO REPEAT
 PROMP$="AGAIN:":CHOIC$="":DEFAU$=INMACRO$
 GOSUB INWORD
 IF ABORT%=1 THEN GOTO STARTING
 IF ASKWRD$<>"" THEN INMACRO$=ASKWRD$
 MACRO$=INMACRO$
 IF MACRO$<>"" THEN
   IF RIGHT$(MACRO$,1)="A" THEN LOOPA=1 ELSE LOOPA=0
   IF LOOPA=0 THEN
     PROMP$="HOW MANY TIMES? "
     DEFAU$=""
     GOSUB INNUM
     IF ABORT%=1 THEN GOTO STARTING
     IF ASKNUM<>0 THEN MACRO%=ASKNUM:REP%=2:GOTO REPEAT
   ELSE
     PROMP$="Start drawing (Y or N)?"
     CHOIC$="YN":DEFAU$=""
     GOSUB INWORD
     IF ABORT%=1 THEN GOTO STARTING
     IF ASKWRD$="Y" THEN MACRO%=1:REP%=2:GOTO REPEAT
   END IF
 END IF

CASE ="B"
'    BLANK SCREEN SUBROUTINE
' TOGGLE THAT DETERMINES IF MENU IS TO BE PRINTED ON LEFT SIDE OF SCREEN
 MENU%=ABS(MENU%-1):IF MENU%=0 THEN PUT (-150,-100),WNDW%,PSET

CASE ="C"
'    CLEAR SCREEN SUBROUTINE
 CLS:GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
 LOCATE 25,1:PRINT ">";

CASE ="G"
'    GO SUBROUTINE, THIS SECTION DOES ALL THE DRAWING
 IF REP%=2 AND VAL(MACRO$)<>0 THEN
    PROMP$="GO ":GOSUB INNUM:RECOUNT%=ASKNUM
 END IF
 IF DSKANGL*RNGANGL=0 THEN
  PUT (-150,102),BLANKLINE%,PSET
  LOCATE 25,1:PRINT "YOU MUST SET RING AND DISK FIRST";
  GOTO STARTING
 END IF
WHILE ABS(DSKANGL)>CIR:DSKANGL=DSKANGL-CIR*SGN(DSKANGL):WEND
WHILE ABS(RNGANGL)>CIR:RNGANGL=RNGANGL-CIR*SGN(RNGANGL):WEND
 PUT (-150,-100),WNDW%,PSET
 IF GDTOGL%=1 THEN
   RATIO=DSKANGL/RNGANGL
   IF RATIO<>-1 THEN PENPOS=PENINPUT/(RATIO+1)*RATIO ELSE PENPOS=-PENINPUT
 ELSE
   RATIO=1:PENPOS=PENINPUT
 END IF
SIZCONST=100/(ABS(RATIO)+ABS(PENPOS))
IF SIZOPT%=1 THEN
  SIGN=SGN(DSKANGL)*SGN(RNGANGL)
  IF PENINPUT=0 THEN PENINPUT=.001
  NEWLINEUP=(ABS(RATIO)-ABS(PENPOS/PENINPUT)*SIGN)/(ABS(RATIO)+ABS(PENPOS))
  FIXLINEUP=LINEUP/NEWLINEUP
  SIZCONST=SIZCONST*FIXLINEUP
END IF
IF OVALNESS>1 THEN
   OVALWIDE=1/OVALNESS:OVALHIGH=1
ELSE
   OVALWIDE=1:OVALHIGH=OVALNESS
END IF
ROTE=ROTAT
IF ROTE<>999 THEN
  WHILE ROTE>360:ROTE=ROTE-360:WEND
  WHILE ROTE<0:ROTE=ROTE+360:WEND
  DSKPLOT=0:RNGPLOT=ROTE*PI
END IF
IF EXT$=".COL" THEN COL=HUE% MOD 7:COLOR ,INT(COL/3.6)
DSKMEM=DSKPLOT:RNGMEM=RNGPLOT
PUT (-150,102),BLANKLINE%,PSET
HORIZSCALE=SIZ*OVALHIGH*SIZCONST
VERTSCALE=SIZ*OVALWIDE*SIZCONST
PLOTHOR=SIN(DSKPLOT+RNGPLOT*GDTOGL%)*PENPOS+SIN(RNGPLOT)*RATIO
PLOTVERT=COS(DSKPLOT+RNGPLOT*GDTOGL%)*PENPOS+COS(RNGPLOT)*RATIO
PSET(MOVHORIZ+PLOTHOR*HORIZSCALE,MOVVERT+PLOTVERT*VERTSCALE),HUE%
COUNT%=0
'     HERE IS THE ACTUAL PLOTTING OF THE DESIGN
 WHILE NOT INSTAT
   COUNT%=COUNT%+1
   DSKPLOT=DSKPLOT+DSKANGL
   RNGPLOT=RNGPLOT+RNGANGL
   WHILE ABS(DSKPLOT)>CIR:DSKPLOT=DSKPLOT-CIR*SGN(DSKPLOT):WEND
   WHILE ABS(RNGPLOT)>CIR:RNGPLOT=RNGPLOT-CIR*SGN(RNGPLOT):WEND
   PLOTHOR=SIN(DSKPLOT+RNGPLOT*GDTOGL%)*PENPOS+SIN(RNGPLOT)*RATIO
   PLOTVERT=COS(DSKPLOT+RNGPLOT*GDTOGL%)*PENPOS+COS(RNGPLOT)*RATIO
   LINE -(MOVHORIZ+PLOTHOR*HORIZSCALE,MOVVERT+PLOTVERT*VERTSCALE),HUE%
   IF RECOUNT%=0 AND COUNT%>10 THEN
    DM=ABS(DSKPLOT)-ABS(DSKMEM):RM=ABS(RNGPLOT)-ABS(RNGMEM)
    IF ABS(DM)<ZERO OR ABS(DM)>CIR-ZERO THEN
      IF ABS(RM)<ZERO OR ABS(RM)>CIR-ZERO THEN GOTO DONE
    END IF
   END IF
   IF RECOUNT%=1 THEN
     RECOUNT%=0
     GOTO DONE
   END IF
   IF RECOUNT%<>0 THEN RECOUNT%=RECOUNT%-1
 WEND
 IF REP%=1 THEN GOTO SCRENE
 REP%=0
 KK$=UCASE$(INKEY$):RECOUNT%=0
 DONE:
 GET (-150,-100)-(14*WD-146,24*HG-100),WNDW%
 PUT (-150,102),BLANKLINE%,PSET
 LOCATE 25,1:PRINT ">";
 SELECT CASE REP%
        CASE =0
          GOTO STARTING
        CASE =1
          GOTO INTROSCREEN
        CASE =2
          GOTO REPEAT
 END SELECT

CASE ="Q"
'    QUIT SUBROUTINE
  PUT (-150,102),BLANKLINE%,PSET
  LOCATE 25,1:PRINT "ARE YOU SURE? ";
  WHILE NOT INSTAT:WEND
  KK$=UCASE$(INKEY$)
  IF KK$="Y" THEN
    CLS
    LOCATE 1,1:PRINT "Have a nice day!"
    RANDOMIZE TIMER:HUE%=1
    WHILE NOT INSTAT
    IF SCRN$="C" THEN
      HUE%=INT(RND(2)*6+1)
      IF HUE%>3 THEN COLOR ,1:HUE%=HUE%-3 ELSE COLOR ,0
    END IF
    S1=INT(RND(2)*14+2)
    S2=INT(RND(2)*(300-20*S1))-150
    S3=INT(RND(2)*29+2)
    S4=INT(RND(2)*(200-5*S3))-100
    GET (2*S1+S2,2*S3+S4)-(19*S1+S2,3*S3+S4),REFRESHA%
    PUT (2*S1+S2,2*S3+S4),REFRESHA%
    GET (S1+S2,3*S3+S4)-(19*S1+S2,4*S3+S4),REFRESHA%
    PUT (S1+S2,3*S3+S4),REFRESHA%
    GET (3*S1+S2,S3+S4)-(5*S1+S2,2*S3+S4),REFRESHA%
    PUT (3*S1+S2,S3+S4),REFRESHA%
    GET (16*S1+S2,S3+S4)-(17*S1+S2,2*S3+S4),REFRESHA%
    PUT (16*S1+S2,S3+S4),REFRESHA%
    GET (5*S1+S2,4*S3+S4)-(6*S1+S2,5*S3+S4),REFRESHA%
    PUT (5*S1+S2,4*S3+S4),REFRESHA%
    GET (15*S1+S2,4*S3+S4)-(16*S1+S2,5*S3+S4),REFRESHA%
    PUT (15*S1+S2,4*S3+S4),REFRESHA%
    GOSUB LOGO
    DELAY .3
    WEND
    LOCATE 25,30:PRINT "The end?";
    DELAY .5
    SCREEN 0,0,0,0:END
  END IF
  PUT (-150,102),BLANKLINE%,PSET
  LOCATE 25,1:PRINT ">";

END SELECT
  IF REP%=0 THEN GOTO STARTING ELSE GOTO REPEAT


FILEXIST:
  FILERR=0:FILECONTINUE=0
  ON ERROR GOTO FILERROR
  OPEN FIL$ FOR INPUT AS #1
  CLOSE 1
CONTINUEAFTERERROR:
  ON ERROR GOTO 0
  IF SL$="S" THEN
    IF FILERR=0 THEN
      PROMP$=CHR$(34)+FIL$+CHR$(34)+" exists. Overwrite?"
      CHOIC$="YN"
      DEFAU$=""
      GOSUB INWORD
      IF ASKWRD$="Y" THEN FILECONTINUE=1
    ELSE
      FILECONTINUE=1
    END IF
  ELSE
    IF FILERR=1 THEN
      PUT (-150,102),BLANKLINE%,PSET
      LOCATE 25,1:PRINT CHR$(34);FIL$;CHR$(34);" doesn't exist";
    ELSE
      FILECONTINUE=1
    END IF
  END IF
  RETURN
FILERROR:
  FILERR=1:RESUME CONTINUEAFTERERROR
CANTSAVE:
  PUT (-150,102),BLANKLINE%,PSET
  LOCATE 25,1:PRINT "Cannot save";
  RESUME NEXT
STACKSPACE:
  PUT (-150,102),BLANKLINE%,PSET
  LOCATE 25,1:PRINT "Out of stack space";
  RESUME NEXT

LOGO:
LINE (4*S1+S2,1*S3+S4)-(5*S1+S2,1*S3+S4),HUE%
LINE (16*S1+S2,1*S3+S4)-(17*S1+S2,1*S3+S4),HUE%
LINE (4*S1+S2,2*S3+S4)-(16*S1+S2,2*S3+S4),HUE%
LINE (17*S1+S2,2*S3+S4)-(19*S1+S2,2*S3+S4),HUE%
LINE (2*S1+S2,3*S3+S4)-(4*S1+S2,3*S3+S4),HUE%
LINE (6*S1+S2,3*S3+S4)-(7*S1+S2,3*S3+S4),HUE%
LINE (9*S1+S2,3*S3+S4)-(10*S1+S2,3*S3+S4),HUE%
LINE (11*S1+S2,3*S3+S4)-(12*S1+S2,3*S3+S4),HUE%
LINE (14*S1+S2,3*S3+S4)-(15*S1+S2,3*S3+S4),HUE%
LINE (17*S1+S2,3*S3+S4)-(18*S1+S2,3*S3+S4),HUE%
LINE (1*S1+S2,4*S3+S4)-(5*S1+S2,4*S3+S4),HUE%
LINE (6*S1+S2,4*S3+S4)-(9*S1+S2,4*S3+S4),HUE%
LINE (10*S1+S2,4*S3+S4)-(15*S1+S2,4*S3+S4),HUE%
LINE (16*S1+S2,4*S3+S4)-(17*S1+S2,4*S3+S4),HUE%
LINE (18*S1+S2,4*S3+S4)-(19*S1+S2,4*S3+S4),HUE%
LINE (1*S1+S2,4*S3+S4)-(4*S1+S2,1*S3+S4),HUE%
LINE (5*S1+S2,5*S3+S4)-(6*S1+S2,5*S3+S4),HUE%
LINE (15*S1+S2,5*S3+S4)-(16*S1+S2,5*S3+S4),HUE%
LINE (5*S1+S2,1*S3+S4)-(5*S1+S2,5*S3+S4),HUE%
LINE (6*S1+S2,4*S3+S4)-(6*S1+S2,5*S3+S4),HUE%
LINE (8*S1+S2,2*S3+S4)-(8*S1+S2,4*S3+S4),HUE%
LINE (9*S1+S2,3*S3+S4)-(9*S1+S2,4*S3+S4),HUE%
LINE (10*S1+S2,2*S3+S4)-(10*S1+S2,4*S3+S4),HUE%
LINE (13*S1+S2,2*S3+S4)-(13*S1+S2,4*S3+S4),HUE%
LINE (15*S1+S2,4*S3+S4)-(15*S1+S2,5*S3+S4),HUE%
LINE (16*S1+S2,1*S3+S4)-(16*S1+S2,5*S3+S4),HUE%
LINE (17*S1+S2,1*S3+S4)-(17*S1+S2,2*S3+S4),HUE%
LINE (17*S1+S2,3*S3+S4)-(17*S1+S2,4*S3+S4),HUE%
LINE (18*S1+S2,3*S3+S4)-(18*S1+S2,4*S3+S4),HUE%
LINE (19*S1+S2,2*S3+S4)-(19*S1+S2,4*S3+S4),HUE%
RETURN

INNUM:
'    INPUT NUMBERS ON SCREEN LINE 25.
' ONLY ALLOWS NUMERIC CHARACTERS TO BE ENTERED,
' ALLOWS USE OF BACKSPACE, RIGHT AND LEFT ARROWS, AND ESCAPE,
' THE '5' KEY TYPES OUT THE ENTIRE DEFAULT
' AN INITIAL '+' MEANS THE INPUT WILL BE ADDED TO THE DEFAULT,
' TO SUBRACT FROM DEFAULT, START WITH '+-'
   ASKNUM$=DEFAU$:ABORT%=0:PLUS%=0:KPOS%=0:NONUM%=0
   IF VAL(DEFAU$)>0 THEN ASKNUM$=RIGHT$(DEFAU$,LEN(DEFAU$)-1)
   PUT (-150,102),BLANKLINE%,PSET
   IF LEN(PROMP$)<LINELENGTH% THEN
     LIN%=25:LOCATE LIN%,1:PRINT PROMP$;
   ELSE
     FOR X=1 TO LEN(PROMP$)/LINELENGTH%+1
     LOCATE 26-X,1:PRINT MID$(PROMP$,(X-1)*LINELENGTH%+1,LINELENGTH%);
     NEXT X
   END IF
 ANOTHERNUMBER:
   IF REP%=2 THEN
     IF LEN(MACRO$)<>0 THEN KK$=LEFT$(MACRO$,1) ELSE KK$=CHR$(13)
     IF ASC(KK$)>42 AND ASC(KK$)<58 THEN
       MACRO$=RIGHT$(MACRO$,LEN(MACRO$)-1)
     ELSE
       KK$=CHR$(13)
     END IF
   ELSE
     WHILE NOT INSTAT:WEND:KK$=UCASE$(INKEY$)
   END IF
   IF KK$=CHR$(27) THEN
      PUT (-150,102),BLANKLINE%,PSET
      ABORT%=1:LOCATE 25,1:PRINT ">";:RETURN
   END IF
   IF RIGHT$(KK$,1)=CHR$(75) AND LEN(KK$)=2 THEN KK$=CHR$(8)
   IF LEN(KK$)=2 AND RIGHT$(KK$,1)=CHR$(76) THEN
       PRINT RIGHT$(ASKNUM$,LEN(ASKNUM$)-KPOS%);
       KPOS%=LEN(ASKNUM$)
   END IF
   IF LEN(KK$)=2 AND RIGHT$(KK$,1)=CHR$(77) THEN
       IF LEN(ASKNUM$)>KPOS% THEN KK$=MID$(ASKNUM$,KPOS%+1,1)
   END IF
   IF KK$=CHR$(8) AND KPOS%>0 THEN
       KPOS%=KPOS%-1:LOCATE CSRLIN,POS-1:PRINT " ";:LOCATE 25,POS-1
   END IF
   IF ASC(KK$)>42 AND ASC(KK$)<58 AND ASC(KK$)<>47 THEN
     IF LEN(ASKNUM$)>KPOS% THEN
        RGHT$=RIGHT$(ASKNUM$,LEN(ASKNUM$)-KPOS%-1)
     ELSE
        RGHT$=""
     END IF
     ASKNUM$=LEFT$(ASKNUM$,KPOS%)+KK$+RGHT$
     KPOS%=KPOS%+1:PRINT KK$;
   END IF
   IF KK$<>CHR$(13) THEN GOTO ANOTHERNUMBER
   IF KPOS%=0 THEN ABORT%=1:NONUM%=1
   ASKNUM$=LEFT$(ASKNUM$,KPOS%)
   IF LEFT$(ASKNUM$,1)=CHR$(43) THEN
      ASKNUM$=RIGHT$(ASKNUM$,LEN(ASKNUM$)-1):PLUS%=1
   END IF
   ASKNUM=VAL(ASKNUM$)
   WHILE ASKNUM>32768:ASKNUM=ASKNUM/10:WEND
   IF KPOS%=0 AND WIPE%=1 THEN ASKNUM=999
   PUT (-150,102),BLANKLINE%,PSET
   LOCATE 25,1:PRINT ">";
   RETURN

INWORD:
'    INPUT WORDS OR LETTERS ON SCREEN LINE 25.
' ALLOWS ONLY LEGAL CHOICES TO BE INPUT,
' ALLOWS BACKSPACE, ESCAPE, AND RIGHT AND LEFT ARROWS,
' THE '5' KEY TYPES OUT THE ENTIRE DEFAULT STRING.
  ASKWRD$=DEFAU$:ABORT%=0:KPOS%=0
  PUT (-150,102),BLANKLINE%,PSET
  LOCATE 25,1:PRINT PROMP$;
 ANOTHERLETTER:
  IF REP%=2 AND MACRO$<>"" THEN
    KK$=LEFT$(MACRO$,1)
    MACRO$=RIGHT$(MACRO$,LEN(MACRO$)-1)
  ELSE
    WHILE NOT INSTAT:WEND
    KK$=UCASE$(INKEY$)
  END IF
  IF KK$=CHR$(27) THEN
    PUT (-150,102),BLANKLINE%,PSET
    ABORT%=1:LOCATE 25,1:PRINT ">";:RETURN
  END IF
  IF LEN(KK$)=2 AND RIGHT$(KK$,1)=CHR$(75) THEN KK$=CHR$(8)
  IF LEN(KK$)=2 AND RIGHT$(KK$,1)=CHR$(76) THEN
    PRINT RIGHT$(ASKWRD$,LEN(ASKWRD$)-KPOS%);:KPOS%=LEN(ASKWRD$)
  END IF
  IF LEN(KK$)=2 AND RIGHT$(KK$,1)=CHR$(77) THEN
    IF LEN(ASKWRD$)>KPOS% THEN KK$=MID$(ASKWRD$,KPOS%+1,1)
  END IF
  IF KK$=CHR$(8) AND KPOS%>0 THEN
    KPOS%=KPOS%-1
    LOCATE 25,POS-1:PRINT " ";:LOCATE 25,POS-1
  END IF
  IF INSTR(CHOIC$,KK$)<>0 OR CHOIC$="" THEN
   IF ASC(KK$)>32 THEN
     IF LEN(ASKWRD$)>KPOS% THEN
       RGHT$=RIGHT$(ASKWRD$,LEN(ASKWRD$)-KPOS%-1)
     ELSE
       RGHT$=""
     END IF
     ASKWRD$=LEFT$(ASKWRD$,KPOS%)+KK$+RGHT$
     KPOS%=KPOS%+1:PRINT KK$;
   END IF
  END IF
  IF CHOIC$="" AND KK$<>CHR$(13) THEN GOTO ANOTHERLETTER
  ASKWRD$=LEFT$(ASKWRD$,KPOS%)
  PUT (-150,102),BLANKLINE%,PSET
  LOCATE 25,1:PRINT ">";:RETURN

REPEAT:
'    READS COMMANDS FROM MACRO$ WHEN RUNNING MACROS (THE 'A' COMMAND)
 IF MACRO$="" THEN MACRO%=MACRO%-1:MACRO$=INMACRO$
 IF MACRO%=0 THEN REP%=0:GOTO STARTING
 KY$=LEFT$(MACRO$,1)
 MACRO$=RIGHT$(MACRO$,LEN(MACRO$)-1)
 GOTO SET

COLORTILE:
'  CHANGES COLORS IN TILE PATTERNS FOR WIPE COMMAND
IF EXT$=".COL" THEN
 IF TILECOLOR% MOD 12 >5 THEN
  COL=HUE% MOD 7:COLOR ,1-INT(COL/3.6)
 END IF
END IF
WIPE1$=WIPE$
FOR TILEPART=1 TO LEN(WIPE$)
 TILER%(0)=ASC(MID$(WIPE$,TILEPART,1))
 SELECT CASE TILECOLOR% MOD 5
  CASE =1
    TILER%(0)=TILER%(0)*2
    WHILE TILER%(0)>255:TILER%(0)=TILER%(0)-255:WEND
  CASE =2
    TILER%(0)=255-TILER%(0)
  CASE =3
    T1%=TILER%(0):T3%=0
    FOR T2%=1 TO 8
     T3%=T3%*2
     IF T1% MOD 2=1 THEN T3%=T3%+1
     T1%=INT(T1%/2)
    NEXT T2%
    TILER%(0)=T3%
  CASE =4
    TILER%(0)=ASC(MID$(WIPE$,LEN(WIPE$)-TILEPART+1,1))
  END SELECT
 TILER%(1)=TILER%(0) MOD 4
 TILER%(2)=(TILER%(0)-TILER%(1))/4 MOD 4
 TILER%(3)=(TILER%(0)-TILER%(1)-TILER%(2)*4)/16 MOD 4
 TILER%(4)=(TILER%(0)-TILER%(1)-TILER%(2)*4-TILER%(3)*16)/64
 FOR TLC=1 TO 4
  SELECT CASE INT(TILECOLOR%/12) MOD 6
         CASE =1
          IF TILER%(TLC)>1 THEN TILER%(TLC)=5-TILER%(TLC)
         CASE =2
          IF TILER%(TLC)=1 OR TILER%(TLC)=2 THEN TILER%(TLC)=3-TILER%(TLC)
         CASE =3
          IF TILER%(TLC)<2 THEN TILER%(TLC)=1-TILER%(TLC)
         CASE =4
          IF TILER%(TLC)=0 OR TILER%(TLC)=3 THEN TILER%(TLC)=3-TILER%(TLC)
         CASE =5
          IF TILER%(TLC)=0 OR TILER%(TLC)=2 THEN TILER%(TLC)=2-TILER%(TLC)
  END SELECT
 NEXT TLC
 TILER%(0)=TILER%(1)+TILER%(2)*4+TILER%(3)*16+TILER%(4)*64
 WHILE TILER%(0)>255:TILER%(0)=TILER%(0)-255:WEND
 MID$(WIPE1$,TILEPART,1)=CHR$(TILER%(0))
NEXT TILEPART
WIPE$=WIPE1$
RETURN

' PATTERNS 10-19
DATA 1,999
DATA 15,999
DATA 127,999 '
DATA 17,999
DATA 21,999  '
DATA 17,17,1,17,1,17,17,16,17,16,999
DATA 1,1,1,1,17,17,16,16,16,16,17,17,999
DATA 144,144,18,18,66,66,72,72,9,9,33,33,36,36,132,132,999
DATA 75,999
DATA 93,93,65,65,999

' PATTERNS 20-29
DATA 1,16,17,0,999
DATA 255,255,0,999
DATA 255,0,0,0,0,0,999
DATA 31,0,0,0,0,999
DATA 63,0,0,0,243,0,0,0,999
DATA 31,0,227,0,124,0,143,0,241,0,62,0,199,0,248,0,999
DATA 85,170,0,85,85,0,0,0,999
DATA 0,0,170,85,0,85,170,0,170,85,0,0,255,0,0,255,999
DATA 85,170,0,0,255,0,0,85,85,0,0,255,0,0,999
DATA 85,170,85,255,255,255,170,85,170,0,0,0,999

' PATTERNS 30-39
DATA 255,3,3,3,999
DATA 255,3,3,3,3,255,48,48,48,48,999
DATA 15,15,15,240,240,240,999
DATA 31,31,31,0,0,241,241,241,0,0,999
DATA 252,252,252,252,3,3,999
DATA 126,66,90,90,66,126,129,999
DATA 5,10,5,10,175,95,175,95,999
DATA 28,34,65,73,65,34,28,0,999
DATA 1,130,68,40,16,40,68,130,999
DATA 3,6,12,24,255,24,12,6,3,255,999

' PATTERNS 40-49
DATA 1,2,4,136,64,32,16,136,999
DATA 7,142,221,232,112,184,221,139,999
DATA 68,68,64,95,64,68,68,4,245,4,999
DATA 96,111,111,96,6,246,246,6,999
DATA 60,102,102,195,0,0,195,102,102,60,0,0,999
DATA 3,3,3,6,6,28,56,96,96,192,192,192,96,96,56,28,6,6,999
DATA 136,5,34,80,136,80,34,5,999
DATA 62,34,175,168,184,136,143,0,0,999
DATA 34,32,112,32,34,2,7,2,999
DATA 62,34,227,128,128,128,227,34,62,8,8,8,999

' PATTERNS 50-59
DATA 156,54,99,54,156,201,999
DATA 1,3,7,15,31,63,127,255,999
DATA 60,153,153,195,0,0,195,153,153,60,0,0,999
DATA 31,16,16,16,241,1,1,1,999
DATA 221,68,119,17,999
DATA 255,128,159,144,144,144,999
DATA 255,255,1,253,253,5,245,245,21,213,213
DATA  84,84,87,80,80,95,64,64,127,0,0,999
DATA 128,128,142,136,136,139,8,8,232,136,136,184,999
DATA 254,128,190,130,186,162,170,170,42,171,40,235,8,239,0,999
DATA 0,127,1,125,5,117,21,85,0,247,4,245,5,117,69,85,999

' PATTERNS 60-69
DATA 250,128,190,130,186,162,170,42,171,40,235,8,175,160,190,2,250
DATA  130,186,138,170,168,171,40,175,32,235,10,999
DATA 99,99,54,22,12,24,52,54,999
DATA 0,192,227,47,28,48,236,199,3,999
DATA 217,112,39,108,201,28,55,48,24,999
DATA 124,64,95,65,69,5,245,4,999
DATA 21,215,81,119,4,215,64,221,999
DATA 243,243,51,51,63,63,0,0,999
DATA 247,20,20,119,65,65,127,0,999
DATA 54,73,65,34,20,8,0,999
DATA 56,68,130,146,140,64,48,14,129,64,38,41,40,68,131,999

' PATTERNS 70-79
DATA 8,8,20,34,193,34,20,8,999
DATA 20,34,73,85,148,34,34,65,73,65,34,34,148,85,73,34,999
DATA 6,9,9,6,0,96,144,144,96,0,999
DATA 119,5,119,80,999
DATA 8,28,42,65,227,65,42,28,8,8,8,999
DATA 8,42,34,34,54,20,213,20,54,34,34,42,8,999
DATA 0,62,8,162,85,170,85,162,8,62,999
DATA 255,85,170,85,170,85,255,8,8,8,8,999
DATA 32,38,25,1,16,145,98,2,999
DATA 146,41,68,999

' PATTERNS 80-89
DATA 17,131,199,239,255,254,124,56,17,130,69,170,85,170,84,40,999
DATA 17,34,68,136,17,34,68,34,17,136,68,34,999
DATA 15,30,60,120,240,225,195,135,15,135,195,225,240,120,60,30,999
DATA 7,37,7,0,112,82,112,0,999
DATA 87,37,87,0,117,82,117,0,999
DATA 147,57,124,254,56,56,57,57,57,1,69,999
DATA 132,12,20,39,65,39,20,12,132,192,224,243,251,243,224,192,999
DATA 16,56,124,254,56,124,999
DATA 15,19,37,121,73,73,74,76,120,0,999
DATA 128,20,54,99,8,99,54,20,999

' PATTERNS 90-99
DATA 32,32,32,0,0,7,0,0,999
DATA 102,0,153,0,102,0,85,0,170,0,85,0,999
DATA 136,0,34,0,102,0,153,0,999
DATA 255,1,1,1,1,13,13,1,999
DATA 8,20,42,85,170,85,42,20,8,28,62,127,255,127,62,28,999
DATA 85,42,20,8,20,42,999
DATA 21,10,228,241,241,228,10,999
DATA 125,17,215,16,215,17,125,1,999
DATA 109,9,107,72,91,66,218,18,214,144,182,132,181,36,173,33,999
DATA 78,72,72,78,74,74,78,66,66,78,74,74,999

DATA 7,9,19,33,121,65,127,0,0,124,68,84,68,92,80,112,0,0
DATA  124,68,92,80,112,0,0,124,68,84,68,124,0,0
DATA  124,68,84,68,116,20,28,0,0,112,80,92,68,84,84,124,0,0,0,999
DATA -1
END