Si quiere descubrirlo, el primer paso que haría es diseñar los rangos en bits
1111 11
5432 1098 7654 3210
-------------------
0x1000 = 0001 0000 0000 0000 serial
0x100F = 0001 0000 0000 1111
0x1010 = 0001 0000 0001 0000 parallel
0x101F = 0001 0000 0001 1111
0x8000 = 1000 0000 0000 0000 memory
0xFFFF = 1111 1111 1111 1111
Ahora, basado en el comentario que hiciste " A15 - A4 son los bits que importan y A3-A0 no importa. " Me hace pensar que solo necesitas seleccionar si va a la memoria , serie o paralelo. No nos importa decir la diferencia entre el mínimo o el máximo de un rango, solo que estamos dentro del rango. Entonces, lo que debemos hacer es detectar si los bits son únicos para todo el rango.
Si observa el gráfico anterior, podemos ver que podemos ver la diferencia entre un Serial y un paralelo al verificar si el bit 4 está configurado. Ahora para saber si estamos usando uno de los IO o si estamos usando la memoria, necesitamos ver si el bit 15 está establecido.
Podemos ver esto más fácilmente si ocultamos los bits que no nos afectan
1111 11
5432 1098 7654 3210
-------------------
0x1000 = 0XXX XXXX XXX0 XXXX serial
0x100F = 0XXX XXXX XXX0 XXXX
0x1010 = 0XXX XXXX XXX1 XXXX parallel
0x101F = 0XXX XXXX XXX1 XXXX
0x8000 = 1XXX XXXX XXXX XXXX memory
0xFFFF = 1XXX XXXX XXXX XXXX
Así que solo necesitamos 2 bits para poder elegir el dispositivo que queremos, su multiplexor se verá así
MUX
-----------
A4 --| 0 00 |--- Serial
| |
| 01 |--- Parallel
| | ___
A15 --| 1 10 |---\ \
| | | >--- Memory
| 11 |---/___/
----------- (^--- That is a OR gate)
Acceder a algo que no se encuentra en uno de los 3 rangos definidos dará " comportamiento indefinido ". Si no quieres un comportamiento indefinido, entonces debes definirlo . ¿Qué sucederá cuando intente acceder a una dirección en el rango de 0x0020
a 0x7FFF
?
Aquí hay un esquema completo de la configuración original, no pude hacer líneas más gruesas para los autobuses. Simplemente asuma que A0
en un lado coincide con A0
en el otro. CS
es Chip Select.