BIOS console wrapped line at 79 characters. It became the issue after recent changes when extra column for scrolling indications was removed. The effect was that up/down arrows were printed in the first column of the next line.
May be it would be easier to simply use INT10 AH=13. Available documentation indicates that it is available since 1986, so I guess any system that exists today should implement it. Signed-off-by: Andrey Borzenkov <arvidj...@gmail.com> --- grub-core/term/i386/pc/console.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/grub-core/term/i386/pc/console.c b/grub-core/term/i386/pc/console.c index 2aa1943..358611a 100644 --- a/grub-core/term/i386/pc/console.c +++ b/grub-core/term/i386/pc/console.c @@ -86,13 +86,9 @@ grub_console_gotoxy (struct grub_term_output *term __attribute__ ((unused)), * Put the character C on the console. Because GRUB wants to write a * character with an attribute, this implementation is a bit tricky. * If C is a control character (CR, LF, BEL, BS), use INT 10, AH = 0Eh - * (TELETYPE OUTPUT). Otherwise, save the original position, put a space, - * save the current position, restore the original position, write the - * character and the attribute, and restore the current position. - * - * The reason why this is so complicated is that there is no easy way to - * get the height of the screen, and the TELETYPE OUTPUT BIOS call doesn't - * support setting a background attribute. + * (TELETYPE OUTPUT). Otherwise, use INT 10, AH = 9 to write character + * with attributes and advance cursor. If we are on the last column, + * let BIOS to wrap line correctly. */ static void grub_console_putchar_real (grub_uint8_t c) @@ -112,19 +108,18 @@ grub_console_putchar_real (grub_uint8_t c) /* get the current position */ pos = grub_console_getxy (NULL); + /* write the character with the attribute */ + int10_9 (c, 1); + /* check the column with the width */ if ((pos & 0xff00) >= (79 << 8)) { grub_console_putchar_real (0x0d); grub_console_putchar_real (0x0a); - /* get the current position */ - pos = grub_console_getxy (NULL); } + else + grub_console_gotoxy (NULL, ((pos & 0xff00) >> 8) + 1, (pos & 0xff)); - /* write the character with the attribute */ - int10_9 (c, 1); - - grub_console_gotoxy (NULL, ((pos & 0xff00) >> 8) + 1, (pos & 0xff)); } static void -- tg: (cc35b49..) u/console-last-column (depends on: master) _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel