nuclear@0: #include "dpmi.h" nuclear@0: nuclear@0: void dpmi_real_int(int inum, struct dpmi_real_regs *regs) nuclear@0: { nuclear@0: unsigned char int_num = (unsigned char)inum; nuclear@0: __asm { nuclear@0: mov eax, 0x300 nuclear@0: mov edi, regs nuclear@0: mov bl, int_num nuclear@0: mov bh, 0 nuclear@0: xor ecx, ecx nuclear@0: int 0x31 nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: void *dpmi_mmap(uint32_t phys_addr, unsigned int size) nuclear@0: { nuclear@0: uint16_t mem_high, mem_low; nuclear@0: uint16_t phys_high = phys_addr >> 16; nuclear@0: uint16_t phys_low = phys_addr & 0xffff; nuclear@0: uint16_t size_high = size >> 16; nuclear@0: uint16_t size_low = size & 0xffff; nuclear@0: unsigned int err, res = 0; nuclear@0: nuclear@0: __asm { nuclear@0: mov eax, 0x800 nuclear@0: mov bx, phys_high nuclear@0: mov cx, phys_low nuclear@0: mov si, size_high nuclear@0: mov di, size_low nuclear@0: int 0x31 nuclear@0: add res, 1 nuclear@0: mov err, eax nuclear@0: mov mem_high, bx nuclear@0: mov mem_low, cx nuclear@0: } nuclear@0: nuclear@0: if(res == 2) { nuclear@0: return 0; nuclear@0: } nuclear@0: return (void*)(((uint32_t)mem_high << 16) | ((uint32_t)mem_low)); nuclear@0: } nuclear@0: nuclear@0: void dpmi_munmap(void *addr) nuclear@0: { nuclear@0: uint16_t mem_high = (uint32_t)addr >> 16; nuclear@0: uint16_t mem_low = (uint16_t)addr; nuclear@0: nuclear@0: __asm { nuclear@0: mov eax, 0x801 nuclear@0: mov bx, mem_high nuclear@0: mov cx, mem_low nuclear@0: int 0x31 nuclear@0: } nuclear@0: }