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

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

?? floppy.c

?? 完整的1.0代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
	output_byte(1);}static void floppy_ready(void){	if (inb(FD_DIR) & 0x80) {		changed_floppies |= 1<<current_drive;		buffer_track = -1;		if (keep_data[current_drive]) {			if (keep_data[current_drive] > 0)				keep_data[current_drive]--;		} else {			if (ftd_msg[current_drive] && current_type[current_drive] != NULL)				printk("Disk type is undefined after disk "				    "change in fd%d\n",current_drive);			current_type[current_drive] = NULL;			floppy_sizes[current_drive] = MAX_DISK_SIZE;		}/* Forcing the drive to seek makes the "media changed" condition go away. * There should be a cleaner solution for that ... */		if (!reset && !recalibrate) {			if (current_track && current_track != NO_TRACK)				do_floppy = shake_zero;			else				do_floppy = shake_one;			output_byte(FD_RECALIBRATE);			output_byte(head<<2 | current_drive);			return;		}	}	if (reset) {		reset_floppy();		return;	}	if (recalibrate) {		recalibrate_floppy();		return;	}	transfer();}static void setup_format_params(void){    unsigned char *here = (unsigned char *) tmp_floppy_area;    int count,head_shift,track_shift,total_shift;    /* allow for about 30ms for data transport per track */    head_shift  = floppy->sect / 6;    /* a ``cylinder'' is two tracks plus a little stepping time */    track_shift = 2 * head_shift + 1;     /* count backwards */    total_shift = floppy->sect - 	((track_shift * track + head_shift * head) % floppy->sect);    /* XXX: should do a check to see this fits in tmp_floppy_area!! */    for (count = 0; count < floppy->sect; count++) {	*here++ = track;	*here++ = head;	*here++ = 1 + (( count + total_shift ) % floppy->sect);	*here++ = 2; /* 512 bytes */    }}static void redo_fd_request(void){	unsigned int block;	char * buffer_area;	int device;	if (CURRENT && CURRENT->dev < 0) return;repeat:	if (format_status == FORMAT_WAIT)		format_status = FORMAT_BUSY;	if (format_status != FORMAT_BUSY) {		if (!CURRENT) {			if (!fdc_busy)				printk("FDC access conflict!");			fdc_busy = 0;			wake_up(&fdc_wait);			CLEAR_INTR;			return;		}		if (MAJOR(CURRENT->dev) != MAJOR_NR)			panic(DEVICE_NAME ": request list destroyed"); \		if (CURRENT->bh) {			if (!CURRENT->bh->b_lock)				panic(DEVICE_NAME ": block not locked");		}	}	seek = 0;	probing = 0;	device = MINOR(CURRENT_DEVICE);	if (device > 3)		floppy = (device >> 2) + floppy_type;	else { /* Auto-detection */		floppy = current_type[device & 3];		if (!floppy) {			probing = 1;			floppy = base_type[device & 3];			if (!floppy) {				request_done(0);				goto repeat;			}			if (CURRENT_ERRORS & 1)				floppy++;		}	}	if (format_status != FORMAT_BUSY) {		if (current_drive != CURRENT_DEV) {			current_track = NO_TRACK;			current_drive = CURRENT_DEV;		}		block = CURRENT->sector;		if (block+2 > floppy->size) {			request_done(0);			goto repeat;		}		sector = block % floppy->sect;		block /= floppy->sect;		head = block % floppy->head;		track = block / floppy->head;		seek_track = track << floppy->stretch;		if (CURRENT->cmd == READ)			command = FD_READ;		else if (CURRENT->cmd == WRITE)			command = FD_WRITE;		else {			printk("do_fd_request: unknown command\n");			request_done(0);			goto repeat;		}	} else {		if (current_drive != (format_req.device & 3))			current_track = NO_TRACK;		current_drive = format_req.device & 3;		if (((unsigned) format_req.track) >= floppy->track ||		    (format_req.head & 0xfffe) || probing) {			request_done(0);			goto repeat;		}		head = format_req.head;		track = format_req.track;		seek_track = track << floppy->stretch;		if (seek_track == buffer_track) buffer_track = -1;		command = FD_FORMAT;		setup_format_params();	}	timer_table[FLOPPY_TIMER].expires = jiffies+10*HZ;	timer_active |= 1 << FLOPPY_TIMER;	if ((seek_track == buffer_track) &&	 (current_drive == buffer_drive)) {		buffer_area = floppy_track_buffer +			((sector + head*floppy->sect)<<9);		if (command == FD_READ) {			copy_buffer(buffer_area,CURRENT->buffer);			request_done(1);			goto repeat;		} else if (command == FD_WRITE)			copy_buffer(CURRENT->buffer,buffer_area);	}	if (seek_track != current_track)		seek = 1;	sector++;	del_timer(motor_off_timer + current_drive);	floppy_on(current_drive);}void do_fd_request(void){	cli();	while (fdc_busy) sleep_on(&fdc_wait);	fdc_busy = 1;	sti();	redo_fd_request();}static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,    unsigned long param){	int i,drive,cnt,okay;	struct floppy_struct *this_floppy;	switch (cmd) {		RO_IOCTLS(inode->i_rdev,param);	}	drive = MINOR(inode->i_rdev);	switch (cmd) {		case FDFMTBEG:			if (!suser())				return -EPERM;			return 0;		case FDFMTEND:			if (!suser())				return -EPERM;			cli();			fake_change |= 1 << (drive & 3);			sti();			drive &= 3;			cmd = FDCLRPRM;			break;		case FDGETPRM:			if (drive > 3) this_floppy = &floppy_type[drive >> 2];			else if ((this_floppy = current_type[drive & 3]) == NULL)				    return -ENODEV;			i = verify_area(VERIFY_WRITE,(void *) param,sizeof(struct floppy_struct));			if (i)				return i;			for (cnt = 0; cnt < sizeof(struct floppy_struct); cnt++)				put_fs_byte(((char *) this_floppy)[cnt],				    (char *) param+cnt);			return 0;		case FDFMTTRK:			if (!suser())				return -EPERM;			if (fd_ref[drive & 3] != 1)				return -EBUSY;			cli();			while (format_status != FORMAT_NONE)				sleep_on(&format_done);			for (cnt = 0; cnt < sizeof(struct format_descr); cnt++)				((char *) &format_req)[cnt] = get_fs_byte(				    (char *) param+cnt);			format_req.device = drive;			format_status = FORMAT_WAIT;			format_errors = 0;			while (format_status != FORMAT_OKAY && format_status !=			    FORMAT_ERROR) {				if (fdc_busy) sleep_on(&fdc_wait);				else {					fdc_busy = 1;					redo_fd_request();				}			}			while (format_status != FORMAT_OKAY && format_status !=			    FORMAT_ERROR)				sleep_on(&format_done);			sti();			okay = format_status == FORMAT_OKAY;			format_status = FORMAT_NONE;			floppy_off(drive & 3);			wake_up(&format_done);			return okay ? 0 : -EIO;		case FDFLUSH:			if (!permission(inode, 2))				return -EPERM;			cli();			fake_change |= 1 << (drive & 3);			sti();			check_disk_change(inode->i_rdev);			return 0; 	}	if (!suser())		return -EPERM;	if (drive < 0 || drive > 3)		return -EINVAL;	switch (cmd) {		case FDCLRPRM:			current_type[drive] = NULL;			floppy_sizes[drive] = MAX_DISK_SIZE;			keep_data[drive] = 0;			break;		case FDSETPRM:		case FDDEFPRM:			memcpy_fromfs(user_params+drive,				(void *) param,				sizeof(struct floppy_struct));			current_type[drive] = &user_params[drive];			floppy_sizes[drive] = user_params[drive].size >> 1;			if (cmd == FDDEFPRM)				keep_data[drive] = -1;			else {				cli();				while (fdc_busy) sleep_on(&fdc_wait);				fdc_busy = 1;				sti();				outb_p((current_DOR & 0xfc) | drive |				    (0x10 << drive),FD_DOR);				for (cnt = 0; cnt < 1000; cnt++) __asm__("nop");				if (inb(FD_DIR) & 0x80)					keep_data[drive] = 1;				else					keep_data[drive] = 0;				outb_p(current_DOR,FD_DOR);				fdc_busy = 0;				wake_up(&fdc_wait);			}			break;		case FDMSGON:			ftd_msg[drive] = 1;			break;		case FDMSGOFF:			ftd_msg[drive] = 0;			break;		case FDSETEMSGTRESH:			min_report_error_cnt[drive] = (unsigned short) (param & 0x0f);			break;		default:			return -EINVAL;	}	return 0;}#define CMOS_READ(addr) ({ \outb_p(addr,0x70); \inb_p(0x71); \})static struct floppy_struct *find_base(int drive,int code){	struct floppy_struct *base;	if (code > 0 && code < 5) {		base = &floppy_types[(code-1)*2];		printk("fd%d is %s",drive,base->name);		return base;	}	printk("fd%d is unknown type %d",drive,code);	return NULL;}static void config_types(void){	printk("Floppy drive(s): ");	base_type[0] = find_base(0,(CMOS_READ(0x10) >> 4) & 15);	if (((CMOS_READ(0x14) >> 6) & 1) == 0)		base_type[1] = NULL;	else {		printk(", ");		base_type[1] = find_base(1,CMOS_READ(0x10) & 15);	}	base_type[2] = base_type[3] = NULL;	printk("\n");}/* * floppy_open check for aliasing (/dev/fd0 can be the same as * /dev/PS0 etc), and disallows simultaneous access to the same * drive with different device numbers. */static int floppy_open(struct inode * inode, struct file * filp){	int drive;	int old_dev;	drive = inode->i_rdev & 3;	old_dev = fd_device[drive];	if (fd_ref[drive])		if (old_dev != inode->i_rdev)			return -EBUSY;	fd_ref[drive]++;	fd_device[drive] = inode->i_rdev;	buffer_drive = buffer_track = -1;	if (old_dev && old_dev != inode->i_rdev)		invalidate_buffers(old_dev);	if (filp && filp->f_mode)		check_disk_change(inode->i_rdev);	return 0;}static void floppy_release(struct inode * inode, struct file * filp){	sync_dev(inode->i_rdev);	if (!fd_ref[inode->i_rdev & 3]--) {		printk("floppy_release with fd_ref == 0");		fd_ref[inode->i_rdev & 3] = 0;	}}static struct file_operations floppy_fops = {	NULL,			/* lseek - default */	block_read,		/* read - general block-dev read */	block_write,		/* write - general block-dev write */	NULL,			/* readdir - bad */	NULL,			/* select */	fd_ioctl,		/* ioctl */	NULL,			/* mmap */	floppy_open,		/* open */	floppy_release,		/* release */	block_fsync		/* fsync */};/* * The version command is not supposed to generate an interrupt, but * my FDC does, except when booting in SVGA screen mode. * When it does generate an interrupt, it doesn't return any status bytes. * It appears to have something to do with the version command... * * This should never be called, because of the reset after the version check. */static void ignore_interrupt(void){	printk(DEVICE_NAME ": weird interrupt ignored (%d)\n", result());	reset = 1;	CLEAR_INTR;	/* ignore only once */}static void floppy_interrupt(int unused){	void (*handler)(void) = DEVICE_INTR;	DEVICE_INTR = NULL;	if (!handler)		handler = unexpected_floppy_interrupt;	handler();}/* * This is the floppy IRQ description. The SA_INTERRUPT in sa_flags * means we run the IRQ-handler with interrupts disabled. */static struct sigaction floppy_sigaction = {	floppy_interrupt,	0,	SA_INTERRUPT,	NULL};void floppy_init(void){	outb(current_DOR,FD_DOR);	if (register_blkdev(MAJOR_NR,"fd",&floppy_fops)) {		printk("Unable to get major %d for floppy\n",MAJOR_NR);		return;	}	blk_size[MAJOR_NR] = floppy_sizes;	blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST;	timer_table[FLOPPY_TIMER].fn = floppy_shutdown;	timer_active &= ~(1 << FLOPPY_TIMER);	config_types();	if (irqaction(FLOPPY_IRQ,&floppy_sigaction))		printk("Unable to grab IRQ%d for the floppy driver\n", FLOPPY_IRQ);	if (request_dma(FLOPPY_DMA))		printk("Unable to grab DMA%d for the floppy driver\n", FLOPPY_DMA);	/* Try to determine the floppy controller type */	DEVICE_INTR = ignore_interrupt;	/* don't ask ... */	output_byte(FD_VERSION);	/* get FDC version code */	if (result() != 1) {		printk(DEVICE_NAME ": FDC failed to return version byte\n");		fdc_version = FDC_TYPE_STD;	} else		fdc_version = reply_buffer[0];	if (fdc_version != FDC_TYPE_STD) 		printk(DEVICE_NAME ": FDC version 0x%x\n", fdc_version);#ifndef FDC_FIFO_UNTESTED	fdc_version = FDC_TYPE_STD;	/* force std fdc type; can't test other. */#endif	/* Not all FDCs seem to be able to handle the version command	 * properly, so force a reset for the standard FDC clones,	 * to avoid interrupt garbage.	 */	if (fdc_version == FDC_TYPE_STD) {		initial_reset_flag = 1;		reset_floppy();	}}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产一二三| 大白屁股一区二区视频| 91精品1区2区| 亚洲一级片在线观看| 欧美三级电影精品| 日韩成人av影视| ww久久中文字幕| 国产成人在线电影| 亚洲欧洲另类国产综合| 色婷婷av一区二区三区gif| 亚洲制服丝袜一区| 欧美一区二区人人喊爽| 国产精品1024| 一区二区激情小说| 日韩一区二区精品葵司在线| 国产在线观看一区二区| 中文字幕一区av| 337p亚洲精品色噜噜噜| 国精产品一区一区三区mba视频 | 亚洲午夜免费电影| 91精品视频网| 国产成人午夜电影网| 一区二区三区**美女毛片| 91精品国产综合久久香蕉的特点| 国产精选一区二区三区| 亚洲男人电影天堂| 欧美二区三区的天堂| 国产一区二区三区黄视频| 亚洲男帅同性gay1069| 日韩美一区二区三区| 成人短视频下载| 日韩av在线播放中文字幕| 国产农村妇女毛片精品久久麻豆| 欧美日韩中文精品| 丁香六月综合激情| 青青青爽久久午夜综合久久午夜| 欧美国产精品中文字幕| 91精品国产乱码久久蜜臀| 不卡的av网站| 九色综合狠狠综合久久| 亚洲一区二区黄色| 国产精品美女久久久久久久久 | 国产精品久久久爽爽爽麻豆色哟哟 | 成人精品一区二区三区四区| 亚洲青青青在线视频| 精品免费视频一区二区| 欧美三级视频在线播放| 成人激情文学综合网| 另类成人小视频在线| 亚洲一区二区影院| 国产精品成人免费在线| 久久这里只有精品6| 宅男噜噜噜66一区二区66| 色综合久久综合网欧美综合网| 国产自产高清不卡| 青娱乐精品在线视频| 亚洲二区视频在线| 精品一区二区三区视频在线观看| 亚洲女子a中天字幕| 中文字幕精品三区| 久久九九影视网| 日韩欧美国产麻豆| 欧美一级高清片在线观看| 欧美图区在线视频| 91成人国产精品| av中文字幕亚洲| 成人午夜精品在线| 国产成人8x视频一区二区| 韩国av一区二区| 精品一二三四区| 麻豆精品视频在线观看视频| 日日摸夜夜添夜夜添国产精品 | 一本久道久久综合中文字幕 | 在线看日本不卡| 91在线国产观看| 91美女精品福利| 91片黄在线观看| 色视频成人在线观看免| 色狠狠一区二区三区香蕉| 91丨porny丨首页| 色94色欧美sute亚洲线路一ni| 91在线porny国产在线看| 91色porny| 欧美私模裸体表演在线观看| 欧美日韩国产免费| 欧美精品第1页| 欧美成人三级电影在线| 2024国产精品视频| 亚洲国产激情av| 1024成人网色www| 亚洲精品一二三四区| 亚洲国产sm捆绑调教视频| 日韩国产成人精品| 国产乱码精品一区二区三区av| 国产福利一区二区| 97精品国产97久久久久久久久久久久| 99久久夜色精品国产网站| 日本乱人伦一区| 91麻豆精品国产91久久久久| 日韩欧美高清一区| 美日韩一区二区| 国模一区二区三区白浆| 成人午夜在线视频| 欧洲一区二区三区在线| 日韩三级av在线播放| 欧美激情一区二区三区四区| 一区二区三区欧美| 理论片日本一区| 99re成人在线| 日韩一区二区在线看| 中文字幕乱码一区二区免费| 一区二区三区免费| 极品少妇xxxx偷拍精品少妇| 成年人网站91| 欧美一级免费观看| 中文字幕一区二区三区视频| 亚洲成av人片一区二区三区| 国产做a爰片久久毛片| 在线观看日韩高清av| 精品va天堂亚洲国产| 一区二区三区成人在线视频| 久久精品久久精品| 色一情一乱一乱一91av| 亚洲精品一区二区三区精华液 | 国产69精品久久99不卡| 欧美日韩一区二区在线观看 | 不卡的av在线| 日韩欧美美女一区二区三区| 亚洲日本一区二区| 国产精品原创巨作av| 欧美色图天堂网| 国产精品全国免费观看高清 | 久久蜜桃一区二区| 一二三区精品视频| 国产成人免费网站| 欧美一区二区三区小说| 亚洲欧美韩国综合色| 国产成人一级电影| 日韩欧美色电影| 亚洲mv在线观看| 色婷婷亚洲婷婷| 国产精品污网站| 久久精品99国产精品日本| 欧美三电影在线| 有坂深雪av一区二区精品| 丁香婷婷综合网| 久久蜜桃av一区精品变态类天堂| 亚洲成人av电影| 91福利社在线观看| 成人免费在线视频| 成人美女视频在线观看| 久久蜜臀精品av| 精品无码三级在线观看视频| 91精品国产色综合久久不卡电影 | 91精品国产综合久久香蕉的特点 | 成人高清视频在线| 久久久亚洲高清| 激情文学综合网| 日韩亚洲国产中文字幕欧美| 视频一区二区中文字幕| 欧美日韩视频第一区| 一区二区三区成人在线视频| 色综合视频一区二区三区高清| 欧美国产一区视频在线观看| 国产精品亚洲专一区二区三区 | 日韩av在线免费观看不卡| 欧美美女激情18p| 天堂成人免费av电影一区| 欧美巨大另类极品videosbest | 欧美一区二区在线免费观看| 婷婷综合另类小说色区| 欧美日韩一区二区电影| 午夜精品久久久久影视| 91精品久久久久久久99蜜桃| 蜜臀久久99精品久久久久久9| 日韩一级精品视频在线观看| 麻豆成人综合网| 久久久国产午夜精品| 成人国产精品免费观看视频| 国产精品日韩精品欧美在线| 99视频国产精品| 亚洲自拍欧美精品| 欧美一区二区成人6969| 国内精品伊人久久久久av影院| 国产欧美一区二区精品性色超碰| 成人永久免费视频| 亚洲精品日韩综合观看成人91| 欧美天堂亚洲电影院在线播放| 日本中文字幕一区| 国产日产精品一区| 91美女片黄在线观看| 丝袜诱惑亚洲看片| 2023国产一二三区日本精品2022| 国产成人精品亚洲午夜麻豆| 18欧美亚洲精品| 欧美猛男男办公室激情| 国内精品嫩模私拍在线| 亚洲日本一区二区| 日韩亚洲欧美综合| www.欧美.com|