Em um Z80 , há um pino no chip que é declarado (definido para o estado 1 alto ou lógico) quando a instrução é uma instrução IN ou OUT. O hardware conectado ao chip monitora esse pino, além dos pinos de leitura / gravação, além de alguns dos pinos de endereço, para determinar se a operação se refere a eles. Cada dispositivo é configurado para reconhecer algum número como seu número de porta e responder de acordo. Então, quando você escreve uma instrução assembler como:
OUT(15),A
o chip coloca os pinos de endereço de ordem inferior 8 em 15 e grava o conteúdo do registrador A nos pinos de dados. Se o hardware estiver configurado e conectado corretamente, ele saberá que é destinado a ele. Similarmente com IN(15),A
.
Com a E / S mapeada na memória, há um local de memória reservado para o hardware. Quando a CPU escreve no endereço 0xFFF0, digamos (assumindo uma microarquitetura de 8 bits conveniente como a 6502 ou 6800 ou 6809 - ou, na verdade, Z80), então o hardware conectado para responder a esse endereço não é um chip de RAM mas o dispositivo. Normalmente, há pelo menos um endereço próximo usado para leitura; às vezes, o mesmo endereço é usado para leitura e gravação.
Em ambos os casos, a questão é basicamente que o hardware conectado à CPU reconhece certos padrões de atividade nos pinos dos chips (alguns pinos de controle, pinos de dados e pinos de endereço) como referindo-se a eles. Você pode ter problemas se vários dispositivos diferentes acharem que o mesmo endereço ou porta de E / S se refere a eles.
Embora eu tenha usado chips de 8 bits para os exemplos, os mesmos princípios básicos se aplicam a chips de 16 bits, 32 bits ou 64 bits.