From: John Tsiombikas Date: Mon, 2 Dec 2019 11:19:51 +0000 (+0200) Subject: the rewrite branch builds, not tested yet X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=commitdiff_plain;h=b82bab85314bbc57d1c542d4d6687de0cd75c375 the rewrite branch builds, not tested yet --- diff --git a/Makefile b/Makefile index 863858d..8853b06 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ fract.obj gfx.obj gfxutil.obj greets.obj grise.obj hairball.obj infcubes.obj & keyb.obj logger.obj main.obj mesh.obj meshload.obj metaball.obj metasurf.obj & mouse.obj music.obj noise.obj plasma.obj polyclip.obj polyfill.obj polytest.obj & rbtree.obj sball.obj screen.obj smoketxt.obj thunder.obj tilemaze.obj timer.obj & -tinyfps.obj treestor.obj ts_text.obj tunnel.obj util.obj vbe.obj watdpmi.obj +tinyfps.obj treestor.obj ts_text.obj tunnel.obj util.obj vbe.obj vga.obj bin = demo.exe diff --git a/src/dos/gfx.c b/src/dos/gfx.c new file mode 100644 index 0000000..b55b4e6 --- /dev/null +++ b/src/dos/gfx.c @@ -0,0 +1,121 @@ +#include +#include "gfx.h" +#include "vbe.h" +#include "vga.h" +#include "cdpmi.h" + +#ifdef __DJGPP__ +#include +#define REALPTR(s, o) (void*)(((uint32_t)(s) << 4) - __djgpp_base_address + ((uint32_t)(o))) +#else +#define REALPTR(s, o) (void*)(((uint32_t)(s) << 4) + ((uint32_t)(o))) +#endif + +#define SAME_BPP(a, b) \ + ((a) == (b) || ((a) == 16 && (b) == 15) || ((a) == 15 && (b) == 16) || \ + ((a) == 32 && (b) == 24) || ((a) == 24 && (b) == 32)) + +static int vbe_init_ver; +static struct vbe_info vbe; +static int mode, pgsize, fbsize; +static struct vbe_mode_info mode_info; + +static void *vpgaddr[2]; +static int fbidx; + +static int init_vbe(void) +{ + if(vbe_info(&vbe) == -1) { + return -1; + } + + vbe_print_info(stdout, &vbe); + fflush(stdout); + + vbe_init_ver = VBE_VER_MAJOR(vbe.ver); + return 0; +} + +void *set_video_mode(int xsz, int ysz, int bpp) +{ + int i, nmodes; + int best_match_mode = -1; + struct vbe_mode_info minf; + + if(!vbe_init_ver) { + if(init_vbe() == -1) { + fprintf(stderr, "failed to initialize VBE\n"); + return 0; + } + if(vbe_init_ver < 2) { + fprintf(stderr, "VBE >= 2.0 required\n"); + return 0; + } + } + + mode = -1; + + for(i=0; i 1) { + vpgaddr[1] = (char*)vpgaddr[0] + pgsize; + fbidx = 1; + page_flip(FLIP_NOW); /* start with the second page visible */ + } else { + fbidx = 0; + vpgaddr[1] = 0; + } + + return vpgaddr[0]; +} + +int set_text_mode(void) +{ + vga_setmode(3); + return 0; +} + +void *page_flip(int vsync) +{ + if(!vpgaddr[1]) { + /* page flipping not supported */ + return vpgaddr[0]; + } + + vbe_swap(fbidx ? pgsize : 0, vsync ? VBE_SWAP_VBLANK : VBE_SWAP_NOW); + fbidx = (fbidx + 1) & 1; + + return vpgaddr[fbidx]; +} diff --git a/src/dos/gfx.h b/src/dos/gfx.h index 109bbcf..029066f 100644 --- a/src/dos/gfx.h +++ b/src/dos/gfx.h @@ -18,7 +18,6 @@ void set_palette(int idx, int r, int g, int b); enum { FLIP_NOW, FLIP_VBLANK, - FLIP_VBLANK_WAIT }; /* page flip and return pointer to the start of the display area (front buffer) */ void *page_flip(int vsync); diff --git a/src/dos/main.c b/src/dos/main.c index aed4e8a..0f8abf5 100644 --- a/src/dos/main.c +++ b/src/dos/main.c @@ -132,7 +132,7 @@ void swap_buffers(void *pixels) void *next; drawFps(vmem_back); - if((next = page_flip(opt.vsync ? FLIP_VBLANK_WAIT : FLIP_NOW))) { + if((next = page_flip(opt.vsync ? FLIP_VBLANK : FLIP_NOW))) { assert(next == vmem_back); vmem_back = vmem_front; vmem_front = next; diff --git a/src/dos/vga.c b/src/dos/vga.c new file mode 100644 index 0000000..c829684 --- /dev/null +++ b/src/dos/vga.c @@ -0,0 +1,11 @@ +#include "vga.h" +#include "cdpmi.h" + +int vga_setmode(int mode) +{ + struct dpmi_regs regs = {0}; + + regs.eax = mode; /* func 00 | mode */ + dpmi_int(0x10, ®s); + return 0; +} diff --git a/src/dos/vga.h b/src/dos/vga.h new file mode 100644 index 0000000..c6d7070 --- /dev/null +++ b/src/dos/vga.h @@ -0,0 +1,30 @@ +#ifndef VGA_H_ +#define VGA_H_ + +#include "inttypes.h" + +int vga_setmode(int mode); + +#ifdef __WATCOMC__ +void vga_setpal(int16_t idx, uint8_t r, uint8_t g, uint8_t b); +#pragma aux vga_setpal = \ + "test ax, 0x8000" \ + "jnz skip_dacaddr" \ + "mov dx, 0x3c8" \ + "out dx, al" \ + "skip_dacaddr:" \ + "mov dx, 0x3c9" \ + "mov al, bl" \ + "shr al, 2" \ + "out dx, al" \ + "mov al, bh" \ + "shr al, 2" \ + "out dx, al" \ + "mov al, cl" \ + "shr al, 2" \ + "out dx, al" \ + parm[ax][bl][bh][cl] \ + modify[dx]; +#endif /* __WATCOMC__ */ + +#endif /* VGA_H_ */