DIRECT MEMORY ACCESS UNIT

$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

 

OUT

DX, AX

; MODULES HAVE EQUAL PRIORITY

 

 

Example 10-2. Timed DMA Transfers

10-26

Page 281
Image 281
Intel 80C186XL, 80C188XL user manual Example 10-2. Timed DMA Transfers