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

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

?? fdd.c

?? MMURTL(tm) Computer Operating System Ver x0.8, source code.
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* Floppy Disk Device Driver for MMURTL */

/*
  MMURTL Operating System Source Code
  Copyright 1991,1992,1993, Richard A. Burgess
  ALL RIGHTS RESERVED
  Version x0.8
*/

#define U32 unsigned long
#define S32 long
#define U16 unsigned int
#define S16 int
#define U8 unsigned char
#define S8 char

/* MMURTL OS PROTOTYPES */

extern far SpawnTask(S8  *pEntry,
		             U32 dPriority,
                     U32 fDebug,
                     S8  *pStack,
           		     U32 fOSCode);

extern far U32 AllocExch(U32 *pExchRet);

extern far U32 InitDevDr(U32 dDevNum,
				    	  S8  *pDCBs,
					  	  U32 nDevices,
					  	  U32 dfReplace);

extern far DmaSetUp(S8  *pPhyMem,
					U32 sdMem,			/* size */
					U32 dChannel,		/* channel 2 floppy */
					U32 dType,			/* 0=Verfify, 1=IN,  2=OUT */
					U32 dMode);		/* FDC uses 1 (single cycle) */

extern far U32 UnMaskIRQ(U32 IRQNum);
extern far U32 MaskIRQ(U32 IRQNum);
extern far U32 SetIRQVector(U32 IRQNum, S8  *pIRQ);
extern far U32 EndOfIRQ(U32 IRQNum);
extern far U32 SendMsg(U32 Exch, U32 msg1, U32 msg2);
extern far U32 ISendMsg(U32 Exch, U32 msg1, U32 msg2);
extern far U32 WaitMsg(U32 Exch, S8  *pMsgRet);
extern far U32 CheckMsg(U32 Exch, S8  *pMsgRet);
extern far U32 GetTimerTick(U32 *pTickRet);
extern far U32 Alarm(U32 Exch, U32 count);
extern far U32 KillAlarm(U32 Exch);
extern far U32 Sleep(U32 count);
extern far void MicroDelay(U32 us15count);
extern far void OutByte(U8 Byte, U16 wPort);
extern far void OutWord(U16 Word, U16 wPort);
extern far U8 InByte(U16 wPort);
extern far U16 InWord(U16 wPort);
extern far U8 ReadCMOS(U16 Address);
extern far void CopyData(U8 *pSource, U8 *pDestination, U32 dBytes);


/* THE FLOPPY INTERRUPT FUNCTION PROTOTYPE */

void interrupt fdisk_isr(void);

/*  PROTOTYPE FOR Floppy motor control task and associated stuff */

extern void FDMotorTask(void);
void fdmotor_task(void);
void fd_select(U32 drive);
void fd_motoroff(U32 drive);

/* THE REST OF THE PROTOTYPES */

U32 fdisk_setup(void);
U32 RdWrtVerf(U32 op);
U32 format_track(void);
U32 Set_Media(U32 drive, U32 type);
U32 FDC_reset(void);
U8  cmos_type (U8 drive_nr);
U32 send_fdc(U8 parm);
U8  GetParm(U8 index);
U32 wait_int (void);
U32 seek(void);
U32 recal(void);
U32 read_data(U8 *pDataRet);
U32 results(U32 expect);
void purge_fdc (void);
void wait_for_head(void);
U32 med_change(void);
U32 get_fdc_status(void);

/* The following 3 calls are required in every MMURTL device driver */

U32 dev_op(U32 dDevice,
 		    U32 dOpNum,
		    U32 dLBA,
		    U32 dnBlocks,
		    S8  *pData);

U32 dev_stat(U32 dDevice,
			  S8 * pStatRet,
			  U32 dStatusMax,
			  U32 *pdSatusRet);
U32 dev_init(U32 dDevNum,
			  S8  *pInitData,
			  U32  sdInitData);

/* Near External for troubleshooting */

extern long xprintf(char *fmt, ...);

/* LOCAL DEFINITIONS */

#define ok    0
#define TRUE  1
#define FALSE 0

#define RATE_500 		0x00
#define RATE_300 		0x01
#define RATE_250 		0x02
#define RATE_1000       0x03
#define INT_FLAG 		0x80

/* Error Codes to return */

#define ErcNotInstalled 504
#define ErcAddrMark		602
#define ErcReadOnly		603
#define ErcSectNotFound	604
#define ErcNewMedia		605
#define ErcNotMounted	606
#define ErcCRC			607
#define ErcBadFDC		608
#define ErcBadSeek		609
#define ErcFDCTimeOut	610
#define ErcOverRun		611
#define ErcBadLBA		612
#define ErcDriveType	613
#define ErcBadOp		614
#define ErcBadRecal		615
#define ErcSendFDC		616
#define ErcResults		617
#define ErcBadCmd		618
#define ErcReadyLine	619

/* Commands accepted by driver */

#define CmdNull     0
#define CmdRead     1
#define CmdWrite    2
#define CmdVerify   3
#define CmdFmtBlk   4
#define CmdFmtTrk   5
#define CmdSeekTrk  6

/* FDC port definitions */

#define DOR_PORT	0x3f2
#define MSR_PORT	0x3f4
#define DATA_PORT	0x3f5
#define DIR_PORT	0x3f7
#define DRR_PORT	0x3f7

/* FDC Return Status bit definitions */

#define BUSY  		0x10	/* was BIT4 */
#define DSKCHANGE_BIT 0x80
#define BIT7 		0x80
#define BIT6 		0x40
#define BIT5 		0x20
#define BIT4 		0x10
#define BIT3 		0x08
#define BIT2 		0x04
#define BIT1 		0x02
#define BIT0 		0x01

#define RQM			0x80
#define DIO			0x40

/* FDC commands */

#define FDC_READ	0xe6
#define FDC_WRITE	0xc5
#define FDC_FORMAT	0x4d

/* FDC DOR register bits */

#define FD_MOTOR0	0x10
#define FD_MOTOR1   0x20
#define FD_INTS		0x08
#define FD_RESET	0x04
#define FD_DRV1SEL	0x01
#define FD_MOTMASK	0xf0		/* mask to see motor bits */

/* L O C A L   C O N S T A N T S */

/* The drive table contains parameters for each disk
   type.  The values are:
   0  - FDC SPECIFY Command byte 1
   1  - FDC SPECIFY Command byte 2
   2  - Unused
   3  - Bytes per Sector (coded 0=128, 1=256, 2=512, 3=1024);
   4  - number of sectors per track (Last sector)
   5  - Intersector Gap Size
   6  - Data Length (FFh = 512)
   7  - GAP 3 for Format Command
   8  - Fill Byte for Format command
   9  - Head settle time in milliseconds
   10 - Motor start time in milliseconds/10 (mult value by 10 to use)
   11 -	max cylinder index (number of cyls - 1)
   12 -	Xfer rate Command
   13 - Unused
   14 - Double Step Flag (e.g., 360K in a 1.2Mb drive)
   15 - Unused
*/


U8 fdisk_table[5][16]= {

 /* 0 = NO DRIVE - first two params set to allow FDC_reset */
  {0x0af,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

 /* 1 = 360 kb drive */
 {0x0af, 2, 0, 2, 9, 0x2a, -1, 0x50, 0x0f6, 15, 8, 39, RATE_250, 0, 0, 0},

 /* 2 = 1.2 mb drive */
 {0xaf, 2, 0, 2, 15, 0x1b, -1, 0x54, 0x0f6, 15, 8, 79, RATE_500, 0, 0, 0},

 /* 3 = 720 type drive */
 {0x0af, 2, 0, 2, 9, 0x2a, -1, 0x50, 0x0f6, 15, 8, 79, RATE_250, 0, 0, 0},

 /* 4 = 1.44 mb drive */
 {0xaf, 2, 0, 2, 18, 0x1b, -1, 0x6c, 0x0f6, 15, 8, 79, RATE_500, 0, 0, 0},

};

U32 MotorStk[75];
U32 MotorStkTop;

U8 fd_fdc_command;
U8 fd_drive;
U8 fd_nr_sectors;
U8 fd_head;
U8 fd_sector;
U8 fd_track;
U8 seek_status;
U8 fwrite;
S8  *fd_pData;

/* current fdisk_table[x] for drive 0 & 1 */

U8 type0
U8 type1

/* Record for 64 byte status and init record */

#define sStatus 64

struct statstruct{
  U32 erc;
  U32 blocks_done;
  U32 BlocksMax;
  U8 fNewMedia;
  U8 type_now;		/* current fdisk_table for drive selected */
  U8 resvd1[2];		/* padding for DWord align  */
  U32 nCyl;			/* total physical cylinders */
  U32 nHead;		/* total heads on device    */
  U32 nSectors;		/* Sectors per track        */
  U32 nBPS;			/* Number of bytes per sect */
  U8 params[16]; 	/* begin device specific fields */
  U8 STATUS[8];		/* status returned from FDC (for user status) */
  U32 resvd3;
  U32 resvd4;		/* 64 bytes total */
  } fdstatus;

struct statstruct FDStatTmp;

U8 FDC_STATUS[8];	/* status returned from FDC */
U8 LAST_TRACK[3];  /* last track number */

struct dcbtype {
	S8   Name[12];
	S8   sbName;
	S8   type;
	S16  nBPB;
	U32  last_erc;
	U32  nBlocks;
	S8  *pDevOp;
	S8  *pDevInit;
	S8  *pDevSt;
	S8   fDevReent;
	S8   fSingleUser;
	S16  wJob;
	U32  OS1;
	U32  OS2;
	U32  OS3;
	U32  OS4;
	U32  OS5;
	U32  OS6;
	};

struct dcbtype fdcb[2];		/* two floppy device control blcocks */


/* Exch, msgs space, and vars for FD Motor task */
U8 dor_crnt;		/* last value sent to DOR port */

U8 motor0_want;		/* desired motor0 state, TRUE = want ON */
U8 motor1_want;		/* desired motor1 state, TRUE = want ON */
U32 fd_tick;		/* Set to tick everytime we select a floppy */
U32 fd_newtick;		/* used to check tick time */

/* Exch and msgs space for FD ISR */
U32 fd_exch;
U32 fd_msg[2];

U32 rgSectorMax[10] = {0, 720, 2400, 1440, 2880,
						0, 0, 0, 0, 0};		/* set max sectors */

U8 sectbuf[518];	/* sector buffer for DMA */

/*======================================================*/
/*=================== START OF CODE ====================*/
/*======================================================*/

void enable_ints(void)
{
;
#asm
	STI
#endasm
}

void disable_ints(void)
{
;
#asm
	CLI
#endasm
}


/********************************************************************
 This small function becomes a thread (task) just to control the motor.
 The floppy motors are controlled serarately from the rest
 of the floppy drive electronics. A single port controls both
 floppies.  After a floppy is used you don't want to shut it right
 off or you can forget about any dreams of decent throughput.
 This wakes up every 3 seconds and checks to see if there was
 any floppy activity in the past 3 seconds. If not, we shut off
 the motor(s).
**********************************************************************/

void fdmotor_task(void)
{
	enable_ints();

MotorLoop:

	Sleep(300);							/* 3 seconds */

	GetTimerTick(&fd_newtick);

	if ((fd_newtick - fd_tick) > 300) {	/* not used in last 3 seconds */

		if ((!motor0_want) && (dor_crnt & FD_MOTOR0)) { /* They want 0 off */
			disable_ints();
			dor_crnt &= ~FD_MOTOR0;
			OutByte( dor_crnt, DOR_PORT);
			enable_ints();
		}

		if ((!motor1_want) && (dor_crnt & FD_MOTOR1)) { /* They want 1 off */
			disable_ints();
			dor_crnt &= ~FD_MOTOR1;
			OutByte( dor_crnt, DOR_PORT);
			enable_ints();
		}

	}

	goto MotorLoop;
}

/*******************************************
 Set desired motor status flags and drive
 select bit.  If drive select bit has changed
 this sends the current DOR value to select
 the correct drive. If the motor bit we wanted
 isn't on, we will also send the command.
 We DO NOT mess with the other motor bit.
*******************************************/

void fd_select(U32 drive)
{
U8 fsend;
U8 fdelay;

	GetTimerTick(&fd_tick);		/* update last time selected */

	fsend = FALSE;
	fdelay = FALSE;

	if (drive) {					/* drive 1 */
		if (!(dor_crnt & 0x01)) {
			fsend = TRUE;
			dor_crnt |= 0x01;		/* select 1 */
		}
		if (!(dor_crnt & FD_MOTOR1)) {
			fsend = TRUE;
			fdelay = TRUE;
			dor_crnt |= FD_MOTOR1;	/* motor 1 on */
		}
	}
	else {
   		if (dor_crnt & 0x01) {
			fsend = TRUE;
			dor_crnt &= 0xFE;		/* select 0 (turn 1 off) */
		}
		if (!(dor_crnt & FD_MOTOR0)) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三级资源在线| 日韩久久久精品| 久久精品国产亚洲aⅴ| 成人免费视频在线观看| 精品日本一线二线三线不卡| 91网上在线视频| 国产毛片一区二区| 日本不卡一区二区| 亚洲乱码一区二区三区在线观看| 日韩精品一区二区三区在线| 欧美日韩一区二区在线观看| 99在线视频精品| 国产91在线观看丝袜| 久久国产精品色| 午夜精品久久久久久久久久| 亚洲三级小视频| 亚洲国产成人私人影院tom| 欧美电影免费观看完整版| 4hu四虎永久在线影院成人| 色视频成人在线观看免| 99久久免费精品高清特色大片| 国产自产高清不卡| 老司机精品视频导航| 五月婷婷久久综合| 午夜激情一区二区三区| 亚洲夂夂婷婷色拍ww47| 一区二区三区四区在线播放| 国产精品久久久久婷婷二区次| 国产日产欧美一区二区三区| 欧美成人三级电影在线| 91精品国产入口| 欧美一级日韩免费不卡| 337p亚洲精品色噜噜| 欧美日韩一级大片网址| 欧美日韩国产免费一区二区| 在线欧美一区二区| 欧美撒尿777hd撒尿| 欧美日韩久久一区二区| 欧美美女直播网站| 欧美日本视频在线| 91精品国产aⅴ一区二区| 欧美一区二区三区播放老司机| 欧美一区二区三区喷汁尤物| 日韩一区二区在线观看视频播放| 日韩一区二区中文字幕| 日韩欧美中文一区二区| 2024国产精品| 久久精品无码一区二区三区| 欧美国产一区二区在线观看| 国产精品不卡一区| 亚洲综合色在线| 婷婷综合久久一区二区三区| 蜜桃精品视频在线观看| 国内精品国产成人| 不卡在线观看av| 色视频成人在线观看免| 欧美日韩国产天堂| 久久美女高清视频| 中文字幕高清不卡| 亚洲一级在线观看| 日本一区中文字幕| 国产毛片精品视频| 91在线无精精品入口| 欧美日韩免费观看一区二区三区| 在线成人高清不卡| 久久这里只有精品视频网| 国产精品久久久99| 亚洲一二三四在线观看| 另类人妖一区二区av| 国产精品小仙女| 欧美在线观看视频在线| 欧美成人国产一区二区| 国产精品国产三级国产aⅴ入口| 亚洲激情自拍偷拍| 韩国女主播成人在线| 97精品国产97久久久久久久久久久久 | 久久久影视传媒| 国产精品高潮久久久久无| 亚洲精品中文字幕在线观看| 免费成人在线网站| 成人激情小说乱人伦| 91精品国产综合久久香蕉的特点| 国产欧美综合在线| 亚洲国产一区二区三区青草影视| 国产伦精品一区二区三区免费 | 一本色道**综合亚洲精品蜜桃冫| 欧美军同video69gay| 国产拍欧美日韩视频二区| 日日夜夜一区二区| 99久久综合狠狠综合久久| 欧美一区二区三区视频免费| 成人免费一区二区三区在线观看| 日本不卡一二三| 在线观看日韩精品| 久久精品夜夜夜夜久久| 五月天激情综合网| 91网站在线播放| 欧美国产丝袜视频| 蜜桃视频一区二区三区 | 欧美一区二区三区精品| 亚洲人成伊人成综合网小说| 国产综合一区二区| 欧美日韩国产首页在线观看| 国产精品久久二区二区| 国内精品伊人久久久久av影院 | 国产精品毛片无遮挡高清| 青青草97国产精品免费观看无弹窗版 | 亚洲三级在线免费观看| 国产成人午夜视频| 久久久久久久久蜜桃| 日日摸夜夜添夜夜添亚洲女人| 91在线观看成人| 国产精品天干天干在观线| 国产在线精品不卡| 日韩视频在线你懂得| 五月婷婷激情综合| 欧美视频一区二区在线观看| 专区另类欧美日韩| 成人av在线播放网站| 国产日韩精品一区二区三区| 久久99精品久久久久婷婷| 4438x成人网最大色成网站| 夜夜嗨av一区二区三区| 91福利国产成人精品照片| 中文字幕制服丝袜成人av| 风间由美一区二区av101| 欧美国产国产综合| 国产成人免费视| 中文av一区二区| 成人av电影免费在线播放| 国产拍揄自揄精品视频麻豆| 国产99久久久久| 国产精品女上位| 99久久国产综合精品麻豆| 国产精品久久久久aaaa樱花| 99精品视频在线播放观看| 中文字幕中文字幕中文字幕亚洲无线| 不卡的av在线播放| 中文字幕亚洲视频| 色婷婷综合五月| 亚洲成a人片综合在线| 777午夜精品免费视频| 麻豆国产91在线播放| 26uuu成人网一区二区三区| 国产精品538一区二区在线| 日本一区二区免费在线观看视频| 国产成人午夜精品影院观看视频 | 国产成人免费高清| 国产精品的网站| 欧洲精品在线观看| 日韩电影在线免费| 久久无码av三级| 成人av动漫网站| 伊人一区二区三区| 欧美一级欧美一级在线播放| 狠狠色狠狠色合久久伊人| 欧美国产日韩亚洲一区| 91麻豆swag| 青娱乐精品视频| 国产婷婷精品av在线| 色婷婷综合久久久中文一区二区 | 成人午夜伦理影院| 亚洲综合久久av| 日韩精品在线网站| 成人自拍视频在线观看| 亚洲最大成人网4388xx| 精品久久五月天| 99国产欧美另类久久久精品| 亚洲国产精品久久不卡毛片| 欧美tk—视频vk| 色综合中文字幕| 卡一卡二国产精品 | 亚洲人精品午夜| 欧美一区二区国产| 成人午夜激情影院| 日精品一区二区| 中文字幕五月欧美| 日韩欧美一区二区视频| 成人免费高清在线| 日韩电影网1区2区| 中文字幕亚洲一区二区av在线| 91麻豆精品国产91久久久更新时间 | 成人免费av在线| 肉色丝袜一区二区| 综合色中文字幕| 日韩欧美一级片| 色婷婷激情综合| 国产精品一区二区无线| 亚洲成人综合视频| 国产精品剧情在线亚洲| 欧美日本一道本| 91免费看视频| 国产suv一区二区三区88区| 天天影视涩香欲综合网| 亚洲欧洲色图综合| 久久久影院官网| 日韩女优电影在线观看| 欧美视频在线观看一区二区| 成人深夜福利app| 国产精品一二一区|