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