On 08/16/2015 06:18 PM, Steven Hirsch wrote:

What is the "Chuck mod"?

I'll try to make this brief (ha!). One of the problems with the original XTIDE is that the data bus on a regular ATA drive is 16 bits. (There used to be a mode that could be set to allow an ATA drive to support 8-bit transfers, but that's long gone from most drives, now almost solely present in the CF interface).

So the XTIDE would latch half the 16-bit bus on a read and make it available at a different I/O address IIRC, 8 locations higher). Reading, therefore became a matter of issuing an IN al,dx instruction, storing the byte, then adjusting the address in dx (XCHG DX,some other register) and repeating for the rest of the 16-bit word, adjusting dx again back to the original and looping...

I observed that if the addressing of the drive was slightly modified by swapping I/O address bits 0 and 2, one could put the two halves of the 16-bit register ad adjacent I/O addresses and let the 8088 (or V20) BIU handle the input as a word operation. This means that the entire read loop on an 8088 collapses to a "in ax,dx / stosw/ loop" three-instruction sequence. On a V20, it's even simpler "rep insw". The last I recall, writes couldn't use the BIU trick because of the way the latch clocked data to the drive. You can't win 'em all. At least it was no slower than the old way--and code tends to do far more reads than writes.

Of course, this results in the other ATA registers being a little out of normal sequence, but that's a simple code change.

--Chuck

Reply via email to