From: John Tsiombikas Date: Sat, 13 Jun 2020 10:59:00 +0000 (+0300) Subject: backport builds X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=commitdiff_plain;h=b49854e0980a030cc8338a7f4ee779ecde1aae38 backport builds --- diff --git a/GNUmakefile b/GNUmakefile index 6e91ee8..49fb3a1 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -7,7 +7,7 @@ bin = demo asmsrc += cspr/dbgfont.asm cspr/confont.asm bindata = data/loading.img -inc = -I/usr/local/include -Isrc -Isrc/scr -Isrc/sdl -Ilibs -Ilibs/imago/src -Ilibs/mikmod/include +inc = -I/usr/local/include -Isrc -Isrc/3dgfx -Isrc/scr -Isrc/sdl -Ilibs -Ilibs/imago/src -Ilibs/mikmod/include warn = -pedantic -Wall -Wno-unused-variable -Wno-unused-function CFLAGS = $(arch) $(warn) -g $(inc) `sdl-config --cflags` diff --git a/Makefile b/Makefile index 8a2db49..0b6a460 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,19 @@ !ifdef __UNIX__ dosobj = src/dos/audos.obj src/dos/djdpmi.obj src/dos/gfx.obj src/dos/keyb.obj & src/dos/logger.obj src/dos/main.obj src/dos/sball.obj src/dos/timer.obj & - src/dos/vbe.obj src/dos/vga.obj src/dos/watdpmi.obj + src/dos/vbe.obj src/dos/vga.obj src/dos/watdpmi.obj src/dos/mouse.obj 3dobj = src/3dgfx/3dgfx.obj src/3dgfx/mesh.obj src/3dgfx/meshload.obj & src/3dgfx/polyclip.obj src/3dgfx/polyfill.obj -srcobj = src/bsptree.obj src/cfgopt.obj src/console.obj & - src/demo.obj src/dynarr.obj src/gfxutil.obj & - src/metasurf.obj src/noise.obj & +srcobj = src/bsptree.obj src/cfgopt.obj src/console.obj src/demo.obj & + src/dynarr.obj src/gfxutil.obj src/metasurf.obj src/noise.obj & src/rbtree.obj src/screen.obj src/tinyfps.obj src/treestor.obj & - src/ts_text.obj src/util.obj + src/ts_text.obj src/util.obj src/data.obj scrobj = src/scr/bump.obj src/scr/fract.obj src/scr/greets.obj & src/scr/grise.obj src/scr/hairball.obj src/scr/infcubes.obj & src/scr/metaball.obj src/scr/plasma.obj src/scr/polytest.obj & src/scr/smoketxt.obj src/scr/thunder.obj src/scr/tilemaze.obj & src/scr/tunnel.obj +csprobj = cspr/dbgfont.obj cspr/confont.obj incpath = -Isrc -Isrc/dos -Isrc/3dgfx -Ilibs -Ilibs/imago/src -Ilibs/anim/src & -Ilibs/midas @@ -22,26 +22,26 @@ libpath = libpath libs/imago libpath libs/anim libpath libs/midas dosobj = src\dos\audos.obj src\dos\djdpmi.obj src\dos\gfx.obj src\dos\keyb.obj & src\dos\logger.obj src\dos\main.obj src\dos\sball.obj src\dos\timer.obj & - src\dos\vbe.obj src\dos\vga.obj src\dos\watdpmi.obj + src\dos\vbe.obj src\dos\vga.obj src\dos\watdpmi.obj src\dos\mouse.obj 3dobj = src\3dgfx\3dgfx.obj src\3dgfx\mesh.obj src\3dgfx\meshload.obj & src\3dgfx\polyclip.obj src\3dgfx\polyfill.obj -srcobj = src\3dgfx.obj src\bsptree.obj src\cfgopt.obj src\console.obj & - src\demo.obj src\dynarr.obj src\gfxutil.obj src\mesh.obj src\meshload.obj & - src\metasurf.obj src\noise.obj src\polyclip.obj src\polyfill.obj & +srcobj = src\bsptree.obj src\cfgopt.obj src\console.obj src\demo.obj & + src\dynarr.obj src\gfxutil.obj src\metasurf.obj src\noise.obj & src\rbtree.obj src\screen.obj src\tinyfps.obj src\treestor.obj & - src\ts_text.obj src\util.obj + src\ts_text.obj src\util.obj src\data.obj scrobj = src\scr\bump.obj src\scr\fract.obj src\scr\greets.obj & src\scr\grise.obj src\scr\hairball.obj src\scr\infcubes.obj & src\scr\metaball.obj src\scr\plasma.obj src\scr\polytest.obj & src\scr\smoketxt.obj src\scr\thunder.obj src\scr\tilemaze.obj & src\scr\tunnel.obj +csprobj = cspr\dbgfont.obj cspr\confont.obj incpath = -Isrc -Isrc\dos -Isrc\3dgfx -Ilibs -Ilibs\imago\src -Ilibs\anim\src & -Ilibs\midas libpath = libpath libs\imago libpath libs\anim libpath libs\midas !endif -obj = $(dosobj) $(3dobj) $(scrobj) $(srcobj) +obj = $(dosobj) $(3dobj) $(scrobj) $(srcobj) $(csprobj) bin = demo.exe opt = -otexan @@ -61,8 +61,8 @@ $(bin): cflags.occ $(obj) libs/imago/imago.lib libs/anim/anim.lib %write ldflags.lnk $(LDFLAGS) $(LD) debug all name $@ system dos4g file { @objects } @ldflags -.c: src;src/dos;src/3dgfx;src/scr -.asm: src;src/dos;src/3dgfx;src/scr +.c: src;src/dos;src/3dgfx;src/scr;cspr +.asm: src;src/dos;src/3dgfx;src/scr;cspr cflags.occ: Makefile %write $@ $(CFLAGS) diff --git a/libs/anim/Makefile b/libs/anim/Makefile index 657e083..5da7a19 100644 --- a/libs/anim/Makefile +++ b/libs/anim/Makefile @@ -2,17 +2,19 @@ obj = anim.obj track.obj alib = anim.lib def = -dM_PI=3.141592653589793 -opt = -5 -fp5 -otexan -I.. -I../../src $(def) +opt = -5 -fp5 -otexan dbg = -d1 !ifdef __UNIX__ +inc = -I.. -I../../src RM = rm -f !else +inc = -I.. -I..\..\src RM = del !endif CC = wcc386 -CFLAGS = $(dbg) $(opt) $(def) -zq -bt=dos +CFLAGS = $(dbg) $(opt) $(inc) $(def) -zq -bt=dos $(alib): $(obj) wlib -b -n $@ $(obj) diff --git a/libs/anim/src/anim.c b/libs/anim/src/anim.c index a2f1944..6468d31 100644 --- a/libs/anim/src/anim.c +++ b/libs/anim/src/anim.c @@ -617,11 +617,8 @@ void anm_set_rotation4f(struct anm_node *node, float x, float y, float z, float void anm_set_rotation_axis(struct anm_node *node, float angle, float x, float y, float z, anm_time_t tm) { cgm_quat q; - cgm_vec3 axis; - - cgm_vcons(&axis, x, y, z); - cgm_qrotation(&q, &axis, angle); + cgm_qrotation(&q, angle, x, y, z); anm_set_rotation(node, (float*)&q, tm); } diff --git a/src/data.asm b/src/data.asm index 26234fc..e9cd436 100644 --- a/src/data.asm +++ b/src/data.asm @@ -1,4 +1,4 @@ - section .data + section .data USE32 global loading_pixels global _loading_pixels diff --git a/src/dos/audos.c b/src/dos/audos.c index 513bf89..6b7709a 100644 --- a/src/dos/audos.c +++ b/src/dos/audos.c @@ -4,6 +4,7 @@ #include #include "audio.h" #include "midasdll.h" +#include "util.h" #define SET_MUS_VOL(vol) \ do { \ @@ -209,3 +210,13 @@ unsigned long get_msec(void) { return ticks * tick_interval; } + +void sleep_msec(unsigned long msec) +{ + unsigned long wakeup_time = ticks + msec / tick_interval; + while(ticks < wakeup_time) { +#ifdef USE_HLT + halt(); +#endif + } +} diff --git a/src/dos/main.c b/src/dos/main.c index 0de90ed..b415bb4 100644 --- a/src/dos/main.c +++ b/src/dos/main.c @@ -69,7 +69,7 @@ int main(int argc, char **argv) } } - if(init(argc, argv) == -1) { + if(demo_init(argc, argv) == -1) { status = -1; goto break_evloop; } @@ -83,7 +83,7 @@ int main(int argc, char **argv) for(;;) { int key; while((key = kb_getkey()) != -1) { - demo_key(key, 1); + demo_keyboard(key, 1); if(quit) goto break_evloop; } @@ -99,11 +99,11 @@ int main(int argc, char **argv) } time_msec = get_msec(); - draw(); + demo_draw(); } break_evloop: - cleanup(); + demo_cleanup(); set_text_mode(); cleanup_video(); kb_shutdown(); diff --git a/src/gfxutil.c b/src/gfxutil.c index 259b56d..d410766 100644 --- a/src/gfxutil.c +++ b/src/gfxutil.c @@ -1,6 +1,6 @@ #include -#include "gfxutil.h" #include "demo.h" +#include "gfxutil.h" enum { IN = 0, @@ -147,34 +147,58 @@ void draw_line(int x0, int y0, int x1, int y1, unsigned short color) #define BLUR(w, h, pstep, sstep) \ for(i=0; i> 3) & 0xfc) #define UNPACK_B16(c) (((c) << 3) & 0xf8) + +#ifdef BUILD_BIGENDIAN + +#define PACK_RGB32(r, g, b) \ + ((((r) & 0xff) << 8) | (((g) & 0xff) << 16) | (((b) & 0xff) << 24) | 0xff) + +#define UNPACK_R32(c) (((c) >> 8) & 0xff) +#define UNPACK_G32(c) (((c) >> 16) & 0xff) +#define UNPACK_B32(c) (((c) >> 24) & 0xff) + +#else /* LITTLE_ENDIAN */ + #define PACK_RGB32(r, g, b) \ - ((((r) & 0xff) << 16) | (((g) & 0xff) << 8) | ((b) & 0xff)) + ((((r) & 0xff) << 16) | (((g) & 0xff) << 8) | ((b) & 0xff) | 0xff000000) #define UNPACK_R32(c) (((c) >> 16) & 0xff) #define UNPACK_G32(c) (((c) >> 8) & 0xff) #define UNPACK_B32(c) ((c) & 0xff) +#endif int clip_line(int *x0, int *y0, int *x1, int *y1, int xmin, int ymin, int xmax, int ymax); void draw_line(int x0, int y0, int x1, int y1, unsigned short color); /* scale in 24.8 fixed point */ -void blur_grey_horiz(uint16_t *dest, uint16_t *src, int xsz, int ysz, int radius, int scale); -void blur_grey_vert(uint16_t *dest, uint16_t *src, int xsz, int ysz, int radius, int scale); +void blur_horiz(uint16_t *dest, uint16_t *src, int xsz, int ysz, int radius, int scale); +void blur_vert(uint16_t *dest, uint16_t *src, int xsz, int ysz, int radius, int scale); void convimg_rgb24_rgb16(uint16_t *dest, unsigned char *src, int xsz, int ysz); -void blitfb(uint16_t *dest, uint16_t *src, int xsz, int ysz, int pitch_pix); -void blitfb_key(uint16_t *dest, uint16_t *src, int xsz, int ysz, int pitch_pix, uint16_t key); +void blitfb(uint16_t *dest, uint16_t *src, int width, int height, int pitch_pix); +void blit(uint16_t *dest, int destwidth, uint16_t *src, int xsz, int ysz, int pitch_pix); +void blit_key(uint16_t *dest, int destwidth, uint16_t *src, int xsz, int ysz, int pitch_pix, uint16_t key); #endif /* GFXUTIL_H_ */ diff --git a/src/scr/greets.c b/src/scr/greets.c index 49a5b50..9a49527 100644 --- a/src/scr/greets.c +++ b/src/scr/greets.c @@ -154,22 +154,15 @@ static void draw(void) draw_smktxt(stx); g3d_framebuffer(FB_WIDTH, FB_HEIGHT, fb_pixels); - dest = fb_pixels; - src = cur_smokebuf; - for(i=0; i> 8) & 0xff) | (((x) & 0xff) << 8)) +#define BSWAP32(x) \ + ((((x) >> 24) & 0xff) | \ + (((x) >> 8) & 0xff00) | \ + (((x) << 8) & 0xff0000) | \ + ((x) << 24)) + +#if defined(__i386__) || defined(__x86_64__) || defined(__386__) || defined(MSDOS) /* fast conversion of double -> 32bit int * for details see: * - http://chrishecker.com/images/f/fb/Gdmfp.pdf @@ -26,10 +34,56 @@ static INLINE int32_t cround64(double val) val += 6755399441055744.0; return *(int32_t*)&val; } +#else +#define cround64(x) ((int32_t)(x)) +#endif + +static INLINE float rsqrt(float x) +{ + float xhalf = x * 0.5f; + int32_t i = *(int32_t*)&x; + i = 0x5f3759df - (i >> 1); + x = *(float*)&i; + x = x * (1.5f - xhalf * x * x); + return x; +} extern uint32_t perf_start_count, perf_interval_count; #ifdef __WATCOMC__ +void memset16(void *dest, uint16_t val, int count); +#pragma aux memset16 = \ + "cld" \ + "test ecx, 1" \ + "jz memset16_dwords" \ + "rep stosw" \ + "jmp memset16_done" \ + "memset16_dwords:" \ + "shr ecx, 1" \ + "push ax" \ + "shl eax, 16" \ + "pop ax" \ + "rep stosd" \ + "memset16_done:" \ + parm[edi][ax][ecx]; + +#ifdef USE_MMX +void memcpy64(void *dest, void *src, int count); +#pragma aux memcpy64 = \ + "cploop:" \ + "movq mm0, [edx]" \ + "movq [ebx], mm0" \ + "add edx, 8" \ + "add ebx, 8" \ + "dec ecx" \ + "jnz cploop" \ + "emms" \ + parm[ebx][edx][ecx] \ + modify[8087]; +#else +#define memcpy64(dest, src, count) memcpy(dest, src, (count) << 3) +#endif + void perf_start(void); #pragma aux perf_start = \ "xor eax, eax" \ @@ -52,14 +106,49 @@ void debug_break(void); void halt(void); #pragma aux halt = "hlt"; - -void memset16(void *ptr, int val, int count); -#pragma aux memset16 = \ - "rep stosw" \ - parm[edi][eax][ecx]; #endif #ifdef __GNUC__ +#if defined(__i386__) || defined(__x86_64__) +#define memset16(dest, val, count) asm volatile ( \ + "cld\n\t" \ + "test $1, %2\n\t" \ + "jz 0f\n\t" \ + "rep stosw\n\t" \ + "jmp 1f\n\t" \ + "0:\n\t" \ + "shr $1, %2\n\t" \ + "push %%ax\n\t" \ + "shl $16, %%eax\n\t" \ + "pop %%ax\n\t" \ + "rep stosl\n\t" \ + "1:\n\t"\ + :: "D"(dest), "a"((uint16_t)(val)), "c"(count) \ + : "memory") +#else +static void INLINE memset16(void *dest, uint16_t val, int count) +{ + uint16_t *ptr = dest; + while(count--) *ptr++ = val; +} +#endif + +#ifdef USE_MMX +#define memcpy64(dest, src, count) asm volatile ( \ + "0:\n\t" \ + "movq (%1), %%mm0\n\t" \ + "movq %%mm0, (%0)\n\t" \ + "add $8, %1\n\t" \ + "add $8, %0\n\t" \ + "dec %2\n\t" \ + "jnz 0b\n\t" \ + "emms\n\t" \ + :: "r"(dest), "r"(src), "r"(count) \ + : "%mm0") +#else +#define memcpy64(dest, src, count) memcpy(dest, src, (count) << 3) +#endif + #define perf_start() asm volatile ( \ "xor %%eax, %%eax\n" \ "cpuid\n" \ @@ -83,13 +172,30 @@ void memset16(void *ptr, int val, int count); #define halt() \ asm volatile("hlt") - -#define memset16(ptr, val, count) asm volatile ( \ - "rep stosw\n\t" \ - :: "D"(ptr), "a"(val), "c"(count)) #endif #ifdef _MSC_VER +void __inline memset16(void *dest, uint16_t val, int count) +{ + __asm { + cld + mov ax, val + mov edi, dest + mov ecx, count + test ecx, 1 + jz memset16_dwords + rep stosw + jmp memset16_done + memset16_dwords: + shr ecx, 1 + push ax + shl eax, 16 + pop ax + rep stosd + memset16_done: + } +} + #define perf_start() \ do { \ __asm { \ @@ -115,16 +221,6 @@ void memset16(void *ptr, int val, int count); do { \ __asm { int 3 } \ } while(0) - -#define memset16(ptr, val, count) \ - do { \ - __asm { \ - mov edi, ptr \ - mov ecx, count \ - mov eax, val \ - rep stosw \ - } \ - } while(0) #endif #endif /* UTIL_H_ */ diff --git a/tools/csprite/src/main.c b/tools/csprite/src/main.c index fab302b..039a0eb 100644 --- a/tools/csprite/src/main.c +++ b/tools/csprite/src/main.c @@ -147,6 +147,7 @@ const char *prefixfmt[] = { "\tsection .text\n" "\tglobal %s\n" "\tglobal _%s\n" + "\tglobal %s_\n" "%s:\n" "_%s:\n" "\tmov eax, [esp + 12]\n" @@ -162,6 +163,17 @@ const char *prefixfmt[] = { "\tmov edx, eax\n" "\tmov eax, [esp + 16]\n" "\tjmp [titletab + eax * 4]\n\n" + "%s_:\n" + "\tpush eax\n" + "\tmov eax, ebx\n" + "\tshl eax, 9\n" + "\tshl ebx, 7\n" + "\tadd eax, ebx\n" + "\tshl edx, 1\n" + "\tadd eax, edx\n" + "\tpop edx\n" + "\tadd edx, eax\n" + "\tjmp [titletab + ecx * 4]\n\n" "titletab:\n" }; @@ -217,7 +229,7 @@ int proc_sheet(const char *fname) ysz = tile_ysz; } - printf(prefixfmt[asyntax], name, name, name, name, fbpitch); + printf(prefixfmt[asyntax], name, name, name, name, name, fbpitch, name); for(i=0; i