El TMS9918 es un controlador de pantalla de vídeo (VDC) fabricado por Texas Instruments , en los manuales se hace referencia como "Procesador de pantalla de vídeo" (VDP) e introducido en 1979. [1] El TMS9918 y sus variantes se utilizaron en ColecoVision , CreatiVision , Memotech MTX , MSX , NABU Personal Computer , SG-1000 / SC-3000 , Spectravideo SV-318 , SV-328 , Sord M5 , Tatung Einstein , TI-99/4 , Casio PV-2000 , Coleco Adam , Hanimex Pencil II , PECOS y Tomy Tutor .
El TMS9918 genera gráficos de caracteres basados en cuadrícula (utilizados para mostrar texto o imágenes de fondo) y sprites utilizados para mover objetos en primer plano.
Las características principales de este chip son, como se destacó en una presentación de 1980 de Karl Guttag (uno de los diseñadores): [1]
Todos los circuitos integrados de esta familia suelen denominarse con el nombre TMS9918, a veces con el sufijo "A". La "A" indica una segunda versión del chip que incorporaba nuevas funciones, la más destacada de las cuales era la incorporación de un modo de mapa de bits (Graphic II).
El TMS9918 sólo se utilizó en la TI-99/4; la TI-99/4A y las otras computadoras tenían la versión A VDC.
El TMS9918A y el TMS9928A emiten una señal de vídeo de 60 Hz , mientras que el TMS9929A emite 50 Hz. La diferencia entre '1' y '2' en 'TMS9918A' y 'TMS9928A' es que la versión '1' emite vídeo NTSC compuesto , mientras que las versiones '2' (incluido el TMS9929A) emiten YPbPr [2] analógico ( luminancia Y y señales de diferencia de color Pr (RY) y Pb (BY) ). La necesidad de este último era predominante en el mundo de 50 Hz , incluida Europa, debido a los diferentes estándares de señal de vídeo PAL y SECAM . Era más rentable emitir Y, Pr y Pb y codificarlos en PAL o SECAM en el modulador de RF , que intentar tener una consola diferente para cada estándar de color diferente. La versión '1' también cuenta con una entrada de video compuesto externa, lo que lo convierte en un chip útil para usar en "tituladores" de video que pueden superponer texto o gráficos en el video, mientras que la versión '2' no lo hace.
Las variantes originales del TMS9918 eran NMOS de carga de agotamiento y se fabricaban con un proceso de 4,5 μm; fue uno de los primeros chips NMOS de carga de agotamiento que fabricó Texas Instruments, en contraste con el microprocesador TMS9900 que utilizaba el antiguo proceso NMOS de carga de mejora que requería tres voltajes de suministro. Debido al gran tamaño de la matriz y a la velocidad interna relativamente alta, el TMS9918 se calentaba lo suficiente como para necesitar un disipador de calor; algunos dispositivos, como la consola taiwanesa DINA (un híbrido Colecovision/SG-1000) no instalaron disipadores y sufrieron fallas en el chip. En 1983, Texas Instruments había reducido el tamaño del chip a 3 μm, lo que hacía que funcionara a menor temperatura y ya no requiriera un disipador: las máquinas MSX y la Sega SG-1000 usaban el nuevo TMS9918 de 3 μm, mientras que la mayoría de las Colecovisions tenían la variante original de 4,5 μm (la última serie de consolas producidas en 1985 tenía el modelo más nuevo TMS9918).
A mediados de los años 1980 se lanzaron al mercado variantes posteriores de los chips de la serie TMS9918, los TMS9118 , TMS9128 y TMS9129 , pero nunca fueron muy populares. Se cambió la función de un pin y la asignación de la memoria de video permite utilizar dos chips de 16K×4 bits en lugar de los ocho chips de 16K×1 bit que necesita el TMS99xx. Por lo demás, los chips son completamente idénticos a los TMS9918A, TMS9928A y TMS9929A respectivamente.
El VDP tiene 16K × 8 bits de memoria de video externa. Esta memoria está fuera del espacio de direcciones de la CPU . Tener un espacio de direcciones separado significa que la CPU tiene que hacer más trabajo para escribir o leer esta memoria, pero también significa que el VDC no ralentiza la CPU cuando lee periódicamente esta memoria para generar la pantalla. Además, deja más espacio de direcciones disponible para la CPU para otra memoria y hardware mapeado en memoria.
Dependiendo del modo de pantalla que se utilice, es posible que no se necesite toda la memoria de vídeo para generar la imagen. En estos casos, la CPU puede utilizar la memoria de vídeo adicional para otros fines. Por ejemplo, un uso es como un bloc de notas para descomprimir los datos gráficos o de sonido almacenados en la ROM del cartucho. Otro uso popular es crear una segunda copia de algunos o todos los datos de la pantalla para eliminar el parpadeo y el corte, una técnica conocida como doble búfer .
La CPU se comunica con el VDP a través de un bus de 8 bits . Un pin controlado por la CPU separa este bus en dos "puertos", un puerto de control y un puerto de datos. Para escribir o leer un byte de memoria de vídeo, la CPU primero tiene que escribir dos bytes en el puerto de control del VDP en el registro de dirección interna del VDC. A continuación, la CPU realiza la escritura o lectura real en el puerto de datos del VDP. A medida que se escribe o lee un byte de datos, el TMS9918 incrementa automáticamente el registro de dirección interna. Esta función de incremento automático acelera las escrituras y lecturas de bloques de datos. El puerto de control también se utiliza para acceder a varios registros internos.
El TMS9918 tiene dos tipos de gráficos separados y distintos: personajes y sprites .
Los caracteres se utilizan normalmente para crear texto o imágenes de fondo. Aparecen detrás de los sprites.
El TMS9918 tiene varios modos de pantalla que controlan las características de los personajes.
Hay cuatro modos de pantalla documentados disponibles en el TMS9918A (como se mencionó anteriormente, el TMS9918 carece del modo Gráfico 2):
Técnicamente, el modo 2 es un modo de caracteres con un conjunto de caracteres coloridos. La pantalla está dividida horizontalmente en tres áreas de 256×64 píxeles, cada una de las cuales tiene su propio conjunto de caracteres. Al imprimir secuencialmente los caracteres del 0 al 255 en las tres áreas, el programa puede simular un modo gráfico en el que cada píxel se puede configurar individualmente. Sin embargo, el búfer de cuadros resultante no es lineal.
El programa también puede utilizar tres conjuntos de caracteres idénticos y luego tratar la pantalla como un modo de texto con un conjunto de caracteres coloridos. Los patrones de fondo y los sprites consisten entonces en caracteres coloridos. Esto se usaba comúnmente en los juegos, porque solo se debían mover 32×24 bytes para llenar y desplazarse por toda la pantalla.
El desafío de usar el modo 2 de TMS9918 era que cada área de 8x1 píxeles podía tener solo dos colores, primer plano y fondo. Se podían elegir libremente de la paleta de 16 colores, pero para cada área de 8x1, solo podían existir dos colores. Al manipular la pantalla en BASIC con el LINE
comando, uno podía fácilmente exceder el máximo de 2 colores por área de 8x1 y terminar con un " desbordamiento de color ".
Originalmente, Texas Instruments sólo documentó los cuatro modos enumerados anteriormente. Sin embargo, el bit que habilita el modo 2 es más interesante de lo que se pensaba inicialmente. Se describe mejor como un bit modificador para los otros modos. Al habilitarlo se logran tres cosas: [3]
Teniendo esto en cuenta, son posibles tres modos adicionales. Tenga en cuenta que, si bien los chips TMS9918A originales admiten estos modos, es posible que los clones y emuladores no los admitan.
El TMS9918 no tiene registros de desplazamiento , por lo que el desplazamiento debe realizarse mediante software. Además, el desplazamiento solo puede realizarse en los límites de los caracteres, no píxel por píxel. [ cita requerida ]
Los sprites se utilizan normalmente para crear objetos móviles en primer plano. Aparecen delante de los personajes (mosaicos).
Los modos 1, 2 y 3 permiten renderizar sprites. Puede haber hasta 32 sprites monocromáticos de 8×8 o 16×16 píxeles en pantalla, cada uno con su propio color único. La ilusión de sprites multicolores se puede crear apilando varios sprites uno sobre otro.
No puede haber más de 4 sprites en una sola línea de escaneo; los píxeles horizontales de los sprites adicionales se descartan. Los sprites con una prioridad más alta se dibujan primero. El VDP informa en un registro de estado el número del primer sprite descartado. La CPU puede evitar esta limitación rotando las prioridades de los sprites de modo que se dibuje un conjunto diferente de sprites en cada cuadro; en lugar de desaparecer por completo, los sprites parpadearán. Esta técnica se conoce como multiplexación de sprites.
El movimiento automático de los sprites no lo gestiona el VDP. En la práctica, la CPU captará la interrupción vertical del VDP (una salida estándar del VDP que se activa automáticamente cada 50 o 60 segundos (según la variante del chip) al comienzo del VBI ( intervalo de borrado vertical ). La CPU pasa entonces a una rutina de manejo de sprites en el software, que a su vez le indica al VDP dónde debe reposicionar los sprites.
Cuando dos píxeles no transparentes de cualquier par de sprites colisionan, se activa el indicador de colisión de sprites. Esto resulta útil para activar rutinas de detección de colisiones más avanzadas dentro del software, que pueden determinar la ubicación exacta de la colisión y actuar en consecuencia, ya que el VDP por sí mismo no puede informar qué dos sprites han colisionado.
Los chips de la familia TMS9918 utilizaban una paleta de video compuesta . Los colores se generaban en función de una combinación de valores de luminancia y crominancia para el TMS9918A y los valores Y , RY y BY para el TMS9928A/9929A.
El TMS9918 tiene una paleta fija de 16 colores , compuesta por 15 colores mostrados y un color "transparente".
De acuerdo con la “Tabla 2.3 – Asignaciones de color” de la hoja de datos [5] los niveles de salida son los siguientes:
Notas: Los colores son meramente ilustrativos y se convirtieron de los valores YPrPb (MS9928A/9929A) a sRGB teniendo en cuenta la corrección gamma . No se tuvo en cuenta la colorimetría SMPTE C ; consulte la siguiente sección para ver conversiones de colores alternativas.
Para convertir Y, RY y BY a RGB, debes considerar cómo se originó Y, es decir:
Y = R * 0,30 + G * 0,59 + B * 0,11
Por lo tanto, es necesario utilizar las siguientes fórmulas:
R = RY + Y B = POR + Y G = (Y - 0,30 * R - 0,11 * B) / 0,59
Pero primero hay que prestar atención al hecho de que para todos los colores que no tienen crominancia (es decir, negro, gris y blanco), RY y BY no son 0 %, sino que todos tienen un desplazamiento del 47 %. Por lo tanto, primero hay que restar este desplazamiento de todos los valores de RY y BY. Debido a que en la práctica este paso nunca se realizará solo, no hay problema en que algunos resultados sean negativos:
Ahora puedes realizar la conversión a RGB. Todos los resultados deben estar en el rango de 0% a 100%:
Se podría llegar a la conclusión de que el valor erróneo de 113% para R del color "rojo claro" es el resultado de un error tipográfico en la hoja de datos y que RY no debe ser mayor que el 80%. Pero si se miden las señales de salida del chip con un osciloscopio , se encontrará que todos los valores de la tabla son correctos. Por lo tanto, el error está dentro del chip y hace que la señal roja se sature. Por este motivo, este valor debe corregirse al 100%.
Además, hay que tener en cuenta que hasta entonces sólo se disponía de tubos de rayos catódicos para monitores de ordenador, así como para televisores, y que estos CRT tenían una gamma . Los chips de la serie TMS9918 habían sido diseñados para funcionar con televisores y sus CRT tenían una gamma de 1,6 (observación: los CRT de los monitores Macintosh tenían 1,8 y los CRT de los monitores de PC tenían 2,2). Las pantallas planas no tienen gamma . Por este motivo, los colores del TMS9918 se ven algo pálidos aquí, como se puede ver en la primera tabla anterior. La siguiente tabla utiliza los valores con corrección de gamma, que son (escritos en hexadecimal porque así lo requiere la codificación de Wikipedia):
Nota: Los pasos utilizados son: redondear todos los valores a dos decimales, luego elevar a la potencia de 1,6 para la corrección gamma y finalmente transformar el rango de valores de 0...100 a 0...255.
El TMS9918A de Texas Instruments fue reemplazado por el V9938 de Yamaha , que agregó modos de mapa de bits adicionales, sprites más coloridos , un registro de desplazamiento vertical de pantalla completa, registros de desplazamiento vertical y horizontal, un blitter de hardware y una paleta personalizable . El V9938 fue diseñado para el estándar de computadoras MSX2 y luego se usó en una actualización de terceros para el TI-99/4A : el "ordenador en una tarjeta" Geneve 9640 .
El V9938, a su vez, fue sucedido por el V9958 , que agregó algunos modos de color alto adicionales y un registro de desplazamiento horizontal de dos páginas; estos chips se usaron en los sistemas MSX2+/ turboR .
Toshiba fabricó un clon llamado T6950 y no admite la función de enmascaramiento de patrones/tablas de colores no documentada en el modo de gráficos 2. [6] [ se necesita una mejor fuente ] Más tarde, Toshiba lanzó el T7937A MSX-Engine con un VDP integrado y arregló las funciones de enmascaramiento. Ambos VDP de Toshiba presentan una paleta ligeramente diferente a la de los VDP de Texas, con colores más vivos.
El TMS9918 fue la base de los chips VDP de la Master System , Game Gear y Mega Drive de Sega . El PPU de Nintendo utilizado en la Famicom/NES también se basó vagamente en el TMS9918. Utilizaron modos de visualización y registros adicionales, y añadieron capacidades de desplazamiento por hardware y otras funciones avanzadas.