set most of trunk svn property eol-style:native
[reactos.git] / reactos / drivers / base / bootvid / vid_vgatext.c
1 /*
2 * ReactOS Boot video driver
3 *
4 * Copyright (C) 2005 Filip Navara
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21 /* INCLUDES ******************************************************************/
22
23 #include "bootvid.h"
24 #define NDEBUG
25 #include <debug.h>
26
27 /* TYPES AND DEFINITIONS *****************************************************/
28
29 /* VGA registers */
30 #define MISC (PUCHAR)0x3c2
31 #define SEQ (PUCHAR)0x3c4
32 #define SEQDATA (PUCHAR)0x3c5
33 #define CRTC (PUCHAR)0x3d4
34 #define CRTCDATA (PUCHAR)0x3d5
35 #define GRAPHICS (PUCHAR)0x3ce
36 #define GRAPHICSDATA (PUCHAR)0x3cf
37 #define ATTRIB (PUCHAR)0x3c0
38 #define STATUS (PUCHAR)0x3da
39 #define PELMASK (PUCHAR)0x3c6
40 #define PELINDEX (PUCHAR)0x3c8
41 #define PELDATA (PUCHAR)0x3c9
42
43 #define CRTC_COLUMNS 0x01
44 #define CRTC_OVERFLOW 0x07
45 #define CRTC_ROWS 0x12
46 #define CRTC_SCANLINES 0x09
47 #define CRTC_CURHI 0x0e
48 #define CRTC_CURLO 0x0f
49
50 #define CHAR_ATTRIBUTE_BLACK 0x00 /* black on black */
51 #define CHAR_ATTRIBUTE 0x1F /* grey on blue */
52
53 /* GLOBALS *******************************************************************/
54
55 static BOOLEAN VidpInitialized = FALSE;
56 static PUCHAR VidpMemory;
57 static ULONG SizeX, SizeY;
58
59 /* FUNCTIONS *****************************************************************/
60
61 static VOID NTAPI
62 VidpVgaTextClearDisplay(VOID)
63 {
64 volatile WORD *ptr = (volatile WORD*)VidpMemory;
65 ULONG i;
66
67 for (i = 0; i < SizeX * SizeY; i++, ptr++)
68 *ptr = (0x1700 + ' ');
69 }
70
71 static BOOLEAN NTAPI
72 VidVgaTextInitialize(
73 IN BOOLEAN SetMode)
74 {
75 ULONG ScanLines;
76 PHYSICAL_ADDRESS PhysicalAddress;
77 UCHAR Data;
78
79 if (!VidpInitialized)
80 {
81 PhysicalAddress.QuadPart = 0xB8000;
82 VidpMemory = MmMapIoSpace(PhysicalAddress, 0x2000, MmNonCached);
83 if (VidpMemory == NULL)
84 return FALSE;
85 VidpInitialized = TRUE;
86
87 WRITE_PORT_UCHAR(CRTC, CRTC_COLUMNS);
88 SizeX = READ_PORT_UCHAR(CRTCDATA) + 1;
89 WRITE_PORT_UCHAR(CRTC, CRTC_ROWS);
90 SizeY = READ_PORT_UCHAR(CRTCDATA);
91 WRITE_PORT_UCHAR(CRTC, CRTC_OVERFLOW);
92 Data = READ_PORT_UCHAR(CRTCDATA);
93 SizeY |= (((Data & 0x02) << 7) | ((Data & 0x40) << 3));
94 SizeY++;
95 WRITE_PORT_UCHAR(CRTC, CRTC_SCANLINES);
96 ScanLines = (READ_PORT_UCHAR(CRTCDATA) & 0x1F) + 1;
97 SizeY = SizeY / ScanLines;
98
99 VidpVgaTextClearDisplay();
100
101 WRITE_PORT_UCHAR(CRTC, CRTC_CURLO);
102 WRITE_PORT_UCHAR(CRTCDATA, 0);
103 WRITE_PORT_UCHAR(CRTC, CRTC_CURHI);
104 WRITE_PORT_UCHAR(CRTCDATA, 0);
105 }
106
107 return TRUE;
108 }
109
110 static VOID NTAPI
111 VidVgaTextResetDisplay(VOID)
112 {
113 VidVgaTextInitialize(TRUE);
114 }
115
116 static VOID NTAPI
117 VidVgaTextCleanUp(VOID)
118 {
119 if (VidpInitialized)
120 {
121 MmUnmapIoSpace(VidpMemory, 0x10000);
122 VidpInitialized = FALSE;
123 }
124 }
125
126 static VOID NTAPI
127 VidVgaTextBufferToScreenBlt(
128 IN PUCHAR Buffer,
129 IN ULONG Left,
130 IN ULONG Top,
131 IN ULONG Width,
132 IN ULONG Height,
133 IN ULONG Delta)
134 {
135 }
136
137 static VOID NTAPI
138 VidVgaTextScreenToBufferBlt(
139 OUT PUCHAR Buffer,
140 IN ULONG Left,
141 IN ULONG Top,
142 IN ULONG Width,
143 IN ULONG Height,
144 IN LONG Delta)
145 {
146 }
147
148 static VOID NTAPI
149 VidVgaTextBitBlt(
150 IN PUCHAR Buffer,
151 IN ULONG Left,
152 IN ULONG Top)
153 {
154 }
155
156 static VOID NTAPI
157 VidVgaTextSolidColorFill(
158 IN ULONG Left,
159 IN ULONG Top,
160 IN ULONG Right,
161 IN ULONG Bottom,
162 IN ULONG Color)
163 {
164 }
165
166 static VOID NTAPI
167 VidpVgaTextScrollDisplay(VOID)
168 {
169 volatile USHORT *ptr;
170 int i;
171
172 RtlMoveMemory(VidpMemory, (PUSHORT)VidpMemory + SizeX, SizeX * (SizeY - 1) * 2);
173
174 ptr = (volatile USHORT *)VidpMemory + (SizeX * (SizeY - 1));
175 for (i = 0; i < (int)SizeX; i++, ptr++)
176 *ptr = (CHAR_ATTRIBUTE << 8) + ' ';
177 }
178
179 static VOID NTAPI
180 VidVgaTextDisplayString(
181 IN PCSTR String)
182 {
183 PCSTR pch;
184 int offset;
185 ULONG CursorX;
186 ULONG CursorY;
187
188 pch = String;
189
190 WRITE_PORT_UCHAR(CRTC, CRTC_CURHI);
191 offset = READ_PORT_UCHAR(CRTCDATA) << 8;
192 WRITE_PORT_UCHAR(CRTC, CRTC_CURLO);
193 offset += READ_PORT_UCHAR(CRTCDATA);
194
195 CursorY = offset / SizeX;
196 CursorX = offset % SizeX;
197
198 while (*pch != 0)
199 {
200 if (*pch == '\n')
201 {
202 CursorY++;
203 CursorX = 0;
204 }
205 else if (*pch == '\b')
206 {
207 if (CursorX > 0)
208 CursorX--;
209 }
210 else if (*pch != '\r')
211 {
212 volatile USHORT *ptr;
213
214 ptr = (volatile USHORT *)VidpMemory + ((CursorY * SizeX) + CursorX);
215 *ptr = (CHAR_ATTRIBUTE << 8) + *pch;
216 CursorX++;
217
218 if (CursorX >= SizeX)
219 {
220 CursorY++;
221 CursorX = 0;
222 }
223 }
224
225 if (CursorY >= SizeY)
226 {
227 VidpVgaTextScrollDisplay();
228 CursorY = SizeY - 1;
229 }
230
231 pch++;
232 }
233
234 offset = (CursorY * SizeX) + CursorX;
235 WRITE_PORT_UCHAR(CRTC, CRTC_CURLO);
236 WRITE_PORT_UCHAR(CRTCDATA, (UCHAR)(offset & 0xff));
237 WRITE_PORT_UCHAR(CRTC, CRTC_CURHI);
238 WRITE_PORT_UCHAR(CRTCDATA, (UCHAR)((offset >> 8) & 0xff));
239 }
240
241 VID_FUNCTION_TABLE VidVgaTextTable = {
242 VidVgaTextInitialize,
243 VidVgaTextCleanUp,
244 VidVgaTextResetDisplay,
245 VidVgaTextBufferToScreenBlt,
246 VidVgaTextScreenToBufferBlt,
247 VidVgaTextBitBlt,
248 VidVgaTextSolidColorFill,
249 VidVgaTextDisplayString
250 };