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

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

?? pc100.c

?? 這是新華龍(www.xhl.xom.xn)開發的
?? C
字號:
/* Interface driver for the PACCOMM PC-100 board for the IBM PC */
/* UNFINISHED, DOESN'T WORK YET - work in progress by Bdale */
/* currently only attempting to use the AMD7910 on Channel A */

#include <stdio.h>
#include <dos.h>
#include "global.h"
#include "mbuf.h"
#include "iface.h"
#include "pktdrvr.h"
#include "netuser.h"
#include "pc100.h"
#include "z8530.h"
#include "ax25.h"
#include "trace.h"
#include "nospc.h"

static void hspint(struct hdlc *hp);
static void hexint(struct hdlc *hp);
static void hrxint(struct hdlc *hp);
static void htxint(register struct hdlc *hp);
static void rts(uint16 base,int x);
static void hdlcparam(struct hdlc *hp);
static int pc_raw(struct iface *iface,struct mbuf **bpp);
static int pc_stop(struct iface *iface);

static struct pc100 Pc100[NPC];
static INTERRUPT (*Pchandle[])() = { pc0vec };
static struct hdlc Hdlc[2*NPC];
static uint16 Npc;

/* Branch table for interrupt handler */
static void (*Svec[])(struct hdlc *hp) = {
	htxint, hexint, hrxint, hspint
};

/* Master interrupt handler for the PC-100 card. All interrupts come
 * here first, then are switched out to the appropriate routine.
 */
INTERRUPT (far *(pcint)(dev))()
int dev;
{
	register char iv;
	register uint16 pcbase;
	struct hdlc *hp;
	struct pc100 *pcp;

	pcp = &Pc100[dev];
	pcp->ints++;
	pcbase = pcp->addr;

	/* Read interrupt vector, including status, from channel B */
	iv = read_scc(CTL+pcbase+CHANB,R2);

	hp = &Hdlc[2 * dev + ((iv & 0x80)? 0 : 1)];

	/* Now switch to appropriate routine */
	(*Svec[(iv>>1) & 0x3])(hp);

	/* Reset interrupt pending state (register A only) */
	write_scc(CTL+pcbase+CHANA,R0,RES_H_IUS);

	/* Wang the 8530 hardware interrupt acknowledge line - Bdale */
	inportb(pcbase+INTACK);

	return pcp->chain ? pcp->oldvec : NULL;
}
/* HDLC Special Receive Condition interrupt
 * The most common event that triggers this interrupt is the
 * end of a frame; it can also be caused by a receiver overflow.
 */
static void
hspint(hp)
register struct hdlc *hp;
{
	register char c;

	hp->spints++;
	c = read_scc(CTL+hp->base,R1);	/* Fetch latched bits */

	if((c & (END_FR|CRC_ERR)) == END_FR && hp->rcvbuf != NULL
		&& hp->rcvbuf->cnt > 1){
		/* End of valid frame */
		hp->rcvbuf->cnt--;	/* Toss 1st crc byte */
		enqueue(&hp->rcvq,&hp->rcvbuf);
		hp->rcvbuf = NULL;
		hp->rcvcnt++;
	} else {
		/* An overflow or CRC error occurred; restart receiver */
		hp->crcerr++;
		if(hp->rcvbuf != NULL){
			hp->rcp = hp->rcvbuf->data;
			hp->rcvbuf->cnt = 0;
		}
	}
	write_scc(CTL+hp->base,R0,ERR_RES);
}
/* HDLC SIO External/Status interrupts
 * The only one of direct interest is a receiver abort; the other
 * usual cause is a change in the modem control leads, so kick the
 * transmit interrupt routine.
 */
static void
hexint(hp)
register struct hdlc *hp;
{
	hp->exints++;
	hp->status = read_scc(CTL+hp->base,R0);	/* Fetch status */
	if((hp->status & BRK_ABRT) && hp->rcvbuf != NULL){
		hp->aborts++;
		/* Restart receiver */
		hp->rcp = hp->rcvbuf->data;
		hp->rcvbuf->cnt = 0;
	}
	write_scc(CTL+hp->base,R0,RES_EXT_INT);
	write_scc(CTL+hp->base,R0,RES_H_IUS);
	/* Kick the transmit interrupt routine for a possible modem change */
	htxint(hp);
}
/* HDLC receiver interrupt handler. Allocates buffers off the freelist,
 * fills them with receive data, and puts them on the receive queue.
 */
static void
hrxint(hp)
register struct hdlc *hp;
{
	struct mbuf *bp;
	register uint16 base;

	hp->rxints++;
	base = hp->base;
	/* Allocate a receive buffer if not already present */
	if((bp = hp->rcvbuf) == NULL){
		bp = hp->rcvbuf = alloc_mbuf(hp->bufsiz);
		if(bp == NULL){
			/* No memory, abort receiver */
			hp->nomem++;
			write_scc(CTL+base,R3,ENT_HM|RxENABLE|RxCRC_ENAB|Rx8);
			(void) inportb(base+DATA);
			return;
		}
		hp->rcp = hp->rcvbuf->data;
	}
	while(read_scc(CTL+base,R0) & Rx_CH_AV){
		if(bp->cnt++ >= hp->bufsiz){
			/* Too large; abort the receiver, toss buffer */
			hp->toobig++;
			write_scc(CTL+base,R3,ENT_HM|RxENABLE|RxCRC_ENAB|Rx8);
			(void) inportb(base+DATA);
			free_p(&bp);
			hp->rcvbuf = NULL;
			break;
		}
		/* Normal save */
		*hp->rcp++ = inportb(base+DATA);
	}
}
static int ctswait;
/* HDLC transmit interrupt service routine
 *
 * The state variable tstate, along with some static pointers,
 * represents the state of the transmit "process".
 */
static void
htxint(hp)
register struct hdlc *hp;
{
	register uint16 base;
	int c;
	int i_state;

	hp->txints++;
	base = hp->base;
	i_state = dirps();
	while(read_scc(CTL+base,R0) & Tx_BUF_EMP){
		switch(hp->tstate){
		/* First here for efficiency */
		case ACTIVE:		/* Sending frame */
			if((c = PULLCHAR(&hp->sndbuf)) != -1){
				outportb(base+DATA,c);
			} else {
				/* Do this after sending the last byte */
				write_scc(CTL+base,R0,RES_Tx_P);
				if((hp->sndbuf = dequeue(&hp->sndq)) == NULL){
					switch(hp->mode){
					case CSMA:
						/* Begin transmitter shutdown */
						hp->tstate = FLUSH;
						break;
					case FULLDUP:
						hp->tstate = IDLE;
						break;
					}
				}
			}
			continue;
		case IDLE:
			/* Transmitter idle. Find a frame for transmission */
			if((hp->sndbuf = dequeue(&hp->sndq)) == NULL)
				goto ret;

		case DEFER:	/* note fall-thru */
			if(hp->mode == CSMA && (hp->status & DCD)){
				hp->tstate = DEFER;
				goto ret;
			}
			rts(base,ON);	/* Transmitter on */
		case KEYUP:	/* note fall-thru */
			if((hp->status & CTS) == 0){
				ctswait++;
				hp->tstate = KEYUP;
				goto ret;
			}
			write_scc(CTL+base,R0,RES_Tx_CRC);
			c = PULLCHAR(&hp->sndbuf);
			outportb(hp->base+DATA,c);
			hp->tstate = ACTIVE;
			write_scc(CTL+base,R0,RES_EOM_L);
			continue;
		case FLUSH:	/* Sending flush character */
			outportb(hp->base+DATA,0);
			hp->tstate = FIN2;
			continue;
		case FIN2:
			write_scc(CTL+base,R0,SEND_ABORT);
			hp->tstate = IDLE;
			rts(base,OFF);
			write_scc(CTL+base,R0,RES_Tx_P);
			continue;
		}
	}
ret:	restore(i_state);
}

/* Set request-to-send on modem */
static void
rts(base,x)
uint16 base;
int x;
{
	uint16 cmd;

	if(x)
		cmd = TxCRC_ENAB | RTS | TxENAB | Tx8 | DTR;
	else
		cmd = TxCRC_ENAB | TxENAB | Tx8 | DTR;
	write_scc(CTL+base,R5,cmd);
}
/* (re)Initialize HDLC controller parameters */
static void
hdlcparam(hp)
register struct hdlc *hp;
{
	uint16 tc;
	register uint16 base;
	int i_state;

	/* Initialize 8530 channel for SDLC operation */
	base = hp->base;
	i_state = dirps();

	switch(base & 2){
	case 0:
		write_scc(CTL+base,R9,CHRA);	/* Reset channel A */
		break;
	case 2:
		write_scc(CTL+base,R9,CHRB);	/* Reset channel B */
		break;
	}
	/* Wait/DMA disable, Int on all Rx chars + spec condition,
	 * parity NOT spec condition, TxINT enable, Ext Int enable
	 */
	write_scc(CTL+base,R1,INT_ALL_Rx | TxINT_ENAB | EXT_INT_ENAB);

	/* Dummy interrupt vector, will be modified by interrupt type
	 * (This probably isn't necessary)
	 */
	write_scc(CTL+base,R2,0);

	/* 8 bit RX chars, auto enables off, no hunt mode, RxCRC enable,
	 * no address search, no inhibit sync chars, enable RX
	 */
	write_scc(CTL+base,R3,Rx8|RxCRC_ENAB|RxENABLE);

	/* X1 clock, SDLC mode, Sync modes enable, parity disable
	 * (Note: the DPLL does a by-32 clock division, so it's not necessary
	 * to divide here).
	 */
	write_scc(CTL+base,R4,X1CLK | SDLC | SYNC_ENAB);

	/* DTR On, 8 bit TX chars, no break, TX enable, SDLC CRC,
	 * RTS off, TxCRC enable
	 */
	write_scc(CTL+base,R5,DTR|Tx8|TxENAB|TxCRC_ENAB);

	/* SDLC flag */
	write_scc(CTL+base,R7,FLAG);

	/* No reset, status low, master int enable, enable lower chain,
	 * no vector, vector includes status
	 */
	write_scc(CTL+base,R9,MIE|NV|VIS);
	/* CRC preset 1, NRZI encoding, no active on poll, flag idle,
	 * flag on underrun, no loop mode, 8 bit sync
	 */
	write_scc(CTL+base,R10,CRCPS|NRZI);

	/* Board no longer channel-specific for clk.  The board should be set
	 * up to run from the 4.9152Mhz onboard crystal connected to PCLK.
	 * Both channels get receive clock at 32x from PCLK via the DPLL,
	 * with TRxC as an output, via a 4040 div by 32 counter to RTxC set
	 * us as an input to provide the transmit clock.
	 */

	/*            TRxC = BR Generator Output, TRxC O/I,
	 *	      transmit clock = RTxC pin, 
	 *	      receive clock = DPLL output
	 */
	write_scc(CTL+base,R11,TRxCBR|TRxCOI|TCRTxCP|RCDPLL);

	/* Compute and load baud rate generator time constant
	 * DPLL needs x32 clock
	 * XTAL is defined in pc100.h to be the crystal clock / (2 * 32)
	 */
	tc = XTAL/(hp->speed) - 2;
	write_scc(CTL+base,R12,tc);
	write_scc(CTL+base,R13,tc >> 8);

	write_scc(CTL+base,R14,SNRZI);	/* Set NRZI mode */
	write_scc(CTL+base,R14,SSBR);	/* Set DPLL source = BR generator */
	write_scc(CTL+base,R14,SEARCH);	/* Enter search mode */
	/* Set baud rate gen source = PCLK, enable baud rate gen */
	write_scc(CTL+base,R14,BRENABL|BRSRC);

	/* Break/abort IE, TX EOM IE, CTS IE, no SYNC/HUNT IE, DCD IE,
	 * no Zero Count IE
	 */
	write_scc(CTL+base,R15,BRKIE|TxUIE|CTSIE|DCDIE);

	restore(i_state);
	if(hp->mode == FULLDUP){
		rts(base,ON);
	} else if(hp->tstate == IDLE){
		rts(base,OFF);
	}
}
/* Attach a PC-100 interface to the system
 * argv[0]: hardware type, must be "pc100"
 * argv[1]: I/O address, e.g., "0x380"
 * argv[2]: vector, e.g., "2"
 * argv[3]: mode, must be:
 *	    "ax25ui" (AX.25 UI frame format)
 *	    "ax25i" (AX.25 I frame format)
 * argv[4]: interface label, e.g., "pc0"
 * argv[5]: receiver packet buffer size in bytes
 * argv[6]: maximum transmission unit, bytes
 * argv[7]: interface speed, e.g, "9600"
 * argv[8]: First IP address, optional (defaults to Ip_addr)
 * argv[9]: Second IP address, optional (defaults to Ip_addr)
 */
int
pc_attach(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	register struct iface *if_pca,*if_pcb;
	struct hdlc *hp;
	int dev;
	char *cp;

	if(Npc >= NPC){
		printf("Too many pc100 controllers\n");
		return -1;
	}
	if(if_lookup(argv[4]) != NULL){
		printf("Interface %s already exists\n",argv[4]);
		return -1;
	}
	if(setencap(NULL,argv[3]) == -1){
		printf("Mode %s unknown for interface %s\n",
			argv[3],argv[4]);
		return -1;
	}
	if(Mycall[0] == '\0'){
		printf("set mycall first\n");
		return -1;
	}
	dev = Npc++;

	/* Initialize hardware-level control structure */
	Pc100[dev].addr = htoi(argv[1]);
	Pc100[dev].vec = atoi(argv[2]);
	if(strchr(argv[2],'c') != NULL)
		Pc100[dev].chain = 1;
	else
		Pc100[dev].chain = 0;

	/* Initialize modems */
	outportb(Pc100[dev].addr + MODEM_CTL,0x22);

	/* Save original interrupt vector */
	Pc100[dev].oldvec = getirq(Pc100[dev].vec);
	/* Set new interrupt vector */
	if(setirq(Pc100[dev].vec,Pchandle[dev]) == -1){
		printf("IRQ %u out of range\n",Pc100[dev].vec);
		Npc--;
		return -1;
	}
	/* Create interface structures and fill in details */
	if_pca = (struct iface *)callocw(1,sizeof(struct iface));
	if_pcb = (struct iface *)callocw(1,sizeof(struct iface));

	if_pca->addr = if_pcb->addr = Ip_addr;
	if(argc > 8)
		if_pca->addr = resolve(argv[8]);

	if(argc > 9)
		if_pcb->addr = resolve(argv[9]);
	if(if_pca->addr == 0 || if_pcb->addr == 0){
		printf(Noipaddr);
		free(if_pca);
		free(if_pcb);
		return -1;
	}
	if_pca->name = strdup(argv[4]);
	if_pcb->name = strdup(argv[4]);
	if_pcb->name[strlen(argv[4]) - 1]++;	/* kludge */
	if_pcb->mtu = if_pca->mtu = atoi(argv[6]);
	if_pca->dev = 2*dev;
	if_pcb->dev = 2*dev + 1;
	if_pcb->stop = if_pca->stop = pc_stop;
	if_pcb->raw = pc_raw;

	setencap(if_pca,argv[3]);
	setencap(if_pcb,argv[3]);
	if(if_pcb->hwaddr == NULL)
		if_pcb->hwaddr = mallocw(AXALEN);
	memcpy(if_pcb->hwaddr,Mycall,AXALEN);

	if_pca->next = if_pcb;
	if_pcb->next = Ifaces;
	Ifaces = if_pca;

	hp = &Hdlc[2*dev+1];
	hp->speed = (uint16)atoi(argv[7]);
	hp->base = Pc100[dev].addr + CHANB;
	hp->bufsiz = atoi(argv[5]);
	hdlcparam(hp);

	hp = &Hdlc[2*dev];
	hp->speed = (uint16)atoi(argv[7]);
	hp->base = Pc100[dev].addr + CHANA;
	hp->bufsiz = atoi(argv[5]);
	hdlcparam(hp);

	/* Clear mask (enable interrupt) in 8259 interrupt controller */
	clrbit(INTMASK,(char)(1<<Pc100[dev].vec));

	cp = if_name(if_pca," tx");
	if_pca->txproc = newproc(cp,512,if_tx,0,if_pca,NULL,0);
	free(cp);
	cp = if_name(if_pcb," tx");
	if_pcb->txproc = newproc(cp,512,if_tx,0,if_pcb,NULL,0);
	free(cp);
	
	return 0;
}
static int
pc_stop(iface)
struct iface *iface;
{
	int dev;

	dev = iface->dev;
	if(dev & 1)
		return 0;
	dev >>= 1;	/* Convert back into PC100 number */
	/* Turn off interrupts */
	maskoff(Pc100[dev].vec);

	/* Restore original interrupt vector */
	setirq(Pc100[dev].vec,Pc100[dev].oldvec);

	/* Force hardware reset */
	write_scc(CTL+Pc100[dev].addr + CHANA,R9,FHWRES);
	return 0;
}
	
/* Send raw packet on PC-100 */
static int
pc_raw(
struct iface *iface,
struct mbuf **bpp
){
	char kickflag;
	struct hdlc *hp;

	dump(iface,IF_TRACE_OUT,*bpp);
	iface->rawsndcnt++;
	iface->lastsent = secclock();
	hp = &Hdlc[iface->dev];
	kickflag = (hp->sndq == NULL);
	enqueue(&hp->sndq,bpp);
	if(kickflag)
		htxint(&Hdlc[iface->dev]);
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕精品综合| 日本vs亚洲vs韩国一区三区二区 | 在线免费观看视频一区| 欧美男生操女生| 国产欧美一区二区三区网站| 亚洲v精品v日韩v欧美v专区 | 免费不卡在线观看| 色偷偷久久一区二区三区| 久久综合色之久久综合| 亚洲国产精品久久不卡毛片 | 久久精品国产久精国产| 欧美亚洲精品一区| 亚洲欧洲精品一区二区精品久久久 | 亚洲日本护士毛茸茸| 国产成人av一区二区三区在线| 欧美日本视频在线| 樱花影视一区二区| 国产69精品久久久久777| 欧美变态tickling挠脚心| 偷拍与自拍一区| 欧美性大战久久久久久久| 亚洲特黄一级片| 9久草视频在线视频精品| 久久久精品国产99久久精品芒果| 蜜臀久久99精品久久久久宅男 | 成人午夜电影久久影院| 精品日韩欧美在线| 奇米四色…亚洲| 制服丝袜一区二区三区| 亚洲不卡av一区二区三区| 欧美日韩中文一区| 亚洲国产视频一区二区| 欧美视频一区二区三区在线观看| 亚洲人成7777| 在线精品视频免费播放| 一区二区三区精品在线观看| 91免费看片在线观看| 亚洲码国产岛国毛片在线| 91麻豆免费观看| 一区二区三区中文字幕电影| 日本大香伊一区二区三区| 夜夜精品视频一区二区| 欧美日韩国产在线观看| 日本在线播放一区二区三区| 日韩欧美国产一区二区在线播放| 青娱乐精品视频在线| 欧美xfplay| 成人午夜激情在线| 尤物视频一区二区| 在线不卡欧美精品一区二区三区| 日韩va欧美va亚洲va久久| 精品美女一区二区| 国产99久久久国产精品免费看| 中文字幕久久午夜不卡| 欧美影视一区在线| 老司机精品视频在线| 久久久精品免费观看| 91丨porny丨最新| 亚洲电影欧美电影有声小说| 欧美二区三区91| 国产精品99久久久久久似苏梦涵 | 久久亚洲一区二区三区明星换脸 | 99精品桃花视频在线观看| 国产成人av一区二区三区在线观看| 午夜精品福利一区二区三区av| **欧美大码日韩| 国产精品麻豆欧美日韩ww| 欧美精品一区二区久久久| 538在线一区二区精品国产| 欧美日韩综合不卡| 欧美这里有精品| 在线观看一区不卡| 在线影院国内精品| 色婷婷av一区二区三区gif| 成人免费不卡视频| 成人av资源在线| 粉嫩13p一区二区三区| 国产精品自拍一区| 国产老妇另类xxxxx| 国产精品一区免费在线观看| 国产一区二区三区美女| 国产一区二区三区免费看 | 狠狠v欧美v日韩v亚洲ⅴ| 老司机免费视频一区二区三区| 久久精品99久久久| 紧缚奴在线一区二区三区| 激情综合色综合久久综合| 久久成人羞羞网站| 国产精品1024| www.亚洲色图.com| 色综合久久久久久久久久久| 欧美自拍丝袜亚洲| 欧美高清性hdvideosex| 日韩免费视频一区| 国产亚洲精品免费| 亚洲婷婷在线视频| 亚洲国产另类av| 午夜精品福利一区二区三区蜜桃| 日韩不卡手机在线v区| 精品夜夜嗨av一区二区三区| 成人一级视频在线观看| 91久久人澡人人添人人爽欧美| 欧美伊人久久大香线蕉综合69| 欧美夫妻性生活| 国产精品毛片久久久久久久| 亚洲美女淫视频| 免费欧美日韩国产三级电影| 国内不卡的二区三区中文字幕 | 美女一区二区在线观看| 国产精品99久久久久久似苏梦涵| av在线一区二区三区| 欧美在线你懂得| 欧美v国产在线一区二区三区| 国产精品视频第一区| 亚洲一区二区三区免费视频| 精品一区二区三区的国产在线播放| 国产成人小视频| 欧美视频在线观看一区| 精品日本一线二线三线不卡| **性色生活片久久毛片| 免费高清在线视频一区·| 不卡电影一区二区三区| 91精品国产一区二区人妖| 国产精品亲子伦对白| 人妖欧美一区二区| 成人开心网精品视频| 3d动漫精品啪啪| 亚洲欧美自拍偷拍| 美国十次了思思久久精品导航| 91丨porny丨最新| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 无码av中文一区二区三区桃花岛| 国产91丝袜在线播放0| 欧美二区在线观看| 亚洲精品乱码久久久久久久久 | 国产欧美一区二区精品性色 | 蜜桃av一区二区三区电影| 99久久精品免费观看| 2023国产一二三区日本精品2022| 亚洲国产乱码最新视频 | 91福利在线免费观看| 亚洲成在人线在线播放| 国产精品77777竹菊影视小说| 欧美日产在线观看| 亚洲男人天堂一区| 国产成人精品1024| 精品999在线播放| 日韩高清不卡一区二区三区| 91丝袜呻吟高潮美腿白嫩在线观看| 精品女同一区二区| 日韩成人伦理电影在线观看| 欧美性三三影院| 亚洲欧洲制服丝袜| av午夜一区麻豆| 国产拍欧美日韩视频二区| 久久99精品久久久久久久久久久久| 精品视频一区三区九区| 一区二区三区电影在线播| av在线一区二区| 亚洲欧洲精品一区二区三区| 成人看片黄a免费看在线| 国产女人aaa级久久久级| 国产精品羞羞答答xxdd| 久久久国产精品麻豆| 国产精品一区在线观看乱码| 久久久久国产精品厨房| 久久 天天综合| 精品久久久久久久人人人人传媒| 日本免费在线视频不卡一不卡二 | 日韩一二三区视频| 日日欢夜夜爽一区| 欧美精品日韩精品| 日韩精品一二三区| 日韩一区二区三| 久久精品国产99久久6| 亚洲精品一区二区三区福利 | 国产盗摄一区二区| 国产精品视频在线看| eeuss鲁片一区二区三区在线看| 中文一区一区三区高中清不卡| 成人美女在线观看| 自拍偷在线精品自拍偷无码专区| 本田岬高潮一区二区三区| 亚洲色图第一区| 欧美色网站导航| 日本在线不卡视频| 久久综合久久综合久久| 成人午夜私人影院| 一区二区国产盗摄色噜噜| 欧美日韩高清一区| 久久国产成人午夜av影院| 国产免费久久精品| 色婷婷久久一区二区三区麻豆| 亚洲精品久久久久久国产精华液| 欧美色老头old∨ideo| 久久狠狠亚洲综合| 国产精品不卡视频| 欧美欧美欧美欧美首页| 国产乱人伦偷精品视频不卡| ...中文天堂在线一区|