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"); }