Pachuquin escribió:Luego si se quisiera que esa interfaz respondiera solamente al puerto 61441 habría que comprobar las direccions de la A0 a la A15 y comprobar que son 11110000 00000001 ¿no? ¿hay alguna forma de hacerlo más fácil?
Si quieres que la interfaz responda unicamente a esa dirección, sí, hay que comprobar todos los bits del bus de direcciones. ¿Forma de hacerlo fácil? Pues lo que hacen (hacían) muchos diseñadores de interfaces, y es realizar decodificación parcial. Es decir, sólo comprueban los valores de algunos de los bits del bus de direcciones y para los demás, se asume que tendrán el valor correcto. ¿El resultado? Pues que la interface está accesible en más de un puerto, y si no eliges bien qué bits decodificas y cuáles no, te puedes encontrar con que tu interface colisiona con otra que haya tenido a bien decodificar solamente los mismos bits que tú.
Por ejemplo, muchas interfaces Kempston decodifican A7,A6 y A5. Si estos tres bits valen 0, la inteface se selecciona. El puerto "oficial" de Kempston es el 31, que en binario sería 0001 1111 . O sea, todos los bits a 1 excepto A5,A6 y A7 (los bits de la parte alta del bus de direcciones no se suelen utilizar, aunque hay interfaces que sí lo hacen, como ULAplus y Spectranet, además del AY-3-8912 y los puertos de paginación del 128K)
Si tú decides ahorrar electrónica en tu interface y en lugar de decodificar por completo el puerto 61441 optas por decodificar unicamente A5,A6 y A7, te encontrarás que tu interface colisionará con un puerto Kempston. De hecho, y si te fijas bien, aunque decodificaras por completo tu interface, ésta colisionaría sin remedio con una interface Kempston que no decodifique el bus por completo, ya que el puerto 61441 tiene a 0 los bits A5,A6 y A7.
Es por eso por lo que en las recomendaciones de la especificación ZXI para diseñar nuevos periféricos para el Spectrum, se exige que el periférico haga decodificación total del bus de direcciones (las 16 líneas). La especificación recomienda un rango de puertos para tu periférico que se asegura de que no colisionan con ningún hardware existente.
http://www.zxshed.co.uk/sinclairfaq/ind ... I_standardLa forma más sencilla que se me ocurre de decodificar el bus completo para que tu interface se acceda con una y sólo una combinación de puerto válido, es usar algo como un par de comparadores 74HCT688. Cada uno de estos compara 8 bits. Las salidas de ambos pueden combinarse para dar una señal válida sólo cuando un valor de 16 bits en el bus de direcciones sea igual al esperado, o bien usar una GAL configurada como comparador que active una salida cuando los 16 bits del bus de direcciones sean iguales a un valor dado configurado dentro de la GAL.
Otra forma, un poco chusquera, pero válida, sería coger una EPROM de 64K (27512) y programarla de forma que todas sus posiciones de memoria tuvieran 0's menos una, que tendría 1's (o al revés, si quieres lógica invertida). La posición de memoria que tuviera el 1 en su bus de datos correspondería con aquella dirección que queremos detectar. Si la EPROM es rápida (menos de 100ns) puedes usarla en el Spectrum como decodificador de direcciones, conectando el bus de direcciones del procesador al bus de direcciones de la EEPROM. Cualquiera de los pines del bus de datos sería la línea de selección de tu periférico.