Annotation of driverkit/libDriver/ppc/IOFramebuffer.m, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.1 (the "License").  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License.
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: /*     Copyright (c) 1992-96 NeXT Software, Inc.  All rights reserved. 
        !            25:  *
        !            26:  * IOFramebuffer.m - Implements common methods for "standard" frame
        !            27:  *                             buffers.
        !            28:  *
        !            29:  *
        !            30:  * HISTORY
        !            31:  * 26 Oct 95   Dean Reece
        !            32:  *     Moved strtol() out of this class into its own file (strtol.c)
        !            33:  * 24 Oct 95   Rakesh Dubey
        !            34:  *      Added mode change feature. 
        !            35:  * 01 Sep 92   Joe Pasqua
        !            36:  *      Created. 
        !            37:  */
        !            38: 
        !            39: #define KERNEL_PRIVATE 1
        !            40: #define DRIVER_PRIVATE 1
        !            41: 
        !            42: /* Notes:
        !            43:  *   The definition of a standard frame buffer is anything with direct
        !            44:  *   32 bit access to a 2 & 8 bit gray, 8 & 16 & 32 bit color. For 16 bit
        !            45:  *   displays we support both 4/4/4 and 5/5/5 samples per channel. 
        !            46:  *
        !            47:  *   This class implements the evScreen protocol for all StdFBDisplays. Well,
        !            48:  *   almost. The setBrightness method doesn't do anything. Subclasses must
        !            49:  *   override this and implement it as appropriate for the device.
        !            50:  *
        !            51:  *   To find things that need to be fixed, search for FIX, to find questions
        !            52:  *   to be resolved, search for ASK, to find stuff that still needs to be
        !            53:  *   done, search for TO DO.
        !            54:  */
        !            55: 
        !            56: #import <string.h>
        !            57: #import <stdlib.h>
        !            58: #ifdef i386
        !            59: #import <bsd/dev/i386/FBConsole.h>
        !            60: #endif
        !            61: 
        !            62: #ifdef ppc
        !            63: #import <bsd/dev/ppc/FBConsole.h>
        !            64: #import <driverkit/ppc/IOSmartDisplay.h>
        !            65: #import        <driverkit/ppc/IOFramebuffer.h>
        !            66: #import        <driverkit/ppc/IOTreeDevice.h>          // for IOApertureInfo
        !            67: #endif
        !            68: 
        !            69: #import        <driverkit/EventDriver.h>
        !            70: #import        <bsd/dev/evio.h>
        !            71: 
        !            72: #ifdef i386
        !            73: #import        <bsd/dev/i386/kmDevice.h>
        !            74: #endif
        !            75: #ifdef ppc
        !            76: #import        <bsd/dev/ppc/kmDevice.h>
        !            77: #endif
        !            78: 
        !            79: #import <driverkit/KernBus.h>
        !            80: #import <driverkit/KernBusMemory.h>
        !            81: #import <driverkit/IODisplayPrivate.h>
        !            82: #import        <driverkit/IOFrameBufferShared.h>
        !            83: #import <driverkit/IODirectDevicePrivate.h>
        !            84: #import <driverkit/displayDefs.h>
        !            85: #ifdef i386
        !            86: #import <driverkit/i386/directDevice.h>
        !            87: #import <driverkit/i386/driverTypes.h>
        !            88: #endif
        !            89: #ifdef ppc
        !            90: #import <driverkit/ppc/directDevice.h>
        !            91: #import <driverkit/ppc/driverTypes.h>
        !            92: #endif
        !            93: 
        !            94: #define CLEARSEMA(shmem)       ev_unlock(&shmem->cursorSema)
        !            95: #define SETSEMA(shmem)         \
        !            96:        if (!ev_try_lock(&shmem->cursorSema)) return self;
        !            97: #define TOUCHBOUNDS(one, two) \
        !            98:        (((one.minx < two.maxx) && (two.minx < one.maxx)) && \
        !            99:        ((one.miny < two.maxy) && (two.miny < one.maxy)))
        !           100: 
        !           101: #define RBMASK 0xF0F0          /* Short, or 16 bit format */
        !           102: #define GAMASK 0x0F0F          /* Short, or 16 bit format */
        !           103: #define AMASK  0x000F          /* Short, or 16 bit format */
        !           104: 
        !           105: #define        GetShmem(instance)      ((StdFBShmem_t *)(instance->priv))
        !           106: 
        !           107: extern long int strtol(const char *nptr, char **endptr, int base);
        !           108: 
        !           109: #ifndef IO_DISPLAY_MODE_SAFE
        !           110: #define IO_DISPLAY_MODE_SAFE           0x00000001
        !           111: #endif
        !           112: #ifndef IO_DISPLAY_MODE_DEFAULT
        !           113: #define IO_DISPLAY_MODE_DEFAULT                0x00000002
        !           114: #endif
        !           115: 
        !           116: static BOOL    wsStartup;
        !           117: static Class   gSmartDisplayClass;
        !           118: 
        !           119: @implementation IOFramebuffer
        !           120: 
        !           121: 
        !           122: //
        !           123: // BEGIN:      Generic utility routines and methods
        !           124: //
        !           125: - (IOReturn)_registerWithED
        !           126: // Description:        Register this display device with the event driver.
        !           127: {
        !           128:     int token;
        !           129:     int shmem_size;
        !           130:     Bounds bounds;
        !           131:     StdFBShmem_t *shmem;
        !           132:     
        !           133:     token = [[EventDriver instance] registerScreen:self
        !           134:        bounds:&bounds
        !           135:        shmem:&(self->priv)
        !           136:        size:&shmem_size];
        !           137:     shmem = GetShmem(self);
        !           138:     if ( token == -1 )
        !           139:        return IO_R_INVALID_ARG;
        !           140:     // We allow the shmem_size to be less than sizeof(StdFBShmem_t)
        !           141:     // so that we need not consume the extra space that some of the
        !           142:     // larger cursor variants require if we are really a lower bitdepth.
        !           143:     if ( shmem_size > sizeof(StdFBShmem_t) )
        !           144:     {
        !           145:        IOLog("%s: shmem_size > sizeof (StdFBShmem_t)(%d<>%d)\n",
        !           146:            [self name], shmem_size, sizeof (StdFBShmem_t));
        !           147:        [[EventDriver instance] unregisterScreen:token];
        !           148:        return IO_R_INVALID_ARG;
        !           149:     }
        !           150:     // Init shared memory area
        !           151:     memset((char *)shmem, 0, shmem_size);
        !           152:     shmem->cursorShow = 1;
        !           153:     shmem->screenBounds = bounds;
        !           154:     [self setToken:token];
        !           155:     cursorShmemBitsPerPixel = [self displayInfo]->bitsPerPixel;
        !           156:     cursorBitsPerPixel = cursorShmemBitsPerPixel;
        !           157:     return IO_R_SUCCESS;
        !           158: }
        !           159: 
        !           160: #define short34to35WithGamma(x) \
        !           161:        (  (_bm34To35SampleTable[((x) & 0x00F0) >> 4])          \
        !           162:         | (_bm34To35SampleTable[((x) & 0x0F00) >> 8] << 5)     \
        !           163:         | (_bm34To35SampleTable[(x) >> 12] << 10) )
        !           164: 
        !           165: #define short35to34WithGamma(x) \
        !           166:        (  0x000F                                               \
        !           167:         | (_bm35To34SampleTable[x & 0x001F] << 4)              \
        !           168:         | (_bm35To34SampleTable[(x & 0x03E0) >> 5] << 8)       \
        !           169:         | (_bm35To34SampleTable[(x & 0x7C00) >> 10] << 12) )
        !           170: 
        !           171: static void StdFBDisplayCursor16(IOFramebuffer *inst)
        !           172: // Description: Displays the cursor on the framebuffer by first saving
        !           173: //             what's underneath the cursor, then drawing the cursor there.
        !           174: //             NOTE:The topleft of the cursorRect passed in is not
        !           175: //             necessarily the cursor location.The cursorRect is adjusted to
        !           176: //             compensate for the cursor hotspot.If the frame buffer is
        !           177: //             cacheable, flush at the end of the drawing operation. A
        !           178: //             saveRect is stored which defines the actual area of the screen
        !           179: //             that is saved.This is used by RemoveCursor in restoring the
        !           180: //             screen data later.
        !           181: {
        !           182:     IODisplayInfo *dpy;
        !           183:     StdFBShmem_t *shmem;
        !           184:     vm_offset_t startPtr;              /* Starting screen data pointer */
        !           185:     unsigned int vramRow;
        !           186:     Bounds saveRect;
        !           187:     short i, j, width, cursRow;
        !           188:     unsigned short *vramPtr;   /* screen data pointer */
        !           189:     volatile unsigned short *savePtr;  /* saved screen data pointer */
        !           190:     unsigned short s, d, f;
        !           191:     volatile unsigned short *cursPtr;
        !           192:     unsigned char *_bm34To35SampleTable;
        !           193:     unsigned char *_bm35To34SampleTable;
        !           194: 
        !           195:     dpy = [inst displayInfo];
        !           196:     shmem = GetShmem(inst);
        !           197:     saveRect = shmem->cursorRect;
        !           198:     /* Clip saveRect vertical within screen bounds */
        !           199:     if (saveRect.miny < shmem->screenBounds.miny)
        !           200:        saveRect.miny = shmem->screenBounds.miny;
        !           201:     if (saveRect.maxy > shmem->screenBounds.maxy)
        !           202:        saveRect.maxy = shmem->screenBounds.maxy;
        !           203:     if (saveRect.minx < shmem->screenBounds.minx)
        !           204:        saveRect.minx = shmem->screenBounds.minx;
        !           205:     if (saveRect.maxx > shmem->screenBounds.maxx)
        !           206:        saveRect.maxx = shmem->screenBounds.maxx;
        !           207:     shmem->saveRect = saveRect; /* Remember save rect for RemoveCursor */
        !           208: 
        !           209:     vramRow = dpy->totalWidth; /* Scanline width in pixels */
        !           210:     vramPtr = (unsigned short *)dpy->frameBuffer + 
        !           211:         (vramRow * (saveRect.miny - shmem->screenBounds.miny)) +
        !           212:        (saveRect.minx - shmem->screenBounds.minx);
        !           213:     startPtr = (vm_offset_t) vramPtr;
        !           214:     width = saveRect.maxx - saveRect.minx;
        !           215:     vramRow -= width;
        !           216:     
        !           217:     cursRow = CURSORWIDTH - width;
        !           218:     savePtr = shmem->cursor.rgb.save;
        !           219:     cursPtr = shmem->cursor.rgb.image[shmem->frame];
        !           220:     cursPtr += (saveRect.miny - shmem->cursorRect.miny) * CURSORWIDTH +
        !           221:                (saveRect.minx - shmem->cursorRect.minx);
        !           222: 
        !           223:     if (dpy->bitsPerPixel == IO_12BitsPerPixel)
        !           224:     {
        !           225:        for (i = saveRect.maxy - saveRect.miny; --i != -1; ) {
        !           226:            for (j = width; --j != -1; ) {
        !           227:                d = *savePtr++ = *vramPtr;
        !           228:                if ( (s = *cursPtr++) == 0 )
        !           229:                {       /* Transparent black area.  Leave dst as is. */
        !           230:                    ++vramPtr;
        !           231:                    continue;
        !           232:                }
        !           233:                if ( (f = (~s) & (unsigned int)AMASK) == 0 )
        !           234:                {       /* Opaque cursor pixel.  Mark it. */
        !           235:                    *vramPtr++ = s;
        !           236:                    continue;
        !           237:                }
        !           238:                /* Alpha is not 0 or 1.0.  Sover the cursor. */
        !           239:                *vramPtr++ = s + (((((d & RBMASK)>>4)*f + GAMASK) & RBMASK)
        !           240:                             | ((((d & GAMASK)*f+GAMASK)>>4) & GAMASK));
        !           241:            }
        !           242:            cursPtr += cursRow; /* starting point of next cursor line */
        !           243:            vramPtr += vramRow; /* starting point of next screen line */
        !           244:        }
        !           245:     }
        !           246:     else       // dpy->bitsPerPixel == IO_15BitsPerPixel
        !           247:     {
        !           248:        // These tables should always be set by the Window Server before
        !           249:        // it enables cursor drawing.  If they're not set, it's an error.
        !           250:         if (   (_bm34To35SampleTable = inst->_bm34To35SampleTable) == NULL
        !           251:             || (_bm35To34SampleTable = inst->_bm35To34SampleTable) == NULL )
        !           252:                return;
        !           253:        for (i = saveRect.maxy - saveRect.miny; --i>=0; ) {
        !           254:            for (j = width; --j>=0; ) {
        !           255:                d = *savePtr++ = *vramPtr;
        !           256:                if ( (s = *cursPtr++) == 0 )
        !           257:                {       /* Transparent black area.  Leave dst as is. */
        !           258:                    ++vramPtr;
        !           259:                    continue;
        !           260:                }
        !           261:                if ( (f = (~s) & (unsigned int)AMASK) == 0 )
        !           262:                {       /* Opaque cursor pixel.  Mark it. */
        !           263:                    *vramPtr++ = short34to35WithGamma(s);
        !           264:                    continue;
        !           265:                }
        !           266:                /* Alpha is not 0 or 1.0.  Sover the cursor. */
        !           267:                d = short35to34WithGamma(d);
        !           268:                d = s + (((((d & RBMASK)>>4)*f + GAMASK) & RBMASK)
        !           269:                    | ((((d & GAMASK)*f+GAMASK)>>4) & GAMASK));
        !           270:                *vramPtr++ = short34to35WithGamma(d);
        !           271:            }
        !           272:            cursPtr += cursRow; /* starting point of next cursor line */
        !           273:            vramPtr += vramRow; /* starting point of next screen line */
        !           274:        }
        !           275:     }
        !           276: }
        !           277: 
        !           278: static inline unsigned int MUL32(unsigned int a, unsigned int b)
        !           279: {
        !           280:     unsigned int v, w;
        !           281: 
        !           282:     v  = ((a & 0xff00ff00) >> 8) * b;
        !           283:     v += ((v & 0xff00ff00) >> 8) + 0x00010001;
        !           284:     w  = (a & 0x00ff00ff) * b;
        !           285:     w += ((w & 0xff00ff00) >> 8) + 0x00010001;
        !           286: 
        !           287:     return (v & 0xff00ff00) | ((w >> 8) & 0x00ff00ff);
        !           288: }
        !           289: 
        !           290: static inline unsigned char map32to256( unsigned char *directToLogical, unsigned int s)
        !           291: {
        !           292:     unsigned char logicalValue;
        !           293: 
        !           294:     if ((s ^ (s>>8)) & 0x00ffff00) {
        !           295:        logicalValue =  directToLogical[(s>>24)        + 0] +
        !           296:                        directToLogical[((s>>16)&0xff) + 256] +
        !           297:                        directToLogical[((s>>8)&0xff)  + 512];
        !           298:     } else {
        !           299:        logicalValue =  directToLogical[(s>>24)        + 768];
        !           300:     }
        !           301:     return( directToLogical[ logicalValue + 1024 ]);           // final conversion from NeXT palette
        !           302:                                                                // to actual palette
        !           303: }
        !           304: 
        !           305: static void StdFBDisplayCursor8(IOFramebuffer *inst)
        !           306: // Description: Displays the cursor on the framebuffer by first saving
        !           307: //             what's underneath the cursor, then drawing the cursor there.
        !           308: //             NOTE:The topleft of the cursorRect passed in is not
        !           309: //             necessarily the cursor location.The cursorRect is adjusted to
        !           310: //             compensate for the cursor hotspot.If the frame buffer is
        !           311: //             cacheable, flush at the end of the drawing operation. A
        !           312: //             saveRect is stored which defines the actual area of the screen
        !           313: //             that is saved.This is used by RemoveCursor in restoring the
        !           314: //             screen data later.
        !           315: {
        !           316:     IODisplayInfo *dpy;
        !           317:     StdFBShmem_t *shmem;
        !           318:     vm_offset_t startPtr;              /* Starting screen data pointer */
        !           319:     unsigned int vramRow;
        !           320:     Bounds saveRect;
        !           321:     short i, j, width, cursRow;
        !           322:     unsigned char *vramPtr;    /* screen data pointer */
        !           323:     volatile unsigned char *savePtr;   /* saved screen data pointer */
        !           324:     unsigned short s, d;
        !           325:     unsigned char dst, alpha;
        !           326:     unsigned int rgb32val;
        !           327:     volatile unsigned char *cursPtr;
        !           328:     volatile unsigned char *maskPtr;           /* cursor mask pointer */
        !           329:     unsigned int *_bm256To38SampleTable = inst->_bm256To38SampleTable;
        !           330:     unsigned char *_bm38To256SampleTable = inst->_bm38To256SampleTable;
        !           331: 
        !           332:     dpy = [inst displayInfo];
        !           333:     shmem = GetShmem(inst);
        !           334:     saveRect = shmem->cursorRect;
        !           335:     /* Clip saveRect vertical within screen bounds */
        !           336:     if (saveRect.miny < shmem->screenBounds.miny)
        !           337:        saveRect.miny = shmem->screenBounds.miny;
        !           338:     if (saveRect.maxy > shmem->screenBounds.maxy)
        !           339:        saveRect.maxy = shmem->screenBounds.maxy;
        !           340:     if (saveRect.minx < shmem->screenBounds.minx)
        !           341:        saveRect.minx = shmem->screenBounds.minx;
        !           342:     if (saveRect.maxx > shmem->screenBounds.maxx)
        !           343:        saveRect.maxx = shmem->screenBounds.maxx;
        !           344:     shmem->saveRect = saveRect; /* Remember save rect for RemoveCursor */
        !           345: 
        !           346:     vramRow = dpy->totalWidth; /* Scanline width in pixels */
        !           347:     vramPtr = (unsigned char *)dpy->frameBuffer + 
        !           348:         (vramRow * (saveRect.miny - shmem->screenBounds.miny)) +
        !           349:        (saveRect.minx - shmem->screenBounds.minx);
        !           350:     startPtr = (vm_offset_t) vramPtr;
        !           351:     width = saveRect.maxx - saveRect.minx;
        !           352:     vramRow -= width;
        !           353:     
        !           354:     cursRow = CURSORWIDTH - width;
        !           355:     savePtr = shmem->cursor.bw8.save;
        !           356:     cursPtr = shmem->cursor.bw8.image[shmem->frame];
        !           357:     maskPtr = shmem->cursor.bw8.mask[shmem->frame];
        !           358:     i = (saveRect.miny - shmem->cursorRect.miny) * CURSORWIDTH +
        !           359:        (saveRect.minx - shmem->cursorRect.minx);
        !           360:     cursPtr += i;
        !           361:     maskPtr += i;
        !           362: 
        !           363:     if (dpy->colorSpace == IO_OneIsWhiteColorSpace) {
        !           364:        for (i = saveRect.maxy - saveRect.miny; --i>=0; ) {
        !           365:            for (j = width; --j>=0; ) {
        !           366:                int t;
        !           367:                d = *savePtr++ = *vramPtr;
        !           368:                s = *cursPtr++;
        !           369:                t = d * (255 - *maskPtr++);
        !           370:                d = s + ((t + (t >> 8) + 1) >> 8);
        !           371:                *vramPtr++ = d;
        !           372:            }
        !           373:            cursPtr += cursRow; /* starting point of next cursor line */
        !           374:            maskPtr += cursRow;
        !           375:            vramPtr += vramRow; /* starting point of next screen line */
        !           376:        }
        !           377:     } else { // dpy->colorSpace == IO_RGBColorSpace 
        !           378:        for (i = saveRect.maxy - saveRect.miny; --i>=0; ) {
        !           379:            for (j = width; --j>=0; savePtr++,maskPtr++,cursPtr++,vramPtr++) {
        !           380:                *savePtr = *vramPtr;
        !           381:                if (alpha = *maskPtr) {
        !           382:                    dst = *cursPtr;
        !           383:                    if (alpha = ~alpha) {
        !           384:                        rgb32val = _bm256To38SampleTable[*vramPtr];
        !           385:                        rgb32val = (_bm256To38SampleTable[dst] & ~0xff) +
        !           386:                                   MUL32(rgb32val, alpha);
        !           387:                        dst = map32to256(_bm38To256SampleTable, rgb32val);
        !           388:                    }
        !           389:                    *vramPtr = dst;
        !           390:                }
        !           391:            }
        !           392:            cursPtr += cursRow; /* starting point of next cursor line */
        !           393:            maskPtr += cursRow;
        !           394:            vramPtr += vramRow; /* starting point of next screen line */
        !           395:        }
        !           396:     }
        !           397: }
        !           398: 
        !           399: static void StdFBRemoveCursor16(IOFramebuffer *inst)
        !           400: // Description:        RemoveCursor erases the cursor by replacing the background
        !           401: //             image that was saved by the previous call to DisplayCursor.
        !           402: //             If the frame buffer is cacheable, flush at the end of the
        !           403: //             drawing operation.
        !           404: {
        !           405:     IODisplayInfo *dpy;
        !           406:     StdFBShmem_t *shmem;
        !           407:     short i, j, width;
        !           408:     vm_offset_t startPtr;
        !           409:     unsigned int vramRow;
        !           410:     Bounds saveRect;
        !           411:     unsigned short *vramPtr;
        !           412:     volatile unsigned short *savePtr;
        !           413: 
        !           414:     dpy = [inst displayInfo];
        !           415:     shmem = GetShmem(inst);
        !           416:     saveRect = shmem->saveRect;
        !           417:     vramRow = dpy->totalWidth; /* Scanline width in pixels */
        !           418:     vramPtr = (unsigned short *)dpy->frameBuffer +
        !           419:         (vramRow * (saveRect.miny - shmem->screenBounds.miny))
        !           420:        + (saveRect.minx - shmem->screenBounds.minx);
        !           421:     width = saveRect.maxx - saveRect.minx;
        !           422:     vramRow -= width;
        !           423:     savePtr = shmem->cursor.rgb.save;
        !           424:     startPtr = (vm_offset_t) vramPtr;
        !           425:     for (i = saveRect.maxy - saveRect.miny; --i != -1; ) {
        !           426:        for (j = width; --j != -1; )
        !           427:            *vramPtr++ = *savePtr++;
        !           428:        vramPtr += vramRow;
        !           429:     }
        !           430: }
        !           431: 
        !           432: static void StdFBRemoveCursor8(IOFramebuffer *inst)
        !           433: // Description:        RemoveCursor erases the cursor by replacing the background
        !           434: //             image that was saved by the previous call to DisplayCursor.
        !           435: //             If the frame buffer is cacheable, flush at the end of the
        !           436: //             drawing operation.
        !           437: {
        !           438:     IODisplayInfo *dpy;
        !           439:     StdFBShmem_t *shmem;
        !           440:     short i, j, width;
        !           441:     vm_offset_t startPtr;
        !           442:     unsigned int vramRow;
        !           443:     Bounds saveRect;
        !           444:     unsigned char *vramPtr;
        !           445:     volatile unsigned char *savePtr;
        !           446: 
        !           447:     dpy = [inst displayInfo];
        !           448:     shmem = GetShmem(inst);
        !           449:     saveRect = shmem->saveRect;
        !           450:     vramRow = dpy->totalWidth; /* Scanline width in pixels */
        !           451:     vramPtr = (unsigned char *)dpy->frameBuffer +
        !           452:         (vramRow * (saveRect.miny - shmem->screenBounds.miny))
        !           453:        + (saveRect.minx - shmem->screenBounds.minx);
        !           454:     width = saveRect.maxx - saveRect.minx;
        !           455:     vramRow -= width;
        !           456:     savePtr = shmem->cursor.bw8.save;
        !           457:     startPtr = (vm_offset_t) vramPtr;
        !           458:     for (i = saveRect.maxy - saveRect.miny; --i != -1; ) {
        !           459:        for (j = width; --j != -1; )
        !           460:            *vramPtr++ = *savePtr++;
        !           461:        vramPtr += vramRow;
        !           462:     }
        !           463: }
        !           464: 
        !           465: static void StdFBDisplayCursor32(IOFramebuffer *inst)
        !           466: {
        !           467:     IODisplayInfo *dpy;
        !           468:     StdFBShmem_t *shmem;
        !           469:     unsigned int vramRow;
        !           470:     Bounds saveRect;
        !           471:     int i, j, width, cursRow;
        !           472:     unsigned int *vramPtr;     /* screen data pointer */
        !           473:     volatile unsigned int *savePtr;    /* saved screen data pointer */
        !           474:     unsigned int s, d, f;
        !           475:     volatile unsigned int *cursPtr;
        !           476: 
        !           477:     dpy = [inst displayInfo];
        !           478:     shmem = GetShmem(inst);
        !           479:     saveRect = shmem->cursorRect;
        !           480:     /* Clip saveRect vertical within screen bounds */
        !           481:     if (saveRect.miny < shmem->screenBounds.miny)
        !           482:        saveRect.miny = shmem->screenBounds.miny;
        !           483:     if (saveRect.maxy > shmem->screenBounds.maxy)
        !           484:        saveRect.maxy = shmem->screenBounds.maxy;
        !           485:     if (saveRect.minx < shmem->screenBounds.minx)
        !           486:        saveRect.minx = shmem->screenBounds.minx;
        !           487:     if (saveRect.maxx > shmem->screenBounds.maxx)
        !           488:        saveRect.maxx = shmem->screenBounds.maxx;
        !           489:     shmem->saveRect = saveRect; /* Remember save rect for RemoveCursor */
        !           490: 
        !           491:     vramRow = dpy->totalWidth; /* Scanline width in pixels */
        !           492:     vramPtr = (unsigned int *)dpy->frameBuffer + 
        !           493:         (vramRow * (saveRect.miny - shmem->screenBounds.miny)) +
        !           494:        (saveRect.minx - shmem->screenBounds.minx);
        !           495:     width = saveRect.maxx - saveRect.minx;
        !           496:     vramRow -= width;
        !           497:     
        !           498:     cursRow = CURSORWIDTH - width;
        !           499:     savePtr = shmem->cursor.rgb24.save;
        !           500:     cursPtr = shmem->cursor.rgb24.image[shmem->frame];
        !           501:     cursPtr += (saveRect.miny - shmem->cursorRect.miny) * CURSORWIDTH +
        !           502:                (saveRect.minx - shmem->cursorRect.minx);
        !           503: 
        !           504:     if (dpy->pixelEncoding[0] == IO_SampleTypeAlpha ||
        !           505:        dpy->pixelEncoding[0] == IO_SampleTypeSkip) {
        !           506:        /* Pixel format is Axxx */
        !           507:        for (i = saveRect.maxy - saveRect.miny; --i != -1; ) {
        !           508:            for (j = width; --j != -1; ) {
        !           509:                d = *savePtr++ = *vramPtr;
        !           510:                s = *cursPtr++;
        !           511:                f = s >> 24;
        !           512:                if (f) {
        !           513:                    if (f == 0xff)              // Opaque pixel
        !           514:                        *vramPtr++ = s;
        !           515:                    else {                      // SOVER the cursor pixel
        !           516:                        s <<= 8;  d <<= 8;   /* Now pixels are xxxA */
        !           517:                        f ^= 0xFF;
        !           518:                        d = s+(((((d&0xFF00FF00)>>8)*f+0x00FF00FF)&0xFF00FF00)
        !           519:                            | ((((d & 0x00FF00FF)*f+0x00FF00FF)>>8) &
        !           520:                                0x00FF00FF));
        !           521:                        *vramPtr++ = (d>>8) | 0xff000000;
        !           522:                    }
        !           523:                } else                  // Transparent cursor pixel
        !           524:                    vramPtr++;
        !           525:            }
        !           526:            cursPtr += cursRow; /* starting point of next cursor line */
        !           527:            vramPtr += vramRow; /* starting point of next screen line */
        !           528:        }
        !           529:     } else {
        !           530:        /* Pixel format is xxxA */
        !           531:        for (i = saveRect.maxy - saveRect.miny; --i != -1; ) {
        !           532:            for (j = width; --j != -1; ) {
        !           533:                d = *savePtr++ = *vramPtr;
        !           534:                s = *cursPtr++;
        !           535:                f = s & (unsigned int)0xFF;
        !           536:                if (f) {
        !           537:                    if (f == 0xff)              // Opaque pixel
        !           538:                        *vramPtr++ = s;
        !           539:                    else {                      // SOVER the cursor pixel
        !           540:                        f ^= 0xFF;
        !           541:                        d = s+(((((d&0xFF00FF00)>>8)*f+0x00FF00FF)&0xFF00FF00)
        !           542:                            | ((((d & 0x00FF00FF)*f+0x00FF00FF)>>8) &
        !           543:                                0x00FF00FF));
        !           544:                        *vramPtr++ = d;
        !           545:                    }
        !           546:                } else                  // Transparent cursor pixel
        !           547:                    vramPtr++;
        !           548:            }
        !           549:            cursPtr += cursRow; /* starting point of next cursor line */
        !           550:            vramPtr += vramRow; /* starting point of next screen line */
        !           551:        }
        !           552:     }
        !           553: }
        !           554: 
        !           555: static void StdFBRemoveCursor32(IOFramebuffer *inst)
        !           556: {
        !           557:     IODisplayInfo *dpy;
        !           558:     StdFBShmem_t *shmem;
        !           559:     int i, j, width;
        !           560:     unsigned int vramRow;
        !           561:     Bounds saveRect;
        !           562:     unsigned int *vramPtr;
        !           563:     unsigned int *savePtr;
        !           564: 
        !           565:     dpy = [inst displayInfo];
        !           566:     shmem = GetShmem(inst);
        !           567:     saveRect = shmem->saveRect;
        !           568:     vramRow = dpy->totalWidth; /* Scanline width in pixels */
        !           569:     vramPtr = (unsigned int *)dpy->frameBuffer +
        !           570:         (vramRow * (saveRect.miny - shmem->screenBounds.miny))
        !           571:        + (saveRect.minx - shmem->screenBounds.minx);
        !           572:     width = saveRect.maxx - saveRect.minx;
        !           573:     vramRow -= width;
        !           574:     savePtr = (unsigned int *)shmem->cursor.rgb24.save;
        !           575:     for (i = saveRect.maxy - saveRect.miny; --i != -1; ) {
        !           576:        for (j = width; --j != -1; )
        !           577:            *vramPtr++ = *savePtr++;
        !           578:        vramPtr += vramRow;
        !           579:     }
        !           580: }
        !           581: 
        !           582: static inline void StdFBDisplayCursor(IOFramebuffer *inst) 
        !           583: {
        !           584:     switch (inst->cursorBitsPerPixel) {
        !           585:        default:
        !           586:        case IO_12BitsPerPixel:
        !           587:        case IO_15BitsPerPixel:
        !           588:            StdFBDisplayCursor16(inst);
        !           589:            break;
        !           590:        case IO_8BitsPerPixel:
        !           591:            StdFBDisplayCursor8(inst);
        !           592:            break;
        !           593:        case IO_24BitsPerPixel:
        !           594:            StdFBDisplayCursor32(inst);
        !           595:        case (-1):
        !           596:            break;
        !           597:     }
        !           598: }
        !           599: 
        !           600: static inline void StdFBRemoveCursor(IOFramebuffer *inst) 
        !           601: {
        !           602:     switch (inst->cursorBitsPerPixel) {
        !           603:        default:
        !           604:        case IO_12BitsPerPixel:
        !           605:        case IO_15BitsPerPixel:
        !           606:            StdFBRemoveCursor16(inst);
        !           607:            break;
        !           608:        case IO_8BitsPerPixel:
        !           609:            StdFBRemoveCursor8(inst);
        !           610:            break;
        !           611:        case IO_24BitsPerPixel:
        !           612:            StdFBRemoveCursor32(inst);
        !           613:        case (-1):
        !           614:            break;
        !           615:     }
        !           616: }
        !           617: 
        !           618: 
        !           619: #define RemoveCursor(inst)     StdFBRemoveCursor(inst)
        !           620: static inline void DisplayCursor(IOFramebuffer *inst)
        !           621: {
        !           622:     Point hs;
        !           623:     StdFBShmem_t *shmem;
        !           624: 
        !           625:     shmem = GetShmem(inst);
        !           626:     hs = shmem->hotSpot[shmem->frame];
        !           627:     shmem->cursorRect.maxx =
        !           628:         (shmem->cursorRect.minx = (shmem->cursorLoc).x - hs.x) + 16;
        !           629:     shmem->cursorRect.maxy =
        !           630:         (shmem->cursorRect.miny = (shmem->cursorLoc).y - hs.y) + 16;
        !           631:     StdFBDisplayCursor(inst);
        !           632:     shmem->oldCursorRect = shmem->cursorRect;
        !           633: }
        !           634: 
        !           635: static inline void SysHideCursor(IOFramebuffer *inst)
        !           636: {
        !           637:     if (!GetShmem(inst)->cursorShow++)
        !           638:        RemoveCursor(inst);
        !           639: }
        !           640: 
        !           641: static inline void SysShowCursor(IOFramebuffer *inst)
        !           642: {
        !           643:     if (GetShmem(inst)->cursorShow)
        !           644:        if (!--(GetShmem(inst)->cursorShow))
        !           645:            DisplayCursor(inst);
        !           646: }
        !           647: 
        !           648: static inline void CheckShield(IOFramebuffer *inst)
        !           649: {
        !           650:     Point hs;
        !           651:     int intersect;
        !           652:     Bounds tempRect;
        !           653:     StdFBShmem_t *shmem;
        !           654:     
        !           655:     shmem = GetShmem(inst);
        !           656:     /* Calculate temp cursorRect */
        !           657:     hs = shmem->hotSpot[shmem->frame];
        !           658:     tempRect.maxx = (tempRect.minx = (shmem->cursorLoc).x - hs.x) + 16;
        !           659:     tempRect.maxy = (tempRect.miny = (shmem->cursorLoc).y - hs.y) + 16;
        !           660: 
        !           661:     intersect = TOUCHBOUNDS(tempRect, shmem->shieldRect);
        !           662:     if (intersect != shmem->shielded)
        !           663:        (shmem->shielded = intersect) ?
        !           664:            SysHideCursor(inst) : SysShowCursor(inst);
        !           665: }
        !           666: //
        !           667: // END:                Generic utility routines
        !           668: //
        !           669: 
        !           670: 
        !           671: //
        !           672: // BEGIN:      Implementation of the evScreen protocol
        !           673: //
        !           674: - hideCursor: (int)token
        !           675: {
        !           676:     SETSEMA(GetShmem(self));
        !           677:     SysHideCursor(self);
        !           678:     CLEARSEMA(GetShmem(self));
        !           679:     return self;
        !           680: }
        !           681: 
        !           682: - moveCursor:(Point*)cursorLoc frame:(int)frame token:(int)t
        !           683: {
        !           684:     StdFBShmem_t *shmem;
        !           685:     
        !           686:     shmem = GetShmem(self);
        !           687:     SETSEMA(shmem);
        !           688:     shmem->frame = frame;
        !           689:     shmem->cursorLoc = *cursorLoc;
        !           690:     if (!shmem->cursorShow++)
        !           691:        RemoveCursor(self);
        !           692:     if (shmem->cursorObscured) {
        !           693:        shmem->cursorObscured = 0;
        !           694:        if (shmem->cursorShow)
        !           695:            --shmem->cursorShow;
        !           696:     }
        !           697:     if (shmem->shieldFlag) CheckShield(self);
        !           698:     if (shmem->cursorShow)
        !           699:        if (!--shmem->cursorShow)
        !           700:            DisplayCursor(self);
        !           701:     CLEARSEMA(shmem);
        !           702:     return self;
        !           703: }
        !           704: 
        !           705: - showCursor:(Point*)cursorLoc frame:(int)frame token:(int)t
        !           706: {
        !           707:     StdFBShmem_t *shmem;
        !           708:     
        !           709:     shmem = GetShmem(self);
        !           710:     SETSEMA(GetShmem(self));
        !           711:     shmem->frame = frame;
        !           712:     shmem->cursorLoc = *cursorLoc;
        !           713:     if (shmem->shieldFlag) CheckShield(self);
        !           714:     SysShowCursor(self);
        !           715:     CLEARSEMA(shmem);
        !           716:     return self;
        !           717: }
        !           718: 
        !           719: - setBrightness:(int)level token:(int)t
        !           720: {
        !           721:     if ( level < EV_SCREEN_MIN_BRIGHTNESS
        !           722:        || level > EV_SCREEN_MAX_BRIGHTNESS )
        !           723:     {
        !           724:        IOLog("%s: Invalid arg to setBrightness:%d\n",
        !           725:            [self name], level );
        !           726:     }
        !           727:     return self;
        !           728: }
        !           729: //
        !           730: // END:                Implementation of the evScreen protocol
        !           731: //
        !           732: //
        !           733: // BEGIN:      EXPORTED Methods
        !           734: //
        !           735: 
        !           736: - initFromDeviceDescription:deviceDescription
        !           737: {
        !           738:     extern int sprintf(char *s, const char *format, ...);
        !           739:     static int nextUnit = 0;
        !           740:     char nameBuf[20];
        !           741: 
        !           742:     if ([super initFromDeviceDescription:deviceDescription] == nil)
        !           743:        return [super free];
        !           744: 
        !           745:     _pendingDisplayMode = -1;
        !           746:     
        !           747:     sprintf(nameBuf, "Display%d", nextUnit);
        !           748:     [self setUnit: nextUnit++];
        !           749:     [self setName:nameBuf];
        !           750:     return self;
        !           751: }
        !           752: 
        !           753: - (IOConsoleInfo *)allocateConsoleInfo;
        !           754: // Description:        Allocates a console support info structure based on this
        !           755: //             display. This structure, and the functions in it, are used
        !           756: //             to display alert and console windows.
        !           757: {
        !           758:     return FBAllocateConsole([self displayInfo]);
        !           759: }
        !           760: 
        !           761: static const char *
        !           762: find_parameter(const char *parameter, const char *string)
        !           763: {
        !           764:     int c;
        !           765:     size_t length;
        !           766: 
        !           767:     length = strlen(parameter);
        !           768:     while (*string != 0) {
        !           769:        if (strncmp(string, parameter, length) == 0) {
        !           770:            string += length;
        !           771:            while ((c = *string) != '\0' && (c == ' ' || c == '\t'))
        !           772:                string++;
        !           773:            return (c != 0) ? string : 0;
        !           774:        }
        !           775:        string++;
        !           776:     }
        !           777:     return 0;
        !           778: }
        !           779: 
        !           780: 
        !           781: static UInt32
        !           782: ActiveBytes( IODisplayInfo * displayInfo )
        !           783: {
        !           784:     UInt32     bytesPerPixel;
        !           785: 
        !           786:     switch( displayInfo->bitsPerPixel) {
        !           787:        case IO_8BitsPerPixel:
        !           788:            bytesPerPixel  = 1;
        !           789:            break;
        !           790:        case IO_15BitsPerPixel:
        !           791:            bytesPerPixel  = 2;
        !           792:            break;
        !           793:        case IO_24BitsPerPixel:
        !           794:        default:
        !           795:            bytesPerPixel  = 4;
        !           796:            break;
        !           797:     }
        !           798:     // The last line may not have the full rowBytes physically present,
        !           799:     // only the active pixels.
        !           800:     return( displayInfo->rowBytes * (displayInfo->height - 1)
        !           801:          + (displayInfo->width * bytesPerPixel));
        !           802: }
        !           803: 
        !           804: - convertPixelInfoToDisplayInfo:(IOFBPixelInformation *)pixelInfo mono:(BOOL)mono
        !           805:        displayInfo:(IODisplayInfo *)displayInfo
        !           806: {
        !           807:     IOBitsPerPixel     nextDepth;
        !           808:     const char *       nextPixels;
        !           809:     IOColorSpace       nextCSpace;
        !           810:     static const char * apple8BitMonoEncoding = "WWWWWWWW";
        !           811:     static const char * apple8BitEncoding = "PPPPPPPP";
        !           812:     static const char * apple16BitEncoding = "-RRRRRGGGGGBBBBB";
        !           813:     static const char *        apple32BitEncoding = "--------RRRRRRRRGGGGGGGGBBBBBBBB";
        !           814: 
        !           815:     nextCSpace = IO_RGBColorSpace;
        !           816: 
        !           817:     switch( pixelInfo->bitsPerPixel ) {
        !           818:        default:
        !           819:        case 8:
        !           820:            nextDepth   = IO_8BitsPerPixel;
        !           821:            if( mono) {
        !           822:                nextCSpace = IO_OneIsWhiteColorSpace;
        !           823:                nextPixels = apple8BitMonoEncoding;
        !           824:            } else {
        !           825:                nextPixels  = apple8BitEncoding;
        !           826:            }
        !           827:            break;
        !           828:        case 16:
        !           829:            nextDepth   = IO_15BitsPerPixel;
        !           830:            nextPixels  = apple16BitEncoding;
        !           831:            break;
        !           832:        case 32:
        !           833:            nextDepth   = IO_24BitsPerPixel;
        !           834:            nextPixels  = apple32BitEncoding;
        !           835:            break;
        !           836:     }
        !           837: 
        !           838:     bzero(displayInfo, sizeof(IODisplayInfo));
        !           839: 
        !           840:     strncpy(displayInfo->pixelEncoding, nextPixels, strlen(nextPixels));
        !           841:     displayInfo->width = pixelInfo->width;
        !           842:     displayInfo->height = pixelInfo->height;
        !           843:     displayInfo->rowBytes = pixelInfo->rowBytes;
        !           844:     displayInfo->totalWidth = (pixelInfo->rowBytes * 8) / pixelInfo->bitsPerPixel;
        !           845:     displayInfo->refreshRate = (pixelInfo->refreshRate + 0x8000) >> 16;
        !           846:     displayInfo->bitsPerPixel = nextDepth;
        !           847:     displayInfo->colorSpace = nextCSpace;
        !           848:     displayInfo->flags = IO_DISPLAY_HAS_TRANSFER_TABLE
        !           849:                           | [self tempFlags];
        !           850:     return( self);
        !           851: }
        !           852: 
        !           853: - (IOReturn) getNextMode:(IOFBIndex *)index modeInfo:(IOFBDisplayModeInformation *)modeInfo needFlags:(UInt32)needFlags
        !           854: {
        !           855:     IOReturn                   err;
        !           856:     IOFBDisplayModeID          modeID;
        !           857:     IOFBTimingInformation      timingInfo;
        !           858:     UInt32                     flags;
        !           859: 
        !           860:     do {
        !           861:        err = [self getDisplayModeByIndex:(*index)++ displayMode:&modeID];
        !           862:        if( err)
        !           863:            break;
        !           864:        err = [self getDisplayModeInformation:modeID info:modeInfo];
        !           865:        if( err)
        !           866:            break;
        !           867: 
        !           868:        err = [self getDisplayModeTiming:0 mode:modeID timingInfo:&timingInfo connectFlags:&flags];
        !           869: 
        !           870:     } while( (err == noErr) && ((flags & needFlags) != needFlags) );
        !           871: 
        !           872:     return( err);
        !           873: }
        !           874: 
        !           875: // Apple standard 8-bit CLUT
        !           876: 
        !           877: const UInt8 appleClut8[ 256 * 3 ] = {
        !           878:        0xFF,0xFF,0xFF, 0xFF,0xFF,0xCC, 0xFF,0xFF,0x99, 0xFF,0xFF,0x66,
        !           879:        0xFF,0xFF,0x33, 0xFF,0xFF,0x00, 0xFF,0xCC,0xFF, 0xFF,0xCC,0xCC,
        !           880:        0xFF,0xCC,0x99, 0xFF,0xCC,0x66, 0xFF,0xCC,0x33, 0xFF,0xCC,0x00,
        !           881:        0xFF,0x99,0xFF, 0xFF,0x99,0xCC, 0xFF,0x99,0x99, 0xFF,0x99,0x66,
        !           882:        0xFF,0x99,0x33, 0xFF,0x99,0x00, 0xFF,0x66,0xFF, 0xFF,0x66,0xCC,
        !           883:        0xFF,0x66,0x99, 0xFF,0x66,0x66, 0xFF,0x66,0x33, 0xFF,0x66,0x00,
        !           884:        0xFF,0x33,0xFF, 0xFF,0x33,0xCC, 0xFF,0x33,0x99, 0xFF,0x33,0x66,
        !           885:        0xFF,0x33,0x33, 0xFF,0x33,0x00, 0xFF,0x00,0xFF, 0xFF,0x00,0xCC,
        !           886:        0xFF,0x00,0x99, 0xFF,0x00,0x66, 0xFF,0x00,0x33, 0xFF,0x00,0x00,
        !           887:        0xCC,0xFF,0xFF, 0xCC,0xFF,0xCC, 0xCC,0xFF,0x99, 0xCC,0xFF,0x66,
        !           888:        0xCC,0xFF,0x33, 0xCC,0xFF,0x00, 0xCC,0xCC,0xFF, 0xCC,0xCC,0xCC,
        !           889:        0xCC,0xCC,0x99, 0xCC,0xCC,0x66, 0xCC,0xCC,0x33, 0xCC,0xCC,0x00,
        !           890:        0xCC,0x99,0xFF, 0xCC,0x99,0xCC, 0xCC,0x99,0x99, 0xCC,0x99,0x66,
        !           891:        0xCC,0x99,0x33, 0xCC,0x99,0x00, 0xCC,0x66,0xFF, 0xCC,0x66,0xCC,
        !           892:        0xCC,0x66,0x99, 0xCC,0x66,0x66, 0xCC,0x66,0x33, 0xCC,0x66,0x00,
        !           893:        0xCC,0x33,0xFF, 0xCC,0x33,0xCC, 0xCC,0x33,0x99, 0xCC,0x33,0x66,
        !           894:        0xCC,0x33,0x33, 0xCC,0x33,0x00, 0xCC,0x00,0xFF, 0xCC,0x00,0xCC,
        !           895:        0xCC,0x00,0x99, 0xCC,0x00,0x66, 0xCC,0x00,0x33, 0xCC,0x00,0x00,
        !           896:        0x99,0xFF,0xFF, 0x99,0xFF,0xCC, 0x99,0xFF,0x99, 0x99,0xFF,0x66,
        !           897:        0x99,0xFF,0x33, 0x99,0xFF,0x00, 0x99,0xCC,0xFF, 0x99,0xCC,0xCC,
        !           898:        0x99,0xCC,0x99, 0x99,0xCC,0x66, 0x99,0xCC,0x33, 0x99,0xCC,0x00,
        !           899:        0x99,0x99,0xFF, 0x99,0x99,0xCC, 0x99,0x99,0x99, 0x99,0x99,0x66,
        !           900:        0x99,0x99,0x33, 0x99,0x99,0x00, 0x99,0x66,0xFF, 0x99,0x66,0xCC,
        !           901:        0x99,0x66,0x99, 0x99,0x66,0x66, 0x99,0x66,0x33, 0x99,0x66,0x00,
        !           902:        0x99,0x33,0xFF, 0x99,0x33,0xCC, 0x99,0x33,0x99, 0x99,0x33,0x66,
        !           903:        0x99,0x33,0x33, 0x99,0x33,0x00, 0x99,0x00,0xFF, 0x99,0x00,0xCC,
        !           904:        0x99,0x00,0x99, 0x99,0x00,0x66, 0x99,0x00,0x33, 0x99,0x00,0x00,
        !           905:        0x66,0xFF,0xFF, 0x66,0xFF,0xCC, 0x66,0xFF,0x99, 0x66,0xFF,0x66,
        !           906:        0x66,0xFF,0x33, 0x66,0xFF,0x00, 0x66,0xCC,0xFF, 0x66,0xCC,0xCC,
        !           907:        0x66,0xCC,0x99, 0x66,0xCC,0x66, 0x66,0xCC,0x33, 0x66,0xCC,0x00,
        !           908:        0x66,0x99,0xFF, 0x66,0x99,0xCC, 0x66,0x99,0x99, 0x66,0x99,0x66,
        !           909:        0x66,0x99,0x33, 0x66,0x99,0x00, 0x66,0x66,0xFF, 0x66,0x66,0xCC,
        !           910:        0x66,0x66,0x99, 0x66,0x66,0x66, 0x66,0x66,0x33, 0x66,0x66,0x00,
        !           911:        0x66,0x33,0xFF, 0x66,0x33,0xCC, 0x66,0x33,0x99, 0x66,0x33,0x66,
        !           912:        0x66,0x33,0x33, 0x66,0x33,0x00, 0x66,0x00,0xFF, 0x66,0x00,0xCC,
        !           913:        0x66,0x00,0x99, 0x66,0x00,0x66, 0x66,0x00,0x33, 0x66,0x00,0x00,
        !           914:        0x33,0xFF,0xFF, 0x33,0xFF,0xCC, 0x33,0xFF,0x99, 0x33,0xFF,0x66,
        !           915:        0x33,0xFF,0x33, 0x33,0xFF,0x00, 0x33,0xCC,0xFF, 0x33,0xCC,0xCC,
        !           916:        0x33,0xCC,0x99, 0x33,0xCC,0x66, 0x33,0xCC,0x33, 0x33,0xCC,0x00,
        !           917:        0x33,0x99,0xFF, 0x33,0x99,0xCC, 0x33,0x99,0x99, 0x33,0x99,0x66,
        !           918:        0x33,0x99,0x33, 0x33,0x99,0x00, 0x33,0x66,0xFF, 0x33,0x66,0xCC,
        !           919:        0x33,0x66,0x99, 0x33,0x66,0x66, 0x33,0x66,0x33, 0x33,0x66,0x00,
        !           920:        0x33,0x33,0xFF, 0x33,0x33,0xCC, 0x33,0x33,0x99, 0x33,0x33,0x66,
        !           921:        0x33,0x33,0x33, 0x33,0x33,0x00, 0x33,0x00,0xFF, 0x33,0x00,0xCC,
        !           922:        0x33,0x00,0x99, 0x33,0x00,0x66, 0x33,0x00,0x33, 0x33,0x00,0x00,
        !           923:        0x00,0xFF,0xFF, 0x00,0xFF,0xCC, 0x00,0xFF,0x99, 0x00,0xFF,0x66,
        !           924:        0x00,0xFF,0x33, 0x00,0xFF,0x00, 0x00,0xCC,0xFF, 0x00,0xCC,0xCC,
        !           925:        0x00,0xCC,0x99, 0x00,0xCC,0x66, 0x00,0xCC,0x33, 0x00,0xCC,0x00,
        !           926:        0x00,0x99,0xFF, 0x00,0x99,0xCC, 0x00,0x99,0x99, 0x00,0x99,0x66,
        !           927:        0x00,0x99,0x33, 0x00,0x99,0x00, 0x00,0x66,0xFF, 0x00,0x66,0xCC,
        !           928:        0x00,0x66,0x99, 0x00,0x66,0x66, 0x00,0x66,0x33, 0x00,0x66,0x00,
        !           929:        0x00,0x33,0xFF, 0x00,0x33,0xCC, 0x00,0x33,0x99, 0x00,0x33,0x66,
        !           930:        0x00,0x33,0x33, 0x00,0x33,0x00, 0x00,0x00,0xFF, 0x00,0x00,0xCC,
        !           931:        0x00,0x00,0x99, 0x00,0x00,0x66, 0x00,0x00,0x33, 0xEE,0x00,0x00,
        !           932:        0xDD,0x00,0x00, 0xBB,0x00,0x00, 0xAA,0x00,0x00, 0x88,0x00,0x00,
        !           933:        0x77,0x00,0x00, 0x55,0x00,0x00, 0x44,0x00,0x00, 0x22,0x00,0x00,
        !           934:        0x11,0x00,0x00, 0x00,0xEE,0x00, 0x00,0xDD,0x00, 0x00,0xBB,0x00,
        !           935:        0x00,0xAA,0x00, 0x00,0x88,0x00, 0x00,0x77,0x00, 0x00,0x55,0x00,
        !           936:        0x00,0x44,0x00, 0x00,0x22,0x00, 0x00,0x11,0x00, 0x00,0x00,0xEE,
        !           937:        0x00,0x00,0xDD, 0x00,0x00,0xBB, 0x00,0x00,0xAA, 0x00,0x00,0x88,
        !           938:        0x00,0x00,0x77, 0x00,0x00,0x55, 0x00,0x00,0x44, 0x00,0x00,0x22,
        !           939:        0x00,0x00,0x11, 0xEE,0xEE,0xEE, 0xDD,0xDD,0xDD, 0xBB,0xBB,0xBB,
        !           940:        0xAA,0xAA,0xAA, 0x88,0x88,0x88, 0x77,0x77,0x77, 0x55,0x55,0x55,
        !           941:        0x44,0x44,0x44, 0x22,0x22,0x22, 0x11,0x11,0x11, 0x00,0x00,0x00
        !           942: };
        !           943: 
        !           944: ///////////////////// Backwards compatibility goo /////////////////////
        !           945: 
        !           946: - (IOReturn) makeConfigList
        !           947: {
        !           948:     IOFBDisplayModeInformation info;
        !           949:     IOFBPixelInformation       pixelInfo;
        !           950:     IOFBIndex                  depth;
        !           951:     struct ModeData    *       modeData;
        !           952:     UInt32                     modeIndex;
        !           953:     UInt32                     preflight;
        !           954:     IOReturn                   err;
        !           955:     enum {                     kNeedFlags = (kDisplayModeValidFlag /*| kDisplayModeSafeFlag */) };
        !           956: 
        !           957:     numModes = numConfigs = 0;
        !           958:     preflight = 1;
        !           959:     modeData = NULL;
        !           960:     do {
        !           961: 
        !           962:        if( numModes) {
        !           963:            modeData = IOMalloc( numModes * sizeof( struct ModeData));
        !           964:            modeTable = modeData;
        !           965:        }
        !           966:        modeIndex = 0;
        !           967:        while( (noErr == [self getNextMode:&modeIndex modeInfo:&info needFlags:kNeedFlags])) {
        !           968: 
        !           969:            if( modeData) {
        !           970:                if( (modeData - modeTable) >= numModes)
        !           971:                    kprintf("!!MODE LIST BAD!!\n");
        !           972:                else {
        !           973: 
        !           974:                    depth = -1;
        !           975:                    do {
        !           976:                         err = [self getPixelInformationForDisplayMode:info.displayModeID andDepthIndex:++depth
        !           977:                             pixelInfo:&pixelInfo];
        !           978: 
        !           979:                        if( (err == noErr) && (pixelInfo.bitsPerPixel >= 8)) {
        !           980:                             modeData->modeID = info.displayModeID;
        !           981:                            modeData->firstDepth = depth;
        !           982:                             modeData->numDepths = 1 + info.maxDepthIndex - depth;
        !           983:                             if( pixelInfo.bitsPerPixel == 8)
        !           984:                                 modeData->numDepths++;                 // +MONO
        !           985:                             numConfigs += modeData->numDepths;
        !           986:                             modeData++;
        !           987:                            break;
        !           988:                        }
        !           989:                    } while( (err == noErr) && (depth < info.maxDepthIndex));
        !           990:                }
        !           991:            } else
        !           992:                numModes++;
        !           993:        }
        !           994:     } while( preflight--);
        !           995: 
        !           996:     return( noErr);
        !           997: }
        !           998: 
        !           999: - (IOReturn) getDisplayModeAndDepthForIndex:(UInt32)configIndex
        !          1000:        mode:(IOFBDisplayModeID *)mode depth:(IOFBIndex *)depth mono:(BOOL *)mono
        !          1001: {
        !          1002:     struct ModeData    *       modeData;
        !          1003:     UInt32                     modeIndex;
        !          1004: 
        !          1005:     for( modeIndex = 0, modeData = modeTable;
        !          1006:        modeIndex < numModes;
        !          1007:        modeIndex++, modeData++) {
        !          1008: 
        !          1009:        if( configIndex < modeData->numDepths) {
        !          1010:            *mode = modeData->modeID;
        !          1011:            *mono = (configIndex == 0);
        !          1012:            if( *mono)
        !          1013:                *depth = modeData->firstDepth;
        !          1014:            else
        !          1015:                *depth = modeData->firstDepth + configIndex - 1;
        !          1016:            return( noErr);
        !          1017:        }
        !          1018:        configIndex -= modeData->numDepths;
        !          1019:     }
        !          1020: 
        !          1021:     return( IO_R_UNDEFINED_MODE);
        !          1022: }
        !          1023: 
        !          1024: - (IOReturn) getConfigIndexForDisplayModeAndDepth:
        !          1025:        (IOFBDisplayModeID)mode depth:(IOFBIndex)depth mono:(BOOL)mono
        !          1026:         configIndex:(UInt32 *)configIndex
        !          1027: {
        !          1028:     UInt32                     index;
        !          1029:     struct ModeData    *       modeData;
        !          1030:     UInt32                     modeIndex;
        !          1031: 
        !          1032:     for( modeIndex = 0, modeData = modeTable, index = 0;
        !          1033:        modeIndex < numModes;
        !          1034:        modeIndex++, modeData++) {
        !          1035: 
        !          1036:        if( mode == modeData->modeID) {
        !          1037:            if( depth <= modeData->firstDepth)          // 8 bpp mode
        !          1038:                index += (mono ? 0 : 1);
        !          1039:            else
        !          1040:                index += depth - modeData->firstDepth + 1;
        !          1041:            *configIndex = index;
        !          1042:            return( noErr);
        !          1043:        }
        !          1044:        index += modeData->numDepths;
        !          1045:     }
        !          1046: 
        !          1047:     return( IO_R_UNDEFINED_MODE);
        !          1048: }
        !          1049: 
        !          1050: - (IOReturn) getCurrentConfigIndex:(UInt32 *)configIndex
        !          1051: {
        !          1052:     return( [self getConfigIndexForDisplayModeAndDepth:currentDisplayModeID
        !          1053:                depth:currentDepthIndex mono:currentMono
        !          1054:                configIndex:configIndex]);
        !          1055: }
        !          1056: 
        !          1057: - (IOReturn) getDisplayInfoForConfigIndex:(UInt32)index info:(IODisplayInfo *)displayInfo
        !          1058:                                                connectFlags:(UInt32 *)flags
        !          1059: {
        !          1060:     IOFBPixelInformation       pixelInfo;
        !          1061:     IOReturn                   err;
        !          1062:     IOFBDisplayModeID          mode;
        !          1063:     IOFBIndex                  depth;
        !          1064:     IOFBTimingInformation      timingInfo;
        !          1065:     BOOL                       mono;
        !          1066: 
        !          1067:     err = [self getDisplayModeAndDepthForIndex:index
        !          1068:                mode:&mode depth:&depth mono:&mono];
        !          1069: 
        !          1070:     if( err == noErr)
        !          1071:        err = [self getPixelInformationForDisplayMode:mode andDepthIndex:depth
        !          1072:            pixelInfo:&pixelInfo];
        !          1073: 
        !          1074:     if( err == noErr)
        !          1075:        [self convertPixelInfoToDisplayInfo:&pixelInfo mono:mono displayInfo:displayInfo];
        !          1076: 
        !          1077:     if( flags &&
        !          1078:         [self getDisplayModeTiming:0 mode:mode timingInfo:&timingInfo connectFlags:flags])
        !          1079:             *flags = 0;
        !          1080: 
        !          1081:     return( err);
        !          1082: }
        !          1083: 
        !          1084: ///////////////////////////////////////////////////////
        !          1085: 
        !          1086: - (IOReturn) open
        !          1087: {
        !          1088:     IOReturn                   err;
        !          1089:     IOFBConfiguration          config;
        !          1090:     IOFBTimingInformation      timingInfo;
        !          1091:     IOFBDisplayModeID          startMode;
        !          1092:     IOFBIndex                  startDepth;
        !          1093:     UInt32                     startFlags = 0;
        !          1094:     UInt32                     modeIndex;
        !          1095:     IOFBDisplayModeInformation info;
        !          1096: 
        !          1097:     enum {                     kNeedFlags = (kDisplayModeValidFlag | kDisplayModeSafeFlag) };
        !          1098: 
        !          1099:     if( opened == NO) {
        !          1100: 
        !          1101:        opened = YES;
        !          1102:        smartDisplay = [gSmartDisplayClass findForConnection:self refCon:0];
        !          1103:        [self makeConfigList];
        !          1104: 
        !          1105:        // Check the startup mode with the display
        !          1106: 
        !          1107:        [self getConfiguration:&config];
        !          1108:        err = [self getStartupMode:&startMode depth:&startDepth];
        !          1109:        if( err) {
        !          1110:            startMode = config.displayMode;
        !          1111:            startDepth = config.depth;
        !          1112:        }
        !          1113: 
        !          1114:        err = [self getDisplayModeInformation:startMode info:&info];
        !          1115: 
        !          1116:        if( err == noErr)
        !          1117:            err = [self getDisplayModeTiming:0 mode:startMode
        !          1118:                    timingInfo:&timingInfo connectFlags:&startFlags];
        !          1119: 
        !          1120:        if( err || ((startFlags & kDisplayModeValidFlag) != kDisplayModeValidFlag) ) {
        !          1121: 
        !          1122:            // look for default
        !          1123:            modeIndex = 0;
        !          1124:            err = [self getNextMode:&modeIndex modeInfo:&info needFlags:kDisplayModeDefaultFlag];
        !          1125:            if( err) {
        !          1126:                // D'oh, look for a valid and safe
        !          1127:                modeIndex = 0;
        !          1128:                err = [self getNextMode:&modeIndex modeInfo:&info needFlags:kNeedFlags];
        !          1129:            }
        !          1130:            if( err == noErr)
        !          1131:                startMode = info.displayModeID;
        !          1132:        }
        !          1133: 
        !          1134:        if( startDepth > info.maxDepthIndex)
        !          1135:            startDepth = info.maxDepthIndex;
        !          1136: 
        !          1137:         // make the preferred mode pending, but come up at 8bpp for faster console
        !          1138:         _pendingDisplayMode = 0;
        !          1139:         pendingDisplayModeID = startMode;
        !          1140:         pendingDepthIndex = startDepth;
        !          1141:        // look for 8bpp mode
        !          1142:         err = [self getConfigIndexForDisplayModeAndDepth:startMode depth:0
        !          1143:                mono:NO configIndex:&modeIndex];
        !          1144:        if( err == noErr)
        !          1145:             err = [self getDisplayModeAndDepthForIndex:modeIndex
        !          1146:                     mode:&startMode depth:&startDepth mono:&currentMono];
        !          1147: 
        !          1148:         currentMono = (0 != (config.flags & kFBLuminanceMapped));
        !          1149:        pendingMono = currentMono;
        !          1150: 
        !          1151:        if( (startMode != config.displayMode) || (startDepth != config.depth)) {
        !          1152: 
        !          1153:            id deviceDesc = [self deviceDescription];
        !          1154: 
        !          1155:            if( [deviceDesc respondsTo:@selector(denyNVRAM:)])
        !          1156:                [deviceDesc denyNVRAM:YES];
        !          1157: 
        !          1158:            [self setDisplayMode:startMode depth:startDepth page:0];
        !          1159: 
        !          1160:             if( [deviceDesc respondsTo:@selector(denyNVRAM:)])
        !          1161:                 [deviceDesc denyNVRAM:NO];
        !          1162:        }
        !          1163:        [self setupForCurrentConfig];
        !          1164:     }
        !          1165: 
        !          1166:     return( noErr);
        !          1167: }
        !          1168: 
        !          1169: + (BOOL)probe:deviceDescription
        !          1170: {
        !          1171:     IOFramebuffer *inst;
        !          1172:     
        !          1173:     // Create an instance and initialize some basic instance variables.
        !          1174:     inst = [[self alloc] initFromDeviceDescription:deviceDescription];
        !          1175:     if (inst == nil)
        !          1176:         return NO;
        !          1177: 
        !          1178:     [inst setDeviceKind:"Linear Framebuffer"];
        !          1179: 
        !          1180:     [inst registerDevice];
        !          1181: 
        !          1182:     return YES;
        !          1183: }
        !          1184: 
        !          1185: - (IOReturn) setUserRanges
        !          1186: {
        !          1187:     IOReturn                   err;
        !          1188:     id                         deviceDescrip;
        !          1189:     UInt32                     i, start, size;
        !          1190: 
        !          1191:     deviceDescrip = [self deviceDescription];
        !          1192:     [deviceDescrip setMemoryRangeList:0 num:0];
        !          1193: 
        !          1194:     // needs to be much better !!
        !          1195:     for( i = 0; i < numRanges; i++) {
        !          1196: 
        !          1197:        start = userAccessRanges[ i ].start;
        !          1198:        size = start & 0xfff;
        !          1199:        start = start - size;
        !          1200:        size = (size + 0xfff + userAccessRanges[ i ].size) & 0xfffff000;
        !          1201:        userAccessRanges[ i ].start = start;
        !          1202:        userAccessRanges[ i ].size = size;
        !          1203:     }
        !          1204: 
        !          1205:     err = [deviceDescrip setMemoryRangeList:userAccessRanges num:numRanges];
        !          1206:  
        !          1207:     if(err) {
        !          1208:        IOLog("%s: setMemoryRangeList FAIL:%d for \n",[self name], err );
        !          1209: #if 1          // print ranges
        !          1210:        for( i = 0; i < numRanges; i++)
        !          1211:            IOLog(" start:%x size:%x", userAccessRanges[ i ].start, userAccessRanges[ i ].size );
        !          1212: #endif
        !          1213:     }
        !          1214: #if 1          // print ranges
        !          1215:     {
        !          1216:     int                        i, num;
        !          1217:     IORange    *       range;
        !          1218: 
        !          1219:     num = [deviceDescrip numMemoryRanges];
        !          1220:        kprintf("%s: setMemoryRangeList num:%d", [self name], num);
        !          1221:     for (i = 0; i < num; i++) {
        !          1222:        range = [deviceDescrip memoryRangeList] + i;
        !          1223:            kprintf(" start:%x size:%x", range->start, range->size);
        !          1224:        }
        !          1225:        kprintf("\n");
        !          1226:     }
        !          1227: #endif
        !          1228:     return( err);
        !          1229: }
        !          1230: 
        !          1231: - (IOReturn) addUserRanges:(IORange *)ranges num:(UInt32)num
        !          1232: {
        !          1233:     UInt32     i;
        !          1234: 
        !          1235:     for( i = 0; i < num; i++) {
        !          1236:        userAccessRanges[ i + 1 ].start = ranges[ i ].start;
        !          1237:        userAccessRanges[ i + 1 ].size = ranges[ i ].size;
        !          1238:     }
        !          1239:     numRanges = num + 1;
        !          1240:     return( noErr);
        !          1241: }
        !          1242: 
        !          1243: - (IOReturn) setupForCurrentConfig
        !          1244: {
        !          1245:     IOReturn                   err;
        !          1246:     IOFBConfiguration          config;
        !          1247:     IOFBPixelInformation       pixelInfo;
        !          1248:     IODisplayInfo      *       displayInfo;
        !          1249:     IOFBApertureInformation    apInfo;
        !          1250:     IOFBIndex                  apIndex;
        !          1251: 
        !          1252:     displayInfo = [self displayInfo];          // current mode
        !          1253: 
        !          1254:     err = [self getConfiguration:&config];
        !          1255:     if( err)
        !          1256:        kprintf("setupForCurrentConfig:getConfiguration %d\n", err);
        !          1257:     currentDisplayModeID = config.displayMode;
        !          1258:     currentDepthIndex = config.depth;
        !          1259: 
        !          1260:     err = [self getPixelInformationForDisplayMode:currentDisplayModeID andDepthIndex:currentDepthIndex
        !          1261:        pixelInfo:&pixelInfo];
        !          1262:     if( err)
        !          1263:        kprintf("setupForCurrentConfig:getPixelInformationForDisplayMode %d\n", err);
        !          1264: 
        !          1265:     [self convertPixelInfoToDisplayInfo:&pixelInfo
        !          1266:        mono:currentMono
        !          1267:        displayInfo:displayInfo];
        !          1268:     displayInfo->frameBuffer = (void *) config.mappedFramebuffer;      // for cursor rendering
        !          1269: 
        !          1270:     if( (clutValid == NO) && (pixelInfo.pixelType == kIOFBRGBCLUTPixelType)) {
        !          1271: 
        !          1272:        IOFBColorEntry  *       tempTable;
        !          1273:        int                     i;
        !          1274: 
        !          1275:        tempTable = IOMalloc( 256 * sizeof( IOFBColorEntry));
        !          1276:        if( tempTable) {
        !          1277: 
        !          1278:            for( i = 0; i < 256; i++) {
        !          1279:                 if( currentMono) {
        !          1280:                     UInt32     lum;
        !          1281: 
        !          1282:                    lum = 0x0101 * i;
        !          1283:                     tempTable[ i ].red   = lum;
        !          1284:                     tempTable[ i ].green = lum;
        !          1285:                     tempTable[ i ].blue  = lum;
        !          1286:                 } else {
        !          1287:                     tempTable[ i ].red   = (appleClut8[ i * 3 + 0 ] << 8) | appleClut8[ i * 3 + 0 ];
        !          1288:                     tempTable[ i ].green = (appleClut8[ i * 3 + 1 ] << 8) | appleClut8[ i * 3 + 1 ];
        !          1289:                     tempTable[ i ].blue  = (appleClut8[ i * 3 + 2 ] << 8) | appleClut8[ i * 3 + 2 ];
        !          1290:                }
        !          1291:            }
        !          1292:            [self setCLUT:tempTable index:0 numEntries:256
        !          1293:                    brightness:EV_SCREEN_MAX_BRIGHTNESS options:0];
        !          1294:            IOFree( tempTable, 256 * sizeof( IOFBColorEntry));
        !          1295:        }
        !          1296:     }
        !          1297:     clutValid = YES;
        !          1298: 
        !          1299:     [kmId registerDisplay:self];               // console now available
        !          1300: 
        !          1301:     kprintf( "%s: using (%dx%d@%dHz,%s)\n", [self name], displayInfo->width, displayInfo->height, 
        !          1302:                        displayInfo->refreshRate,displayInfo->pixelEncoding );
        !          1303: 
        !          1304:     // our guess:
        !          1305:     if( numRanges < 1)
        !          1306:        numRanges = 1;
        !          1307:     userAccessRanges[0].start = config.physicalFramebuffer;
        !          1308:     userAccessRanges[0].size = ActiveBytes( displayInfo);
        !          1309:     // what the driver says:
        !          1310:     apIndex = 0;
        !          1311:     while( noErr == [self getApertureInformationByIndex:apIndex++ apertureInfo:&apInfo]) {
        !          1312:        if( apInfo.type == kIOFBGraphicsMemory) {
        !          1313:            userAccessRanges[0].start = apInfo.physicalAddress;
        !          1314:            userAccessRanges[0].size = apInfo.length;
        !          1315:        }
        !          1316:     }
        !          1317:     err = [self setUserRanges];
        !          1318: 
        !          1319:     framebufferOffset = config.physicalFramebuffer - userAccessRanges[0].start;
        !          1320: 
        !          1321:     if( cursorShmemBitsPerPixel == displayInfo->bitsPerPixel)
        !          1322:        cursorBitsPerPixel = displayInfo->bitsPerPixel;
        !          1323: 
        !          1324:     return( noErr);
        !          1325: }
        !          1326: 
        !          1327: - (IOReturn)
        !          1328:     getDisplayModeTiming:(IOFBIndex)connectIndex mode:(IOFBDisplayModeID)modeID
        !          1329:                timingInfo:(IOFBTimingInformation *)info connectFlags:(UInt32 *)flags
        !          1330: 
        !          1331: {
        !          1332:     OSStatus                   err = noErr;
        !          1333: 
        !          1334:     // if smartDisplay is nil, the flags get passed through
        !          1335:     err = [smartDisplay getDisplayInfoForMode:info flags:flags];
        !          1336:     return( err );
        !          1337: }
        !          1338: 
        !          1339: //////////////////////////////////////////////////////////////////////
        !          1340: // IOCallDeviceMethods:
        !          1341: 
        !          1342: 
        !          1343: //////////////////////////////////////////////////////////////////////
        !          1344: 
        !          1345: // Description:        Get parameters for the display object. These include support
        !          1346: //             for getting the frame buffer parameters, registering it
        !          1347: //             with the event system, returning the registration token.
        !          1348: 
        !          1349: - (IOReturn)getIntValues:(unsigned *)parameterArray
        !          1350:                forParameter:(IOParameterName)parameterName
        !          1351:                count:(unsigned int *)count
        !          1352: {
        !          1353:     unsigned int fb_dimensions[STDFB_FB_DIMENSIONS_SIZE];
        !          1354:     IOReturn r;
        !          1355:     int i;
        !          1356:     unsigned *returnedCount = count;
        !          1357:     unsigned maxCount = *count;
        !          1358:         
        !          1359:     if (strcmp(parameterName, STDFB_FB_MAP) == 0) {
        !          1360:         parameterArray[0] = 0;
        !          1361: 
        !          1362: //        [self enterLinearMode];
        !          1363:        *returnedCount = 1;
        !          1364:        return IO_R_SUCCESS;
        !          1365: 
        !          1366:     } else if (strcmp(parameterName, STDFB_FB_DIMENSIONS) == 0) {
        !          1367:         IODisplayInfo *display = [self displayInfo];
        !          1368: 
        !          1369:        r = [self open];
        !          1370:        if( r)
        !          1371:            return( r);                         // this will halt WS on this display
        !          1372:        if( wsStartup)
        !          1373:             (void) [self _commitToPendingMode];
        !          1374:        [self setupForCurrentConfig];
        !          1375:        
        !          1376:        fb_dimensions[STDFB_FB_WIDTH] = display->width;
        !          1377:        fb_dimensions[STDFB_FB_HEIGHT] = display->height;
        !          1378:        fb_dimensions[STDFB_FB_ROWBYTES] = display->rowBytes;
        !          1379:        fb_dimensions[STDFB_FB_FLAGS] = display->flags;
        !          1380:        switch (display->bitsPerPixel) {
        !          1381:            case IO_2BitsPerPixel:
        !          1382:                fb_dimensions[STDFB_FB_BITS_PER_PIXEL] = 2; break;
        !          1383:            case IO_8BitsPerPixel:
        !          1384:                fb_dimensions[STDFB_FB_BITS_PER_PIXEL] = 8; break;
        !          1385:            case IO_12BitsPerPixel:
        !          1386:                fb_dimensions[STDFB_FB_BITS_PER_PIXEL] = 12; break;
        !          1387:            case IO_15BitsPerPixel:
        !          1388:                fb_dimensions[STDFB_FB_BITS_PER_PIXEL] = 15; break;
        !          1389:            case IO_24BitsPerPixel:
        !          1390:                fb_dimensions[STDFB_FB_BITS_PER_PIXEL] = 32; break;
        !          1391:            default:
        !          1392:                /* Should return an error. */
        !          1393:                break;
        !          1394:        }
        !          1395: 
        !          1396:        *returnedCount = 0;
        !          1397:        for( i=0; i<STDFB_FB_DIMENSIONS_SIZE; i++) {
        !          1398:            if (*returnedCount == maxCount)
        !          1399:                break;
        !          1400:            parameterArray[i] = fb_dimensions[i];
        !          1401:            (*returnedCount)++;
        !          1402:        }
        !          1403:        return IO_R_SUCCESS;
        !          1404: 
        !          1405:     } else if (strcmp(parameterName, STDFB_FB_REGISTER) == 0) {
        !          1406:        r = [self _registerWithED];
        !          1407:        *returnedCount = 0;
        !          1408:        if (maxCount > 0) {
        !          1409:            *returnedCount = 1;
        !          1410:            parameterArray[0] = [self token];
        !          1411:        }
        !          1412:        return r;
        !          1413: 
        !          1414:     } else if (strcmp(parameterName, IO_GET_DISPLAY_INFO) == 0) {
        !          1415:        const IODisplayInfo *displayInfo;
        !          1416:        if ((*count != 5) && (*count != 7))
        !          1417:            return IO_R_INVALID_ARG;
        !          1418:        displayInfo = [self displayInfo];
        !          1419:        parameterArray[0] = displayInfo->width;
        !          1420:        parameterArray[1] = displayInfo->height;
        !          1421:        parameterArray[2] = displayInfo->refreshRate;
        !          1422:        parameterArray[3] = (unsigned)displayInfo->bitsPerPixel;
        !          1423:        parameterArray[4] = (unsigned)displayInfo->colorSpace;
        !          1424:        if (*count == 7)        {
        !          1425:            parameterArray[5] = displayInfo->totalWidth;
        !          1426:            parameterArray[6] = displayInfo->rowBytes;
        !          1427:        }
        !          1428:        return IO_R_SUCCESS;
        !          1429: 
        !          1430:     } else if (strcmp(parameterName, IO_GET_DISPLAY_MODE_NUM) == 0)    {
        !          1431:        if (*count != 1)
        !          1432:            return IO_R_INVALID_ARG;
        !          1433:        parameterArray[0] = numConfigs;
        !          1434:        return IO_R_SUCCESS;
        !          1435:  
        !          1436:    } else if (strncmp(parameterName, IO_GET_DISPLAY_MODE_INFO,
        !          1437:                sizeof(IO_GET_DISPLAY_MODE_INFO)-1) == 0)       {
        !          1438:        IODisplayInfo theDisplayInfo;
        !          1439:        IODisplayInfo *displayInfo = &theDisplayInfo;
        !          1440:        const char *s;
        !          1441:        int mode;
        !          1442:        UInt32  flags;
        !          1443:        
        !          1444:        if (*count != 14)       {
        !          1445:            return IO_R_INVALID_ARG;
        !          1446:        }
        !          1447:        s = find_parameter(IO_GET_DISPLAY_MODE_INFO, parameterName);
        !          1448:        if (s == 0)     {
        !          1449:            return IO_R_INVALID_ARG;
        !          1450:        }
        !          1451:        mode = strtol(s, 0, 10);
        !          1452: 
        !          1453:         r = [self getDisplayInfoForConfigIndex:mode info:displayInfo
        !          1454:                         connectFlags:&flags];
        !          1455:        if( r)
        !          1456:            return( r);
        !          1457: 
        !          1458:        parameterArray[0] = displayInfo->width;
        !          1459:        parameterArray[1] = displayInfo->height;
        !          1460:        parameterArray[2] = displayInfo->refreshRate;
        !          1461:        parameterArray[3] = (unsigned)displayInfo->bitsPerPixel;
        !          1462:        parameterArray[4] = (unsigned)displayInfo->colorSpace;
        !          1463:        parameterArray[5] = displayInfo->totalWidth;
        !          1464:        parameterArray[6] = displayInfo->rowBytes;
        !          1465:        
        !          1466:        parameterArray[7] = displayInfo->memorySize;
        !          1467:        parameterArray[8] = displayInfo->scanRate;
        !          1468:         parameterArray[9] = ((flags & kDisplayModeSafeFlag) ? IO_DISPLAY_MODE_SAFE : 0)
        !          1469:                         |  ((flags & kDisplayModeDefaultFlag) ? IO_DISPLAY_MODE_DEFAULT : 0);
        !          1470:        parameterArray[10] = displayInfo->dotClockRate;
        !          1471:        parameterArray[11] = displayInfo->screenWidth;
        !          1472:        parameterArray[12] = displayInfo->screenHeight;
        !          1473:        parameterArray[13] = displayInfo->modeUnavailableFlag;
        !          1474:        return IO_R_SUCCESS;
        !          1475: 
        !          1476:     } else if (strcmp(parameterName, IO_GET_DISPLAY_MEMORY) == 0)      {
        !          1477:        if (*count != 1)
        !          1478:            return IO_R_INVALID_ARG;
        !          1479:        parameterArray[0] = 0;
        !          1480:        return IO_R_SUCCESS;
        !          1481: 
        !          1482:     } else if (strcmp(parameterName, IO_GET_RAMDAC_SPEED) == 0)        {
        !          1483:        if (*count != 1)
        !          1484:            return IO_R_INVALID_ARG;
        !          1485:        parameterArray[0] = 0;
        !          1486:        return IO_R_SUCCESS;
        !          1487: 
        !          1488:     } else if (strcmp(parameterName, IO_GET_CURRENT_DISPLAY_MODE) == 0)        {
        !          1489:        if (*count != 1)
        !          1490:            return IO_R_INVALID_ARG;
        !          1491:        return( [self getCurrentConfigIndex:(UInt32 *)parameterArray]);
        !          1492: 
        !          1493:     } else if (strcmp(parameterName, IO_GET_PENDING_DISPLAY_MODE) == 0)        {
        !          1494:        if (*count != 1)
        !          1495:            return IO_R_INVALID_ARG;
        !          1496:        if (_pendingDisplayMode >= 0)   {
        !          1497:            parameterArray[0] = _pendingDisplayMode;
        !          1498:            return IO_R_SUCCESS;
        !          1499:        } else {
        !          1500:            return IO_R_UNDEFINED_MODE;
        !          1501:        }
        !          1502: 
        !          1503:     } else if (strcmp(parameterName, "IOGetFramebufferOffset") == 0) {
        !          1504: 
        !          1505:        if( *count != 1)
        !          1506:            return IO_R_INVALID_ARG;
        !          1507:        parameterArray[0] = framebufferOffset;
        !          1508:        return IO_R_SUCCESS;
        !          1509: 
        !          1510:     } else if (strncmp(parameterName, IO_SET_PENDING_DISPLAY_MODE,
        !          1511:                sizeof(IO_SET_PENDING_DISPLAY_MODE) - 1 ) == 0) {
        !          1512:        const char *s;
        !          1513:        int mode;
        !          1514:        
        !          1515:        if (*count != 0) {
        !          1516:            return IO_R_INVALID_ARG;
        !          1517:        }
        !          1518:        s = find_parameter(IO_SET_PENDING_DISPLAY_MODE, parameterName);
        !          1519:        if (s == 0)     {
        !          1520:            return IO_R_INVALID_ARG;
        !          1521:        }
        !          1522:        mode = strtol(s, 0, 10);
        !          1523: 
        !          1524:        if ([self setPendingDisplayMode:mode] == YES) {
        !          1525:            return IO_R_SUCCESS;
        !          1526:        } else {
        !          1527:            return IO_R_FAILED_TO_SET_MODE;
        !          1528:        }
        !          1529: 
        !          1530:     } else {
        !          1531:        return [super getIntValues:parameterArray
        !          1532:            forParameter:parameterName
        !          1533:            count:count];
        !          1534:     }
        !          1535: }
        !          1536: 
        !          1537: 
        !          1538: /* Set parameters for the display object. This can be used to unregister the
        !          1539:  * frame buffer as well as to set the transfer function.
        !          1540:  */
        !          1541: - (IOReturn)setIntValues:(unsigned *)parameterArray
        !          1542:                forParameter:(IOParameterName)parameterName
        !          1543:                count:(unsigned int)count
        !          1544: {
        !          1545:     int i;
        !          1546: 
        !          1547:     if (strcmp(parameterName, STDFB_FB_UNMAP) == 0) {
        !          1548:        //[self unMapFrameBuffer];
        !          1549:        return IO_R_SUCCESS;
        !          1550: 
        !          1551:     } else if (strcmp(parameterName, STDFB_FB_UNREGISTER) == 0) {
        !          1552:        if (count != 1)
        !          1553:            return IO_R_INVALID_ARG;
        !          1554:        [[EventDriver instance] unregisterScreen:parameterArray[0]];
        !          1555:        return IO_R_SUCCESS;
        !          1556: 
        !          1557:     } else if (strcmp(parameterName, IO_SET_TRANSFER_TABLE) == 0) {
        !          1558:        switch ([self displayInfo]->bitsPerPixel) {
        !          1559:        case IO_2BitsPerPixel:
        !          1560:            if (count != IO_2BPP_TRANSFER_TABLE_SIZE)
        !          1561:                return IO_R_INVALID_ARG;
        !          1562:            break;
        !          1563:        case IO_8BitsPerPixel:
        !          1564:            if (count != IO_8BPP_TRANSFER_TABLE_SIZE)
        !          1565:                return IO_R_INVALID_ARG;
        !          1566:            break;
        !          1567:        case IO_12BitsPerPixel:
        !          1568:            if (count != IO_12BPP_TRANSFER_TABLE_SIZE)
        !          1569:                return IO_R_INVALID_ARG;
        !          1570:            break;
        !          1571:        case IO_15BitsPerPixel:
        !          1572:            if (count != IO_15BPP_TRANSFER_TABLE_SIZE)
        !          1573:                return IO_R_INVALID_ARG;
        !          1574:            break;
        !          1575:        case IO_24BitsPerPixel:
        !          1576:            if (count != IO_24BPP_TRANSFER_TABLE_SIZE)
        !          1577:                return IO_R_INVALID_ARG;
        !          1578:            break;
        !          1579:        default:
        !          1580:            return IO_R_INVALID_ARG;
        !          1581:        }
        !          1582:        [self setTransferTable:parameterArray count:count];
        !          1583:        return IO_R_SUCCESS;
        !          1584: 
        !          1585:     } else if (strcmp(parameterName, STDFB_BM256_TO_BM38_MAP) == 0) {
        !          1586:        if (count != STDFB_BM256_TO_BM38_MAP_SIZE)
        !          1587:            return IO_R_INVALID_ARG;
        !          1588:        if (_bm256To38SampleTable == NULL)
        !          1589:            _bm256To38SampleTable = (unsigned int *)
        !          1590:                        IOMalloc(STDFB_BM256_TO_BM38_MAP_SIZE * sizeof(int));
        !          1591:        for (i = 0; i < count; i++)
        !          1592:            _bm256To38SampleTable[i] = parameterArray[i];
        !          1593:        return IO_R_SUCCESS;
        !          1594: 
        !          1595:     } else if (strcmp(parameterName, STDFB_BM38_TO_BM256_MAP) == 0) {
        !          1596: 
        !          1597:        if ((count != STDFB_BM38_TO_BM256_MAP_SIZE)
        !          1598:        && (count != STDFB_BM38_TO_256_WITH_LOGICAL_SIZE))
        !          1599:            return IO_R_INVALID_ARG;
        !          1600:        if (_bm38To256SampleTable == NULL) {
        !          1601:            _bm38To256SampleTable = (unsigned char *)
        !          1602:                        IOMalloc(STDFB_BM38_TO_256_WITH_LOGICAL_SIZE * sizeof(int));
        !          1603:         }
        !          1604:        if( count != STDFB_BM38_TO_256_WITH_LOGICAL_SIZE)
        !          1605:            for (i = 0; i < 256; i++)
        !          1606:                _bm38To256SampleTable[ 1024 + i ] = i;
        !          1607:        for (i = 0; i < count; i++)
        !          1608:            *(((unsigned int *)_bm38To256SampleTable) + i) = parameterArray[i];
        !          1609:        return IO_R_SUCCESS;
        !          1610: 
        !          1611:     } else if (strcmp(parameterName, IO_SET_PENDING_DISPLAY_MODE) == 0) {
        !          1612:        if (count != 1)
        !          1613:            return IO_R_INVALID_ARG;
        !          1614:        if ([self setPendingDisplayMode:parameterArray[0]] == YES) {
        !          1615:            return IO_R_SUCCESS;
        !          1616:        } else {
        !          1617:            return IO_R_FAILED_TO_SET_MODE;
        !          1618:        }
        !          1619:     } else {
        !          1620:        return [super setIntValues:parameterArray forParameter:parameterName
        !          1621:            count:count];
        !          1622:     }
        !          1623: }
        !          1624: 
        !          1625: 
        !          1626: /* Get parameters for the display object.
        !          1627:  */
        !          1628: - (IOReturn)getCharValues:(unsigned char *)parameterArray
        !          1629:        forParameter:(IOParameterName)parameterName
        !          1630:        count:(unsigned *)count
        !          1631: {    
        !          1632:     if (strcmp(parameterName, STDFB_FB_PIXEL_ENCODING) == 0) {
        !          1633:        if (*count != STDFB_FB_PIXEL_ENCODING_SIZE)
        !          1634:            return IO_R_INVALID_ARG;
        !          1635: 
        !          1636:        /* Copy the format string out of the display structure */
        !          1637:        strncpy(parameterArray, [self displayInfo]->pixelEncoding,
        !          1638:                STDFB_FB_PIXEL_ENCODING_SIZE);
        !          1639:        return IO_R_SUCCESS;
        !          1640: 
        !          1641: 
        !          1642:     } else if (strcmp(parameterName, "PostScript Driver") == 0) {
        !          1643:        wsStartup = YES;
        !          1644:         return IO_R_UNSUPPORTED;
        !          1645: 
        !          1646: #if 0
        !          1647:     } else if (strcmp(parameterName, "PostScript Driver") == 0) {
        !          1648: 
        !          1649:        if (*count != sizeof(IOString))
        !          1650:            return IO_R_INVALID_ARG;
        !          1651: 
        !          1652:        strcpy(parameterArray, "NDRV_psdrvr");
        !          1653:        return IO_R_SUCCESS;
        !          1654: 
        !          1655:     } else if (strcmp(parameterName, "Server Name") == 0) {
        !          1656: 
        !          1657:        strcpy(parameterArray, "IONDRVFramebuffer");
        !          1658:        return IO_R_SUCCESS;
        !          1659: #endif
        !          1660: 
        !          1661:     } else {
        !          1662:        return [super getCharValues:parameterArray
        !          1663:            forParameter:parameterName
        !          1664:            count:count];
        !          1665:     }
        !          1666: }
        !          1667: 
        !          1668: // Description:        Set parameters for the display object. This can be used
        !          1669: //             to set the mapping tables used for conversion between
        !          1670: //             4 BPS and 5 BPS data in 5-5-5 frame buffer support,
        !          1671: //             and bm256 <--> bm38 conversion tables as well.
        !          1672: //
        !          1673: - (IOReturn)setCharValues:(unsigned char *)parameterArray
        !          1674:                forParameter:(IOParameterName)parameterName
        !          1675:                count:(unsigned int)count
        !          1676: {
        !          1677:     int i;
        !          1678: 
        !          1679:     if (strcmp(parameterName, STDFB_4BPS_TO_5BPS_MAP) == 0) {
        !          1680:        if (count != STDFB_4BPS_TO_5BPS_MAP_SIZE)
        !          1681:            return IO_R_INVALID_ARG;
        !          1682:        if (_bm34To35SampleTable == NULL)
        !          1683:            _bm34To35SampleTable = IOMalloc(STDFB_4BPS_TO_5BPS_MAP_SIZE);
        !          1684:        for (i = 0; i < count; i++)
        !          1685:            _bm34To35SampleTable[i] = parameterArray[i];
        !          1686:        return IO_R_SUCCESS;
        !          1687: 
        !          1688:     } else if (strcmp(parameterName, STDFB_5BPS_TO_4BPS_MAP) == 0) {
        !          1689:        if (count != STDFB_5BPS_TO_4BPS_MAP_SIZE)
        !          1690:            return IO_R_INVALID_ARG;
        !          1691:        if (_bm35To34SampleTable == NULL)
        !          1692:            _bm35To34SampleTable = IOMalloc(STDFB_5BPS_TO_4BPS_MAP_SIZE);
        !          1693:        for (i = 0; i < count; i++)
        !          1694:            _bm35To34SampleTable[i] = parameterArray[i];
        !          1695:        return IO_R_SUCCESS;
        !          1696:     } else if (strcmp(parameterName, IO_COMMIT_TO_PENDING_DISPLAY_MODE) == 0) {
        !          1697:        if ( [self _commitToPendingMode]) {
        !          1698:            return IO_R_SUCCESS;
        !          1699:        } else {
        !          1700:            return IO_R_UNSUPPORTED;
        !          1701:        }
        !          1702:     } else {
        !          1703:        return [super setCharValues:parameterArray
        !          1704:            forParameter:parameterName
        !          1705:            count:count];
        !          1706:     }
        !          1707: }
        !          1708: 
        !          1709: 
        !          1710: - (BOOL)setPendingDisplayMode:(int)configIndex
        !          1711: {
        !          1712:     IOReturn           err;
        !          1713: 
        !          1714:     err = [self getDisplayModeAndDepthForIndex:configIndex
        !          1715:                mode:&pendingDisplayModeID depth:&pendingDepthIndex mono:&pendingMono];
        !          1716:     if( err == noErr) {
        !          1717:        wsStartup = NO;
        !          1718:        _pendingDisplayMode = configIndex;
        !          1719:        [self setStartupMode:pendingDisplayModeID depth:pendingDepthIndex];
        !          1720:     }
        !          1721:     return( err == noErr);
        !          1722: }
        !          1723: 
        !          1724: - (int)pendingDisplayMode
        !          1725: {
        !          1726:     return _pendingDisplayMode;
        !          1727: }
        !          1728: 
        !          1729: - setTransferTable:(const unsigned int *)table count:(int)count
        !          1730: {
        !          1731:     return self;
        !          1732: }
        !          1733: 
        !          1734: - (UInt32) tempFlags
        !          1735: {
        !          1736:     return( 0);
        !          1737: }
        !          1738: 
        !          1739: - (BOOL)_commitToPendingMode
        !          1740: {
        !          1741: 
        !          1742:     if( _pendingDisplayMode < 0)
        !          1743:        return( NO);
        !          1744: 
        !          1745:     [kmId unregisterDisplay:self];             // tell kmDevice this device is unavail
        !          1746:     cursorBitsPerPixel = (-1);
        !          1747:     currentMono = pendingMono;
        !          1748:     [self setDisplayMode:pendingDisplayModeID depth:pendingDepthIndex page:0];
        !          1749:     _pendingDisplayMode = -1;  /* mode switch is complete */
        !          1750:     [self setupForCurrentConfig];
        !          1751: 
        !          1752:     return( YES);
        !          1753: }
        !          1754: 
        !          1755: + initialize
        !          1756: {
        !          1757:     gSmartDisplayClass = objc_lookUpClass("IOSmartDisplay");
        !          1758:     return( self);
        !          1759: }
        !          1760: 
        !          1761: //////////////////////////////////////////////////////////////////////////////////////////////////////
        !          1762: // IOCallDeviceMethods:
        !          1763: 
        !          1764: // these should be somewhere else, IODevice or something:
        !          1765: 
        !          1766: - (IOReturn) IOGetApertures:(IOApertureInfo *)outputParams size:(unsigned *) outputCount
        !          1767: {
        !          1768:     IOReturn   err = noErr;
        !          1769:     UInt32     items;
        !          1770: 
        !          1771:     items = (*outputCount) / sizeof( IOApertureInfo);
        !          1772:     err = [[self deviceDescription]
        !          1773:        getApertures:outputParams items:&items];
        !          1774:     *outputCount = items * sizeof( IOApertureInfo);
        !          1775: 
        !          1776:     return( err);
        !          1777: }
        !          1778: 
        !          1779: 
        !          1780: - (IOReturn) IOGetDeviceName:(char *)outputParams size:(unsigned *) outputCount
        !          1781: {
        !          1782:     IOReturn   err = noErr;
        !          1783:     char *     name;
        !          1784:     UInt32     len, plen;
        !          1785: 
        !          1786:     name = [[self deviceDescription] nodeName];
        !          1787:     plen = strlen( name);
        !          1788:     len = *outputCount - 1;
        !          1789:     *outputCount = plen + 1;
        !          1790:     if( plen < len)
        !          1791:        len = plen;
        !          1792:     strncpy( outputParams, name, len);
        !          1793:     outputParams[ len ] = 0;
        !          1794: 
        !          1795:     return( err);
        !          1796: }
        !          1797: 
        !          1798: // really IOFramebuffer:
        !          1799: 
        !          1800: - (IOReturn) IOFBSetUserRange:(IORange *)inputParams size:(unsigned) inputCount
        !          1801: {
        !          1802:     IOReturn   err = noErr;
        !          1803:     UInt32     items;
        !          1804: 
        !          1805:     items = inputCount / sizeof( IORange);
        !          1806:     err = [self addUserRanges:(IORange *)inputParams num:items];
        !          1807:     if( err == noErr)
        !          1808:        err = [self setUserRanges];
        !          1809: 
        !          1810:     return( err);
        !          1811: 
        !          1812: }
        !          1813: 
        !          1814: - property_IODeviceClass:(char *)classes length:(unsigned int *)maxLen
        !          1815: {
        !          1816:     strcpy( classes, IOClassFramebuffer);
        !          1817:     return( self);
        !          1818: }
        !          1819: 
        !          1820: //////////////////////////////////////////////////////////////////////////////////////////////////////
        !          1821: 
        !          1822: - (IOReturn)
        !          1823:     getDisplayModeByIndex:(IOFBIndex)modeIndex displayMode:(IOFBDisplayModeID *)displayModeID  {}
        !          1824: 
        !          1825: - (IOReturn)
        !          1826:     getDisplayModeInformation:(IOFBDisplayModeID)modeID info:(IOFBDisplayModeInformation *)info  {}
        !          1827: 
        !          1828: - (IOReturn)
        !          1829:     getPixelInformationForDisplayMode:(IOFBDisplayModeID)mode andDepthIndex:(IOFBIndex)depthIndex
        !          1830:         pixelInfo:(IOFBPixelInformation *)info  {}
        !          1831: 
        !          1832: - (IOReturn)
        !          1833:     setDisplayMode:(IOFBDisplayModeID)modeID depth:(IOFBIndex)depthIndex page:(IOFBIndex)pageIndex  {}
        !          1834: - (IOReturn)
        !          1835:     setStartupMode:(IOFBDisplayModeID)modeID depth:(IOFBIndex)depthIndex  {}
        !          1836: - (IOReturn)
        !          1837:     getStartupMode:(IOFBDisplayModeID *)modeID depth:(IOFBIndex *)depthIndex  {}
        !          1838: 
        !          1839: - (IOReturn)
        !          1840:     getConfiguration:(IOFBConfiguration *)config   {}
        !          1841: 
        !          1842: - (IOReturn)
        !          1843:     getAttributeForMode:(IOFBDisplayModeID) modeID andDepth:(IOFBIndex)depthIndex
        !          1844:                                attribute:(IOFBSelect)attr value:(UInt32 *)value  {}
        !          1845: 
        !          1846: - (IOReturn)
        !          1847:     getApertureInformationByIndex:(IOFBIndex)apertureIndex
        !          1848:                         apertureInfo:(IOFBApertureInformation *)apertureInfo
        !          1849: {
        !          1850:     return( IO_R_UNSUPPORTED);
        !          1851: }
        !          1852: 
        !          1853: - (IOReturn)
        !          1854:     setCLUT:(IOFBColorEntry *) colors index:(UInt32)index numEntries:(UInt32)numEntries 
        !          1855:        brightness:(IOFixed)brightness options:(IOOptionBits)options  {}
        !          1856: 
        !          1857: //// Gammas
        !          1858: 
        !          1859: - (IOReturn)
        !          1860:     setGammaTable:(UInt32) channelCount dataCount:(UInt32)dataCount dataWidth:(UInt32)dataWidth
        !          1861:        data:(void *)data  {}
        !          1862: 
        !          1863: 
        !          1864: + (IOReturn)
        !          1865:     convertCursorImage:(void *)cursorImage hwDescription:(HardwareCursorDescriptorRec *)hwDescrip
        !          1866:                        cursorResult:(HardwareCursorInfoRec *)cursorResult  {}
        !          1867: 
        !          1868: 
        !          1869: - (IOReturn)
        !          1870:     setCursorImage:(void *)cursorImage  {}
        !          1871: - (IOReturn)
        !          1872:     setCursorState:(SInt32)x y:(SInt32)y visible:(Boolean)visible  {}
        !          1873: 
        !          1874: - (IOReturn)
        !          1875:     registerForInterruptType:(IOFBSelect)interruptType proc:(IOFBInterruptProc)proc refcon:(UInt32)refcon  {}
        !          1876: 
        !          1877: - (IOReturn)
        !          1878:     setInterruptState:(IOFBSelect)interruptType state:(UInt32)state  {}
        !          1879: 
        !          1880: - (IOReturn)
        !          1881:     setAttribute:(IOFBSelect)attribute value:(UInt32)value  {}
        !          1882: 
        !          1883: - (IOReturn)
        !          1884:     getAttribute:(IOFBSelect)attribute value:(UInt32 *)value  {}
        !          1885: 
        !          1886: - (IOReturn)
        !          1887:     privateCall:(IOFBSelect)callClass select:(IOFBSelect)select
        !          1888:                paramSize:(UInt32)paramSize params:(void *)params
        !          1889:                resultSize:(UInt32 *)resultSize results:(void *)results  {}
        !          1890: 
        !          1891: - (IOReturn)
        !          1892:     getConnections:(IOFBIndex)connectIndex 
        !          1893:                 connectInfo:(IOFBConnectionInfo *)info  {}
        !          1894: 
        !          1895: - (IOReturn)
        !          1896:     setConnectionAttribute:(IOFBIndex)connectIndex attribute:(IOFBSelect)attribute value:(UInt32)value  {}
        !          1897: 
        !          1898: - (IOReturn)
        !          1899:     getConnectionAttribute:(IOFBIndex)connectIndex attribute:(IOFBSelect)attribute value:(UInt32 *)value  {}
        !          1900: 
        !          1901: 
        !          1902: @end
        !          1903: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.