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.