https://git.reactos.org/?p=reactos.git;a=commitdiff;h=98c17d3120b66c6c9507474cb5c3db1ca7b36ed3

commit 98c17d3120b66c6c9507474cb5c3db1ca7b36ed3
Author:     Dmitry Borisov <[email protected]>
AuthorDate: Sun May 10 22:35:51 2020 +0600
Commit:     GitHub <[email protected]>
CommitDate: Sun May 10 18:35:51 2020 +0200

    [FREELDR] Add vertical screen scrolling for Xbox with console mode (#2745)
    
    Also turn off debug messages to screen before setting up the CPU (To print 
a character to the screen on some ports the MMIO access should be executed, so 
it throws an exception).
    
    CORE-16216
---
 boot/freeldr/freeldr/arch/i386/pc98/machpc98.c    |  1 +
 boot/freeldr/freeldr/arch/i386/xbox/machxbox.c    | 11 +++++++----
 boot/freeldr/freeldr/arch/i386/xbox/xboxcons.c    | 18 ++++++++++++++----
 boot/freeldr/freeldr/arch/i386/xbox/xboxvideo.c   | 20 +++++++++++++++++++-
 boot/freeldr/freeldr/include/arch/i386/machxbox.h |  1 +
 boot/freeldr/freeldr/include/debug.h              |  1 +
 boot/freeldr/freeldr/lib/debug.c                  |  6 ++++++
 7 files changed, 49 insertions(+), 9 deletions(-)

diff --git a/boot/freeldr/freeldr/arch/i386/pc98/machpc98.c 
b/boot/freeldr/freeldr/arch/i386/pc98/machpc98.c
index ca94ea54976..38ddf378378 100644
--- a/boot/freeldr/freeldr/arch/i386/pc98/machpc98.c
+++ b/boot/freeldr/freeldr/arch/i386/pc98/machpc98.c
@@ -37,6 +37,7 @@ Pc98PrepareForReactOS(VOID)
     Pc98DiskPrepareForReactOS();
     Pc98VideoPrepareForReactOS();
     DiskStopFloppyMotor();
+    DebugDisableScreenPort();
 }
 
 ULONG
diff --git a/boot/freeldr/freeldr/arch/i386/xbox/machxbox.c 
b/boot/freeldr/freeldr/arch/i386/xbox/machxbox.c
index b1ed4c94be0..3735f18982b 100644
--- a/boot/freeldr/freeldr/arch/i386/xbox/machxbox.c
+++ b/boot/freeldr/freeldr/arch/i386/xbox/machxbox.c
@@ -277,10 +277,6 @@ MachInit(const char *CmdLine)
     /* Set LEDs to red before anything is initialized */
     XboxSetLED("rrrr");
 
-    /* Initialize our stuff */
-    XboxMemInit();
-    XboxVideoInit();
-
     /* Setup vtbl */
     MachVtbl.ConsPutChar = XboxConsPutChar;
     MachVtbl.ConsKbHit = XboxConsKbHit;
@@ -311,6 +307,10 @@ MachInit(const char *CmdLine)
     MachVtbl.HwDetect = XboxHwDetect;
     MachVtbl.HwIdle = XboxHwIdle;
 
+    /* Initialize our stuff */
+    XboxMemInit();
+    XboxVideoInit();
+
     /* Set LEDs to orange after init */
     XboxSetLED("oooo");
 
@@ -324,6 +324,9 @@ XboxPrepareForReactOS(VOID)
     XboxVideoPrepareForReactOS();
     XboxDiskInit(FALSE);
     DiskStopFloppyMotor();
+    
+    /* Turn off debug messages to screen */
+    DebugDisableScreenPort();
 }
 
 /* EOF */
diff --git a/boot/freeldr/freeldr/arch/i386/xbox/xboxcons.c 
b/boot/freeldr/freeldr/arch/i386/xbox/xboxcons.c
index 8baba25b5cc..ed5d55c5b09 100644
--- a/boot/freeldr/freeldr/arch/i386/xbox/xboxcons.c
+++ b/boot/freeldr/freeldr/arch/i386/xbox/xboxcons.c
@@ -25,7 +25,17 @@ static unsigned CurrentAttr = 0x0f;
 VOID
 XboxConsPutChar(int c)
 {
-    ULONG Width, Unused;
+    ULONG Width, Height, Unused;
+    BOOLEAN NeedScroll;
+
+    XboxVideoGetDisplaySize(&Width, &Height, &Unused);
+
+    NeedScroll = (CurrentCursorY >= Height);
+    if (NeedScroll)
+    {
+        XboxVideoScrollUp();
+        --CurrentCursorY;
+    }
 
     if (c == '\r')
     {
@@ -34,7 +44,9 @@ XboxConsPutChar(int c)
     else if (c == '\n')
     {
         CurrentCursorX = 0;
-        CurrentCursorY++;
+
+        if (!NeedScroll)
+            ++CurrentCursorY;
     }
     else if (c == '\t')
     {
@@ -46,13 +58,11 @@ XboxConsPutChar(int c)
         CurrentCursorX++;
     }
 
-    XboxVideoGetDisplaySize(&Width, &Unused, &Unused);
     if (CurrentCursorX >= Width)
     {
         CurrentCursorX = 0;
         CurrentCursorY++;
     }
-    // FIXME: Implement vertical screen scrolling if we are at the end of the 
screen.
 }
 
 BOOLEAN
diff --git a/boot/freeldr/freeldr/arch/i386/xbox/xboxvideo.c 
b/boot/freeldr/freeldr/arch/i386/xbox/xboxvideo.c
index 261f4550664..0d6e3b2c70b 100644
--- a/boot/freeldr/freeldr/arch/i386/xbox/xboxvideo.c
+++ b/boot/freeldr/freeldr/arch/i386/xbox/xboxvideo.c
@@ -20,8 +20,8 @@
  */
 
 #include <freeldr.h>
-#include <debug.h>
 
+#include <debug.h>
 DBG_DEFAULT_CHANNEL(UI);
 
 PVOID FrameBuffer;
@@ -101,6 +101,24 @@ XboxVideoClearScreenColor(ULONG Color, BOOLEAN FullScreen)
     }
 }
 
+VOID
+XboxVideoScrollUp(VOID)
+{
+    ULONG BgColor, Dummy;
+    ULONG PixelCount = ScreenWidth * CHAR_HEIGHT *
+                       (((ScreenHeight - 2 * TOP_BOTTOM_LINES) / CHAR_HEIGHT) 
- 1);
+    PULONG Src = (PULONG)((PUCHAR)FrameBuffer + (CHAR_HEIGHT + 
TOP_BOTTOM_LINES) * Delta);
+    PULONG Dst = (PULONG)((PUCHAR)FrameBuffer + TOP_BOTTOM_LINES * Delta);
+
+    XboxVideoAttrToColors(ATTR(COLOR_WHITE, COLOR_BLACK), &Dummy, &BgColor);
+
+    while (PixelCount--)
+        *Dst++ = *Src++;
+
+    for (PixelCount = 0; PixelCount < ScreenWidth * CHAR_HEIGHT; PixelCount++)
+        *Dst++ = BgColor;
+}
+
 VOID
 XboxVideoClearScreen(UCHAR Attr)
 {
diff --git a/boot/freeldr/freeldr/include/arch/i386/machxbox.h 
b/boot/freeldr/freeldr/include/arch/i386/machxbox.h
index 3f41e848666..d4342de4a0f 100644
--- a/boot/freeldr/freeldr/include/arch/i386/machxbox.h
+++ b/boot/freeldr/freeldr/include/arch/i386/machxbox.h
@@ -69,6 +69,7 @@ VOID XboxVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR 
Green, UCHAR Blue);
 VOID XboxVideoGetPaletteColor(UCHAR Color, UCHAR* Red, UCHAR* Green, UCHAR* 
Blue);
 VOID XboxVideoSync(VOID);
 VOID XboxVideoPrepareForReactOS(VOID);
+VOID XboxVideoScrollUp(VOID);
 VOID XboxPrepareForReactOS(VOID);
 
 VOID XboxMemInit(VOID);
diff --git a/boot/freeldr/freeldr/include/debug.h 
b/boot/freeldr/freeldr/include/debug.h
index 1862220fb82..3ab9392b28e 100644
--- a/boot/freeldr/freeldr/include/debug.h
+++ b/boot/freeldr/freeldr/include/debug.h
@@ -44,6 +44,7 @@
     ULONG   DbgPrint(const char *Format, ...);
     VOID    DbgPrint2(ULONG Mask, ULONG Level, const char *File, ULONG Line, 
char *Format, ...);
     VOID    DebugDumpBuffer(ULONG Mask, PVOID Buffer, ULONG Length);
+    VOID    DebugDisableScreenPort();
     VOID    DbgParseDebugChannels(PCHAR Value);
 
     #define ERR_LEVEL      0x1
diff --git a/boot/freeldr/freeldr/lib/debug.c b/boot/freeldr/freeldr/lib/debug.c
index abc2545f7ea..e68df9af9cf 100644
--- a/boot/freeldr/freeldr/lib/debug.c
+++ b/boot/freeldr/freeldr/lib/debug.c
@@ -327,6 +327,12 @@ DebugDumpBuffer(ULONG Mask, PVOID Buffer, ULONG Length)
     }
 }
 
+VOID
+DebugDisableScreenPort(VOID)
+{
+    DebugPort &= ~SCREEN;
+}
+
 static BOOLEAN
 DbgAddDebugChannel(CHAR* channel, CHAR* level, CHAR op)
 {

Reply via email to