From 772dfe62feafd0583e52326c7419ef01e04cac60 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Fri, 13 Dec 2019 10:47:11 +0200 Subject: [PATCH] infcubes crashes --- src/dos/gfx.c | 16 +++++++++++----- src/dos/gfx.h | 2 +- src/dos/main.c | 8 +++++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/dos/gfx.c b/src/dos/gfx.c index 570eaba..8818ab9 100644 --- a/src/dos/gfx.c +++ b/src/dos/gfx.c @@ -22,6 +22,7 @@ static struct vbe_mode_info mode_info; static void *vpgaddr[2]; static int fbidx; +static int pgcount; static int init_vbe(void) { @@ -50,7 +51,7 @@ static int init_vbe(void) return 0; } -void *set_video_mode(int xsz, int ysz, int bpp) +void *set_video_mode(int xsz, int ysz, int bpp, int nbuf) { int i, nmodes; int best_match_mode = -1; @@ -70,7 +71,7 @@ void *set_video_mode(int xsz, int ysz, int bpp) mode = -1; nmodes = vbe_num_modes(&vbe); for(i=0; i 2) nbuf = 2; + pgcount = nbuf > mode_info.num_img_pages ? mode_info.num_img_pages : nbuf; + pgsize = mode_info.xres * mode_info.yres * (bpp / 8); - fbsize = mode_info.num_img_pages * pgsize; + fbsize = pgcount * pgsize; vpgaddr[0] = (void*)dpmi_mmap(mode_info.fb_addr, fbsize); + memset(vpgaddr[0], 0xaa, fbsize); - if(mode_info.num_img_pages > 1) { + if(pgcount > 1) { vpgaddr[1] = (char*)vpgaddr[0] + pgsize; fbidx = 1; page_flip(FLIP_NOW); /* start with the second page visible */ diff --git a/src/dos/gfx.h b/src/dos/gfx.h index 029066f..f23e0f6 100644 --- a/src/dos/gfx.h +++ b/src/dos/gfx.h @@ -5,7 +5,7 @@ extern "C" { #endif -void *set_video_mode(int xsz, int ysz, int bpp); +void *set_video_mode(int xsz, int ysz, int bpp, int nbuf); int set_text_mode(void); int get_color_depth(void); diff --git a/src/dos/main.c b/src/dos/main.c index 6d83027..aed12e9 100644 --- a/src/dos/main.c +++ b/src/dos/main.c @@ -31,7 +31,7 @@ static quat_t rot = {0, 0, 0, 1}; int main(int argc, char **argv) { - fbsize = fb_width * fb_height * fb_bpp / CHAR_BIT; + fbsize = fb_width * fb_height * fb_bpp / 8; init_logger("demo.log"); @@ -46,12 +46,14 @@ int main(int argc, char **argv) set_mouse(fb_width / 2, fb_height / 2); } - if(!(fb_pixels = malloc(fbsize))) { + /* allocate a couple extra rows as a guard band, until we fucking fix the rasterizer */ + if(!(fb_pixels = malloc(fbsize + (fb_width * fb_bpp / 8) * 2))) { fprintf(stderr, "failed to allocate backbuffer\n"); return 1; } + fb_pixels += fb_width; - if(!(vmem = set_video_mode(fb_width, fb_height, fb_bpp))) { + if(!(vmem = set_video_mode(fb_width, fb_height, fb_bpp, 1))) { return 1; } -- 1.7.10.4