Annotation of Examples/DriverKit/TsengLabsET4000/TsengLabsET4000_reloc.tproj/TsengLabsET4000.m, revision 1.1

1.1     ! root        1: /*     Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved. 
        !             2:  *
        !             3:  *  TsengLabsET4000.m
        !             4:  *
        !             5:  */
        !             6: 
        !             7: 
        !             8: #import <driverkit/i386/IOEISADeviceDescription.h>
        !             9: #import "TsengLabsET4000.h"
        !            10: #import <kernserv/kern_server_types.h>
        !            11: #import <driverkit/i386/displayRegisters.h>
        !            12: #import <stdio.h>
        !            13: #import <string.h>
        !            14: 
        !            15: #define        MIN(a,b) (((a)<(b))?(a):(b))
        !            16: 
        !            17: 
        !            18: //
        !            19: // typedef used to store arrays of register index and values.
        !            20: // -1 as index indicates end of the set...
        !            21: //
        !            22: typedef struct _SVGAIndexValuePair {
        !            23:     signed short index;
        !            24:     unsigned char value;
        !            25: } SVGAIndexValuePair;
        !            26: 
        !            27: 
        !            28: //
        !            29: // typedef defining a given graphics mode.  A graphics mode
        !            30: // consists of all the register/value pairs that, when set,
        !            31: // completely define a mode of operation.
        !            32: //
        !            33: typedef struct _TsengLabsET4000Mode {
        !            34:     const char *name;                  /* human-readable mode name */
        !            35:     const SVGAIndexValuePair *generalRegisters;
        !            36:     const SVGAIndexValuePair *sequencerRegisters;
        !            37:     const SVGAIndexValuePair *crtControllerRegisters;
        !            38:     const SVGAIndexValuePair *graphicsControllerRegisters;
        !            39:     const SVGAIndexValuePair *attributeControllerRegisters;
        !            40: } TsengLabsET4000Mode;
        !            41: 
        !            42: 
        !            43: /***************************************
        !            44:  * TsengLabsET4000_1024x768x2x60hz mode
        !            45:  ***************************************/
        !            46: 
        !            47: static const SVGAIndexValuePair
        !            48: TsengLabsET4000_1024x768x2x60hz_generalRegisters[] = {
        !            49:     {0, 0x3F},
        !            50:     {-1, 0}
        !            51: };
        !            52: 
        !            53: static const SVGAIndexValuePair
        !            54: TsengLabsET4000_1024x768x2x60hz_sequencerRegisters[] = {
        !            55:     {0, 0x03}, {1, 0x01}, {2, 0x0F}, {3, 0x00}, {4, 0x06},
        !            56:     {6, 0x00}, {7, 0xBC},
        !            57:     {-1, 0}
        !            58: };
        !            59: 
        !            60: static const SVGAIndexValuePair
        !            61: TsengLabsET4000_1024x768x2x60hz_crtControllerRegisters[] = {
        !            62:     {0x11,0x00},       // Turn off lock allowing changing 0..7
        !            63:     {0x00,0xA1}, {0x01,0x7F}, {0x02,0x80}, {0x03,0x04}, {0x04,0x88},
        !            64:     {0x05,0x9E}, {0x06,0x26}, {0x07,0xFD}, {0x08,0x00}, {0x09,0x60},
        !            65:     {0x0A,0x00}, {0x0B,0x00}, {0x0C,0x00}, {0x0D,0x00}, {0x0E,0x00},
        !            66:     {0x0F,0x00}, {0x10,0x08}, {0x11,0x8A}, {0x12,0xFF}, {0x13,0x40},
        !            67:     {0x14,0x00}, {0x15,0x04}, {0x16,0x22}, {0x17,0xC3}, {0x18,0xFF},
        !            68:     {0x33,0x00}, {0x35,0x00},
        !            69:     {-1, 0}
        !            70: };
        !            71: 
        !            72: static const SVGAIndexValuePair
        !            73: TsengLabsET4000_1024x768x2x60hz_graphicsControllerRegisters[] = {
        !            74:     {0x00,0x00}, {0x01,0x00}, {0x02,0x00}, {0x03,0x00}, {0x04,0x00},
        !            75:     {0x05,0x00}, {0x06,0x05}, {0x07,0x0F}, {0x08,0xFF},
        !            76:     {-1, 0}
        !            77: };
        !            78: 
        !            79: static const SVGAIndexValuePair
        !            80: TsengLabsET4000_1024x768x2x60hz_attributeControllerRegisters[] = {
        !            81:     {0x00,0x00}, {0x01,0x01}, {0x02,0x02}, {0x03,0x03}, {0x04,0x04},
        !            82:     {0x05,0x05}, {0x06,0x14}, {0x07,0x07}, {0x08,0x38}, {0x09,0x39},
        !            83:     {0x0A,0x3A}, {0x0B,0x3B}, {0x0C,0x3C}, {0x0D,0x3D}, {0x0E,0x3E},
        !            84:     {0x0F,0x3F}, {0x10,0x01}, {0x11,0x00}, {0x12,0x0F}, {0x13,0x00},
        !            85:     {0x14,0x00}, {0x16,0x00},
        !            86:     {-1, 0}
        !            87: };
        !            88: 
        !            89: 
        !            90: static const TsengLabsET4000Mode
        !            91: TsengLabsET4000_1024x768x2x60hz = {
        !            92:     "1024x768x2x60hz",
        !            93:     TsengLabsET4000_1024x768x2x60hz_generalRegisters,
        !            94:     TsengLabsET4000_1024x768x2x60hz_sequencerRegisters,
        !            95:     TsengLabsET4000_1024x768x2x60hz_crtControllerRegisters,
        !            96:     TsengLabsET4000_1024x768x2x60hz_graphicsControllerRegisters,
        !            97:     TsengLabsET4000_1024x768x2x60hz_attributeControllerRegisters
        !            98: };
        !            99: 
        !           100: 
        !           101: #if 0 /* TsengLabsET4000_800x600x2x60hz mode doesn't quite work */
        !           102: /**************************************
        !           103:  * TsengLabsET4000_800x600x2x60hz mode
        !           104:  **************************************/
        !           105: 
        !           106: static const SVGAIndexValuePair
        !           107: TsengLabsET4000_800x600x2x60hz_generalRegisters[] = {
        !           108:     {0, 0xEF},
        !           109:     {-1, 0}
        !           110: };
        !           111:     
        !           112: static const SVGAIndexValuePair
        !           113: TsengLabsET4000_800x600x2x60hz_sequencerRegisters[] = {
        !           114:     {0, 0x03}, {1, 0x01}, {2, 0x0F}, {3, 0x00}, {4, 0x06},
        !           115:     {6, 0x00}, {7, 0xBC},
        !           116:     {-1, 0}
        !           117: };
        !           118:     
        !           119: static const SVGAIndexValuePair
        !           120: TsengLabsET4000_800x600x2x60hz_crtControllerRegisters[] = {
        !           121:     {0x11,0x00},       // Turn off lock allowing changing 0..7
        !           122:     {0x00,0x7F}, {0x01,0x63}, {0x02,0x64}, {0x03,0x02}, {0x04,0x64},
        !           123:     {0x05,0x17}, {0x06,0x77}, {0x07,0xF0}, {0x08,0x00}, {0x09,0x60},
        !           124:     {0x0A,0x00}, {0x0B,0x00}, {0x0C,0x00}, {0x0D,0x00}, {0x0E,0x00},
        !           125:     {0x0F,0x00}, {0x10,0x60}, {0x11,0x82}, {0x12,0x57}, {0x13,0x32},
        !           126:     {0x14,0x00}, {0x15,0x5B}, {0x16,0x75}, {0x17,0xC3}, {0x18,0xFF},
        !           127:     {0x33,0x00}, {0x35,0x00},
        !           128:     {-1, 0}
        !           129: };
        !           130:     
        !           131: static const SVGAIndexValuePair
        !           132: TsengLabsET4000_800x600x2x60hz_graphicsControllerRegisters[] = {
        !           133:     {0x00,0x00}, {0x01,0x00}, {0x02,0x00}, {0x03,0x00}, {0x04,0x00},
        !           134:     {0x05,0x00}, {0x06,0x05}, {0x07,0x0F}, {0x08,0xFF},
        !           135:     {-1, 0}
        !           136: };
        !           137:     
        !           138: static const SVGAIndexValuePair
        !           139: TsengLabsET4000_800x600x2x60hz_attributeControllerRegisters[] = {
        !           140:     {0x00,0x00}, {0x01,0x01}, {0x02,0x02}, {0x03,0x03}, {0x04,0x04},
        !           141:     {0x05,0x05}, {0x06,0x14}, {0x07,0x07}, {0x08,0x38}, {0x09,0x39},
        !           142:     {0x0A,0x3A}, {0x0B,0x3B}, {0x0C,0x3C}, {0x0D,0x3D}, {0x0E,0x3E},
        !           143:     {0x0F,0x3F}, {0x10,0x01}, {0x11,0x00}, {0x12,0x0F}, {0x13,0x00},
        !           144:     {0x14,0x00}, {0x16,0x00},
        !           145:     {-1, 0}
        !           146: };
        !           147:     
        !           148: 
        !           149: static const TsengLabsET4000Mode
        !           150: TsengLabsET4000_800x600x2x60hz = {
        !           151:     "800x600x2x60hz",
        !           152:     TsengLabsET4000_800x600x2x60hz_generalRegisters,
        !           153:     TsengLabsET4000_800x600x2x60hz_sequencerRegisters,
        !           154:     TsengLabsET4000_800x600x2x60hz_crtControllerRegisters,
        !           155:     TsengLabsET4000_800x600x2x60hz_graphicsControllerRegisters,
        !           156:     TsengLabsET4000_800x600x2x60hz_attributeControllerRegisters
        !           157: };
        !           158: #endif /* TsengLabsET4000_800x600x2x60hz mode doesn't quite work */
        !           159: 
        !           160: 
        !           161: /**************************************
        !           162:  * TsengLabsET4000_640x480_VGA mode
        !           163:  **************************************/
        !           164: 
        !           165: static const SVGAIndexValuePair
        !           166: TsengLabsET4000_640x480_VGA_generalRegisters[] = {
        !           167:     {0, 0xE3},
        !           168:     {-1, 0}
        !           169: };
        !           170:     
        !           171: static const SVGAIndexValuePair
        !           172: TsengLabsET4000_640x480_VGA_sequencerRegisters[] = {
        !           173:     {0, 0x03}, {1, 0x01}, {2, 0x0F}, {3, 0x00}, {4, 0x06},
        !           174:     {6, 0x00}, {7, 0xFC},
        !           175:     {-1, 0}
        !           176: };
        !           177:     
        !           178: static const SVGAIndexValuePair
        !           179: TsengLabsET4000_640x480_VGA_crtControllerRegisters[] = {
        !           180:     {0x11,0x00},       // Turn off lock allowing changing 0..7, 35
        !           181:     {0x35,0x00},
        !           182:     {0x00,0x5F}, {0x01,0x4F}, {0x02,0x50}, {0x03,0x82}, {0x04,0x54},
        !           183:     {0x05,0x80}, {0x06,0x0B}, {0x07,0x3E}, {0x08,0x00}, {0x09,0x40},
        !           184:     {0x0A,0x00}, {0x0B,0x00}, {0x0C,0x00}, {0x0D,0x00}, {0x0E,0x00},
        !           185:     {0x0F,0x00}, {0x10,0xEA}, {0x11,0x8C}, {0x12,0xDF}, {0x13,0x28},
        !           186:     {0x14,0x00}, {0x15,0xE7}, {0x16,0x04}, {0x17,0xE3}, {0x18,0xFF},
        !           187:     {0x33,0x00},
        !           188:     {-1, 0}
        !           189: };
        !           190:     
        !           191: static const SVGAIndexValuePair
        !           192: TsengLabsET4000_640x480_VGA_graphicsControllerRegisters[] = {
        !           193:     {0x00,0x00}, {0x01,0x00}, {0x02,0x00}, {0x03,0x00}, {0x04,0x00},
        !           194:     {0x05,0x00}, {0x06,0x05}, {0x07,0x0F}, {0x08,0xFF},
        !           195:     {-1, 0}
        !           196: };
        !           197:     
        !           198: static const SVGAIndexValuePair
        !           199: TsengLabsET4000_640x480_VGA_attributeControllerRegisters[] = {
        !           200:     {0x00,0x00}, {0x01,0x01}, {0x02,0x02}, {0x03,0x03}, {0x04,0x04},
        !           201:     {0x05,0x05}, {0x06,0x14}, {0x07,0x07}, {0x08,0x38}, {0x09,0x39},
        !           202:     {0x0A,0x3A}, {0x0B,0x3B}, {0x0C,0x3C}, {0x0D,0x3D}, {0x0E,0x3E},
        !           203:     {0x0F,0x3F}, {0x10,0x01}, {0x11,0x00}, {0x12,0x0F}, {0x13,0x00},
        !           204:     {0x14,0x00}, {0x16,0x00},
        !           205:     {-1, 0}
        !           206: };
        !           207:     
        !           208: 
        !           209: static const TsengLabsET4000Mode
        !           210: TsengLabsET4000_640x480_VGA = {
        !           211:     "800x600x2x60hz",
        !           212:     TsengLabsET4000_640x480_VGA_generalRegisters,
        !           213:     TsengLabsET4000_640x480_VGA_sequencerRegisters,
        !           214:     TsengLabsET4000_640x480_VGA_crtControllerRegisters,
        !           215:     TsengLabsET4000_640x480_VGA_graphicsControllerRegisters,
        !           216:     TsengLabsET4000_640x480_VGA_attributeControllerRegisters
        !           217: };
        !           218: 
        !           219: 
        !           220: /**************************************
        !           221:  * Framebuffer characteristics.
        !           222:  **************************************/
        !           223: 
        !           224: #define FRAMEBUFFER_ADDRESS ((void *) 0xa0000)
        !           225: 
        !           226: static const IODisplayInfo modeTable[] = {
        !           227:     {
        !           228:        //
        !           229:        // TsengLabsET4000 1024 x 768 x 2 x 60hz
        !           230:        //
        !           231:        1024, 768, 1024,
        !           232:        
        !           233:        //
        !           234:        // rowbytes =
        !           235:        //      #bytes/scanline =
        !           236:        //      ((pixels/line) * (2 bits/pixel) * (byte/8 bits)) =
        !           237:        //      (pixel width / 4)
        !           238:        //
        !           239:        256, 60, 0, IO_2BitsPerPixel, IO_OneIsBlackColorSpace,
        !           240:        "WW", 0, (void *)&TsengLabsET4000_1024x768x2x60hz
        !           241:     },
        !           242: #if 0 /* TsengLabsET4000_800x600x2x60hz mode doesn't quite work */
        !           243:     {
        !           244:        //
        !           245:        // TsengLabsET4000 800 x 600 x 2 x 60hz
        !           246:        //
        !           247:        800, 600, 800, 200, 60, 0, IO_2BitsPerPixel, IO_OneIsBlackColorSpace,
        !           248:        
        !           249:        //
        !           250:        // rowbytes =
        !           251:        //      #bytes/scanline =
        !           252:        //      ((pixels/line) * (2 bits/pixel) * (byte/8 bits)) =
        !           253:        //      (pixel width / 4)
        !           254:        //
        !           255:        "WW", 0, (void *)&TsengLabsET4000_800x600x2x60hz
        !           256:     }
        !           257: #endif /* TsengLabsET4000_800x600x2x60hz mode doesn't quite work */
        !           258: 
        !           259:     /* Add more modes here. */
        !           260: };
        !           261: #define modeTableCount  (sizeof(modeTable) / sizeof(IODisplayInfo))
        !           262: 
        !           263: 
        !           264: @implementation TsengLabsET4000
        !           265: 
        !           266: 
        !           267: //
        !           268: // BEGIN:      Implementation of private routines for SVGA
        !           269: //
        !           270: 
        !           271: 
        !           272: static void SetBrightness(unsigned int level)
        !           273: // Description:        Sets the screen's brightness.  This implementation
        !           274: //             uses a fixed gamma value.  It sets the palette
        !           275: //             values according to the brightness level.
        !           276: {
        !           277:     unsigned char val;
        !           278: 
        !           279:     val = EV_SCALE_BRIGHTNESS(level, WHITE_PALETTE_VALUE);
        !           280:     outb(WRIT_COLR_PEL_AWMR, (unsigned char)WHITE_INDEX);
        !           281:     outb(WRIT_COLR_PEL_DATA, val);
        !           282:     outb(WRIT_COLR_PEL_DATA, val);
        !           283:     outb(WRIT_COLR_PEL_DATA, val);
        !           284: 
        !           285:     val = EV_SCALE_BRIGHTNESS(level, LIGHT_GRAY_PALETTE_VALUE);
        !           286:     outb(WRIT_COLR_PEL_AWMR, (unsigned char)LIGHT_GRAY_INDEX);
        !           287:     outb(WRIT_COLR_PEL_DATA, val);
        !           288:     outb(WRIT_COLR_PEL_DATA, val);
        !           289:     outb(WRIT_COLR_PEL_DATA, val);
        !           290: 
        !           291:     val = EV_SCALE_BRIGHTNESS(level, DARK_GRAY_PALETTE_VALUE);
        !           292:     outb(WRIT_COLR_PEL_AWMR, (unsigned char)DARK_GRAY_INDEX);
        !           293:     outb(WRIT_COLR_PEL_DATA, val);
        !           294:     outb(WRIT_COLR_PEL_DATA, val);
        !           295:     outb(WRIT_COLR_PEL_DATA, val);
        !           296: 
        !           297:     val = EV_SCALE_BRIGHTNESS(level, BLACK_PALETTE_VALUE);
        !           298:     outb(WRIT_COLR_PEL_AWMR, (unsigned char)BLACK_INDEX);
        !           299:     outb(WRIT_COLR_PEL_DATA, val);
        !           300:     outb(WRIT_COLR_PEL_DATA, val);
        !           301:     outb(WRIT_COLR_PEL_DATA, val);
        !           302: }
        !           303: 
        !           304: 
        !           305: static void setColorMapToLinearMonochrome()
        !           306: // Description:        Sets the color map to linear monochrome by zeroing
        !           307: //             out the entire table, then setting the first four
        !           308: //             palette values correctly.
        !           309: {
        !           310:     int i;
        !           311: 
        !           312:     for (i = 0; i < 256; i++) {
        !           313:        outb(WRIT_COLR_PEL_AWMR, i);
        !           314:        outb(WRIT_COLR_PEL_DATA, 0x00);
        !           315:        outb(WRIT_COLR_PEL_DATA, 0x00);
        !           316:        outb(WRIT_COLR_PEL_DATA, 0x00);
        !           317:     }
        !           318:     outb(WRIT_COLR_PEL_AWMR, WHITE_INDEX);
        !           319:     outb(WRIT_COLR_PEL_DATA, WHITE_PALETTE_VALUE);
        !           320:     outb(WRIT_COLR_PEL_DATA, WHITE_PALETTE_VALUE);
        !           321:     outb(WRIT_COLR_PEL_DATA, WHITE_PALETTE_VALUE);
        !           322:     
        !           323:     outb(WRIT_COLR_PEL_AWMR, LIGHT_GRAY_INDEX);
        !           324:     outb(WRIT_COLR_PEL_DATA, LIGHT_GRAY_PALETTE_VALUE);
        !           325:     outb(WRIT_COLR_PEL_DATA, LIGHT_GRAY_PALETTE_VALUE);
        !           326:     outb(WRIT_COLR_PEL_DATA, LIGHT_GRAY_PALETTE_VALUE);
        !           327:     
        !           328:     outb(WRIT_COLR_PEL_AWMR, DARK_GRAY_INDEX);
        !           329:     outb(WRIT_COLR_PEL_DATA, DARK_GRAY_PALETTE_VALUE);
        !           330:     outb(WRIT_COLR_PEL_DATA, DARK_GRAY_PALETTE_VALUE);
        !           331:     outb(WRIT_COLR_PEL_DATA, DARK_GRAY_PALETTE_VALUE);
        !           332:     
        !           333:     outb(WRIT_COLR_PEL_AWMR, BLACK_INDEX);
        !           334:     outb(WRIT_COLR_PEL_DATA, BLACK_PALETTE_VALUE);
        !           335:     outb(WRIT_COLR_PEL_DATA, BLACK_PALETTE_VALUE);
        !           336:     outb(WRIT_COLR_PEL_DATA, BLACK_PALETTE_VALUE);
        !           337: }
        !           338: 
        !           339: 
        !           340: - (void) _selectMode
        !           341: // Description:        During initialization, this selects the configured mode
        !           342: //             and sets the display info accordingly.
        !           343: {
        !           344:     selectedMode = [self selectMode:modeTable count:modeTableCount valid:NULL];
        !           345: 
        !           346:     if (selectedMode < 0) {
        !           347:        IOLog("%s: Sorry, cannot use requested display mode.\n", [self name]);
        !           348:        selectedMode = 0;
        !           349:     }
        !           350: 
        !           351:     *[self displayInfo] = modeTable[selectedMode];
        !           352: }
        !           353: 
        !           354: 
        !           355: - (void)_vgaTsKey
        !           356: // Description:        QUESTION
        !           357: {
        !           358:     outb(WRIT_HERCULES_REG,0x03);
        !           359:     outb(WRIT_COLR_MODE_CT,0xA0);
        !           360: }
        !           361: 
        !           362: 
        !           363: - (void)_SVGASetGeneralRegistersForMode:
        !           364:        (const TsengLabsET4000Mode *)tsengLabsET4000Mode
        !           365: // Description:        Set all the general registers for the given mode.
        !           366: {
        !           367:     const SVGAIndexValuePair *regInfo;
        !           368: 
        !           369:     regInfo = tsengLabsET4000Mode->generalRegisters;
        !           370:     while (regInfo->index != -1) {
        !           371:        outb(WRIT_EIDR_GEN_MISC_OP, regInfo->value);
        !           372:        regInfo++;
        !           373:     }
        !           374: }
        !           375: 
        !           376: 
        !           377: - (void)_SVGASetSequencerRegistersForMode:
        !           378:        (const TsengLabsET4000Mode *)tsengLabsET4000Mode
        !           379: // Description:        Set all the sequencer registers for the given mode.
        !           380: {
        !           381:     const SVGAIndexValuePair *regInfo;
        !           382:     
        !           383:     regInfo = tsengLabsET4000Mode->sequencerRegisters;
        !           384:     while (regInfo->index != -1) {
        !           385:        if (regInfo->index == 1) {
        !           386:            [self _vgaTsKey];
        !           387:        }
        !           388:        IOWriteRegister(EIDR_SEQ_ADDR, (char)(regInfo->index), regInfo->value);
        !           389:        regInfo++;
        !           390:     }
        !           391: }
        !           392: 
        !           393: 
        !           394: - (void)_SVGASetCrtControllerRegistersForMode:
        !           395:        (const TsengLabsET4000Mode *)tsengLabsET4000Mode
        !           396: // Description:        Set all the crt controller registers for the given mode.
        !           397: {
        !           398:     const SVGAIndexValuePair *regInfo;
        !           399:     
        !           400:     regInfo = tsengLabsET4000Mode->crtControllerRegisters;
        !           401:     while (regInfo->index != -1) {
        !           402:        IOWriteRegister(COLR_CRT_ADDR, (char)(regInfo->index), regInfo->value);
        !           403:        regInfo++;
        !           404:     }
        !           405: }
        !           406: 
        !           407: 
        !           408: - (void)_SVGASetGraphicsControllerRegistersForMode:
        !           409:        (const TsengLabsET4000Mode *)tsengLabsET4000Mode
        !           410: // Description:        Set all the graphics controller registers for the given mode.
        !           411: {
        !           412:     const SVGAIndexValuePair *regInfo;
        !           413:     
        !           414:     regInfo = tsengLabsET4000Mode->graphicsControllerRegisters;
        !           415:     while (regInfo->index != -1) {
        !           416:        IOWriteRegister(EIDR_GCR_ADDR, (char)(regInfo->index), regInfo->value);
        !           417:        regInfo++;
        !           418:     }
        !           419: }
        !           420: 
        !           421: 
        !           422: - (void)_SVGASetAttributeControllerRegistersForMode:
        !           423:        (const TsengLabsET4000Mode *)tsengLabsET4000Mode
        !           424: // Description:        Set all the attribute controller registers for the given mode.
        !           425: {
        !           426:     const SVGAIndexValuePair *regInfo;
        !           427: 
        !           428:     regInfo = tsengLabsET4000Mode->attributeControllerRegisters;
        !           429:     while (regInfo->index != -1) {
        !           430:        char tmpi;
        !           431:        inb(READ_COLR_GEN_IN_ST_1);
        !           432:        tmpi = inb(READ_TOGL_ACR_ADDR);
        !           433:        tmpi &= ~ACR_MSK;
        !           434:        tmpi |= (regInfo->index & ACR_MSK);
        !           435:        outb(WRIT_TOGL_ACR_ADDR, tmpi);
        !           436:        outb(WRIT_TOGL_ACR_DATA, regInfo->value);
        !           437:        regInfo++;
        !           438:     }
        !           439: }
        !           440: 
        !           441: 
        !           442: //
        !           443: // END:                Implementation of private routines for SVGA
        !           444: //
        !           445: 
        !           446: 
        !           447: //
        !           448: // BEGIN:      EXPORTED methods
        !           449: //
        !           450: 
        !           451: 
        !           452: - (void)setReadSegment: (unsigned char)segmentNum
        !           453: // Description:        Select which 64K segment we intend to read from.
        !           454: {
        !           455:     char tmp;
        !           456: 
        !           457:     tmp = inb(EIDR_GCR_SEGS);
        !           458:     tmp &= GCR_TS_GWR;
        !           459:     tmp |= ((segmentNum << 4) & GCR_TS_GRD);
        !           460:     outb(EIDR_GCR_SEGS, tmp);
        !           461: }
        !           462: 
        !           463: 
        !           464: - (void)setWriteSegment: (unsigned char)segmentNum
        !           465: // Description:        Select which 64K segment we intend to write to.
        !           466: {
        !           467:     char tmp;
        !           468:     
        !           469:     tmp = inb(EIDR_GCR_SEGS);
        !           470:     tmp &= GCR_TS_GRD;
        !           471:     tmp |= (segmentNum & GCR_TS_GWR);
        !           472:     outb(EIDR_GCR_SEGS, tmp);
        !           473: }
        !           474: 
        !           475: 
        !           476: - (void)setReadPlane: (unsigned char)planeNum
        !           477: // Description:        Select which of 4 bit planes to read from in planar
        !           478: //             modes - only one plane can be active at a time.
        !           479: {
        !           480:     char tmp;
        !           481: 
        !           482:     /* Select plane we are reading from */
        !           483:     tmp = IOReadRegister(EIDR_GCR_ADDR, GCR_AT_READ_MAPS);
        !           484:     tmp &= ~GCR_AT_RMS;
        !           485:     tmp |= (planeNum & GCR_AT_RMS);
        !           486:     IOWriteRegister(EIDR_GCR_ADDR, GCR_AT_READ_MAPS, tmp);
        !           487: }
        !           488: 
        !           489: 
        !           490: - (void)setWritePlane: (unsigned char)planeNum
        !           491: // Description:        Select one of 4 bit planes to write to in planar modes.
        !           492: //             Although more than one plane can be active at a time,
        !           493: //             this routine only allows access to 1 plane at a time.
        !           494: {
        !           495:     char tmp, plane = 0x01;
        !           496: 
        !           497:     //
        !           498:     // Convert plane num to bit enable.
        !           499:     //
        !           500:     plane = plane << (planeNum & 0x03);
        !           501: 
        !           502:     //
        !           503:     // Select plane we are writing to
        !           504:     //
        !           505:     tmp = IOReadRegister(EIDR_SEQ_ADDR, SEQ_AT_MPK);
        !           506:     tmp &= ~(SEQ_AT_EM3 | SEQ_AT_EM2 | SEQ_AT_EM1 | SEQ_AT_EM0);
        !           507:     tmp |= plane;
        !           508:     IOWriteRegister(EIDR_SEQ_ADDR, SEQ_AT_MPK, tmp);
        !           509: }
        !           510: 
        !           511: 
        !           512: - (void)savePlaneAndSegmentSettings
        !           513: // Description:        Saves the current plane and segment settings.
        !           514: //             This is not a stack push, so we can only save/
        !           515: //             restore one group of settings at a time.
        !           516: {
        !           517:     writePlaneMask = IOReadRegister(EIDR_SEQ_ADDR, SEQ_AT_MPK);
        !           518:     readPlaneMask = IOReadRegister(EIDR_GCR_ADDR, GCR_AT_READ_MAPS);
        !           519:     readSegment = inb(EIDR_GCR_SEGS);
        !           520:     writeSegment = inb(EIDR_GCR_SEGS);
        !           521: }
        !           522: 
        !           523: 
        !           524: - (void)restorePlaneAndSegmentSettings
        !           525: // Description:        Restores the current plane and segment settings.
        !           526: //             This is not a stack pop, so we can only save/
        !           527: //             restore one group of settings at a time.
        !           528: {
        !           529:     IOWriteRegister(EIDR_SEQ_ADDR, SEQ_AT_MPK, writePlaneMask);
        !           530:     IOWriteRegister(EIDR_GCR_ADDR, GCR_AT_READ_MAPS, readPlaneMask);
        !           531:     outb(EIDR_GCR_SEGS, readSegment);
        !           532:     outb(EIDR_GCR_SEGS, writeSegment);
        !           533: }
        !           534: 
        !           535: 
        !           536: - (void)enterSVGAMode
        !           537: // Description:        Put the display into SVGA mode selectedMode. This
        !           538: //             typically happens when the window server starts running.
        !           539: //             We set up all the registers necessary for the given
        !           540: //             mode and then clear the screen.
        !           541: {
        !           542:     IODisplayInfo *displayInfo;
        !           543:     int totalScreenBytes, bytesLeftToClear, writeSegmentToClear;
        !           544: 
        !           545:     [self _vgaTsKey];
        !           546:     [self _SVGASetGeneralRegistersForMode:
        !           547:            modeTable[selectedMode].parameters];
        !           548:     [self _SVGASetSequencerRegistersForMode:
        !           549:            modeTable[selectedMode].parameters];
        !           550:     [self _SVGASetCrtControllerRegistersForMode:
        !           551:            modeTable[selectedMode].parameters];
        !           552:     [self _SVGASetGraphicsControllerRegistersForMode:
        !           553:            modeTable[selectedMode].parameters];
        !           554:     [self _SVGASetAttributeControllerRegistersForMode:
        !           555:            modeTable[selectedMode].parameters];
        !           556: 
        !           557:     //
        !           558:     // re-enable timing sequencer
        !           559:     //
        !           560:     IOWriteRegister(EIDR_SEQ_ADDR, SEQ_AT_CRS, 0x00);
        !           561:     setColorMapToLinearMonochrome();
        !           562:     
        !           563:     //
        !           564:     // Clear the screen.
        !           565:     //
        !           566:     displayInfo = [self displayInfo];
        !           567:     totalScreenBytes = displayInfo->rowBytes * displayInfo->height;
        !           568:     for (   bytesLeftToClear = totalScreenBytes, writeSegmentToClear = 0;
        !           569:            bytesLeftToClear > 0;
        !           570:            bytesLeftToClear -= 0x20000, writeSegmentToClear++) {
        !           571:        [self setWriteSegment:writeSegmentToClear];
        !           572:        memset(displayInfo->frameBuffer, 0, MIN(0x20000, bytesLeftToClear));
        !           573:     }
        !           574: 
        !           575:     [self setWriteSegment:0];
        !           576: }
        !           577: 
        !           578: 
        !           579: - (void)revertToVGAMode
        !           580: // Description:        Put the display into VGA mode. This typically happens
        !           581: //             when SoftPC enters full-screen mode.  We set up all the
        !           582: //             registers necessary for the given mode.
        !           583: {
        !           584:     [self _vgaTsKey];
        !           585:     [self _SVGASetGeneralRegistersForMode:
        !           586:            &TsengLabsET4000_640x480_VGA];
        !           587:     [self _SVGASetSequencerRegistersForMode:
        !           588:            &TsengLabsET4000_640x480_VGA];
        !           589:     [self _SVGASetCrtControllerRegistersForMode:
        !           590:            &TsengLabsET4000_640x480_VGA];
        !           591:     [self _SVGASetGraphicsControllerRegistersForMode:
        !           592:            &TsengLabsET4000_640x480_VGA];
        !           593:     [self _SVGASetAttributeControllerRegistersForMode:
        !           594:            &TsengLabsET4000_640x480_VGA];
        !           595:     
        !           596:     //
        !           597:     // re-enable timing sequencer
        !           598:     //
        !           599:     IOWriteRegister(EIDR_SEQ_ADDR, SEQ_AT_CRS, 0x00);
        !           600: }
        !           601: 
        !           602: 
        !           603: - initFromDeviceDescription:deviceDescription
        !           604: // Description:        IODevice method.  Initialize the current instance as
        !           605: //             per the deviceDescription.  Most importantly, this
        !           606: //             includes selecting the mode and mapping the frame buffer.
        !           607: {
        !           608:     IODisplayInfo *displayInfo;
        !           609:     const IORange *range;
        !           610:     const TsengLabsET4000Mode *tsengLabsET4000Mode;
        !           611: 
        !           612:     if ([super initFromDeviceDescription:deviceDescription] == nil)
        !           613:        return [super free];
        !           614: 
        !           615:     [self _selectMode];
        !           616: 
        !           617:     range = [deviceDescription memoryRangeList];
        !           618:     if (range == 0) {
        !           619:        IOLog("%s: No memory range set.\n", [self name]);
        !           620:        return [super free];
        !           621:     }
        !           622:     videoRamAddress = range[0].start;
        !           623: 
        !           624:     displayInfo = [self displayInfo];
        !           625:     tsengLabsET4000Mode = displayInfo->parameters;
        !           626: 
        !           627:     displayInfo->frameBuffer =
        !           628:         (void *)[self mapFrameBufferAtPhysicalAddress:videoRamAddress
        !           629:             length:0x20000];
        !           630:             
        !           631:     if (displayInfo->frameBuffer == 0)
        !           632:        return [super free];
        !           633: 
        !           634:     IOLog("%s: Initialized `%s' @ %d Hz.\n", [self name],
        !           635:        tsengLabsET4000Mode->name, displayInfo->refreshRate);
        !           636: 
        !           637:     return self;
        !           638: }
        !           639: 
        !           640: 
        !           641: - setBrightness:(int)level token:(int)t
        !           642: // Description:        This is from the evScreen protocol. We override our superclass
        !           643: //             on this since it doesn't know how to set our brightness.
        !           644: {
        !           645:     if ( level < EV_SCREEN_MIN_BRIGHTNESS
        !           646:        || level > EV_SCREEN_MAX_BRIGHTNESS )
        !           647:     {
        !           648:        IOLog("%s: Invalid arg to setBrightness:%d\n",
        !           649:            [self name], level );
        !           650:            
        !           651:        if (level < EV_SCREEN_MIN_BRIGHTNESS) {
        !           652:            level = EV_SCREEN_MIN_BRIGHTNESS;
        !           653:        } else {
        !           654:            level = EV_SCREEN_MAX_BRIGHTNESS;
        !           655:        }
        !           656:     }
        !           657:     SetBrightness(level);
        !           658: 
        !           659:     return self;
        !           660: }
        !           661: 
        !           662: 
        !           663: //
        !           664: // END:                EXPORTED methods
        !           665: //
        !           666: 
        !           667: @end

unix.superglobalmegacorp.com

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