www.pudn.com > znsoft_15.rar > PCICARD.C


#include  
#include  
#include "PCIcard.h" 
 
#define uchar unsigned char 
#define uint unsigned int 
 
union u{uint word; struct{uchar high; uchar low;}bytes;}; 
union u mynodeid[3]; 
 
uchar savedata0; 
uchar savedata1; 
uchar savedata2; 
uchar savedata3; 
 
uint CR; 
 
void wait1ms() 
{ 
	unsigned long i; 
	for(i=0;i<0x20000;i++); 
} 
 
void page(unsigned char number) 
{ 
	unsigned char i; 
	savedata0=inport(CR); 
	i=savedata0 & 0x3f; 
	number=number<<6; 
	i=i|number; 
	outportb(CR,i); 
} 
 
void readmynodeid() 
{ 
	uchar i,temp; 
	page(2); 
	temp=inport(DCR); 
	page(0); 
	outportb(DCR,0xc8); 
	outportb(RSAR1,0); 
	outportb(RSAR0,0); 
	outportb(RSAR0,0); 
	outportb(RBCR1,0); 
	outportb(RBCR0,12); 
	outportb(CR,0x0a); 
	for(i=0;i<3;i++) 
	{ 
		mynodeid[i].bytes.low=inport(DMA0); 
		inport(DMA0); 
		mynodeid[i].bytes.high=inport(DMA0); 
		inport(DMA0); 
	} 
	outportb(CR,0x21); 
	outportb(DCR,temp); 
} 
 
void do_93c46(uchar address) 
{ 
	uchar count; 
	for(count=0;count<8;count++) 
	{ 
		if((address & 0x80)!=0) 
		{ 
			wait1ms(); 
			outportb(N9346CR,0x8a); 
			wait1ms(); 
			outportb(N9346CR,0x8e); 
			wait1ms(); 
			outportb(N9346CR,0x8a); 
		} 
		else 
		{ 
			wait1ms(); 
			outportb(N9346CR,0x88); 
			wait1ms(); 
			outportb(N9346CR,0x8c); 
			wait1ms(); 
			outportb(N9346CR,0x88); 
		} 
		address=address<<1; 
	} 
} 
 
uint read_93c46(uchar address) 
{ 
	uchar count; 
	uint  retval,temp; 
	retval=0; 
	address=address|0x80; 
	outportb(CR,0xe2); 
	outportb(N9346CR,0x8a); 
	wait1ms(); 
	outportb(N9346CR,0x8e); 
	do_93c46(address); 
	wait1ms(); 
	outportb(N9346CR,0x88); 
	for(count=0;count<16;count++) 
	{ 
		wait1ms(); 
		outportb(N9346CR,0x8c); 
		wait1ms(); 
		outportb(N9346CR,0x88); 
		retval=retval<<1; 
		wait1ms(); 
		savedata1=inport(N9346CR); 
		if(savedata1 & 0x01) retval=retval|0x01; 
	} 
	wait1ms(); 
	outportb(N9346CR,0x80); 
	wait1ms(); 
	outportb(N9346CR,0x00); 
	temp=retval & 0xff00; 
	temp=temp>>8; 
	retval=retval<<8; 
	retval=retval | temp; 
	return(retval); 
} 
 
void write_93c46(uchar address,uint value) 
{ 
	uint temp; 
	temp=value & 0xff00; 
	temp=temp>>8; 
	value=value<<8; 
	value=value | temp; 
	outportb(CR,0xe2); 
	wait1ms(); 
	outportb(N9346CR,0x8a); 
	wait1ms(); 
	outportb(N9346CR,0x8e); 
	do_93c46(0x3c); 
	wait1ms(); 
	outportb(N9346CR,0x88); 
	wait1ms(); 
	outportb(N9346CR,0); 
	wait1ms(); 
	outportb(N9346CR,0x8a); 
	wait1ms(); 
	outportb(N9346CR,0x8e); 
	address=address|0x40; 
	do_93c46(address); 
	do_93c46(value>>8); 
	do_93c46(value&0xff); 
	wait1ms(); 
	outportb(N9346CR,0x88); 
	wait1ms(); 
	outportb(N9346CR,0); 
	wait1ms(); 
	outportb(N9346CR,0x88); 
	for(value=0;value<1000;value++) 
	{ 
		wait1ms(); 
		savedata1=inport(N9346CR); 
		if(savedata1 & 0x01)break; 
	} 
	wait1ms(); 
	outportb(N9346CR,0); 
	wait1ms(); 
	outportb(N9346CR,0x8a); 
	wait1ms(); 
	outportb(N9346CR,0x8e); 
	do_93c46(0); 
	wait1ms(); 
	outportb(N9346CR,0x88); 
	wait1ms(); 
	outportb(N9346CR,0); 
} 
 
main() 
{ 
uchar Bus_number,Device_number,Function_number,result,temp; 
uint  readword0,readword1,readword2; 
printf("Modify MAC program v1.0 2002-1-27 Author: LG\n"); 
printf("Only surport PCI ethernet card which based on RTL8029 chip.\n"); 
printf("This program needs pure DOS eviroment!\n"); 
 
asm  	push ax 
asm     push bx 
asm	push cx 
asm     push dx 
asm	push si 
asm	mov ah,PCI_FUNCTION_ID 
asm	mov al,FIND_PCI_DEVICE 
asm	mov cx,8029h 
asm	mov dx,10ech 
asm	mov si,0 
asm	int 1Ah 
asm	mov Bus_number,bh 
asm	mov temp,bl 
asm	mov result,ah 
asm 	pop si 
asm     pop dx 
asm	pop cx 
asm	pop bx 
asm	pop ax 
if(result!=0){printf("No Ethernet Card or not RTL8029!\n"),exit(0);} 
printf("Ethernet Card Bus_number is %d\n",Bus_number); 
Device_number=(0xf8 & temp)>>3; 
Function_number=0x07 & temp; 
printf("Ethernet Card Device number is %X\n",Device_number); 
printf("Ethernet Card Function_number is %X\n",Function_number); 
asm  	push ax 
asm     push bx 
asm	push cx 
asm     push dx 
asm	push di 
asm	mov ah,PCI_FUNCTION_ID 
asm	mov al,READ_CONFIG_WORD 
asm	mov bh,Bus_number 
asm	mov bl,temp 
asm	mov di,10h 
asm	int 1Ah 
asm	mov readword0,cx 
asm	mov result,ah 
asm	mov ah,PCI_FUNCTION_ID 
asm	mov al,READ_CONFIG_WORD 
asm	mov bh,Bus_number 
asm	mov bl,temp 
asm	mov di,12h 
asm	int 1Ah 
asm	mov readword1,cx 
asm	mov result,ah 
asm 	pop di 
asm     pop dx 
asm	pop cx 
asm	pop bx 
asm	pop ax 
 
CR=readword0 & 0xfff0; 
printf("Ethernet Card I/O base read from config is %X\n",CR); 
readmynodeid(); 
printf("The MAC you now using is %X%X%X\n",mynodeid[0],mynodeid[1],mynodeid[2]); 
printf("The MAC read from 93c46 is %X %X %X\n",read_93c46(1),read_93c46(2),read_93c46(3)); 
printf("Input the MAC you want to write\nLike this example (5254-82ad-937f): "); 
scanf("%X-%X-%X",&readword0,&readword1,&readword2); 
printf("The MAC you want to write is %X%X%X. \nAre you sure?(Y/N)",readword0,readword1,readword2); 
temp=getch(); 
if(temp=='y' || temp=='Y') 
{ 
	printf("\nWriting! Don't shutdown...\n"); 
	write_93c46(1,readword0); 
	write_93c46(2,readword1); 
	write_93c46(3,readword2); 
	printf("The MAC after write is %X%X%X.\n",read_93c46(1),read_93c46(2),read_93c46(3)); 
} 
else 
{ 
	printf("\nExit Program!\n"); 
	exit(0); 
} 
printf("\nNow you can reboot to let the MAC be valid!\n"); 
}