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,  <[email protected]> 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/vga.c?rev=52409&r1=52408&r2=52409&view=diff
> ==============================================================================
> --- 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=52409&r1=52408&r2=52409&view=diff
> ==============================================================================
> --- 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=52409&r1=52408&r2=52409&view=diff
> ==============================================================================
> --- 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
>
>
>

_______________________________________________
Ros-dev mailing list
[email protected]
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to