1 #include "vgamp.h" 2 3 #include "vgavideo.h" 4 5 static VGA_REGISTERS Mode12Regs = 6 { 7 /* CRT Controller Registers */ 8 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 9 0x00, 0x00, 0x00, 0x59, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3}, 10 /* Attribute Controller Registers */ 11 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 12 0x0C, 0x0D, 0x0E, 0x0F, 0x81, 0x00, 0x0F, 0x00, 0x00}, 13 /* Graphics Controller Registers */ 14 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x0F, 0xFF}, 15 /* Sequencer Registers */ 16 {0x03, 0x01, 0x0F, 0x00, 0x06}, 17 /* Misc Output Register */ 18 0xE3 19 }; 20 21 VGA_REGISTERS TextModeRegs; 22 23 static VOID FASTCALL 24 vgaSaveRegisters(PVGA_REGISTERS Registers) 25 { 26 UCHAR i; 27 28 for (i = 0; i < sizeof(Registers->CRT); i++) 29 { 30 VideoPortWritePortUchar(CRTC, i); 31 Registers->CRT[i] = VideoPortReadPortUchar(CRTCDATA); 32 } 33 34 for (i = 0; i < sizeof(Registers->Attribute); i++) 35 { 36 VideoPortReadPortUchar(STATUS); 37 VideoPortWritePortUchar(ATTRIB, i); 38 Registers->Attribute[i] = VideoPortReadPortUchar(ATTRIBREAD); 39 } 40 41 for (i = 0; i < sizeof(Registers->Graphics); i++) 42 { 43 VideoPortWritePortUchar(GRAPHICS, i); 44 Registers->Graphics[i] = VideoPortReadPortUchar(GRAPHICSDATA); 45 } 46 47 for (i = 0; i < sizeof(Registers->Sequencer); i++) 48 { 49 VideoPortWritePortUchar(SEQ, i); 50 Registers->Sequencer[i] = VideoPortReadPortUchar(SEQDATA); 51 } 52 53 Registers->Misc = VideoPortReadPortUchar(MISC); 54 } 55 56 static VOID FASTCALL 57 vgaSetRegisters(PVGA_REGISTERS Registers) 58 { 59 UCHAR i; 60 61 /* Update misc output register */ 62 VideoPortWritePortUchar(MISC, Registers->Misc); 63 64 /* Synchronous reset on */ 65 VideoPortWritePortUchar(SEQ, 0x00); 66 VideoPortWritePortUchar(SEQDATA, 0x01); 67 68 /* Write sequencer registers */ 69 for (i = 1; i < sizeof(Registers->Sequencer); i++) 70 { 71 VideoPortWritePortUchar(SEQ, i); 72 VideoPortWritePortUchar(SEQDATA, Registers->Sequencer[i]); 73 } 74 75 /* Synchronous reset off */ 76 VideoPortWritePortUchar(SEQ, 0x00); 77 VideoPortWritePortUchar(SEQDATA, 0x03); 78 79 /* Deprotect CRT registers 0-7 */ 80 VideoPortWritePortUchar(CRTC, 0x11); 81 VideoPortWritePortUchar(CRTCDATA, Registers->CRT[0x11] & 0x7f); 82 83 /* Write CRT registers */ 84 for (i = 0; i < sizeof(Registers->CRT); i++) 85 { 86 VideoPortWritePortUchar(CRTC, i); 87 VideoPortWritePortUchar(CRTCDATA, Registers->CRT[i]); 88 } 89 90 /* Write graphics controller registers */ 91 for (i = 0; i < sizeof(Registers->Graphics); i++) 92 { 93 VideoPortWritePortUchar(GRAPHICS, i); 94 VideoPortWritePortUchar(GRAPHICSDATA, Registers->Graphics[i]); 95 } 96 97 /* Write attribute controller registers */ 98 for (i = 0; i < sizeof(Registers->Attribute); i++) 99 { 100 VideoPortReadPortUchar(STATUS); 101 VideoPortWritePortUchar(ATTRIB, i); 102 VideoPortWritePortUchar(ATTRIB, Registers->Attribute[i]); 103 } 104 105 /* Renable screen. */ 106 VideoPortWritePortUchar(ATTRIB, 0x20); 107 } 108 109 VOID 110 InitVGAMode(VOID) 111 { 112 vgaSaveRegisters(&TextModeRegs); 113 vgaSetRegisters(&Mode12Regs); 114 } 115 116 VOID 117 VGAResetDevice(OUT PSTATUS_BLOCK StatusBlock) 118 { 119 vgaSetRegisters(&TextModeRegs); 120 } 121