|
|
1.1 root 1: /*
2: * /usr/include/sys/fdc765.h
3: *
4: * Support 765-style controller for diskette and floppy tape
5: *
6: * Revised: Mon Jun 14 07:15:35 1993 CDT
7: */
8: #ifndef __SYS_FDC765_H__
9: #define __SYS_FDC765_H__
10:
11: /*
12: * ----------------------------------------------------------------------
13: * Includes.
14: */
15:
16: /*
17: * ----------------------------------------------------------------------
18: * Definitions.
19: * Constants.
20: * Macros with argument lists.
21: * Typedefs.
22: * Enums.
23: */
24:
25: /* Port addresses */
26: #define FDCDOR 0x3F2 /* Digital output */
27: #define FDCDAT 0x3F5 /* Data register */
28: #define FDCMSR 0x3F4 /* Main status register */
29: #define FDCRATE 0x3F7 /* Transfer rate (500,300,250 Kbps) */
30: /* 0=500 1=300 2=250 3=1000 Kbps */
31: #define FDCCHGL 0x3F7 /* Port where we read the disk */
32: /* changed line */
33:
34: /* FDCDOR masks */
35: #define DORDS 0x03 /* Drive select bits */
36: #define DORNMR 0x04 /* Not master reset */
37: #define DORIEN 0x08 /* Interrupt, DMA enable */
38: #define DORMS 0xF0 /* Motor enables */
39:
40: /* FDCDMSR masks */
41: #define MSRDB 0x0F /* Drive busy */
42: #define MSRCB 0x10 /* Control busy */
43: #define MSRNDMA 0x20 /* Not DMA */
44: #define MSRDIO 0x40 /* Data direction */
45: #define MSRRQM 0x80 /* Request for master */
46:
47: /* FDCCHGL mask */
48: #define DSKCHGD 0x80 /* Diskette changed line bit. */
49:
50: /* FDCRATE values (transfer rates) */
51: #define FDC_RATE_500K 0
52: #define FDC_RATE_300K 1
53: #define FDC_RATE_250K 2
54: #define FDC_RATE_1MEG 3
55: /*
56: * Status Register 0 - Bit Definitions.
57: */
58: #define ST0_US0 0x01 /* Unit Select 0 */
59: #define ST0_US1 0x02 /* Unit Select 1 */
60: #define ST0_HD 0x04 /* Head Address */
61: #define ST0_NR 0x08 /* Not Ready */
62: #define ST0_EC 0x10 /* Equipment Check */
63: #define ST0_SE 0x20 /* Seek End */
64: #define ST0_IC 0xC0 /* Interrupt code */
65: #define ST0_NT 0x00 /* Normal Termination */
66:
67: /*
68: * Status Register 1 - Bit Definitions.
69: */
70: #define ST1_MA 0x01 /* Missing Address Mark */
71: #define ST1_NW 0x02 /* Not writeable */
72: #define ST1_ND 0x04 /* No Data */
73: /* 0x08 */ /* Not used - always 0 */
74: #define ST1_OR 0x10 /* Overrun */
75: #define ST1_DE 0x20 /* Data Error */
76: /* 0x40 */ /* Not used - always 0 */
77: #define ST1_EN 0x80 /* End of Cylinder */
78:
79: /*
80: * Status Register 2 - Bit Definitions.
81: */
82: #define ST2_MD 0x01 /* Missing Address Mark in Data Field */
83: #define ST2_BC 0x02 /* Bad Cylinder */
84: #define ST2_SN 0x04 /* Scan Not Satisfied */
85: #define ST2_SH 0x08 /* Scan Equal Hit */
86: #define ST2_WC 0x10 /* Wrong Cylinder */
87: #define ST2_DD 0x20 /* Data Error in Data Field */
88: #define ST2_CM 0x40 /* Control Mark */
89: /* 0x80 */ /* Not used - always 0 */
90:
91: /*
92: * Status Register 3 - Bit Definitions.
93: */
94: #define ST3_US0 0x01 /* Unit Select 0 */
95: #define ST3_US1 0x02 /* Unit Select 1 */
96: #define ST3_HD 0x04 /* Head Address */
97: #define ST3_TS 0x08 /* Two Sides */
98: #define ST3_T0 0x10 /* Track 0 */
99: #define ST3_RDY 0x20 /* Ready */
100: #define ST3_WP 0x40 /* Write Protected */
101: #define ST3_FT 0x80 /* Fault */
102:
103: /*
104: * Controller Commands.
105: */
106: #define CMDSPEC 0x03 /* Specify */
107: #define CMDSDRV 0x04 /* Sense drive status */
108: #define CMDRCAL 0x07 /* Recal */
109: #define CMDSINT 0x08 /* Sense interrupt status */
110: #define CMDSEEK 0x0F /* Seek */
111: #define CMDWDAT 0x45 /* Write data */
112: #define CMDRDID 0x4A /* Read ID */
113: #define CMDFMT 0x4D /* Format track */
114: #define CMDRDAT 0x66 /* Read data */
115:
116: /* Look at minor # to see if target device is diskette or floppy tape. */
117: #define FDC_DISKETTE(dev) (((dev) & 0xC0) == 0)
118: #define FDC_TAPE(dev) (((dev) & 0xC0) == 0x40)
119:
120: /*
121: * See if Read/Write command is in progress.
122: * If so, may not send another command yet.
123: */
124: #define FDC_BUSY() (inb(FDCMSR) & MSRCB)
125:
126: /*
127: * These definitions are out of the usual order because they are for
128: * the FDC struct which follows.
129: */
130: #define FDC_NUM_CMD_STAT 8
131: #define FDC_NUM_INT_STAT 4
132:
133: enum {
134: FDC_MOTOR_OFF = 0,
135: FDC_MOTOR_ON = 1
136: };
137:
138: enum {
139: FDC_HEAD_0 = 0,
140: FDC_HEAD_1 = 1
141: };
142:
143: struct FDC {
144: /* Command status buffer, and how many valid entries contained. */
145: int fdc_ncmdstat;
146: unsigned char fdc_cmdstat[FDC_NUM_CMD_STAT];
147:
148: /* Interrupt status buffer, and how many valid entries contained. */
149: int fdc_nintstat;
150: unsigned char fdc_intstat[FDC_NUM_INT_STAT];
151: };
152:
153: /*
154: * ----------------------------------------------------------------------
155: * Functions.
156: * Import Functions.
157: * Export Functions.
158: * Local Functions.
159: */
160:
161: /*
162: * ----------------------------------------------------------------------
163: * Global Data.
164: * Import Variables.
165: * Export Variables.
166: * Local Variables.
167: */
168: extern struct FDC fdc;
169:
170: extern void (*ftIntr)();
171: extern void (*flIntr)();
172:
173: #endif /*__SYS_FDC765_H__*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.