Commit 09e2ac30 authored by Richard M. Stallman's avatar Richard M. Stallman

(output_string): New function.

(internal_flush): Use output_string for faster screen update.
(internal_flush): Clear to end of line by writing a string of spaces.
parent 21b16c1f
...@@ -809,6 +809,35 @@ do_visible_bell (xorattr) ...@@ -809,6 +809,35 @@ do_visible_bell (xorattr)
popl %eax"); popl %eax");
} }
/* At screen position (X,Y), output C characters from string S with
attribute A. Do it fast! */
static void
output_string (x, y, s, c, a)
int x, y, c;
unsigned char *s;
unsigned char a;
{
char *t = (char *)ScreenPrimary + 2 * (x + ScreenCols () * y);
asm volatile
(" movl %1,%%eax
call dosmemsetup
movl %%eax,%%edi
movb %0,%%ah
movl %2,%%ecx
movl %3,%%esi
output_string1:
movb (%%esi),%%al
movw %%ax,%%gs:(%%edi)
addl $2,%%edi
incl %%esi
decl %%ecx
jne output_string1"
: /* no output */
: "m" (a), "g" (t), "g" (c), "g" (s)
: "%eax", "%ecx", /* "%gs",*/ "%esi", "%edi");
}
static int internal_terminal = 0; static int internal_terminal = 0;
#undef fflush #undef fflush
...@@ -816,10 +845,11 @@ int ...@@ -816,10 +845,11 @@ int
internal_flush (f) internal_flush (f)
FILE *f; FILE *f;
{ {
static char spaces[] = " ";
static int x; static int x;
static int y; static int y;
char c, *cp; unsigned char *cp, *cp0;
int count, i; int count, i, j;
if (internal_terminal && f == stdout) if (internal_terminal && f == stdout)
{ {
...@@ -828,7 +858,7 @@ internal_flush (f) ...@@ -828,7 +858,7 @@ internal_flush (f)
count = stdout->_ptr - stdout->_base; count = stdout->_ptr - stdout->_base;
while (count > 0) while (count > 0)
{ {
switch (c = *cp++) switch (*cp++)
{ {
case 27: case 27:
switch (*cp++) switch (*cp++)
...@@ -852,8 +882,17 @@ internal_flush (f) ...@@ -852,8 +882,17 @@ internal_flush (f)
count -= 2; count -= 2;
break; break;
case 'E': case 'E':
for (i = ScreenCols () - 1; i >= x; i--) i = ScreenCols () - x;
ScreenPutChar (' ', ScreenAttrib, i, y); j = x;
while (i >= sizeof spaces)
{
output_string (j, y, spaces, sizeof spaces,
ScreenAttrib);
j += sizeof spaces;
i -= sizeof spaces;
}
if (i > 0)
output_string (j, y, spaces, i, ScreenAttrib);
count -= 2; count -= 2;
break; break;
case 'R': case 'R':
...@@ -889,8 +928,12 @@ internal_flush (f) ...@@ -889,8 +928,12 @@ internal_flush (f)
count--; count--;
break; break;
default: default:
ScreenPutChar (c, ScreenAttrib, x++, y); cp0 = cp - 1;
count--; count--;
while (count > 0 && *cp >= ' ')
cp++, count--;
output_string (x, y, cp0, cp - cp0, ScreenAttrib);
x += (cp - cp0);
} }
} }
fpurge (stdout); fpurge (stdout);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment