From 696108c29db9a5271f45decee642a4ac72c3367d Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Sun, 25 Jun 2023 21:07:14 +0300 Subject: [PATCH] fixed vbe --- drv_vbe.c | 9 ++++----- drv_vga.c | 8 +++----- main.c | 27 ++++++++++++++++++++++----- vidsys.c | 9 +++++++-- vidsys.h | 6 +++++- 5 files changed, 41 insertions(+), 18 deletions(-) diff --git a/drv_vbe.c b/drv_vbe.c index 69c89eb..d639417 100644 --- 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) diff --git a/drv_vga.c b/drv_vga.c index 5410b60..f6b7b01 100644 --- 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 --- a/main.c +++ b/main.c @@ -1,5 +1,6 @@ #include #include +#include #include #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; iheight; i++) { for(j=0; jwidth; 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; } } } diff --git a/vidsys.c b/vidsys.c index 01c8c81..d60c5f2 100644 --- 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) diff --git a/vidsys.h b/vidsys.h index bcf7837..f40b18d 100644 --- 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); -- 1.7.10.4