home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d115 / marketroid.lha / Marketroid / src / cycle.c < prev    next >
C/C++ Source or Header  |  1987-11-22  |  3KB  |  147 lines

  1. /*  :ts=8 bk=0
  2.  *
  3.  * cycle.c:    Color cycling interrupt server and support.
  4.  *
  5.  * Leo L. Schwab            8710.6        (415) 456-3960
  6.  */
  7. #include <exec/types.h>
  8. #include <exec/memory.h>
  9. #include <exec/interrupts.h>
  10. #include <hardware/intbits.h>
  11. #include <graphics/view.h>
  12. #include "marketroid.h"
  13.  
  14. struct Interrupt    intr;
  15. struct interdat        id;
  16. static int        installed, opened;
  17.  
  18.  
  19. struct cycle *
  20. addcycle (type, ctab, ncolors, start, end, rate)
  21. UWORD type;
  22. UWORD *ctab;
  23. WORD ncolors, start, end, rate;
  24. {
  25.     register struct cycle    *c;
  26.  
  27.     if (!(c = AllocMem ((long) sizeof (*c), MEMF_CLEAR)))
  28.         die ("Cycle allocation failed.\n");
  29.  
  30.     c -> type    = type;
  31.     c -> colors    = ctab;
  32.     c -> ncolors    = ncolors;
  33.     c -> start    = start;
  34.     c -> end    = end;
  35.     c -> rate = c -> count = rate;
  36.  
  37.     Disable ();
  38.     AddHead (&id.cycles, c);
  39.     Enable ();
  40.  
  41.     return (c);
  42. }
  43.  
  44. removecycle (c)
  45. register struct cycle *c;
  46. {
  47.     Disable ();
  48.     Remove (c);
  49.     FreeMem (c, (long) sizeof (*c));
  50.     Enable ();
  51. }
  52.  
  53.  
  54. /*
  55.  * And finally, the routine that does all the work.
  56.  */
  57. long
  58. vblank ()
  59. {
  60.     register struct cycle    *c;
  61.     register UWORD        *wp, *start;
  62.     register UWORD        tmp;
  63.  
  64.     int_start ();
  65.  
  66.     if (id.stop)        /*  Are we stopped?  */
  67.         goto xit;
  68.  
  69.     for (c = (struct cycle *) id.cycles.lh_Head;
  70.          c -> node.ln_Succ;
  71.          c = (struct cycle *) c -> node.ln_Succ)
  72.         if (!--c->count) {
  73.             /*  Countdown expired, do color cycle  */
  74.             switch (c -> type) {
  75.             case CYCLE_SIMPLE:
  76. /*- - - - - - - - - - - - - - -*/
  77. for (wp = &id.ctab[c->end], start = &id.ctab[c->start], tmp = *wp;
  78.      wp != start;
  79.      wp--)
  80.     *wp = *(wp-1);
  81. *wp = tmp;
  82. /*- - - - - - - - - - - - - - -*/
  83.                 break;
  84.  
  85.             case CYCLE_THROUGH:
  86.                 if ((tmp = ++c->end) >= c->ncolors)
  87.                     tmp = c->end = 0;
  88.                 id.ctab[c->start] = c->colors[tmp];
  89.                 break;
  90.  
  91.             case CYCLE_RANDOM:
  92.                 if (*(wp = &id.ctab[c->start]) & 1) {
  93.                     tmp = rnd (8) + 8;
  94.                     *wp = tmp + (tmp<<4) + (tmp<<8);
  95.                 } else
  96.                     id.ctab[c->start] = rnd (0x1000);
  97.                 break;
  98.             }
  99.             c->count = c->rate;
  100.         }
  101.  
  102.     LoadRGB4 (id.vp, id.ctab, (long) id.ncolors);
  103. xit:
  104.     int_end ();
  105.     return (0L);
  106. }
  107.  
  108. /*  Housekeeping  */
  109. opencycle (vp, colors, ncolors)
  110. struct ViewPort *vp;
  111. UWORD *colors;
  112. WORD ncolors;
  113. {
  114.     if (installed)
  115.         return;        /*  Please don't install me twice  */
  116.  
  117.     NewList (&id.cycles);
  118.     opened = 1;
  119.  
  120.     id.vp        = vp;
  121.     id.ctab        = colors;
  122.     id.ncolors    = ncolors;
  123.     id.stop        = 0;
  124.  
  125.     intr.is_Node.ln_Type    = NT_INTERRUPT;
  126.     intr.is_Node.ln_Pri    = 0;
  127.     intr.is_Node.ln_Name    = "Cycling Routine";
  128.     intr.is_Code        = (void *) vblank;
  129.     intr.is_Data        = NULL;
  130.     AddIntServer (INTB_VERTB, &intr);
  131.     installed = 1;
  132. }
  133.  
  134. closecycle ()
  135. {
  136.     register struct cycle    *c;
  137.  
  138.     if (installed) {
  139.         RemIntServer (INTB_VERTB, &intr);
  140.         installed = 0;
  141.     }
  142.  
  143.     if (opened)
  144.         while (c = RemHead (&id))
  145.             FreeMem (c, (long) sizeof (*c));
  146. }
  147.