From 0cf749b80f7732e66fbb78815e3752985b845d17 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Tue, 3 Mar 2020 14:00:28 +0200 Subject: [PATCH] fixed video mode bugs --- Makefile | 16 ++++++++++------ src/dos/gfx.c | 31 +++++++++++++++++++++++++------ src/dos/gfx.h | 4 +++- src/dos/main.c | 6 ++++-- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index ece428f..fd82d16 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,6 @@ dosobj = src/dos/main.obj src/dos/gfx.obj src/dos/timer.obj src/dos/watdpmi.obj gameobj = src/game.obj src/util.obj incpath = -Isrc -Isrc/dos -Ilibs/imago/src libpath = libpath libs/imago -RM = rm -f !else dosobj = src\dos\main.obj src\dos\gfx.obj src\dos\timer.obj src\dos\watdpmi.obj & src\dos\vbe.obj src\dos\vga.obj src\dos\keyb.obj src\dos\mouse.obj & @@ -13,7 +12,6 @@ dosobj = src\dos\main.obj src\dos\gfx.obj src\dos\timer.obj src\dos\watdpmi.obj gameobj = src\game.obj src\util.obj incpath = -Isrc -Isrc\dos -Ilibs\imago\src libpath = libpath libs\imago -RM = del !endif obj = $(dosobj) $(gameobj) @@ -38,8 +36,14 @@ $(bin): $(obj) .asm.obj: nasm -f obj -o $@ $[*.asm +!ifdef __UNIX__ +clean: .symbolic + rm -f $(obj) + rm -f $(bin) +!else clean: .symbolic - $(RM) src\*.obj - $(RM) src\dos\*.obj - $(RM) objects.lnk - $(RM) $(bin) + del src\*.obj + del src\dos\*.obj + del objects.lnk + del $(bin) +!endif diff --git a/src/dos/gfx.c b/src/dos/gfx.c index b4e4add..b610f18 100644 --- a/src/dos/gfx.c +++ b/src/dos/gfx.c @@ -65,6 +65,7 @@ int init_video(void) vmptr->xsz = minf.xres; vmptr->ysz = minf.yres; vmptr->bpp = minf.bpp; + vmptr->pitch = minf.scanline_bytes; if(minf.mem_model == VBE_TYPE_DIRECT) { vmptr->rbits = minf.rsize; vmptr->gbits = minf.gsize; @@ -76,6 +77,8 @@ int init_video(void) vmptr->gmask = calc_mask(minf.gsize, minf.gpos); vmptr->bmask = calc_mask(minf.bsize, minf.bpos); } + vmptr->fb_addr = minf.fb_addr; + vmptr->max_pages = minf.num_img_pages; printf("%04x: ", vbe.modes[i]); vbe_print_mode_info(stdout, &minf); @@ -83,6 +86,12 @@ int init_video(void) fflush(stdout); vbe_init_ver = VBE_VER_MAJOR(vbe.ver); + if(vbe_init_ver < 2) { + fprintf(stderr, "VBE 2.0 required. Upgrade your video card or run univbe.\n"); + free(vmodes); + vmodes = 0; + return -1; + } return 0; } @@ -137,11 +146,11 @@ int find_video_mode(int mode) void *set_video_mode(int idx, int nbuf) { unsigned int mode; - struct vbe_mode_info minf; struct video_mode *vm = vmodes + idx; printf("setting video mode %x (%dx%d %d bpp)\n", (unsigned int)vm->mode, vm->xsz, vm->ysz, vm->bpp); + fflush(stdout); mode = vm->mode | VBE_MODE_LFB; if(vbe_setmode(mode) == -1) { @@ -153,17 +162,27 @@ void *set_video_mode(int idx, int nbuf) printf("Warning: failed to get a linear framebuffer. falling back to banked mode\n"); } - vbe_mode_info(mode, &minf); - curmode = vm; if(nbuf < 1) nbuf = 1; if(nbuf > 2) nbuf = 2; - pgcount = nbuf > minf.num_img_pages ? minf.num_img_pages : nbuf; + pgcount = nbuf > vm->max_pages ? vm->max_pages : nbuf; pgsize = (vm->xsz * vm->bpp / 8) * vm->ysz; fbsize = pgcount * pgsize; - vpgaddr[0] = (void*)dpmi_mmap(minf.fb_addr, fbsize); - memset(vpgaddr[0], 0xaa, fbsize); + printf("pgcount: %d, pgsize: %d, fbsize: %d\n", pgcount, pgsize, fbsize); + printf("phys addr: %p\n", (void*)vm->fb_addr); + + vpgaddr[0] = (void*)dpmi_mmap(vm->fb_addr, fbsize); + if(!vpgaddr[0]) { + fprintf(stderr, "failed to map framebuffer (phys: %lx, size: %d)\n", + (unsigned long)vm->fb_addr, fbsize); + set_text_mode(); + return 0; + } + //memset(vpgaddr[0], 0xaa, fbsize); + + printf("vaddr: %p\n", vpgaddr[0]); + fflush(stdout); if(pgcount > 1) { vpgaddr[1] = (char*)vpgaddr[0] + pgsize; diff --git a/src/dos/gfx.h b/src/dos/gfx.h index fe4a499..731ab14 100644 --- a/src/dos/gfx.h +++ b/src/dos/gfx.h @@ -5,10 +5,12 @@ struct video_mode { uint16_t mode; - short xsz, ysz, bpp; + short xsz, ysz, bpp, pitch; short rbits, gbits, bbits; short rshift, gshift, bshift; uint32_t rmask, gmask, bmask; + uint32_t fb_addr; + short max_pages; }; #ifdef __cplusplus diff --git a/src/dos/main.c b/src/dos/main.c index a41453b..ca57152 100644 --- a/src/dos/main.c +++ b/src/dos/main.c @@ -1,5 +1,6 @@ #include #include +#include #include "game.h" #include "keyb.h" #include "timer.h" @@ -10,7 +11,7 @@ static void draw(void); static struct video_mode *vmode; -static void *vmem; + int main(int argc, char **argv) { @@ -53,6 +54,7 @@ int main(int argc, char **argv) break_evloop: set_text_mode(); + cleanup_video(); kb_shutdown(); return 0; } @@ -64,7 +66,7 @@ static void draw(void) for(i=0; i> 2) == (j >> 2); + int chess = ((i >> 4) & 1) == ((j >> 4) & 1); *pptr++ = chess ? 0xff00 : 0x00ff; } } -- 1.7.10.4