[net.arch] iAPX186 DMA addressing

bjday@watmsg.UUCP (B.J.Day) (05/26/86)

  As  much  as  I  like  the  way  Intel  has packaged things
together in the 80186 microprocessor - there's one big beef I
have regarding the integrated DMA unit.

  As  usual,  each  DMA channel has registers for storing the
source and destination  addresses. Since the address space of
the  186 is 1MB, you will  need  more  than  one  sixteen-bit
register for  storing  each  address.  Intel  uses two 16-bit
registers for storing each address.

  Now,  what  irks  me  is  the  FORMAT  of  these two 16-bit
registers.   Instead   of  using  the  old  segment  register
approach, where one register  would be a base segment address
and the other would be the  offset,  they  decided  to simply
treat  the  contents of the two registers as one big ABSOLUTE
address, where one  register is the low order 16 bits and the
other register contains the high order 4 bits.

  Some  of  you  might  argue that an absolute address is the
cleanest, easiest approach.  But,  since 80186 software is so
heavily governed by the segment register  addressing  scheme,
it  seems  to  make  much  more sense to use it in their  DMA
addressing scheme as well.

  The  problem  I'm having right now is converting my string-
move instructions  to  use the DMA units. It would be nice to
just move a segment register  and a pointer register into the
DMA  address registers as they  exist.  Instead,  I  have  to
perform ADDs  and  SHIFTs  in  order  to  calculate the final
absolute address.

  Question:  since  Intel  wanted  the  user  to use absolute
addresses, why didn't they include an instruction such as LEA
(Load Effective Address) for converting a pointer to a 20-bit
absolute  address,  which  takes  the segment  registers into
account?  (The current LEA instruction  ignores  the  segment
registers)

  Has  anyone  written software that uses the DMA units which
works better with the current addressing scheme, or would you
have preferred a segment addressing scheme?

  B.J.Day