fixed vbe
authorJohn Tsiombikas <nuclear@member.fsf.org>
Sun, 25 Jun 2023 18:07:14 +0000 (21:07 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Sun, 25 Jun 2023 18:07:14 +0000 (21:07 +0300)
drv_vbe.c
drv_vga.c
main.c
vidsys.c
vidsys.h

index 69c89eb..d639417 100644 (file)
--- a/drv_vbe.c
+++ b/drv_vbe.c
@@ -17,7 +17,6 @@ static int setmode(int mode);
 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);
 
@@ -214,7 +213,7 @@ static int get_mode_info(int mode, struct vbe_mode_info *mi)
        return 0;
 }
 
-static int setwin(int wid, int pos)
+int vid_setwin(int wid, int pos)
 {
        struct dpmi_regs regs = {0};
 
@@ -303,7 +302,7 @@ static int conv_vbeinfo(int mode, struct vid_modeinfo *mi, struct vbe_mode_info
        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;
@@ -369,9 +368,9 @@ static void blitfb_banked(void *fb, int pitch)
                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)
index 5410b60..f6b7b01 100644 (file)
--- a/drv_vga.c
+++ b/drv_vga.c
@@ -5,8 +5,6 @@
 #include "drv.h"
 #include "vga.h"
 
-void vga_vsync(void);
-
 static int init(void);
 static void cleanup(void);
 static int setmode(int mode);
@@ -32,9 +30,9 @@ static struct vid_modeinfo modes[] = {
 };
 
 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)
 {
@@ -68,7 +66,7 @@ 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);
diff --git a/main.c b/main.c
index ed2377e..476baa7 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <math.h>
+#include <limits.h>
 #include <conio.h>
 #include "vidsys.h"
 
@@ -17,8 +18,8 @@ int main(int argc, char **argv)
 {
        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++) {
@@ -106,8 +107,9 @@ static float fmin(float a, float b)
 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);
@@ -117,12 +119,27 @@ void test8bpp(void)
        }
        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;
                }
        }
 }
index 01c8c81..d60c5f2 100644 (file)
--- a/vidsys.c
+++ b/vidsys.c
@@ -175,9 +175,14 @@ struct vid_modeinfo *vid_modeinfo(int mode)
        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)
index bcf7837..f40b18d 100644 (file)
--- a/vidsys.h
+++ b/vidsys.h
@@ -62,9 +62,13 @@ void *vid_setmode(int mode);
 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);