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.
19 /* $Id: display.c,v 1.4 2002/09/08 10:22:24 chorns Exp $
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;