All of the CBM disk drives used the SO pin, connected to the data separator. When a byte of data has been converted from flux to GCR, the SO pin goes low which sets bit 6 (V) of the flags. This has to be cleared in software (CLV) or you won't see the next one occur. This was used from the late 70's (PET drives) until the early 90's when CBM stopped producing the 1571.
I know this quite well, because it is what I am currently working on - a cycle exact CBM disk drive emulator using a PIC micro. I am emulating the 6502, two 6522's, 2K of RAM, and the data separator hardware with the proper crazy memory map that mirrors and has invalid (undecoded) addressing.
This is... interesting. Schematics for 4040 show that SO is pulled up, no connection to data seperator:
http://www.zimmers.net/anonftp/pub/cbm/ ... 0806-1.gif
and ROM code doesn't use SO therefore:
Code: Select all
FDB1 24 4D iFDB1 BIT VIA_IFR ; get the bytes, store in (BUFPT),y, update checksum, jmp DEND
FDB3 10 FC BPL iFDB1
FDB5 A5 41 LDA VIA_DIN
FDB7 91 16 STA (BUFPT),Y
FDB9 45 08 EOR WORK
FDBB 85 08 STA WORK
FDBD C8 INY
FDBE D0 F1 BNE iFDB1
"Byte ready" is tested via VIA. GCR decoding fully done in hardware. Checksum is generated within the loop.
Source:
http://www.6502.org/users/andre/petinde ... s1fdc.html
SO came into use in later series, 8250 for sure (didn't check with 8050 yet):
Code: Select all
FD9F LFD9F:
FD9F 50 FE BVC LFD9F
FDA1 LFDA1:
FDA1 B8 CLV
FDA2 A5 41 LDA io_diskdata_read_fdc
FDA4 91 17 STA (bufpnt_fdc),Y
FDA6 C8 INY
FDA7 D0 F6 BNE LFD9F
The guess would be that someone miscalculated the time available: 8250 has a higher data rate -- but still would leave plenty of time to do it the old way (no SO, test via VIA, checksum calculated later in a second loop), but the someone thought there would not be that plenty of time and tried to cut corners.