5 #define LOWBUF_SIZE 8192
6 #define RMSTACK_SIZE 4096
8 static char *lowbuf, *lowfree;
9 static uint16_t lowbuf_sel, lowbuf_seg;
13 if(!(lowbuf_seg = dpmi_alloc(LOWBUF_SIZE >> 4, &lowbuf_sel))) {
14 fprintf(stderr, "DPMI init failed to allocate low memory buffer\n");
17 lowbuf = (char*)((intptr_t)lowbuf_seg << 4);
18 lowfree = lowbuf + RMSTACK_SIZE;
22 void dpmi_cleanup(void)
24 if(!lowbuf_sel) return;
25 dpmi_free(lowbuf_sel);
31 void *dpmi_lowbuf(void)
36 uint16_t dpmi_alloc(unsigned int par, uint16_t *sel)
38 union REGS regs = {0};
42 int386(0x31, ®s, ®s);
43 if(regs.w.cflag != 0) {
50 void dpmi_free(uint16_t sel)
52 union REGS regs = {0};
56 int386(0x31, ®s, ®s);
59 int dpmi_rmint(int inum, struct dpmi_regs *dregs)
61 union REGS regs = {0};
62 struct SREGS sregs = {0};
66 sregs.es = FP_SEG(dregs);
67 regs.x.edi = FP_OFF(dregs);
68 sregs.ss = lowbuf_seg; /* 4k real mode stack */
69 int386x(0x31, ®s, ®s, &sregs);
70 if(regs.x.cflag != 0) {
76 void *dpmi_mmap(uint32_t phys_addr, unsigned int size)
78 union REGS regs = {0};
81 regs.w.bx = phys_addr >> 16;
82 regs.w.cx = phys_addr & 0xffff;
83 regs.w.si = size >> 16;
84 regs.w.di = size & 0xffff;
85 int386(0x31, ®s, ®s);
86 if(regs.w.cflag != 0) {
90 return (void*)(((intptr_t)regs.w.bx << 16) | (intptr_t)regs.w.cx);
93 void dpmi_munmap(void *ptr)
95 union REGS regs = {0};
96 intptr_t addr = (intptr_t)ptr;
99 regs.w.bx = addr >> 16;
100 regs.w.cx = addr & 0xffff;
101 int386(0x31, ®s, ®s);