So, previously I managed to extract some data from a floppy disk using a floppy drive and an oscilloscope. Could I make head or tail of it? Turns out I could. I saved the waveform as a CSV and got to work on it. My initial pass looked promising, but only covered a fraction of a single sector. I tweaked the software, recorded another waveform (with a lower frequency of samples, allowing me to record more sectors), and it looks like it's doing the job!
I guess the first thing is "How do you find out about the raw encoding for a floppy disk?". While the Internet Knows Everything, it's actually relatively thin on the ground as far as this kind of documentation for out-moded technology goes. I used a combination of this book and this page. I would just like to say, MFM is a really neat idea.
The code and the waveforms are up on github. It really does appear to work! If I hexdump the first sector, I get this:
00000000 eb 3c 90 29 37 66 32 64 49 48 43 00 02 01 01 00 |.<.)7f2dIHC.....| 00000010 02 e0 00 40 0b f0 09 00 12 00 02 00 00 00 00 00 |...@............| 00000020 00 00 00 00 00 00 29 21 9f 7a 26 20 20 20 20 20 |......)!.z& | 00000030 20 20 20 20 20 20 46 41 54 31 32 20 20 20 fa 33 | FAT12 .3| 00000040 c9 8e d1 bc fc 7b 16 07 bd 78 00 c5 76 00 1e 56 |.....{...x..v..V| 00000050 16 55 bf 22 05 89 7e 00 89 4e 02 b1 0b fc f3 a4 |.U."..~..N......| 00000060 06 1f bd 00 7c c6 45 fe 0f 8b 46 18 88 45 f9 38 |....|.E...F..E.8| 00000070 4e 24 7d 22 8b c1 99 e8 77 01 72 1a 83 eb 3a 66 |N$}"....w.r...:f| 00000080 a1 1c 7c 66 3b 07 8a 57 fc 75 06 80 ca 02 88 56 |..|f;..W.u.....V| 00000090 02 80 c3 10 73 ed 33 c9 8a 46 10 98 f7 66 16 03 |....s.3..F...f..| 000000a0 46 1c 13 56 1e 03 46 0e 13 d1 8b 76 11 60 89 46 |F..V..F....v.`.F| 000000b0 fc 89 56 fe b8 20 00 f7 e6 8b 5e 0b 03 c3 48 f7 |..V.. ....^...H.| 000000c0 f3 01 46 fc 11 4e fe 61 bf 00 07 e8 23 01 72 39 |..F..N.a....#.r9| 000000d0 38 2d 74 17 60 b1 0b be d8 7d f3 a6 61 74 39 4e |8-t.`....}..at9N| 000000e0 74 09 83 c7 20 3b fb 72 e7 eb dd be 7f 7d ac 98 |t... ;.r.....}..| 000000f0 03 f0 ac 84 c0 74 17 3c ff 74 09 b4 0e bb 07 00 |.....t.<.t......| 00000100 cd 10 eb ee be 82 7d eb e5 be 80 7d eb e0 98 cd |......}....}....| 00000110 16 5e 1f 66 8f 04 cd 19 be 81 7d 8b 7d 1a 8d 45 |.^.f......}.}..E| 00000120 fe 8a 4e 0d f7 e1 03 46 fc 13 56 fe b1 04 e8 c1 |..N....F..V.....| 00000130 00 72 d6 ea 00 02 70 00 b4 42 eb 2d 60 66 6a 00 |.r....p..B.-`fj.| 00000140 52 50 06 53 6a 01 6a 10 8b f4 74 ec 91 92 33 d2 |RP.Sj.j...t...3.| 00000150 f7 76 18 91 f7 76 18 42 87 ca f7 76 1a 8a f2 8a |.v...v.B...v....| 00000160 e8 c0 cc 02 0a cc b8 01 02 8a 56 24 cd 13 8d 64 |..........V$...d| 00000170 10 61 72 0a 40 75 01 42 03 5e 0b 49 75 77 c3 03 |.ar.@u.B.^.Iuw..| 00000180 18 01 27 0d 0a 49 6e 76 61 6c 69 64 20 73 79 73 |..'..Invalid sys| 00000190 74 65 6d 20 64 69 73 6b ff 0d 0a 44 69 73 6b 20 |tem disk...Disk | 000001a0 49 2f 4f 20 65 72 72 6f 72 ff 0d 0a 52 65 70 6c |I/O error...Repl| 000001b0 61 63 65 20 74 68 65 20 64 69 73 6b 2c 20 61 6e |ace the disk, an| 000001c0 64 20 74 68 65 6e 20 70 72 65 73 73 20 61 6e 79 |d then press any| 000001d0 20 6b 65 79 0d 0a 00 00 49 4f 20 20 20 20 20 20 | key....IO | 000001e0 53 59 53 4d 53 44 4f 53 20 20 20 53 59 53 7f 01 |SYSMSDOS SYS..| 000001f0 00 41 bb 00 07 80 7e 02 0e e9 40 ff 00 00 55 aa |.A....~...@...U.| 00000200
It's got the assembly jump at the start over the OEM ID and BIOS Parameter Block, the 0x55 0xAA at the end of the sector, and a bunch of assembly in the middle and various strings. Bingo!
Posted 2016-04-27.