亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? demo.c

?? 8139 開發(fā)資料
?? C
字號:
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "rtl8139.h"
#include "demo.h"

void interrupt (*OldFunction)(void);
void interrupt NewFunction(void);
int	INTR;

extern far void outpdw(unsigned int,unsigned long);
extern far unsigned long inpdw(unsigned int);


void InitHardware();
void InitSoftware();
void IssueCMD();
void TxInterruptHandler();
BOOLEAN RxInterruptHandler();

//Transmit variables
#define TX_SW_BUFFER_NUM	4
TX_DESCRIPTOR	TxDesc[TX_SW_BUFFER_NUM];
unsigned char	TxHwSetupPtr;
unsigned char	TxHwFinishPtr;
unsigned char	TxHwFreeDesc;

//Receive variables
unsigned char	*RxBuffer,*RxBufferOriginal;
unsigned long	RxBufferPhysicalAddress;
unsigned int	RxReadPtrOffset;
PPACKET		pLeadingReadPacket;	//should be a link list
unsigned long	PacketReceivedGood = 0;
unsigned long	ByteReceived = 0;

#define	RX_BUFFER_SIZE		16*1024
#define RX_MAX_PACKET_LENGTH	1600
#define RX_MIN_PACKET_LENGTH	64
#define	RX_READ_POINTER_MASK	0x3FFC

ULONG	IOBase,Irq;
unsigned char *Buffer;
ULONG	PhysicalAddrBuffer;


void ShowStatistics(
)
{
    gotoxy(2,22); printf("Packet Received:: %u",PacketReceivedGood);
    gotoxy(2,23); printf("Byte   Received:: %9lu",ByteReceived);
}

BOOLEAN
FindIOIRQ(ULONG *IOBase,ULONG *IRQ)
{
    ULONG i,j,PciData,BaseAddr,Interrupt;
    for(i=0;i<32;i++)
    {
	j=0x80000000+(i<<11);
	outpdw(0xcf8,j);
	PciData=inpdw(0xcfc);
	if(PciData==0x813910ec)
	{
	   outpdw(0xcf8,j+0x10);
	   *IOBase=inpdw(0xcfc);
	   *IOBase &= 0xfffffff0;
	   outpdw(0xcf8,j+0x3c);
	   *IRQ=inpdw(0xcfc);
	   *IRQ &= 0xff;
	   return TRUE;
	}
    }
    return FALSE;
}


int
ComputeInterrupt(
	int	IrqNumber
)
{
	if(IrqNumber <=8) return IrqNumber+8;
	else		  return IrqNumber+0x68;
}
/////////////////////////////////////////////////////////////////////////
//Our Interrupt Service Routine (ISR)
/////////////////////////////////////////////////////////////////////////
void interrupt NewFunction(void)
{
    unsigned int curISR;
    disable();	// == _asm cli
    curISR = inport(IOBase + ISR);
    if( (curISR & R39_INTERRUPT_MASK) != 0)
    {
	do
	{
	    if(curISR & ISR_PUN)
	    {
//     	        ProcessLingChange();	//should write this code someday
		outport(IOBase + ISR , ISR_PUN);
	    }
	    if(curISR & ISR_TOK)
	    {
		TxInterruptHandler();
		outport(IOBase + ISR, ISR_TOK);
	    }
	    if(curISR & ISR_TER)
	    {
		outportb(IOBase + TCR , TCR_CLRABT);
		outport(IOBase + ISR , ISR_TER);
	    }
	    if( curISR & (ISR_ROK|ISR_RER|ISR_RXOVW|ISR_FIFOOVW) )
	    {
		if(curISR & ISR_ROK)
		{
		    RxInterruptHandler();
		}
		outport(IOBase + ISR, ISR_ROK | ISR_RER |ISR_RXOVW | ISR_FIFOOVW);
	    }
	    curISR = inport(IOBase + ISR);
	}while( (curISR & R39_INTERRUPT_MASK) != 0);
//	_asm int 3;
_asm    mov     al,020h
_asm    out     0a0h,al         //;issue EOI to 2nd 8259
_asm    out     20h,al          //;Issue EOI to 1nd 8259
    }
    else
    {//not our interrupt, should call original interrupt service routine.
     // OldFunction();
    }
    enable();	// == _asm sti
}

//////////////////////////////////////////////////////////////////////////
//Initialization part
//////////////////////////////////////////////////////////////////////////
void
InitHardware()
{
	outportb(IOBase + CR, CR_RST);              //reset
	outportb(IOBase + CR, CR_RE + CR_TE);       //enable Tx/Rx
	outpdw(IOBase + TCR, 	TCR_IFG0   |
				TCR_IFG1   |
				TCR_MXDMA2 |
				TCR_MXDMA1);

	outpdw(IOBase + RCR, 	RCR_RBLEN0 |
				RCR_MXDMA2 |
				RCR_MXDMA1 |
				RCR_AB	   |
				RCR_AM     |
				RCR_APM );
	outpdw(IOBase + RBSTART , RxBufferPhysicalAddress);
	outport(IOBase + IMR, R39_INTERRUPT_MASK);//enable interrupt
}

void
InitSoftware()
{
	ULONG	Offset,Segment,Delta,i;
	unsigned char *tmpBuffer;
//Init Tx Variables
	TxHwSetupPtr = 0;
	TxHwFinishPtr    = 0;
	TxHwFreeDesc = TX_SW_BUFFER_NUM;
//initialize TX descriptor
	for(i=0;i<TX_SW_BUFFER_NUM;i++)
	{	//allocate memory
		Buffer=(unsigned char *)malloc( 1600 / sizeof(int) );
		TxDesc[i].OriginalBufferAddress = Buffer;
		Offset=FP_OFF(Buffer);
		//align to DWORD
		if( Offset & 0x3 )
		{
			Delta = 4 - (Offset & 0x3);
			Offset = Offset + Delta;
			Buffer = Buffer + Delta;
		}
		TxDesc[i].buffer = Buffer;
		Segment=FP_SEG(Buffer);
		PhysicalAddrBuffer = (Segment << 4) + Offset;
		TxDesc[i].PhysicalAddress = PhysicalAddrBuffer;
//		TxDesc[i].DescriptorStatus = TXDESC_INIT;
	}
//Init Rx Buffer
	RxBufferOriginal =
	tmpBuffer	 = (unsigned char *)malloc( RX_BUFFER_SIZE + 2000 );
	Offset=FP_OFF(tmpBuffer);
	//align to DWORD
	if( Offset & 0x3 )
	{
		Delta = 4 - (Offset & 0x3);
		Offset = Offset + Delta;
		tmpBuffer = tmpBuffer + Delta;
	}
	RxBuffer = tmpBuffer;
	Segment=FP_SEG(tmpBuffer);
	RxBufferPhysicalAddress = (Segment << 4) + Offset;
//Init Rx Variable
	RxReadPtrOffset = 0;
}

//////////////////////////////////////////////////////////////////////////
//Transmit part
//////////////////////////////////////////////////////////////////////////
unsigned char
NextDesc(
	unsigned char CurrentDescriptor
    )
{
//    (CurrentDescriptor == TX_SW_BUFFER_NUM-1) ? 0 : (1 + CurrentDescriptor);
    if(CurrentDescriptor == TX_SW_BUFFER_NUM-1)
    {
	return  0;
    }
    else
    {
	return ( 1 + CurrentDescriptor);
    }
}

unsigned char
CheckTSDStatus(
    unsigned char            Desc
    )
{
    ULONG       Offset = Desc << 2;
    ULONG       tmpTSD;

    tmpTSD=inpdw(IOBase + TSD0 + Offset);
    switch ( tmpTSD & (TSD_OWN | TSD_TOK) )
    {
	case (TSD_OWN | TSD_TOK):      	return 	TSDSTATUS_BOTH;
	case (TSD_TOK) 		:       return  TSDSTATUS_TOK;
	case (TSD_OWN) 		:       return  TSDSTATUS_OWN;
	case 0 			:	return  TSDSTATUS_0;
    }
    return 0;
}



void
IssueCMD(unsigned char descriptor)
{
	unsigned long offset = descriptor << 2;
	outpdw(IOBase + TSAD0 + offset, TxDesc[TxHwSetupPtr].PhysicalAddress);
	outpdw(IOBase + TSD0 + offset , TxDesc[TxHwSetupPtr].PacketLength);
}

int
SendPacket(
	PPACKET pPacket
)
{
    disable();
    if( TxHwFreeDesc>0  )
    {
	TxDesc[TxHwSetupPtr].PacketLength=
		CopyFromPacketToBuffer( pPacket , TxDesc[TxHwSetupPtr].buffer);
	IssueCMD(TxHwSetupPtr);
	TxHwSetupPtr = NextDesc(TxHwSetupPtr);
	TxHwFreeDesc--;
	enable();
	return TRUE;//success
    }
    else
    {
	enable();
	return FALSE;//out of resource
    }
}

void
TxInterruptHandler()
{
    while( (CheckTSDStatus(TxHwFinishPtr) == TSDSTATUS_BOTH	) &&
	   (TxHwFreeDesc < 4 				)   )
    {
	//can Release this buffer now

	TxHwFinishPtr = NextDesc(TxHwFinishPtr);
	TxHwFreeDesc++;
    }
}
////////////////////////////////////////////////////////////////////////
// Start of Rx Path
////////////////////////////////////////////////////////////////////////
void
ReadPacket(
	PPACKET	RxPacket
)
{
    pLeadingReadPacket = RxPacket;
}

void
CopyPacket(
    unsigned char 	*pIncomePacket,
    unsigned int        PktLength
)
{
    if( (pLeadingReadPacket != NULL)           &&
	(pLeadingReadPacket->PacketLength == 0)  )
    {
	memcpy(pLeadingReadPacket->Buffers.Buffer , pIncomePacket , PktLength);
	pLeadingReadPacket->PacketLength = PktLength;
    }

}

BOOLEAN
PacketOK(
	PPACKETHEADER pPktHdr
)
{
    BOOLEAN BadPacket = pPktHdr->RUNT ||
			pPktHdr->LONG ||
			pPktHdr->CRC  ||
			pPktHdr->FAE;
    if( ( !BadPacket )   &&
	( pPktHdr->ROK )   )
    {
	if ( (pPktHdr->PacketLength > RX_MAX_PACKET_LENGTH ) ||
	     (pPktHdr->PacketLength < RX_MIN_PACKET_LENGTH )    )
	{
	    return(FALSE);
	}
	PacketReceivedGood++;
	ByteReceived += pPktHdr->PacketLength;
	return TRUE ;
    }
    else
    {
	return FALSE;
    }
}

BOOLEAN
RxInterruptHandler(
    )
{
    unsigned char  TmpCMD;
    unsigned int   PktLength;
    unsigned char  *pIncomePacket, *RxReadPtr;
    PPACKETHEADER  pPacketHeader;

    while (TRUE)
    {
	TmpCMD = inportb(IOBase + CR);
	if (TmpCMD & CR_BUFE)
	{
	    break;
	}

	do
	{
	    RxReadPtr	  = RxBuffer + RxReadPtrOffset;
	    pPacketHeader = (PPACKETHEADER)  RxReadPtr;
	    pIncomePacket = RxReadPtr + 4;
	    PktLength	  = pPacketHeader->PacketLength;	//this length include CRC
	    if ( PacketOK( pPacketHeader ) )
	    {
		if ( (RxReadPtrOffset + PktLength) > RX_BUFFER_SIZE )
		{      //wrap around to end of RxBuffer
//_asm int 3;
		    memcpy( RxBuffer + RX_BUFFER_SIZE ,	RxBuffer,
				(RxReadPtrOffset + PktLength - RX_BUFFER_SIZE)  );
		}
		//copy the packet out here
		CopyPacket(pIncomePacket,PktLength - 4);//don't copy 4 bytes CRC

		//update Read Pointer
		RxReadPtrOffset = (RxReadPtrOffset + PktLength + 4 + 3) & RX_READ_POINTER_MASK;
			//4:for header length(PktLength include 4 bytes CRC)
			//3:for dword alignment
		outport( IOBase + CAPR, RxReadPtrOffset - 0x10);	//-4:avoid overflow
	    }
	    else
	    {
//		ResetRx();
		break;
	    }
	    TmpCMD = inportb(IOBase + CR);
	} while (!(TmpCMD & CR_BUFE));
   }
    return (TRUE);              //Done
}

/////////////////////////////////////////////////////////////////////////
//Load / Unload
/////////////////////////////////////////////////////////////////////////
BOOLEAN
LoadDriver()
{
	int	INTR;
	FindIOIRQ( &IOBase , &Irq );
	INTR = ComputeInterrupt( Irq );
	OldFunction = getvect( INTR );
//hook interrupt vector
	disable();
	setvect(INTR,NewFunction);
	enable();
//initialize chip
	InitSoftware();
	InitHardware();

	return TRUE;
}

BOOLEAN
UnloadDriver()
{
	disable();
	setvect(INTR,OldFunction);
	enable();
	return TRUE;
}
///////////////////////////////////////////////////////////////////////////
// End Of Demo driver
///////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////
//	Start of Test Program (only for demo)
///////////////////////////////////////////////////////////////////////////
PPACKET
BuildPacket(
)
{
	int i;
	PPACKET tmpPacket = (PPACKET) malloc(sizeof(PACKET));
	tmpPacket->BufferCount  = 1;
	tmpPacket->PacketLength = 64;
	tmpPacket->Buffers.Buffer = (unsigned char *) malloc(2000);
	tmpPacket->Buffers.Next   = NULL;
	tmpPacket->Buffers.BufferLength = 64;
	for(i=0;i<12;i++)
	{
		tmpPacket->Buffers.Buffer[i] = 0xff;
	}
	for(i=12;i<2000;i++)
	{
		tmpPacket->Buffers.Buffer[i] = i & 0xff;
	}
	return	tmpPacket;
}

PPACKET
PreparePacket(
)
{
	PPACKET tmpPacket = (PPACKET) malloc(sizeof(PACKET));
	tmpPacket->BufferCount  = 1;
	tmpPacket->PacketLength = 0;
	tmpPacket->Buffers.Buffer = (unsigned char *) malloc(2000);
	tmpPacket->Buffers.Next   = NULL;
	tmpPacket->Buffers.BufferLength = 0;
	return	tmpPacket;
}

void
ShowPacket(
    PPACKET pPacket
)
{
    unsigned char *PktBuf   = pPacket->Buffers.Buffer;
    unsigned int  i,PktLength = pPacket->PacketLength;
    clrscr();
    ShowStatistics();
    printf("Packet Length = %d\n",PktLength);
    for(i=0;i<PktLength;i++)
    {
	printf("%02X ",PktBuf[i]);
	if( (i&0xf) == 0xf )
	{
	    printf("  %4X\n", (i&0xfffffff0) );
	}
	if( (i&0xff) == 0xff )
	{
	    getchar();
	    clrscr();
	}
    }

}

BOOLEAN
Send(
)
{
	PPACKET	pTestPacket;
	int	i;

// Send Test
	pTestPacket = BuildPacket();
	for(i=0;i<2000;i++)
	{
		pTestPacket->PacketLength=pTestPacket->Buffers.BufferLength = 64 + (i%1430);
		while( !SendPacket(pTestPacket) )
		{
		};
//		delay(5);
	}
	return TRUE;
}

void
Receive()
{
	PPACKET	pTestPacket;
	int	i;

//Read Test
	pTestPacket = PreparePacket();
	ReadPacket(pTestPacket);
    do
    {
/*	while(pTestPacket->PacketLength == 0)
	{
	}
//	ShowPacket(pTestPacket);*/
	ShowStatistics();
	pTestPacket->PacketLength = 0;
    }while(!kbhit());
}

main()
{
	clrscr();
        directvideo = 1;
	LoadDriver();
	Send();
//	Receive();
	UnloadDriver();
	return 0;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久久电影| 欧美午夜宅男影院| 国产欧美精品一区aⅴ影院| 久久精品二区亚洲w码| 精品久久国产字幕高潮| 九色综合狠狠综合久久| 国产日韩v精品一区二区| 成人综合婷婷国产精品久久 | 首页国产欧美日韩丝袜| 69堂精品视频| 国产一区二区中文字幕| 综合激情网...| 欧美日韩国产片| 国产一区二区在线观看视频| 国产精品久久久久一区二区三区共| 成人avav影音| 亚洲国产欧美一区二区三区丁香婷| 91精品国产乱| 国产91高潮流白浆在线麻豆| 亚洲欧美国产三级| 欧美va亚洲va在线观看蝴蝶网| 国产成人综合在线观看| 玉米视频成人免费看| 69av一区二区三区| 成人激情综合网站| 丝袜国产日韩另类美女| 久久久噜噜噜久久人人看 | 国产美女精品在线| 亚洲视频中文字幕| 欧美一区二区三区精品| www.日韩精品| 蜜臀久久99精品久久久久宅男| 国产精品免费视频观看| 欧美一二三四区在线| 99久久国产综合色|国产精品| 午夜精品福利一区二区蜜股av| xnxx国产精品| 欧美日韩中文字幕一区| 国产精品系列在线播放| 亚洲成人精品在线观看| 中文字幕永久在线不卡| 日韩欧美国产综合一区| 91免费视频大全| 国产精品中文字幕日韩精品 | 欧美va亚洲va国产综合| 色视频成人在线观看免| 国产精品一线二线三线精华| 天堂蜜桃91精品| 亚洲精品国产精品乱码不99 | 国产日韩欧美激情| 欧美成人女星排名| 欧美一区二区三区性视频| 91在线观看地址| 国产高清在线精品| 老司机午夜精品99久久| 性久久久久久久久久久久| 亚洲色图20p| 国产精品国产馆在线真实露脸| 日韩精品一区二区三区视频| 欧美日韩一区二区三区在线| 91网页版在线| 97久久超碰国产精品| 成人免费毛片app| 国产精品综合一区二区| 精品一区二区三区欧美| 久久精品亚洲麻豆av一区二区| 国产在线不卡一区| 蜜臀精品一区二区三区在线观看 | 自拍av一区二区三区| 国产亚洲一本大道中文在线| 精品福利一区二区三区免费视频| 欧美精三区欧美精三区| 欧美美女一区二区在线观看| 日本精品一级二级| 色999日韩国产欧美一区二区| av成人老司机| 93久久精品日日躁夜夜躁欧美| 国产91在线看| 不卡的av网站| 91麻豆国产自产在线观看| 色综合中文字幕国产 | 国模冰冰炮一区二区| 九色|91porny| 国产福利视频一区二区三区| 国产麻豆视频一区| 成人影视亚洲图片在线| 国产91露脸合集magnet| 不卡视频在线看| 99久久国产综合精品女不卡| 在线看国产日韩| 91麻豆精品国产91久久久久久| 91精品国产乱码久久蜜臀| 欧美精品一区二区三区蜜桃视频| 久久精品视频在线免费观看| 国产精品免费看片| 亚洲国产精品一区二区久久恐怖片| 香蕉加勒比综合久久| 久久99精品久久只有精品| 国产成人午夜高潮毛片| 91麻豆蜜桃一区二区三区| 色狠狠色噜噜噜综合网| 91麻豆精品国产91久久久| 久久久久久久久久看片| 亚洲免费在线播放| 青椒成人免费视频| 国产高清精品久久久久| 色88888久久久久久影院按摩| 欧美怡红院视频| 日韩欧美123| 国产精品国产三级国产a| 亚洲bt欧美bt精品| 久久成人免费日本黄色| 99精品在线观看视频| 欧美精品丝袜久久久中文字幕| 亚洲精品在线观看网站| 一区二区三区中文字幕精品精品 | 黑人巨大精品欧美一区| 成人黄色电影在线| 91精品国产手机| 成人欧美一区二区三区视频网页| 日韩激情中文字幕| 色综合夜色一区| 久久久久久9999| 偷偷要91色婷婷| 成人一级片在线观看| 欧美丰满少妇xxxxx高潮对白| 国产视频一区在线播放| 日韩国产欧美三级| 色香蕉成人二区免费| 欧美电视剧在线看免费| 一区二区成人在线观看| 懂色av噜噜一区二区三区av| 欧美一卡二卡在线| 亚洲国产成人91porn| voyeur盗摄精品| 久久综合久久鬼色| 视频在线观看一区| 日本韩国欧美国产| 国产精品视频一区二区三区不卡| 日韩一区精品字幕| 欧美三电影在线| 亚洲乱码精品一二三四区日韩在线| 韩国欧美一区二区| 日韩欧美国产综合| 日精品一区二区三区| 色94色欧美sute亚洲线路一ni | 最新欧美精品一区二区三区| 国产一区二区伦理片| 日韩欧美一级精品久久| 婷婷开心激情综合| 欧美三区在线观看| 亚洲综合色婷婷| 91在线视频18| 国产精品婷婷午夜在线观看| 黄色资源网久久资源365| 日韩一级精品视频在线观看| 亚洲成人av在线电影| 欧洲精品一区二区三区在线观看| 国产精品久久国产精麻豆99网站| 国产成人啪免费观看软件 | 日韩欧美中文字幕制服| 午夜不卡在线视频| 欧美日韩在线播放三区| 亚洲综合精品自拍| 精品视频免费看| 亚洲成人自拍偷拍| 欧美高清视频一二三区| 首页亚洲欧美制服丝腿| 欧美一区二区视频在线观看2020| 日日夜夜精品免费视频| 日韩一区二区免费电影| 狠狠色丁香久久婷婷综合_中| 精品福利av导航| 国产精品一区二区不卡| 国产精品久久久久一区 | 偷拍与自拍一区| 欧美日韩视频一区二区| 日本aⅴ精品一区二区三区| 日韩欧美精品在线| 国产传媒一区在线| 日韩毛片高清在线播放| 91豆麻精品91久久久久久| 亚洲第四色夜色| 日韩午夜在线观看| 国产91精品精华液一区二区三区| 国产精品午夜在线观看| 色香色香欲天天天影视综合网| 夜夜嗨av一区二区三区中文字幕| 欧美二区在线观看| 国模冰冰炮一区二区| 成人欧美一区二区三区视频网页| 欧洲在线/亚洲| 免费日本视频一区| 国产精品网站在线播放| 欧美视频一区二区三区在线观看 | 久久蜜桃一区二区| youjizz久久| 日本系列欧美系列| 国产婷婷精品av在线| 91国产精品成人|