X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=blobdiff_plain;f=src%2Fdos%2Fcdpmi.h;h=92bc5b358ad2d2e05aacb2b83c3bd9114ab2a24e;hp=9ce64e19c00545675a1ce356ce262382a1e23fd9;hb=92bc7be93ea01896b93f2986c6029b5932c32d97;hpb=0165ec15f868a16a70b56ada2d42db0cb69ea193 diff --git a/src/dos/cdpmi.h b/src/dos/cdpmi.h index 9ce64e1..92bc5b3 100644 --- a/src/dos/cdpmi.h +++ b/src/dos/cdpmi.h @@ -6,39 +6,79 @@ #endif #include "inttypes.h" +#include "util.h" -struct dpmi_real_regs { +#pragma pack (push, 1) +struct dpmi_regs { uint32_t edi, esi, ebp; uint32_t reserved; uint32_t ebx, edx, ecx, eax; uint16_t flags; uint16_t es, ds, fs, gs; uint16_t ip, cs, sp, ss; -}; +} PACKED; +#pragma pack (pop) uint16_t dpmi_alloc(unsigned int par, uint16_t *sel); void dpmi_free(uint16_t sel); +void dpmi_int(int inum, struct dpmi_regs *regs); +void *dpmi_mmap(uint32_t phys_addr, unsigned int size); +void dpmi_munmap(void *addr); #ifdef __WATCOMC__ #pragma aux dpmi_alloc = \ - "mov eax, 0x100" \ + "mov ax, 0x100" \ "int 0x31" \ "mov [edi], dx" \ - value[ax] parm[ebx][edi]; + "jnc alloc_skip_err" \ + "xor ax, ax" \ + "alloc_skip_err:" \ + value[ax] \ + parm[ebx][edi] \ + modify[dx]; #pragma aux dpmi_free = \ - "mov eax, 0x101" \ + "mov ax, 0x101" \ + "int 0x31" \ + parm[dx] \ + modify[ax]; + +#pragma aux dpmi_int = \ + "mov ax, 0x300" \ + "xor ecx, ecx" \ + "int 0x31" \ + parm[ebx][edi] \ + modify[ax ecx]; + +#pragma aux dpmi_mmap = \ + "mov ax, 0x800" \ + "mov cx, bx" \ + "shr ebx, 16" \ + "mov di, si" \ + "shr esi, 16" \ "int 0x31" \ - parm[dx]; + "jnc mmap_skip_err" \ + "xor bx, bx" \ + "xor cx, cx" \ + "mmap_skip_err:" \ + "mov ax, bx" \ + "shl eax, 16" \ + "mov ax, cx" \ + value[eax] \ + parm[ebx][esi] \ + modify[bx cx di esi]; -void dpmi_real_int(int inum, struct dpmi_real_regs *regs); +#pragma aux dpmi_munmap = \ + "mov ax, 0x801" \ + "mov cx, bx" \ + "shr ebx, 16" \ + "int 0x31" \ + parm[ebx] \ + modify[ax cx ebx]; #endif /* __WATCOMC__ */ #ifdef __DJGPP__ -#define dpmi_real_int(inum, regs) __dpmi_int((inum), (__dpmi_regs*)(regs)) +#define dpmi_int(inum, regs) __dpmi_int((inum), (__dpmi_regs*)(regs)) #endif -void *dpmi_mmap(uint32_t phys_addr, unsigned int size); -void dpmi_munmap(void *addr); - #endif /* DPMI_H_ */