|
|
1.1 root 1: #import <driverkit/i386/ioPorts.h>
2: #import "vgaModes.h"
3:
4: static const VGAMode VGAMode_3 = {
5: 0x67, 0x00,
6: { 0x01, 0x00, 0x03, 0x00, 0x02 },
7: {
8: 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f, 0x00, 0x4f,
9: 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28,
10: 0x1f, 0x96, 0xb9, 0xa3, 0xff,
11: },
12: {
13: 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39,
14: 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x0c, 0x00, 0x0f, 0x08,
15: },
16: { 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff },
17: };
18:
19: static const VGAMode VGAMode_12 = {
20: 0xE3, 0x00,
21: { 0x03, 0x01, 0x0f, 0x00, 0x06 },
22: {
23: 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0x0b, 0x3e, 0x00, 0x40,
24: 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xea, 0x8c, 0xdf, 0x28,
25: 0x00, 0xe7, 0x04, 0xe3, 0xff,
26: },
27: {
28: 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39,
29: 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x01, 0x00, 0x0f, 0x00,
30: },
31: { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff },
32: };
33:
34: int
35: VGASetMode(unsigned int mode)
36: {
37: switch (mode) {
38: case 0x03:
39: VGASetModeData(&VGAMode_3);
40: break;
41: case 0x12:
42: VGASetModeData(&VGAMode_12);
43: break;
44: default:
45: return -1;
46: }
47: return 0;
48: }
49:
50: int
51: VGASetModeData(const VGAMode *modeData)
52: {
53: int k;
54:
55: /* NOTE: The attribute registers are a little weird. For most registers,
56: * there is a separate index and data port. The attribute register set
57: * has just one port that gets used for both. You write an index to the
58: * port, then use the same port for data. The VGA automatically toggles
59: * the sense of the port (between index and data) with an internal
60: * flip-flop. You set the state of the flip-flop by doing an inb() on
61: * the input status 1 port.
62: *
63: * The other weird thing is that the attribute index register also
64: * contains a palette access bit. This bit determines whether the
65: * CPU or the VGA has control of the palette. While the CPU owns the
66: * palette, the display is effectively off.
67: */
68:
69: /* Turn the video off while we are doing this.... */
70:
71: inb(VGA_INPUT_STATUS_1); /* Set the attribute flip-flop to "index". */
72: outb(VGA_ATTR_INDEX, 0x00); /* Gives palette to CPU, turning off video. */
73:
74: /* Set the misc. output register. */
75: outb(VGA_MISC_OUTPUT, modeData->miscOutput);
76:
77: /* Set the feature control register */
78: outb(VGA_FEATURE_CTRL, modeData->featureCtrl);
79:
80: /* Load the sequencer registers. */
81: for (k = 0; k < VGA_SEQ_COUNT; k++) {
82: outb(VGA_SEQ_INDEX, k);
83: outb(VGA_SEQ_DATA, modeData->seqx[k]);
84: }
85: outb(VGA_SEQ_INDEX, 0x00);
86: outb(VGA_SEQ_DATA, 0x03); /* Low order two bits are reset bits. */
87:
88: /* Load the CRTC registers. CRTC registers 0-7 are locked by a bit
89: * in register 0x11. We need to unlock these registers before we can
90: * start setting them. */
91: outb(VGA_CRTC_INDEX, 0x11);
92: outb(VGA_CRTC_DATA, 0x00); /* Unlocks registers 0-7. */
93: for (k = 0; k < VGA_CRTC_COUNT; k++) {
94: outb(VGA_CRTC_INDEX, k);
95: outb(VGA_CRTC_DATA, modeData->crtc[k]);
96: }
97:
98: /* Load the attribute registers. */
99: inb(VGA_INPUT_STATUS_1); /* Set the attribute flip-flop to "index" */
100: for (k = 0; k < VGA_ATTR_COUNT; k++) {
101: outb(VGA_ATTR_INDEX, k);
102: outb(VGA_ATTR_DATA, modeData->attr[k]);
103: }
104:
105: /* Load graphics registers. */
106: for (k = 0; k < VGA_GRFX_COUNT; k++) {
107: outb(VGA_GRFX_INDEX, k);
108: outb(VGA_GRFX_DATA, modeData->grfx[k]);
109: }
110:
111: /* Re-enable video. */
112: inb(VGA_INPUT_STATUS_1); /* Set the attribute flip-flop to "index" */
113: outb(VGA_ATTR_INDEX, 0x20); /* Give the palette back to the VGA */
114:
115: return 0;
116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.