89 lines
3.3 KiB
Plaintext
89 lines
3.3 KiB
Plaintext
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.
|
|
|