cross compile on UNIX with open watcom, and cleanup watdpmi
[dos_imgv] / src / watdpmi.c
index 5e70347..18f61a1 100644 (file)
@@ -2,43 +2,65 @@
 #include <i86.h>
 #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, &regs, &regs);
+
+       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, &regs, &regs);
+}
+
+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, &regs, &regs);
 }
 
 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, &regs, &regs);
 
-       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, &regs, &regs);
 }
 #else