SvgaLib/demos/testlinear.c

124 lines
2.8 KiB
C

/*
Simple test program for Cirrus linear addressing/color expansion.
vgagl can take advantage of it (linear addressing).
*/
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <vga.h>
#include <time.h>
#include "../src/libvga.h"
#define USE_LINEAR_ADDRESSING
/* #define USE_BY16_ADDRESSING */
unsigned char *vbuf;
#if 0
/* This function is Cirrus specific and has nothing to do with linear
* addressing. */
void by8test(void)
{
int i;
int startclock, diffclock;
/* Enable extended write modes and BY8/16 addressing. */
outb(0x3ce, 0x0b);
#ifdef USE_BY16_ADDRESSING
outb(0x3cf, inb(0x3cf) | 0x16);
#else
outb(0x3cf, inb(0x3cf) | 0x06);
#endif
/* Set extended write mode 4. */
outb(0x3ce, 0x05);
outb(0x3cf, (inb(0x3cf) & 0xf8) | 4);
/* Set pixel mask register (coincides with VGA plane mask register). */
outw(0x3c4, 0xff02);
startclock = clock();
for (i = 0; i < 248; i++) {
outw(0x3ce, 0x01 + (i << 8)); /* Set foreground color. */
#ifdef USE_BY16_ADDRESSING
outw(0x3ce, 0x11 + (i << 8)); /* Set high byte. */
memset(vbuf, 0xff, 640 * 480 / 16);
#else
memset(vbuf, 0xff, 640 * 480 / 8);
#endif
}
diffclock = clock() - startclock;
printf("Color expansion framebuffer fill speed: %dK/s\n",
640 * 480 * 248 / diffclock / 10);
}
#endif
int main(int argc, char *argv[])
{
int i,j;
if (!(argc == 2 && strcmp(argv[1], "--force") == 0))
if (!(vga_getmodeinfo(vga_getdefaultmode())->flags & CAPABLE_LINEAR)) {
printf("Linear addressing not supported for this chipset.\n");
exit(1);
}
vga_init();
vga_setmode(vga_getdefaultmode());
vga_setpage(0);
#ifdef USE_LINEAR_ADDRESSING
if (vga_setlinearaddressing() == -1) {
vga_setmode(TEXT);
printf("Could not set linear addressing.\n");
exit(-1);
}
#endif
/* Should not mess with bank register after this. */
vbuf = vga_getgraphmem();
printf("vbuf mapped at %08lx.\n", (unsigned long) vbuf);
getchar();
#ifdef USE_LINEAR_ADDRESSING
memset(vbuf, 0x88, 640 * 480);
sleep(1);
memset(vbuf, 0, 640 * 480);
for (i = 0; i < 100000; i++)
*(vbuf + (rand() & 0xfffff)) = rand();
#endif
#if 0
if (vga_getcurrentchipset() == CIRRUS)
/* Show the bandwidth of the extended write modes of the */
/* Cirrus chip. */
by8test();
#endif
getchar();
for(i = 0;i < 44;i++){
*(vbuf + i) = 0x1c;
*(vbuf + 640*17 + i) = 0x1c;
*(vbuf + 640*480 - i) = 0x1c;
*(vbuf + 640*480 - 1 - 640*17 - i) = 0x1c;
for(j = 1;j < 17;j++){
*(vbuf + 640*j + i) = (i == 0 || i == 43)? 0x1c:0;
*(vbuf + 640*480 - 1 - 640*j - i) = (i == 0 || i == 43)? 0x1c:0;
}
}
for(i = 3;i < 10;i++)
for(j = 4;j < 10;j++){
*(vbuf + i + 640*j) = 0x3f;
*(vbuf + 640*480 -1 -640*j - i) = 0x3f;
}
getchar();
vga_setmode(TEXT);
return 0;
}