Annotation of ntddk/src/video/miniport/et4000/modeset.c, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1992  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     modeset.c
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     This is the modeset code for the et4000 miniport driver.
        !            12: 
        !            13: Environment:
        !            14: 
        !            15:     kernel mode only
        !            16: 
        !            17: Notes:
        !            18: 
        !            19: Revision History:
        !            20: 
        !            21: --*/
        !            22: #include "dderror.h"
        !            23: #include "devioctl.h"
        !            24: #include "miniport.h"
        !            25: 
        !            26: #include "ntddvdeo.h"
        !            27: #include "video.h"
        !            28: #include "et4000.h"
        !            29: #include "modeset.h"
        !            30: 
        !            31: VOID
        !            32: VgaZeroVideoMemory(
        !            33:     PHW_DEVICE_EXTENSION HwDeviceExtension
        !            34:     );
        !            35: 
        !            36: 
        !            37: VP_STATUS
        !            38: VgaInterpretCmdStream(
        !            39:     PHW_DEVICE_EXTENSION HwDeviceExtension,
        !            40:     PUSHORT pusCmdStream
        !            41:     )
        !            42: 
        !            43: /*++
        !            44: 
        !            45: Routine Description:
        !            46: 
        !            47:     Interprets the appropriate command array to set up VGA registers for the
        !            48:     requested mode. Typically used to set the VGA into a particular mode by
        !            49:     programming all of the registers
        !            50: 
        !            51: Arguments:
        !            52: 
        !            53:     HwDeviceExtension - Pointer to the miniport driver's device extension.
        !            54: 
        !            55:     pusCmdStream - array of commands to be interpreted.
        !            56: 
        !            57: Return Value:
        !            58: 
        !            59:     The status of the operation (can only fail on a bad command); TRUE for
        !            60:     success, FALSE for failure.
        !            61: 
        !            62: --*/
        !            63: 
        !            64: {
        !            65:     ULONG ulCmd;
        !            66:     ULONG ulPort;
        !            67:     UCHAR jValue;
        !            68:     USHORT usValue;
        !            69:     ULONG culCount;
        !            70:     ULONG ulIndex;
        !            71:     ULONG ulBase;
        !            72: 
        !            73:     if (pusCmdStream == NULL) {
        !            74: 
        !            75:         VideoDebugPrint((1, "VgaInterpretCmdStream - Invalid pusCmdStream\n"));
        !            76:         return TRUE;
        !            77:     }
        !            78: 
        !            79:     ulBase = (ULONG)HwDeviceExtension->IOAddress;
        !            80: 
        !            81:     //
        !            82:     // Now set the adapter to the desired mode.
        !            83:     //
        !            84: 
        !            85:     while ((ulCmd = *pusCmdStream++) != EOD) {
        !            86: 
        !            87:         //
        !            88:         // Determine major command type
        !            89:         //
        !            90: 
        !            91:         switch (ulCmd & 0xF0) {
        !            92: 
        !            93:             //
        !            94:             // Basic input/output command
        !            95:             //
        !            96: 
        !            97:             case INOUT:
        !            98: 
        !            99:                 //
        !           100:                 // Determine type of inout instruction
        !           101:                 //
        !           102: 
        !           103:                 if (!(ulCmd & IO)) {
        !           104: 
        !           105:                     //
        !           106:                     // Out instruction. Single or multiple outs?
        !           107:                     //
        !           108: 
        !           109:                     if (!(ulCmd & MULTI)) {
        !           110: 
        !           111:                         //
        !           112:                         // Single out. Byte or word out?
        !           113:                         //
        !           114: 
        !           115:                         if (!(ulCmd & BW)) {
        !           116: 
        !           117:                             //
        !           118:                             // Single byte out
        !           119:                             //
        !           120: 
        !           121:                             ulPort = *pusCmdStream++;
        !           122:                             jValue = (UCHAR) *pusCmdStream++;
        !           123:                             VideoPortWritePortUchar((PUCHAR)(ulBase+ulPort),
        !           124:                                     jValue);
        !           125: 
        !           126:                         } else {
        !           127: 
        !           128:                             //
        !           129:                             // Single word out
        !           130:                             //
        !           131: 
        !           132:                             ulPort = *pusCmdStream++;
        !           133:                             usValue = *pusCmdStream++;
        !           134:                             VideoPortWritePortUshort((PUSHORT)(ulBase+ulPort),
        !           135:                                     usValue);
        !           136: 
        !           137:                         }
        !           138: 
        !           139:                     } else {
        !           140: 
        !           141:                         //
        !           142:                         // Output a string of values
        !           143:                         // Byte or word outs?
        !           144:                         //
        !           145: 
        !           146:                         if (!(ulCmd & BW)) {
        !           147: 
        !           148:                             //
        !           149:                             // String byte outs. Do in a loop; can't use
        !           150:                             // VideoPortWritePortBufferUchar because the data
        !           151:                             // is in USHORT form
        !           152:                             //
        !           153: 
        !           154:                             ulPort = ulBase + *pusCmdStream++;
        !           155:                             culCount = *pusCmdStream++;
        !           156: 
        !           157:                             while (culCount--) {
        !           158:                                 jValue = (UCHAR) *pusCmdStream++;
        !           159:                                 VideoPortWritePortUchar((PUCHAR)ulPort,
        !           160:                                         jValue);
        !           161: 
        !           162:                             }
        !           163: 
        !           164:                         } else {
        !           165: 
        !           166:                             //
        !           167:                             // String word outs
        !           168:                             //
        !           169: 
        !           170:                             ulPort = *pusCmdStream++;
        !           171:                             culCount = *pusCmdStream++;
        !           172:                             VideoPortWritePortBufferUshort((PUSHORT)
        !           173:                                     (ulBase + ulPort), pusCmdStream, culCount);
        !           174:                             pusCmdStream += culCount;
        !           175: 
        !           176:                         }
        !           177:                     }
        !           178: 
        !           179:                 } else {
        !           180: 
        !           181:                     // In instruction
        !           182:                     //
        !           183:                     // Currently, string in instructions aren't supported; all
        !           184:                     // in instructions are handled as single-byte ins
        !           185:                     //
        !           186:                     // Byte or word in?
        !           187:                     //
        !           188: 
        !           189:                     if (!(ulCmd & BW)) {
        !           190:                         //
        !           191:                         // Single byte in
        !           192:                         //
        !           193: 
        !           194:                         ulPort = *pusCmdStream++;
        !           195:                         jValue = VideoPortReadPortUchar((PUCHAR)ulBase+ulPort);
        !           196: 
        !           197:                     } else {
        !           198: 
        !           199:                         //
        !           200:                         // Single word in
        !           201:                         //
        !           202: 
        !           203:                         ulPort = *pusCmdStream++;
        !           204:                         usValue = VideoPortReadPortUshort((PUSHORT)
        !           205:                                 (ulBase+ulPort));
        !           206: 
        !           207:                     }
        !           208: 
        !           209:                 }
        !           210: 
        !           211:                 break;
        !           212: 
        !           213:             //
        !           214:             // Higher-level input/output commands
        !           215:             //
        !           216: 
        !           217:             case METAOUT:
        !           218: 
        !           219:                 //
        !           220:                 // Determine type of metaout command, based on minor
        !           221:                 // command field
        !           222:                 //
        !           223:                 switch (ulCmd & 0x0F) {
        !           224: 
        !           225:                     //
        !           226:                     // Indexed outs
        !           227:                     //
        !           228: 
        !           229:                     case INDXOUT:
        !           230: 
        !           231:                         ulPort = ulBase + *pusCmdStream++;
        !           232:                         culCount = *pusCmdStream++;
        !           233:                         ulIndex = *pusCmdStream++;
        !           234: 
        !           235:                         while (culCount--) {
        !           236: 
        !           237:                             usValue = (USHORT) (ulIndex +
        !           238:                                       (((ULONG)(*pusCmdStream++)) << 8));
        !           239:                             VideoPortWritePortUshort((PUSHORT)ulPort, usValue);
        !           240: 
        !           241:                             ulIndex++;
        !           242: 
        !           243:                         }
        !           244: 
        !           245:                         break;
        !           246: 
        !           247:                     //
        !           248:                     // Masked out (read, AND, XOR, write)
        !           249:                     //
        !           250: 
        !           251:                     case MASKOUT:
        !           252: 
        !           253:                         ulPort = *pusCmdStream++;
        !           254:                         jValue = VideoPortReadPortUchar((PUCHAR)ulBase+ulPort);
        !           255:                         jValue &= *pusCmdStream++;
        !           256:                         jValue ^= *pusCmdStream++;
        !           257:                         VideoPortWritePortUchar((PUCHAR)ulBase + ulPort,
        !           258:                                 jValue);
        !           259:                         break;
        !           260: 
        !           261:                     //
        !           262:                     // Attribute Controller out
        !           263:                     //
        !           264: 
        !           265:                     case ATCOUT:
        !           266: 
        !           267:                         ulPort = ulBase + *pusCmdStream++;
        !           268:                         culCount = *pusCmdStream++;
        !           269:                         ulIndex = *pusCmdStream++;
        !           270: 
        !           271:                         while (culCount--) {
        !           272: 
        !           273:                             // Write Attribute Controller index
        !           274:                             VideoPortWritePortUchar((PUCHAR)ulPort,
        !           275:                                     (UCHAR)ulIndex);
        !           276: 
        !           277:                             // Write Attribute Controller data
        !           278:                             jValue = (UCHAR) *pusCmdStream++;
        !           279:                             VideoPortWritePortUchar((PUCHAR)ulPort, jValue);
        !           280: 
        !           281:                             ulIndex++;
        !           282: 
        !           283:                         }
        !           284: 
        !           285:                         break;
        !           286: 
        !           287:                     //
        !           288:                     // None of the above; error
        !           289:                     //
        !           290:                     default:
        !           291: 
        !           292:                         return FALSE;
        !           293: 
        !           294:                 }
        !           295: 
        !           296: 
        !           297:                 break;
        !           298: 
        !           299:             //
        !           300:             // NOP
        !           301:             //
        !           302: 
        !           303:             case NCMD:
        !           304: 
        !           305:                 break;
        !           306: 
        !           307:             //
        !           308:             // Unknown command; error
        !           309:             //
        !           310: 
        !           311:             default:
        !           312: 
        !           313:                 return FALSE;
        !           314: 
        !           315:         }
        !           316: 
        !           317:     }
        !           318: 
        !           319:     return TRUE;
        !           320: 
        !           321: } // end VgaInterpretCmdStream()
        !           322: 
        !           323: 
        !           324: VP_STATUS
        !           325: VgaSetMode(
        !           326:     PHW_DEVICE_EXTENSION HwDeviceExtension,
        !           327:     PVIDEO_MODE Mode,
        !           328:     ULONG ModeSize
        !           329:     )
        !           330: 
        !           331: /*++
        !           332: 
        !           333: Routine Description:
        !           334: 
        !           335:     This routine sets the vga into the requested mode.
        !           336: 
        !           337: Arguments:
        !           338: 
        !           339:     HwDeviceExtension - Pointer to the miniport driver's device extension.
        !           340: 
        !           341:     Mode - Pointer to the structure containing the information about the
        !           342:         font to be set.
        !           343: 
        !           344:     ModeSize - Length of the input buffer supplied by the user.
        !           345: 
        !           346: Return Value:
        !           347: 
        !           348:     ERROR_INSUFFICIENT_BUFFER if the input buffer was not large enough
        !           349:         for the input data.
        !           350: 
        !           351:     ERROR_INVALID_PARAMETER if the mode number is invalid.
        !           352: 
        !           353:     NO_ERROR if the operation completed successfully.
        !           354: 
        !           355: --*/
        !           356: 
        !           357: {
        !           358: 
        !           359:     PVIDEOMODE pRequestedMode;
        !           360:     VP_STATUS status;
        !           361:     USHORT usDataSet, usTemp, usDataClr;
        !           362: 
        !           363:     //
        !           364:     // Check if the size of the data in the input buffer is large enough.
        !           365:     //
        !           366: 
        !           367:     if (ModeSize < sizeof(VIDEO_MODE)) {
        !           368: 
        !           369:         return ERROR_INSUFFICIENT_BUFFER;
        !           370: 
        !           371:     }
        !           372: 
        !           373:     //
        !           374:     // Extract the clear memory bit.
        !           375:     //
        !           376: 
        !           377:     if (Mode->RequestedMode & VIDEO_MODE_NO_ZERO_MEMORY) {
        !           378: 
        !           379:         Mode->RequestedMode &= ~VIDEO_MODE_NO_ZERO_MEMORY;
        !           380: 
        !           381:     }  else {
        !           382: 
        !           383:         VgaZeroVideoMemory(HwDeviceExtension);
        !           384: 
        !           385:     }
        !           386: 
        !           387:     //
        !           388:     // Check to see if we are requesting a valid mode
        !           389:     //
        !           390: 
        !           391:     if ( (Mode->RequestedMode >= NumVideoModes) ||
        !           392:          (!ModesVGA[Mode->RequestedMode].ValidMode) ) {
        !           393: 
        !           394:         return ERROR_INVALID_PARAMETER;
        !           395: 
        !           396:     }
        !           397: 
        !           398:     pRequestedMode = &ModesVGA[Mode->RequestedMode];
        !           399: 
        !           400: #ifdef INT10_MODE_SET
        !           401: {
        !           402:     PUSHORT  pBios;
        !           403:     VIDEO_X86_BIOS_ARGUMENTS biosArguments;
        !           404: 
        !           405:     //
        !           406:     // If this is our first int10, then force an int10 so we can write to the
        !           407:     // "virtual" BIOS area of the server process.
        !           408:     //
        !           409: 
        !           410:     if (HwDeviceExtension->BiosArea == NULL) {
        !           411: 
        !           412:         VideoPortZeroMemory(&biosArguments, sizeof(VIDEO_X86_BIOS_ARGUMENTS));
        !           413:         biosArguments.Eax = 0x03;
        !           414: 
        !           415:         status = VideoPortInt10(HwDeviceExtension, &biosArguments);
        !           416: 
        !           417:     }
        !           418: 
        !           419:     //
        !           420:     // Get the BiosData area value and save the original value.
        !           421:     //
        !           422: 
        !           423:     if (!HwDeviceExtension->BiosArea) {
        !           424: 
        !           425:         switch (HwDeviceExtension->BoardID) {
        !           426: 
        !           427:         case PRODESIGNERIIS:
        !           428: 
        !           429:             HwDeviceExtension->BiosArea = (PUSHORT)PRODESIGNER_BIOS_INFO;
        !           430: 
        !           431:             break;
        !           432: 
        !           433:         case SPEEDSTAR:
        !           434:         case SPEEDSTARPLUS:
        !           435:         case SPEEDSTAR24:
        !           436:         case OTHER:
        !           437:         default:
        !           438: 
        !           439:             HwDeviceExtension->BiosArea = (PUSHORT)BIOS_INFO_1;
        !           440: 
        !           441:             break;
        !           442:         }
        !           443: 
        !           444:         HwDeviceExtension->OriginalBiosData = *HwDeviceExtension->BiosArea;
        !           445:     }
        !           446: 
        !           447:     pBios = HwDeviceExtension->BiosArea;
        !           448: 
        !           449:     //
        !           450:     // Set the refresh rates for the various boards
        !           451:     //
        !           452: 
        !           453:     switch(HwDeviceExtension->BoardID) {
        !           454: 
        !           455:     case SPEEDSTAR:
        !           456:     case SPEEDSTARPLUS:
        !           457:     case SPEEDSTAR24:
        !           458: 
        !           459:         switch (pRequestedMode->hres) {
        !           460: 
        !           461:         case 640:
        !           462:             if (pRequestedMode->Frequency == 72)
        !           463:                 usDataSet = 2;
        !           464:             else usDataSet = 1;
        !           465:             break;
        !           466: 
        !           467:         case 800:
        !           468:             if (pRequestedMode->Frequency == 72)
        !           469:                 usDataSet = 2;
        !           470:             else if (pRequestedMode->Frequency == 56)
        !           471:                 usDataSet = 1;
        !           472:             else usDataSet = 3;
        !           473:             break;
        !           474: 
        !           475:         case 1024:
        !           476:             if (pRequestedMode->Frequency == 70)
        !           477:                 usDataSet = 4;
        !           478:             else if (pRequestedMode->Frequency == 45)
        !           479:                 usDataSet = 1;
        !           480:             else usDataSet = 2;
        !           481:             break;
        !           482: 
        !           483:         default:
        !           484:             usDataSet = 1;
        !           485:             break;
        !           486: 
        !           487:         }
        !           488: 
        !           489:         //
        !           490:         // now we got to unlock the CRTC extension registers!?!
        !           491:         //
        !           492: 
        !           493:         UnlockET4000ExtendedRegs(HwDeviceExtension);
        !           494: 
        !           495:         if (HwDeviceExtension->BoardID == SPEEDSTAR24) {
        !           496: 
        !           497:             //
        !           498:             // SpeedSTAR 24 uses 31.0 for LSB select CRTC.31 and read it
        !           499:             //
        !           500: 
        !           501:             VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           502:                                     CRTC_ADDRESS_PORT_COLOR, 0x31);
        !           503: 
        !           504:             usTemp = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           505:                                             CRTC_DATA_PORT_COLOR) & ~0x01;
        !           506: 
        !           507:             //
        !           508:             // CRTC.31 bit 0 is the LSB of the monitor type on SpeedSTAR 24
        !           509:             //
        !           510: 
        !           511:             usTemp |= (usDataSet&1);
        !           512:             VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           513:                                     CRTC_DATA_PORT_COLOR, (UCHAR)usTemp);
        !           514: 
        !           515:         } else {                    // SpeedSTAR and SpeedSTAR Plus use 37.4 for LSB
        !           516: 
        !           517:             //
        !           518:             // select CRTC.37 and read it
        !           519:             //
        !           520: 
        !           521:             VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           522:                                     CRTC_ADDRESS_PORT_COLOR, 0x37);
        !           523: 
        !           524:             usTemp = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           525:                                             CRTC_DATA_PORT_COLOR) & ~0x10;
        !           526: 
        !           527:             //
        !           528:             // CRTC.37 bit 4 is the LSB of the monitor type on SpeedSTAR PLUS
        !           529:             //
        !           530: 
        !           531:             usTemp |= (usDataSet&1)<<4;
        !           532:             VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           533:                                     CRTC_DATA_PORT_COLOR, (UCHAR)usTemp);
        !           534:         }
        !           535: 
        !           536:         LockET4000ExtendedRegs(HwDeviceExtension);
        !           537: 
        !           538:         //
        !           539:         // these two bits are the rest of the monitor type...
        !           540:         //
        !           541: 
        !           542:         usTemp = *pBios & ~0x6000;
        !           543:         usTemp |= (usDataSet&6)<<12;
        !           544:         *pBios |= usTemp;
        !           545: 
        !           546:         break;
        !           547: 
        !           548:     case PRODESIGNERIIS:
        !           549: 
        !           550:         switch (pRequestedMode->hres) {
        !           551: 
        !           552:         case 640:
        !           553: 
        !           554:             //
        !           555:             // Bit 0:  1=72Hz 0=60Hz
        !           556:             //
        !           557: 
        !           558:             if (pRequestedMode->Frequency == 72) {
        !           559: 
        !           560:                 usDataSet = 0x0001;
        !           561: 
        !           562:             } else { // 60 Hz
        !           563: 
        !           564:                 usDataSet = 0x0000;
        !           565: 
        !           566:             }
        !           567: 
        !           568:             break;
        !           569: 
        !           570: 
        !           571:         case 800:
        !           572: 
        !           573:             //
        !           574:             // Bit 1-2: 10=72Hz 01=60Hz 00=56Hz
        !           575:             //
        !           576: 
        !           577:             if (pRequestedMode->Frequency == 72) {
        !           578: 
        !           579:                 usDataSet = 0x0004;
        !           580: 
        !           581:             } else {
        !           582: 
        !           583:                 if (pRequestedMode->Frequency == 56) {
        !           584: 
        !           585:                     usDataSet = 0x0000;
        !           586: 
        !           587:                 } else {   // 60 Hz
        !           588: 
        !           589:                     usDataSet = 0x0002;
        !           590: 
        !           591:                 }
        !           592:             }
        !           593: 
        !           594:             break;
        !           595: 
        !           596: 
        !           597:         case 1024:
        !           598: 
        !           599:             //
        !           600:             // Bit 3-4: 10=70Hz 01=60Hz 00=45Hz
        !           601:             //
        !           602: 
        !           603:             if (pRequestedMode->Frequency == 70) {
        !           604: 
        !           605:                 usDataSet = 0x0010;
        !           606: 
        !           607:             } else {
        !           608: 
        !           609:                 if (pRequestedMode->Frequency == 45) {
        !           610: 
        !           611:                     usDataSet = 0x0000;
        !           612: 
        !           613:                 } else { // 60 Hz
        !           614: 
        !           615:                     usDataSet = 0x0008;
        !           616: 
        !           617:                 }
        !           618:             }
        !           619: 
        !           620:             break;
        !           621: 
        !           622:         // case 1280
        !           623: 
        !           624:             //
        !           625:             // Bit 5  1=45Hz 0=43 Hz
        !           626:             //
        !           627: 
        !           628: 
        !           629:         default:
        !           630: 
        !           631:             //
        !           632:             // Reset for DOS modes
        !           633:             //
        !           634: 
        !           635:             usDataSet = HwDeviceExtension->OriginalBiosData;
        !           636: 
        !           637:             break;
        !           638: 
        !           639:         }
        !           640: 
        !           641:         *pBios = usDataSet;
        !           642: 
        !           643:         break;
        !           644: 
        !           645: 
        !           646:     case OTHER:
        !           647:     default:
        !           648: 
        !           649:         switch (pRequestedMode->hres) {
        !           650: 
        !           651:         case 640:
        !           652: 
        !           653:             if (pRequestedMode->Frequency == 72) {
        !           654: 
        !           655:                 usDataSet = 0x0040;               // set bit 6
        !           656:                 usDataClr = (USHORT)~0;           // no bits to be cleared
        !           657: 
        !           658:             } else { // 60 Hz
        !           659: 
        !           660:                 usDataSet = 0;                    // no bits to set
        !           661:                 usDataClr = (USHORT)~0x0040;      // clear bit 6
        !           662: 
        !           663:             }
        !           664: 
        !           665:             break;
        !           666: 
        !           667: 
        !           668:         case 800:
        !           669: 
        !           670:             if (pRequestedMode->Frequency == 72) {
        !           671: 
        !           672:                 usDataSet = 0x4020;               // set bits 5 and 14
        !           673:                 usDataClr = (USHORT)~0;           // no bits to clear
        !           674: 
        !           675:             } else {
        !           676: 
        !           677:                 if (pRequestedMode->Frequency == 56) {
        !           678: 
        !           679:                     usDataSet = 0x4000;           // set bit 14
        !           680:                     usDataClr = (USHORT)~0x0020;  // clr bit 5
        !           681: 
        !           682:                 } else {   // 60 Hz
        !           683: 
        !           684:                     usDataSet = 0;                // no bits to set
        !           685:                     usDataClr = (USHORT)~0x4020;  // clr bits 5 and 14
        !           686: 
        !           687:                 }
        !           688:             }
        !           689: 
        !           690:             break;
        !           691: 
        !           692: 
        !           693:         case 1024:
        !           694: 
        !           695:             if (pRequestedMode->Frequency == 70) {
        !           696: 
        !           697:                 usDataSet = 0x2010;               // set bits 4 and 13
        !           698:                 usDataClr = (USHORT)~0;           // no bits to clear
        !           699: 
        !           700:             } else {
        !           701: 
        !           702:                 if (pRequestedMode->Frequency == 45) { //interlaced
        !           703: 
        !           704:                     usDataSet = 0;                // no bits to set
        !           705:                     usDataClr = (USHORT)~0x2010;  // clear bits 4 and 13
        !           706: 
        !           707:                 } else { // 60 Hz
        !           708: 
        !           709:                     usDataSet = 0x2000;           // set bit 13
        !           710:                     usDataClr = (USHORT)~0x0010;  // clear bit 4
        !           711: 
        !           712:                 }
        !           713:             }
        !           714: 
        !           715:             break;
        !           716: 
        !           717:         default:
        !           718: 
        !           719:             //
        !           720:             // Restore to original Value
        !           721:             //
        !           722: 
        !           723:             usDataSet = HwDeviceExtension->OriginalBiosData;
        !           724:             usDataClr = 0x0000;
        !           725: 
        !           726:             break;
        !           727: 
        !           728:         }
        !           729: 
        !           730:         *pBios &= usDataClr;
        !           731:         *pBios |= usDataSet;
        !           732: 
        !           733:         break;
        !           734: 
        !           735:     }
        !           736: 
        !           737:     VideoPortZeroMemory(&biosArguments, sizeof(VIDEO_X86_BIOS_ARGUMENTS));
        !           738: 
        !           739:     biosArguments.Eax = pRequestedMode->Int10ModeNumber;
        !           740: 
        !           741:     status = VideoPortInt10(HwDeviceExtension, &biosArguments);
        !           742: 
        !           743:     if (status != NO_ERROR) {
        !           744: 
        !           745:         return status;
        !           746: 
        !           747:     }
        !           748: 
        !           749:     //
        !           750:     // If this is a 16bpp mode, call the bios to switch it from
        !           751:     // 8bpp to 16bpp.
        !           752:     //
        !           753: 
        !           754:     if (pRequestedMode->bitsPerPlane == 16) {
        !           755:         
        !           756:         VideoPortZeroMemory(&biosArguments, sizeof(VIDEO_X86_BIOS_ARGUMENTS));
        !           757:         
        !           758:         biosArguments.Eax = 0x10F0;
        !           759:         biosArguments.Ebx = pRequestedMode->Int10ModeNumber;
        !           760:         
        !           761:         status = VideoPortInt10(HwDeviceExtension, &biosArguments);
        !           762: 
        !           763:         if (status != NO_ERROR) {
        !           764: 
        !           765:             return status;
        !           766: 
        !           767:         }
        !           768:     }
        !           769: 
        !           770:     if (pRequestedMode->hres >= 800) {
        !           771:         VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           772:                                 SEGMENT_SELECT_PORT,0);
        !           773:     }
        !           774: 
        !           775:     if (pRequestedMode->CmdStrings != NULL) {
        !           776:         VgaInterpretCmdStream(HwDeviceExtension, pRequestedMode->CmdStrings);
        !           777:     }
        !           778: 
        !           779:     //
        !           780:     // Reset the Bios Value to the default so DOS modes will work.
        !           781:     //
        !           782: 
        !           783:     *pBios = HwDeviceExtension->OriginalBiosData;
        !           784: }
        !           785: 
        !           786: {
        !           787:     UCHAR temp;
        !           788:     UCHAR dummy;
        !           789:     UCHAR bIsColor;
        !           790: 
        !           791:     if (!(pRequestedMode->fbType & VIDEO_MODE_GRAPHICS)) {
        !           792: 
        !           793:             //
        !           794:             // Fix to make sure we always set the colors in text mode to be
        !           795:             // intensity, and not flashing
        !           796:             // For this zero out the Mode Control Regsiter bit 3 (index 0x10
        !           797:             // of the Attribute controller).
        !           798:             //
        !           799: 
        !           800:             if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           801:                     MISC_OUTPUT_REG_READ_PORT) & 0x01) {
        !           802: 
        !           803:                 bIsColor = TRUE;
        !           804: 
        !           805:             } else {
        !           806: 
        !           807:                 bIsColor = FALSE;
        !           808: 
        !           809:             }
        !           810: 
        !           811:             if (bIsColor) {
        !           812: 
        !           813:                 dummy = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           814:                         INPUT_STATUS_1_COLOR);
        !           815:             } else {
        !           816: 
        !           817:                 dummy = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           818:                         INPUT_STATUS_1_MONO);
        !           819:             }
        !           820: 
        !           821:             VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           822:                     ATT_ADDRESS_PORT, (0x10 | VIDEO_ENABLE));
        !           823:             temp = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           824:                     ATT_DATA_READ_PORT);
        !           825: 
        !           826:             temp &= 0xF7;
        !           827: 
        !           828:             if (bIsColor) {
        !           829: 
        !           830:                 dummy = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           831:                         INPUT_STATUS_1_COLOR);
        !           832:             } else {
        !           833: 
        !           834:                 dummy = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           835:                         INPUT_STATUS_1_MONO);
        !           836:             }
        !           837: 
        !           838:             VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           839:                     ATT_ADDRESS_PORT, (0x10 | VIDEO_ENABLE));
        !           840:             VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           841:                     ATT_DATA_WRITE_PORT, temp);
        !           842:     }
        !           843: }
        !           844: 
        !           845: #else
        !           846:     VgaInterpretCmdStream(HwDeviceExtension, pRequestedMode->CmdStrings);
        !           847: #endif
        !           848: 
        !           849:     //
        !           850:     // Update the location of the physical frame buffer within video memory.
        !           851:     //
        !           852: 
        !           853:     HwDeviceExtension->PhysicalFrameLength =
        !           854:             MemoryMaps[pRequestedMode->MemMap].MaxSize;
        !           855: 
        !           856:     HwDeviceExtension->PhysicalFrameBase.LowPart =
        !           857:             MemoryMaps[pRequestedMode->MemMap].Start;
        !           858: 
        !           859:     //
        !           860:     // Store the new mode value.
        !           861:     //
        !           862: 
        !           863:     HwDeviceExtension->CurrentMode = pRequestedMode;
        !           864:     HwDeviceExtension->ModeIndex = Mode->RequestedMode;
        !           865: 
        !           866:     return NO_ERROR;
        !           867: 
        !           868: } //end VgaSetMode()
        !           869: 
        !           870: 
        !           871: VP_STATUS
        !           872: VgaQueryAvailableModes(
        !           873:     PHW_DEVICE_EXTENSION HwDeviceExtension,
        !           874:     PVIDEO_MODE_INFORMATION ModeInformation,
        !           875:     ULONG ModeInformationSize,
        !           876:     PULONG OutputSize
        !           877:     )
        !           878: 
        !           879: /*++
        !           880: 
        !           881: Routine Description:
        !           882: 
        !           883:     This routine returns the list of all available available modes on the
        !           884:     card.
        !           885: 
        !           886: Arguments:
        !           887: 
        !           888:     HwDeviceExtension - Pointer to the miniport driver's device extension.
        !           889: 
        !           890:     ModeInformation - Pointer to the output buffer supplied by the user.
        !           891:         This is where the list of all valid modes is stored.
        !           892: 
        !           893:     ModeInformationSize - Length of the output buffer supplied by the user.
        !           894: 
        !           895:     OutputSize - Pointer to a buffer in which to return the actual size of
        !           896:         the data in the buffer. If the buffer was not large enough, this
        !           897:         contains the minimum required buffer size.
        !           898: 
        !           899: Return Value:
        !           900: 
        !           901:     ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
        !           902:         for the data being returned.
        !           903: 
        !           904:     NO_ERROR if the operation completed successfully.
        !           905: 
        !           906: --*/
        !           907: 
        !           908: {
        !           909:     PVIDEO_MODE_INFORMATION videoModes = ModeInformation;
        !           910:     ULONG i;
        !           911: 
        !           912:     //
        !           913:     // Find out the size of the data to be put in the buffer and return
        !           914:     // that in the status information (whether or not the information is
        !           915:     // there). If the buffer passed in is not large enough return an
        !           916:     // appropriate error code.
        !           917:     //
        !           918: 
        !           919:     if (ModeInformationSize < (*OutputSize =
        !           920:             HwDeviceExtension->NumAvailableModes *
        !           921:             sizeof(VIDEO_MODE_INFORMATION)) ) {
        !           922: 
        !           923:         return ERROR_INSUFFICIENT_BUFFER;
        !           924: 
        !           925:     }
        !           926: 
        !           927:     //
        !           928:     // For each mode supported by the card, store the mode characteristics
        !           929:     // in the output buffer.
        !           930:     //
        !           931: 
        !           932:     for (i = 0; i < NumVideoModes; i++) {
        !           933: 
        !           934:         if (ModesVGA[i].ValidMode) {
        !           935: 
        !           936:             videoModes->Length = sizeof(VIDEO_MODE_INFORMATION);
        !           937:             videoModes->ModeIndex  = i;
        !           938:             videoModes->VisScreenWidth = ModesVGA[i].hres;
        !           939:             videoModes->ScreenStride = ModesVGA[i].wbytes;
        !           940:             videoModes->VisScreenHeight = ModesVGA[i].vres;
        !           941:             videoModes->NumberOfPlanes = ModesVGA[i].numPlanes;
        !           942:             videoModes->BitsPerPlane = ModesVGA[i].bitsPerPlane;
        !           943:             videoModes->Frequency = ModesVGA[i].Frequency;
        !           944:             videoModes->XMillimeter = 330;        // temporary hardcoded constant
        !           945:             videoModes->YMillimeter = 240;        // temporary hardcoded constant
        !           946:             videoModes->NumberRedBits = 6;
        !           947:             videoModes->NumberGreenBits = 6;
        !           948:             videoModes->NumberBlueBits = 6;
        !           949:             videoModes->AttributeFlags = ModesVGA[i].fbType;
        !           950:             videoModes->AttributeFlags |= ModesVGA[i].Interlaced ?
        !           951:                  VIDEO_MODE_INTERLACED : 0;
        !           952: 
        !           953:             if (ModesVGA[i].bitsPerPlane == 16) {
        !           954: 
        !           955:                 videoModes->RedMask = 0x7c00;
        !           956:                 videoModes->GreenMask = 0x03e0;
        !           957:                 videoModes->BlueMask = 0x001f;
        !           958: 
        !           959:             } else {
        !           960: 
        !           961:                 videoModes->RedMask = 0;
        !           962:                 videoModes->GreenMask = 0;
        !           963:                 videoModes->BlueMask = 0;
        !           964:                 videoModes->AttributeFlags |= VIDEO_MODE_PALETTE_DRIVEN |
        !           965:                         VIDEO_MODE_MANAGED_PALETTE;
        !           966:             }
        !           967: 
        !           968:             videoModes++;
        !           969: 
        !           970:         }
        !           971:     }
        !           972: 
        !           973:     return NO_ERROR;
        !           974: 
        !           975: } // end VgaGetAvailableModes()
        !           976: 
        !           977: VP_STATUS
        !           978: VgaQueryNumberOfAvailableModes(
        !           979:     PHW_DEVICE_EXTENSION HwDeviceExtension,
        !           980:     PVIDEO_NUM_MODES NumModes,
        !           981:     ULONG NumModesSize,
        !           982:     PULONG OutputSize
        !           983:     )
        !           984: 
        !           985: /*++
        !           986: 
        !           987: Routine Description:
        !           988: 
        !           989:     This routine returns the number of available modes for this particular
        !           990:     video card.
        !           991: 
        !           992: Arguments:
        !           993: 
        !           994:     HwDeviceExtension - Pointer to the miniport driver's device extension.
        !           995: 
        !           996:     NumModes - Pointer to the output buffer supplied by the user. This is
        !           997:         where the number of modes is stored.
        !           998: 
        !           999:     NumModesSize - Length of the output buffer supplied by the user.
        !          1000: 
        !          1001:     OutputSize - Pointer to a buffer in which to return the actual size of
        !          1002:         the data in the buffer.
        !          1003: 
        !          1004: Return Value:
        !          1005: 
        !          1006:     ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
        !          1007:         for the data being returned.
        !          1008: 
        !          1009:     NO_ERROR if the operation completed successfully.
        !          1010: 
        !          1011: --*/
        !          1012: 
        !          1013: {
        !          1014:     //
        !          1015:     // Find out the size of the data to be put in the the buffer and return
        !          1016:     // that in the status information (whether or not the information is
        !          1017:     // there). If the buffer passed in is not large enough return an
        !          1018:     // appropriate error code.
        !          1019:     //
        !          1020: 
        !          1021:     if (NumModesSize < (*OutputSize = sizeof(VIDEO_NUM_MODES)) ) {
        !          1022: 
        !          1023:         return ERROR_INSUFFICIENT_BUFFER;
        !          1024: 
        !          1025:     }
        !          1026: 
        !          1027:     //
        !          1028:     // Store the number of modes into the buffer.
        !          1029:     //
        !          1030: 
        !          1031:     NumModes->NumModes = HwDeviceExtension->NumAvailableModes;
        !          1032:     NumModes->ModeInformationLength = sizeof(VIDEO_MODE_INFORMATION);
        !          1033: 
        !          1034:     return NO_ERROR;
        !          1035: 
        !          1036: } // end VgaGetNumberOfAvailableModes()
        !          1037: 
        !          1038: VP_STATUS
        !          1039: VgaQueryCurrentMode(
        !          1040:     PHW_DEVICE_EXTENSION HwDeviceExtension,
        !          1041:     PVIDEO_MODE_INFORMATION ModeInformation,
        !          1042:     ULONG ModeInformationSize,
        !          1043:     PULONG OutputSize
        !          1044:     )
        !          1045: 
        !          1046: /*++
        !          1047: 
        !          1048: Routine Description:
        !          1049: 
        !          1050:     This routine returns a description of the current video mode.
        !          1051: 
        !          1052: Arguments:
        !          1053: 
        !          1054:     HwDeviceExtension - Pointer to the miniport driver's device extension.
        !          1055: 
        !          1056:     ModeInformation - Pointer to the output buffer supplied by the user.
        !          1057:         This is where the current mode information is stored.
        !          1058: 
        !          1059:     ModeInformationSize - Length of the output buffer supplied by the user.
        !          1060: 
        !          1061:     OutputSize - Pointer to a buffer in which to return the actual size of
        !          1062:         the data in the buffer. If the buffer was not large enough, this
        !          1063:         contains the minimum required buffer size.
        !          1064: 
        !          1065: Return Value:
        !          1066: 
        !          1067:     ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
        !          1068:         for the data being returned.
        !          1069: 
        !          1070:     NO_ERROR if the operation completed successfully.
        !          1071: 
        !          1072: --*/
        !          1073: 
        !          1074: {
        !          1075:     //
        !          1076:     // Find out the size of the data to be put in the the buffer and return
        !          1077:     // that in the status information (whether or not the information is
        !          1078:     // there). If the buffer passed in is not large enough return an
        !          1079:     // appropriate error code.
        !          1080:     //
        !          1081: 
        !          1082:     if (ModeInformationSize < (*OutputSize = sizeof(VIDEO_MODE_INFORMATION))) {
        !          1083: 
        !          1084:         return ERROR_INSUFFICIENT_BUFFER;
        !          1085: 
        !          1086:     }
        !          1087: 
        !          1088:     //
        !          1089:     // Store the characteristics of the current mode into the buffer.
        !          1090:     //
        !          1091: 
        !          1092:     ModeInformation->Length = sizeof(VIDEO_MODE_INFORMATION);
        !          1093:     ModeInformation->ModeIndex = HwDeviceExtension->ModeIndex;
        !          1094:     ModeInformation->VisScreenWidth = HwDeviceExtension->CurrentMode->hres;
        !          1095:     ModeInformation->ScreenStride = HwDeviceExtension->CurrentMode->wbytes;
        !          1096:     ModeInformation->VisScreenHeight = HwDeviceExtension->CurrentMode->vres;
        !          1097:     ModeInformation->NumberOfPlanes = HwDeviceExtension->CurrentMode->numPlanes;
        !          1098:     ModeInformation->BitsPerPlane = HwDeviceExtension->CurrentMode->bitsPerPlane;
        !          1099:     ModeInformation->Frequency = HwDeviceExtension->CurrentMode->Frequency;
        !          1100:     ModeInformation->XMillimeter = 330;        // temporary hardcoded constant
        !          1101:     ModeInformation->YMillimeter = 240;        // temporary hardcoded constant
        !          1102:     ModeInformation->NumberRedBits = 6;
        !          1103:     ModeInformation->NumberGreenBits = 6;
        !          1104:     ModeInformation->NumberBlueBits = 6;
        !          1105:     ModeInformation->RedMask = 0;
        !          1106:     ModeInformation->GreenMask = 0;
        !          1107:     ModeInformation->BlueMask = 0;
        !          1108:     ModeInformation->AttributeFlags = HwDeviceExtension->CurrentMode->fbType |
        !          1109:              VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE;
        !          1110:     ModeInformation->AttributeFlags |= HwDeviceExtension->CurrentMode->Interlaced ?
        !          1111:              VIDEO_MODE_INTERLACED : 0;
        !          1112: 
        !          1113:     return NO_ERROR;
        !          1114: 
        !          1115: } // end VgaQueryCurrentMode()
        !          1116: 
        !          1117: 
        !          1118: VOID
        !          1119: VgaZeroVideoMemory(
        !          1120:     PHW_DEVICE_EXTENSION HwDeviceExtension
        !          1121:     )
        !          1122: 
        !          1123: /*++
        !          1124: 
        !          1125: Routine Description:
        !          1126: 
        !          1127:     This routine zeros the first 256K on the VGA.
        !          1128: 
        !          1129: Arguments:
        !          1130: 
        !          1131:     HwDeviceExtension - Pointer to the miniport driver's device extension.
        !          1132: 
        !          1133: 
        !          1134: Return Value:
        !          1135: 
        !          1136:     None.
        !          1137: 
        !          1138: --*/
        !          1139: {
        !          1140:     UCHAR temp;
        !          1141: 
        !          1142:     //
        !          1143:     // Map font buffer at A0000
        !          1144:     //
        !          1145: 
        !          1146:     VgaInterpretCmdStream(HwDeviceExtension, EnableA000Data);
        !          1147: 
        !          1148:     //
        !          1149:     // Enable all planes.
        !          1150:     //
        !          1151:     VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT,
        !          1152:             IND_MAP_MASK);
        !          1153: 
        !          1154:     temp = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !          1155:             SEQ_DATA_PORT) | (UCHAR)0x0F;
        !          1156: 
        !          1157:     VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT,
        !          1158:             temp);
        !          1159: 
        !          1160:     //
        !          1161:     // Zero the memory.
        !          1162:     //
        !          1163: 
        !          1164:     VideoPortZeroMemory(HwDeviceExtension->VideoMemoryAddress,
        !          1165:             0xFFFF);
        !          1166: 
        !          1167:     VgaInterpretCmdStream(HwDeviceExtension, DisableA000Color);
        !          1168: 
        !          1169: }
        !          1170: 
        !          1171: 
        !          1172: VOID
        !          1173: VgaValidateModes(
        !          1174:     PHW_DEVICE_EXTENSION HwDeviceExtension
        !          1175:     )
        !          1176: 
        !          1177: /*++
        !          1178: 
        !          1179: Routine Description:
        !          1180: 
        !          1181:     Determines which modes are valid and which are not.
        !          1182: 
        !          1183: Arguments:
        !          1184: 
        !          1185:     HwDeviceExtension - Pointer to the miniport driver's device extension.
        !          1186: 
        !          1187: Return Value:
        !          1188: 
        !          1189:     None.
        !          1190: 
        !          1191: --*/
        !          1192: {
        !          1193: 
        !          1194:     ULONG i;
        !          1195: 
        !          1196:     HwDeviceExtension->NumAvailableModes = 0;
        !          1197: 
        !          1198:     for (i = 0; i < NumVideoModes; i++) {
        !          1199: 
        !          1200:         if (HwDeviceExtension->AdapterMemorySize >=
        !          1201:             ModesVGA[i].numPlanes * ModesVGA[i].sbytes) {
        !          1202:    
        !          1203:             ModesVGA[i].ValidMode = TRUE;
        !          1204:             HwDeviceExtension->NumAvailableModes++;
        !          1205:    
        !          1206:         }
        !          1207:     }
        !          1208: }

unix.superglobalmegacorp.com

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