Xref: news2.mv.net comp.os.msdos.djgpp:4130 From: rick AT efn DOT org (Rick Bronson) Newsgroups: comp.os.msdos.djgpp Subject: Re: Acessing DPMI memory without farptr Date: 22 May 1996 03:45:46 GMT Organization: Invivo Research Inc. Lines: 69 Message-ID: References: <000000199912915529827 AT bryanston DOT co DOT uk> NNTP-Posting-Host: 204.214.97.233 In-reply-to: Bryanston School's message of Tue, 21 May 1996 13:23:47 GMT To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp In article <000000199912915529827 AT bryanston DOT co DOT uk> Bryanston School writes: > Is there a way to access memory allocated through the __dpmi functions > through pointers? I would prefer to access it directly, rather than > using things like _farpeekb and so on. It's annoying to have to use > _farpeek functions when dumping 1 Mb to a file, for example. I am > trying to capture an area of memory which is mapped into linear memory > off a physical device to disk. I mapped this memory using the instructions > in the FAQ (map physical memory, allocate descriptor, set limits and base), > but I don't seem to be able to access it without using the _farpeek / = > _farpoke > functions. Is there a quick way to do fwrite(memory, sizeof(memory), = > sizeof(int), filehandle) without doing it in a loop and transferring 4 = > bytes to the disk at once? > > Also, I have found that declaring a lot of local variables in > main() sometimes gives errors, such as variables changing between > one printf() and another. Is this a known feature/bug, and if so what > should I do about it? I am currently declaring them global, which seems > to work. I'll post the code if this sounds strange. > > Thanks in advance, > > Thomas Molesworth > mailto:MOLESWORTH DOT THOMAS AT bryanston DOT co DOT uk Here is an example: #include #include int _crt0_startup_flags = _CRT0_FLAG_NEARPTR | _CRT0_FLAG_NONMOVE_SBRK; #define PAGE_SIZE 4096 #define PAGE_MASK (PAGE_SIZE - 1) #define NON_PAGE_MASK ~(PAGE_MASK) void *dpmi_mmap(uint32 phys_address, uint32 size) { void *our_addr; unsigned long addr_pg_align, rem_pg_align, size_pg_align; __dpmi_meminfo meminfo; uint32 base_address; uint32 old_DS_limit; uint32 linear_address; int ret_val; rem_pg_align = phys_address & PAGE_MASK; addr_pg_align = phys_address & NON_PAGE_MASK; size_pg_align = (size + rem_pg_align + PAGE_MASK) & NON_PAGE_MASK; meminfo.size = size_pg_align; meminfo.address = addr_pg_align; ret_val = __dpmi_physical_address_mapping(&meminfo); /* DPMI 0.9 AX=0800 */ if (ret_val) printf ("800 %d 0x%x\n", ret_val, __dpmi_error); linear_address = (char *)(meminfo.address + __djgpp_conventional_base); /* get linear address */ return ((void *) (linear_address)); } _ | | / /__ ..------------------------------------------------------------._______/ (___) | Rick Bronson rick AT efn DOT org Tel 541-465-9008 _o_ | (___) | Invivo Research http://www.efn.org/~rick \|/ |_______ (___) | 745 Foothill Drive "Onde esta dinheiro?" `---' | \_(___) | Eugene, OR 97405-4651 -- Gal Costa Disk | Golf| `------------------------------------------------------------'