M6: the Liron's first packet reaches my board

/ UniDisk 3.5 controller / updated 2026-10-12 unidisk smartport liron m6 level-shifting oscilloscope

The host side of my board is back on the Apple, and it’s safe this time. The Liron card’s reset pulse and its first SmartPort command packet show up on the Pico’s inputs, and the packet decodes on the scope: sync, then C3 for packet begin. There’s no SmartPort firmware yet, so the IIe still says no device connected.

The breakouts have the rails on their own row

The homemade DB-19 adapter that put -12 V on /WRREQ is gone. I got two KingPow IDC20P-B boards, 2x10 IDC to screw terminals with a DIN rail mount. One is J1 for the host side. The other goes on the mechanism side, because my CN104 tap had the same problems.

My DB-19 to IDC20 cable is wired like the cable inside a UniDisk. DB-19 pin n goes to flat pin 2n-1 for pins 1 to 9, pins 11 to 19 go to the even side, and ACK (DB-19 pin 10) goes to flat pin 20. Flat 19 has no wire. I had ACK on 19 in my notes from the old adapter and caught it before wiring.

That interleave puts GND and every Apple rail on the odd row of terminals and the signals on the even row. The -12 V is on J1.9 and /WRREQ is on J1.10, a whole terminal row apart. My board runs off the bench supply, so the rail terminals stay empty.

J1DB-19SignalShifter
1, 3, 5, 71-4GND-
2, 4, 6, 811-14PH0-PH3U1 B1-B4
95-12Vempty
1015/WRREQU1 B5
116+5Vempty
13, 157, 8+12Vempty
1417/HSTENU1 B6
1618RDU3 B1
1819WRU1 B7
19-no wire-
2010ACKU3 B2
J1, the host-side IDC breakout. GND on 1, 3, 5 and 7; the Apple rails on 9, 11, 13 and 15 stay empty; ACK on 20.
J1, the host-side IDC breakout. GND on 1, 3, 5 and 7; the Apple rails on 9, 11, 13 and 15 stay empty; ACK on 20.

Before any power I beeped every signal from the DB-19 pin to its shifter pin, then every Apple rail against every other pin, the bench +5 and the 3.3 V rail. Everything that should connect beeped and nothing else did.

The bench supply can’t read small currents

On the first power-up the bench +5 went into current limit at 10 mA and sat at 1.43 V. The mechanism was still hanging off the bench +5 through the old CN104 tap, and its logic draws tens of mA on +5 alone. I unplugged it.

With the mechanism off, the supply still showed 30 mA. A DMM in series with each shifter’s VCCB read 0.04 mA per board, so the supply’s readout is just off at that end. Its 0.01 A limit also kicks in well under 10 mA. For anything this small I use the DMM now, and 0.05 A is the lowest limit I trust.

First connect, Pico unplugged

With the Pico unplugged both shifters sit in Hi-Z, so this checks the rails and idle levels with nothing of mine driving. The current stayed at 0.04 mA when the IIe came on.

J1SignalMeasured
9-12V-12.16 V
11+5V4.73 V
13, 15+12V12.38 V
2, 4, 6, 8PH0-PH3about 40 mV, moving
10/WRREQ5.15 V
14/HSTEN5.15 V
16RD4.67 V
18WR3.56 V
20ACK4.88 V

/WRREQ and /HSTEN read 5.15 V because the bench was set to 5.15 V and they have 10k pull-ups to it. I dropped the bench to 5.00 V. U3 drives RD and ACK at its VCCB, and that shouldn’t sit 0.4 V above the 4.73 V the Liron runs on.

Reading the host lines over SWD

Next the Pico went on with the M5 firmware, which holds U3’s /OE high so RD and ACK stay off the bus. I read the GPIO input register over SWD without halting. The first read had PH2 high and PH3 low while J1 showed the opposite. My jumpers were shifted by one at the Pico header. After fixing that the Pico matched J1.

Then I sampled the inputs for 25 s, about 4,000 reads a second, while I typed PR#5:

GP2-GP8ReadsWhat it is
0x1e899491idle, PH1 + PH3
0x1d4321PH0 + PH2, SmartPort reset
0x1c042all phases low
0x1ec1REQ (PH0) + PH1 + PH3
0x1ac1REQ with /WRREQ low, the host sending a packet

My pull-up holds ACK high, so the Liron thinks a device is ready and starts sending.

WR idled under the shifter’s threshold

WR measured 3.56 V idle on the meter, and the SN74LVC8T245 only guarantees a high above 0.7 x VCCB, 3.5 V at 5 V. So I put it on the scope during PR#5: /WRREQ, WR and PH0 (REQ), triggered on /WRREQ falling.

The rig during the WR captures: three scope probes on J1 for /WRREQ, WR and PH0, with the Liron cable coming into J1 at the back and the Pico 2 and shifter boards on the breadboard.
The rig during the WR captures: three scope probes on J1 for /WRREQ, WR and PH0, with the Liron cable coming into J1 at the back and the Pico 2 and shifter boards on the breadboard.
PR#5 with a 10k pull-down on WR. Yellow /WRREQ, magenta WR, cyan PH0 (REQ), 500 us/div. WR idles at 3.40 V and decays back there for about 1 ms after the packet.
PR#5 with a 10k pull-down on WR. Yellow /WRREQ, magenta WR, cyan PH0 (REQ), 500 us/div. WR idles at 3.40 V and decays back there for about 1 ms after the packet.

During the packet WR swings 0.04 V to 4.36 V, which is fine. Idle it sat at 3.40 V with about 0.25 V of noise, under the threshold. The cause was my own 10k pull-down on U1 B7. I swapped it for a 100k and idle came up to 3.96 V. Working back from the two idle levels, the Liron drives idle WR at about 4.0 V through about 1.9k, so 4.0 V is as high as it goes.

If you’re level-shifting a Liron card’s WR with an LVC8T245 at 5 V, keep the pull-down weak. The card idles WR at about 4.0 V through about 1.9k, and a 10k pull-down drags it to 3.4 V, under the 3.5 V input-high.

10k pull-down100k pull-down
WR idle3.40 V (3.16-3.64)3.96 V (3.72-4.28)
WR high in packet4.36 V4.84 V
/WRREQ low879 us

The packet

Zoomed in at 20 us/div, REQ comes up 7.7 us before /WRREQ drops, and the first WR edge is 3.95 us after that. The cells are 3.91 us, which is the IWM’s 7.16 MHz divided by 28. Taking each transition as a 1, the start decodes to:

FF 3F CF F3 FC FF   sync
C3                  packet begin
81                  destination ...
Start of the command packet with a 100k pull-down on WR, 20 us/div. REQ (cyan) comes up first, /WRREQ (yellow) drops, and the sync bytes start on WR (magenta).
Start of the command packet with a 100k pull-down on WR, 20 us/div. REQ (cyan) comes up first, /WRREQ (yellow) drops, and the sync bytes start on WR (magenta).

It looked very familiar from the Byte Hamr days. Those sync bytes are also the same self-sync pattern the drive writes as its track preamble, which my board already writes from M5.

The bench console log for both captures: scope setup, WR levels, packet timing and the first decoded bytes.
The bench console log for both captures: scope setup, WR levels, packet timing and the first decoded bytes.

Still open