Hi guys,
Here's something for you lot to play with. It's a software
implementation of the "Phase Jerked Loop" data separator, in C++
(although most of the logic is C), complete with notes...
This is extremely sub-optimal, but "It Works For Me"... :)
Tests against the old "Helix" decoder engine (the "smart" histogram
analyser that really is anything but) are still ongoing. As a bare
minimum, the timing figures need to be optimised -- most timesteps will
end up with no accompanying state change. If you can eliminate some of
these timesteps, you can speed up the code quite a bit. The catch is
that the timestep must be a multiple of NSECS_PER_PLLCK/2,
NSECS_PER_PLLCK and NSECS_PER_ACQ... The optimal value should be
lcm(NSECS_PER_PLLCK/2, NSECS_PER_ACQ) [lcm = lowest common multiple].
Optimising the timing factors for a given acq-clock is likely to be the
hardest part of the whole process...
I'm willing to bet it'll work with data grabbed from a Catweasel, but I
don't have any test data to play with... so that's left as an exercise
to the reader.
mfmbits is a vector<bool> which starts out empty and contains the output
MFM bits after the loop has run. A sync marker will appear in mfmbits as
0x4489.
buf is either an array or a vector containing integers of any sane size.
These represent the timing values in units of Tacq (Tacq = 1/Facq, the
frequency at which the acquisition counter is incremented). buflen is
the length of this buffer.
License is GPLv2, code is copyrighted to me. If you want to use this in
closed-source software, email me and ask for a less restrictive licence.
I'm getting pretty pissed off with people in the floppy disc
preservation/analysis field keeping their toys to themselves (*cough*
SPS), and have no intention of contributing further to such nonsense.
> /**
> * This is a software implementation of Jim Thompson's Phase-Jerked Loop
> * design, available from AnalogInnovations.com as the PDF file
> * "FloppyDataExtractor.pdf".
> *
> * This consists of:
> * A data synchroniser which forces RD_DATA to be active for 2 clock cycles.
> * A counter which increments constantly while the PLL is running, and is
> * reset to zero on an incoming data bit.
> * Whenever the counter reaches half of its maximum value, a
> * new data window is started.
> */
>
> // Nanoseconds counters. Increment once per loop or "virtual" nanosecond
> unsigned long nsecs1 = 0, nsecs2=0;
> // Number of nanoseconds per acq tick -- (1/freq)*1e9. This is valid for 40MHz.
> const unsigned long NSECS_PER_ACQ = 25;
> // Number of nanoseconds per PLLCK tick -- (1/16e6)*1e9. 16MHz.
> // This should be the reciprocal of 32 times the data rate in kbps, multiplied
> // by 1e9 to get the time in nanoseconds.
> const unsigned long NSECS_PER_PLLCK = 125/2;
> // Number of clock increments per loop (timing granularity)
> const unsigned long TIMER_INCREMENT = 1;
> // Maximum value of the PJL counter. Determines the granularity of phase changes.
> const unsigned char PJL_COUNTER_MAX = 16;
>
> // Iterator for data buffer
> size_t i = 0;
>
> // True if RD_DATA was high in this clock cycle
> bool rd_latch = false;
> // Same but only active for 2Tcy (SHAPED_DATA)
> int shaped_data = 0;
>
> // Phase Jerked Loop counter
> unsigned char pjl_shifter = 0;
>
> // data window
> unsigned char data_window = 0;
>
> #ifdef VCD
> FILE *vcd = fopen("values.vcd", "wt");
> fprintf(vcd, "$version DiscFerret Analyser D2/DPLL 0.1 $end\n"
> "$timescale 1 ns $end\n"
> "$var reg 1 * clock $end\n"
> "$var reg 1 ' pll_clock $end\n"
> "$var reg 1 ! rd_data $end\n"
> "$var reg 1 %% rd_data_latched $end\n"
> "$var reg 1 ^ shaped_data $end\n"
> "$var reg 8 & pjl_shifter $end\n"
> "$var reg 1 ( data_window $end\n"
> "$upscope $end\n"
> "$enddefinitions $end\n"
> "$dumpall\n"
> "0*\n"
> "0'\n"
> "0!\n"
> "0%%\n"
> "0^\n"
> "b00000000 &\n"
> "0(\n"
> "$end\n"
> );
> #endif
> do {
> // Increment counters
> nsecs1 += TIMER_INCREMENT;
> nsecs2 += TIMER_INCREMENT;
>
> // Loop 1 -- floppy disc read channel
> if (nsecs1 >= (buf[i] * NSECS_PER_ACQ)) {
> // Flux transition. Set the read latches.
> rd_latch = true;
> shaped_data = 2;
>
> // Update nanoseconds counter for read channel, retain error factor
> nsecs1 -= (buf[i] * NSECS_PER_ACQ);
>
> // Update buffer position
> i++;
> }
>
> // Loop 2 -- DPLL channel
> if (nsecs2 >= NSECS_PER_PLLCK) {
> // Update nanoseconds counter for PLL, retain error factor
> nsecs2 -= NSECS_PER_PLLCK;
>
> // PJL loop
> if (shaped_data > 0) {
> pjl_shifter = 0;
> } else {
> // increment shifter
> pjl_shifter = (pjl_shifter + 1) % PJL_COUNTER_MAX;
> }
>
> // DWIN detect
> if (pjl_shifter == (PJL_COUNTER_MAX / 2)) {
> // Data window toggle. Latch the current RD_LATCH blob into the output buffer.
> mfmbits.push_back(rd_latch);
> // Clear the data latch ready for the next data window.
> rd_latch = false;
> // Update DWIN
> data_window ^= 0x01;
> }
>
> // Update shaped-data time counter
> if (shaped_data > 0) shaped_data--;
> }
> } while (i < buflen);
>
> printf("mfmbits count = %lu\n", mfmbits.size());
--
Phil.
classiccmp at philpem.me.uk
http://www.philpem.me.uk/
The condition is unknown (other than not cracked and not rusty,) the
box looks original, the RAM slots are empty, the ROM chips are labeled
Boot 0 - Boot3, the zip code is 60074.
Anyone want it?
--
silent700.blogspot.com
Retrocomputing and collecting in the Chicago area:
http://chiclassiccomp.org
Hi Everyone,
A classic computer of the 8-bit era, the Coleco ADAM, is celebrated by
all Adamites of Canada and the U.S.A., each year is winding up in Montreal,
our 22 annual convention. The central part in my opinion is how to run an
ADAM emulator on the PC. For those who still have a working ADAM, more power
to you all.
Happy classic computing!
Murray :)
I referred someone to this mailing list, but he's unable to join. The
server says that he needs to wait to be approved, but nothing happens.
--
David Griffith
dgriffi at cs.csubak.edu
A: Because it fouls the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing in e-mail?
I've been talking to someone who posted an amiga 1200 on craigs list.
This is in the chicago area. She has a lot of AV and test equipment
also. I have no relation to her, I'm just passing the list along
incase anyone is interested. I'm also pasting in a description of the
amiga from another thread. Contact her directly (Amy) for pics and
details: smittygal7 at hotmail.com
The seller replied with some pictures. It's a normal amiga 1200 with
a GVP (jaws) 68EC030-40 accelerator without a scsi controller.
Unknown ram. It's the model that didn't come with a hard drive,
although one has almost certainly been added. There's a vga adapter
on the back of the 1200, but it appears that it's not a flicker fixer.
They probably had it attached to a monitor that would sync low
enough. She's including a 1084s monitor with the machine. The tower
has two time base corrector boards installed in what looks like an
8086 type clone motherboard. I'm guessing this because it has the fat
5150 style keyboard connector. Chances are, this motherboard is there
only to make the power supply spin up and to provide ISA slots to
power the TBC boards. I was hoping it was some sort of expansion
chassis that could add zorro or video slots to a 1200, but no dice.
1. Datacom Technologies ET-2 V.35 Error Rate Test Set, brand new wtih
manual, case, power pack, etc...
2. Used, Black Box SAM 232-60
3. Plantronics Wilcom Model T336B Circuit Test Set
4. ADK A Joslyn Company 720- TEST Adam-720 test set
1. SHARP XG-E1200U LCD Projector BRAND NEW in BOX w/REMOTE
2. Yamaha RX 595 Natural Sound 2ch stereo Reciever
3. Astrodesign Inc. Digital Video Generator VG-814 GREAT CONDITION,
LIKE BRAND NEW
4. Plantronics Wilcom Digital Circuit Test Set M#:T336B
5. TOA-9000 Power Amp/Mixer/Matrix BRAND NEW IN BOX
6. SONY STR-GX800ES HI-FI FM/AM STEREO RECEIVER BRAND NEW
7. Pioneer VSX-3300 2-channel MONSTER Audio/video Receiver/Used in
great condition
8. Technics Stereo RS-TR232 Double Cassette GREAT USED
9. Panasonic AG-1960 Pro-line Video Cassette Recorder
10. Onkyo TA-R401 Vintage Stereo Cassette Tape Deck RI
11. Realistic STA-116 Digital Synthesized AM/FM Stereo Reciever
12. Panasonic PV-S7670 BRAND NEW IN BOX SUPER VHS-VCR
13. Panasonic Omnivision Video Cassette Recorder PV-4464 Brand new in box
14. SENCORE CR70 UNIVERSAL CRT ANALYZER AND RESTORER
15. Panasonic Professional Video Cassette Player AG-5100-P new in box
16. Denon Audio CD/Cassette Combi-deck- BRAND NEW IN BOX
17. Tenma Monitor Tester 16 Scan Formats 72-1070 brand new
18. Tenma Dummy Loader 72-4060
"Zane H. Healy" <healyzh at aracnet.com> wrote:
> Now for an interesting bit of info. Apparently there are two
> different types of Firmware. One for the PDP-11, and one for VAXen.
> I'll see if I can get a little bit more info on that.
Huh? That sounds extremely weird, and until you find very good proof of
that, I would say that it is false. In the end, it's a Qbus device, and
talks Qbus just like anything else. It's also an MSCP controller, which
means it talks MSCP, just like any other MSCP controller. And they work
the same no matter if they are controlled by a VAX CPU or a PDP-11 CPU.
> Now for the important part, the whole manual.
> http://www.avanthar.com/~healyzh/RQZX1.pdf
Excellent! Thanks for putting this up there.
> Looking through the list of supported hardware I see where this is a
> board that is of use to very few Hobbyists. It is interesting that
> the older versions of the OS's can't support it, when they support
> something like a Viking QDT just fine.
It is worth pointing out that support OS versions is just a list of the
versions that was current when the manual was written. That does not
mean that the board don't work in previous versions.
The RQZX1 is an MSCP/TMSCP controller, and thus will work with any OS
version where the MSCP/TMSCP driver exist, and work. So, it's no
different than the QDT, or any other MSCP controller.
More or less the same is also true for disk drives. Most any SCSI drive
will work fine. The same is probably also true for tape drives.
Pros with the RQZX1:
It's easy to set up. Switchpacks are easy and obvious. You can boot into
the internal diagnostics. You have the option of 2*MSCP or MSCP+TMSCP.
You have a floppy interface in there as well.
Cons with the RQZX1:
It's a quad board. No more than 4 disks on one controller. No more than
one tape on a controller (it is rather inflexible).
Still, if you have one, it's a nice board to have around.
Johnny
On Thu, Jun 17, 2010 at 9:59 AM, Zane H. Healy <healyzh at aracnet.com> wrote:
> Okay, here is what I learned. ?My comments are in parentheses.
This is great! thanks for taking the time to chase this down.
> 1. When writing an image out to the HD, you must have the exact same number
> of blocks for the image and the HD. ?(This is why I'd suggested dd'ing the
> HD to an image, using that image with SIMH to do the install, and then
> dd'ing it back.)
Ok, this is easy to test, I will report back with the results.
> 4. RSTS/E might only support up to a 2GB drive (I use a 2GB drive).
I will be using 1GB (or thereabouts) drive.