3 * Copyright (C) 1998, 1999, 2000, 2001, 2002 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * COPYRIGHT: See COPYING in the top level directory
22 * PROJECT: ReactOS kernel
23 * FILE: ntoskrnl/hal/x86/display.c
24 * PURPOSE: Blue screen display
25 * PROGRAMMER: Eric Kohl (ekohl@rz-online.de)
30 #include <ddk/ntddk.h>
33 #define SCREEN_SYNCHRONIZATION
36 #define CRTC_COMMAND 0x3d4
37 #define CRTC_DATA 0x3d5
39 #define CRTC_COLUMNS 0x01
40 #define CRTC_OVERFLOW 0x07
41 #define CRTC_ROWS 0x12
42 #define CRTC_SCANLINES 0x09
44 #define CRTC_CURHI 0x0e
45 #define CRTC_CURLO 0x0f
48 #define CHAR_ATTRIBUTE 0x17 /* grey on blue */
51 /* VARIABLES ****************************************************************/
53 static ULONG CursorX = 0; /* Cursor Position */
54 static ULONG CursorY = 0;
55 static ULONG SizeX = 80; /* Display size */
56 static ULONG SizeY = 25;
58 static BOOLEAN DisplayInitialized = FALSE;
59 static BOOLEAN HalOwnsDisplay = TRUE;
61 static WORD *VideoBuffer = NULL;
63 static PHAL_RESET_DISPLAY_PARAMETERS HalResetDisplayParameters = NULL;
66 /* STATIC FUNCTIONS *********************************************************/
69 HalClearDisplay (VOID)
71 WORD *ptr = (WORD*)VideoBuffer;
74 for (i = 0; i < SizeX * SizeY; i++, ptr++)
75 *ptr = ((CHAR_ATTRIBUTE << 8) + ' ');
83 HalScrollDisplay (VOID)
88 ptr = VideoBuffer + SizeX;
89 RtlMoveMemory(VideoBuffer,
91 SizeX * (SizeY - 1) * 2);
93 ptr = VideoBuffer + (SizeX * (SizeY - 1));
94 for (i = 0; i < SizeX; i++, ptr++)
96 *ptr = (CHAR_ATTRIBUTE << 8) + ' ';
102 HalPutCharacter (CHAR Character)
106 ptr = VideoBuffer + ((CursorY * SizeX) + CursorX);
107 *ptr = (CHAR_ATTRIBUTE << 8) + Character;
111 /* PRIVATE FUNCTIONS ********************************************************/
114 HalInitializeDisplay (PLOADER_PARAMETER_BLOCK LoaderBlock)
116 * FUNCTION: Initalize the display
118 * InitParameters = Parameters setup by the boot loader
121 if (DisplayInitialized == FALSE)
126 VideoBuffer = (WORD *)(0xd0000000 + 0xb8000);
127 // VideoBuffer = HalMapPhysicalMemory (0xb8000, 2);
129 /* Set cursor position */
130 // CursorX = LoaderBlock->cursorx;
131 // CursorY = LoaderBlock->cursory;
135 /* read screen size from the crtc */
136 /* FIXME: screen size should be read from the boot parameters */
137 WRITE_PORT_UCHAR((PUCHAR)CRTC_COMMAND, CRTC_COLUMNS);
138 SizeX = READ_PORT_UCHAR((PUCHAR)CRTC_DATA) + 1;
139 WRITE_PORT_UCHAR((PUCHAR)CRTC_COMMAND, CRTC_ROWS);
140 SizeY = READ_PORT_UCHAR((PUCHAR)CRTC_DATA);
141 WRITE_PORT_UCHAR((PUCHAR)CRTC_COMMAND, CRTC_OVERFLOW);
142 Data = READ_PORT_UCHAR((PUCHAR)CRTC_DATA);
143 SizeY |= (((Data & 0x02) << 7) | ((Data & 0x40) << 3));
145 WRITE_PORT_UCHAR((PUCHAR)CRTC_COMMAND, CRTC_SCANLINES);
146 ScanLines = (READ_PORT_UCHAR((PUCHAR)CRTC_DATA) & 0x1F) + 1;
147 SizeY = SizeY / ScanLines;
154 DisplayInitialized = TRUE;
160 HalResetDisplay(VOID)
162 * FUNCTION: Reset the display
167 if (HalResetDisplayParameters == NULL)
170 if (HalOwnsDisplay == TRUE)
173 if (HalResetDisplayParameters(SizeX, SizeY) == TRUE)
175 HalOwnsDisplay = TRUE;
181 /* PUBLIC FUNCTIONS *********************************************************/
184 HalAcquireDisplayOwnership(IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters)
188 * ResetDisplayParameters = Pointer to a driver specific
192 HalOwnsDisplay = FALSE;
193 HalResetDisplayParameters = ResetDisplayParameters;
198 HalDisplayString(IN PCH String)
200 * FUNCTION: Switches the screen to HAL console mode (BSOD) if not there
201 * already and displays a string
203 * string = ASCII string to display
204 * NOTE: Use with care because there is no support for returning from BSOD
209 #ifdef SCREEN_SYNCHRONIZATION
212 static KSPIN_LOCK Lock;
219 KeAcquireSpinLockAtDpcLevel(&Lock);
221 if (HalOwnsDisplay == FALSE)
226 #ifdef SCREEN_SYNCHRONIZATION
227 WRITE_PORT_UCHAR((PUCHAR)CRTC_COMMAND, CRTC_CURHI);
228 offset = READ_PORT_UCHAR((PUCHAR)CRTC_DATA)<<8;
229 WRITE_PORT_UCHAR((PUCHAR)CRTC_COMMAND, CRTC_CURLO);
230 offset += READ_PORT_UCHAR((PUCHAR)CRTC_DATA);
232 CursorY = offset / SizeX;
233 CursorX = offset % SizeX;
243 else if (*pch != '\r')
245 HalPutCharacter (*pch);
248 if (CursorX >= SizeX)
255 if (CursorY >= SizeY)
264 #ifdef SCREEN_SYNCHRONIZATION
265 offset = (CursorY * SizeX) + CursorX;
267 WRITE_PORT_UCHAR((PUCHAR)CRTC_COMMAND, CRTC_CURLO);
268 WRITE_PORT_UCHAR((PUCHAR)CRTC_DATA, offset & 0xff);
269 WRITE_PORT_UCHAR((PUCHAR)CRTC_COMMAND, CRTC_CURHI);
270 WRITE_PORT_UCHAR((PUCHAR)CRTC_DATA, (offset >> 8) & 0xff);
272 KeReleaseSpinLockFromDpcLevel(&Lock);
278 HalQueryDisplayParameters(OUT PULONG DispSizeX,
279 OUT PULONG DispSizeY,
280 OUT PULONG CursorPosX,
281 OUT PULONG CursorPosY)
288 *CursorPosX = CursorX;
290 *CursorPosY = CursorY;
295 HalSetDisplayParameters(IN ULONG CursorPosX,
298 CursorX = (CursorPosX < SizeX) ? CursorPosX : SizeX - 1;
299 CursorY = (CursorPosY < SizeY) ? CursorPosY : SizeY - 1;