Mail Archives: djgpp/2007/09/24/17:00:10
"Rod Pemberton" <do_not_have AT nowhere DOT cmm> wrote in message
news:fd95kj$sgt$1 AT aioe DOT org...
> "Gerrit van Niekerk" <gerritvn AT gpvno DOT co DOT za> wrote in message
> news:46F82772 DOT 52 DOT 2124586E AT gerritvn DOT gpvno DOT co DOT za...
> > Have you actually done DMA programming using DJGPP and PMODEDJ ?
>
> No, I've not done any DMA programming with DJGPP. That was why I posted
the
> "?" - meaning I didn't have an answer to the rest of your original
> questions.
>
> > Do you have any more pointers, warnings and/or gotchas if I simply
> > malloc() a memory buffer and calculate the physical address by adding
> > base from __dpmi_get_segment_base_address(_my_ds(),&base) to it ?
>
> 1) subtract base
> 2) if you're getting DPMI crashes, you might want to try increasing the
> segment limit (0x0009FFFF or so) by one method:
> a) __dpmi_set_segment_limit(_my_ds(),0xFFFFFFFF)
> b) __djgpp_nearptr_enable()
> 3) you might want to try __dpmi_allocate_memory() instead of malloc()
> 4) if you're using CWSDPMI or CWSDPR0 instead of PMODEDJ, you'll need to
> a) call __dpmi_physical_address_mapping()
> b) be aware that 0-1Mb is already physically mapped, so you'll need to
map
> 1Mb to xxMb.
> c) my experience with CWSDPMI v5 indicates it can't physically map more
> that 128Mb
> d) IIRC, no errors were given for failures with b) and c)
> e) you might want to try CWSDPMI v6 for a larger page size, and perhaps
> more physically mapped memory...
> 5) there is a small (64k or less) amount of memory pre-allocated below 1Mb
> called a transfer buffer which you might be able to use instead of
> allocating DOS memory by DPMI. Look into __tb, __tb_segment,__tb_offset.
>
6) if you need memory below 1Mb and aren't using the transfer buffer, you
can use __dpmi_allocate_dos_memory()
7) _dos_ds segment size can also be extended to 4Gb (0-4Gb physical) but
you'll still have to use farptr.h functions.
8) Windows won't do some DPMI techniques the same as DOS with DPMI. e.g.,
memory mapping, segment limit increase
9) I've had problems with some of the _go32_* functions and don't like them.
10) The __dpmi_simulate_real_mode_interrupt() usually works. But, in one
instance - for a non-returning interrupt, I had to simulate it using
__dpmi_get_real_mode_interrupt_vector() and
__dpmi_simulate_real_mode_procedure_retf().
RP
- Raw text -