In an ongoing effort to improve transparency, documentation, and to generally make disk drive maintenance more accessible I have released an update to my FDS Calibration resource on TinkerDifferent (https://tinkerdifferent.com/resources/famicom-fds-drive-calibration-wip.52/updates).
This motor calibration guide is intended to be part of a larger document which separates tuning and calibration into individual categories (motor speed, head alignment, possibly a few odds and ends).
Please feel free to share your feedback!
Continuing this effort, I have documented a simplified method for ensuring adequate head alignment (TinkerDifferent (https://tinkerdifferent.com/resources/famicom-fds-drive-calibration-wip.52/updates)).
This is excellent work. The jig is a great idea considering the precision involved. I'd love one for myself, but it will probably cost a bit too much for me to import it over here :(
Quote from: rawrest on October 14, 2022, 08:31:07 pmI'd love one for myself, but it will probably cost a bit too much for me to import it over here :(
I can ship them unbent as letter mail, so you may be pleasantly surprised :D
Hm, well, let us know once they're listed ;)
The alignment jig is up on eBay (https://www.ebay.com/itm/234736084879) for anyone interested. Free worldwide letter mail shipping.
Say, I saw you mention that an FDSStick could be used to check the calibration as well.
How would one go about doing that?
Loopy has a version of the FDSStick firmware / software which can be used to measure standard deviation of the FDS Drive signal. I _believe_ it's specifically measuring an error rate in the file headers and gaps but I'm really only making a beginners guess.
That software is available here (https://forums.nesdev.org/viewtopic.php?p=213714#p213714) but bear in mind that it seems you can go as far as tuning the head alignment off by a track and still get good scores in this test utility.
That being said, I would strongly recommend using this version of the FDSStick software if you want to finely tune a drive for writing disks. You will need quality original Nintendo disks to first calibrate your drive with. It can be a time consuming process.
Ah, yeah, I did try using that before, but it just seemed way too inconsistent to really rely upon.
I have an official Nintendo disk that gives me a score of ~σ0.85;
(https://cdn.discordapp.com/attachments/747153800988590212/1027318536357560362/unknown.png)
...Which is supposedly good, but then a disk written by the same drive, or other official disks can go up to ~σ 2.0. Not really sure what to make of that.
Quote from: Skawo on October 19, 2022, 12:15:13 am...Which is supposedly good, but then a disk written by the same drive, or other official disks can go up to ~σ 2.0. Not really sure what to make of that.
You will see improved consistency by reducing your motor speed. It's currently way too high.
The +3.0% on the motor? That's not consistent either, even if you read the same disk twice :/
But I was planning to adjust that eventually, yeah.
What sort of results do your well-calibrated drives get? Could you screenshot a couple?
Quote from: Skawo on October 19, 2022, 01:04:25 pmThe +3.0% on the motor? That's not consistent either, even if you read the same disk twice :/
But I was planning to adjust that eventually, yeah.
If you're getting inconsistent motor speed readings from the same disk then your belt is rubbing.
Quote from: Skawo on October 19, 2022, 01:04:25 pmWhat sort of results do your well-calibrated drives get? Could you screenshot a couple?
Varies by disk. Some are σ0.9 - σ1.0+ but for good quality low-wear disks unmodified (e.g., not disk kiosk) I typically expect below σ0.9. I have seen below σ0.1 on disks which were written by the same drive but that's not always the case and often varies on the same disk (no clue why). Calibrating for 0.4+/- on a single disk enters the danger zone of over-calibrating for a single disk.
The challenge with "perfect" calibration is getting the best score across several good quality disks and this is why it's time consuming. I feel comfortable assuming that there were reasonably noticeable differences in the precision of Nintendo's disk writing setup (non-kiosk such as factory, but also kiosk).
My best guess is that Nintendo's calibration goal was
probably to be within a subset of the 10% margin of error, such as 2-3% based on the small variations I see across good quality disks. We have to remember that at this level of calibration a fraction of a millimeter will impact the read quality from one drive to the next.
I'm currently in the process of moving my work station but the next time I have a drive setup with my FDSStick I will share screenshots.
Got my jig today. Turns out that I adjusted all the drives manually pretty much exactly right, but it's nice to know.
Two of them seem to work about right, showing σ0.8 - σ1.2 for the original disks, and about σ1.1 for ones written by themselves.
The third doesn't, though - it stubbornly shows σ1.5 for originals, σ1.1 for ones written by the other two drives and σ1.5 for disks written with itself. Turning the alignment screw in each direction just makes it worse, so I guess that's as good as it's getting.
It does read all the disks I have, including the ones written by the other drives, and if I write a disk with it, it works on the other ones too, so maybe it's just best to leave it alone ;)
Oh, and, you have nice handwriting, by the way
Quote from: Skawo on October 26, 2022, 03:25:43 amThe third doesn't, though - it stubbornly shows σ1.5 for originals, σ1.1 for ones written by the other two drives and σ1.5 for disks written with itself. Turning the alignment screw in each direction just makes it worse, so I guess that's as good as it's getting.
Yes, I have two drives in my "parts" pile which, no matter my best efforts, refuse to read at a high quality. I even tried swapping out for a more modern amplifier on the read signal but it made no improvements.
Quote from: Skawo on October 26, 2022, 03:25:43 amIt does read all the disks I have, including the ones written by the other drives, and if I write a disk with it, it works on the other ones too, so maybe it's just best to leave it alone ;)
Yes, the famicom's signal amplification seems to be pretty generous, even for lower quality signal strength. To be fair (at least as much as I'm aware), no one but loopy knows precisely what this standard deviation represents. Perhaps we're superstitious pigeons (https://psycnet.apa.org/record/1948-04299-001) in a loopy experiment.
Quote from: loopy on June 13, 2016, 05:37:48 pmHmm... not sure, I'll check them out.
Can you provide a more technical explanation of the standard deviation shown in your debug_20171229 variant of FDSStick?
Well, I did some reverse-engineering to find out.
To calculate σ, as far as I can tell:
First, it creates an array (x) of 0x400 zeroes.
Next, it goes through all the bytes of... something. Each byte of the it is used as an index into 32-bit int array x. The value at said index is incremented by 1.
Once that's done, it runs a function, which I'll call f, on three addresses. This function takes two parameters: a memory address and a number of iterations.
The function calculates two things: Treating the memory at the given address as an array of 32 bit integers, it sums all the values up, and also sums those values multipled by their index in the array.
Then, it returns a floating-point result of division of the latter by the former. If former is 0, it just returns the latter.
The passed addresses are 0xBC, 0x134, 0x1B0 into the array x.
It passes 30, 31 and 31 as the number of iterations, respectively.
Next, it adds 47, 77 and 108 to each of the results.
It then adds further 0.5 to each value and makes an integer out of them (i.e floors them).
Let's call the resulting values a, b, c.
Then it performs the following operations, resulting in three tuples (t) of values:
a - ((b - a) / 2)
and
(a + b) / 2 - (a - ((b - a) / 2))
(a + b) / 2
and
(b + c) / 2 - (a + b) / 2
(b + c) / 2
and
c + ((c - b) / 2) - ((b + c) / 2)
Next, a function g) is called three times. It takes two parameters just like function f: The first parameter is a memory address, the second is used as the number of iterations.
The first parameter is the address of array x indexed with t(0). Second parameter is t(1).
Function g calculates two values: Treating the memory at the given address as an array of 32 bit integers, it sums all the values up, and also sums the results of the following equation:
(d - i) * ((d - i) * e)
Where d is a result of function f ran using the same parameters as passed to function g, i is the iteration number and e is the 32-bit value found at the passed address, at the current index.
The second value is divided by the first. If the first value ends up being 0, then the second value is returned as-is.
As a result, we get three new values. These are added together and the result divided by 3.
This is what gets printed as σ with a 3-digit precision.
tldr; I don't know what is being measured at all :)
Quote from: Skawo on October 29, 2022, 11:32:30 amWell, I did some reverse-engineering to find out. [...] tldr; I don't know what is being measured at all :)
Awesome work reversing the equations! I also do not understand. :-\