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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? etherne.c

?? 立宇泰44B0所有測試源代碼
?? C
字號:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#include "ether.h"              /* Typedefs and function prototypes */
#include "netutil.h"
#include "net.h"

#define WORDMODE 1              /* Set to zero if using 8-bit XT-bus cards */

/* NE2000 definitions */
#define DATAPORT 0x10
#define NE_RESET 0x1f

/* 8390 Network Interface Controller (NIC) page0 register offsets */
#define CMDR    0x00            /* command register for read & write */
#define PSTART  0x01            /* page start register for write */
#define PSTOP   0x02            /* page stop register for write */
#define BNRY    0x03            /* boundary reg for rd and wr */
#define TPSR    0x04            /* tx start page start reg for wr */
#define TBCR0   0x05            /* tx byte count 0 reg for wr */
#define TBCR1   0x06            /* tx byte count 1 reg for wr */
#define ISR     0x07            /* interrupt status reg for rd and wr */
#define RSAR0   0x08            /* low byte of remote start addr */
#define RSAR1   0x09            /* hi byte of remote start addr */
#define RBCR0   0x0A            /* remote byte count reg 0 for wr */
#define RBCR1   0x0B            /* remote byte count reg 1 for wr */
#define RCR     0x0C            /* rx configuration reg for wr */
#define TCR     0x0D            /* tx configuration reg for wr */
#define DCR     0x0E            /* data configuration reg for wr */
#define IMR     0x0F            /* interrupt mask reg for wr */

/* NIC page 1 register offsets */
#define PAR0    0x01            /* physical addr reg 0 for rd and wr */
#define CURR    0x07            /* current page reg for rd and wr */
#define MAR0    0x08            /* multicast addr reg 0 for rd and WR */

/* Buffer Length and Field Definition Info */
#define TXSTART  0x40           /* Tx buffer start page */
#define TXPAGES  6              /* Pages for Tx buffer */
#define RXSTART  (TXSTART+TXPAGES)  /* Rx buffer start page */
#if WORDMODE
#define RXSTOP   0x7e           /* Rx buffer end page for word mode */
#define DCRVAL   0x49           /* DCR values for word mode */
#else
#define RXSTOP   0x5f           /* Ditto for byte mode */
#define DCRVAL   0x48
#endif
#define STARHACK 0              /* Set non-zero to enable Starlan length hack */

typedef struct                  /* Net driver configuration data */
{
    WORD dtype;                     /* Driver type */
    BYTE myeth[MACLEN];             /* MAC (Ethernet) addr */
    WORD ebase;                     /* Card I/O base addr */
    WORD next_pkt;                  /* Next (current) Rx page */
} CONFIGNE;

static CONFIGNE configs[MAXNETS];   /* Driver configurations */

static WORD ebase;              /* Temp I/O base addr; usually 280h for PC */
int promisc=0;                  /* Flag to enable promiscuous mode */

typedef struct {                /* NIC hardware packet header */
    BYTE stat;                  /*     Error status */
    BYTE next;                  /*     Pointer to next block */
    WORD len;                   /*     Length of this frame incl. CRC */
} NICHDR;
NICHDR nichdr;

/* Private prototypes */
void resetnic(CONFIGNE *cp, char cold);
void getnic(WORD addr, BYTE data[], WORD len);
void putnic(WORD addr, BYTE data[], WORD len);
BYTE nicwrap(int page);
BYTE innic(int reg);
void outnic(int reg, int b);

/* Initialise card given driver type and base addr.
** Return driver type, 0 if error */
int init_etherne(WORD dtype, WORD baseaddr)
{
    int ok=0;
    CONFIGNE *cp;

    cp = &configs[dtype & NETNUM_MASK]; /* Get pointer into driver data */
    cp->dtype = dtype;                  /* Set driver type */
    cp->ebase = ebase = baseaddr;       /* Set card I/O base address */
    outnic(NE_RESET, innic(NE_RESET));  /* Do reset */
    delay(2);
    if ((innic(ISR) & 0x80) == 0)       /* Report if failed */
    {
        printf("  Ethernet card failed to reset!\n");
    }
    else
    {
        resetnic(cp, 1);                /* Reset Ethernet card, get my addr */
        ok = 1;
    }
    return(ok);
}

/* Close down ethernet controller */
void close_etherne(WORD dtype)
{
    ebase = configs[dtype & NETNUM_MASK].ebase;
    if (ebase)
    {
        outnic(CMDR, 0x21);             /* Stop, DMA abort, page 0 */
        configs[dtype & NETNUM_MASK].ebase = 0;
    }
}

/* Return pointer to my Ethernet addr, given driver type */
BYTE *etherne_addr(WORD dtype)
{
    return(configs[dtype & NETNUM_MASK].myeth);
}

/* Poll network interface to keep it alive; send & receive frames */
void poll_etherne(WORD dtype)
{
    WORD len;
    static BYTE ebuff[MAXFRAMEC];
    CONFIGNE *cp;

    cp = &configs[dtype & NETNUM_MASK];
    if (cp->ebase)                          /* If Ether card in use.. */
    {
        ebase = cp->ebase;                  /* Set card I/O address */
        outnic(ISR, 0x01);                  /* Clear interrupt flag */
        /* Receive */
        while ((len=get_etherne(cp->dtype, ebuff))>0)
        {                                   /* Store frames in buff */
            receive_upcall(cp->dtype, ebuff, len);
        }
        /* Transmit */
        while (!(innic(CMDR)&0x04) &&       /* While NIC ready & frame avail */
            (len=transmit_upcall(cp->dtype, ebuff, MAXFRAME))>0)
        {                                   /* ..transmit frame */
            put_etherne(cp->dtype, ebuff, len);
        }
    }
}

/* Get packet into buffer, return length (excl CRC), or 0 if none available */
WORD get_etherne(WORD dtype, void *pkt)
{
    WORD len=0, curr;
    BYTE bnry;
    CONFIGNE *cp;
#if STARHACK
    int hilen, lolen;
#endif
    cp = &configs[dtype & NETNUM_MASK];
    ebase = cp->ebase;
    if (innic(ISR) & 0x10)              /* If Rx overrun.. */
    {
        printf("  NIC Rx overrun\n");
        resetnic(cp, 0);                /* ..reset controller (drastic!) */
    }
    outnic(CMDR, 0x60);                 /* DMA abort, page 1 */
    curr = innic(CURR);                 /* Get current page */
    outnic(CMDR, 0x20);                 /* DMA abort, page 0 */
    if (curr != cp->next_pkt)           /* If Rx packet.. */
    {
        memset(&nichdr, 0xee, sizeof(nichdr));  /* ..get NIC header */
        getnic((WORD)(cp->next_pkt<<8), (BYTE *)&nichdr, sizeof(nichdr));
#if STARHACK
        hilen = nichdr.next - cp->next_pkt - 1;
        lolen = nichdr.len & 0xff;
        if (hilen < 0)                  /* Do len calc from NIC datasheet */
            hilen = RXSTOP - cp->next_pkt + nichdr.next - RXSTART - 1;
        if (lolen > 0xfc)
            hilen++;
        len = (hilen<<8) + lolen;
        if (len != nichdr.len)          /* ..and compare with actual value */
        {
            if (netdebug)
                printf("  NIC length mismatch %Xh - %Xh\n", len, nichdr.len);
        }
#else
        len = nichdr.len;               /* Take length from stored header */
#endif
        if ((nichdr.stat&1) && len>=MINFRAMEC && len<=MAXFRAMEC)
        {                               /* If hdr is OK, get packet */
            len -= CRCLEN;              /* ..without CRC! */
            if (pkt)
                getnic((WORD)((cp->next_pkt<<8)+sizeof(nichdr)), pkt, len);
        }
        else                            /* If not, no packet data */
        {
            printf("  NIC packet error\n");
        }                               /* Update next packet ptr */
        if (nichdr.next>=RXSTART && nichdr.next<RXSTOP)
            cp->next_pkt = nichdr.next;
        else                            /* If invalid, use prev+1 */
        {
            printf("  NIC pointer error\n");
            cp->next_pkt = nicwrap(cp->next_pkt + 1);
        }                               /* Update boundary register */
        bnry = nicwrap(cp->next_pkt - 1);
        outnic(BNRY, bnry);
    }
    return(len);                        /* Return length excl. CRC */
}

/* Send Ethernet packet given len excl. CRC, return 0 if NIC is busy */
WORD put_etherne(WORD dtype, void *pkt, WORD len)
{
    CONFIGNE *cp;

    cp = &configs[dtype & NETNUM_MASK];
    ebase = cp->ebase;
    if (!ebase || innic(CMDR) & 4)      /* If still Txing, return 0 */
        len = 0;
    else if (pkt)
    {                                   /* If last Tx is complete.. */
        len = minw(MAXFRAME, maxw(MINFRAME, len));      /* Constrain length */
        memcpy((BYTE *)pkt+MACLEN, cp->myeth, MACLEN);  /* Set source addr */
        outnic(ISR, 0x0a);              /* Clear interrupt flags */
        outnic(TBCR0, len & 0xff);      /* Set Tx length regs */
        outnic(TBCR1, len >> 8);
        putnic(TXSTART<<8, pkt, len);
        outnic(CMDR, 0x24);             /* Transmit the packet */
    }
    return(len);
}

/* Reset the Ethernet card, if 'cold' start, get my 6-byte address */
void resetnic(CONFIGNE *cp, char cold)
{
    int i;
    BYTE temp[MACLEN*2];

    outnic(CMDR, 0x21);                 /* Stop, DMA abort, page 0 */
    delay(2);                           /* ..wait to take effect */
    outnic(DCR, DCRVAL);
    outnic(RBCR0, 0);                   /* Clear remote byte count */
    outnic(RBCR1, 0);
    outnic(RCR, 0x20);                  /* Rx monitor mode */
    outnic(TCR, 0x02);                  /* Tx internal loopback */
    outnic(TPSR, TXSTART);              /* Set Tx start page */
    outnic(PSTART, RXSTART);            /* Set Rx start, stop, boundary */
    outnic(PSTOP, RXSTOP);
    outnic(BNRY, (BYTE)(RXSTOP-1));
    outnic(ISR, 0xff);                  /* Clear interrupt flags */
    outnic(IMR, 0);                     /* Mask all interrupts */
    if (cold)
    {
        outnic(CMDR, 0x22);             /* Start NIC, DMA abort */
        getnic(0, temp, 12);            /* Get 6-byte addr */
        for (i=0; i<MACLEN; i++)        /* Convert addr words to bytes */
            cp->myeth[i] = temp[WORDMODE ? i+i : i];
    }
    outnic(CMDR, 0x61);                 /* Stop, DMA abort, page 1 */
    delay(2);
    for (i=0; i<6; i++)                 /* Set Phys addr */
        outnic(PAR0+i, cp->myeth[i]);
    for (i=0; i<8; i++)                 /* Multicast accept-all */
        outnic(MAR0+i, 0xff);
    outnic(CURR, RXSTART+1);            /* Set current Rx page */
    cp->next_pkt = RXSTART + 1;
    outnic(CMDR, 0x20);                 /* DMA abort, page 0 */
    outnic(RCR, promisc ? 0x14 : 0x04); /* Allow broadcasts, maybe all pkts */
    outnic(TCR, 0);                     /* Normal Tx operation */
    outnic(ISR, 0xff);                  /* Clear interrupt flags */
    outnic(CMDR, 0x22);                 /* Start NIC */
}

/* Get a packet from a given address in the NIC's RAM */
void getnic(WORD addr, BYTE data[], WORD len)
{
    register int count;
    register WORD *dataw, dataport;

    count = WORDMODE ? len>>1 : len;    /* Halve byte count if word I/P */
    dataport = ebase + DATAPORT;        /* Address of NIC data port */
    outnic(ISR, 0x40);                  /* Clear remote DMA interrupt flag */
    outnic(RBCR0, len&0xff);            /* Byte count */
    outnic(RBCR1, len>>8);
    outnic(RSAR0, addr&0xff);           /* Data addr */
    outnic(RSAR1, addr>>8);
    outnic(CMDR, 0x0a);                 /* Start, DMA remote read */
#if WORDMODE
    dataw = (WORD *)data;               /* Use pointer for speed */
    while(count--)                      /* Get words */
        *dataw++ = inpw(dataport);
    if (len & 1)                        /* If odd length, do last byte */
        *(BYTE *)dataw = inp(dataport);
#else
    while(count--)                      /* Get bytes */
        *data++ = inp(dataport);
#endif
}

/* Put a packet into a given address in the NIC's RAM */
void putnic(WORD addr, BYTE data[], WORD len)
{
    register int count;
    register WORD *dataw, dataport;

    len += len & 1;                     /* Round length up to an even value */
    count = WORDMODE ? len>>1 : len;    /* Halve byte count if word O/P */
    dataport = ebase + DATAPORT;        /* Address of NIC data port */
    outnic(ISR, 0x40);                  /* Clear remote DMA interrupt flag */
    outnic(RBCR0, len&0xff);            /* Byte count */
    outnic(RBCR1, len>>8);
    outnic(RSAR0, addr&0xff);           /* Data addr */
    outnic(RSAR1, addr>>8);
    outnic(CMDR, 0x12);                 /* Start, DMA remote write */
#if WORDMODE                            /* Word transfer? */
    dataw = (WORD *)data;
    while(count--)
        outpw(dataport, *dataw++);  /* O/P words */
#else
    while(count--)                  /* O/P bytes */
        outp(dataport, *data++);
#endif
    count = 10000;                      /* Done: must ensure DMA complete */
    while(count && (innic(ISR)&0x40)==0)
        count--;
}

/* Wrap an NIC Rx page number */
BYTE nicwrap(int page)
{
   if (page >= RXSTOP)
       page += RXSTART - RXSTOP;
   else if (page < RXSTART)
       page += RXSTOP - RXSTART;
   return(page);
}

/* Input a byte from a NIC register */
BYTE innic(int reg)
{
    return(inp((WORD)(ebase+reg)));
}
/* Output a byte to a NIC register */
void outnic(int reg, int b)
{
    outp((WORD)(ebase+reg), b);
}

/* EOF */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
九九**精品视频免费播放| 成人av网站大全| 国产乱淫av一区二区三区| 国产精品99久久久| 国内成+人亚洲+欧美+综合在线 | 国产精品一区二区果冻传媒| 91成人网在线| 91精品国产综合久久精品性色| 精品日韩99亚洲| 亚洲男人的天堂一区二区| 午夜亚洲国产au精品一区二区| 毛片av中文字幕一区二区| 风间由美一区二区三区在线观看 | 欧美一区二区三区在线观看视频| 精品国内片67194| 一区二区三区欧美视频| 国产呦萝稀缺另类资源| 欧美三级欧美一级| 日韩美女视频19| 经典三级视频一区| 6080午夜不卡| 亚洲精品在线免费播放| 亚洲第一在线综合网站| av电影在线观看一区| 日韩精品一区国产麻豆| 亚洲sss视频在线视频| 99久久综合精品| 久久无码av三级| 麻豆成人久久精品二区三区红 | 国产真实乱偷精品视频免| 在线观看一区二区精品视频| 久久精品免视看| 久久国产精品露脸对白| 欧美日韩精品欧美日韩精品一| 精品免费国产二区三区| 国产精品久久久久久久久久久免费看 | 欧美日本国产视频| 一区二区三区四区高清精品免费观看 | 日韩免费看的电影| 天天影视涩香欲综合网| 在线中文字幕不卡| 亚洲激情在线播放| 色综合一区二区| 国产精品久久久爽爽爽麻豆色哟哟 | 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美视频你懂的| 一区二区三区在线影院| 色哟哟亚洲精品| 日韩久久一区二区| 欧美日韩久久久一区| 亚洲三级视频在线观看| 95精品视频在线| 中文字幕一区在线| 99国产一区二区三精品乱码| 国产偷国产偷精品高清尤物| 国产98色在线|日韩| 中文字幕国产一区| 成人福利电影精品一区二区在线观看| 国产色产综合产在线视频| 精品一区二区三区免费观看| 久久一区二区视频| 成人在线视频首页| ●精品国产综合乱码久久久久| 99精品视频一区二区| 一区二区三区四区蜜桃| 欧美亚州韩日在线看免费版国语版| 一区二区三区在线播| 欧美丰满嫩嫩电影| 韩国精品在线观看| wwwwxxxxx欧美| 成人精品国产免费网站| 亚洲欧美另类小说视频| 欧美年轻男男videosbes| 美女网站一区二区| 日本一区二区三区电影| 91麻豆123| 一区二区三区四区视频精品免费| 91国在线观看| 久久99精品国产麻豆婷婷| 国产欧美一区二区精品婷婷| 99久久精品99国产精品| 天天色图综合网| 欧美成人精品3d动漫h| 国产凹凸在线观看一区二区| 亚洲人成网站精品片在线观看| 欧美美女喷水视频| 国产成人免费视频一区| 亚洲午夜在线观看视频在线| 欧美成人性战久久| 91看片淫黄大片一级| 久久福利资源站| 国产精品久久福利| 欧美夫妻性生活| 粉嫩av亚洲一区二区图片| 一级特黄大欧美久久久| 欧美大片免费久久精品三p| eeuss影院一区二区三区| 天天综合色天天综合色h| 中文字幕av一区二区三区| 亚洲精品在线免费播放| 色94色欧美sute亚洲线路一ni | 日韩一级免费观看| av在线播放成人| 国内精品不卡在线| 午夜精品国产更新| 亚洲欧洲99久久| 欧美成人精品二区三区99精品| 欧美色倩网站大全免费| 9l国产精品久久久久麻豆| 亚洲国产精品麻豆| 国产精品久久久久久久久免费樱桃 | 亚洲电影一区二区三区| 亚洲国产激情av| 精品av综合导航| 色哦色哦哦色天天综合| 国产不卡高清在线观看视频| 美女被吸乳得到大胸91| 石原莉奈在线亚洲三区| 一区二区三区欧美日韩| |精品福利一区二区三区| 久久久久久久精| 精品国产乱码91久久久久久网站| 欧美日本乱大交xxxxx| 欧美在线播放高清精品| 99精品黄色片免费大全| 99天天综合性| 96av麻豆蜜桃一区二区| 99re这里都是精品| 激情综合色综合久久综合| 亚洲高清免费视频| 一区二区三区精品在线| 亚洲色图色小说| ...中文天堂在线一区| www激情久久| 久久久精品国产免大香伊| 精品少妇一区二区三区在线播放| 欧美性感一区二区三区| 91美女片黄在线观看91美女| 99精品国产热久久91蜜凸| 99久久夜色精品国产网站| zzijzzij亚洲日本少妇熟睡| 国产成人精品免费看| 成人美女视频在线观看| zzijzzij亚洲日本少妇熟睡| 成人三级伦理片| 99久久99久久精品国产片果冻| av电影天堂一区二区在线观看| 成人的网站免费观看| 色婷婷av一区| 欧美高清性hdvideosex| 久久青草欧美一区二区三区| 国产精品二三区| 日韩一区中文字幕| 天天操天天色综合| 视频在线观看一区二区三区| 毛片av中文字幕一区二区| 国产aⅴ综合色| 一本大道久久精品懂色aⅴ| 欧美日韩www| 久久综合中文字幕| 亚洲图片你懂的| 日本大胆欧美人术艺术动态| 国产一区二区伦理片| 色综合天天做天天爱| 日韩午夜中文字幕| 国产精品三级久久久久三级| 亚洲精品国产品国语在线app| 日本女优在线视频一区二区 | 色婷婷av久久久久久久| 精品剧情v国产在线观看在线| 国产精品视频你懂的| 午夜精品久久久久久不卡8050| 国产一区 二区| 色综合天天做天天爱| 日韩亚洲欧美综合| 亚洲视频在线观看一区| 美国毛片一区二区三区| 色综合久久中文字幕综合网| 日韩免费观看2025年上映的电影| 国产欧美日韩精品a在线观看| 亚洲一区二区三区四区中文字幕| 国产精品一区二区在线观看不卡| 91在线视频官网| 久久中文字幕电影| 亚洲成av人片www| av一区二区不卡| 久久久青草青青国产亚洲免观| 亚洲图片激情小说| 国内外成人在线视频| 欧美系列亚洲系列| 中文字幕一区二区三中文字幕| 精品一区二区免费| 欧美高清精品3d| 日韩电影在线一区| 欧美一区永久视频免费观看| 午夜不卡av免费| 91精品黄色片免费大全| 日韩不卡一区二区三区 | 欧美在线不卡视频| 亚洲一区二区av在线|