6 #define LOWBUF_SIZE 8192
7 #define RMSTACK_SIZE 4096
9 static char *lowbuf, *lowfree;
10 static uint16_t lowbuf_sel, lowbuf_seg;
14 if(!(lowbuf_seg = dpmi_alloc(LOWBUF_SIZE >> 4, &lowbuf_sel))) {
15 errormsg("DPMI init failed to allocate low memory buffer\n");
18 lowbuf = (char*)((intptr_t)lowbuf_seg << 4);
19 lowfree = lowbuf + RMSTACK_SIZE;
23 void dpmi_cleanup(void)
25 if(!lowbuf_sel) return;
26 dpmi_free(lowbuf_sel);
32 void *dpmi_lowbuf(void)
37 uint16_t dpmi_alloc(unsigned int par, uint16_t *sel)
39 union REGS regs = {0};
43 int386(0x31, ®s, ®s);
44 if(regs.w.cflag != 0) {
51 void dpmi_free(uint16_t sel)
53 union REGS regs = {0};
57 int386(0x31, ®s, ®s);
60 int dpmi_rmint(int inum, struct dpmi_regs *dregs)
62 union REGS regs = {0};
63 struct SREGS sregs = {0};
67 sregs.es = FP_SEG(dregs);
68 regs.x.edi = FP_OFF(dregs);
69 sregs.ss = lowbuf_seg; /* 4k real mode stack */
70 int386x(0x31, ®s, ®s, &sregs);
71 if(regs.x.cflag != 0) {
77 void *dpmi_mmap(uint32_t phys_addr, unsigned int size)
79 union REGS regs = {0};
82 regs.w.bx = phys_addr >> 16;
83 regs.w.cx = phys_addr & 0xffff;
84 regs.w.si = size >> 16;
85 regs.w.di = size & 0xffff;
86 int386(0x31, ®s, ®s);
87 if(regs.w.cflag != 0) {
91 return (void*)(((intptr_t)regs.w.bx << 16) | (intptr_t)regs.w.cx);
94 void dpmi_munmap(void *ptr)
96 union REGS regs = {0};
97 intptr_t addr = (intptr_t)ptr;
100 regs.w.bx = addr >> 16;
101 regs.w.cx = addr & 0xffff;
102 int386(0x31, ®s, ®s);