home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 262.lha / BlitLab_v1.4 / blitlab.c < prev    next >
C/C++ Source or Header  |  1989-06-29  |  7KB  |  264 lines

  1. /*
  2.  *   This is the main routine from BlitLab.
  3.  */
  4. #include "structures.h"
  5. /*
  6.  *   Here are all the globals we use.  (Yuck!  Globals!)
  7.  */
  8. struct Window *mywindow ;
  9. struct GfxBase *GfxBase ;
  10. struct IntuitionBase *IntuitionBase ;
  11. struct RastPort *myrp ;
  12. char strings[900] ;
  13. char *bufarr[MAXGADG] ;
  14. long gvals[MAXGADG] ;
  15. struct Gadget *gadgets[MAXGADG] ;
  16. char errorbuf[140] ;
  17. short *realbits ;
  18. struct blitregs blitregs ;
  19. int custscreen ;
  20. /*
  21.  *   Externals we use:
  22.  */
  23. extern int blitsafe() ;
  24. extern int doblit() ;
  25. /*
  26.  *   Some statics to this module.
  27.  */
  28. static int updatethem ;
  29. /*
  30.  *   Errors go through here.  Currently, we write to the CLI window.
  31.  *   Later, we will write to the title bar of the window.
  32.  */
  33. error(s)
  34. char *s ;
  35. {
  36.    if (mywindow == NULL || *s == '!')
  37.       printf("blitlab: %s\n", s) ;
  38.    else {
  39.       SetWindowTitles(mywindow, s, -1L) ;
  40.    }
  41.    if (*s == '!')
  42.       cleanup() ;
  43. }
  44. /*
  45.  *   This routine handles a gadget selection.
  46.  */
  47. handlegadget(gp)
  48. register struct Gadget *gp ;
  49. {
  50.    static int gocount = 0 ;
  51.  
  52.    if (bufarr[gp->GadgetID] == NULL)
  53.    switch(gp->GadgetID) {
  54.       case GDGPNTREG:
  55.       case GDGLINE:
  56.       case GDGDESC:
  57.       case GDGFCI:
  58.       case GDGIFE:
  59.       case GDGEFE:
  60.       case GDGUSEA:
  61.       case GDGUSEB:
  62.       case GDGUSEC:
  63.       case GDGUSED:
  64.       case GDGOVF:
  65.       case GDGSIGN:
  66.       case GDGSIM:
  67.          flipgadg(gp->GadgetID) ;
  68.          break ;
  69.       case GDGCALC:
  70.          parseall() ;
  71.          updatethem = 0 ;
  72.          if (blitsafe()) {
  73.             error("Blit safe.") ;
  74.          } else {
  75.             error("Blit unsafe.") ;
  76.          }
  77.          break ;
  78.       case GDGSETUP:
  79.          setupline() ;
  80.          parseall() ;
  81.          break ;
  82.       case GDGGO:
  83.          gocount += 2 ;
  84.          parseall() ;
  85.          updatethem = 0 ;
  86.          if (!blitsafe() && gocount < 3) {
  87.             error("Blit unsafe---hit again to override") ;
  88.          } else {
  89.             if (doblit())
  90.                error("Zero flag SET") ;
  91.             else
  92.                error("Zero flag CLEAR") ;
  93.             updatebits() ;
  94.          }
  95.          break ;
  96.       case GDGUNDO:
  97.          undobits() ;
  98.          break ;
  99.       default:
  100.          error("! bad value in gadget switch") ;
  101.          break ;
  102.    }
  103.    if (gocount > 0)
  104.       gocount-- ;
  105. }
  106. /*
  107.  *   The main routine, no arguments.  Sets things up, and then goes
  108.  *   through the standard Intuition message loop.
  109.  *
  110.  *   It may look like I'm setting message to NULL and checking it and
  111.  *   everything all over, but that is so I can introduce interruptibility
  112.  *   into some operations later, if I choose.
  113.  */
  114. struct IntuiMessage *message = NULL ;
  115. main(argc, argv)
  116. int argc ;
  117. char *argv[] ;
  118. {
  119.    struct IntuiMessage *message = NULL ;
  120.    int x, y ;
  121.    int mousemoved = 0 ;
  122.    int getouttahere = 0 ;
  123.    int selectdown = 0 ;
  124.    int menudown = 0 ;
  125.    int bam ;
  126.    int ox, oy ;
  127.    char *p ;
  128.    int on ;
  129.  
  130.    while (argc > 1) {
  131.       argv++ ;
  132.       p = *argv ;
  133.       if (*p == '-')
  134.          p++ ;
  135.       if (*p == 'c' || *p == 'C')
  136.          custscreen = 1 ;
  137.       else {
  138.          printf("%s\n", BANNER) ;
  139.          printf("Usage:  blitlab [-c]\n") ;
  140.          printf("   -c:  Open on custom screen\n") ;
  141.          cleanup() ;
  142.       }
  143.       argc-- ;
  144.    }
  145.    initialize() ;
  146.    while (1) {
  147.       mousemoved = 0 ;
  148.       bam = 0 ;
  149.       if (message == NULL)
  150.          WaitPort(mywindow->UserPort) ;
  151.       while (message || (message = 
  152.                        (struct IntuiMessage *)GetMsg(mywindow->UserPort))) {
  153.          x = message->MouseX ;
  154.          y = message->MouseY ;
  155.          
  156.          if (message->Class == MOUSEMOVE) {
  157.             ReplyMsg(message) ;
  158.             message = NULL ;
  159.             mousemoved = 1 ;
  160.          } else {
  161.             if (message->Class == MOUSEBUTTONS) {
  162.                selectdown = (message->Code == SELECTDOWN) ;
  163.                menudown = (message->Code == MENUDOWN) ;
  164.                bam = 1 ;
  165.             } else if (message->Class == GADGETDOWN || 
  166.                        message->Class == GADGETUP) {
  167.                updatethem = 1 ;
  168.                handlegadget((struct Gadget *)(message->IAddress)) ;
  169.             } else if (message->Class == CLOSEWINDOW) {
  170.                getouttahere = 1 ;
  171.             } else if (message->Class == VANILLAKEY) {
  172.                if (1 <= message->Code && message->Code <= 26)
  173.                   saveall(message->Code) ;
  174.                else if ('a' <= message->Code && message->Code <= 'z')
  175.                   readall(message->Code - 'a' + 1) ;
  176.                else if ('A' <= message->Code && message->Code <= 'Z')
  177.                   readall(message->Code - 'Z' + 1) ;
  178.             } else
  179.                error("! undefined message class") ;
  180.             ReplyMsg(message) ;
  181.             message = NULL ;
  182.          }
  183.       }
  184.       if (getouttahere)
  185.          break ;
  186.       if (updatethem) {
  187.          parseall() ;
  188.          updatethem = 0 ;
  189.       }
  190.       x = (x - HBITSTART + 2) / 6 ;
  191.       y = (y - VBITSTART) / 3 ;
  192.       if (y < 32 && x < 96 && x >= 0 && y >= 0) {
  193.          if (gvals[GDGPNTREG]) {
  194.             if (bam) {
  195.                if (selectdown || menudown) {
  196.                   ox = x ;
  197.                   oy = y ;
  198.                   on = selectdown ;
  199.                } else {
  200.                   preg(ox, oy, x, y, on) ;
  201.                }
  202.             }
  203.          } else {
  204.             if (selectdown || menudown)
  205.                pdot(x, y, selectdown) ;
  206.          }
  207.          if (message != NULL || (message = 
  208.                (struct IntuiMessage *)GetMsg(mywindow->UserPort))) ;
  209.          else
  210.             updatepos(x, y) ;
  211.       }      
  212.    }
  213.    cleanup() ;
  214. }
  215. /*
  216.  *   This routine gives us a log file, if appropriate.
  217.  */
  218. char filename[120] ;
  219. FILE *openlogfile() {
  220.    char *p, *q ;
  221.    FILE *f ;
  222.  
  223.    f = NULL ;
  224.    p = bufarr[GDGLF] ;
  225.    if (p) {
  226.       while (*p == ' ')
  227.          p++ ;
  228.       for (q = filename; *p > ' '; q++, p++)
  229.          *q = *p ;
  230.       *q = 0 ;
  231.       if (filename[0]!=0)
  232.          f = fopen(filename, "a") ;
  233.    }
  234.    return(f) ;
  235. }
  236. /*
  237.  *   This routine writes out additional information about the
  238.  *   blitter variables.
  239.  */
  240. static char *flags[] = { "LINE", "DESC", "FCI", "IFE", "EFE", "OVF", "SIGN" } ;
  241. logflagdata(f)
  242. FILE *f ;
  243. {
  244.    unsigned short t ;
  245.    unsigned short con0, con1 ;
  246.  
  247.    con0 = blitregs.con0 ;
  248.    con1 = blitregs.con1 ;
  249.    fprintf(f, "ASH = %d BSH = %d ", con0 >> 12, con1 >> 12) ;
  250.    if (con0 & SRCA)
  251.       fprintf(f, "SRCA ") ;
  252.    if (con0 & SRCB)
  253.       fprintf(f, "SRCB ") ;
  254.    if (con0 & SRCC)
  255.       fprintf(f, "SRCC ") ;
  256.    if (con0 & DEST)
  257.       fprintf(f, "DEST ") ;
  258.    fprintf(f, "\nFunction = %d (%s)\nFlags:  ", con0 & 255, bufarr[GDGFUNC]) ;
  259.    for (t=0; t<7; t++)
  260.       if (con1 & (1 << t))
  261.          fprintf(f, "%s ", flags[t]) ;
  262.    fprintf(f, "\n") ;
  263. }
  264.