From af36400e1b3d2d591beaf66e1539884434e30475 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Tue, 27 Jun 2023 19:34:51 +0300 Subject: [PATCH] new vbe sortof works --- src/dos/cdpmi.c | 3 +- src/dos/drv_s3.c | 2 +- src/dos/drv_vbe.c | 21 ++++++++------ src/dos/drv_vga.c | 1 + src/dos/keyb.c | 2 +- src/dos/main.c | 7 +++-- src/dos/vidsys.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++------ src/dos/vidsys.h | 3 +- src/logger.c | 48 ++++++++++++++++++------------- src/logger.h | 18 ++++++------ 10 files changed, 136 insertions(+), 51 deletions(-) diff --git a/src/dos/cdpmi.c b/src/dos/cdpmi.c index 62e877a..9ffb8c6 100644 --- a/src/dos/cdpmi.c +++ b/src/dos/cdpmi.c @@ -1,6 +1,7 @@ #include #include #include "cdpmi.h" +#include "logger.h" #define LOWBUF_SIZE 8192 #define RMSTACK_SIZE 4096 @@ -11,7 +12,7 @@ static uint16_t lowbuf_sel, lowbuf_seg; int dpmi_init(void) { if(!(lowbuf_seg = dpmi_alloc(LOWBUF_SIZE >> 4, &lowbuf_sel))) { - fprintf(stderr, "DPMI init failed to allocate low memory buffer\n"); + errormsg("DPMI init failed to allocate low memory buffer\n"); return -1; } lowbuf = (char*)((intptr_t)lowbuf_seg << 4); diff --git a/src/dos/drv_s3.c b/src/dos/drv_s3.c index 02287a4..77919e7 100644 --- a/src/dos/drv_s3.c +++ b/src/dos/drv_s3.c @@ -1,7 +1,7 @@ - #include #include #include "drv.h" +#include "logger.h" void vid_register_s3(void) { diff --git a/src/dos/drv_vbe.c b/src/dos/drv_vbe.c index d639417..9989bb1 100644 --- a/src/dos/drv_vbe.c +++ b/src/dos/drv_vbe.c @@ -6,6 +6,7 @@ #include "vbe.h" #include "vga.h" #include "cdpmi.h" +#include "logger.h" #define farptr_to_linear(rmaddr) \ ((((intptr_t)(rmaddr) >> 12) & 0xffff0) + ((intptr_t)(rmaddr) & 0xffff)) @@ -68,20 +69,20 @@ static int init(void) regs.es = bufseg; dpmi_rmint(0x10, ®s); if((regs.eax & 0xffff) != 0x4f || memcmp(vbe->sig, "VESA", 4) != 0) { - fprintf(stderr, "failed to get VBE controller information\n"); + errormsg("failed to get VBE controller information\n"); return -1; } vbe_ver = vbe->ver; - printf("Found VBE %d.%d\n", VBE_VER_MAJOR(vbe_ver), VBE_VER_MINOR(vbe_ver)); - printf("OEM: %s\n", (char*)farptr_to_linear(vbe->oem_name)); + infomsg("Found VBE %d.%d\n", VBE_VER_MAJOR(vbe_ver), VBE_VER_MINOR(vbe_ver)); + infomsg("OEM: %s\n", (char*)farptr_to_linear(vbe->oem_name)); if(vbe_ver >= 0x0200) { - printf("%s - %s (%s)\n", (char*)farptr_to_linear(vbe->vendor), + infomsg("%s - %s (%s)\n", (char*)farptr_to_linear(vbe->vendor), (char*)farptr_to_linear(vbe->product), (char*)farptr_to_linear(vbe->revstr)); } - printf("Video RAM: %s\n", memsize_str((long)vbe->vmem_blk * 65536)); + infomsg("Video RAM: %s\n", memsize_str((long)vbe->vmem_blk * 65536)); vbe_modelist = (uint16_t*)farptr_to_linear(vbe->modelist_addr); count = 0; @@ -91,7 +92,7 @@ static int init(void) } if(!(modelist = malloc(count * sizeof *modelist))) { - fprintf(stderr, "failed to allocate mode list\n"); + errormsg("failed to allocate mode list\n"); return -1; } for(i=0; iwin_size << 10; + /* assume initial window offset at 0 */ offs = 0; pending = cur_pgsize; while(pending > 0) { - sz = pending > 65536 ? 65536 : pending; + sz = pending > winsz ? winsz : pending; memcpy((void*)0xa0000, pptr, sz); pptr += sz; pending -= sz; diff --git a/src/dos/drv_vga.c b/src/dos/drv_vga.c index f6b7b01..ed4d237 100644 --- a/src/dos/drv_vga.c +++ b/src/dos/drv_vga.c @@ -4,6 +4,7 @@ #include "vidsys.h" #include "drv.h" #include "vga.h" +#include "logger.h" static int init(void); static void cleanup(void); diff --git a/src/dos/keyb.c b/src/dos/keyb.c index 6b00866..b67434c 100644 --- a/src/dos/keyb.c +++ b/src/dos/keyb.c @@ -73,7 +73,7 @@ static unsigned char keystate[512]; void kb_init(void) { if(DONE_INIT) { - fprintf(stderr, "keyboard driver already initialized!\n"); + errormsg("keyboard driver already initialized!\n"); return; } diff --git a/src/dos/main.c b/src/dos/main.c index ba70c54..1c694c8 100644 --- a/src/dos/main.c +++ b/src/dos/main.c @@ -65,7 +65,7 @@ int main(int argc, char **argv) return 1; } - add_log_file("retroray.log"); + /*add_log_file("retroray.log");*/ if(vid_init() == -1) { return 1; @@ -160,7 +160,10 @@ void app_redisplay(void) void app_swap_buffers(void) { - vid_blitfb(framebuf, opt.vsync); + if(opt.vsync) { + vid_vsync(); + } + vid_blitfb32(framebuf, 0); } void app_quit(void) diff --git a/src/dos/vidsys.c b/src/dos/vidsys.c index 427dbb5..7b9f3d5 100644 --- a/src/dos/vidsys.c +++ b/src/dos/vidsys.c @@ -1,10 +1,12 @@ #include #include +#include #include #include "vidsys.h" #include "vga.h" #include "drv.h" #include "cdpmi.h" +#include "logger.h" struct vid_driver *vid_drvlist[MAX_DRV]; int vid_numdrv; @@ -48,7 +50,7 @@ int vid_init(void) int newsz = max_modes ? max_modes * 2 : 128; void *tmp = realloc(modes, newsz * sizeof *modes); if(!tmp) { - fprintf(stderr, "failed to allocate modes list\n"); + errormsg("failed to allocate modes list\n"); return -1; } modes = tmp; @@ -59,18 +61,18 @@ int vid_init(void) } } - printf("found %d modes:\n", num_modes); + infomsg("found %d modes:\n", num_modes); for(i=0; idrv->name, vm->modeno, + len = infomsg("[%4s] %04x: %dx%d %dbpp", vm->drv->name, vm->modeno, vm->width, vm->height, vm->bpp); if(i + 1 >= num_modes) { - putchar('\n'); + infomsg("\n"); break; } - for(j=len; j<40; j++) putchar(' '); + for(j=len; j<40; j++) infomsg(" "); vm = modes[i + 1]; - printf("[%4s] %04x: %dx%d %dbpp\n", vm->drv->name, vm->modeno, + infomsg("[%4s] %04x: %dx%d %dbpp\n", vm->drv->name, vm->modeno, vm->width, vm->height, vm->bpp); } @@ -195,7 +197,71 @@ void vid_getpal(int idx, int count, struct vid_color *col) cur_mode->ops.getpal(idx, count, col); } -void vid_blitfb(void *fb, int vsync) +void vid_blitfb(void *fb, int pitch) { - cur_mode->ops.blitfb(fb, vsync); + if(pitch <= 0) { + pitch = cur_mode->pitch; + } + cur_mode->ops.blitfb(fb, pitch); +} + +void vid_blitfb32(uint32_t *src, int pitch) +{ + int i, j, winpos, winleft; + unsigned char *dest; + uint16_t *dest16; + + if(cur_mode->bpp == 32) { + vid_blitfb(src, pitch); + return; + } + + if(pitch <= 0) { + pitch = cur_mode->width << 2; + } + + if(vid_islinear()) { + winleft = INT_MAX; + } else { + winleft = 65536;/*cur_mode->win_size << 10;*/ + winpos = 0; + vid_setwin(0, 0); + } + + switch(cur_mode->bpp) { + case 8: + /* TODO */ + break; + + case 15: + /* TODO */ + break; + case 16: + /* TODO */ + break; + + case 24: + dest = vid_vmem; + for(i=0; iheight; i++) { + for(j=0; jwidth; j++) { + uint32_t pixel = src[j]; + if(winleft <= 0) { + winpos += cur_mode->win_step; + vid_setwin(0, winpos); + winleft = 65536;/*cur_mode->win_size << 10;*/ + dest = vid_vmem; + } + dest[0] = (pixel >> 16) & 0xff; + dest[1] = (pixel >> 8) & 0xff; + dest[2] = pixel & 0xff; + dest += 3; + winleft -= 3; + } + src = (uint32_t*)((char*)src + pitch); + } + break; + + default: + break; + } } diff --git a/src/dos/vidsys.h b/src/dos/vidsys.h index cd2cfec..88c19f1 100644 --- a/src/dos/vidsys.h +++ b/src/dos/vidsys.h @@ -72,6 +72,7 @@ int vid_isbanked(void); void vid_setpal(int idx, int count, const struct vid_color *col); void vid_getpal(int idx, int count, struct vid_color *col); -void vid_blitfb(void *fb, int vsync); +void vid_blitfb(void *fb, int pitch); +void vid_blitfb32(uint32_t *fb, int pitch); #endif /* VIDSYS_VIDEO_H_ */ diff --git a/src/logger.c b/src/logger.c index dd52cc6..5b43a3a 100644 --- a/src/logger.c +++ b/src/logger.c @@ -153,12 +153,12 @@ int add_log_callback(void (*cbfunc)(const char*, void*), void *cls) #endif #endif -static void logmsg(int type, const char *fmt, va_list ap) +static int logmsg(int type, const char *fmt, va_list ap) { static char buf[2048]; - int i; + int i, len; - vsnprintf(buf, sizeof buf, fmt, ap); + len = vsnprintf(buf, sizeof buf, fmt, ap); for(i=0; i