DIRECT MEMORY ACCESS 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

Example 10-1. Initializing the DMA Unit

10-23

Page 278
Image 278
Intel 80C188XL, 80C186XL user manual Example 10-1. Initializing the DMA Unit, MOV DS, AX Assume Dsdataseg