Dear Rafal,
Since you are touching the code of /ntoskrnl/kd/kdio.c, wouldn't you be kind enough to review and possibly apply my "dmesg command patch"? Issue in bugzilla: http://www.reactos.org/bugzilla/show_bug.cgi?id=6018 patch itself: http://www.reactos.org/bugzilla/attachment.cgi?id=6055
It contains much of code of KdbpPrint() function, in function KdbpPager(), etc. The is explanations about it in issue description.
*** To all: This patch is suspended in bugzilla from March, although I noticed some weak attempts to do something with it, say reassign to somebody, but yet without any advance.
Hope something will be changed with this.
Thanks for attention
-Minas Abrahamyan
On Wed, Jun 22, 2011 at 12:47 AM, rharabien@svn.reactos.org wrote:
Author: rharabien Date: Tue Jun 21 19:47:13 2011 New Revision: 52409
URL: http://svn.reactos.org/svn/reactos?rev=52409&view=rev Log: [BOOTVID]
- Revert part of r52239: Fix support for \r and do not handle backspace
- Simplify it a bit
[NTOSKRNL]
- Add backspace support to KdpScreenPrint
- Do not draw boot text bitmap if InbvDisplayString is called with "" or "." (matches NT behavior)
Modified: trunk/reactos/drivers/base/bootvid/i386/vga.c trunk/reactos/ntoskrnl/inbv/inbv.c trunk/reactos/ntoskrnl/kd/kdio.c
Modified: trunk/reactos/drivers/base/bootvid/i386/vga.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/base/bootvid/i386/v... ============================================================================== --- trunk/reactos/drivers/base/bootvid/i386/vga.c [iso-8859-1] (original) +++ trunk/reactos/drivers/base/bootvid/i386/vga.c [iso-8859-1] Tue Jun 21 19:47:13 2011 @@ -66,6 +66,7 @@ ULONG TextColor = 0xF; ULONG curr_x = 0; ULONG curr_y = 0; +BOOLEAN CarriageReturn = FALSE; ULONG_PTR VgaRegisterBase = 0; ULONG_PTR VgaBase = 0;
@@ -279,14 +280,8 @@ NTAPI VgaScroll(ULONG Scroll) {
- ULONG Top;
- ULONG SourceOffset, DestOffset;
- ULONG Offset;
- ULONG i, j;
- /* Set memory positions of the scroll */
- SourceOffset = VgaBase + (ScrollRegion[1] * 80) + (ScrollRegion[0] >> 3);
- DestOffset = SourceOffset + (Scroll * 80);
- ULONG Top, RowSize, i;
- PUCHAR OldPosition, NewPosition;
/* Clear the 4 planes */ __outpw(0x3C4, 0xF02); @@ -296,56 +291,27 @@
/* Set Mode 1 */ ReadWriteMode(1);
- /* Save top and check if it's above the bottom */
- Top = ScrollRegion[1];
- if (Top > ScrollRegion[3]) return;
- RowSize = (ScrollRegion[2] - ScrollRegion[0] + 1) / 8;
/* Start loop */
- do
- {
- /* Set number of bytes to loop and start offset */
- Offset = ScrollRegion[0] >> 3;
- j = SourceOffset;
- /* Check if this is part of the scroll region */
- if (Offset <= (ScrollRegion[2] >> 3))
- {
- /* Update position */
- i = DestOffset - SourceOffset;
- /* Loop the X axis */
- do
- {
- /* Write value in the new position so that we can do the scroll */
- WRITE_REGISTER_UCHAR(UlongToPtr(j),
- READ_REGISTER_UCHAR(UlongToPtr(j + i)));
- /* Move to the next memory location to write to */
- j++;
- /* Move to the next byte in the region */
- Offset++;
- /* Make sure we don't go past the scroll region */
- } while (Offset <= (ScrollRegion[2] >> 3));
- }
- /* Move to the next line */
- SourceOffset += 80;
- DestOffset += 80;
- /* Increase top */
- Top++;
- /* Make sure we don't go past the scroll region */
- } while (Top <= ScrollRegion[3]);
- for(Top = ScrollRegion[1]; Top <= ScrollRegion[3]; ++Top)
- {
- /* Calculate the position in memory for the row */
- OldPosition = (PUCHAR)VgaBase + (Top + Scroll) * 80 + ScrollRegion[0] / 8;
- NewPosition = (PUCHAR)VgaBase + Top * 80 + ScrollRegion[0] / 8;
- /* Scroll the row */
- for(i = 0; i < RowSize; ++i)
- WRITE_REGISTER_UCHAR(NewPosition + i, READ_REGISTER_UCHAR(OldPosition + i));
- }
}
VOID NTAPI PreserveRow(IN ULONG CurrentTop,
- IN ULONG TopDelta)
- IN ULONG TopDelta,
- IN BOOLEAN Direction)
{ PUCHAR Position1, Position2; ULONG Count; @@ -359,9 +325,19 @@ /* Set Mode 1 */ ReadWriteMode(1);
- /* Calculate the position in memory for the row */
- Position1 = (PUCHAR)VgaBase + 0x9600;
- Position2 = (PUCHAR)VgaBase + CurrentTop * 80;
- /* Check which way we're preserving */
- if (Direction)
- {
- /* Calculate the position in memory for the row */
- Position1 = (PUCHAR)VgaBase + CurrentTop * 80;
- Position2 = (PUCHAR)VgaBase + 0x9600;
- }
- else
- {
- /* Calculate the position in memory for the row */
- Position1 = (PUCHAR)VgaBase + 0x9600;
- Position2 = (PUCHAR)VgaBase + CurrentTop * 80;
- }
/* Set the count and make sure it's above 0 */ Count = TopDelta * 80; @@ -378,33 +354,6 @@ Position1++; } while (--Count); } -}
-VOID -NTAPI -CleanCharacter(IN ULONG Left,
- IN ULONG Top,
- IN ULONG TopDelta)
-{
- PUCHAR Position1, Position2;
- ULONG i;
- /* Clear the 4 planes */
- __outpw(0x3C4, 0xF02);
- /* Set the bitmask to 0xFF for all 4 planes */
- __outpw(0x3CE, 0xFF08);
- /* Set Mode 1 */
- ReadWriteMode(1);
- /* Calculate the position in memory for the character */
- Position1 = (PUCHAR)VgaBase + 0x9600 + Left / 8;
- Position2 = (PUCHAR)VgaBase + Top * 80 + Left / 8;
- /* Copy data from preserved row */
- for(i = 0; i < TopDelta; ++i)
- WRITE_REGISTER_UCHAR(Position2 + i * 80, READ_REGISTER_UCHAR(Position1));
}
VOID @@ -772,35 +721,34 @@ } else {
- /* Preserve the current row */
- PreserveRow(curr_y, TopDelta);
- /* Preserve row */
- PreserveRow(curr_y, TopDelta, FALSE);
}
/* Update current X */ curr_x = ScrollRegion[0];
- /* Do not clear line if "\r\n" is given */
- CarriageReturn = FALSE;
} else if (*String == '\r') { /* Update current X */ curr_x = ScrollRegion[0];
- }
- else if (*String == '\b')
- {
- /* Update current X */
- if (curr_x > ScrollRegion[0])
- curr_x -= 8;
- else
- {
- /* We are at line begin - move to previous row */
- curr_x = ScrollRegion[0];
- curr_y -= TopDelta;
- /* Check if we're being followed by a new line */
- CarriageReturn = TRUE;
- }
- else
- {
- /* check if we had a '\r' last time */
- if (CarriageReturn)
- {
- /* We did, clear the current row */
- PreserveRow(curr_y, TopDelta, TRUE);
- CarriageReturn = FALSE;
}
- /* Clean current character */
- CleanCharacter(curr_x, curr_y, TopDelta);
- }
- else
- {
/* Display this character */ DisplayCharacter(*String, curr_x, curr_y, TextColor, 16); curr_x += 8; @@ -819,7 +767,7 @@ else { /* Preserve the current row */
- PreserveRow(curr_y, TopDelta);
- PreserveRow(curr_y, TopDelta, FALSE);
}
/* Update X */
Modified: trunk/reactos/ntoskrnl/inbv/inbv.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/inbv/inbv.c?rev=52... ============================================================================== --- trunk/reactos/ntoskrnl/inbv/inbv.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/inbv/inbv.c [iso-8859-1] Tue Jun 21 19:47:13 2011 @@ -717,11 +717,15 @@ INIT_FUNCTION DisplayFilter(PCHAR *String) {
- /* Remove the filter */
- InbvInstallDisplayStringFilter(NULL);
- /* Draw text screen */
- DisplayBootBitmap(TRUE);
- /* Ignore empty and "." strings */
- if(*String && strcmp(String, ".") != 0)
- {
- /* Remove the filter */
- InbvInstallDisplayStringFilter(NULL);
- /* Draw text screen */
- DisplayBootBitmap(TRUE);
- }
}
VOID
Modified: trunk/reactos/ntoskrnl/kd/kdio.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kd/kdio.c?rev=5240... ============================================================================== --- trunk/reactos/ntoskrnl/kd/kdio.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/kd/kdio.c [iso-8859-1] Tue Jun 21 19:47:13 2011 @@ -28,6 +28,10 @@
/* Current Port in use. FIXME: Do we support more then one? */ ULONG KdpPort;
+#define KdpScreenLineLenght 80 +CHAR KdpScreenLineBuffer[KdpScreenLineLenght + 1] = ""; +ULONG KdpScreenLineBufferPos = 0, KdpScreenLineLength = 0;
/* DEBUG LOG FUNCTIONS *******************************************************/
@@ -316,8 +320,50 @@ KdpScreenPrint(LPSTR Message, ULONG Length) {
- /* Call HAL */
- HalDisplayString(Message);
- PCHAR pch = (PCHAR) Message;
- while (*pch)
- {
- if(*pch == '\b')
- {
- /* HalDisplayString does not support '\b'. Workaround it and use '\r' */
- if(KdpScreenLineLength > 0)
- {
- /* Remove last character from buffer */
- KdpScreenLineBuffer[--KdpScreenLineLength] = '\0';
- KdpScreenLineBufferPos = KdpScreenLineLength;
- /* Clear row and print line again */
- HalDisplayString("\r");
- HalDisplayString(KdpScreenLineBuffer);
- }
- }
- else
- {
- KdpScreenLineBuffer[KdpScreenLineLength++] = *pch;
- KdpScreenLineBuffer[KdpScreenLineLength] = '\0';
- }
- if(*pch == '\n' || KdpScreenLineLength == KdpScreenLineLenght)
- {
- /* Print buffered characters */
- if(KdpScreenLineBufferPos != KdpScreenLineLength)
- HalDisplayString(KdpScreenLineBuffer + KdpScreenLineBufferPos);
- /* Clear line buffer */
- KdpScreenLineBuffer[0] = '\0';
- KdpScreenLineLength = KdpScreenLineBufferPos = 0;
- }
- ++pch;
- }
- /* Print buffered characters */
- if(KdpScreenLineBufferPos != KdpScreenLineLength)
- {
- HalDisplayString(KdpScreenLineBuffer + KdpScreenLineBufferPos);
- KdpScreenLineBufferPos = KdpScreenLineLength;
- }
}
VOID