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