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

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

?? floppy.c

?? 完整的1.0代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
	clear_dma_ff(FLOPPY_DMA);	set_dma_mode(FLOPPY_DMA, (command == FD_READ)? DMA_MODE_READ : DMA_MODE_WRITE);	set_dma_addr(FLOPPY_DMA, addr);	set_dma_count(FLOPPY_DMA, count);	enable_dma(FLOPPY_DMA);	sti();}static void output_byte(char byte){	int counter;	unsigned char status;	if (reset)		return;	for(counter = 0 ; counter < 10000 ; counter++) {		status = inb_p(FD_STATUS) & (STATUS_READY | STATUS_DIR);		if (status == STATUS_READY) {			outb(byte,FD_DATA);			return;		}	}	current_track = NO_TRACK;	reset = 1;	printk("Unable to send byte to FDC\n");}static int result(void){	int i = 0, counter, status;	if (reset)		return -1;	for (counter = 0 ; counter < 10000 ; counter++) {		status = inb_p(FD_STATUS)&(STATUS_DIR|STATUS_READY|STATUS_BUSY);		if (status == STATUS_READY) {			return i;		}		if (status == (STATUS_DIR|STATUS_READY|STATUS_BUSY)) {			if (i >= MAX_REPLIES) {				printk("floppy_stat reply overrun\n");				break;			}			reply_buffer[i++] = inb_p(FD_DATA);		}	}	reset = 1;	current_track = NO_TRACK;	printk("Getstatus times out\n");	return -1;}static void bad_flp_intr(void){	int errors;	current_track = NO_TRACK;	if (format_status == FORMAT_BUSY)		errors = ++format_errors;	else if (!CURRENT) {		printk(DEVICE_NAME ": no current request\n");		reset = recalibrate = 1;		return;	} else		errors = ++CURRENT->errors;	if (errors > MAX_ERRORS) {		request_done(0);	}	if (errors > MAX_ERRORS/2)		reset = 1;	else		recalibrate = 1;}	/* Set perpendicular mode as required, based on data rate, if supported. * 82077 Untested! 1Mbps data rate only possible with 82077-1. * TODO: increase MAX_BUFFER_SECTORS, add floppy_type entries. */static inline void perpendicular_mode(unsigned char rate){	if (fdc_version == FDC_TYPE_82077) {		output_byte(FD_PERPENDICULAR);		if (rate & 0x40) {			unsigned char r = rate & 0x03;			if (r == 0)				output_byte(2);	/* perpendicular, 500 kbps */			else if (r == 3)				output_byte(3);	/* perpendicular, 1Mbps */			else {				printk(DEVICE_NAME ": Invalid data rate for perpendicular mode!\n");				reset = 1;			}		} else			output_byte(0);		/* conventional mode */	} else {		if (rate & 0x40) {			printk(DEVICE_NAME ": perpendicular mode not supported by this FDC.\n");			reset = 1;		}	}} /* perpendicular_mode *//* * This has only been tested for the case fdc_version == FDC_TYPE_STD. * In case you have a 82077 and want to test it, you'll have to compile * with `FDC_FIFO_UNTESTED' defined. You may also want to add support for * recognizing drives with vertical recording support. */static void configure_fdc_mode(void){	if (need_configure && (fdc_version == FDC_TYPE_82077)) {		/* Enhanced version with FIFO & vertical recording. */		output_byte(FD_CONFIGURE);		output_byte(0);		output_byte(0x1A);	/* FIFO on, polling off, 10 byte threshold */		output_byte(0);		/* precompensation from track 0 upwards */		need_configure = 0;		printk(DEVICE_NAME ": FIFO enabled\n");	}	if (cur_spec1 != floppy->spec1) {		cur_spec1 = floppy->spec1;		output_byte(FD_SPECIFY);		output_byte(cur_spec1);		/* hut etc */		output_byte(6);			/* Head load time =6ms, DMA */	}	if (cur_rate != floppy->rate) {		/* use bit 6 of floppy->rate to indicate perpendicular mode */		perpendicular_mode(floppy->rate);		outb_p((cur_rate = (floppy->rate)) & ~0x40, FD_DCR);	}} /* configure_fdc_mode */static void tell_sector(int nr){	if (nr!=7) {		printk(" -- FDC reply errror");		reset = 1;	} else		printk(": track %d, head %d, sector %d", reply_buffer[3],			reply_buffer[4], reply_buffer[5]);} /* tell_sector *//* * Ok, this interrupt is called after a DMA read/write has succeeded * or failed, so we check the results, and copy any buffers. * hhb: Added better error reporting. */static void rw_interrupt(void){	char * buffer_area;	int nr;	char bad;	nr = result();	/* check IC to find cause of interrupt */	switch ((ST0 & ST0_INTR)>>6) {		case 1:	/* error occured during command execution */			bad = 1;			if (ST1 & ST1_WP) {				printk(DEVICE_NAME ": Drive %d is write protected\n", current_drive);				request_done(0);				bad = 0;			} else if (ST1 & ST1_OR) {				if (ftd_msg[ST0 & ST0_DS])					printk(DEVICE_NAME ": Over/Underrun - retrying\n");				/* could continue from where we stopped, but ... */				bad = 0;			} else if (CURRENT_ERRORS > min_report_error_cnt[ST0 & ST0_DS]) {				printk(DEVICE_NAME " %d: ", ST0 & ST0_DS);				if (ST0 & ST0_ECE) {					printk("Recalibrate failed!");				} else if (ST2 & ST2_CRC) {					printk("data CRC error");					tell_sector(nr);				} else if (ST1 & ST1_CRC) {					printk("CRC error");					tell_sector(nr);				} else if ((ST1 & (ST1_MAM|ST1_ND)) || (ST2 & ST2_MAM)) {					if (!probing) {						printk("sector not found");						tell_sector(nr);					} else						printk("probe failed...");				} else if (ST2 & ST2_WC) {	/* seek error */					printk("wrong cylinder");				} else if (ST2 & ST2_BC) {	/* cylinder marked as bad */					printk("bad cylinder");				} else {					printk("unknown error. ST[0..3] are: 0x%x 0x%x 0x%x 0x%x\n", ST0, ST1, ST2, ST3);				}				printk("\n");			}			if (bad)				bad_flp_intr();			redo_fd_request();			return;		case 2: /* invalid command given */			printk(DEVICE_NAME ": Invalid FDC command given!\n");			request_done(0);			return;		case 3:			printk(DEVICE_NAME ": Abnormal termination caused by polling\n");			bad_flp_intr();			redo_fd_request();			return;		default: /* (0) Normal command termination */			break;	}	if (probing) {		int drive = MINOR(CURRENT->dev);		if (ftd_msg[drive])			printk("Auto-detected floppy type %s in fd%d\n",			    floppy->name,drive);		current_type[drive] = floppy;		floppy_sizes[drive] = floppy->size >> 1;		probing = 0;	}	if (read_track) {		buffer_track = seek_track;		buffer_drive = current_drive;		buffer_area = floppy_track_buffer +			((sector-1 + head*floppy->sect)<<9);		copy_buffer(buffer_area,CURRENT->buffer);	} else if (command == FD_READ &&		(unsigned long)(CURRENT->buffer) >= LAST_DMA_ADDR)		copy_buffer(tmp_floppy_area,CURRENT->buffer);	request_done(1);	redo_fd_request();}/* * We try to read tracks, but if we get too many errors, we * go back to reading just one sector at a time. * * This means we should be able to read a sector even if there * are other bad sectors on this track. */inline void setup_rw_floppy(void){	setup_DMA();	do_floppy = rw_interrupt;	output_byte(command);	if (command != FD_FORMAT) {		if (read_track) {			output_byte(current_drive);			output_byte(track);			output_byte(0);			output_byte(1);		} else {			output_byte(head<<2 | current_drive);			output_byte(track);			output_byte(head);			output_byte(sector);		}		output_byte(2);		/* sector size = 512 */		output_byte(floppy->sect);		output_byte(floppy->gap);		output_byte(0xFF);	/* sector size (0xff when n!=0 ?) */	} else {		output_byte(head<<2 | current_drive);		output_byte(2);		output_byte(floppy->sect);		output_byte(floppy->fmt_gap);		output_byte(FD_FILL_BYTE);	}	if (reset)		redo_fd_request();}/* * This is the routine called after every seek (or recalibrate) interrupt * from the floppy controller. Note that the "unexpected interrupt" routine * also does a recalibrate, but doesn't come here. */static void seek_interrupt(void){/* sense drive status */	output_byte(FD_SENSEI);	if (result() != 2 || (ST0 & 0xF8) != 0x20 || ST1 != seek_track) {		printk(DEVICE_NAME ": seek failed\n");		recalibrate = 1;		bad_flp_intr();		redo_fd_request();		return;	}	current_track = ST1;	setup_rw_floppy();}/* * This routine is called when everything should be correctly set up * for the transfer (ie floppy motor is on and the correct floppy is * selected). */static void transfer(void){	read_track = (command == FD_READ) && (CURRENT_ERRORS < 4) &&	    (floppy->sect <= MAX_BUFFER_SECTORS);	configure_fdc_mode();	if (reset) {		redo_fd_request();		return;	}	if (!seek) {		setup_rw_floppy();		return;	}	do_floppy = seek_interrupt;	output_byte(FD_SEEK);	if (read_track)		output_byte(current_drive);	else		output_byte((head<<2) | current_drive);	output_byte(seek_track);	if (reset)		redo_fd_request();}/* * Special case - used after a unexpected interrupt (or reset) */static void recalibrate_floppy(void);static void recal_interrupt(void){	output_byte(FD_SENSEI);	current_track = NO_TRACK;	if (result()!=2 || (ST0 & 0xE0) == 0x60)		reset = 1;/* Recalibrate until track 0 is reached. Might help on some errors. */	if ((ST0 & 0x10) == 0x10)		recalibrate_floppy();	/* FIXME: should limit nr of recalibrates */	else		redo_fd_request();}static void unexpected_floppy_interrupt(void){	current_track = NO_TRACK;	output_byte(FD_SENSEI);	printk(DEVICE_NAME ": unexpected interrupt\n");	if (result()!=2 || (ST0 & 0xE0) == 0x60)		reset = 1;	else		recalibrate = 1;}static void recalibrate_floppy(void){	recalibrate = 0;	current_track = 0;	do_floppy = recal_interrupt;	output_byte(FD_RECALIBRATE);	output_byte(head<<2 | current_drive);	if (reset)		redo_fd_request();}/* * Must do 4 FD_SENSEIs after reset because of ``drive polling''. */static void reset_interrupt(void){	short i;	for (i=0; i<4; i++) {		output_byte(FD_SENSEI);		(void) result();	}	output_byte(FD_SPECIFY);	output_byte(cur_spec1);		/* hut etc */	output_byte(6);			/* Head load time =6ms, DMA */	configure_fdc_mode();		/* reprogram fdc */	if (initial_reset_flag) {		initial_reset_flag = 0;		recalibrate = 1;		reset = 0;		return;	}	if (!recover)		redo_fd_request();	else {		recalibrate_floppy();		recover = 0;	}}/* * reset is done by pulling bit 2 of DOR low for a while. */static void reset_floppy(void){	int i;	do_floppy = reset_interrupt;	reset = 0;	current_track = NO_TRACK;	cur_spec1 = -1;	cur_rate = -1;	recalibrate = 1;	need_configure = 1;	if (!initial_reset_flag)		printk("Reset-floppy called\n");	cli();	outb_p(current_DOR & ~0x04, FD_DOR);	for (i=0 ; i<1000 ; i++)		__asm__("nop");	outb(current_DOR, FD_DOR);	sti();}static void floppy_shutdown(void){	cli();	do_floppy = NULL;	request_done(0);	recover = 1;	reset_floppy();	sti();	redo_fd_request();}static void shake_done(void){	current_track = NO_TRACK;	if (inb(FD_DIR) & 0x80)		request_done(0);	redo_fd_request();}static int retry_recal(void (*proc)(void)){	output_byte(FD_SENSEI);	if (result() == 2 && (ST0 & 0x10) != 0x10) return 0;	do_floppy = proc;	output_byte(FD_RECALIBRATE);	output_byte(head<<2 | current_drive);	return 1;}static void shake_zero(void){	if (!retry_recal(shake_zero)) shake_done();}static void shake_one(void){	if (retry_recal(shake_one)) return;	do_floppy = shake_done;	output_byte(FD_SEEK);	output_byte(head << 2 | current_drive);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
九色综合狠狠综合久久| 日韩国产在线观看一区| 一区二区三区精密机械公司| 亚洲v中文字幕| 国产成人免费网站| 3d成人h动漫网站入口| 国产精品家庭影院| 经典一区二区三区| 日本欧美肥老太交大片| 国产精品国产精品国产专区不蜜| 亚洲一二三四在线| 国产福利精品一区二区| 欧美男男青年gay1069videost| 中文字幕精品一区| 国产在线不卡一区| 欧美一区二区三区在线| 亚洲午夜视频在线观看| 成人av小说网| 欧美激情一区二区三区全黄| 久久国产精品免费| 91精品黄色片免费大全| 亚洲成人久久影院| 欧美日韩一卡二卡| 有坂深雪av一区二区精品| 99久久久精品免费观看国产蜜| 久久久亚洲午夜电影| 久久99久久精品| 欧美成va人片在线观看| 麻豆精品视频在线| 欧美一区二视频| 久久久不卡网国产精品一区| 日本视频免费一区| 欧美精品久久99| 性久久久久久久久久久久| 欧美性猛交xxxx黑人交| 亚洲久本草在线中文字幕| 一本大道久久a久久综合婷婷 | 欧美大片顶级少妇| 日韩高清国产一区在线| 91精品在线麻豆| 免费黄网站欧美| 日韩精品一区二区在线观看| 精品影视av免费| 国产欧美一区二区精品婷婷| 成人午夜私人影院| 亚洲品质自拍视频网站| 欧美日韩一区二区三区不卡| 日本欧美久久久久免费播放网| 日韩欧美亚洲另类制服综合在线| 欧美视频在线一区二区三区 | 国产精品视频免费看| 国产成人自拍在线| 国产精品久久久久一区| 色天天综合色天天久久| 亚洲午夜久久久久久久久久久| 欧美日本一道本| 极品美女销魂一区二区三区免费| 国产女主播一区| 日本韩国欧美在线| 奇米影视一区二区三区| 久久精品夜色噜噜亚洲a∨| 国产91精品一区二区| 亚洲永久精品大片| 精品久久久久99| 91麻豆国产香蕉久久精品| 午夜欧美2019年伦理| 久久麻豆一区二区| 在线免费观看视频一区| 韩国三级电影一区二区| 亚洲精品免费电影| 精品国产亚洲在线| 在线精品视频免费播放| 精品一区二区久久| 亚洲精品高清在线观看| 日韩免费观看高清完整版在线观看| 春色校园综合激情亚洲| 亚洲二区在线视频| 欧美国产视频在线| 欧美一区二区二区| 99久久夜色精品国产网站| 七七婷婷婷婷精品国产| 亚洲精品免费看| 国产日韩欧美一区二区三区乱码| 欧美日韩国产一级二级| 波多野结衣中文字幕一区二区三区| 日韩av高清在线观看| 亚洲欧美国产毛片在线| 精品国产髙清在线看国产毛片 | 中文字幕亚洲一区二区va在线| www.日韩精品| 亚洲精品美腿丝袜| 久久久国产精品麻豆| 欧美日本韩国一区| 色偷偷成人一区二区三区91| 国产高清在线精品| 日本中文字幕不卡| 一区二区免费视频| 国产精品午夜在线观看| 亚洲精品一区二区三区福利| 欧美亚洲国产bt| 91在线国内视频| 国产999精品久久| 国产在线播放一区三区四| 婷婷中文字幕综合| 亚洲成人免费影院| 亚洲国产综合人成综合网站| 亚洲欧美一区二区三区孕妇| 欧美激情中文不卡| 欧美激情一区二区三区不卡| 日韩欧美一二区| 欧美xxxx老人做受| 日韩一区二区不卡| 日韩亚洲欧美在线| 欧美成人一区二区三区片免费| 91精品国产欧美一区二区| 亚洲激情成人在线| 亚洲视频你懂的| 中文字幕一区二区三区在线不卡| 国产日韩精品一区| 国产精品欧美极品| 亚洲欧美日韩人成在线播放| 亚洲欧美国产77777| 亚洲免费色视频| 一区二区三区精品视频在线| 亚洲一区二区三区在线| 天天综合色天天| 久久精品噜噜噜成人av农村| 国产在线播放一区| 成人av在线电影| 欧美专区亚洲专区| 91精品婷婷国产综合久久| 日韩欧美高清一区| 国产精品美女久久久久高潮| 成人免费一区二区三区视频| 亚洲精品高清视频在线观看| 亚洲mv在线观看| 激情五月婷婷综合网| 成人激情校园春色| 欧美日韩中文另类| 欧美精品欧美精品系列| 911精品产国品一二三产区| 亚洲成av人片一区二区梦乃 | 精品国产污污免费网站入口| 久久久久久久久久美女| 亚洲欧洲精品成人久久奇米网| 一区二区三区在线免费视频| 日韩一区精品视频| 成人午夜免费视频| 欧美日韩不卡一区二区| 久久蜜桃av一区二区天堂 | 99re热视频这里只精品| 欧美日本不卡视频| 亚洲国产电影在线观看| 亚洲国产欧美一区二区三区丁香婷| 麻豆精品久久精品色综合| eeuss鲁片一区二区三区| 欧美日本在线观看| 一区二区中文视频| 麻豆国产欧美日韩综合精品二区| av一区二区久久| 日韩欧美色电影| 亚洲精品视频在线看| 六月丁香综合在线视频| 国产在线精品一区二区| 91国内精品野花午夜精品 | 正在播放亚洲一区| 国产亚洲欧洲一区高清在线观看| 一区二区三区四区不卡在线| 久久99久国产精品黄毛片色诱| 91极品美女在线| 国产精品久久久99| 国产又粗又猛又爽又黄91精品| 欧美三级一区二区| 亚洲欧美成aⅴ人在线观看| 黄色精品一二区| 欧美久久一区二区| 亚洲免费观看在线观看| 国产成人av一区二区三区在线观看| 在线电影院国产精品| 亚洲精品自拍动漫在线| 成人美女在线观看| 久久久天堂av| 久久99国产精品免费网站| 制服丝袜国产精品| 午夜国产不卡在线观看视频| 一本到不卡免费一区二区| 国产精品人妖ts系列视频| 国产成人综合亚洲网站| 2021中文字幕一区亚洲| 美女视频黄 久久| 欧美一区二区三区喷汁尤物| 亚洲一区二区三区视频在线| 91麻豆免费在线观看| 中文字幕在线不卡| 99久久精品情趣| 中文字幕一区二区三区在线观看| 成人免费视频视频在线观看免费 | 中文字幕+乱码+中文字幕一区| 韩国精品免费视频| 久久久久久久久伊人|