Example 101. initializing the dma unit – Intel 80C188XL User Manual

Page 278

Advertising
background image

10-23

DIRECT MEMORY ACCESS UNIT

Example 10-1. Initializing the DMA 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

Advertising
This manual is related to the following products: