#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, ®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