home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff249.lzh / TurMite / TurMite.c < prev    next >
Text File  |  1989-09-14  |  34KB  |  1,205 lines

  1. /*
  2.       TurMite.c        Gary Teachout     September  1989
  3.  
  4.       lc -L TurMite    To compile and link with Lattice 5.0
  5. */
  6.  
  7.  #include <intuition/intuition.h>
  8.  
  9.  #define FPEN        3
  10.  #define DPEN        3
  11.  #define BPEN        0
  12.  #define PLANES      2
  13.  #define CMAX        4
  14.  #define TOPLINE     11
  15.  
  16.  struct menubox
  17.  {
  18.    struct MenuItem      item  ;
  19.    struct IntuiText     text  ;
  20.  }  ;
  21.  
  22.  struct IntuitionBase      *IntuitionBase  ;
  23.  struct GfxBase            *GfxBase  ;
  24.  
  25.  struct IntuiMessage       *mes  ;
  26.  struct Screen             *screen  ;
  27.  struct Window             *window  ;
  28.  
  29.  ULONG   class  ;
  30.  USHORT  code  ;
  31.  
  32.  struct  NewScreen   ns =
  33.  {
  34.    0 , 0 , 320 , 200 , PLANES , DPEN , BPEN , 0 ,
  35.    CUSTOMSCREEN , NULL , NULL , NULL , NULL
  36.  }  ;
  37.  
  38.  UBYTE   *title[ 2 ] =
  39.  {
  40.    "  TurMite" ,
  41.    "  Edit Field"
  42.  }  ;
  43.  
  44.  struct TextAttr  stext = { "topaz.font" , 8 , 0 , 0 }  ;
  45.  
  46.  struct  NewWindow
  47.    nw =
  48.    {
  49.       0 , 0 , 320 , 200 , DPEN , BPEN ,
  50.       MENUPICK | MENUVERIFY | MOUSEBUTTONS ,
  51.       SMART_REFRESH | ACTIVATE | BACKDROP | BORDERLESS ,
  52.       NULL , NULL , NULL , 
  53.       NULL , NULL , 0 , 0 , 0 , 0 , CUSTOMSCREEN
  54.    } ,
  55.    nwr =
  56.    {
  57.       25 , 20 , 270 , 154 , BPEN , DPEN ,
  58.       GADGETDOWN | GADGETUP | MENUVERIFY | RAWKEY ,
  59.       SMART_REFRESH | ACTIVATE ,
  60.       NULL , NULL , "  Rule Tables" , 
  61.       NULL , NULL , 0 , 0 , 0 , 0 , CUSTOMSCREEN
  62.    }  ;
  63.  
  64.  USHORT chip   pointer[ 20 ] =
  65.  {
  66.    0x0000 , 0x0000 ,
  67.    0x8000 , 0x0000 ,
  68.    0xc000 , 0x0000 ,
  69.    0xa000 , 0x0000 ,
  70.    0x9000 , 0x0000 ,
  71.    0x8800 , 0x0000 ,
  72.    0x8400 , 0x0000 ,
  73.    0x8000 , 0x0000 ,
  74.    0x0000 , 0x0000 ,
  75.    0x0000 , 0x0000
  76.  }  ;
  77.  
  78.  struct Menu
  79.    menulist[ 2 ] =
  80.    {
  81.       {  NULL , 1   , 0 , 90 , 8  , MENUENABLED , " Control" , NULL } ,
  82.       {  NULL , 1   , 0 , 90 , 8  , MENUENABLED , " Edit" , NULL }
  83.    }  ;
  84.  
  85.  struct menubox 
  86.    controlmenu[ 9 ] =
  87.    {
  88.       {
  89.          {  NULL , 0 , 0  , 140 , 11 , 
  90.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ | CHECKIT ,
  91.             0x02 , NULL , NULL , 'S' , NULL , NULL } ,
  92.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Stop" , NULL } 
  93.       } ,
  94.       {
  95.          {  NULL , 0 , 11 , 140 , 11 , 
  96.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ | CHECKIT | CHECKED ,
  97.             0x01 , NULL , NULL , 'G' , NULL , NULL } ,
  98.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Go" , NULL } 
  99.       } ,
  100.       {
  101.          {  NULL , 0 , 22 , 140 , 11 , 
  102.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ 
  103.             | CHECKIT | CHECKED | MENUTOGGLE ,
  104.             0 , NULL , NULL , 'F' , NULL , NULL } ,
  105.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Fast" , NULL } 
  106.       } ,
  107.       {
  108.          {  NULL , 0 , 33 , 140 , 11 , 
  109.             ITEMTEXT | ITEMENABLED | HIGHCOMP ,
  110.             0 , NULL , NULL , 0 , NULL , NULL } ,
  111.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Restart" , NULL } 
  112.       } ,
  113.       {
  114.          {  NULL , 0 , 44 , 140 , 11 , 
  115.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  116.             0 , NULL , NULL , 'J' , NULL , NULL } ,
  117.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Jumble" , NULL } 
  118.       } ,
  119.       {
  120.          {  NULL , 0 , 55 , 140 , 11 , 
  121.             ITEMTEXT | ITEMENABLED | HIGHCOMP ,
  122.             0 , NULL , NULL , 0 , NULL , NULL } ,
  123.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Field Size" , NULL } 
  124.       } ,
  125.       {
  126.          {  NULL , 0 , 66 , 140 , 11 , 
  127.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  128.             0 , NULL , NULL , 'E' , NULL , NULL } ,
  129.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Edit Field" , NULL } 
  130.       } ,
  131.       {
  132.          {  NULL , 0 , 77 , 140 , 11 , 
  133.             ITEMTEXT | ITEMENABLED | HIGHCOMP ,
  134.             0 , NULL , NULL , 0 , NULL , NULL } ,
  135.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "New Rule" , NULL } 
  136.       } ,
  137.       {
  138.          {  NULL , 0 , 94 , 140 , 11 , 
  139.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  140.             0 , NULL , NULL , 'Q' , NULL , NULL } ,
  141.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Quit" , NULL } 
  142.       } 
  143.    } ,
  144.    sizesub[ 2 ] =
  145.    {
  146.       {
  147.          {  NULL , 130 , 0  , 135 , 11 , 
  148.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  149.             0 , NULL , NULL , 'L' , NULL , NULL } ,
  150.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "320 * 189" , NULL } 
  151.       } ,
  152.       {
  153.          {  NULL , 130 , 11 , 135 , 11 , 
  154.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ,
  155.             0 , NULL , NULL , 'H' , NULL , NULL } ,
  156.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "640 * 389" , NULL } 
  157.       }
  158.    } ,
  159.    restartsub[ 4 ] =
  160.    {
  161.       {
  162.          {  NULL , 130 , 0  , 115 , 11 , 
  163.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  164.             0 , NULL , NULL , '1' , NULL , NULL } ,
  165.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Black" , NULL } 
  166.       } ,
  167.       {
  168.          {  NULL , 130 , 11 , 115 , 11 , 
  169.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  170.             0 , NULL , NULL , '2' , NULL , NULL } ,
  171.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Red" , NULL } 
  172.       } ,
  173.       {
  174.          {  NULL , 130 , 22 , 115 , 11 , 
  175.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  176.             0 , NULL , NULL , '3' , NULL , NULL } ,
  177.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Blue" , NULL } 
  178.       } ,
  179.       {
  180.          {  NULL , 130 , 33 , 115 , 11 , 
  181.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ,
  182.             0 , NULL , NULL , '4' , NULL , NULL } ,
  183.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Yellow" , NULL } 
  184.       }
  185.    } ,
  186.    rulesub[ 2 ] =
  187.    {
  188.       {
  189.          {  NULL , 130 , 0  , 120 , 11 , 
  190.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  191.             0 , NULL , NULL , 'R' , NULL , NULL } ,
  192.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Random" , NULL } 
  193.       } ,
  194.       {
  195.          {  NULL , 130 , 11 , 120 , 11 , 
  196.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ,
  197.             0 , NULL , NULL , 'C' , NULL , NULL } ,
  198.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Custom" , NULL } 
  199.       }
  200.    } ,
  201.    editmenu[ 3 ] =
  202.    {
  203.       {
  204.          {  NULL , 0 , 0  , 170 , 11 , 
  205.             ITEMTEXT | ITEMENABLED | HIGHCOMP ,
  206.             0 , NULL , NULL , 0 , NULL , NULL } ,
  207.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Color" , NULL } 
  208.       } ,
  209.       {
  210.          {  NULL , 0 , 11 , 170 , 11 , 
  211.             ITEMTEXT | ITEMENABLED | HIGHCOMP ,
  212.             0 , NULL , NULL , 0 , NULL , NULL } ,
  213.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Blank Field" , NULL } 
  214.       } ,
  215.       {
  216.          {  NULL , 0 , 22 , 170 , 11 , 
  217.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  218.             0 , NULL , NULL , 'C' , NULL , NULL } ,
  219.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Continue" , NULL } 
  220.       } 
  221.    } ,
  222.    colorsub[ 5 ] =
  223.    {
  224.       {
  225.          {  NULL , 130 , 0  , 150 , 11 , 
  226.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ | CHECKIT ,
  227.             0x1e , NULL , NULL , 'E' , NULL , NULL } ,
  228.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Black" , NULL } 
  229.       } ,
  230.       {
  231.          {  NULL , 130 , 11 , 150 , 11 , 
  232.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ | CHECKIT ,
  233.             0x1d , NULL , NULL , 'R' , NULL , NULL } ,
  234.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Red" , NULL } 
  235.       } ,
  236.       {
  237.          {  NULL , 130 , 22 , 150 , 11 , 
  238.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ | CHECKIT ,
  239.             0x1b , NULL , NULL , 'B' , NULL , NULL } ,
  240.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Blue" , NULL } 
  241.       } ,
  242.       {
  243.          {  NULL , 130 , 33 , 150 , 11 , 
  244.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ | CHECKIT ,
  245.             0x17 , NULL , NULL , 'Y' , NULL , NULL } ,
  246.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Yellow" , NULL } 
  247.       } ,
  248.       {
  249.          {  NULL , 130 , 44 , 150 , 11 , 
  250.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ | CHECKIT ,
  251.             0x0f , NULL , NULL , 'S' , NULL , NULL } ,
  252.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Start Point" , NULL } 
  253.       }
  254.    }  ;
  255.  
  256.  struct Gadget
  257.    tabgadget[ 48 ] =
  258.    {
  259.       {  NULL , 0 , 0 , 12 , 12 ,
  260.          GADGHNONE , GADGIMMEDIATE , BOOLGADGET , 
  261.          NULL , NULL , NULL , 0 , NULL , 0 , NULL   }
  262.    } ,
  263.    congadget[ 4 ] =
  264.    {
  265.       {  NULL , 10  , 120 , 120 , 11 ,
  266.          GADGHCOMP , RELVERIFY , BOOLGADGET , 
  267.          NULL , NULL , NULL , 0 , NULL , 100 , NULL } ,
  268.       {  NULL , 140 , 120 , 120 , 11 ,
  269.          GADGHCOMP , RELVERIFY , BOOLGADGET , 
  270.          NULL , NULL , NULL , 0 , NULL , 101 , NULL } ,
  271.       {  NULL , 10  , 138 , 120 , 11 ,
  272.          GADGHCOMP , RELVERIFY , BOOLGADGET , 
  273.          NULL , NULL , NULL , 0 , NULL , 102 , NULL } ,
  274.       {  NULL , 140 , 138 , 120 , 11 ,
  275.          GADGHCOMP , RELVERIFY , BOOLGADGET , 
  276.          NULL , NULL , NULL , 0 , NULL , 103 , NULL }
  277.    }  ;
  278.  
  279.  struct IntuiText    context[ 4 ] =
  280.  {
  281.    {  3 , BPEN , JAM1 , 40 , 2 , NULL , "CLEAR" , NULL  } ,
  282.    {  3 , BPEN , JAM1 , 40 , 2 , NULL , "RESET" , NULL  } ,
  283.    {  3 , BPEN , JAM1 , 52 , 2 , NULL , "OK     O" , NULL  } ,
  284.    {  3 , BPEN , JAM1 , 36 , 2 , NULL , "CANCEL   C" , NULL  }
  285.  }  ;
  286.  
  287.  struct Border    borders[ 2 ] =
  288.  {
  289.    {  0 , 0 , 2 , 0 , JAM1 , 5 } ,
  290.    {  -1 , -1 , 2 , 0 , JAM1 , 5 }
  291.  }  ;
  292.  
  293.  short   xyborders[ 2 ][ 10 ] =
  294.  {
  295.    {  0 , 0 , 11 , 0 , 11 , 11 , 0 , 11 , 0 , 0  } ,
  296.    {  0 , 0 , 121 , 0 , 121 , 12 , 0 , 12 , 0 , 0  }
  297.  } ;
  298.  
  299.  UBYTE   digit[ 5 ] = "1234"  ;
  300.  
  301.  long    wx , wy , wpr , wprm , wt , wll ;
  302.  USHORT  *wp0 , *wp1 , mask1 = 1 , mask0 = 0xfffe , dir , os ,
  303.          stopflag = 0 , fast = 1 , fieldsize = 1  ;
  304.  
  305.  
  306.  USHORT /* xxx[ state ][ color ] */
  307.    state[ 4 ][ 4 ] =
  308.    {  {  0 , 2 , 0 , 1  } ,
  309.       {  2 , 0 , 1 , 0  } ,
  310.       {  2 , 0 , 1 , 1  } ,
  311.       {  0 , 0 , 0 , 0  }  }  ,
  312.    color[ 4 ][ 4 ] =
  313.    {  {  3 , 1 , 0 , 3  } ,
  314.       {  1 , 2 , 2 , 0  } ,
  315.       {  0 , 3 , 3 , 1  } ,
  316.       {  0 , 0 , 0 , 0  }  }  ,
  317.    motion[ 4 ][ 4 ] =
  318.    {  {  1 , 1 , 3 , 1  } ,
  319.       {  3 , 1 , 3 , 0  } ,
  320.       {  3 , 1 , 3 , 3  } ,
  321.       {  0 , 0 , 0 , 0  }  }  ;
  322.  
  323.  
  324.  char                   *AllocMem()  ;
  325.  struct Screen          *OpenScreen()  ;
  326.  struct Window          *OpenWindow()  ;
  327.  struct IntuiMessage    *GetMsg()  ;
  328.  
  329.  void    cleanup( void )  ;
  330.  void    turmite( void )  ;
  331.  UBYTE   random( UBYTE )  ;
  332.  void    handlemsg( void )  ;
  333.  void    handlemenu( void )  ;
  334.  void    randrule( void )  ;
  335.  void    stoploop( void )  ;
  336.  void    editmode( void )  ;
  337.  void    field( USHORT )  ;
  338.  void    randomrule( void )  ;
  339.  void    customrule( void )  ;
  340.  void    jumble( void )  ;
  341.  
  342.  
  343.  void main()
  344.  {
  345.    short    ii , i , j , k  ;
  346.  
  347.    IntuitionBase = ( struct IntuitionBase * )
  348.                    OpenLibrary( "intuition.library" , 33 )  ;
  349.    if ( ! IntuitionBase )
  350.       cleanup()  ;
  351.  
  352.    GfxBase = ( struct GfxBase * )
  353.              OpenLibrary( "graphics.library" , 33 )  ;
  354.    if ( ! GfxBase )
  355.       cleanup()  ;
  356.  
  357.    borders[ 0 ].XY = &xyborders[ 0 ][ 0 ]  ;
  358.    for ( ii = i = 0 ; i < 3 ; i ++ )
  359.    {
  360.       for ( j = 0 ; j < 4 ; j ++ )
  361.       {
  362.          for ( k = 0 ; k < 4 ; k ++ , ii ++ )
  363.          {
  364.             tabgadget[ ii ] = tabgadget[ 0 ]  ;
  365.             tabgadget[ ii ].LeftEdge = 20 + k * 15 + i * 85  ;
  366.             tabgadget[ ii ].TopEdge = 23 + j * 13  ;
  367.             tabgadget[ ii ].GadgetRender = ( APTR ) &borders[ 0 ]  ;
  368.             tabgadget[ ii ].GadgetID = ii  ;
  369.          }
  370.       }
  371.    }
  372.    for ( i = 0 ; i < 47 ; i ++ )
  373.       tabgadget[ i ].NextGadget = &tabgadget[ i + 1 ]  ;
  374.  
  375.    borders[ 1 ].XY = &xyborders[ 1 ][ 0 ]  ;
  376.    congadget[ 0 ].GadgetRender = ( APTR ) &borders[ 1 ]  ;
  377.    congadget[ 1 ].GadgetRender = ( APTR ) &borders[ 1 ]  ;
  378.    congadget[ 2 ].GadgetRender = ( APTR ) &borders[ 1 ]  ;
  379.    congadget[ 3 ].GadgetRender = ( APTR ) &borders[ 1 ]  ;
  380.    congadget[ 0 ].GadgetText = &context[ 0 ]  ;
  381.    congadget[ 1 ].GadgetText = &context[ 1 ]  ;
  382.    congadget[ 2 ].GadgetText = &context[ 2 ]  ;
  383.    congadget[ 3 ].GadgetText = &context[ 3 ]  ;
  384.  
  385.    tabgadget[ 47 ].NextGadget = &congadget[ 0 ]  ;
  386.    congadget[ 0 ].NextGadget = &congadget[ 1 ]  ;
  387.    congadget[ 1 ].NextGadget = &congadget[ 2 ]  ;
  388.    congadget[ 2 ].NextGadget = &congadget[ 3 ]  ;
  389.  
  390.    nwr.FirstGadget = &tabgadget[ 0 ]  ;
  391.  
  392.    menulist[ 0 ].FirstItem = &controlmenu[ 0 ].item  ;
  393.  
  394.    controlmenu[ 0 ].item.ItemFill = ( APTR ) &controlmenu[ 0 ].text  ;
  395.    controlmenu[ 0 ].item.NextItem = &controlmenu[ 1 ].item  ;
  396.    controlmenu[ 1 ].item.ItemFill = ( APTR ) &controlmenu[ 1 ].text  ;
  397.    controlmenu[ 1 ].item.NextItem = &controlmenu[ 2 ].item  ;
  398.    controlmenu[ 2 ].item.ItemFill = ( APTR ) &controlmenu[ 2 ].text  ;
  399.    controlmenu[ 2 ].item.NextItem = &controlmenu[ 3 ].item  ;
  400.    controlmenu[ 3 ].item.ItemFill = ( APTR ) &controlmenu[ 3 ].text  ;
  401.    controlmenu[ 3 ].item.NextItem = &controlmenu[ 4 ].item  ;
  402.    controlmenu[ 4 ].item.ItemFill = ( APTR ) &controlmenu[ 4 ].text  ;
  403.    controlmenu[ 4 ].item.NextItem = &controlmenu[ 5 ].item  ;
  404.    controlmenu[ 5 ].item.ItemFill = ( APTR ) &controlmenu[ 5 ].text  ;
  405.    controlmenu[ 5 ].item.NextItem = &controlmenu[ 6 ].item  ;
  406.    controlmenu[ 6 ].item.ItemFill = ( APTR ) &controlmenu[ 6 ].text  ;
  407.    controlmenu[ 6 ].item.NextItem = &controlmenu[ 7 ].item  ;
  408.    controlmenu[ 7 ].item.ItemFill = ( APTR ) &controlmenu[ 7 ].text  ;
  409.    controlmenu[ 7 ].item.NextItem = &controlmenu[ 8 ].item  ;
  410.    controlmenu[ 8 ].item.ItemFill = ( APTR ) &controlmenu[ 8 ].text  ;
  411.  
  412.    controlmenu[ 3 ].item.SubItem = &restartsub[ 0 ].item  ;
  413.       restartsub[ 0 ].item.ItemFill = ( APTR ) &restartsub[ 0 ].text  ;
  414.       restartsub[ 0 ].item.NextItem = &restartsub[ 1 ].item  ;
  415.       restartsub[ 1 ].item.ItemFill = ( APTR ) &restartsub[ 1 ].text  ;
  416.       restartsub[ 1 ].item.NextItem = &restartsub[ 2 ].item  ;
  417.       restartsub[ 2 ].item.ItemFill = ( APTR ) &restartsub[ 2 ].text  ;
  418.       restartsub[ 2 ].item.NextItem = &restartsub[ 3 ].item  ;
  419.       restartsub[ 3 ].item.ItemFill = ( APTR ) &restartsub[ 3 ].text  ;
  420.  
  421.    controlmenu[ 5 ].item.SubItem = &sizesub[ 0 ].item  ;
  422.       sizesub[ 0 ].item.ItemFill = ( APTR ) &sizesub[ 0 ].text  ;
  423.       sizesub[ 0 ].item.NextItem = &sizesub[ 1 ].item  ;
  424.       sizesub[ 1 ].item.ItemFill = ( APTR ) &sizesub[ 1 ].text  ;
  425.  
  426.    controlmenu[ 7 ].item.SubItem = &rulesub[ 0 ].item  ;
  427.       rulesub[ 0 ].item.ItemFill = ( APTR ) &rulesub[ 0 ].text  ;
  428.       rulesub[ 0 ].item.NextItem = &rulesub[ 1 ].item  ;
  429.       rulesub[ 1 ].item.ItemFill = ( APTR ) &rulesub[ 1 ].text  ;
  430.  
  431.    menulist[ 1 ].FirstItem = &editmenu[ 0 ].item  ;
  432.  
  433.    editmenu[ 0 ].item.ItemFill = ( APTR ) &editmenu[ 0 ].text  ;
  434.    editmenu[ 0 ].item.NextItem = &editmenu[ 1 ].item  ;
  435.    editmenu[ 1 ].item.ItemFill = ( APTR ) &editmenu[ 1 ].text  ;
  436.    editmenu[ 1 ].item.NextItem = &editmenu[ 2 ].item  ;
  437.    editmenu[ 2 ].item.ItemFill = ( APTR ) &editmenu[ 2 ].text  ;
  438.  
  439.    editmenu[ 1 ].item.SubItem = &restartsub[ 0 ].item  ;
  440.  
  441.    editmenu[ 0 ].item.SubItem = &colorsub[ 0 ].item  ;
  442.       colorsub[ 0 ].item.ItemFill = ( APTR ) &colorsub[ 0 ].text  ;
  443.       colorsub[ 0 ].item.NextItem = &colorsub[ 1 ].item  ;
  444.       colorsub[ 1 ].item.ItemFill = ( APTR ) &colorsub[ 1 ].text  ;
  445.       colorsub[ 1 ].item.NextItem = &colorsub[ 2 ].item  ;
  446.       colorsub[ 2 ].item.ItemFill = ( APTR ) &colorsub[ 2 ].text  ;
  447.       colorsub[ 2 ].item.NextItem = &colorsub[ 3 ].item  ;
  448.       colorsub[ 3 ].item.ItemFill = ( APTR ) &colorsub[ 3 ].text  ;
  449.       colorsub[ 3 ].item.NextItem = &colorsub[ 4 ].item  ;
  450.       colorsub[ 4 ].item.ItemFill = ( APTR ) &colorsub[ 4 ].text  ;
  451.  
  452.    ns.Font = &stext  ;
  453.    ns.DefaultTitle = title[ 0 ]  ;
  454.  
  455.    field( 0 )  ;
  456.  
  457.    SetAPen( window->RPort , 3 )  ;
  458.    Move( window->RPort , 0 , 150 )  ;     
  459.    Text( window->RPort , "Two dimensional Turing machine simulator" , 40 )  ;
  460.    Move( window->RPort , 0 , 164 )  ;
  461.    Text( window->RPort , "by  Gary Teachout" , 17 )  ;
  462.  
  463.    Delay( 200 )  ;
  464.    jumble()  ;
  465.  
  466.    for ( ; ; )
  467.    {
  468.       while ( fast )
  469.       {
  470.          turmite()  ;
  471.          turmite()  ;
  472.          turmite()  ;
  473.          turmite()  ;
  474.          turmite()  ;
  475.          turmite()  ;
  476.          turmite()  ;
  477.          turmite()  ;
  478.          turmite()  ;
  479.          turmite()  ;
  480.          turmite()  ;
  481.          turmite()  ;
  482.          turmite()  ;
  483.          turmite()  ;
  484.          turmite()  ;
  485.          turmite()  ;
  486.          handlemsg()  ;
  487.       }
  488.       while ( ! fast )
  489.       {
  490.          turmite()  ;
  491.          handlemsg()  ;
  492.          WaitTOF()  ;
  493.       }
  494.    }
  495.  }
  496.  
  497.  
  498.  void cleanup()  
  499.  {
  500.    if ( window )
  501.    {
  502.       ClearMenuStrip( window )  ;
  503.       CloseWindow( window )  ;
  504.    }
  505.  
  506.    if ( screen )
  507.       CloseScreen( screen )  ;
  508.  
  509.    if ( GfxBase )
  510.       CloseLibrary( GfxBase )  ;
  511.  
  512.    if ( IntuitionBase )
  513.       CloseLibrary( IntuitionBase )  ;
  514.  
  515.    exit()  ;
  516.  }
  517.  
  518.  
  519.  void turmite()
  520.  {
  521.    register USHORT   w0 , w1 , c , nc  ;
  522.  
  523.    w0 = *wp0  ;
  524.    w1 = *wp1  ;
  525.  
  526.    c =      ( ( w0 & mask1 ) ? 1 : 0 ) 
  527.          |  ( ( w1 & mask1 ) ? 2 : 0 )  ;
  528.  
  529.    nc = color[ os ][ c ]  ;
  530.    *wp0 = ( nc & 1 ) ? w0 | mask1 : w0 & mask0  ;
  531.    *wp1 = ( nc & 2 ) ? w1 | mask1 : w1 & mask0  ;
  532.  
  533.    dir = ( dir + motion[ os ][ c ] ) % CMAX  ;
  534.    switch ( dir )
  535.    {
  536.    case 0 :
  537.       if ( wy > TOPLINE )
  538.       {
  539.          wy --  ;
  540.          wp0 -= wpr  ;
  541.          wp1 -= wpr  ;
  542.       }
  543.       else
  544.       {
  545.          wy = wll  ;
  546.          wp0 += wt  ;
  547.          wp1 += wt  ;
  548.       }
  549.       break  ;
  550.    case 1 :
  551.       if ( mask1 > 1 )
  552.       {
  553.          mask1 = mask1 >> 1  ;
  554.          mask0 = ~ mask1  ;
  555.       }
  556.       else
  557.       {
  558.          mask1 = 0x8000  ;
  559.          mask0 = 0x7fff  ;
  560.          if ( ( wx += 1 ) == wpr )
  561.          {
  562.             wx = 0  ;
  563.             wp0 -= wprm  ;
  564.             wp1 -= wprm  ;
  565.          }
  566.          else
  567.          {
  568.             wp0 ++  ;
  569.             wp1 ++  ;
  570.          }
  571.       }
  572.       break  ;
  573.    case 2 :
  574.       if ( wy < wll )
  575.       {
  576.          wy ++  ;
  577.          wp0 += wpr  ;
  578.          wp1 += wpr  ;
  579.       }
  580.       else
  581.       {
  582.          wy = TOPLINE  ;
  583.          wp0 -= wt  ;
  584.          wp1 -= wt  ;
  585.       }
  586.       break  ;
  587.    case 3 :
  588.       if ( mask1 < 0x8000 )
  589.       {
  590.          mask1 = mask1 << 1  ;
  591.          mask0 = ~ mask1  ;
  592.       }
  593.       else
  594.       {
  595.          mask1 = 0x0001  ;
  596.          mask0 = 0xfffe  ;
  597.          if ( wx == 0 )
  598.          {
  599.             wx = wpr - 1 ;
  600.             wp0 += wprm  ;
  601.             wp1 += wprm  ;
  602.          }
  603.          else
  604.          {
  605.             wx --  ;
  606.             wp0 --  ;
  607.             wp1 --  ;
  608.          }
  609.       }
  610.       break  ;
  611.    }
  612.  
  613.    os = state[ os ][ c ]  ;
  614.  }
  615.  
  616. /********************************************************
  617.  void turmite()
  618.  {
  619.    int      c  ;
  620.  
  621.    c = ReadPixel( window->RPort , posx , posy )  ;
  622.  
  623.    SetAPen( window->RPort , color[ os ][ c ] )  ;
  624.    WritePixel( window->RPort , posx , posy )  ;
  625.  
  626.    dir = ( dir + motion[ os ][ c ] ) % CMAX  ;
  627.    switch ( dir )
  628.    {
  629.    case 0 :
  630.       posy = ( posy > TOPLINE ) ? posy - 1 : 199  ;
  631.       break  ;
  632.    case 1 :
  633.       posx = ( posx + 1 ) % 320  ;
  634.       break  ;
  635.    case 2 :
  636.       posy = ( posy < 199 ) ? posy + 1 : TOPLINE  ;
  637.       break  ;
  638.    case 3 :
  639.       posx = ( posx + 319 ) % 320  ;
  640.       break  ;
  641.    }
  642.  
  643.    os = state[ os ][ c ]  ;
  644.  }
  645. ********************************************************/
  646.  
  647.  
  648.  UBYTE random( a )
  649.    UBYTE    a  ;
  650.  {
  651.    #define RANDSHIFT      8
  652.    #define RANDTAB        23
  653.    #define RANDCOMP       8388608
  654.    static UBYTE   fp = 1  ;
  655.    static long    v[ RANDTAB ] , rr ;
  656.    short          vi  ;
  657.  
  658.    if ( fp )
  659.    {
  660.       CurrentTime( &v[ 0 ] , &v[ 1 ] )  ;
  661.       srand( v[ 1 ] )  ;
  662.       for ( vi = 0 ; vi < RANDTAB ; vi ++ )
  663.          v[ vi ] = rand() >> RANDSHIFT  ;
  664.       rr = rand() >> RANDSHIFT  ;
  665.       fp = 0  ;
  666.    }
  667.  
  668.    vi = RANDTAB * rr / RANDCOMP  ;
  669.    rr = v[ vi ]  ;
  670.    v[ vi ] = rand() >> RANDSHIFT  ;
  671.  
  672.    return ( UBYTE ) ( ( a * rr ) / RANDCOMP )  ;
  673.  }
  674.  
  675.  
  676.  void handlemsg()
  677.  {
  678.    while ( mes = GetMsg( window->UserPort ) )
  679.    {
  680.       class = mes->Class  ;
  681.       code = mes->Code  ;
  682.       ReplyMsg( mes )  ;
  683.       switch ( class )
  684.       {
  685.       case MENUVERIFY :
  686.          Wait( 1 << window->UserPort->mp_SigBit )  ;
  687.          while ( class != MENUPICK )
  688.          {
  689.             if ( mes = GetMsg( window->UserPort ) )
  690.             {
  691.                class = mes->Class  ;
  692.                code = mes->Code  ;
  693.                ReplyMsg( mes )  ;
  694.             }
  695.          }
  696.       case MENUPICK :
  697.          handlemenu()  ;
  698.          break  ;
  699.       }
  700.    }
  701.  }
  702.  
  703.  
  704.  void handlemenu()
  705.  {
  706.    if ( ! MENUNUM( code ) )
  707.    {
  708.       switch ( ITEMNUM( code ) )
  709.       {
  710.       case 0 :
  711.          stoploop()  ;
  712.          break  ;
  713.       case 1 :
  714.          stopflag = 0  ;
  715.          break  ;
  716.       case 2 :
  717.          fast = ( fast ) ? 0 : 1  ;
  718.          break  ;
  719.       case 3 :
  720.          SetRast( window->RPort , SUBNUM( code ) )  ;
  721.          wx = ( wpr >> 1 ) - 1  ;
  722.          wy = ( screen->BitMap.Rows >> 1 ) + 6  ;
  723.          wp0 =       ( ( USHORT * ) screen->BitMap.Planes[ 0 ] )
  724.                   +  wx + ( wy * wpr )  ;
  725.          wp1 =       ( ( USHORT * ) screen->BitMap.Planes[ 1 ] )
  726.                   +  wx + ( wy * wpr )  ;
  727.          mask1 = 1  ;
  728.          mask0 = 0xfffe  ;
  729.          dir = 3  ;
  730.          os = 0  ;
  731.          break  ;
  732.       case 4 :
  733.          jumble()  ;
  734.          break  ;
  735.       case 5 :
  736.          field( ( short ) SUBNUM( code ) )  ;
  737.          break  ;
  738.       case 6 :
  739.          editmode()  ;
  740.          break  ;
  741.       case 7 :
  742.          if ( ! SUBNUM( code ) )
  743.             randomrule()  ;
  744.          else
  745.             customrule()  ;
  746.          break  ;
  747.       case 8 : /* quit */
  748.          cleanup()  ;
  749.          break  ;
  750.       }
  751.    }
  752.  }
  753.  
  754.  
  755.  void stoploop()
  756.  {
  757.    if ( ! stopflag )
  758.    {
  759.       stopflag = 1  ;
  760.       while ( stopflag )
  761.       {
  762.          Wait( 1 << window->UserPort->mp_SigBit )  ;
  763.          handlemsg()  ;
  764.       }
  765.    }
  766.  }
  767.  
  768.  
  769.  void editmode()
  770.  {
  771.    UBYTE    color = 1  ;
  772.    short    x , y , ox , oy , stop = 0  ;
  773.  
  774.    SetAPen( window->RPort , color )  ;
  775.    SetWindowTitles( window , NULL , title[ 1 ] )  ;
  776.    ClearMenuStrip( window )  ;
  777.    colorsub[ 0 ].item.Flags = colorsub[ 0 ].item.Flags & ( ~ CHECKED )  ;
  778.    colorsub[ 1 ].item.Flags = colorsub[ 1 ].item.Flags | CHECKED  ;
  779.    colorsub[ 2 ].item.Flags = colorsub[ 2 ].item.Flags & ( ~ CHECKED )  ;
  780.    colorsub[ 3 ].item.Flags = colorsub[ 3 ].item.Flags & ( ~ CHECKED )  ;
  781.    colorsub[ 4 ].item.Flags = colorsub[ 4 ].item.Flags & ( ~ CHECKED )  ;
  782.    SetMenuStrip( window , &menulist[ 1 ] )  ;
  783.  
  784.    SetPointer( window , pointer , 7 , 7 , -1 , 0 )  ;
  785.  
  786.    while( ! stop )
  787.    {
  788.       Wait( 1 << window->UserPort->mp_SigBit )  ;
  789.       while ( mes = GetMsg( window->UserPort ) )
  790.       {
  791.          class = mes->Class  ;
  792.          code = mes->Code  ;
  793.          ReplyMsg( mes )  ;
  794.          switch ( class )
  795.          {
  796.          case MENUVERIFY :
  797.             Wait( 1 << window->UserPort->mp_SigBit )  ;
  798.             while ( class != MENUPICK )
  799.             {
  800.                if ( mes = GetMsg( window->UserPort ) )
  801.                {
  802.                   class = mes->Class  ;
  803.                   code = mes->Code  ;
  804.                   ReplyMsg( mes )  ;
  805.                }
  806.             }
  807.          case MENUPICK :
  808.             switch ( ITEMNUM( code ) )
  809.             {
  810.             case 0 :
  811.                color = SUBNUM( code )  ;
  812.                if ( color != 4 )
  813.                   SetAPen( window->RPort , color )  ;
  814.                break  ;
  815.             case 1 :
  816.                SetRast( window->RPort , SUBNUM( code ) )  ;
  817.                break  ;
  818.             case 2 :
  819.                stop = 1  ;
  820.                break  ;
  821.             }
  822.             break  ;
  823.          case MOUSEBUTTONS :
  824.             if ( code == SELECTDOWN )
  825.             {
  826.                if ( color != 4 )
  827.                {
  828.                   ox = oy = -1  ;
  829.                   while ( code != SELECTUP )
  830.                   {
  831.                      x = window->MouseX  ;
  832.                      y = window->MouseY  ;
  833.                      if (     ( ( x != ox ) || ( y != oy ) )
  834.                            && ( y >= TOPLINE ) )
  835.                      {
  836.                         WritePixel( window->RPort , x , y )  ;
  837.                         ox = x  ;
  838.                         oy = y  ;
  839.                      }
  840.                      while ( mes = GetMsg( window->UserPort ) )
  841.                      {
  842.                         if ( mes->Class == MOUSEBUTTONS )
  843.                            code = mes->Code  ;
  844.                         ReplyMsg( mes )  ;
  845.                      }
  846.                   }
  847.                }
  848.                else
  849.                {
  850.                   x = ox = window->MouseX  ;
  851.                   y = oy = window->MouseY  ;
  852.                   dir = 3  ;
  853.                   os = 0  ;
  854.                   while ( code != SELECTUP )
  855.                   {
  856.                      x = window->MouseX  ;
  857.                      y = window->MouseY  ;
  858.                      while ( mes = GetMsg( window->UserPort ) )
  859.                      {
  860.                         if ( mes->Class == MOUSEBUTTONS )
  861.                            code = mes->Code  ;
  862.                         ReplyMsg( mes )  ;
  863.                      }
  864.                   }
  865.                   if ( oy >= TOPLINE )
  866.                   {
  867.                      wx = ox >> 4  ;
  868.                      wy = oy  ;
  869.                      wp0 =    ( ( USHORT * ) screen->BitMap.Planes[ 0 ] )
  870.                            +  wx + ( wy * wpr )  ;
  871.                      wp1 =    ( ( USHORT * ) screen->BitMap.Planes[ 1 ] )
  872.                            +  wx + ( wy * wpr )  ;
  873.                      mask1 = 1 << ( 15 - ( ox & 0x000f ) )  ;
  874.                      mask0 = ~ mask1  ;
  875.                      if ( ( x != ox ) || ( y != oy ) )
  876.                      {
  877.                         x = x - ox  ;
  878.                         ox = ( x >= 0 ) ? x : -x  ;
  879.                         y = y - oy  ;
  880.                         oy = ( y >= 0 ) ? y : -y  ;
  881.                         if ( ox >= oy )
  882.                            dir = ( x >= 0 ) ? 1 : 3  ;
  883.                         else
  884.                            dir = ( y >= 0 ) ? 2 : 0  ;
  885.                      }
  886.                   }
  887.                }
  888.             }
  889.             break  ;
  890.          }
  891.       }
  892.    }
  893.  
  894.    ClearPointer( window )  ;
  895.  
  896.    ClearMenuStrip( window )  ;
  897.    SetMenuStrip( window , &menulist[ 0 ] )  ;
  898.    SetWindowTitles( window , NULL , title[ 0 ] )  ;
  899.  }
  900.  
  901.  
  902.  void field( s )
  903.    USHORT   s  ;
  904.  {
  905.    if ( s == fieldsize )
  906.       return  ;
  907.  
  908.    if ( window )
  909.    {
  910.       ClearMenuStrip( window )  ;
  911.       CloseWindow( window )  ;
  912.    }
  913.  
  914.    if ( screen )
  915.       CloseScreen( screen )  ;
  916.  
  917.    if ( s )
  918.    {
  919.       ns.Width = 640  ;
  920.       ns.Height = 400  ;
  921.       ns.ViewModes = HIRES | LACE  ;
  922.       nw.Width = 640  ;
  923.       nw.Height = 400  ;
  924.    }
  925.    else
  926.    {
  927.       ns.Width = 320  ;
  928.       ns.Height = 200  ;
  929.       ns.ViewModes = 0  ;
  930.       nw.Width = 320  ;
  931.       nw.Height = 200  ;
  932.    }
  933.  
  934.    screen = OpenScreen( &ns )  ;
  935.    if ( ! screen )
  936.       cleanup()  ;
  937.  
  938.    SetRGB4( &screen->ViewPort , 0 , 0 , 0 , 0 )  ;
  939.    SetRGB4( &screen->ViewPort , 1 , 15 , 0 , 0 )  ;
  940.    SetRGB4( &screen->ViewPort , 2 , 0 , 0 , 15 )  ;
  941.    SetRGB4( &screen->ViewPort , 3 , 15 , 15 , 0 )  ;
  942.  
  943.    nw.Screen = screen  ;
  944.    window = OpenWindow( &nw )  ;
  945.    if ( ! window )
  946.       cleanup()  ;
  947.  
  948.    SetMenuStrip( window , &menulist[ 0 ] ) ;
  949.    SetWindowTitles( window , NULL , title[ 0 ] )  ;
  950.    ShowTitle( screen , TRUE )  ;
  951.  
  952.    wpr = screen->BitMap.BytesPerRow >> 1  ;
  953.    wprm = wpr - 1  ;
  954.    wt = wpr * ( screen->BitMap.Rows - TOPLINE - 1 )  ;
  955.    wll = screen->BitMap.Rows - 1  ;
  956.    wx = ( wpr >> 1 ) - 1  ;
  957.    wy = ( screen->BitMap.Rows >> 1 ) + 6  ;
  958.    wp0 = ( ( USHORT * ) screen->BitMap.Planes[ 0 ] ) + wx + ( wy * wpr )  ;
  959.    wp1 = ( ( USHORT * ) screen->BitMap.Planes[ 1 ] ) + wx + ( wy * wpr )  ;
  960.    mask1 = 1  ;
  961.    mask0 = 0xfffe  ;
  962.  
  963.    dir = 3  ;
  964.    os = 0  ;
  965.  
  966.    fieldsize = s  ;
  967.  }
  968.  
  969.  
  970.  void randomrule()
  971.  {
  972.    UBYTE    i , j , s , c , t = 0  ;
  973.  
  974.    for ( i = 0 ; i < 4 ; i ++ )
  975.    {
  976.       for ( j = 0 ; j < 4 ; j ++ )
  977.       {
  978.          state[ i ][ j ] = 0  ;
  979.          color[ i ][ j ] = 0  ;
  980.          motion[ i ][ j ] = 0  ;
  981.       }
  982.    }
  983.    s = 1 + random( 4 )  ;
  984.    c = 2 + random( 3 )  ;
  985.    while ( ! t )
  986.    {
  987.       for ( i = 0 ; i < s ; i ++ )
  988.       {
  989.          for ( j = 0 ; j < c ; j ++ )
  990.          {
  991.             state[ i ][ j ] = random( s )  ;
  992.             color[ i ][ j ] = random( c )  ;
  993.             motion[ i ][ j ] = random( 4 )  ;
  994.             if ( color[ i ][ j ] >= t )
  995.                t = color[ i ][ j ]  ;
  996.          }
  997.       }
  998.    }
  999.  }
  1000.  
  1001.  
  1002.  void customrule()
  1003.  {
  1004.    struct Window  *w  ;
  1005.    struct Gadget  *g  ;
  1006.    USHORT   i , temp[ 48 ] , stop = 0 , reset = 1  ;
  1007.    ULONG    sig   ;
  1008.  
  1009.    if ( fieldsize )
  1010.    {
  1011.       nwr.LeftEdge = 185  ;
  1012.       nwr.TopEdge = 120  ;
  1013.    }
  1014.    else
  1015.    {
  1016.       nwr.LeftEdge = 25  ;
  1017.       nwr.TopEdge = 20  ;
  1018.    }
  1019.    nwr.Screen = screen  ;
  1020.    w = OpenWindow( &nwr )  ;
  1021.    if ( w )
  1022.    {
  1023.       SetAPen( w->RPort , 1 )  ;
  1024.       Move( w->RPort , 7 , 30 )  ;
  1025.       Text( w->RPort , "s" , 1 ) ;
  1026.       Move( w->RPort , 7 , 38 )  ;
  1027.       Text( w->RPort , "t" , 1 ) ;
  1028.       Move( w->RPort , 7 , 46 )  ;
  1029.       Text( w->RPort , "a" , 1 ) ;
  1030.       Move( w->RPort , 7 , 54 )  ;
  1031.       Text( w->RPort , "t" , 1 ) ;
  1032.       Move( w->RPort , 7 , 62 )  ;
  1033.       Text( w->RPort , "e" , 1 ) ;
  1034.       Move( w->RPort , 20 , 82 )  ;
  1035.       Text( w->RPort , "color" , 5 ) ;
  1036.  
  1037.       SetAPen( w->RPort , 3 )  ;
  1038.       Move( w->RPort , 20 , 20 )  ;
  1039.       Text( w->RPort , "STATE" , 5 ) ;
  1040.       Move( w->RPort , 105 , 20 )  ;
  1041.       Text( w->RPort , "COLOR" , 5 ) ;
  1042.       Move( w->RPort , 190 , 20 )  ;
  1043.       Text( w->RPort , "MOTION" , 6 ) ;
  1044.  
  1045.       Move( w->RPort , 100 , 86 )  ;
  1046.       Text( w->RPort , "1=Black" , 7 ) ;
  1047.       Move( w->RPort , 100 , 94 )  ;
  1048.       Text( w->RPort , "2=Red" , 5 ) ;
  1049.       Move( w->RPort , 100 , 102 )  ;
  1050.       Text( w->RPort , "3=Blue" , 6 ) ;
  1051.       Move( w->RPort , 100 , 110 )  ;
  1052.       Text( w->RPort , "4=Yellow" , 8 ) ;
  1053.  
  1054.       Move( w->RPort , 180 , 86 )  ;
  1055.       Text( w->RPort , "1=Forward" , 9 ) ;
  1056.       Move( w->RPort , 180 , 94 )  ;
  1057.       Text( w->RPort , "2=Right" , 7 ) ;
  1058.       Move( w->RPort , 180 , 102 )  ;
  1059.       Text( w->RPort , "3=Backward" , 10 ) ;
  1060.       Move( w->RPort , 180 , 110 )  ;
  1061.       Text( w->RPort , "4=Left" , 6 ) ;
  1062.  
  1063.       sig =    ( 1 << window->UserPort->mp_SigBit )
  1064.             |  ( 1 << w->UserPort->mp_SigBit )  ;
  1065.  
  1066.       while ( ! stop )
  1067.       {
  1068.          if ( reset )
  1069.          {
  1070.             for ( i = 0 ; i < 16 ; i ++ )
  1071.             {
  1072.                temp[ i ] = state[ ( i >> 2 ) & 3 ][ i & 3 ]  ;
  1073.                Move( w->RPort ,  tabgadget[ i ].LeftEdge + 2 ,
  1074.                                  tabgadget[ i ].TopEdge + 9 )  ;
  1075.                Text( w->RPort , &digit[ temp[ i ] ] , 1 ) ;
  1076.             }
  1077.             for ( i = 16 ; i < 32 ; i ++ )
  1078.             {
  1079.                temp[ i ] = color[ ( i >> 2 ) & 3 ][ i & 3 ]  ;
  1080.                Move( w->RPort ,  tabgadget[ i ].LeftEdge + 2 ,
  1081.                                  tabgadget[ i ].TopEdge + 9 )  ;
  1082.                Text( w->RPort , &digit[ temp[ i ] ] , 1 ) ;
  1083.             }
  1084.             for ( i = 32 ; i < 48 ; i ++ )
  1085.             {
  1086.                temp[ i ] = motion[ ( i >> 2 ) & 3 ][ i & 3 ]  ;
  1087.                Move( w->RPort ,  tabgadget[ i ].LeftEdge + 2 ,
  1088.                                  tabgadget[ i ].TopEdge + 9 )  ;
  1089.                Text( w->RPort , &digit[ temp[ i ] ] , 1 ) ;
  1090.             }
  1091.             reset = 0  ;
  1092.          }
  1093.  
  1094.          Wait( sig )  ;
  1095.          while ( mes = GetMsg( window->UserPort ) )
  1096.          {
  1097.             if ( ( mes->Class == MENUVERIFY ) && ( mes->Code == MENUHOT ) )
  1098.                mes->Code = MENUCANCEL  ;
  1099.             ReplyMsg( mes )  ;
  1100.          }
  1101.          while ( mes = GetMsg( w->UserPort ) )
  1102.          {
  1103.             class = mes->Class  ;
  1104.             code = mes->Code  ;
  1105.             g = ( struct Gadget * ) mes->IAddress  ;
  1106.             if ( ( mes->Class == MENUVERIFY ) && ( mes->Code == MENUHOT ) )
  1107.                mes->Code = MENUCANCEL  ;
  1108.             ReplyMsg( mes )  ;
  1109.             switch ( class )
  1110.             {
  1111.             case GADGETUP :
  1112.                switch ( g->GadgetID )
  1113.                {
  1114.                case 100 :
  1115.                   for ( i = 0 ; i < 48 ; i ++ )
  1116.                   {
  1117.                      temp[ i ] = 0  ;
  1118.                      Move( w->RPort ,  tabgadget[ i ].LeftEdge + 2 ,
  1119.                                        tabgadget[ i ].TopEdge + 9 )  ;
  1120.                      Text( w->RPort , &digit[ temp[ i ] ] , 1 ) ;
  1121.                   }
  1122.                   break  ;
  1123.                case 101 :
  1124.                   reset = 1  ;
  1125.                   break  ;
  1126.                case 102 :
  1127.                   for ( i = 0 ; i < 16 ; i ++ )
  1128.                   {
  1129.                      state[ i >> 2 ][ i & 3 ] = temp[ i ]  ;
  1130.                      color[ i >> 2 ][ i & 3 ] = temp[ i + 16 ]  ;
  1131.                      motion[ i >> 2 ][ i & 3 ] = temp[ i + 32 ]  ;
  1132.                   }
  1133.                case 103 :
  1134.                   stop = 1  ;
  1135.                   break  ;
  1136.                }
  1137.                break  ;
  1138.             case GADGETDOWN :
  1139.                temp[ g->GadgetID ] = ( temp[ g->GadgetID ] + 1 ) % 4  ;
  1140.                Move( w->RPort , g->LeftEdge + 2 , g->TopEdge + 9 )  ;
  1141.                Text( w->RPort , &digit[ temp[ g->GadgetID ] ] , 1 ) ;
  1142.                break  ;
  1143.             case RAWKEY :
  1144.                switch ( code )
  1145.                {
  1146.                case 24 :
  1147.                   for ( i = 0 ; i < 16 ; i ++ )
  1148.                   {
  1149.                      state[ i >> 2 ][ i & 3 ] = temp[ i ]  ;
  1150.                      color[ i >> 2 ][ i & 3 ] = temp[ i + 16 ]  ;
  1151.                      motion[ i >> 2 ][ i & 3 ] = temp[ i + 32 ]  ;
  1152.                   }
  1153.                case 51 :
  1154.                   stop = 1  ;
  1155.                   break  ;
  1156.                }
  1157.                break  ;
  1158.             }
  1159.          }
  1160.       }
  1161.  
  1162.       CloseWindow( w )  ;
  1163.    }
  1164.  }
  1165.  
  1166.  
  1167.  void jumble() 
  1168.  {
  1169.    short    x , y , xx , yy , px , pr  ;
  1170.    USHORT   m  ;
  1171.    UBYTE    c  ;
  1172.  
  1173.    pr = wpr << 4  ;
  1174.    for ( m = mask1 , x = 0 ; m < 0x8000 ; x ++ , m = m << 1 )
  1175.       ;
  1176.    px = ( wx << 4 ) + x  ;
  1177.  
  1178.    for ( c = 0 , y = 0 ; y < 4 ; y ++ )
  1179.    {
  1180.       for ( x = 0 ; x < 4 ; x ++ )
  1181.       {
  1182.          if ( color[ x ][ y ] >= c )
  1183.             c = color[ x ][ y ] + 1  ;
  1184.       }
  1185.    }
  1186.  
  1187.    for ( y = -5 ; y < 6 ; y ++ )
  1188.    {
  1189.       yy = wy + y  ;
  1190.       if ( yy < TOPLINE )
  1191.          yy = ( yy - TOPLINE + wll + 1 ) % ( wll + 1 )  ;
  1192.       if ( yy > wll )
  1193.          yy = ( yy % ( wll + 1 ) ) + TOPLINE  ;
  1194.       for ( x = -5 ; x < 6 ; x ++ )
  1195.       {
  1196.          xx = ( px + x + pr ) % pr  ;
  1197.          SetAPen( window->RPort , random( c ) )  ;
  1198.          WritePixel( window->RPort , xx , yy )  ;
  1199.       }
  1200.    }
  1201.  }
  1202.  
  1203.  
  1204.  
  1205.