Annotation of ntddk/src/video/miniport/wdvga/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 WD VGA 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 "wdvga.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:     UCHAR temp;
        !           362:     UCHAR dummy;
        !           363:     UCHAR bIsColor;
        !           364:     VIDEO_X86_BIOS_ARGUMENTS biosArguments;
        !           365:     UCHAR frequencySetting;
        !           366: 
        !           367:     //
        !           368:     // Check if the size of the data in the input buffer is large enough.
        !           369:     //
        !           370: 
        !           371:     if (ModeSize < sizeof(VIDEO_MODE)) {
        !           372: 
        !           373:         return ERROR_INSUFFICIENT_BUFFER;
        !           374: 
        !           375:     }
        !           376: 
        !           377:     //
        !           378:     // Extract the clear memory bit.
        !           379:     //
        !           380: 
        !           381:     if (Mode->RequestedMode & VIDEO_MODE_NO_ZERO_MEMORY) {
        !           382: 
        !           383:         Mode->RequestedMode &= ~VIDEO_MODE_NO_ZERO_MEMORY;
        !           384: 
        !           385:     }  else {
        !           386: 
        !           387:         VgaZeroVideoMemory(HwDeviceExtension);
        !           388: 
        !           389:     }
        !           390: 
        !           391:     //
        !           392:     // Check to see if we are requesting a valid mode
        !           393:     //
        !           394: 
        !           395:     if ( (Mode->RequestedMode >= NumVideoModes) ||
        !           396:          (!ModesVGA[Mode->RequestedMode].ValidMode) ) {
        !           397: 
        !           398:         return ERROR_INVALID_PARAMETER;
        !           399: 
        !           400:     }
        !           401: 
        !           402:     pRequestedMode = &ModesVGA[Mode->RequestedMode];
        !           403: 
        !           404:     //
        !           405:     // Make sure we unlock extended registers since the BIOS on some machines
        !           406:     // does not do it properly.
        !           407:     //
        !           408: 
        !           409:     VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           410:                GRAPH_ADDRESS_PORT, 0x0F);
        !           411: 
        !           412:     VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           413:                GRAPH_DATA_PORT, 0x05);
        !           414: 
        !           415: #ifdef INT10_MODE_SET
        !           416: 
        !           417:     //
        !           418:     // First set up the frequency so the modeset grabs it properly.
        !           419:     //
        !           420: 
        !           421:     if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           422:             MISC_OUTPUT_REG_READ_PORT) & 0x01) {
        !           423: 
        !           424:         bIsColor = TRUE;
        !           425: 
        !           426:     } else {
        !           427: 
        !           428:         bIsColor = FALSE;
        !           429: 
        !           430:     }
        !           431: 
        !           432:     if (bIsColor) {
        !           433: 
        !           434:         VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           435:                                     CRTC_ADDRESS_PORT_COLOR, 0x2b);
        !           436: 
        !           437:         temp = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           438:                                           CRTC_DATA_PORT_COLOR);
        !           439: 
        !           440:     } else {
        !           441: 
        !           442:         VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           443:                                     CRTC_ADDRESS_PORT_MONO, 0x2b);
        !           444: 
        !           445:         temp = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           446:                                           CRTC_DATA_PORT_MONO);
        !           447: 
        !           448:     }
        !           449: 
        !           450:     //
        !           451:     // Adjust the frequency setting register and write it back out.
        !           452:     // Also support Diamond changes to frequency settings
        !           453:     //
        !           454: 
        !           455:     temp &= pRequestedMode->FrequencyMask;
        !           456: 
        !           457:     frequencySetting = pRequestedMode->FrequencySetting;
        !           458: 
        !           459:     
        !           460:     if ( (HwDeviceExtension->BoardID == SPEEDSTAR31) &&
        !           461:          (pRequestedMode->hres == 1024) ) {
        !           462: 
        !           463:         //
        !           464:         // Diamond has inversed the refresh rates of interlaced and 72 Hz
        !           465:         // on the 1024 modes
        !           466:         //
        !           467: 
        !           468:         if (pRequestedMode->Frequency == 72) {
        !           469: 
        !           470:             frequencySetting = 0x00;
        !           471: 
        !           472:         } else {
        !           473: 
        !           474:             if (pRequestedMode->Frequency == 44) {
        !           475: 
        !           476:                 frequencySetting = 0x30;
        !           477: 
        !           478:             }
        !           479:         }
        !           480:     }
        !           481: 
        !           482:     temp |= frequencySetting;
        !           483: 
        !           484:     if (bIsColor) {
        !           485: 
        !           486:         VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           487:                                     CRTC_DATA_PORT_COLOR, temp);
        !           488: 
        !           489:     } else {
        !           490: 
        !           491:         VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           492:                                     CRTC_DATA_PORT_MONO, temp);
        !           493: 
        !           494:     }
        !           495: 
        !           496:     //
        !           497:     // Set the mode
        !           498:     //
        !           499: 
        !           500:     VideoPortZeroMemory(&biosArguments, sizeof(VIDEO_X86_BIOS_ARGUMENTS));
        !           501: 
        !           502:     biosArguments.Eax = pRequestedMode->Int10ModeNumber;
        !           503: 
        !           504:     status = VideoPortInt10(HwDeviceExtension, &biosArguments);
        !           505: 
        !           506:     if (status != NO_ERROR) {
        !           507: 
        !           508:         return status;
        !           509: 
        !           510:     }
        !           511: 
        !           512:     if (pRequestedMode->CmdStrings != NULL) {
        !           513: 
        !           514:         VgaInterpretCmdStream(HwDeviceExtension, pRequestedMode->CmdStrings);
        !           515: 
        !           516:     }
        !           517: 
        !           518:     if (!(pRequestedMode->fbType & VIDEO_MODE_GRAPHICS)) {
        !           519: 
        !           520:         //
        !           521:         // Fix to make sure we always set the colors in text mode to be
        !           522:         // intensity, and not flashing
        !           523:         // For this zero out the Mode Control Regsiter bit 3 (index 0x10
        !           524:         // of the Attribute controller).
        !           525:         //
        !           526: 
        !           527:         if (bIsColor) {
        !           528: 
        !           529:             dummy = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           530:                     INPUT_STATUS_1_COLOR);
        !           531:         } else {
        !           532: 
        !           533:             dummy = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           534:                     INPUT_STATUS_1_MONO);
        !           535:         }
        !           536: 
        !           537:         VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           538:                 ATT_ADDRESS_PORT, (0x10 | VIDEO_ENABLE));
        !           539:         temp = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           540:                 ATT_DATA_READ_PORT);
        !           541: 
        !           542:         temp &= 0xF7;
        !           543: 
        !           544:         if (bIsColor) {
        !           545: 
        !           546:             dummy = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           547:                     INPUT_STATUS_1_COLOR);
        !           548:         } else {
        !           549: 
        !           550:             dummy = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           551:                     INPUT_STATUS_1_MONO);
        !           552:         }
        !           553: 
        !           554:         VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           555:                 ATT_ADDRESS_PORT, (0x10 | VIDEO_ENABLE));
        !           556:         VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           557:                 ATT_DATA_WRITE_PORT, temp);
        !           558: 
        !           559:     }
        !           560: 
        !           561: #else
        !           562:     VgaInterpretCmdStream(HwDeviceExtension, pRequestedMode->CmdStrings);
        !           563: #endif
        !           564: 
        !           565:     //
        !           566:     // Make sure we unlock extended registers since the BIOS on some machines
        !           567:     // does not do it properly.
        !           568:     //
        !           569: 
        !           570:     VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           571:                GRAPH_ADDRESS_PORT, 0x0F);
        !           572: 
        !           573:     VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
        !           574:                GRAPH_DATA_PORT, 0x05);
        !           575: 
        !           576:     //
        !           577:     // Update the location of the physical frame buffer within video memory.
        !           578:     //
        !           579: 
        !           580:     HwDeviceExtension->PhysicalFrameLength =
        !           581:             MemoryMaps[pRequestedMode->MemMap].MaxSize;
        !           582: 
        !           583:     HwDeviceExtension->PhysicalFrameBase.LowPart =
        !           584:             MemoryMaps[pRequestedMode->MemMap].Start;
        !           585: 
        !           586:     //
        !           587:     // Store the new mode value.
        !           588:     //
        !           589: 
        !           590:     HwDeviceExtension->CurrentMode = pRequestedMode;
        !           591:     HwDeviceExtension->ModeIndex = Mode->RequestedMode;
        !           592: 
        !           593:     return NO_ERROR;
        !           594: 
        !           595: } //end VgaSetMode()
        !           596: 
        !           597: 
        !           598: VP_STATUS
        !           599: VgaQueryAvailableModes(
        !           600:     PHW_DEVICE_EXTENSION HwDeviceExtension,
        !           601:     PVIDEO_MODE_INFORMATION ModeInformation,
        !           602:     ULONG ModeInformationSize,
        !           603:     PULONG OutputSize
        !           604:     )
        !           605: 
        !           606: /*++
        !           607: 
        !           608: Routine Description:
        !           609: 
        !           610:     This routine returns the list of all available available modes on the
        !           611:     card.
        !           612: 
        !           613: Arguments:
        !           614: 
        !           615:     HwDeviceExtension - Pointer to the miniport driver's device extension.
        !           616: 
        !           617:     ModeInformation - Pointer to the output buffer supplied by the user.
        !           618:         This is where the list of all valid modes is stored.
        !           619: 
        !           620:     ModeInformationSize - Length of the output buffer supplied by the user.
        !           621: 
        !           622:     OutputSize - Pointer to a buffer in which to return the actual size of
        !           623:         the data in the buffer. If the buffer was not large enough, this
        !           624:         contains the minimum required buffer size.
        !           625: 
        !           626: Return Value:
        !           627: 
        !           628:     ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
        !           629:         for the data being returned.
        !           630: 
        !           631:     NO_ERROR if the operation completed successfully.
        !           632: 
        !           633: --*/
        !           634: 
        !           635: {
        !           636:     PVIDEO_MODE_INFORMATION videoModes = ModeInformation;
        !           637:     ULONG i;
        !           638: 
        !           639:     //
        !           640:     // Find out the size of the data to be put in the buffer and return
        !           641:     // that in the status information (whether or not the information is
        !           642:     // there). If the buffer passed in is not large enough return an
        !           643:     // appropriate error code.
        !           644:     //
        !           645: 
        !           646:     if (ModeInformationSize < (*OutputSize =
        !           647:             HwDeviceExtension->NumAvailableModes *
        !           648:             sizeof(VIDEO_MODE_INFORMATION)) ) {
        !           649: 
        !           650:         return ERROR_INSUFFICIENT_BUFFER;
        !           651: 
        !           652:     }
        !           653: 
        !           654:     //
        !           655:     // For each mode supported by the card, store the mode characteristics
        !           656:     // in the output buffer.
        !           657:     //
        !           658: 
        !           659:     for (i = 0; i < NumVideoModes; i++) {
        !           660: 
        !           661:         if (ModesVGA[i].ValidMode) {
        !           662: 
        !           663:             videoModes->Length = sizeof(VIDEO_MODE_INFORMATION);
        !           664:             videoModes->ModeIndex  = i;
        !           665:             videoModes->VisScreenWidth = ModesVGA[i].hres;
        !           666:             videoModes->ScreenStride = ModesVGA[i].wbytes;
        !           667:             videoModes->VisScreenHeight = ModesVGA[i].vres;
        !           668:             videoModes->NumberOfPlanes = ModesVGA[i].numPlanes;
        !           669:             videoModes->BitsPerPlane = ModesVGA[i].bitsPerPlane;
        !           670:             videoModes->Frequency = ModesVGA[i].Frequency;
        !           671:             videoModes->XMillimeter = 330;        // temporary hardcoded constant
        !           672:             videoModes->YMillimeter = 240;        // temporary hardcoded constant
        !           673:             videoModes->NumberRedBits = 6;
        !           674:             videoModes->NumberGreenBits = 6;
        !           675:             videoModes->NumberBlueBits = 6;
        !           676:             videoModes->AttributeFlags = ModesVGA[i].fbType;
        !           677:             videoModes->AttributeFlags |= ModesVGA[i].Interlaced ?
        !           678:                  VIDEO_MODE_INTERLACED : 0;
        !           679: 
        !           680:             videoModes->RedMask = 0;
        !           681:             videoModes->GreenMask = 0;
        !           682:             videoModes->BlueMask = 0;
        !           683:             videoModes->AttributeFlags |= VIDEO_MODE_PALETTE_DRIVEN |
        !           684:                     VIDEO_MODE_MANAGED_PALETTE;
        !           685: 
        !           686:             videoModes++;
        !           687: 
        !           688:         }
        !           689:     }
        !           690: 
        !           691:     return NO_ERROR;
        !           692: 
        !           693: } // end VgaGetAvailableModes()
        !           694: 
        !           695: VP_STATUS
        !           696: VgaQueryNumberOfAvailableModes(
        !           697:     PHW_DEVICE_EXTENSION HwDeviceExtension,
        !           698:     PVIDEO_NUM_MODES NumModes,
        !           699:     ULONG NumModesSize,
        !           700:     PULONG OutputSize
        !           701:     )
        !           702: 
        !           703: /*++
        !           704: 
        !           705: Routine Description:
        !           706: 
        !           707:     This routine returns the number of available modes for this particular
        !           708:     video card.
        !           709: 
        !           710: Arguments:
        !           711: 
        !           712:     HwDeviceExtension - Pointer to the miniport driver's device extension.
        !           713: 
        !           714:     NumModes - Pointer to the output buffer supplied by the user. This is
        !           715:         where the number of modes is stored.
        !           716: 
        !           717:     NumModesSize - Length of the output buffer supplied by the user.
        !           718: 
        !           719:     OutputSize - Pointer to a buffer in which to return the actual size of
        !           720:         the data in the buffer.
        !           721: 
        !           722: Return Value:
        !           723: 
        !           724:     ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
        !           725:         for the data being returned.
        !           726: 
        !           727:     NO_ERROR if the operation completed successfully.
        !           728: 
        !           729: --*/
        !           730: 
        !           731: {
        !           732:     //
        !           733:     // Find out the size of the data to be put in the the buffer and return
        !           734:     // that in the status information (whether or not the information is
        !           735:     // there). If the buffer passed in is not large enough return an
        !           736:     // appropriate error code.
        !           737:     //
        !           738: 
        !           739:     if (NumModesSize < (*OutputSize = sizeof(VIDEO_NUM_MODES)) ) {
        !           740: 
        !           741:         return ERROR_INSUFFICIENT_BUFFER;
        !           742: 
        !           743:     }
        !           744: 
        !           745:     //
        !           746:     // Store the number of modes into the buffer.
        !           747:     //
        !           748: 
        !           749:     NumModes->NumModes = NumVideoModes;
        !           750:     NumModes->ModeInformationLength = sizeof(VIDEO_MODE_INFORMATION);
        !           751: 
        !           752:     return NO_ERROR;
        !           753: 
        !           754: } // end VgaGetNumberOfAvailableModes()
        !           755: 
        !           756: VP_STATUS
        !           757: VgaQueryCurrentMode(
        !           758:     PHW_DEVICE_EXTENSION HwDeviceExtension,
        !           759:     PVIDEO_MODE_INFORMATION ModeInformation,
        !           760:     ULONG ModeInformationSize,
        !           761:     PULONG OutputSize
        !           762:     )
        !           763: 
        !           764: /*++
        !           765: 
        !           766: Routine Description:
        !           767: 
        !           768:     This routine returns a description of the current video mode.
        !           769: 
        !           770: Arguments:
        !           771: 
        !           772:     HwDeviceExtension - Pointer to the miniport driver's device extension.
        !           773: 
        !           774:     ModeInformation - Pointer to the output buffer supplied by the user.
        !           775:         This is where the current mode information is stored.
        !           776: 
        !           777:     ModeInformationSize - Length of the output buffer supplied by the user.
        !           778: 
        !           779:     OutputSize - Pointer to a buffer in which to return the actual size of
        !           780:         the data in the buffer. If the buffer was not large enough, this
        !           781:         contains the minimum required buffer size.
        !           782: 
        !           783: Return Value:
        !           784: 
        !           785:     ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
        !           786:         for the data being returned.
        !           787: 
        !           788:     NO_ERROR if the operation completed successfully.
        !           789: 
        !           790: --*/
        !           791: 
        !           792: {
        !           793:     //
        !           794:     // Find out the size of the data to be put in the the buffer and return
        !           795:     // that in the status information (whether or not the information is
        !           796:     // there). If the buffer passed in is not large enough return an
        !           797:     // appropriate error code.
        !           798:     //
        !           799: 
        !           800:     if (ModeInformationSize < (*OutputSize = sizeof(VIDEO_MODE_INFORMATION))) {
        !           801: 
        !           802:         return ERROR_INSUFFICIENT_BUFFER;
        !           803: 
        !           804:     }
        !           805: 
        !           806:     //
        !           807:     // Store the characteristics of the current mode into the buffer.
        !           808:     //
        !           809: 
        !           810:     ModeInformation->Length = sizeof(VIDEO_MODE_INFORMATION);
        !           811:     ModeInformation->ModeIndex = HwDeviceExtension->ModeIndex;
        !           812:     ModeInformation->VisScreenWidth = HwDeviceExtension->CurrentMode->hres;
        !           813:     ModeInformation->ScreenStride = HwDeviceExtension->CurrentMode->wbytes;
        !           814:     ModeInformation->VisScreenHeight = HwDeviceExtension->CurrentMode->vres;
        !           815:     ModeInformation->NumberOfPlanes = HwDeviceExtension->CurrentMode->numPlanes;
        !           816:     ModeInformation->BitsPerPlane = HwDeviceExtension->CurrentMode->bitsPerPlane;
        !           817:     ModeInformation->Frequency = HwDeviceExtension->CurrentMode->Frequency;
        !           818:     ModeInformation->XMillimeter = 330;        // temporary hardcoded constant
        !           819:     ModeInformation->YMillimeter = 240;        // temporary hardcoded constant
        !           820:     ModeInformation->NumberRedBits = 6;
        !           821:     ModeInformation->NumberGreenBits = 6;
        !           822:     ModeInformation->NumberBlueBits = 6;
        !           823:     ModeInformation->RedMask = 0;
        !           824:     ModeInformation->GreenMask = 0;
        !           825:     ModeInformation->BlueMask = 0;
        !           826:     ModeInformation->AttributeFlags = HwDeviceExtension->CurrentMode->fbType |
        !           827:              VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE;
        !           828:     ModeInformation->AttributeFlags |= HwDeviceExtension->CurrentMode->Interlaced ?
        !           829:              VIDEO_MODE_INTERLACED : 0;
        !           830: 
        !           831:     return NO_ERROR;
        !           832: 
        !           833: } // end VgaQueryCurrentMode()
        !           834: 
        !           835: 
        !           836: VOID
        !           837: VgaZeroVideoMemory(
        !           838:     PHW_DEVICE_EXTENSION HwDeviceExtension
        !           839:     )
        !           840: /*++
        !           841: 
        !           842: Routine Description:
        !           843: 
        !           844:     This routine zeros the first 256K on the VGA.
        !           845: 
        !           846: Arguments:
        !           847: 
        !           848:     HwDeviceExtension - Pointer to the miniport driver's device extension.
        !           849: 
        !           850: 
        !           851: Return Value:
        !           852: 
        !           853:     None.
        !           854: 
        !           855: --*/
        !           856: {
        !           857:     UCHAR temp;
        !           858: 
        !           859:     //
        !           860:     // Map font buffer at A0000
        !           861:     //
        !           862: 
        !           863:     VgaInterpretCmdStream(HwDeviceExtension, EnableA000Data);
        !           864: 
        !           865:     //
        !           866:     // Enable all planes.
        !           867:     //
        !           868:     VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT,
        !           869:             IND_MAP_MASK);
        !           870: 
        !           871:     temp = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
        !           872:             SEQ_DATA_PORT) | (UCHAR)0x0F;
        !           873: 
        !           874:     VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT,
        !           875:             temp);
        !           876: 
        !           877:     //
        !           878:     // Zero the memory.
        !           879:     //
        !           880: 
        !           881:     VideoPortZeroMemory(HwDeviceExtension->VideoMemoryAddress,
        !           882:             0xFFFF);
        !           883: 
        !           884:     VgaInterpretCmdStream(HwDeviceExtension, DisableA000Color);
        !           885: 
        !           886: }
        !           887: 
        !           888: 
        !           889: VOID
        !           890: VgaValidateModes(
        !           891:     PHW_DEVICE_EXTENSION HwDeviceExtension
        !           892:     )
        !           893: 
        !           894: /*++
        !           895: 
        !           896: Routine Description:
        !           897: 
        !           898:     Determines which modes are valid and which are not.
        !           899: 
        !           900: Arguments:
        !           901: 
        !           902:     HwDeviceExtension - Pointer to the miniport driver's device extension.
        !           903: 
        !           904: Return Value:
        !           905: 
        !           906:     None.
        !           907: 
        !           908: --*/
        !           909: {
        !           910: 
        !           911:     ULONG i;
        !           912: 
        !           913:     HwDeviceExtension->NumAvailableModes = 0;
        !           914: 
        !           915:     for (i = 0; i < NumVideoModes; i++) {
        !           916: 
        !           917:         if (HwDeviceExtension->AdapterMemorySize >=
        !           918:             ModesVGA[i].numPlanes * ModesVGA[i].sbytes) {
        !           919:    
        !           920:             ModesVGA[i].ValidMode = TRUE;
        !           921:             HwDeviceExtension->NumAvailableModes++;
        !           922:    
        !           923:         }
        !           924: 
        !           925:         //
        !           926:         // Older boards do not support 72HZ in 1024x768 modes.
        !           927:         // So disable those.
        !           928:         //
        !           929: 
        !           930:         if ( (HwDeviceExtension->BoardID < WD90C31) &&
        !           931:              (ModesVGA[i].hres == 1024) &&
        !           932:              (ModesVGA[i].vres == 768) &&
        !           933:              (ModesVGA[i].Frequency == 72) &&
        !           934:              (ModesVGA[i].ValidMode) ) {
        !           935: 
        !           936:             ModesVGA[i].ValidMode = FALSE;
        !           937:             HwDeviceExtension->NumAvailableModes--;
        !           938:    
        !           939:         }
        !           940:     }
        !           941: }

unix.superglobalmegacorp.com

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