La memoria contendida es el nombre que Sinclair le da a una parte del espacio de memoria direccionable de 64 KB del ZX Spectrum . Con los 64 KB completos, el microprocesador Z80 es el maestro exclusivo del bus, por lo que lee y escribe a su velocidad máxima de bus, pero el espacio de memoria contendida se comparte entre el ULA y el Z80, y el ULA tiene mayor prioridad. La memoria contendida ocupa las direcciones 0x4000..0x7FFF del mapa de memoria del Z80 . Estos son los primeros 16 KB de RAM en la máquina de 48 KB y toda la RAM de la máquina de 16 KB.
La contención se produce como resultado de que el ULA lea los datos de visualización y atributos en esta RAM para producir la visualización de video del televisor . Por lo tanto, la contención no se produce durante el flyback horizontal, el flyback vertical o durante el borde de la pantalla.
Los accesos a E/S también compiten si la ULA debe leer la memoria en disputa mientras el Z80 accede a un puerto de E/S de ULA. Los puertos de E/S de ULA son aquellos con una dirección par (el bit de dirección 0 es un 0).
El Z80 debe esperar cada vez que el ULA necesita acceder a la memoria en disputa antes de proceder con su propia lectura o escritura en memoria en disputa. El efecto para el usuario es que los programas que hacen uso de la memoria en disputa o de la E/S en disputa se ejecutan más lentamente que aquellos que las evitan.
La ULA debe esperar a que se complete una lectura o escritura del Z80 antes de poder detener el reloj del Z80 y acceder a la memoria; detendrá el reloj del Z80 solo durante el primer ciclo de reloj de un ciclo de máquina .
Los primeros Spectrums parten del supuesto de que, como máximo, se producirá un acceso a memoria en disputa en un ciclo de máquina: esto no es cierto en los ciclos de búsqueda de instrucciones si el programador ha configurado la tabla de vectores de interrupción para que se encuentre dentro del área en disputa. En ese caso, el ULA se negará a cargar su dirección de vídeo y el byte de vídeo que se mostrará será el que el procesador estaba leyendo. La consecuencia de esto es ruido aleatorio en la pantalla o "nieve".
Dado que este efecto no se producía en condiciones normales de funcionamiento (requería la intervención deliberada de un programador [1] ), rara vez se veía y se usaba solo en algunos juegos [ ¿cuáles? ] como un efecto gráfico especial .
Las versiones posteriores de Spectrum, incluidas todas las versiones de 128 kb, corrigen el error .
El ULA no utiliza el mecanismo de solicitud/concesión de bus del Z80 para convertirse en el maestro del bus durante sus accesos a memoria contenciosa. En cambio, extiende el período alto de la entrada de reloj del Z80 para detener toda la actividad del microprocesador. Si bien esto es menos elegante que realizar una solicitud de bus, sí obtiene acceso a memoria contenciosa a menos relojes del Z80. Esto elimina cualquier necesidad de que el ULA lea los datos de la pantalla con anticipación, una ventaja con los circuitos abarrotados en el ULA completo.
El ULA se conecta directamente a los circuitos integrados del sistema de memoria, mientras que el Z80 se conecta a ellos a través de resistencias limitadoras de corriente en serie aislantes. Esto permite que el ULA y la memoria se controlen entre sí mientras que el Z80 también controla la memoria. El uso de resistencias en lugar de circuitos integrados de controlador de bus triestado reduce el gasto del circuito, pero requiere una corriente de pin de E/S promedio más alta del Z80, el ULA y los circuitos integrados de memoria.