Challenge: 
Winner?: 
Yes
Code Snippet: 
sync on:sync rate 0
set window on
set display mode 1024,768,32
set window title "Logo Programming"


remstart
Logo Parser created by Lowerlogic
remend

cls
global error$
global error1$
global make_function=0
dim parameter$(0)
dim edall$(0)
empty array parameter$(0)
empty array edall$(0)
ink -1,0
box 0,0,screen width(),screen height()
ink 0,0
type window_type
left
top
right
bottom
endtype
global window as window_type
window.right=screen width()
window.bottom=screen height()
type xyz
   x as float
   y as float
   z as float
endtype
type status
   contact as boolean
   width as integer
   penmode as string
   heading as float
   pitch as float
   roll as float
   position as xyz
   which as integer
   visibility as boolean
   pencolor
   floodcolor
   screencolor
   Palette_use as string
endtype
global status as status
dim part$(0)
status.contact=1
status.width=1
status.penmode="paint"
status.heading=0.00
status.pitch=0.00
status.roll=0.00
status.position.x=0
status.position.y=0
status.position.z=0
status.which=0
status.visibility=1
status.pencolor=rgb(0,0,0)
status.floodcolor=rgb(0,0,0)
status.screencolor=rgb(255,255,255)
status.Palette_use="N/A"

dim color(15)
color(0)=rgb(0,0,0)           `black
color(1)=rgb(0,0,255)         `blue
color(2)=rgb(0,255,0)         `green
color(3)=rgb(0,255,255)       `cyan
color(4)=rgb(255,0,0)         `red
color(5)=rgb(255,0,255)       `magenta
color(6)=rgb(255,255,0)       `yellow
color(7)=rgb(255,255,255)     `white
color(8)=rgb(155,96,59)       `brown
color(9)=rgb(197,136,18)      `tan
color(10)=rgb(100,162,64)     `olive
color(11)=rgb(120,187,187)    `sky blue
color(12)=rgb(255,149,119)    `salmon
color(13)=rgb(144,113,208)    `medium purple
color(14)=rgb(255,163,0)      `orange
color(15)=rgb(183,183,183)    `gray
do
   read strg$
   `if len(strg$)>0 then print ">> ", strg$
   strg$=clean_up(strg$)
   `if len(strg$)>0 then print ">> ", strg$
   strg$=parse(strg$)
   `print error$,",",strg$
   rem ome error handling
   error$=upper$(error$)
   if len(strg$)>0
      if error$="NOTINST"
         output("You don't say what to do with "+first(strg$))
      endif
      if error$="NOTCOM" and len(strg$)>0
         output("I don't know how to "+first(strg$))
      endif
      if error$="NOLIKE"
         output(first(strg$)+" doesn't like "+error1$+" as input")
      endif
      if error$="NOTENOUGH"
         output("not enough inputs to "+first(strg$))
      endif
      if error$="NOOUTPUT"
         output(first(strg$)+" did not output to "+error1$)
      endif
   endif
   sync
loop
output("done")
sync
sync
wait key
end

function parse(strg$)
   while left$(strg$,1)=" "
      strg$=right$(strg$,len(strg$)-1)
   endwhile
   while right$(strg$,1)=" "
      strg$=left$(strg$,len(strg$)-1)
   endwhile
   if make_function=1
      array insert at bottom edall$(0)
      edall$(array count(edall$(0)))=strg$
   endif

   error$=""
`if len(strg$)>0 then output("Parsing ["+strg$+"]")
`sync
   sync
`wait key
   base_parameter=array count(parameter$(0))
   original_command$=first(strg$)
   if is_instruction(original_command$)=0
      error$="NOTINST"
      exitfunction strg$
   endif
   if len(original_command$)<1 then exitfunction ""
   strg$=pop(strg$)
   command$=upper$(original_command$)
   if make_function=0
      array delete element part$(0),0
      if command$="CLEARSCREEN" or command$="CS"
         ink -1,0
         box window.left,window.top,window.right,window.bottom
         ink 0,0
         status.position.x=0
         status.position.y=0
         status.position.z=0
         status.heading=0.00
         status.pitch=0.00
         status.roll=0.00
         goto done_command
      endif
      if command$="CLEAN"
         ink -1,0
         box window.left,window.top,window.right,window.bottom
         ink 0,0
         goto done_command
      endif
      if command$="HOME"
         status.position.x=0
         status.position.y=0
         status.position.z=0
         goto done_command
      endif
      if command$="PI"
         build$="3.1415926535897932384626433832795"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="PENUP" or command$="PU"
         status.contact=0
         goto done_command
      endif
      if command$="PENDOWN" or command$="PD"
         status.contact=1
         goto done_command
      endif
      if command$="PENDOWN?" or command$="PENDOWNP"
         build$="false"
         if status.contact=1
            build$="true"
         endif
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="PENPAINT" or command$="PPT"
         status.contact=1
         status.penmode="paint"
         goto done_command
      endif
      if command$="PENERASE" or command$="PE"
         status.contact=1
         status.penmode="erase"
         goto done_command
      endif
      if command$="PENREVERSE" or command$="PX"
         status.contact=1
         status.penmode="reverse"
         goto done_command
      endif
      if command$="PENNORMAL"
         status.contact=1
         status.penmode="paint"
         goto done_command
      endif
      if command$="PENMODE"
         build$=status.penmode
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="PENCOLOR" or command$="PENCOLOUR" or command$="PC"
         build$="["+str$(rgbr(status.pencolor))+" "+str$(rgbg(status.pencolor))+" "+str$(rgbb(status.pencolor))+"]"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="FLOODCOLOR" or command$="FLOODCOLOUR"
         build$="["+str$(rgbr(status.floodcolor))+" "+str$(rgbg(status.floodcolor))+" "+str$(rgbb(status.floodcolor))+"]"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="SCREENCOLOR" or command$="SCREENCOLOUR"
         build$="["+str$(rgbr(status.screencolor))+" "+str$(rgbg(status.screencolor))+" "+str$(rgbb(status.screencolor))+"]"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="MOUSEPOS"
         strg$="["+str$(mousex()-screen width()/2)+" "+str$(screen height()/2-mousey())+"] "+strg$
         goto done_command
      endif
      if command$="POS"
         strg$="["+str$(status.position.x)+" "+str$(status.position.y)+"] "+strg$
         goto done_command
      endif
      if command$="POSXYZ"
         strg$="["+str$(status.position.x)+" "+str$(status.position.y)+" "+str$(status.position.z)+"] "+strg$
         goto done_command
      endif
      if command$="XCOR"
         if len(strg$)>0
            strg$=str$(status.position.x)+" "+strg$
         else
            strg$=str$(status.position.x)
         endif
         goto done_command
      endif
      if command$="YCOR"
         if len(strg$)>0
            strg$=str$(status.position.y)+" "+strg$
         else
            strg$=str$(status.position.y)
         endif
         goto done_command
      endif
      if command$="ZCOR"
         if len(strg$)>0
            strg$=str$(status.position.z)+" "+strg$
         else
            strg$=str$(status.position.z)
         endif
         goto done_command
      endif
      if command$="HEADING"
         strg$=str$(wrapvalue(status.heading))
         goto done_command
      endif
      if command$="WORD?" or command$="WORDP"
         strg$=get_parameters$(original_command$,strg$,"S")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$="false"
         parameter$(base_parameter+1)=getval(parameter$(base_parameter+1))
         if left$(parameter$(base_parameter+1),1)=chr$(34) then build$="true"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="LIST?" or command$="LISTP"
         strg$=get_parameters$(original_command$,strg$,"S")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$="false"
         parameter$(base_parameter+1)=getval(parameter$(base_parameter+1))
         if is_list(parameter$(base_parameter+1)) then build$="true"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="ARRAY?" or command$="ARRAYP"
         strg$=get_parameters$(original_command$,strg$,"S")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$="false"
         parameter$(base_parameter+1)=getval(parameter$(base_parameter+1))
         if is_array(parameter$(base_parameter+1)) then build$="true"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="EMPTY?" or command$="EMPTYP"
         strg$=get_parameters$(original_command$,strg$,"S")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$="false"
         parameter$(base_parameter+1)=getval(parameter$(base_parameter+1))
         if len(parameter$(base_parameter+1))=1
            if is_number(parameter$(base_parameter+1))=0 then build$="true"
         else
            if len(parameter$(base_parameter+1))=2 and left$(parameter$(base_parameter+1),1)="[" then build$="true"
         endif
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="SETX"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         oldx#=status.position.x
         oldy#=status.position.y
         oldz#=status.position.z
         status.position.x=val(parameter$(base_parameter+1))
         if status.contact=1 then drawline(oldx#,oldy#,status.position.x,status.position.y)
         goto done_command
      endif
      if command$="SETY"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         oldx#=status.position.x
         oldy#=status.position.y
         oldz#=status.position.z
         status.position.y=val(parameter$(base_parameter+1))
         if status.contact=1 then drawline(oldx#,oldy#,status.position.x,status.position.y)
         goto done_command
      endif
      if command$="SETZ"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         oldx#=status.position.x
         oldy#=status.position.y
         oldz#=status.position.z
         status.position.z=val(parameter$(base_parameter+1))
         if status.contact=1 then drawline(oldx#,oldy#,status.position.x,status.position.y)
         goto done_command
      endif
      if command$="FORWARD" or command$="FD"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         oldx#=status.position.x
         oldy#=status.position.y
         oldz#=status.position.z
         status.position.x=status.position.x+val(parameter$(base_parameter+1))*sin(status.heading)
         status.position.y=status.position.y+val(parameter$(base_parameter+1))*cos(status.heading)
         if status.contact=1 then drawline(oldx#,oldy#,status.position.x,status.position.y)
         goto done_command
      endif
      if command$="LEFT" or command$="LT"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         status.heading=status.heading-val(parameter$(base_parameter+1))
         goto done_command
      endif
      if command$="RIGHT" or command$="RT"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         status.heading=status.heading+val(parameter$(base_parameter+1))
         goto done_command
      endif
      if command$="BACK" or command$="BK"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         oldx#=status.position.x
         oldy#=status.position.y
         oldz#=status.position.z
         status.position.x=status.position.x-val(parameter$(base_parameter+1))*sin(status.heading)
         status.position.y=status.position.y-val(parameter$(base_parameter+1))*cos(status.heading)
         if status.contact=1 then drawline(oldx#,oldy#,status.position.x,status.position.y)
         goto done_command
      endif
      if command$="SQRT"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$((sqrt(val(parameter$(base_parameter+1)))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="ABS"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$((abs(val(parameter$(base_parameter+1)))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="INT"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$((int(val(parameter$(base_parameter+1)))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="ROUND"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$((int(0.5+val(parameter$(base_parameter+1)))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="MINUS"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$((0-(val(parameter$(base_parameter+1)))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="SIGN"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$="0"
         if val(parameter$(base_parameter+1))<0 then build$="-1"
         if val(parameter$(base_parameter+1))>0 then build$="1"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="LOG10"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$(log(val(parameter$(base_parameter+1)),10,6))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="LN"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$(log(val(parameter$(base_parameter+1)),2.71828183,6))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="TAN"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$(tan(val(parameter$(base_parameter+1))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="SIN"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$(sin(val(parameter$(base_parameter+1))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="COS"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$(cos(val(parameter$(base_parameter+1))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="ARCTAN"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$(atan(val(parameter$(base_parameter+1))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="ARCSIN"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$(asin(val(parameter$(base_parameter+1))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="ARCCOS"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$(acos(val(parameter$(base_parameter+1))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="NOT"
         strg$=get_parameters$(original_command$,strg$,"B")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if parameter$(base_parameter+1)="FALSE" then build$="true" else build$="false"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="RANDOM"
         strg$=get_parameters$(original_command$,strg$,"I")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if val(parameter$(base_parameter+1))<1 then parameter$(base_parameter+1)="1"
         build$=str$(rnd(val(parameter$(base_parameter+1))-1))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="EXP"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$(2.71828183^val(parameter$(base_parameter+1)))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="WAIT"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         sleep val(parameter$(base_parameter+1))/60.0*1000.0
         goto done_command
      endif
      if command$="BYE"
         end
         `goto done_command
      endif
      if command$="PRINT" or command$="SHOW" or command$="TYPE"
         strg$=get_parameters$(original_command$,strg$,"S")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if command$="PRINT" or command$="TYPE"
            if left$(parameter$(base_parameter+1),1)="["
               parameter$(base_parameter+1)=right$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
               if right$(parameter$(base_parameter+1),1)="]" then parameter$(base_parameter+1)=left$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
            endif
         endif
         if command$="PRINT" or command$="SHOW"
            output(parameter$(base_parameter+1))
         else
            type0(parameter$(base_parameter+1))
         endif
         goto done_command
      endif
      if command$="SETPOS"
         strg$=get_parameters$(original_command$,strg$,"L")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if left$(parameter$(base_parameter+1),1)="[" then parameter$(base_parameter+1)=right$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
         if right$(parameter$(base_parameter+1),1)="]" then parameter$(base_parameter+1)=left$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
         oldx#=status.position.x
         oldy#=status.position.y
         oldz#=status.position.z
         status.position.x=val(getval(first(parameter$(base_parameter+1))))
         parameter$(base_parameter+1)=pop(parameter$(base_parameter+1))
         status.position.y=val(getval(first(parameter$(base_parameter+1))))
         if status.contact=1 then drawline(oldx#,oldy#,status.position.x,status.position.y)
         goto done_command
      endif
      if command$="TOWARDS"
         strg$=get_parameters$(original_command$,strg$,"L")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if left$(parameter$(base_parameter+1),1)="[" then parameter$(base_parameter+1)=right$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
         if right$(parameter$(base_parameter+1),1)="]" then parameter$(base_parameter+1)=left$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
         targetx#=val(getval(first(parameter$(base_parameter+1))))
         parameter$(base_parameter+1)=pop(parameter$(base_parameter+1))
         targety#=val(getval(first(parameter$(base_parameter+1))))
         targetangle#=wrapvalue(atanfull(-(targetx#-status.position.x),targety#-status.position.y))
         angle#=wrapvalue(status.heading)
         turn#=angle#-targetangle#
         while turn#<0
            inc turn#,360
         endwhile
         while turn#>=360
            dec turn#,360
         endwhile
         build$=str$(turn#)
         strg$=build$+" "+strg$
         goto done_command
      endif
      if command$="DISTANCE"
         strg$=get_parameters$(original_command$,strg$,"L")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if left$(parameter$(base_parameter+1),1)="[" then parameter$(base_parameter+1)=right$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
         if right$(parameter$(base_parameter+1),1)="]" then parameter$(base_parameter+1)=left$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
         targetx#=val(getval(first(parameter$(base_parameter+1))))
         parameter$(base_parameter+1)=pop(parameter$(base_parameter+1))
         targety#=val(getval(first(parameter$(base_parameter+1))))
         distance#=sqrt((targetx#-status.position.x)^2+(targety#-status.position.y)^2)
         build$=str$(distance#)
         strg$=build$+" "+strg$
         goto done_command
      endif
      if command$="SETPOSXYZ"
         strg$=get_parameters$(original_command$,strg$,"L")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if left$(parameter$(base_parameter+1),1)="[" then parameter$(base_parameter+1)=right$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
         if right$(parameter$(base_parameter+1),1)="]" then parameter$(base_parameter+1)=left$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
         oldx#=status.position.x
         oldy#=status.position.y
         oldz#=status.position.z
         status.position.x=val(getval(first(parameter$(base_parameter+1))))
         parameter$(base_parameter+1)=pop(parameter$(base_parameter+1))
         status.position.y=val(getval(first(parameter$(base_parameter+1))))
         parameter$(base_parameter+1)=pop(parameter$(base_parameter+1))
         status.position.z=val(getval(first(parameter$(base_parameter+1))))
         if status.contact=1 then drawline(oldx#,oldy#,status.position.x,status.position.y)
         goto done_command
      endif
      if command$="SETPENCOLOR" or command$="SETPENCOLOUR" or command$="SETPC"
         strg$=get_parameters$(original_command$,strg$,"S")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if is_list(parameter$(base_parameter+1))=1
            if left$(parameter$(base_parameter+1),1)="[" then parameter$(base_parameter+1)=right$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
            if right$(parameter$(base_parameter+1),1)="]" then parameter$(base_parameter+1)=left$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
            red=val(getval(first(parameter$(base_parameter+1))))
            parameter$(base_parameter+1)=pop(parameter$(base_parameter+1))
            green=val(getval(first(parameter$(base_parameter+1))))
            parameter$(base_parameter+1)=pop(parameter$(base_parameter+1))
            blue=val(getval(first(parameter$(base_parameter+1))))
            status.pencolor=rgb(red,green,blue)
         else
            c$=getval(parameter$(base_parameter+1))
            if is_integer(c$)=1
               c=val(c$)
               status.pencolor=color(c)
            endif
         endif
         goto done_command
      endif
      if command$="SETFLOODCOLOR" or command$="SETFLOODCOLOUR" or command$="SETFC"
         strg$=get_parameters$(original_command$,strg$,"S")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if is_list(parameter$(base_parameter+1))=1
            if left$(parameter$(base_parameter+1),1)="[" then parameter$(base_parameter+1)=right$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
            if right$(parameter$(base_parameter+1),1)="]" then parameter$(base_parameter+1)=left$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
            red=val(getval(first(parameter$(base_parameter+1))))
            parameter$(base_parameter+1)=pop(parameter$(base_parameter+1))
            green=val(getval(first(parameter$(base_parameter+1))))
            parameter$(base_parameter+1)=pop(parameter$(base_parameter+1))
            blue=val(getval(first(parameter$(base_parameter+1))))
            status.floodcolor=rgb(red,green,blue)
         else
            c$=getval(parameter$(base_parameter+1))
            if is_integer(c$)=1
               c=val(c$)
               status.floodcolor=color(c)
            endif
         endif
         goto done_command
      endif
      if command$="SETSCREENCOLOR" or command$="SETSCREENCOLOUR" or command$="SETSC"
         strg$=get_parameters$(original_command$,strg$,"S")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if is_list(parameter$(base_parameter+1))=1
            if left$(parameter$(base_parameter+1),1)="[" then parameter$(base_parameter+1)=right$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
            if right$(parameter$(base_parameter+1),1)="]" then parameter$(base_parameter+1)=left$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1)
            red=val(getval(first(parameter$(base_parameter+1))))
            parameter$(base_parameter+1)=pop(parameter$(base_parameter+1))
            green=val(getval(first(parameter$(base_parameter+1))))
            parameter$(base_parameter+1)=pop(parameter$(base_parameter+1))
            blue=val(getval(first(parameter$(base_parameter+1))))
            status.screencolor=rgb(red,green,blue)
            ink status.screencolor,0
            box window.left, window.top, window.right, window.bottom
         else
            c$=getval(parameter$(base_parameter+1))
            if is_integer(c$)=1
               c=val(c$)
               status.screencolor=color(c)
               ink status.screencolor,0
               box window.left, window.top, window.right, window.bottom
            endif
         endif
         goto done_command
      endif
      if command$="SETHEADING" or command$="SETH"
         strg$=get_parameters$(original_command$,strg$,"N")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         status.heading=val(parameter$(base_parameter+1))
         goto done_command
      endif
      if command$="REPEAT"
         if upper$(first(strg$))="FOREVER"
            forever=1
            strg$=pop(strg$)
            strg$=get_parameters$(original_command$,strg$,"L")
         else
            strg$=get_parameters$(original_command$,strg$,"NL")
         endif
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if forever=0
            lock pixels
            for n=1 to val(parameter$(base_parameter+1))
               parse(left$(right$(parameter$(base_parameter+2),len(parameter$(base_parameter+2))-1),len(parameter$(base_parameter+2))-2))
            next n
            unlock pixels
         else
            do
               parse(left$(right$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1),len(parameter$(base_parameter+1))-2))
               sync
            loop
         endif
         goto done_command
      endif
      if command$="IF"
         strg$=get_parameters$(original_command$,strg$,"BL")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if upper$(parameter$(base_parameter+1))="TRUE"
            parse(left$(right$(parameter$(base_parameter+2),len(parameter$(base_parameter+2))-1),len(parameter$(base_parameter+2))-2))
         endif
         goto done_command
      endif
      if command$="IFELSE"
         strg$=get_parameters$(original_command$,strg$,"BLL")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if upper$(parameter$(base_parameter+1))="TRUE"
            parse(left$(right$(parameter$(base_parameter+2),len(parameter$(base_parameter+2))-1),len(parameter$(base_parameter+2))-2))
         else
            parse(left$(right$(parameter$(base_parameter+3),len(parameter$(base_parameter+3))-1),len(parameter$(base_parameter+3))-2))
         endif
         goto done_command
      endif
      if command$="RUN"
         strg$=get_parameters$(original_command$,strg$,"L")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         parse(left$(right$(parameter$(base_parameter+1),len(parameter$(base_parameter+1))-1),len(parameter$(base_parameter+1))-2))
         goto done_command
      endif
      if command$="AND"
         strg$=get_parameters$(original_command$,strg$,"BB")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if parameter$(base_parameter+1)="TRUE" and parameter$(base_parameter+2)="TRUE" then build$="true" else build$="false"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="LIST"
         strg$=get_parameters$(original_command$,strg$,"SS")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         for n=1 to 2
            if left$(parameter$(base_parameter+n),1)=chr$(34)
               parameter$(base_parameter+n)=right$(parameter$(base_parameter+n),len(parameter$(base_parameter+n))-1)
            else
               if left$(parameter$(base_parameter+n),1)=":"
                  parameter$(base_parameter+n)=getval(parameter$(base_parameter+n))
               endif
            endif
         next n
         build$="["
         for n=1 to 1
            build$=build$+parameter$(base_parameter+1)+" "
         next n
         build$=build$+parameter$(base_parameter+n)+"]"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="OR"
         strg$=get_parameters$(original_command$,strg$,"BB")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         if parameter$(base_parameter+1)="TRUE" or parameter$(base_parameter+2)="TRUE" then build$="true" else build$="false"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="SUM"
         strg$=get_parameters$(original_command$,strg$,"NN")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$((val(parameter$(base_parameter+1))+val(parameter$(base_parameter+2))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="DIFFERENCE"
         strg$=get_parameters$(original_command$,strg$,"NN")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$((val(parameter$(base_parameter+1))-val(parameter$(base_parameter+2))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="PRODUCT"
         strg$=get_parameters$(original_command$,strg$,"NN")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$((val(parameter$(base_parameter+1))*val(parameter$(base_parameter+2))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="QUOTIENT"
         strg$=get_parameters$(original_command$,strg$,"NN")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$((val(parameter$(base_parameter+1))/val(parameter$(base_parameter+2))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="POWER"
         strg$=get_parameters$(original_command$,strg$,"NN")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$=str$((val(parameter$(base_parameter+1))^val(parameter$(base_parameter+2))))
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command
      endif
      if command$="LESS?" or command$="LESSP"
         strg$=get_parameters$(original_command$,strg$,"NN")
         if error$<>"" then prepareexit(base_parameter):exitfunction strg$
         build$="false"
        ` output("<"+parameter$(base_parameter+1)+">")
        ` output("<"+parameter$(base_parameter+2)+">")
         if val(parameter$(base_parameter+1))<val(parameter$(base_parameter+2)) then build$="true"
         if len(strg$)>0
            strg$=build$+" "+strg$
         else
            strg$=build$
         endif
         goto done_command