WD1772 Floppy Disk Controller

From Atari Wiki
Revision as of 20:59, 27 July 2026 by Exxos (talk | contribs) (Created page with "<html> <style> .mm { font-family: monospace, monospace; line-height: 1.35; background: #f8f9fa; border: 1px solid #eaecf0; padding: 1em 1em 1em 2.2em; overflow-x: auto; } .mm .r, .mm summary { white-space: pre; margin: 0; padding: 0; } .mm details { margin: 0; padding: 0; } .mm summary { cursor: pointer; list-style: none; position: relative; } .mm summary::-webkit-details-marker { display: none; } .mm summary::marker { content: ""; } .mm summary .a { color: #0645ad...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

===========#==#=======#=======================================================================#===== ----------------------|WD1772 Floppy Disk Controller |----- ===========#==#=======#=======================================================================#=====
PRELIMINARY DOCUMENT. This page consolidates three source datasheets (Western Digital's own, the widely-used DrCoolZic edition, and the independent Acorn/BBC Micro reference) cross-checked against Hatari and EmuTOS source, plus real-world 16 MHz reliability testing. It corrects nine confirmed errors across those sources — see the table at the end. It has not been reviewed by anyone outside this wiki. If you find something wrong, say so.
Compiled by exxos (Chris Swinson), exxosforum.co.uk / atari-wiki.com. The real-world 16 MHz reliability findings in section 16 are exxos's own article and years of commercial testing, credited and linked there rather than reproduced. Cross-checking against Hatari, EmuTOS and the three source datasheets carried out for this page. 27 July 2026.
A single reference for the Western Digital WD1772 as fitted to the Atari ST, built by cross-checking three source documents against each other and against two independently-written, boot-tested implementations. No single document below is reliable on every point - where they disagree, this page states the resolution and the evidence, rather than picking one silently. Western Digital's own preliminary WD1770/1772 datasheet stamped PRELIMINARY, undated printing DrCoolZic (Jean Louis-Guerin)'s edited WD177X-00 datasheet, V1.1/V1.3 info-coach.fr/atari/documents/_mydoc/WD1772-JLG.pdf DrCoolZic's companion 'Atari ST FD/HD Programming' guide, V1.2 info-coach.fr/atari/documents/_mydoc/FD-HD_Programming.pdf Acorn/BBC Micro 'WD1770/2/3 data' reference file, author unknown bbc.nvg.org/doc/wd1770.txt EmuTOS bios/fdc.h and bios/floppy.c - github.com/emutos/emutos Hatari src/fdc.c - github.com/hatari/hatari See [[Reference documents and datasheets]] for the general note on these source documents' quality, and the [[Memory Map for Atari ST,STE,TT and Falcon]] index for the wider hardware reference set. ===========#==#=======#=======================================================================#===== ----------------------|1. Overview |----- ===========#==#=======#=======================================================================#===== The WD1772 is a floppy disk formatter/controller: a 28-pin NMOS part with a built-in digital data separator and write precompensation circuit, needing only buffers on the drive side. It supports single (FM) and double (MFM) density, sector lengths of 128/256/512/1024 bytes, up to 240 tracks and up to 240 sectors per track. Clock is 8 MHz +/-0.1%. Data rates are 125 kbit/s (FM) and 250 kbit/s (MFM). On the Atari ST the chip is not in the 68000 address space directly - every access goes through the DMA controller. See section 15.
DATAREGISTERCOMMANDREGISTERSECTORREGISTERTRACKREGISTERSTATUSREGISTERDATA OUT BUFFERSDAL0-DAL7 (host)DATA SHIFTREGISTERALUWRITEPRECOMPDATASEPARATORRDAM DETECTORCRC LOGICCOMPUTERINTERFACECONTROLPLA CONTROL(240 x 19)DISKINTERFACECONTROLDRQINTRQMRCSR/WA0A1CLK (8MHz)WGWPRTIPTR00STEPDIRCMOTOR ONWD1772 internal architecture (redrawn from the original block diagram)
WD1772 internal architecture, redrawn from the original block diagram.
===========#==#=======#=======================================================================#===== ----------------------|2. Pinout |----- ===========#==#=======#=======================================================================#=====
CS1R/W2A03A14DAL05DAL16DAL27DAL38DAL49DAL510DAL611DAL712MR13GND14INTRQ28DRQ27DDEN26WPRT25IP24TR0023WD22WG21MO20RD19CLK18DIRC17STEP16VCC15WD177228-PIN DIP(top view)
28-pin DIP, top view.
Pin Name I/O Function --------------------------------------------------- 1 CS* I Chip select, active low 2 R/W* I 1 = read, 0 = write 3-4 A0,A1 I Register select (section 3) 5-12 DAL0-7 I/O 8-bit bidirectional data bus 13 MR* I Master reset, active low pulse 14 GND - Ground 15 VCC - +5V +/-5% 16 STEP O One pulse per head step 17 DIRC O High = step in, low = step out 18 CLK I 8MHz +/-0.1%, free-running 19 RD* I Raw read data, active low 20 MO O Motor on, active high 21 WG O Write gate 22 WD O Write data 23 TR00* I Active low, head at track 0 24 IP* I Active low, index hole 25 WPRT* I Active low, write protected 26 DDEN* I 0=MFM, 1=FM 27 DRQ O Data register full/empty 28 INTRQ O Set at command completion ===========#==#=======#=======================================================================#===== ----------------------|3. Registers |----- ===========#==#=======#=======================================================================#===== Selected by A1/A0. On the Atari these two pins are driven by the DMA chip, not the CPU address bus - see section 15. A1 A0 Read (R/W*=1) Write (R/W*=0) ------------------------------------------------ 0 0 Status Register Command Register 0 1 Track Register Track Register 1 0 Sector Register Sector Register 1 1 Data Register Data Register Track Register - current head position. Incremented on step in, decremented on step out. Compared against the ID field track number during read, write and verify. Not loaded while busy. Sector Register - desired sector, compared against the ID field. Not loaded while busy. Read Address writes the ID field's TRACK address into it (undocumented, relied upon in practice). Data Register - holding register for read/write data; during a Seek it holds the destination track number. Command Register - write only, not loaded while busy except for Force Interrupt. Status Register - read only, meaning depends on the last command type. After writing any register, it cannot be read again until 16us (MFM) or 32us (FM) have elapsed. ===========#==#=======#=======================================================================#===== ----------------------|4. Commands |----- ===========#==#=======#=======================================================================#=====
b0b1b2b3b4b5b6b7COMMANDTYPEBASERestoreI0000hvr1r0$00SeekI0001hvr1r0$10StepI001uhvr1r0$20Step-InI010uhvr1r0$40Step-OutI011uhvr1r0$60Read SectorII100mhe00$80Write SectorII101mhepa0$A0Read AddressIII1100he00$C0Read TrackIII1110he00$E0Write TrackIII1111hep0$F0Force InterruptIV1101i3i2i1i0$D0
All eleven commands as bit fields. Shaded cells are fixed opcode bits; Read Track (highlighted) is the encoding DrCoolZic's edition misprints as 1101.
Base is the opcode with all flags clear, not the only byte the command can take - e.g. Read Track can appear as $E0, $E4, $E8 or $EC depending on h and e. Match on the top nibble. Commands may only be written when Busy (status bit 0) is clear. Force Interrupt is the sole exception. -------------------- Flags -------------------- Flag Bit 0 1 ------------------------------------------------------------------ u - Update Track Reg 4 no update update m - Multiple Sector 4 single sector multiple h - Motor On 3 enable spin-up disable spin-up v - Verify 2 no verify verify dest. track e - Settling Delay 2 no delay 15ms(1772)/30ms(1770) p - Write Precomp 1 enable precomp disable precomp a0 - Data Addr Mark 0 normal ($FB) deleted ($F8) 'p' is inverted from the intuitive reading: 0 turns precompensation ON. DrCoolZic's editions print '0 Unable Write Pre-comp', a typo for 'Enable'; Western Digital's original and the Acorn reference both correctly say '0 = Enable'. 'h' is not a motor-speed check. It is a fixed, unconditional wait for a number of index pulses (section 5) before the command executes. --------------- Step rates (r1, r0) --------------- r1 r0 WD1770/1773 WD1772 ---------------------------------- 0 0 6 ms 6 ms 0 1 12 ms 12 ms 1 0 20 ms 2 ms 1 1 30 ms 3 ms These are the confirmed WD1772 values. Western Digital's own preliminary datasheet gets the WD1772 column WRONG, printing 2/3/5/6ms against the wrong codes - a draft error, since the document is stamped PRELIMINARY and the figures do not match the shipped chip. DrCoolZic's editions and the Acorn reference both give the correct table; EmuTOS's own source comments reject the wrong figures explicitly ('not 2, but 6 msec steprate', and so on); Hatari implements FDC_StepRate_ms[] = { 6, 12, 2, 3 }. On the Atari, 3ms (r1,r0=1,1) is the practical setting. 2ms works but gives less reliable results. h must always be 0 on the ST, since MO is wired straight to the drive with no separate spin-up handshake to skip. ---------- Force Interrupt conditions (i3..i0) ---------- i0, i1 not used on the WD1772 (WD1773 only, ready/not-ready) i2 interrupt on every index pulse ($D4) i3 immediate interrupt ($D8) $D0 (all 0) terminate current command, no interrupt $D0 is the only command that lets a previous $D8 clear on a later status read or command write. Always follow $D8 with $D0. After any force interrupt, wait 16us (MFM) / 32us (FM) before a new command. ===========#==#=======#=======================================================================#===== ----------------------|5. Motor control and spin-up |----- ===========#==#=======#=======================================================================#===== With h=0 and MO low when a command arrives, the WD1772 raises MO and waits 6 index pulses before executing - a one second spindle start-up at 300 RPM. A command arriving while MO is already high executes immediately, defeating the wait, which is what makes consecutive reads/writes fast. Motor off after idle: 10 index pulses, roughly 2 seconds. DrCoolZic's datasheet edition says 9 revolutions; his Atari guide says 10 index pulses; the Acorn reference gives no figure. 10 is treated as correct here since it is unit-consistent with the 6-pulse spin-up figure. The drive must stay selected for index pulses to reach the FDC, so the motor can only turn itself off while the drive is still selected. ===========#==#=======#=======================================================================#===== ----------------------|6. Type I commands - Restore, Seek, Step, Step-in, Step-out|----- ===========#==#=======#=======================================================================#===== Direction is valid 24us before the first step pulse. Step pulse width is 4us (MFM) or 8us (FM). With v=1 an extra 15ms (WD1772) settling time follows the last step, then the track number from the first ID field found is compared against the Track Register. Match plus valid CRC completes the verify; the chip must find a good match within 5 revolutions or Seek Error is set. Restore - samples TR00*. If already at track 0, Track Register is zeroed and an interrupt generated; otherwise steps until TR00* activates. Not active after 255 pulses -> Seek Error (if v set). Seek - Track Register holds current position, Data Register the destination; steps until they match. Update the Track Register for the selected drive before seeking, with multiple drives. Step / Step-in / Step-out - one pulse, direction as named (or as the previous step command for plain Step). u=1 updates the Track Register. ===========#==#=======#=======================================================================#===== ----------------------|7. Type II commands - Read Sector, Write Sector |----- ===========#==#=======#=======================================================================#===== Load the Sector Register first. The chip must find an ID field with matching track, sector and valid CRC within 5 revolutions, or Record Not Found is set. (Western Digital's original is internally inconsistent, saying 'four revolutions' in one place and 'five' elsewhere; DrCoolZic and the Acorn reference both consistently say five - treated as correct, with 'four' a genuine WD original error.) Read Sector - Data Address Mark must appear within 30 bytes (FM) / 43 bytes (MFM) of the last ID CRC byte, or the ID search restarts. After 5 revolutions without a DAM, RNF is set. A CRC error at the end of the data field terminates the command, even in multiple-sector mode. S5 Address mark Primary Alternate --------------------------------------------- 0 Data Mark $FB $FA 1 Deleted Data Mark $F8 $F9 DrCoolZic's status table gives the alternate normal-mark byte as $FC - wrong, it should be $FA. Proof: his own Write Track byte-substitution table shows $F8-$FB written as-is with preset CRC (so $FA is a valid data- mark byte) while $FC uses an entirely different clock pattern used for index-type marks. Hatari confirms in code: normal DAM is 0xFB or 0xFA, deleted DAM is 0xF8 or 0xF9. Write Sector - once the ID field matches, the chip counts off 11 bytes (FM) / 22 bytes (MFM) from the CRC field, asserts WG if DRQ was serviced, writes 6/12 bytes of zero, the DAM per a0, the data, two CRC bytes, one byte of $FF. Late DRQ mid-sector writes a zero byte and sets Lost Data but does not abort. With m=1 the Sector Register auto-increments until it exceeds the track or Force Interrupt arrives. ===========#==#=======#=======================================================================#===== ----------------------|8. Type III commands |----- ===========#==#=======#=======================================================================#===== Read Address - reads the next ID field: track, side, sector, length, CRC1, CRC2 (6 bytes, one DRQ each). CRC checked, error bit set on failure but bytes still transferred. The track address is written into the Sector Register (undocumented, relied upon in practice; also relied upon: Read Address on a track with no address marks sets RNF). Read Track - starts at the leading edge of the first index pulse, runs to the next. No CRC checking; gap bytes included; AM detector stays on throughout, so write splices/noise can cause spurious detection and occasionally wrong gap bytes - ID and data fields remain reliable. Known hardware quirk: the WD1772 occasionally returns a wildly wrong byte count from this command (normal is under ~6500 bytes; failures up to ~21000 bytes reported) - retry. Write Track (formatting) - runs index pulse to index pulse. DRQ raised immediately, but writing does not start until the first byte is in the Data Register; over 3 byte times late aborts with Lost Data. A late byte mid-track is substituted with zero. Bytes $F5-$FE written during Write Track are interpreted specially rather than literally: Byte FM (DDEN*=1) MFM (DDEN*=0) -------------------------------------------------------------------- $00-$F4 write as-is, CLK=$FF write as-is $F5 not allowed write $A1, missing clock 4/5, preset CRC $F6 not allowed write $C2, missing clock 3/4 $F7 generate 2 CRC bytes generate 2 CRC bytes $F8-$FB as-is, CLK=$C7, preset CRC write as-is $FC write $FC, CLK=$D7 write $FC $FD write $FD, CLK=$FF write $FD $FE write $FE, CLK=$C7, preset CRC write $FE $FF write $FF, CLK=$FF write $FF In MFM the low bit of marks $F8-$FF is ignored, so $F8=$F9 and $FE=$FF for address-mark recognition. ===========#==#=======#=======================================================================#===== ----------------------|9. Status register |----- ===========#==#=======#=======================================================================#===== Bit Type I Type II / III -------------------------------------------------------------- S7 Motor On Motor On S6 Write Protect (see note) Write Protect (write cmds) S5 Spin-up complete Record Type (0=Data,1=Del.) S4 Seek Error Record Not Found S3 CRC Error CRC Error S2 TR00* state Lost Data S1 Index Pulse state Data Request S0 Busy Busy If S4 is set, a CRC error (S3) is in an ID field; if clear, in the data field. --------------- Summary by command --------------- Command S7 S6 S5 S4 S3 S2 S1 S0 -------------------------------------------------------- All Type I MO X SU SE CRC T0 IP BSY Read Sector MO X RT RNF CRC LD DRQ BSY Write Sector MO WP RT RNF CRC LD DRQ BSY Read Address MO X X RNF CRC LD DRQ BSY Read Track MO X X X X LD DRQ BSY Write Track MO WP X X X LD DRQ BSY FI (busy) - - - - - - - 0 FI (idle) MO X X X X T0 IP 0 Idle MO WP X X X T0 IP 0 X = undefined, - = retains previous value. Write Protect keeps updating after a Type I command. Undocumented by Western Digital: following any Type I command the chip sits in 'Type I idle' and continuously refreshes S6 alongside MO and TR00 - NOT true after Type II/III. To poll write-protect (e.g. detect a disk swap), follow the Type II/III command with a Type I command such as a seek to the current track. ===========#==#=======#=======================================================================#===== ----------------------|10. Programmed I/O timing delays |----- ===========#==#=======#=======================================================================#===== After Before FM MFM ---------------------------------------------------------- Write Command Reg Read Busy bit (S0) 48us 24us Write Command Reg Read status bits 1-7 64us 32us Write any register Read same register 32us 16us ===========#==#=======#=======================================================================#===== ----------------------|11. Standard track formats |----- ===========#==#=======#=======================================================================#===== MFM double density, 512 bytes/sector, 9 sectors - the standard Atari ST format: Count Value Field ------------------------------------------------------ 60 $4E Gap 1, post-index 12 $00 Gap 2, PLL lockup 3 $F5 (writes $A1) Gap 2, sync 1 $FE ID address mark 1 track number ID record 1 side number ID record 1 sector number ID record 1 $02 (see note) sector length, 512 bytes 1 $F7 writes 2 CRC bytes 22 $4E Gap 3a, post-ID 12 $00 Gap 3b, write splice 3 $F5 (writes $A1) Gap 3b, sync 1 $FB data address mark 512 data data record 1 $F7 writes 2 CRC bytes 40 $4E Gap 4, post-data ~668 $4E Gap 5, run-out
MFM double density sector, drawn to scale (square-root scaled).GAP 160B|GAP 212B|SYNC3B|IDAM1B|ID REC5B|CRC2B|GAP 3a22B|GAP 3b12B|SYNC3B|DAM1B|DATA512B|CRC2B|GAP 440B|
MFM sector layout.
Gap 5 is written until the chip interrupts out at the index pulse. The sector-length field is $02 for 512 bytes. Both DrCoolZic's table and the Acorn reference's 'recommended format' column print $01 here (the 256-byte code) - apparently inherited from an earlier 256-byte version of this table and never updated in either. Use the sector length table below, which every source agrees on. FM single density, 128 bytes/sector, 10 sectors: Count Value Field ------------------------------------------------ 40 $FF (or $00) Gap 1 6 $00 Gap 2 1 $FE ID address mark 1 track number ID record 1 side number ID record 1 sector number ID record 1 $00 sector length (128) 1 $F7 writes 2 CRC bytes 11 $FF (or $00) Gap 3 6 $00 Gap 3 1 $FB data address mark 128 data data record 1 $F7 writes 2 CRC bytes 10 $FF (or $00) Gap 4 ~369 $FF (or $00) Gap 5 ---------- Minimum gap sizes for non-standard formats ----- Gap FM MFM -------------------------------------------------------------------- Gap 1 16 x $FF 32 x $4E Gap 2 6 x $00 (exact) 12 x $00 (exact) + 3 x $A1 (exact) Gap 3 10 x $FF, 4 x $00 (min) 24 x $4E, 8 x $00 (min) + 3 x $A1 Gap 4 27 x $FF 38 x $4E Constraints on any custom format: sector size must be 128, 256, 512 or 1024 bytes; Gap 2 cannot be varied at all; 3 bytes of $A1 are mandatory in MFM. The Index Address Mark is not required for WD1772 operation. Gaps 1, 3 and 4 can technically go as short as 2 bytes for the chip's own purposes, but PLL lock-up time, motor speed variation and write-splice area all demand more in practice. -------------------- Sector length field -------------------- Value Bytes -------------- $00 128 $01 256 $02 512 $03 1024 ===========#==#=======#=======================================================================#===== ----------------------|12. CRC |----- ===========#==#=======#=======================================================================#===== Polynomial: G(x) = x^16 + x^12 + x^5 + 1. The CRC register is preset to all ones before data is shifted through it, and covers everything from the address mark up to (not including) the CRC bytes themselves. ===========#==#=======#=======================================================================#===== ----------------------|13. Byte timing |----- ===========#==#=======#=======================================================================#===== A byte is assembled every 32us (8 bits at 4us each) in MFM, so a 16-byte DMA FIFO burst on the Atari happens roughly every 512us. Useful when measuring or reverse-engineering copy-protection schemes that manipulate bit width. ===========#==#=======#=======================================================================#===== ----------------------|14. Interrupts |----- ===========#==#=======#=======================================================================#===== INTRQ is generated at the completion of every command, reset by reading the Status Register or writing the Command Register. Also generated on a Force Interrupt condition (section 4). Reading (or writing) the Data Register automatically clears both the DRQ status bit and the DRQ line. When using INTRQ, do not also poll Busy - reading the Status Register to check Busy also resets INTRQ, which can miss a pending interrupt. ===========#==#=======#=======================================================================#===== ----------------------|15. Atari ST integration |----- ===========#==#=======#=======================================================================#===== The WD1772 is not memory-mapped on the Atari ST. A1 and A0 on the chip are driven by the DMA controller, not the 68000 address bus, and every access goes through it.
68000host CPUDMA$FF8604 / $FF8606WD1772FDCDRIVE5.25" / 3.5"68000 busA1/A0, DALWD1772 pinsThe FDC is not in the 68000 address space directly - the DMA controller mediates every access (section 15)
Signal path from the 68000 to the drive on the Atari ST.
-------------------- DMA access sequence -------------------- 1. Write a mode value to the DMA mode register at $FF8606 to select which FDC register (or the DMA sector counter) the data port will reach. 2. Read or write the data port at $FF8604. FDC register DMA read DMA write ----------------------------------------- Command(W)/Status(R) $0080 $0180 Track Register $0082 $0182 Sector Register $0084 $0184 Data Register $0086 $0186 DMA sector count (W) $0090 $0190 Only the low 8 bits of the $FF8604 word are used; the upper byte is ignored on write, reads back all ones. DMA status ($FF8606 on read) bit 0 is active-low: 1 = no error, 0 = error. This is the single most miscopied bit in Atari documentation. EmuTOS's own DMA_OK define is 0x0001, confirming this polarity; Atari's own TOS floppy driver relies on the same reading. DMA FIFOs move data only in 16-byte bursts. A single Read Address command only transfers 6 bytes total, less than one burst - it does not reach memory via DMA at all. --------------- PSG port A (drive/side select) --------------- Bit 0 Side select: 1 = side 0, 0 = side 1 Bit 1 Drive 0 select, active low Bit 2 Drive 1 select, active low Bits 3-7 Other functions - PRESERVE these, do not clobber ------------------------- MFP interrupt ------------------------- FDC/HDC interrupt arrives on MFP GPIP bit 5. Bit 5 LOW ($FFFA01 masked with $20 giving zero) means the FDC has raised an interrupt. ---------- Standing Atari-specific command constraints ---------- On the ST, MO is wired straight to the drive with no separate handshake to skip, so: h must always be 0; e should be 0 (no extra settling delay); p should be 0 (write precompensation enabled), always; step rate normally 3ms (r1,r0=1,1). ===========#==#=======#=======================================================================#===== ----------------------|16. Real-world 16 MHz operation and chip variants |----- ===========#==#=======#=======================================================================#===== None of the three source datasheets say anything about running the WD1772 at 16 MHz - 8 MHz is the datasheet clock throughout. But 16 MHz operation is common in practice (it is how HD/1.44MB support is added to the ST family), so this section collects what is actually known, keeping official documentation and community belief separate. -------- AJAX is real and documented. A 500 kbit/s WD1772 variant is not. -- AJAX is confirmed in an official Atari document, cited directly in EmuTOS source (bios/machine.c), which quotes the 'ATARI FALCON030 Service Guide', dated 1 October 1992: DIP switch bit 6 off means 'AJAX FDC chip installed (support for 1.44MB floppy)'. EmuTOS sets its _FDC cookie accordingly (see [[The Cookie Jar]]). AJAX was Atari's own HD/ED-capable FDC redesign, manufactured by Toshiba (part number C302096) after Western Digital could not sustain production of a suitable part. By contrast, the claim that a specific WD part number ('WD1772PH02-02') officially supported 500 kbit/s high-density operation appears to be unsourced. It is on Wikipedia's 'Western Digital FD1771' article and every mirror of it, but Wikipedia's own article marks this exact sentence [citation needed] - the only uncited claim in that whole list of chip variants. Neither Western Digital's original datasheet nor DrCoolZic's edition mentions a 'PH02-02' designation, a 500 kbit/s mode, or any HD capability at all. Treat it as unverified community lore until a primary source turns up. -------- Sustained 16 MHz operation is not reliable on any standard part -- This is drawn from direct commercial testing of WD1772/VL1772 chips by exxos over 2016-2026, corroborated independently by a second person's hardware failure and a third community member's stated understanding. None of this is official manufacturer guidance - it is the best evidence available, since the datasheets do not address 16 MHz operation at all. The '-0202' date/batch code does not reliably indicate 16 MHz capability. The commonly repeated claim that all -0202 chips can do 16MHz was directly tested and found false: a -0202-equipped Mega STE wrote a bit more than a full 1.44MB disk before failing, needing to cool down before another attempt worked; a substitute VL1772 chip showed the identical symptom, ruling out a one-off bad chip. Full account, from the person who found this: exx osforum.co.uk - 'WD1772-0202 - overheats at 16MHz' Part Sustained 16MHz Notes -------------------------------------------------------------------------- VL1772 ~0.5 h Runs hotter than WD; pot luck if 16MHz at all WD1772 (any date code) commonly a few h; some fail almost immediately unpredictable, no part-number guarantee AJAX designed for continuous officially documented - see above
APPROXIMATE SUSTAINED 16 MHz TOLERANCE (empirical, not a spec)0h1h2h3h4h5h6hVL1772~0.5 hWD17721-3 h+ (unpredictable)AJAXdesigned for continuous
Approximate sustained 16 MHz tolerance by part - empirical, not a manufacturer rating.
exxos's own site documents this finding, revised as testing accumulated over ten years - current text, with the update history, at The LaST Upgrade - ATARI 1.44 floppy mod. Current position, stated plainly there: no ordinary WD1772 or VL1772, regardless of date code, should be assumed safe for continuous 16 MHz operation. Any can typically run 16 MHz for short bursts (several consecutive HD formats observed); most eventually overheat if left at 16 MHz continuously. ---------- Why this usually isn't a problem in practice ---------- The fix is architectural, not chip selection: only run the clock at 16 MHz while actually accessing the drive, dropping back to 8 MHz the rest of the time. exxos's own HD upgrade kits (HD4 through HD7, 1990s onward, see [[The LaST Upgrade]]) work this way - almost zero 1772s have been found to fail in 16MHz mode under this design, even after consecutively formatting several 1.44 floppies, with any WD or VL part fitted. This is a real contrast with Atari's own factory HD implementation. Independent research into the Mega STE and TT found they do not switch density per-access either - TOS sets the FDC clock via a PAL-driven register reactively, on error and retry, rather than switching back after every single transaction, which is consistent with the factory-chip failure account above. Write-up: troed.se - 'The tale of high density Atari mystery' Practical recommendation: design or choose an HD interface that drops the FDC clock to 8 MHz whenever the drive is not actively being accessed. Under that discipline, any standard WD1772 or VL1772 has been found reliable regardless of date code. Only a design that holds the chip at 16 MHz for extended continuous periods needs a chip genuinely rated for that duty cycle - in practice, AJAX. ===========#==#=======#=======================================================================#===== ----------------------|Corrections applied |----- ===========#==#=======#=======================================================================#===== Full detail and evidence for each of these is inline above; this is the index. # Item Wrong in Right per ---------------------------------------------------------------------------- 1 Read Track opcode DrCoolZic (1101) WD orig./Acorn/EmuTOS: 1110 2 p flag wording DrCoolZic ('Unable') WD orig./Acorn: 'Enable' 3 WD1772 step rates WD original (2/3/5/6ms) DrCoolZic/Acorn/EmuTOS/Hatari 4 Settling delay WD original (30ms) DrCoolZic(15ms)/Acorn/Hatari 5 Type II revolutions WD original ('four') DrCoolZic/Acorn: five 6 S5 alt. DAM byte DrCoolZic ($FC) Hatari ($FA) + DrCoolZic's own table 7 512B sector length DrCoolZic/Acorn ($01) sector length table: $02 8 Motor-off idle ambiguous (9 rev/10 pulse) 10 pulses, unit-consistent 9 'PH02-02 = 500kbit HD' Wikipedia (uncited) no datasheet documents this; AJAX is real Two of the three source documents contain genuine errors on points where the third gets it right. Western Digital's own preliminary datasheet is not a safe fallback authority - it is stamped PRELIMINARY and is wrong about the WD1772-specific step rate table and settling time, both significant enough to break real code if trusted blindly. Always check a disputed figure against EmuTOS or Hatari before relying on any one printed source. A PDF version of this page, with the same diagrams, is available for offline reference. See [[Reference documents and datasheets]].



Back to Reference documents and datasheets · Memory Map for Atari ST,STE,TT and Falcon