Intel 80C186XL Computer Hardware User Manual


 
DIRECT MEMORY ACCESS UNIT
10-24
Example 10-1. Initializing the DMA Unit (Continued)
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.