home *** CD-ROM | disk | FTP | other *** search
/ Carousel Volume 2 #1 / carousel.iso / mactosh / hc / xfcn_set.sit / SetCache.c < prev    next >
C/C++ Source or Header  |  1987-10-07  |  2KB  |  72 lines

  1. #include <MacTypes.h>
  2. #include <MemoryMgr.h>
  3. #include <OSUtil.h>
  4. #include <QuickDraw.h>
  5. #include <HyperXCmd.h>
  6.  
  7. extern Byte    CPUflag : 0x12F;
  8.  
  9. /*
  10.  * SetCache entry point.  This is a XFCN that allows you to switch the cache on and off. The current/new
  11.  *                    cache setting is returned. 
  12.  * Warning:            The on and off strings are hardwired. Lacking an owned resources method of
  13.  *                    carrying STR resources around with this XFCN, this is inevitable (unless I
  14.  *                    go to the hassle of passing strings or resource IDs through as arguments).
  15.  */
  16.  
  17. pascal void
  18. main(paramPtr)
  19. register XCmdBlockPtr    paramPtr;
  20. {
  21.     Str255        str;
  22.     short        toggle;
  23.     Byte            cacheOn;
  24.  
  25.     /* SysEnvirons is overkill for this! */
  26.     if (CPUflag != 2) {
  27.         /* Calling SetCache for a 68000?! . Might be a 68030 I suppose, but who knows what the CACR
  28.           * is like on that processor. Take no chances, and return OFF. 
  29.           */
  30.         cacheOn = 0;
  31.     } else {
  32.         /* Find out what the current cache state is... */
  33.         asm {
  34.             clr.l        d0
  35.             dc.w        0x4E7A            /* movec    CACR, d0 */
  36.             dc.w        0x2
  37.             move.b    d0,cacheOn        
  38.         }
  39.     
  40.         /* Are there any parameters? This is a bit of a kluge, but if SetCache is called without any parameters, it returns the
  41.           * current cache bit status in "result". Saves having separate XFCN and XCMD resources.
  42.           */
  43.         if (paramPtr->paramCount != 0) {
  44.             /* First (and only) param is on/off.  Convert it to a pascal string */
  45.             ZeroToPas(paramPtr,*(paramPtr->params[0]), str);
  46.         
  47.             toggle =  (StringEqual(paramPtr, (Str31 *)str, (Str31 *)"\pOff") == TRUE) ? 0 : 1;
  48.         
  49.             /* And clamp it. */
  50.             if (toggle != 0) toggle = 1;
  51.         
  52.             if (cacheOn != toggle) {    /* Need to toggle the values. */
  53.                 cacheOn ^= 1;
  54.             
  55.                 /* Toggle the cache control bit. */
  56.                 asm {
  57.                     clr.l        d0
  58.                     dc.w        0x4E7A
  59.                     dc.w        0x2                /* A movec CACR, d0 */
  60.                     eori        #1,d0
  61.                     dc.w        0x4E7B            /* movec    d0,CACR */
  62.                     dc.w        0x2
  63.                 }
  64.             }
  65.         }
  66.     }
  67.  
  68.     /* And return the current cache value. */
  69.     paramPtr->returnValue = (cacheOn == 0) ? PasToZero(paramPtr, (StringPtr)"\pOff") :
  70.                                       PasToZero(paramPtr, (StringPtr)"\pOn");
  71. }
  72.