X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fdos%2Fgfx.c;h=7e5db988c2088a07e5b444c7434879d5d34fee14;hb=HEAD;hp=474a2e13a38e0e13756a74c9e46e6fcf736c294d;hpb=7bd77c4461410f29819d6eee3d42d2793047ea66;p=retrobench diff --git a/src/dos/gfx.c b/src/dos/gfx.c index 474a2e1..7e5db98 100644 --- a/src/dos/gfx.c +++ b/src/dos/gfx.c @@ -7,6 +7,11 @@ #include "vga.h" #include "util.h" +#ifdef __DJGPP__ +#define VMEM_PTR ((void*)(0xa0000 + __djgpp_conventional_base)) +#else +#define VMEM_PTR ((void*)0xa0000) +#endif #define SAME_BPP(a, b) \ ((a) == (b) || ((a) == 16 && (b) == 15) || ((a) == 15 && (b) == 16) || \ @@ -94,13 +99,9 @@ int init_video(void) } if(minf.attr & VBE_ATTR_LFB) { vmptr->fb_addr = minf.fb_addr; - } else { - vmptr->bank_size = (uint32_t)minf.bank_size * 1024; - if(!vmptr->bank_size) { - vmptr->bank_size = 65536; - } } vmptr->max_pages = minf.num_img_pages; + vmptr->win_gran = minf.win_gran; printf("%04x: ", vbe.modes[i]); vbe_print_mode_info(stdout, &minf); @@ -190,7 +191,7 @@ void *set_video_mode(int idx, int nbuf) } /* unmap previous video memory mapping, if there was one (switching modes) */ - if(vpgaddr[0] && vpgaddr[0] != (void*)0xa0000) { + if(vpgaddr[0] && vpgaddr[0] != VMEM_PTR) { dpmi_munmap(vpgaddr[0]); vpgaddr[0] = vpgaddr[1] = 0; } @@ -198,12 +199,19 @@ void *set_video_mode(int idx, int nbuf) curmode = vm; if(nbuf < 1) nbuf = 1; if(nbuf > 2) nbuf = 2; - pgcount = nbuf > vm->max_pages ? vm->max_pages : nbuf; + pgcount = nbuf > vm->max_pages + 1 ? vm->max_pages + 1 : nbuf; pgsize = vm->ysz * vm->pitch; fbsize = pgcount * pgsize; + if(vm->bpp > 8) { + printf("rgb mask: %x %x %x\n", (unsigned int)vm->rmask, + (unsigned int)vm->gmask, (unsigned int)vm->bmask); + printf("rgb shift: %d %d %d\n", vm->rshift, vm->gshift, vm->bshift); + } printf("pgcount: %d, pgsize: %d, fbsize: %d\n", pgcount, pgsize, fbsize); - printf("phys addr: %p\n", (void*)vm->fb_addr); + if(vm->fb_addr) { + printf("phys addr: %p\n", (void*)vm->fb_addr); + } fflush(stdout); if(vm->fb_addr) { @@ -233,10 +241,24 @@ void *set_video_mode(int idx, int nbuf) } } else { - vpgaddr[0] = (void*)0xa0000; + vpgaddr[0] = VMEM_PTR; vpgaddr[1] = 0; blit_frame = blit_frame_banked; + + /* calculate window granularity shift */ + vm->win_gran_shift = 0; + vm->win_64k_step = 1; + if(vm->win_gran > 0 && vm->win_gran < 64) { + int gran = vm->win_gran; + while(gran < 64) { + vm->win_gran_shift++; + gran <<= 1; + } + vm->win_64k_step = 1 << vm->win_gran_shift; + } + + printf("granularity: %dk (step: %d)\n", vm->win_gran, vm->win_64k_step); } /* allocate main memory framebuffer */ @@ -254,7 +276,7 @@ void *set_video_mode(int idx, int nbuf) int set_text_mode(void) { /* unmap previous video memory mapping, if there was one (switching modes) */ - if(vpgaddr[0] && vpgaddr[0] != (void*)0xa0000) { + if(vpgaddr[0] && vpgaddr[0] != VMEM_PTR) { dpmi_munmap(vpgaddr[0]); vpgaddr[0] = vpgaddr[1] = 0; } @@ -287,8 +309,7 @@ static void blit_frame_lfb(void *pixels, int vsync) static void blit_frame_banked(void *pixels, int vsync) { - int sz, offs; - unsigned int pending; + int sz, offs, pending; unsigned char *pptr = pixels; if(vsync) wait_vsync(); @@ -297,14 +318,14 @@ static void blit_frame_banked(void *pixels, int vsync) offs = 0; pending = pgsize; while(pending > 0) { - sz = pending > curmode->bank_size ? curmode->bank_size : pending; - //memcpy64((void*)0xa0000, pptr, sz >> 3); - memcpy((void*)0xa0000, pptr, sz); + sz = pending > 65536 ? 65536 : pending; + /*memcpy64(VMEM_PTR, pptr, sz >> 3);*/ + memcpy(VMEM_PTR, pptr, sz); pptr += sz; pending -= sz; - vbe_setwin(0, ++offs); + offs += curmode->win_64k_step; + vbe_setwin(0, offs); } - vbe_setwin(0, 0); }