vbeinfo

diff src/dpmi.c @ 0:4b33fa83e381

vbeinfo initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 05 Dec 2015 07:28:47 +0200
parents
children 5b0ef094b8fd
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/dpmi.c	Sat Dec 05 07:28:47 2015 +0200
     1.3 @@ -0,0 +1,55 @@
     1.4 +#include "dpmi.h"
     1.5 +
     1.6 +void dpmi_real_int(int inum, struct dpmi_real_regs *regs)
     1.7 +{
     1.8 +	unsigned char int_num = (unsigned char)inum;
     1.9 +	__asm {
    1.10 +		mov eax, 0x300
    1.11 +		mov edi, regs
    1.12 +		mov bl, int_num
    1.13 +		mov bh, 0
    1.14 +		xor ecx, ecx
    1.15 +		int 0x31
    1.16 +	}
    1.17 +}
    1.18 +
    1.19 +void *dpmi_mmap(uint32_t phys_addr, unsigned int size)
    1.20 +{
    1.21 +	uint16_t mem_high, mem_low;
    1.22 +	uint16_t phys_high = phys_addr >> 16;
    1.23 +	uint16_t phys_low = phys_addr & 0xffff;
    1.24 +	uint16_t size_high = size >> 16;
    1.25 +	uint16_t size_low = size & 0xffff;
    1.26 +	unsigned int err, res = 0;
    1.27 +
    1.28 +	__asm {
    1.29 +		mov eax, 0x800
    1.30 +		mov bx, phys_high
    1.31 +		mov cx, phys_low
    1.32 +		mov si, size_high
    1.33 +		mov di, size_low
    1.34 +		int 0x31
    1.35 +		add res, 1
    1.36 +		mov err, eax
    1.37 +		mov mem_high, bx
    1.38 +		mov mem_low, cx
    1.39 +	}
    1.40 +
    1.41 +	if(res == 2) {
    1.42 +		return 0;
    1.43 +	}
    1.44 +	return (void*)(((uint32_t)mem_high << 16) | ((uint32_t)mem_low));
    1.45 +}
    1.46 +
    1.47 +void dpmi_munmap(void *addr)
    1.48 +{
    1.49 +	uint16_t mem_high = (uint32_t)addr >> 16;
    1.50 +	uint16_t mem_low = (uint16_t)addr;
    1.51 +
    1.52 +	__asm {
    1.53 +		mov eax, 0x801
    1.54 +		mov bx, mem_high
    1.55 +		mov cx, mem_low
    1.56 +		int 0x31
    1.57 +	}
    1.58 +}