Intel 80C186XL Computer Hardware User Manual


 
DIRECT MEMORY ACCESS UNIT
10-26
Example 10-2. Timed DMA Transfers
$mod186
name DMA_EXAMPLE_1
; This example sets up the DMA Unit to perform a transfer from memory to
; I/O space every 22 uS. The data is sent to an A/D converter.
; 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, set up the pointers. The source is in memory.
MOV AX, SEG WAVEFORM_DATA
ROL AX, 4 ; GET HIGH 4 BITS
MOV BX, AX ; SAVE ROTATED VALUE
AND AX, 0FFF0H ; GET SHIFTED LOW 4 NIBBLES
ADD AX, OFFSET WAVEFORM_DATA
; 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, AX ; AX=LOW 4 BYTES
MOV DX, D0SRCH
MOV AX, BX ; GET HIGH NIBBLE
OUT DX, AX
MOV AX, DA_CNVTR ; I/O ADDRESS OF D/A
MOV DX, D0DSTL
OUT DX, AX
MOV DX, D0DSTH
XOR AX, AX ; CLEAR HIGH NIBBLE
OUT DX, AX
; THE POINTER ADDRESSES HAVE BEEN SET UP. NOW WE SET UP THE TRANSFER COUNT.
MOV AX, 255 ; 8-BIT D/A, SO WE SEND 256 BYTES
MOV DX, D0TC ; TO GET A FULL SCALE
OUT DX, AX
; PROGRAM IDRQ MUX
MOV DX, DMAPRI
MOV AX, 00H ; TIMER2 IS IDRQ SOURCE
; MODULES HAVE EQUAL PRIORITY
OUT DX, AX