Programming PC DMA Controller (8237)
Josh Cohen
CSC 390 Special Topics
H. Barada

	The process, described in detail later, for programming DMA
transfers is somewhat complex.  

General Steps:

Set up a buffer to read from or write to.
Disable the channel you wish to set up.
Set the Page Register to the page which you want to transfer.
Clear the Byte Pointer.
Set Base Address register to the address of the beginning of the buffer.
Set the Base Word Count register to number of words you wish to transfer.
Set the DMA transfer Mode.
Enable DMA channel to start transfer.

Details	

Registers of the 8237 DMA controller
	The DMA controller has several channels.  Channel 1 is best for
user transfers as some others are used by the system.

Address	Description
00Ah	Channel mask (enable/disable)
083h	Page Register
00Ch	Clear Byte pointer flipflop
002h	Base Address 16 bit register
003h	Base Word count 16 bit register
00Bh	Transfer mode register

To set up DMA controller

Set up a buffer to read from or write to.
Since the DMA controller does everything in 64k blocks, it is best to
try to align the buffer to the segment edge, I.e. Segment A offset 0.
This can be difficult depending on the language which we use.

Disable the channel you wish to set up.
If we use channel 1 we send 05h to address 00A (page register)

Set the Page Register 00A to the page which you want to transfer.
The pages are 64k blocks in main memory.  We must setup multiple
transfers if we wish to transfer more than 64k since the controller is
only able to do 64k at a time.
The pages are 00h to FFh starting with 0000-FFFF.  Notice that these are
the same pages that we call segments.  When we specify addresses we are
only talking about the offsets from the segment, not the entire address.

Clear the Byte Pointer.
The clear byte pointer register is a flip flop.  Writing to the register
clears it, the actual data which we write is ignored.
Write any value to 00Ch

Set Base Address register to the address of the beginning of the buffer.
To do this we write the offset from the segment edge of the starting
address of our buffer, this will be 0 if we have aligned the buffer to
the segment edge.
Write this offset to 002h

Set the Base Word Count register to number of words you wish to transfer.
This register gets the number of words which we wish to transfer. 
Usually this will be bytes.  
Write this number to 003h

Set the DMA transfer Mode.
This register controls the mode of transfer, it will vary upon the
device which we want to transfer to.  In our case, using the
ThunderBoard Sound Card the possible modes are:
49h  Non-continuous playback
59h  Continuous playback
45h  Non-continous record
55h  Continuous record
By playback we mean transfer data from memory out to the card
By record we mean transfer data from the card to memory.
Notice that we are sending out or receiving data from the bus.  The
computer really does not care or know where the data is going or coming
from.  We must also set up the device we are transferring with.  In this
case it is the ThunderBoard.  See the next document on how to do that.

Enable DMA channel to start transfer.
Now that we have correctly set up the DMA controller for the transfer,
we can enble the channel.  However, we must set up the card to receive
or send the data first.  Usually, in practice, the card is set up before
the DMA controller.

