Well, understanding what the tests are doing is exactly the ongoing trick of course
Its just a list of actions sent to the IC, and observations of the internal state change. Interpretations are always difficult.
Yes, there may be a bug like the Timer B bug - I would then also only expect those bugs in the so-called "old" 6526R4. But who knows. So far I have not seen this bug in my tests - but if it exists I will be able to find it. But if it is a bug similar to the timer B bug, it would present itself at any speed of operation of the serial port.
I would currently find it more likely you're facing an improperly reset internal shift counter in some cases.
In my tests I observe at the end of every 8 bits of transfer, at PHI/2 speeds, one bit is skipped in some as-yet unknown reason.
At phi2/2 speeds, SP is really still sampled after 3 clocks, so in the same cycle the next CNT edge is created you can set the SP value for the *previous* bit.
What seems to happen at phi2/2 speed in my tests is that when the shift register is full and needs to move its content to SDR, this overlaps with the same cycle as the next input bit arriving. So the data copied into SDR is actually one bit too late. Subsequently the reset of the shift counter seems to be off.
This end of a byte internally seems to go wrong at phi/2. At least that is my best current guess from measurements I have.
I'm fairly sure the IC was not intended to go this fast - the datasheet mentions SP is captured on posedge. That is true only if CNT is lower than PHI2/4. And that aligns with the max speed another 6526 on the same clock frequency is able to produce.
For completeness here is my current test stream for the SDR input at higher speeds: Note that I observe that switching the SPMODE in CRA to output resets the INPUT shift regsiter. So I use SPMODE out for a few cycles to get into a known state of the internal input shift register.
It is important to note I connect RS[2] (with resistor) to CNT, and RS[3] (with resistor) to the SP input. So reading or writing anything will set CNT, SP to the highest 2 bits of the 4-bit register address
Same functions as above.
P("Test SDR input from SP on CNT");
W('hE,'h40); P("Write CRA: 40");
W('hD,'h7F); P("Write ICR: 7F");
R('hC,'h00); P("Read SDR");
R('hC,'h00); P("Read SDR");
R('hC,'h00); P("Read SDR");
R('hC,'h00); P("Read SDR");
W('hE,'h00); P("Write CRA: 00");
R('hD,'h18); P("Read ICR");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h8,'h09); P("Read TDT");
R('h8,'h09); P("Read TDT");
R('h8,'h09); P("Read TDT");
R('hC,'h00); P("Read SDR");
R('hC,'h00); P("Read SDR");
R('hC,'h00); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h8,'h09); P("Read TDT");
R('h8,'h09); P("Read TDT");
R('h8,'h09); P("Read TDT");
R('hC,'h00); P("Read SDR");
R('hC,'h00); P("Read SDR");
R('hC,'h00); P("Read SDR");
R('h8,'h09); P("Read TDT");
R('h8,'h09); P("Read TDT");
R('h8,'h09); P("Read TDT");
R('hC,'h00); P("Read SDR");
R('hC,'h00); P("Read SDR");
R('hC,'h00); P("Read SDR");
R('h8,'h09); P("Read TDT");
R('h8,'h09); P("Read TDT");
R('h8,'h09); P("Read TDT");
R('hC,'h00); P("Read SDR");
R('hC,'h00); P("Read SDR");
R('hC,'h00); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('hC,'h00); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('hC,'h00); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('hD,'h18); P("Read ICR");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h8,'h09); P("Read TDT");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h8,'h09); P("Read TDT");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h8,'h00); P("Read TDT");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h8,'h00); P("Read TDT");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('hC,'h2E); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h8,'h00); P("Read TDT");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('hC,'h55); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h8,'h01); P("Read TDT");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('hC,'h55); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h8,'h01); P("Read TDT");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('hC,'h55); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h8,'h01); P("Read TDT");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('hC,'h55); P("Read SDR");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('h8,'h02); P("Read TDT");
R('h8,'h02); P("Read TDT");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('h8,'h02); P("Read TDT");
R('h8,'h02); P("Read TDT");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('h8,'h02); P("Read TDT");
R('h8,'h02); P("Read TDT");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('hC,'h55); P("Read SDR");
R('hC,'h55); P("Read SDR");
R('h8,'h02); P("Read TDT");
R('h8,'h02); P("Read TDT");
R('hD,'h18); P("Read ICR");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('hC,'h39); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('hC,'h39); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('hC,'h39); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('hC,'h39); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('hC,'h39); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('hC,'hCF); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('hC,'hCF); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('hC,'hCF); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('hC,'hCF); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('hC,'hCF); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('hC,'h36); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('hC,'h36); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('hC,'h36); P("Read SDR");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('hC,'h94); P("Read SDR");
R('hC,'h94); P("Read SDR");
R('h8,'h03); P("Read TDT");
R('h8,'h03); P("Read TDT");
R('hC,'h94); P("Read SDR");
R('hC,'h94); P("Read SDR");
R('h8,'h03); P("Read TDT");
R('h8,'h03); P("Read TDT");
W('hC,'h89); P("Write SDR: 89");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('hC,'h89); P("Read SDR");
R('hC,'h89); P("Read SDR");
R('h8,'h03); P("Read TDT");
R('h8,'h03); P("Read TDT");
R('hC,'h89); P("Read SDR");
R('hC,'h89); P("Read SDR");
R('h8,'h03); P("Read TDT");
R('h8,'h03); P("Read TDT");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('hD,'h18); P("Read ICR");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('hC,'h36); P("Read SDR");
R('hC,'h36); P("Read SDR");
R('h8,'h03); P("Read TDT");
R('h8,'h03); P("Read TDT");
R('h4,'hFF); P("Read TAL");
R('h4,'hFF); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('hD,'h10); P("Read ICR");
W('hE,'h41); P("Write CRA: 41");
M(1,1,1,1,0,1); P("lines PCN: 1, IRQN: 1, PB7: 1, PB6: 1, SP: 0, CNT: 1");
X('hFF,'hFF,'h00,'h00,'hFF,'hFF,'hFF,'hFF,'h03,'h00,'h00,'h12,'h36,'h08,'h41,'h00,1);
P("ic sc&rd: PA: FF PB: FF DDA: 00 DDB: 00 TAL: FF TAH: FF TBL: FF TBH: FF TDT: 03 TDS: 00 TDM: 00 TDH: 12 SDR: 36 ICR: 08 CRA: 41 CRB: 00 ");
M(1,1,1,1,0,1); P("lines PCN: 1, IRQN: 1, PB7: 1, PB6: 1, SP: 0, CNT: 1");
X('hFF,'hFF,'h00,'h00,'hFF,'hFF,'hFF,'hFF,'h03,'h00,'h00,'h12,'h36,'h18,'h41,'h00,1);
P("ic sc&rd: PA: FF PB: FF DDA: 00 DDB: 00 TAL: FF TAH: FF TBL: FF TBH: FF TDT: 03 TDS: 00 TDM: 00 TDH: 12 SDR: 36 ICR: 18 CRA: 41 CRB: 00 ");
M(1,1,1,1,0,1); P("lines PCN: 1, IRQN: 1, PB7: 1, PB6: 1, SP: 0, CNT: 1");
X('hFF,'hFF,'h00,'h00,'hFE,'hFF,'hFF,'hFF,'h03,'h00,'h00,'h12,'h36,'h18,'h41,'h00,1);
P("ic sc&rd: PA: FF PB: FF DDA: 00 DDB: 00 TAL: FE TAH: FF TBL: FF TBH: FF TDT: 03 TDS: 00 TDM: 00 TDH: 12 SDR: 36 ICR: 18 CRA: 41 CRB: 00 ");
M(1,1,1,1,0,1); P("lines PCN: 1, IRQN: 1, PB7: 1, PB6: 1, SP: 0, CNT: 1");
X('hFF,'hFF,'h00,'h00,'hFD,'hFF,'hFF,'hFF,'h03,'h00,'h00,'h12,'h36,'h18,'h41,'h00,1);
P("ic sc&rd: PA: FF PB: FF DDA: 00 DDB: 00 TAL: FD TAH: FF TBL: FF TBH: FF TDT: 03 TDS: 00 TDM: 00 TDH: 12 SDR: 36 ICR: 18 CRA: 41 CRB: 00 ");
M(1,1,1,1,0,1); P("lines PCN: 1, IRQN: 1, PB7: 1, PB6: 1, SP: 0, CNT: 1");
W('hE,'h01); P("Write CRA: 01");
R('h4,'hFB); P("Read TAL");
R('h4,'hFA); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('hC,'h65); P("Read SDR");
R('hC,'h65); P("Read SDR");
R('h8,'h03); P("Read TDT");
R('h8,'h04); P("Read TDT");
R('h4,'hF3); P("Read TAL");
R('h4,'hF2); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
R('h4,'hEF); P("Read TAL");
R('h4,'hEE); P("Read TAL");
R('h0,'hFF); P("Read PA");
R('h0,'hFF); P("Read PA");
X('hFF,'hFF,'h00,'h00,'hEB,'hFF,'hFF,'hFF,'h04,'h00,'h00,'h12,'h65,'h18,'h01,'h00,1);
P("ic sc&rd: PA: FF PB: FF DDA: 00 DDB: 00 TAL: EB TAH: FF TBL: FF TBH: FF TDT: 04 TDS: 00 TDM: 00 TDH: 12 SDR: 65 ICR: 18 CRA: 01 CRB: 00 ");
X('hFF,'hFF,'h00,'h00,'hEA,'hFF,'hFF,'hFF,'h04,'h00,'h00,'h12,'h65,'h18,'h01,'h00,1);
P("ic sc&rd: PA: FF PB: FF DDA: 00 DDB: 00 TAL: EA TAH: FF TBL: FF TBH: FF TDT: 04 TDS: 00 TDM: 00 TDH: 12 SDR: 65 ICR: 18 CRA: 01 CRB: 00 ");
X('hFF,'hFF,'h00,'h00,'hE9,'hFF,'hFF,'hFF,'h04,'h00,'h00,'h12,'h65,'h18,'h01,'h00,1);
P("ic sc&rd: PA: FF PB: FF DDA: 00 DDB: 00 TAL: E9 TAH: FF TBL: FF TBH: FF TDT: 04 TDS: 00 TDM: 00 TDH: 12 SDR: 65 ICR: 18 CRA: 01 CRB: 00 ");
X('hFF,'hFF,'h00,'h00,'hE8,'hFF,'hFF,'hFF,'h04,'h00,'h00,'h12,'h65,'h18,'h01,'h00,1);
P("ic sc&rd: PA: FF PB: FF DDA: 00 DDB: 00 TAL: E8 TAH: FF TBL: FF TBH: FF TDT: 04 TDS: 00 TDM: 00 TDH: 12 SDR: 65 ICR: 18 CRA: 01 CRB: 00 ");
R('hD,'h18); P("Read ICR");
X('hFF,'hFF,'h00,'h00,'hE6,'hFF,'hFF,'hFF,'h04,'h00,'h00,'h12,'h65,'h00,'h01,'h00,1);
P("ic sc&rd: PA: FF PB: FF DDA: 00 DDB: 00 TAL: E6 TAH: FF TBL: FF TBH: FF TDT: 04 TDS: 00 TDM: 00 TDH: 12 SDR: 65 ICR: 00 CRA: 01 CRB: 00 ");
X('hFF,'hFF,'h00,'h00,'hE5,'hFF,'hFF,'hFF,'h04,'h00,'h00,'h12,'h65,'h10,'h01,'h00,1);
P("ic sc&rd: PA: FF PB: FF DDA: 00 DDB: 00 TAL: E5 TAH: FF TBL: FF TBH: FF TDT: 04 TDS: 00 TDM: 00 TDH: 12 SDR: 65 ICR: 10 CRA: 01 CRB: 00 ");
X('hFF,'hFF,'h00,'h00,'hE4,'hFF,'hFF,'hFF,'h04,'h00,'h00,'h12,'h65,'h10,'h01,'h00,1);
P("ic sc&rd: PA: FF PB: FF DDA: 00 DDB: 00 TAL: E4 TAH: FF TBL: FF TBH: FF TDT: 04 TDS: 00 TDM: 00 TDH: 12 SDR: 65 ICR: 10 CRA: 01 CRB: 00 ");