File:  [MW Coherent from dump] / coherent / f / usr / include.78 / sys / fdc765.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed May 29 04:56:40 2019 UTC (7 years ago) by root
Branches: MarkWilliams, MAIN
CVS tags: relic, HEAD
coherent

/*
 * /usr/include/sys/fdc765.h
 *
 * Support 765-style controller for diskette and floppy tape
 *
 * Revised: Mon Jun 14 07:15:35 1993 CDT
 */
#ifndef __SYS_FDC765_H__
#define __SYS_FDC765_H__

/*
 * ----------------------------------------------------------------------
 * Includes.
 */

/*
 * ----------------------------------------------------------------------
 * Definitions.
 *	Constants.
 *	Macros with argument lists.
 *	Typedefs.
 *	Enums.
 */

/* Port addresses */
#define FDCDOR	0x3F2			/* Digital output */
#define	FDCDAT	0x3F5			/* Data register */
#define	FDCMSR	0x3F4			/* Main status register */
#define	FDCRATE	0x3F7			/* Transfer rate (500,300,250 Kbps) */
					/* 0=500 1=300 2=250 3=1000 Kbps */
#define FDCCHGL 0x3F7			/* Port where we read the disk */
					/* changed line */

/* FDCDOR masks */
#define	DORDS	0x03			/* Drive select bits */
#define	DORNMR	0x04			/* Not master reset */
#define	DORIEN	0x08			/* Interrupt, DMA enable */
#define	DORMS	0xF0			/* Motor enables */

/* FDCDMSR masks */
#define	MSRDB	0x0F			/* Drive busy */
#define	MSRCB	0x10			/* Control busy */
#define	MSRNDMA	0x20			/* Not DMA */
#define	MSRDIO	0x40			/* Data direction */
#define	MSRRQM	0x80			/* Request for master */

/* FDCCHGL mask */
#define DSKCHGD 0x80			/* Diskette changed line bit. */

/* FDCRATE values (transfer rates) */
#define FDC_RATE_500K	0
#define FDC_RATE_300K	1
#define FDC_RATE_250K	2
#define FDC_RATE_1MEG	3
/*
 * Status Register 0 - Bit Definitions.
 */
#define	ST0_US0	0x01			/* Unit Select 0 */
#define	ST0_US1	0x02			/* Unit Select 1 */
#define	ST0_HD	0x04			/* Head Address */
#define	ST0_NR	0x08			/* Not Ready */
#define	ST0_EC	0x10			/* Equipment Check */
#define	ST0_SE	0x20			/* Seek End */
#define	ST0_IC	0xC0			/* Interrupt code */
#define	ST0_NT	0x00			/* Normal Termination */

/*
 * Status Register 1 - Bit Definitions.
 */
#define	ST1_MA	0x01			/* Missing Address Mark */
#define	ST1_NW	0x02			/* Not writeable */
#define	ST1_ND	0x04			/* No Data */
	/*	0x08 */			/* Not used - always 0 */
#define	ST1_OR	0x10			/* Overrun */
#define	ST1_DE	0x20			/* Data Error */
	/*	0x40 */			/* Not used - always 0 */
#define	ST1_EN	0x80			/* End of Cylinder */

/*
 * Status Register 2 - Bit Definitions.
 */
#define	ST2_MD	0x01			/* Missing Address Mark in Data Field */
#define	ST2_BC	0x02			/* Bad Cylinder */
#define	ST2_SN	0x04			/* Scan Not Satisfied */
#define	ST2_SH	0x08			/* Scan Equal Hit */
#define	ST2_WC	0x10			/* Wrong Cylinder */
#define	ST2_DD	0x20			/* Data Error in Data Field */
#define	ST2_CM	0x40			/* Control Mark */
	/*	0x80 */			/* Not used - always 0 */

/*
 * Status Register 3 - Bit Definitions.
 */
#define	ST3_US0	0x01			/* Unit Select 0 */
#define	ST3_US1	0x02			/* Unit Select 1 */
#define	ST3_HD	0x04			/* Head Address */
#define	ST3_TS	0x08			/* Two Sides */
#define	ST3_T0	0x10			/* Track 0 */
#define	ST3_RDY	0x20			/* Ready */
#define ST3_WP	0x40			/* Write Protected */
#define	ST3_FT	0x80			/* Fault */

/*
 * Controller Commands.
 */
#define	CMDSPEC	0x03			/* Specify */
#define CMDSDRV 0x04			/* Sense drive status */
#define	CMDRCAL	0x07			/* Recal */
#define CMDSINT 0x08			/* Sense interrupt status */
#define	CMDSEEK	0x0F			/* Seek */
#define	CMDWDAT	0x45			/* Write data */
#define CMDRDID 0x4A			/* Read ID */
#define	CMDFMT	0x4D			/* Format track */
#define	CMDRDAT	0x66			/* Read data */

/* Look at minor # to see if target device is diskette or floppy tape. */
#define FDC_DISKETTE(dev)	(((dev) & 0xC0) == 0)
#define FDC_TAPE(dev)		(((dev) & 0xC0) == 0x40)

/*
 * See if Read/Write command is in progress.
 * If so, may not send another command yet.
 */
#define FDC_BUSY()	(inb(FDCMSR) & MSRCB)

/*
 * These definitions are out of the usual order because they are for
 * the FDC struct which follows.
 */
#define FDC_NUM_CMD_STAT	8
#define FDC_NUM_INT_STAT	4

enum {
	FDC_MOTOR_OFF = 0,
	FDC_MOTOR_ON = 1
};

enum {
	FDC_HEAD_0 = 0,
	FDC_HEAD_1 = 1
};

struct	FDC	{
	/* Command status buffer, and how many valid entries contained. */
	int		fdc_ncmdstat;
	unsigned char	fdc_cmdstat[FDC_NUM_CMD_STAT];

	/* Interrupt status buffer, and how many valid entries contained. */
	int		fdc_nintstat;
	unsigned char	fdc_intstat[FDC_NUM_INT_STAT];
};

/*
 * ----------------------------------------------------------------------
 * Functions.
 *	Import Functions.
 *	Export Functions.
 *	Local Functions.
 */

/*
 * ----------------------------------------------------------------------
 * Global Data.
 *	Import Variables.
 *	Export Variables.
 *	Local Variables.
 */
extern struct FDC	fdc;

extern void		(*ftIntr)();
extern void		(*flIntr)();

#endif /*__SYS_FDC765_H__*/

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.