Romina:
no se si entiendo del todo tus dudas, y me parece que hay varios temas mezclados.
Depende del mecanismo que se use para controlar cuál es el dispositivo maneja el bus en cada momento. El dispositivo habilitado a manejar el bus puede ser una memoria o un puerto de entrada cuando el procesador lee, o el propio procesador cuando escribe en memoria o en un puerto de salida.
Hay dos mecanismos para implementar los buses.
Tradicionalmente se usan buses triestado. Un buffer triestado se desconecta de su salida cuando está deshabilidado. En cada momento debe haber un solo dispositivo habilitado. Si por error habilitamos más de un dispositivo hay un cortocircuito. El Z80 original usa este mecanismo.
Otra forma es utilizar compuertas AND para habilitar las salidas de los diferentes dispositivos que pueden ser leídos por el procesador y combinar las salidas de las AND en una compuerta OR para generar el bus de entrada al procesador. En este caso se manejan separados los buses de entrada y de salida al procesador. Con este mecanismo si por error habilitamos dos dispositivos a la vez lo que sucede es que se lee el OR entre los valores puestos por los dos dispositivos.
Este mecanismo es el que usa el T80 que utilizamos en el laboratorio.
Entonces, un puerto de entrada debe siempre tener un buffer triestado si trabajamos con el Z80 (buses triestado) o una compuerta AND si trabajamos con un T80 (buses multiplexados). Ese buffer triestado o compuerta AND debe habilitarse durante el ciclo de lectura de E/S que se produce al final de la instrucción IN.
Un puerto de salida en cambio debe capturar el valor que pone el procesador sobre el bus durante un par de períodos de reloj en el ciclo de escritura en E/S que se produce al final de la instrucción OUT. Para eso un puerto de salida siempre debe tener un registro u otro elemento de memoria.
Por otro lado, a veces sucede que el dispositivo que suministra los datos en un puerto de entrada nos dice que mantiene los datos válidos solamente en un instante, por ejemplo cuando se produce un pulso o un flanco en otra señal. En esos casos hay que poner un registro para capturar el valor presente en la entrada en el momento correcto.
Por último, otro caso en que se utiliza Flip Flops es para implementar la bandera de estado en una transferencia condicional, cuando queremos sincronizar las transferencias haciendo lo que se llama handshake. Si es esa la duda me parece que deberías repasar las clases de transferencias condicionales.
Espero haber ayudado.
Saludos,
julio