📄 dma.c
字号:
#include <conio.h>
#include <string.h>
#include <DOS.h>
#include "80386ex.h"
#include "EV386EX.h"
#include "support.h"
/* APB_BLOCK_START = DMA */
/*******************************************************************************
FUNCTION: int EnableDMAHWRequests(BYTE nChannel)
DESCRIPTION:
This function enables channel hardware requests for the given DMA channel.
PARAMETERS:
nChannel--channel to enable hardware requests
RETURN:
SYNTAX/USAGE:
*******************************************************************************/
int EnableDMAHWRequests(BYTE nChannel)
{
BYTE regDMAMSK = 0; /*Clear regDMAMSK[HRM]*/
/*Check input*/
if ( (nChannel != DMA_Channel0) && (nChannel != DMA_Channel1) )
return ERR_BADINPUT;
regDMAMSK = nChannel; /*Set regDMAMSK[CS] to channel*/
_SetEXRegByte(DMAMSK, regDMAMSK); /*Clear hardware request mask for*/
/* given channel*/
return ERR_NONE;
}
/*******************************************************************************
FUNCTION: int DisableDMAHWRequests(BYTE nChannel)
DESCRIPTION:
This function disables channel hardware requests for the given DMA
channel. The channel, however, can still receive software requests.
PARAMETERS:
nChannel--channel to mask hardware requests
RETURN:
SYNTAX/USAGE:
*******************************************************************************/
int DisableDMAHWRequests(BYTE nChannel)
{
BYTE regDMAMSK = 0;
//Check input
if ( (nChannel != DMA_Channel0) && (nChannel != DMA_Channel1) )
return ERR_BADINPUT;
regDMAMSK = nChannel; //Set regDMAMSK[CS] to channel
regDMAMSK &= 0x04; //Set regDMAMSK[HRM]
_SetEXRegByte(DMAMSK, regDMAMSK); //Set hw request mask for given
// channel
return ERR_NONE;
}
/*******************************************************************************
FUNCTION: void SetDMAReqIOAddr(BYTE nChannel, WORD wIO)
DESCRIPTION:
This function sets the requestor to an I/O port address, wIO, for the DMA
channel specified by nChannel.
PARAMETERS:
nChannel--channel for which to set requestor I/O port address
wIO--I/O address
RETURN: (none)
SYNTAX/USAGE:
SetDMAReqIOAddr(DMA_Channel1, TBR0); //Sets Req. to Serial Receiver
ASSUMPTIONS: (none)
REAL/PROTECTED MODE:
*******************************************************************************/
int SetDMAReqIOAddr(BYTE nChannel, WORD wIO)
{
BYTE addrDMAReq0_1;
BYTE addrDMAReq2_3;
/*Check input*/
if ( (nChannel != DMA_Channel0) && (nChannel != DMA_Channel1) )
return ERR_BADINPUT;
/*Set registers to correct channel*/
addrDMAReq0_1 = ( nChannel == DMA_Channel0 ? DMA0REQ0_1 : DMA1REQ0_1);
addrDMAReq2_3 = ( nChannel == DMA_Channel0 ? DMA0REQ2_3 : DMA1REQ2_3);
_SetEXRegByte(DMACLRBP, 0x0); /* Clear the byte pointer flip-flop */
/* Write requester I/O address, bits 0-7 */
_SetEXRegByte(addrDMAReq0_1, (BYTE) (wIO & 0xFF));
/* Write requester I/O address, bits 8-15 */
_SetEXRegByte(addrDMAReq0_1, (BYTE) ((wIO >> 8) & 0xFF));
_SetEXRegByte(addrDMAReq2_3, 0x00); /* Zero requester address bits 16-23 */
_SetEXRegByte(addrDMAReq2_3, 0x00); /* Zero requester address bits 24-25 */
return ERR_NONE;
}
/*******************************************************************************
FUNCTION: void SetDMATargMemAddr(BYTE nChannel, void *ptMemory)
DESCRIPTION:
This function sets the target memory address for the DMA channel specified
by nChannel.
PARAMETERS:
nChannel--channel for which to set target address
ptMemory--pointer to target memory location
RETURN: (none)
SYNTAX/USAGE:
static char lpsz[]="Hello World";
SetDMATargMemAddr(DMA_Channel1, lpsz);
ASSUMPTIONS:
Processor is in real mode.
REAL/PROTECTED MODE:
The address calculation from ptMemory assumes the processor is in real
mode.
*******************************************************************************/
int SetDMATargMemAddr(BYTE nChannel, void *ptMemory)
{
BYTE addrDMATar0_1;
BYTE addrDMATar2;
BYTE addrDMATar3;
WORD wSegment;
WORD wOffset;
DWORD lAddress;
/*Check input*/
if ( (nChannel != DMA_Channel0) && (nChannel != DMA_Channel1) )
return ERR_BADINPUT;
/*Set registers to correct channel*/
addrDMATar0_1 = ( nChannel == DMA_Channel0 ? DMA0TAR0_1 : DMA1TAR0_1);
addrDMATar2 = ( nChannel == DMA_Channel0 ? DMA0TAR2 : DMA1TAR2);
addrDMATar3 = ( nChannel == DMA_Channel0 ? DMA0TAR3 : DMA1TAR3);
/*If in tiny, small, or medium model,*/
#if defined(M_I86TM) || defined(M_I86SM) || defined(M_I86MM)
_asm
{ /*...then grab our segment from DS*/
mov ax, ds
mov wSegment, ds
}
wOffset = (WORD) ptMemory; /*...and our offset from the pointer*/
#else /*Else, if in compact, large, or huge memory model*/
wSegment = FP_SEG(ptMemory); /*...grab the segment from the pointer*/
wOffset = FP_OFF(ptMemory); /*...and the offset from the pointer*/
#endif /*Assuming real mode, compute our physical address*/
lAddress = ((DWORD) wSegment << 4) + wOffset;
_SetEXRegByte(DMACLRBP, 0x0); /* Clear the byte pointer flip-flop */
/* Write target address, bits 0-7 */
_SetEXRegByte(addrDMATar0_1, (BYTE) (lAddress & 0xFF));
/* Write target address, bits 8-15 */
_SetEXRegByte(addrDMATar0_1, (BYTE) ((lAddress >> 8) & 0xFF));
/* Write target address, bits 16-23 */
_SetEXRegByte(addrDMATar2, (BYTE) ((lAddress >> 16) & 0xFF));
/* Write target address, bits 24-25 */
_SetEXRegByte(addrDMATar3, (BYTE) ((lAddress >> 24) & 0x03));
return ERR_NONE;
}
/*******************************************************************************
FUNCTION: int SetDMAXferCount(BYTE nChannel, void *ptMemory)
DESCRIPTION:
This function sets the target memory device for the DMA channel specified
by nChannel.
PARAMETERS:
nChannel--channel for which to set target address
ptMemory--pointer to target memory location
RETURN: (none)
SYNTAX/USAGE:
static char lpsz[]="Hello World";
SetDMATargMemAddr(DMA_Channel0, lpsz);
ASSUMPTIONS:
Processor is in real mode.
REAL/PROTECTED MODE:
The address calculation from ptMemory assumes the processor is in real
mode.
*******************************************************************************/
int SetDMAXferCount(BYTE nChannel, DWORD lCount)
{
BYTE addrDMAByc0_1;
BYTE addrDMAByc2;
/*Check input*/
if ( (nChannel != DMA_Channel0) && (nChannel != DMA_Channel1) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -