Annotation of ntddk/src/video/miniport/et4000/modeset.c, revision 1.1.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.