%Include "ie:terminal.inc"
%Include "ie:ie.inc"
%Include "inc:util.imp"
%include "inc:dict.imp"

%Constinteger No Of Progs = 17
%Conststring(15)%Array Program Name (1:No Of Progs)=
   "Hideous",
   "Graphan",
   "Persian",
   "Rubik",
   "Gas",
   "Succ",
   "Tetra",
   "Sparkle",
   "Manclock",
   "Clock",
   "Harmony",
   "Spirodem",
   "Ted",
   "Spiro",
   "Nut",
   "Pacman",
   "Denis"

%Conststring(40)%Array Description (1:No Of Progs)=
   "Arms to legs program",
   "Tower of Hanoi",
   "Persian patterns",
   "Rubik cube manipulator",
   "Rotating APM sign",
   "Long road to the APM",
   "Tetrahedrons",
   "Coat of arms",
   "Clock - time prompted for",
   "Clock - time obtained from filestore",
   "Harmonograph emulator",
   "Spiro patterns",
   "Leaf Cell Editor",
   "Spirograph emulator",
   "Tunnel of rectangles L1.5 graphics reqd",
   "Pacman game",
   "Denis game"

%Conststring(15)%Array File Name (1:No Of Progs)=
   "ademo:Hideous",
   "ademo:Graphan",
   "ademo:Persian",
   "ademo:Rubik",
   "ademo:Gas",
   "ademo:Succ",
   "ademo:Tetra",
   "ademo:Sparkle",
   "ademo:Manclock",
   "ademo:Clock",
   "ademo:Harmony",
   "ademo:Spirodem",
   "vlsi:ted",
   "ademo:spiro",
   "ademo:nut",
   "games:pacman",
   "games:denis"

%Externalroutinespec Run Program (%String(255) program)

%integer %function Default Terminal 
   %integer At
   %string (255) T                               

   At = Ref Name ("TERMINAL", Com Dict)
   %if At > 0 %start
      Trans Name (Integer (At), T)
      To Upper (T)
      %if T = "VISUAL200" %start
         %result = Visual 200
      %else %if T = "VISUAL55"
         %result = Visual 55
      %else %if T = "VT220"
         %result = VT220
      %else %if T = "WY75"
         %result = WY75
      %finish
   %finish
   %Result = Visual 200
%end

%Begin
   %Integer i,c,n,p
   %String (255) message
   %Switch mev (0:15)

   Terminal Model = Default Terminal
   Set Terminal Characteristics
   Set Up Terminal
   %Cycle
      Clear Screen
      Printstring (%c
"W e l c o m e   t o   t h e   A P M   d e m o n s t r a t i o n   s u i t e")
      Cursor (0,1)
      Printsymbol ('-') %for i = 1,1,80
      Cursor (0,3)
      Printstring (%c
"Use cursor keys to select program, and RETURN to run it. CTRL-Z stops suite")
      Cursor (0,5)
      Feature
      Printstring (Program Name (1))
      Normal
      Cursor (40,5)
      Printstring (Description (1))

      %For i = 2,1,No Of Progs %Cycle
         Cursor (0,i+4)
         Printstring (Program Name (i))
         Cursor (40,i+4)
         Printstring (Description (i))
      %Repeat

      p = 1
      %Cycle
         c = Get Key
         n = p
         %If c = Up Key %Start
            %If p > 1 %Then n = p - 1 %Else n = No Of Progs
         %Elseif c = Down Key 
            %If p < No Of Progs %Then n = p + 1 %Else n = 1
         %Elseif c = CR
            %Exit
         %Elseif c = SUB
            Cursor (0,23)
            Reset Terminal
            %Stop
         %Else
            PrintSymbol (Bel)
         %Finish
         %If n # p %Start
             Cursor (0,p+4)
             PrintString (Program Name (p))
             Cursor (0,n+4)
             Feature
             PrintString (Program Name (n))
             Normal
             p = n
         %Finish
      %Repeat
      Cursor (0,No Of Progs+4+2)
      Reset Terminal
      %Begin
         %on 3 %start
            Open Input (0,":t")
            -> ok
         %Finish
         Open Input (0,Filename(p).".dat")
      ok:
      %End
      Prompt (":")
      Run Program (Filename(p))
      Set Up Terminal
      %While testsymbol >= 0 %cycle; %repeat
      Close Input
      Open Input (0,":t")
      Close Output
      Open Output (0,":t")
      -> mev(Event_Event)

mev(0):
      %Continue %If event_sub = 0 %or event_sub = 1
      %If event_sub = 2 %or event_sub = 3 %Start
         c = (event_extra&16_FFFFF0)
         %If c = 16_E20000 %Start
            message = "program requires graphics board"    
         %Elseif c = 16_07FFF0 
            message = "program requires a mouse"
         %Else
            message = "program requires something at ".itos(event_extra,0)
         %Finish
      %Else
         message = "something catastrophic"
      %Finish
      -> service
mev(9):
      %Continue
mev(*):
      message = event_message
      -> service

service:
      Cursor (0,22)
      Erase Line
      Printsymbol(7)
      Printstring ("Program failed : ".message);newline
      Erase Line
      Printstring ("Type any key to continue")
      c = get key
   %Repeat
%Endofprogram
