static int getmode(void);
static const char *memsize_str(long sz);
static int get_mode_info(int mode, struct vbe_mode_info *mi);
-static int setwin(int wid, int pos);
static int conv_vbeinfo(int mode, struct vid_modeinfo *mi, struct vbe_mode_info *vbemi);
static unsigned int calc_mask(int nbits, int pos);
return 0;
}
-static int setwin(int wid, int pos)
+int vid_setwin(int wid, int pos)
{
struct dpmi_regs regs = {0};
mi->ops.unpack = unpack;
mi->ops.setpal = vga_setpal;
mi->ops.getpal = vga_getpal;
- mi->ops.vsync = vga_vsync;
+ mi->ops.vsync = vid_vsync;
mi->ops.clear = clear;
mi->ops.blitfb = 0;
mi->ops.flip = flip;
pptr += sz;
pending -= sz;
offs += cur_mi->win_step;
- setwin(0, offs);
+ vid_setwin(0, offs);
}
- setwin(0, 0);
+ vid_setwin(0, 0);
}
static void flip(int vsync)
#include "drv.h"
#include "vga.h"
-void vga_vsync(void);
-
static int init(void);
static void cleanup(void);
static int setmode(int mode);
};
static struct vid_gfxops gfxops_mode12h = {
- 0, 0, setpal4, getpal4, vga_vsync, clear4, blitfb4, 0, fill4 };
+ 0, 0, setpal4, getpal4, vid_vsync, clear4, blitfb4, 0, fill4 };
static struct vid_gfxops gfxops_mode13h = {
- 0, 0, vga_setpal, vga_getpal, vga_vsync, clear8, blitfb8, 0, fill8 };
+ 0, 0, vga_setpal, vga_getpal, vid_vsync, clear8, blitfb8, 0, fill8 };
void vid_register_vga(void)
{
vid_drvlist[vid_numdrv++] = &drv;
}
-void vga_vsync(void)
+void vid_vsync(void)
{
while(inp(VGA_STAT1_PORT) & 8);
while((inp(VGA_STAT1_PORT) & 8) == 0);
#include <stdio.h>
#include <math.h>
+#include <limits.h>
#include <conio.h>
#include "vidsys.h"
{
int i;
int mode;
- int xres = 320;
- int yres = 200;
+ int xres = 640;
+ int yres = 480;
int bpp = 8;
for(i=1; i<argc; i++) {
void test8bpp(void)
{
int i, j;
- unsigned char *fb = vmem;
+ unsigned char *fb;
struct vid_color cmap[256];
+ int winsz, winleft, winpos;
for(i=0; i<256; i++) {
float x = (float)i / (256.0f / TWO_PI);
}
vid_setpal(0, 256, cmap);
+ if(vid_islinear()) {
+ winsz = INT_MAX;
+ } else {
+ winsz = 65536;
+ winpos = 0;
+ vid_setwin(0, 0);
+ }
+ winleft = winsz;
+ fb = vmem;
+
vid_vsync();
for(i=0; i<vm->height; i++) {
for(j=0; j<vm->width; j++) {
- int xor = i^j;
- *fb++ = xor;
+ if(winleft-- <= 0) {
+ winpos += vm->win_step;
+ vid_setwin(0, winpos);
+ winleft = winsz;
+ fb = vmem;
+ }
+ *fb++ = i ^ j;
}
}
}
return 0;
}
-void vid_vsync(void)
+int vid_islinear(void)
{
- vga_vsync();
+ return !vid_isbanked();
+}
+
+int vid_isbanked(void)
+{
+ return cur_mode->win_size && vid_vmem < (void*)0x100000;
}
void vid_setpal(int idx, int count, const struct vid_color *col)
int vid_findmode(int xsz, int ysz, int bpp);
struct vid_modeinfo *vid_modeinfo(int mode);
-void vid_vsync(void);
+void vid_vsync(void); /* defined in drv_vga.c */
+int vid_setwin(int win, int pos); /* defined in drv_vbe.c */
/* current mode functions */
+int vid_islinear(void);
+int vid_isbanked(void);
+
void vid_setpal(int idx, int count, const struct vid_color *col);
void vid_getpal(int idx, int count, struct vid_color *col);