I haven't built it yet because I'm afraid it's just too slow to do anything too useful in real time (like dump FDS disks :)
Here's the idea though:
The latch arbitrates (half duplex or full duplex) transfer by having one side set the bit ("strobe"), then have the other clear the bit ("acknowledge") but to the other side, they are strobing and getting acknowledgment.
To send *and* receive a bit, just:
-set your output bit
-toggle strobe
-poll acknowledge
-at acknowledge get your input bit
-repeat :)
The latch is a little special in that the "invalid" state is now a hold state and the outputs only change on the rising and falling edges. I think (and hope) these two things will eliminate "race" conditions and keep everything stable.
Here's the whole diagram:

Any suggestions or interest in the project?