From f138909ecb1ff7fefe587be7e315b859d6d11c5c Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Tue, 7 Dec 2021 08:38:30 +0200 Subject: [PATCH] cross compile on UNIX with open watcom, and cleanup watdpmi --- .gitignore | 6 ++++++ Makefile | 20 ++++++++++++++++- imago/Makefile | 34 +++++++++++++++++++++++++++++ imago/src/byteord.h | 3 ++- src/cdpmi.h | 52 -------------------------------------------- src/main.c | 4 ++++ src/util.h | 8 ++++++- src/watdpmi.c | 60 +++++++++++++++++++++++++++++++++++---------------- 8 files changed, 113 insertions(+), 74 deletions(-) diff --git a/.gitignore b/.gitignore index a92deef..dd8d635 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,9 @@ *.LNK *.zip *.ZIP +*.jpg +*.JPG +*.png +*.PNG +*.map +*.MAP diff --git a/Makefile b/Makefile index 9cfb3ab..802614e 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,13 @@ bin = imgv.exe warn = -w=3 dbg = -d3 def = -DNO_STDINT_H +!ifdef __UNIX__ +inc = -Iimago/src +libimago = imago/imago.lib +!else inc = -Iimago\src +libimago = imago\imago.lib +!endif libdir = libpath imago CC = wcc386 @@ -13,7 +19,7 @@ LD = wlink CFLAGS = $(warn) $(dbg) $(opt) $(def) -zq -bt=dos $(inc) LDFLAGS = $(libdir) library { imago.lib } -$(bin): $(obj) +$(bin): $(obj) $(libimago) %write objects.lnk $(obj) %write ldflags.lnk $(LDFLAGS) $(LD) debug all option map name $@ system dos4g file { @objects } @ldflags @@ -27,8 +33,20 @@ $(bin): $(obj) .asm.obj: nasm -f obj -o $@ $[*.asm +$(libimago): + cd imago + wmake + cd .. + +!ifdef __UNIX__ +clean: .symbolic + rm -f $(obj) + rm -f objects.lnk ldflags.lnk + rm -f $(bin) +!else clean: .symbolic del *.obj del objects.lnk del ldflags.lnk del $(bin) +!endif diff --git a/imago/Makefile b/imago/Makefile index b37df0c..c710306 100644 --- a/imago/Makefile +++ b/imago/Makefile @@ -1,3 +1,29 @@ +!ifdef __UNIX__ +libpng = libpng/png.obj libpng/pngerror.obj libpng/pngget.obj libpng/pngmem.obj & + libpng/pngpread.obj libpng/pngread.obj libpng/pngrio.obj libpng/pngrtran.obj & + libpng/pngrutil.obj libpng/pngset.obj libpng/pngtrans.obj libpng/pngwio.obj & + libpng/pngwrite.obj libpng/pngwtran.obj libpng/pngwutil.obj +zlib = zlib/adler32.obj zlib/compress.obj zlib/crc32.obj zlib/deflate.obj & + zlib/gzio.obj zlib/infback.obj zlib/inffast.obj zlib/inflate.obj & + zlib/inftrees.obj zlib/trees.obj zlib/uncompr.obj zlib/zutil.obj +jpeglib = jpeglib/jcapimin.obj jpeglib/jcapistd.obj jpeglib/jccoefct.obj & + jpeglib/jccolor.obj jpeglib/jcdctmgr.obj jpeglib/jchuff.obj jpeglib/jcinit.obj & + jpeglib/jcmainct.obj jpeglib/jcmarker.obj jpeglib/jcmaster.obj jpeglib/jcomapi.obj & + jpeglib/jcparam.obj jpeglib/jcphuff.obj jpeglib/jcprepct.obj jpeglib/jcsample.obj & + jpeglib/jctrans.obj jpeglib/jdapimin.obj jpeglib/jdapistd.obj jpeglib/jdatadst.obj & + jpeglib/jdatasrc.obj jpeglib/jdcoefct.obj jpeglib/jdcolor.obj jpeglib/jddctmgr.obj & + jpeglib/jdhuff.obj jpeglib/jdinput.obj jpeglib/jdmainct.obj jpeglib/jdmarker.obj & + jpeglib/jdmaster.obj jpeglib/jdmerge.obj jpeglib/jdphuff.obj jpeglib/jdpostct.obj & + jpeglib/jdsample.obj jpeglib/jdtrans.obj jpeglib/jerror.obj jpeglib/jfdctflt.obj & + jpeglib/jfdctfst.obj jpeglib/jfdctint.obj jpeglib/jidctflt.obj jpeglib/jidctfst.obj & + jpeglib/jidctint.obj jpeglib/jidctred.obj jpeglib/jmemmgr.obj jpeglib/jmemnobs.obj & + jpeglib/jquant1.obj jpeglib/jquant2.obj jpeglib/jutils.obj +obj = src/conv.obj src/filejpeg.obj src/filepng.obj src/fileppm.obj src/filergbe.obj & + src/filetga.obj src/filelbm.obj src/ftmodule.obj src/imago2.obj src/imago_gl.obj & + src/byteord.obj src/modules.obj $(libpng) $(zlib) $(jpeglib) + +!else + libpng = libpng\png.obj libpng\pngerror.obj libpng\pngget.obj libpng\pngmem.obj & libpng\pngpread.obj libpng\pngread.obj libpng\pngrio.obj libpng\pngrtran.obj & libpng\pngrutil.obj libpng\pngset.obj libpng\pngtrans.obj libpng\pngwio.obj & @@ -20,6 +46,7 @@ jpeglib = jpeglib\jcapimin.obj jpeglib\jcapistd.obj jpeglib\jccoefct.obj & obj = src\conv.obj src\filejpeg.obj src\filepng.obj src\fileppm.obj src\filergbe.obj & src\filetga.obj src\filelbm.obj src\ftmodule.obj src\imago2.obj src\imago_gl.obj & src\byteord.obj src\modules.obj $(libpng) $(zlib) $(jpeglib) +!endif alib = imago.lib @@ -40,6 +67,12 @@ $(alib): $(obj) .c.obj: .autodepend $(CC) -fo=$@ $(CFLAGS) $[* +!ifdef __UNIX__ +clean: .symbolic + rm -f $(obj) + rm -f objects.lbc + rm -f $(alib) +!else clean: .symbolic del src\*.obj del zlib\*.obj @@ -47,3 +80,4 @@ clean: .symbolic del jpeglib\*.obj del objects.lbc del $(alib) +!endif diff --git a/imago/src/byteord.h b/imago/src/byteord.h index dcec6e2..c3c3858 100644 --- a/imago/src/byteord.h +++ b/imago/src/byteord.h @@ -23,7 +23,8 @@ along with this program. If not, see . #else #include #endif -#if defined(__DOS__) || defined(DOS) + +#if defined(__WATCOMC__) && __WATCOMC__ < 1200 typedef signed char int8_t; typedef unsigned char uint8_t; typedef short int16_t; diff --git a/src/cdpmi.h b/src/cdpmi.h index 91dbb67..858abe0 100644 --- a/src/cdpmi.h +++ b/src/cdpmi.h @@ -34,58 +34,6 @@ void dpmi_int(int inum, struct dpmi_regs *regs); void *dpmi_mmap(uint32_t phys_addr, unsigned int size); void dpmi_munmap(void *addr); -#ifdef __WATCOMC__ -#pragma aux dpmi_alloc = \ - "mov ax, 0x100" \ - "int 0x31" \ - "mov [edi], dx" \ - "jnc alloc_skip_err" \ - "xor ax, ax" \ - "alloc_skip_err:" \ - value[ax] \ - parm[ebx][edi] \ - modify[dx]; - -#pragma aux dpmi_free = \ - "mov ax, 0x101" \ - "int 0x31" \ - parm[dx] \ - modify[ax]; - -#pragma aux dpmi_int = \ - "mov ax, 0x300" \ - "xor ecx, ecx" \ - "int 0x31" \ - parm[ebx][edi] \ - modify[ax ecx]; - -#pragma aux dpmi_mmap = \ - "mov ax, 0x800" \ - "mov cx, bx" \ - "shr ebx, 16" \ - "mov di, si" \ - "shr esi, 16" \ - "int 0x31" \ - "jnc mmap_skip_err" \ - "xor bx, bx" \ - "xor cx, cx" \ - "mmap_skip_err:" \ - "mov ax, bx" \ - "shl eax, 16" \ - "mov ax, cx" \ - value[eax] \ - parm[ebx][esi] \ - modify[bx cx di esi]; - -#pragma aux dpmi_munmap = \ - "mov ax, 0x801" \ - "mov cx, bx" \ - "shr ebx, 16" \ - "int 0x31" \ - parm[ebx] \ - modify[ax cx ebx]; -#endif /* __WATCOMC__ */ - #ifdef __DJGPP__ #define dpmi_int(inum, regs) __dpmi_int((inum), (__dpmi_regs*)(regs)) #endif diff --git a/src/main.c b/src/main.c index 7ab236f..e7d464b 100644 --- a/src/main.c +++ b/src/main.c @@ -6,6 +6,10 @@ #include "mouse.h" #include "imago2.h" +int switch_mode(int m); +int find_best_mode(int minx, int miny); +void drop_equiv_modes(void); + void display8(void); void display16(void); void display24(void); diff --git a/src/util.h b/src/util.h index 1032520..6d1e57e 100644 --- a/src/util.h +++ b/src/util.h @@ -3,13 +3,19 @@ #ifdef NO_STDINT_H + +#if __WATCOMC__ >= 1200 +#include +#else typedef char int8_t; typedef unsigned char uint8_t; typedef short int16_t; typedef unsigned short uint16_t; typedef int int32_t; typedef unsigned int uint32_t; -typedef unsigned long intptr_t; +typedef unsigned long uintptr_t; +#endif + #else #include #endif diff --git a/src/watdpmi.c b/src/watdpmi.c index 5e70347..18f61a1 100644 --- a/src/watdpmi.c +++ b/src/watdpmi.c @@ -2,43 +2,65 @@ #include #include "cdpmi.h" -void dpmi_real_int(int inum, struct dpmi_real_regs *regs) +uint16_t dpmi_alloc(unsigned int par, uint16_t *sel) { - unsigned char int_num = (unsigned char)inum; - __asm { - mov eax, 0x300 - mov edi, regs - mov bl, int_num - mov bh, 0 - xor ecx, ecx - int 0x31 + union REGS regs = {0}; + + regs.w.ax = 0x100; + regs.w.bx = par; + int386(0x31, ®s, ®s); + + if(regs.w.cflag) { + return 0; } + + *sel = regs.w.dx; + return regs.w.ax; +} + +void dpmi_free(uint16_t sel) +{ + union REGS regs = {0}; + + regs.w.ax = 0x101; + regs.w.dx = sel; + int386(0x31, ®s, ®s); +} + +void dpmi_int(int inum, struct dpmi_real_regs *dregs) +{ + union REGS regs = {0}; + + regs.x.eax = 0x300; + regs.x.edi = (uint32_t)dregs; + regs.x.ebx = inum & 0xff; + int386(0x31, ®s, ®s); } void *dpmi_mmap(uint32_t phys_addr, unsigned int size) { union REGS regs = {0}; - regs.x.eax = 0x800; - regs.x.ebx = phys_addr >> 16; - regs.x.ecx = phys_addr & 0xffff; - regs.x.esi = size >> 16; - regs.x.edi = size & 0xffff; + regs.w.ax = 0x800; + regs.w.bx = phys_addr >> 16; + regs.w.cx = phys_addr; + regs.w.si = size >> 16; + regs.w.di = size; int386(0x31, ®s, ®s); - if(regs.x.cflag) { + if(regs.w.cflag) { return 0; } - return (void*)((regs.x.ebx << 16) | (regs.x.ecx & 0xffff)); + return (void*)(((uint32_t)regs.w.bx << 16) | regs.w.cx); } void dpmi_munmap(void *addr) { union REGS regs = {0}; - regs.x.eax = 0x801; - regs.x.ebx = (uint32_t)addr >> 16; - regs.x.ecx = (uint32_t)addr & 0xffff; + regs.w.ax = 0x801; + regs.w.bx = (uint32_t)addr >> 16; + regs.w.cx = (uint32_t)addr; int386(0x31, ®s, ®s); } #else -- 1.7.10.4