5e703478ad915fdafeae02d1db7920d5af2f34c7
[dos_imgv] / src / watdpmi.c
1 #ifdef __WATCOMC__
2 #include <i86.h>
3 #include "cdpmi.h"
4
5 void dpmi_real_int(int inum, struct dpmi_real_regs *regs)
6 {
7         unsigned char int_num = (unsigned char)inum;
8         __asm {
9                 mov eax, 0x300
10                 mov edi, regs
11                 mov bl, int_num
12                 mov bh, 0
13                 xor ecx, ecx
14                 int 0x31
15         }
16 }
17
18 void *dpmi_mmap(uint32_t phys_addr, unsigned int size)
19 {
20         union REGS regs = {0};
21
22         regs.x.eax = 0x800;
23         regs.x.ebx = phys_addr >> 16;
24         regs.x.ecx = phys_addr & 0xffff;
25         regs.x.esi = size >> 16;
26         regs.x.edi = size & 0xffff;
27
28         int386(0x31, &regs, &regs);
29
30         if(regs.x.cflag) {
31                 return 0;
32         }
33         return (void*)((regs.x.ebx << 16) | (regs.x.ecx & 0xffff));
34 }
35
36 void dpmi_munmap(void *addr)
37 {
38         union REGS regs = {0};
39         regs.x.eax = 0x801;
40         regs.x.ebx = (uint32_t)addr >> 16;
41         regs.x.ecx = (uint32_t)addr & 0xffff;
42         int386(0x31, &regs, &regs);
43 }
44 #else
45 int stop_gcc_warn_empty_watdpmi_c = 0;
46 #endif  /* __WATCOM__ */