|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.