X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=eradicate;a=blobdiff_plain;f=src%2Fdos%2Fmain.c;h=c344df18738c5e2b7cee732a94862df9401ba3ec;hp=ca57152fd8edf9fbc64609824b07b20c7cc99749;hb=2ce1b12090b2571b05d9ea451986212e590b876a;hpb=0cf749b80f7732e66fbb78815e3752985b845d17 diff --git a/src/dos/main.c b/src/dos/main.c index ca57152..c344df1 100644 --- a/src/dos/main.c +++ b/src/dos/main.c @@ -12,11 +12,15 @@ static void draw(void); static struct video_mode *vmode; +static void swap_lfb(void *pixels); +static void swap_banked(void *pixels); + int main(int argc, char **argv) { + void *fb_buf; struct video_mode *vmodes; - int vmidx; + int vmidx, status = 0; init_logger("game.log"); @@ -36,9 +40,22 @@ int main(int argc, char **argv) } vmode = vmodes + vmidx; + if(vmode->fb_addr) { + swap_buffers = swap_lfb; + } else { + swap_buffers = swap_banked; + } + fb_width = vmode->xsz; fb_height = vmode->ysz; - fb_size = (vmode->xsz * vmode->bpp / 8) * vmode->ysz; + fb_size = vmode->pitch * vmode->ysz; + + if(!(fb_buf = malloc(fb_size + vmode->pitch * 2))) { + fprintf(stderr, "failed to allocate framebuffer\n"); + status = -1; + goto break_evloop; + } + fb_pixels = (char*)fb_buf + vmode->pitch; reset_timer(); @@ -53,16 +70,17 @@ int main(int argc, char **argv) } break_evloop: + free(fb_buf); set_text_mode(); cleanup_video(); kb_shutdown(); - return 0; + return status; } static void draw(void) { int i, j; - uint16_t *pptr = vmem; + uint16_t *pptr = fb_pixels; for(i=0; i 0) { + sz = pending > vmode->bank_size ? vmode->bank_size : pending; + memcpy(vmem, pptr, sz); + pptr += sz; + pending -= sz; + vbe_setwin(0, ++offs); + } + + vbe_setwin(0, 0); +}