Intel 80C186XL Computer Hardware User Manual


 
10-23
DIRECT MEMORY ACCESS UNIT
Example 10-1. Initializing the DMA Unit
$MOD186
name DMA_EXAMPLE_1
; This example shows code necessary to set up two DMA channels.
; One channel performs an unsynchronized transfer from memory to memory.
; The second channel is used by a hard disk controller located in
; I/O space.
; It is assumed that the constants for PCB register addresses are
; defined elsewhere with EQUates.
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG
START: MOV AX, DATA_SEG ; DATA SEGMENT POINTER
MOV DS, AX
ASSUME DS:DATA_SEG
; First we must initialize DMA channel 0. DMA0 will perform an
; unsynchronized transfer from SOURCE_DATA_1 to DEST_DATA_1.
; The first step is to calculate the proper values for the
; source and destination pointers.
MOV AX, SEG SOURCE_DATA_1
ROL AX, 4 ; GET HIGH 4 BITS
MOV BX, AX ; SAVE ROTATED VALUE
AND AX, 0FFF0H ; GET SHIFTED LOW 4 NIBBLES
ADD AX, OFFSET SOURCE_DATA_1
; NOW LOW BYTES OF POINTER ARE IN AX
ADC BX, 0 ; ADD IN THE CARRY
; TO THE HIGH NIBBLE
AND BX, 000FH ; GET JUST THE HIGH NIBBLE
MOV DX, D0SRCL
OUT DX, AL ; AX=LOW 4 BYTES
MOV DX, D0SRCH
MOV AX, BX ; GET HIGH NIBBLE
OUT DX, AX
; SOURCE POINTER DONE. REPEAT FOR DESTINATION.
MOV AX, SEG DEST_DATA_1
ROL AX, 4 ; GET HIGH 4 BITS
MOV BX, AX ; SAVE ROTATED VALUE
AND AX, 0FFF0H ; GET SHIFTED LOW 4 NIBBLES
ADD AX, OFFSET DEST_DATA_1
; NOW LOW BYTES OF POINTER ARE IN AX
ADC BX, 0 ; ADD IN THE CARRY
; TO THE HIGH NIBBLE
AND BX, 000FH ; GET JUST THE HIGH NIBBLE
MOV DX, D0DSTL
OUT DX, AX ; AX=LOW 4 BYTES