Use faster method to write to VGA

This commit is contained in:
Ray Chason
2019-09-12 23:04:15 -04:00
parent 1a97dce727
commit d5104c622f
2 changed files with 63 additions and 54 deletions

View File

@@ -44,6 +44,7 @@
#define READ_ABSOLUTE_WORD(x) *(x) #define READ_ABSOLUTE_WORD(x) *(x)
#define WRITE_ABSOLUTE(x, y) *(x) = (y) #define WRITE_ABSOLUTE(x, y) *(x) = (y)
#define WRITE_ABSOLUTE_WORD(x, y) *(x) = (y) #define WRITE_ABSOLUTE_WORD(x, y) *(x) = (y)
#define WRITE_ABSOLUTE_DWORD(x, y) *(x) = (y)
#endif #endif
#if defined(__GO32__) || defined(__DJGPP__) #if defined(__GO32__) || defined(__DJGPP__)
@@ -57,6 +58,8 @@
_farpokeb(_go32_conventional_mem_selector(), (unsigned) x, (y)) _farpokeb(_go32_conventional_mem_selector(), (unsigned) x, (y))
#define WRITE_ABSOLUTE_WORD(x, y) \ #define WRITE_ABSOLUTE_WORD(x, y) \
_farpokew(_go32_conventional_mem_selector(), (unsigned) x, (y)) _farpokew(_go32_conventional_mem_selector(), (unsigned) x, (y))
#define WRITE_ABSOLUTE_DWORD(x, y) \
_farpokel(_go32_conventional_mem_selector(), (unsigned) x, (y))
#endif #endif
#ifdef OBSOLETE /* old djgpp V1.x way of mapping 1st MB */ #ifdef OBSOLETE /* old djgpp V1.x way of mapping 1st MB */
@@ -66,6 +69,7 @@
#define READ_ABSOLUTE_WORD(x) *(x) #define READ_ABSOLUTE_WORD(x) *(x)
#define WRITE_ABSOLUTE(x, y) *(x) = (y) #define WRITE_ABSOLUTE(x, y) *(x) = (y)
#define WRITE_ABSOLUTE_WORD(x, y) *(x) = (y) #define WRITE_ABSOLUTE_WORD(x, y) *(x) = (y)
#define WRITE_ABSOLUTE_DWORD(x, y) *(x) = (y)
#endif #endif
#endif /* MK_PTR */ #endif /* MK_PTR */

View File

@@ -231,25 +231,20 @@ void
vga_clear_screen(colour) vga_clear_screen(colour)
int colour; int colour;
{ {
char __far *pch; unsigned long __far *pch;
int y, j; unsigned j;
char volatile a;
outportb(0x3ce, 5); egawriteplane(colour);
outportb(0x3cf, 2); pch = (unsigned long __far *) screentable[0];
for (j = 0; j < SCREENHEIGHT * SCREENBYTES / 4; ++j) {
for (y = 0; y < SCREENHEIGHT; ++y) { WRITE_ABSOLUTE_DWORD(&pch[j], 0xFFFFFFFF);
pch = screentable[y];
for (j = 0; j < SCREENBYTES; ++j) {
outportb(0x3ce, 8);
outportb(0x3cf, 255);
a = READ_ABSOLUTE(pch); /* Must read , then write */
WRITE_ABSOLUTE(pch, (char) colour);
++pch;
}
} }
outportb(0x3ce, 5); egawriteplane(~colour);
outportb(0x3cf, 0); pch = (unsigned long __far *) screentable[0];
for (j = 0; j < SCREENHEIGHT * SCREENBYTES / 4; ++j) {
WRITE_ABSOLUTE_DWORD(&pch[j], 0x00000000);
}
egawriteplane(15);
if (iflags.tile_view) if (iflags.tile_view)
vga_clearmap(); vga_clearmap();
vga_gotoloc(0, 0); /* is this needed? */ vga_gotoloc(0, 0); /* is this needed? */
@@ -459,28 +454,22 @@ STATIC_OVL void
vga_redrawmap(clearfirst) vga_redrawmap(clearfirst)
boolean clearfirst; boolean clearfirst;
{ {
int j, x, y, t; int x, y, t;
char __far *pch; unsigned long __far *pch;
char volatile a;
if (clearfirst) { if (clearfirst) {
/* y here is in pixel rows */ unsigned j;
outportb(0x3ce, 5);
outportb(0x3cf, 2);
t = TOP_MAP_ROW * ROWS_PER_CELL; t = TOP_MAP_ROW * ROWS_PER_CELL;
for (y = t; y < (ROWNO * ROWS_PER_CELL) + t; ++y) { pch = (unsigned long __far *) screentable[t];
pch = screentable[y]; egawriteplane(BACKGROUND_VGA_COLOR);
for (j = 0; j < SCREENBYTES; ++j) { for (j = 0; j < ROWNO * ROWS_PER_CELL * SCREENBYTES / 4; ++j) {
outportb(0x3ce, 8); WRITE_ABSOLUTE_DWORD(&pch[j], 0xFFFFFFFF);
outportb(0x3cf, 255);
/* On VGA mode2, must read first, then write */
a = READ_ABSOLUTE(pch);
WRITE_ABSOLUTE(pch, (char) BACKGROUND_VGA_COLOR);
++pch;
}
} }
outportb(0x3ce, 5); egawriteplane(~BACKGROUND_VGA_COLOR);
outportb(0x3cf, 0); for (j = 0; j < ROWNO * ROWS_PER_CELL * SCREENBYTES / 4; ++j) {
WRITE_ABSOLUTE_DWORD(&pch[j], 0x00000000);
}
egawriteplane(15);
} }
/* y here is in screen rows*/ /* y here is in screen rows*/
#ifdef ROW_BY_ROW #ifdef ROW_BY_ROW
@@ -941,36 +930,52 @@ int chr, col, row, colour;
int i; int i;
int x, pixy; int x, pixy;
char volatile tc;
char __far *cp; char __far *cp;
unsigned char __far *fp = font; unsigned char __far *fp = font;
unsigned char fnt; unsigned char fnt;
int actual_colour = vgacmap[colour]; int actual_colour = vgacmap[colour];
int vplane;
x = min(col, (CO - 1)); /* min() used protection from callers */ x = min(col, (CO - 1)); /* min() used protection from callers */
pixy = min(row, (LI - 1)) * 16; /* assumes 8 x 16 char set */ pixy = min(row, (LI - 1)) * 16; /* assumes 8 x 16 char set */
/* if (chr < ' ') chr = ' '; */ /* assumes ASCII set */ /* if (chr < ' ') chr = ' '; */ /* assumes ASCII set */
outportb(0x3ce, 5);
outportb(0x3cf, 2);
chr = chr << 4; chr = chr << 4;
for (i = 0; i < MAX_ROWS_PER_CELL; ++i) { vplane = ~actual_colour & ~BACKGROUND_VGA_COLOR & 0xF;
cp = screentable[pixy + i] + x; if (vplane != 0) {
fnt = READ_ABSOLUTE((fp + chr + i)); egawriteplane(vplane);
outportb(0x3ce, 8); for (i = 0; i < MAX_ROWS_PER_CELL; ++i) {
outportb(0x3cf, fnt); cp = screentable[pixy + i] + x;
tc = READ_ABSOLUTE(cp); /* wrt mode 2, must read, then write */ WRITE_ABSOLUTE(cp, (char) 0x00);
WRITE_ABSOLUTE(cp, (char) actual_colour); }
outportb(0x3ce, 8);
outportb(0x3cf, ~fnt);
tc = READ_ABSOLUTE(cp); /* wrt mode 2, must read, then write */
WRITE_ABSOLUTE(cp, (char) BACKGROUND_VGA_COLOR);
} }
outportb(0x3ce, 5); vplane = actual_colour & ~BACKGROUND_VGA_COLOR & 0xF;
outportb(0x3cf, 0); if (vplane != 0) {
outportb(0x3ce, 8); egawriteplane(vplane);
outportb(0x3cf, 255); for (i = 0; i < MAX_ROWS_PER_CELL; ++i) {
cp = screentable[pixy + i] + x;
fnt = READ_ABSOLUTE((fp + chr + i));
WRITE_ABSOLUTE(cp, (char) fnt);
}
}
vplane = ~actual_colour & BACKGROUND_VGA_COLOR & 0xF;
if (vplane != 0) {
egawriteplane(vplane);
for (i = 0; i < MAX_ROWS_PER_CELL; ++i) {
cp = screentable[pixy + i] + x;
fnt = ~READ_ABSOLUTE((fp + chr + i));
WRITE_ABSOLUTE(cp, (char) fnt);
}
}
vplane = actual_colour & BACKGROUND_VGA_COLOR & 0xF;
if (vplane != 0) {
egawriteplane(vplane);
for (i = 0; i < MAX_ROWS_PER_CELL; ++i) {
cp = screentable[pixy + i] + x;
WRITE_ABSOLUTE(cp, (char) 0xFF);
}
}
egawriteplane(15);
} }
/* /*