DIRECT MEMORY ACCESS UNIT

MOV

DX, D0DSTH

 

MOV

AX,

BX

; GET HIGH NIBBLE

OUT

DX,

AX

 

; THE POINTER ADDRESSES HAVE BEEN SET UP. NOW WE SET UP THE TRANSFER COUNT.

MOV

AX, 29

;

THE MESSAGE IS

29 BYTES LONG.

MOV

DX,

D0TC

;

XFER COUNT REG

 

OUT

DX,

AX

 

 

 

;NOW WE NEED TO SET THE PARAMETERS FOR THE CHANNEL AS FOLLOWS:

;

DESTINATION

SOURCE

;

-----------

------

;MEMORY SPACE MEMORY SPACE

;INCREMENT PTR INCREMENT PTR

;TERMINATE ON TC, NO INTERRUPT, UNSYNCHRONIZED, LOW PRIORITY RELATIVE

;TO CHANNEL 1, BYTE XFERS. WE START THE CHANNEL.

MOV AX, 1011011000000110B

MOV DX, D0CON

OUT DX, AX

;THE UNSYNCHRONIZED BURST IS NOW RUNNING ON THE BUS...

;NOW SET UP CHANNEL 1 TO SERVICE THE DISK CONTROLLER.

;FOR THIS EXAMPLE WE WILL ONLY BE READING FROM THE DISK.

;THE SOURCE IS THE I/O PORT FOR THE DISK CONTROLLER.

MOV

AX, DISK_IO_ADDR

 

MOV

DX, D1SRCL

 

OUT

DX, AX

; PROGRAM LOW ADDR

XOR

AX, AX

 

MOV

DX, D1SRCH

; HI ADDR FOR IO=0

OUT

DX, AX

 

; THE DESTINATION IS THE DISK BUFFER IN MEMORY

MOV

AX, SEG DISK_BUFF

 

 

 

 

ROL

AX, 4

; GET

HIGH 4 BITS

 

MOV

BX, AX

;

SAVE ROTATED VALUE

AND

AX,

0FFF0H

;

GET

SHIFTED LOW

4 NIBBLES

ADD

AX,

OFFSET DISK_BUFF

 

 

 

 

; 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, D1DSTL

 

 

 

OUT

DX, AL

; AX=LOW

4

BYTES

MOV

DX, D1DSTH

 

 

 

MOV

AX, BX

; GET HIGH

NIBBLE

OUT

DX, AX

 

 

 

;THE POINTER ADDRESSES HAVE BEEN SET UP. NOW WE SET UP THE TRANSFER COUNT.

Example 10-1. Initializing the DMA Unit (Continued)

10-24

Page 279
Image 279
Intel 80C186XL, 80C188XL user manual 10-24