cross compile on UNIX with open watcom, and cleanup watdpmi
[dos_imgv] / src / watdpmi.c
1 #ifdef __WATCOMC__
2 #include <i86.h>
3 #include "cdpmi.h"
4
5 uint16_t dpmi_alloc(unsigned int par, uint16_t *sel)
6 {
7         union REGS regs = {0};
8
9         regs.w.ax = 0x100;
10         regs.w.bx = par;
11         int386(0x31, &regs, &regs);
12
13         if(regs.w.cflag) {
14                 return 0;
15         }
16
17         *sel = regs.w.dx;
18         return regs.w.ax;
19 }
20
21 void dpmi_free(uint16_t sel)
22 {
23         union REGS regs = {0};
24
25         regs.w.ax = 0x101;
26         regs.w.dx = sel;
27         int386(0x31, &regs, &regs);
28 }
29
30 void dpmi_int(int inum, struct dpmi_real_regs *dregs)
31 {
32         union REGS regs = {0};
33
34         regs.x.eax = 0x300;
35         regs.x.edi = (uint32_t)dregs;
36         regs.x.ebx = inum & 0xff;
37         int386(0x31, &regs, &regs);
38 }
39
40 void *dpmi_mmap(uint32_t phys_addr, unsigned int size)
41 {
42         union REGS regs = {0};
43
44         regs.w.ax = 0x800;
45         regs.w.bx = phys_addr >> 16;
46         regs.w.cx = phys_addr;
47         regs.w.si = size >> 16;
48         regs.w.di = size;
49
50         int386(0x31, &regs, &regs);
51
52         if(regs.w.cflag) {
53                 return 0;
54         }
55         return (void*)(((uint32_t)regs.w.bx << 16) | regs.w.cx);
56 }
57
58 void dpmi_munmap(void *addr)
59 {
60         union REGS regs = {0};
61         regs.w.ax = 0x801;
62         regs.w.bx = (uint32_t)addr >> 16;
63         regs.w.cx = (uint32_t)addr;
64         int386(0x31, &regs, &regs);
65 }
66 #else
67 int stop_gcc_warn_empty_watdpmi_c = 0;
68 #endif  /* __WATCOM__ */