I've read several different documentation sources explaining how Apple's asynchronous ADB protocol works. Although quite convoluted, it makes some sense of several rereads. I am having difficulty wrapping my head around how ADB's collision resolution works. This protocol is ancient and no longer used, but perhaps someone with a fresh mind can parse the documentation better than me.
https://developer.apple.com/library/archive/technotes/hw/hw_01.html#Section2
First, during the device address resolution (device enumeration) the ADB Manager polls devices and the devices are responsible for detecting collisions. When a device responds, it is supposed to supply a "random" address to the ADB Manager. It's unclear how this random address factors into the address resolution. Specifically, here's what it says the ADB Manager does:
An ADB device's register 3 is 2 bytes long, and includes 4 bits in which the address is stored. When the device receives a listen register 3 command, it should take its address from this 4-bit field. When it receives a talk register 3 command, it would be redundant to put the device's address in that field: the device's address is already uniquely determined by the fact that the device is responding to the talk register 3 command, which was sent to a specific address. Instead, a random 4-bit value should be returned in this field; this makes it easier to detect collisions between two devices responding to a talk register 3.
It only says "it makes it easier to detect collisions." There's no further discussion about how it uses this address to determine a collision. Microchip's technote AN591, says the device is responsible, but it is still unclear:
When a device recognizes that the Host issued a “Talk Register 3” command, it responds by sending a random address. During the transfer of each Bit Cell of the random address the signal line is monitored for the expected signal level. If the signal is not what is expected there is an address conflict. If the address is sent successfully, the host will respond with a Listen Command to that device. The command will have a new Device Address to which that device will move. The device then only responds to commands at the new address. If there is a conflict, where two devices have the same default address, and respond at the same time, the device that finds the line low when it expects it to be high, immediately stops transmitting because it has determined that a collision has occurred.
Given this is an asynchronous operation, it's impossible to read the ADB signal while writing a signal.
Second, ADB is supposed to support up to 16 devices since the device address is 4 bits. During the device resolution, however, addresses $8-$F are used for address resolution. This means there can be a maximum of 8 devices of a specific device family, not 16? Am I correct here?