*** empty log message ***
[jnode:svn-mirror.git] / docs / external-specs / floppy.txt
1 NEC æPD765  -  Floppy Disk Controller  -  8272A
2
3        PS/2 FDC Diskette Status Register A at 3F0h
4
5         ³7³6³5³4³3³2³1³0³  3F0h  PS/2 Disk Status Register A (read-only)
6          ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄ direction
7          ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÄ write protect
8          ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄ index
9          ³ ³ ³ ³ ÀÄÄÄÄÄÄÄ head 1 select
10          ³ ³ ³ ÀÄÄÄÄÄÄÄÄ track 0
11          ³ ³ ÀÄÄÄÄÄÄÄÄÄ step
12          ³ ÀÄÄÄÄÄÄÄÄÄÄ second drive installed
13          ÀÄÄÄÄÄÄÄÄÄÄÄ interrupt pending
14
15        PS/2 FDC Diskette Status Register B at 3F1h
16
17         ³7³6³5³4³3³2³1³0³  3F1h  PS/2 Disk Status Register B (read-only)
18          ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄ motor enable 0
19          ³ ³ ³ ³ ³ ³ ÀÄÄÄÄ motor enable 1
20          ³ ³ ³ ³ ³ ÀÄÄÄÄ write enable
21          ³ ³ ³ ³ ÀÄÄÄÄ read data (toggles w/positive transition in -RD DATA)
22          ³ ³ ³ ÀÄÄÄÄ write data (toggles w/positive transition in WR DATA)
23          ³ ³ ÀÄÄÄÄ drive select
24          ÀÄÁÄÄÄÄ reserved
25
26        FDC Digital Output Register at 3F2h  (all systems)
27
28         ³7³6³5³4³3³2³1³0³  port 3F2h  (write only)
29          ³ ³ ³ ³ ³ ³ ÀÄÁÄÄÄÄ floppy drive select (0=A, 1=B, 2=floppy C, ...)
30          ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄ 1 = FDC enable, 0 = hold FDC at reset
31          ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄ 1 = DMA & I/O interface enabled  (reserved PS/2)
32          ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄ 1 = turn floppy drive A motor on
33          ³ ³ ÀÄÄÄÄÄÄÄÄÄÄ 1 = turn floppy drive B motor on
34          ³ ÀÄÄÄÄÄÄÄÄÄÄÄ 1 = turn floppy drive C motor on; (reserved PS/2)
35          ÀÄÄÄÄÄÄÄÄÄÄÄÄ 1 = turn floppy drive D motor on; (reserved PS/2)
36
37         - used to control drive motors, drive selection, and feature enable
38         - PS/2 only uses bit 0 for floppy drive select; bit 1 is reserved
39         - PS/2 only uses bits 5 & 4 for  motor enable; bits 7&6 are reserved
40         - all DOR bits are cleared during controller reset
41
42        FDC Main Status Register at 3F4h  (all systems)
43
44         ³7³6³5³4³3³2³1³0³  port 3F4h  (read only)
45          ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄ floppy drive 0 in seek mode/busy
46          ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÄ floppy drive 1 in seek mode/busy
47          ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄ floppy drive 2 in seek mode/busy (reserved PS/2)
48          ³ ³ ³ ³ ÀÄÄÄÄÄÄÄ floppy drive 3 in seek mode/busy (reserved PS/2)
49          ³ ³ ³ ÀÄÄÄÄÄÄÄÄ FDC read or write command in progress
50          ³ ³ ÀÄÄÄÄÄÄÄÄÄ FDC is in non-DMA mode
51          ³ ÀÄÄÄÄÄÄÄÄÄÄ I/O direction;  1 = FDC to CPU; 0 = CPU to FDC
52          ÀÄÄÄÄÄÄÄÄÄÄÄ data reg ready for I/O to/from CPU (request for master)
53
54        FDC Command Status Register 0 at 3F5h  (all systems)
55
56         ³7³6³5³4³3³2³1³0³  Command Status Register 0 at port 3F5h
57          ³ ³ ³ ³ ³ ³ ÀÄÁÄÄÄÄ unit selected at interrupt (0=A, 1=B, 2=...)
58          ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄ head number at interrupt (head 0 or 1)
59          ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄ not ready on read/write or SS access to head 1
60          ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄ equipment check (see note)
61          ³ ³ ÀÄÄÄÄÄÄÄÄÄÄ set to 1 when FDD completes a seek command
62          ÀÄÁÄÄÄÄÄÄÄÄÄÄÄ last command status (see below)
63
64         Bits
65          76  Last Command Status
66          00  command terminated successfully
67          01  command execution started but terminated abnormally
68          10  invalid command issued
69          11  command terminated abnormally due to a change in state of
70              the Ready Signal from the FDC  (reserved on PS/2)
71
72         - equipment check can occur if FDD signals a fault or track zero is
73           not found after 77 steps on a recalibrate command
74         - PS/2 only uses bits 1-0 for drive (values are 01b and 10b)
75
76         FDC Command Status Register 1 at 3F5h  (all systems)
77
78         ³7³6³5³4³3³2³1³0³  Command Status Register 1 at port 3F5h
79          ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄ FDC cannot find ID address mark (see reg 2)
80          ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÄ write protect detected during write
81          ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄ FDC cannot find sector ID
82          ³ ³ ³ ³ ÀÄÄÄÄÄÄÄ unused (always zero)
83          ³ ³ ³ ÀÄÄÄÄÄÄÄÄ over-run;  FDC not serviced in reasonable time
84          ³ ³ ÀÄÄÄÄÄÄÄÄÄ data error (CRC) in ID field or data field
85          ³ ÀÄÄÄÄÄÄÄÄÄÄ unused (always zero)
86          ÀÄÄÄÄÄÄÄÄÄÄÄ end of cylinder; sector# greater than sectors/track
87
88         - bit 0 of Status Register 1 and bit 4 of Status Register 2 are
89           related and mimic each other
90
91         FDC Command Status Register 2 at 3F5h  (all systems)
92
93         ³7³6³5³4³3³2³1³0³  Command Status Register 2 at port 3F5h
94          ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄ missing address mark in data field
95          ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÄ bad cylinder, ID not found and Cyl Id=FFh
96          ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄ scan command failed, sector not found in cylinder
97          ³ ³ ³ ³ ÀÄÄÄÄÄÄÄ scan command equal condition satisfied
98          ³ ³ ³ ÀÄÄÄÄÄÄÄÄ wrong cylinder detected
99          ³ ³ ÀÄÄÄÄÄÄÄÄÄ CRC error detected in sector data
100          ³ ÀÄÄÄÄÄÄÄÄÄÄ sector with deleted data address mark detected
101          ÀÄÄÄÄÄÄÄÄÄÄÄ unused (always zero)
102
103         - bit 0 of Status Register 1 and bit 4 of Status Register 2 are
104           related and mimic each other
105
106         FDC Command Status Register 3 at 3F5h (FDD status, all systems)
107
108         ³7³6³5³4³3³2³1³0³  Floppy Disk Drive Status at port 3F5h
109          ³ ³ ³ ³ ³ ³ ÀÄÁÄÄÄÄ FDD unit selected status (0=A, 1=B, 2=...)
110          ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄ FDD side head select status (0=head 0, 1=head 1)
111          ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄ FDD two sided status signal
112          ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄ FDD track zero status signal
113          ³ ³ ÀÄÄÄÄÄÄÄÄÄÄ FDD ready status signal
114          ³ ÀÄÄÄÄÄÄÄÄÄÄÄ FDD write protect status signal
115          ÀÄÄÄÄÄÄÄÄÄÄÄÄ FDD fault status signal
116
117         PS/2 FDC Digital Input Register at 3F7h
118
119         ³7³6³5³4³3³2³1³0³  3F7h  PS/2 Digital Input Register (read only)
120          ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ high density select
121          ³ ÀÄÁÄÁÄÁÄÁÄÁÄÄÄÄ reserved
122          ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ diskette change
123
124         PS/2 FDC Configuration Control Register at 3F7h
125
126         ³7³6³5³4³3³2³1³0³  3F7h  PS/2 Config. Control Register (write only)
127          ³ ³ ³ ³ ³ ³ ÀÄÁÄÄ DRC1, DRC0  (see below)
128          ÀÄÁÄÁÄÁÄÁÄÁÄÄÄÄÄ reserved
129
130         DRC1 DRC0
131           0   0    500000 bit per second mode
132           0   1    reserved
133           1   0    250000 bit per second mode
134           1   1    reserved
135
136
137         - Digital Input Register is used to sense the state of the
138           (-diskette change) and the (-high density select) signals
139         - Configuration Control Register is used to set the transfer rate
140
141
142 FDC Programming Considerations
143
144         Three phases of command execution:
145
146         1.  Command phase; commands are sent from the CPU to the FDC via
147             port 3F5h;  bit 6 of the Status Register at 3F4h must be zero
148         2.  Execution phase; FDC executes instruction & generates INT 6
149         3.  Result phase; status and other information is available to CPU;
150             INT 6 sets bit 7 of BIOS Data Area location 40:3E which can
151             be polled for completion status
152
153
154         Example of a read operation:
155
156         1. turn disk motor on and set delay time for drive spin up
157         2. perform seek operation;  wait for disk interrupt
158         3. prepare DMA chip to move data to memory
159         4. send read command and wait for transfer complete interrupt
160         5. read status information
161         6. turn disk motor off
162
163
164 Floppy Diskette Controller Operations (15 commands)
165
166         Read Data          D7  D6  D5  D4  D3  D2  D1  D0
167
168         command byte 0:    MT  MF  SK   0   0   1   1   0
169         command byte 1:     ?   ?   ?   ?   ?  HD  US1 US0
170         command byte 2:    cylinder number
171         command byte 3:    head number
172         command byte 4:    sector number
173         command byte 5:    bytes per sector
174         command byte 6:    end of track (last sector in track)
175         command byte 7:    gap 3 length
176         command byte 8:    data length (if cmd byte 5==0)
177         result byte 0:     status register 0
178         result byte 1:     status register 1
179         result byte 2:     status register 2
180         result byte 3:     cylinder number
181         result byte 4:     head number
182         result byte 5:     sector number
183         result byte 6:     bytes per sector
184
185         Read Deleted Data  D7  D6  D5  D4  D3  D2  D1  D0
186
187         command byte 0:    MT  MF  SK   0   1   1   0   0
188         command byte 1:     ?   ?   ?   ?   ?  HD  US1 US0
189         command byte 2:    cylinder number
190         command byte 3:    head number
191         command byte 4:    sector number
192         command byte 5:    bytes per sector
193         command byte 6:    end of track (last sector in track)
194         command byte 7:    gap 3 length
195         command byte 8:    data length (if cmd byte 5==0)
196         result byte 0:     status register 0
197         result byte 1:     status register 1
198         result byte 2:     status register 2
199         result byte 3:     cylinder number
200         result byte 4:     head number
201         result byte 5:     sector number
202         result byte 6:     bytes per sector
203
204         Write Data         D7  D6  D5  D4  D3  D2  D1  D0
205
206         command byte 0:    MT  MF   0   0   0   1   0   1
207         command byte 1:     ?   ?   ?   ?   ?  HD  US1 US0
208         command byte 2:    cylinder number
209         command byte 3:    head number
210         command byte 4:    sector number
211         command byte 5:    bytes per sector
212         command byte 6:    end of track (last sector in track)
213         command byte 7:    gap 3 length
214         command byte 8:    data length (if cmd byte 5==0)
215         result byte 0:     status register 0
216         result byte 1:     status register 1
217         result byte 2:     status register 2
218         result byte 3:     cylinder number
219         result byte 4:     head number
220         result byte 5:     sector number
221         result byte 6:     bytes per sector
222
223         Write Deleted Data D7  D6  D5  D4  D3  D2  D1  D0
224
225         command byte 0:    MT  MF   0   0   1   0   0   1
226         command byte 1:     ?   ?   ?   ?   ?  HD  US1 US0
227         command byte 2:    cylinder number
228         command byte 3:    head number
229         command byte 4:    sector number
230         command byte 5:    bytes per sector
231         command byte 6:    end of track (last sector in track)
232         command byte 7:    gap 3 length
233         command byte 8:    data length (if cmd byte 5==0)
234         result byte 0:     status register 0
235         result byte 1:     status register 1
236         result byte 2:     status register 2
237         result byte 3:     cylinder number
238         result byte 4:     head number
239         result byte 5:     sector number
240         result byte 6:     bytes per sector
241
242         Read a Track       D7  D6  D5  D4  D3  D2  D1  D0
243         (Diagnostic)
244         command byte 0:     0  MF  SK   0   0   0   1   0
245         command byte 1:     ?   ?   ?   ?   ?  HD  US1 US0
246         command byte 2:    cylinder number
247         command byte 3:    head number
248         command byte 4:    sector number
249         command byte 5:    bytes per sector
250         command byte 6:    end of track (last sector in track)
251         command byte 7:    gap 3 length
252         command byte 8:    data length (if cmd byte 5==0)
253         result byte 0:     status register 0
254         result byte 1:     status register 1
255         result byte 2:     status register 2
256         result byte 3:     cylinder number
257         result byte 4:     head number
258         result byte 5:     sector number
259         result byte 6:     bytes per sector
260
261         Read ID            D7  D6  D5  D4  D3  D2  D1  D0
262
263         command byte 0:     0  MF   0   0   1   0   1   0
264         command byte 1:     ?   ?   ?   ?   ?  HD  US1 US0
265         result byte 0:     status register 0
266         result byte 1:     status register 1
267         result byte 2:     status register 2
268         result byte 3:     cylinder number
269         result byte 4:     head number
270         result byte 5:     sector number
271         result byte 6:     bytes per sector
272
273         Format a Track     D7  D6  D5  D4  D3  D2  D1  D0
274         (Write Sector IDs)
275         command byte 0:     0  MF   0   0   1   1   0   1
276         command byte 1:     ?   ?   ?   ?   ?  HD  US1 US0
277         command byte 2:    bytes per sector
278         command byte 3:    sectors per track
279         command byte 4:    gap 3 length
280         command byte 5:    filler pattern to write in each byte
281         result byte 0:     status register 0
282         result byte 1:     status register 1
283         result byte 2:     status register 2
284         result byte 3:     cylinder number
285         result byte 4:     head number
286         result byte 5:     sector number
287         result byte 6:     bytes per sector
288
289         Scan Equal         D7  D6  D5  D4  D3  D2  D1  D0
290
291         command byte 0:    MT  MF  SK   1   0   0   0   1
292         command byte 1:     ?   ?   ?   ?   ?  HD  US1 US0
293         command byte 2:    cylinder number
294         command byte 3:    head number
295         command byte 4:    sector number
296         command byte 5:    bytes per sector
297         command byte 6:    end of track (last sector in track)
298         command byte 7:    gap 3 length
299         command byte 8:    scan test (1=scan contiguous, 2=scan alternate)
300         result byte 0:     status register 0
301         result byte 1:     status register 1
302         result byte 2:     status register 2
303         result byte 3:     cylinder number
304         result byte 4:     head number
305         result byte 5:     sector number
306         result byte 6:     bytes per sector
307
308         Scan Low or Equal  D7  D6  D5  D4  D3  D2  D1  D0
309
310         command byte 0:    MT  MF  SK   1   1   0   0   1
311         command byte 1:     ?   ?   ?   ?   ?  HD  US1 US0
312         command byte 2:    cylinder number
313         command byte 3:    head number
314         command byte 4:    sector number
315         command byte 5:    bytes per sector
316         command byte 6:    end of track (last sector in track)
317         command byte 7:    gap 3 length
318         command byte 8:    scan test (1=scan contiguous, 2=scan alternate)
319         result byte 0:     status register 0
320         result byte 1:     status register 1
321         result byte 2:     status register 2
322         result byte 3:     cylinder number
323         result byte 4:     head number
324         result byte 5:     sector number
325         result byte 6:     bytes per sector
326
327         Scan High or Equal D7  D6  D5  D4  D3  D2  D1  D0
328
329         command byte 0:    MT  MF  SK   1   1   1   0   1
330         command byte 1:     ?   ?   ?   ?   ?  HD  US1 US0
331         command byte 2:    cylinder number
332         command byte 3:    head number
333         command byte 4:    sector number
334         command byte 5:    bytes per sector
335         command byte 6:    end of track (last sector in track)
336         command byte 7:    gap 3 length
337         command byte 8:    scan test (1=scan contiguous, 2=scan alternate)
338         result byte 0:     status register 0
339         result byte 1:     status register 1
340         result byte 2:     status register 2
341         result byte 3:     cylinder number
342         result byte 4:     head number
343         result byte 5:     sector number
344         result byte 6:     bytes per sector
345
346         Recalibrate        D7  D6  D5  D4  D3  D2  D1  D0
347
348         command byte 0:     0   0   0   0   0   1   1   1
349         command byte 1:     ?   ?   ?   ?   ?   0  US1 US0
350         returns nothing
351
352         Sense Interrupt    D7  D6  D5  D4  D3  D2  D1  D0
353             Status
354         command byte 0:     0   0   0   0   1   0   0   0
355         result byte 0:     status register 0
356         result byte 1:     present cylinder number
357
358         Specify Step &     D7  D6  D5  D4  D3  D2  D1  D0
359           Head Load
360         command byte 0:     0   0   0   0   0   0   1   1
361         command byte 1:    step rate time ³ head unload time
362         command byte 2:    ÄÄÄÄÄÄhead load timeÄÄÄÄÄÄ   ND
363         returns nothing
364
365         Sense Drive        D7  D6  D5  D4  D3  D2  D1  D0
366           Status
367         command byte 0:     0   0   0   0   0   1   0   0
368         command byte 1:     ?   ?   ?   ?   ?  HD  US1 US0
369         result byte 0:     status register 3
370
371         Seek               D7  D6  D5  D4  D3  D2  D1  D0
372
373         command byte 0:     0   0   0   0   1   1   1   1
374         command byte 1:     ?   ?   ?   ?   ?  HD  US1 US0
375         command byte 2:    new cylinder number
376         returns nothing
377
378         æPD765 Version     D7  D6  D5  D4  D3  D2  D1  D0
379
380         command byte 0:     ?   ?   ?   1   0   0   0   0
381         result byte 0:     status register 0
382                            90h = æPD765B;  80h = æPD765A or æPD765A-2
383
384         Invalid Command
385
386         result byte 0:     status register 0 (value of 80h)
387
388
389         Key to Abbreviations
390         HD = Head Number Selected       SK = SKip Deleted-data address mark
391         MT = Multi-Track                US0 = drive select bit 0
392         MF = MFM mode                   US1 = drive select bit 1
393         ND = Non-DMA mode
394
395         Head Load Time = 2 to 254ms in 2ms increments
396         Head Unload Time = 16 to 240ms in 16ms increments
397         Step Rate Time = 1 to 16ms in 1ms increments
398
399
400         - PS/2 systems use the 8272A diskette controller which is software
401           and port compatible with the NEC æPD765
402         - accessed through ports 3F0h-3F7h;  NEC æPD765 is accessed through
403           ports 3F2h, 3F4h and 3F5h;   the 8272A uses ports 3F0h, 3F1h,
404           3F2h, 3F4h, 3F5h and 3F7h
405         - data, command and status registers are all accessed through
406           port 3F5h a register stack with one address presented to the bus
407         - bit 7 of BIOS Data Area byte 40:3E can be polled to determine
408           if a disk operation has completed;  this bit is set by the
409           interrupt handler when the operation has completed;  it should
410           be reset before continuing on with the next FDC operation