fixed video mode bugs
authorJohn Tsiombikas <nuclear@member.fsf.org>
Tue, 3 Mar 2020 12:00:28 +0000 (14:00 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Tue, 3 Mar 2020 12:00:28 +0000 (14:00 +0200)
Makefile
src/dos/gfx.c
src/dos/gfx.h
src/dos/main.c

index ece428f..fd82d16 100644 (file)
--- 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
index b4e4add..b610f18 100644 (file)
@@ -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;
index fe4a499..731ab14 100644 (file)
@@ -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
index a41453b..ca57152 100644 (file)
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #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<fb_height; i++) {
                for(j=0; j<fb_width; j++) {
-                       int chess = (i >> 2) == (j >> 2);
+                       int chess = ((i >> 4) & 1) == ((j >> 4) & 1);
                        *pptr++ = chess ? 0xff00 : 0x00ff;
                }
        }