Historia
El VDC es un chip de video que se preparó para el Commodore 900, que no llegó a entrar en producción. El chip acabó incorporado al Commodore 128, añadiendo la capacidad de mostrar texto en 80 columnas con una salida RGBI de gran calidad, requisitos deseables en procesadores de texto y emuladores de terminal.
El VDC se diseñó con el Motorola 6845 CRTC en mente, y comparte bastantes registros con la misma función. Anteriormente Commodore había preparado el chip MOS 6545 CRTC para las series CBM 4000/8000, diseño también basado en el chip de Motorola.
Un detalle interesante es la confusión que suele haber del VDC con el chip de vídeo que hubiera usado el Commodore LCD, modelo que tampoco entró en producción.
El CRTC de Motorola
Otros ordenadores populares que utilizaron el Motorola 6845 fueron el Amstrad CPC, el IBM PC original, y el Acorn BBC Micro. Acorn diseñó su propio clon del 6845 para el modelo de bajo coste Electron. El IBM PC daba la opción de dos tarjetas de vídeo diferentes, CGA y MDA, color y monocroma, ambas construidas alrededor del 6845.
Una característica que tienen estos ordenadores es la salida de vídeo tipo RGB, por ejemplo el RGB TTL de 8 colores del BBC Micro, el RGBI TTL de 16 colores del IBM PC (y del C128), y el RGB analógico del Amstrad. En contra de lo habitual en la primera mitad de los años 80, que era el video compuesto o la señal de antena TV RF (Commodore, Atari, Apple, Sinclair).
Estos ordenadores tienen algunas características comunes en lo que respecta a los gráficos, principalmente en la visualización de bitmap:
- Media resolución, para visualizar 40 columnas, 320 pixels de ancho, paleta de 4 colores, con pixels cuadrados.
- Alta resolución, para visualizar 80 columnas, 640 pixels de ancho, paleta de 2 colores, con pixels alargados verticalmente, del doble de altura que anchura.
- Baja resolución, pensado para visualizar la paleta de color más amplia, de 16 colores, con 160 pixels de ancho. No disponible en CGA estándar. Los pixels son tipo ladrillo, del doble de anchura que de altura.
- Cada pixel se colorea de manera independiente, sin restricciones de tipo celdas de color.
- Memoria mapeada, accesible para el chip de video y para la CPU también.
- Anchura y altura de la zona de visualización programables.
La altura y anchura programables se usaba en el BBC Micro para ahorrar memoria de video, al tener 256 pixels de resolución vertical de manera estándar, pues era un ordenador británico y por tanto PAL.
En el Amstrad CPC para overscan, en juegos como Donkey Kong, que consigue más resolución vertical recortando los bordes superior e inferior y ensanchando los bordes izquierdo y derecho.
Las siguientes imágenes de myabandonware, muestran los gráficos de un juego en versión CGA de 320x200 en la paleta de 4 colores más típica, después la versión CPC de 160x200 en 16 colores, para BBC Micro de 320x200 en monocromo, probablemente para ahorrar memoria, y en versión C64 porque no deja de ser un artículo centrado en Commodore. Hay que decir que no es fácil encontrar juegos con versión CGA que sirvan para ilustrar el sistema de gráficos, y es peor aún para el BBC Micro.
Las imágenes siguientes muestran otro juego en versión Amstrad CPC y en CGA en 320x200 en 4 colores, en BBC Micro de 160x200 en 8 colores, sin aprovecharlos demasiado, es un juego original de C64 y no se puso demasiado cariño en las versiones de CPC y CGA, sin embargo es de lo poco que hay en BBC Micro en juegos de gráficos vistosos.
El C64 se defiende gracias a las celdas de color, los sprites y el uso de interrupciones para cambiar colores. Pero en algunas ocasiones la mayor resolución del Motorola CTRC sí se hace notar.
Los colores
Las paletas de 4 colores del modo de media resolución de la tarjeta CGA del IBM PC son icónicas porque básicamente había 3 opciones: cyan, magenta, blanco y negro en la paleta 1 y en la paleta 0, rojo, amarillo, verde y negro. La paleta 2, rojo, cyan, blanco y negro se usó menos, porque no estaba documentada por IBM.
En el BBC Micro la paleta no está prefijada, pero aún así es icónica la paleta de colores por defecto, rojo, amarillo, blanco y negro. El BBC Micro/Electron es uno de los pocos sistemas en los que la paleta de colores lógica, 16 colores, es mayor que la física, de 8 colores. Esto da lugar a una discusión que no vamos a abordar aquí.
Puede parecer un poco ridículo entretenerse con los colores pero muchos ordenadores del principio de los 80 tenían tales limitaciones (pensar en esas letras negras sobre fondos verdes de los Dragon, de los Laser) que el hecho de que el VDC tenga la paleta de 16 colores del conector RGBI TTL, que se popularizó después al ser habitual en las BBS, también le da interés.
En la tarjeta CGA original, en el modo bitmap de alta resolución, el color del fondo estaba predeterminado en negro. Sin embargo, el modo alfanumérico sí usaba los 16 colores. Se hizo popular en juegos EGA y también en arte alfanumérico (ASCII art). Al meterle color se denomina ANSI art, aunque sea más un argot que habla formal.
CGA vs VDC
En ordenadores con Motorola CRTC, aunque la fama se la lleva CGA, quizá por la influencia de la escena USA, sólo he encontrado ejemplos reales de juegos atractivos en Amstrad CPC. Por ejemplo los juegos isométricos a 4 colores y 320x200.
El hecho es que las hipotéticas capacidades CTRC del VDC siempre lo han envuelto en un halo de misterio y ha incitado no poca gente a investigar. Si no han llegado más lejos es probablemente porque no es tan adecuado para hacer gráficos de juegos/demos como gustaría.
Pero el VDC sólo trabaja en alta resolución. Nos podemos ir olvidando de los isométricos a 320x200 en 4 colores. En compensación el VDC tiene celdas de color. Al menos en el C128, utiliza memoria de video dedicada, no accesible directamente por la CPU, con el cuello de botella que comporta para acceder a la memoria de video. En compensación tiene la capacidad de mover bloques de memoria, de la que el 6845 carece.
Para liarla un poco más, hay un aspecto en el que el IBM PC se asemeja al VDC, pero se diferencia de los Amstrad CPC y los Acorn: la visualización alfanumérica. En este modo, el IBM sí usa celdas de color. Y es la base para el popular (en la era del homebrew) modo CGA de 160x100 en 16 colores.
A continuación se muestran algunos juegos que utilizan este modo o alguna variación. En el caso de Robod (*), no es un juego para XT sino para 486 aunque utilice gráficos CGA. No tiene mucho sentido histórico porque un 486 hubiera sido VGA o superior, pero es homebrew actual.
El modo de 160x100 en 16 colores puede parecer pobre comparado con los 160x200 de 8 bits como el C64. Pero los artistas que prefieran los pixels cuadrados pueden renunciar a la resolución vertical a cambio de menos restricciones de colores. ¿Puede mostrar el VDC este modo? Pues depende, se verá después.
Pasamos a centrarnos en el VDC y al final del artículo volveremos a acabar de comentar algunas cosas de los otros sistemas mencionados.
Los modos de visualización del VDC
Como se ha mencionado, el VDC sólo tiene modos de alta resolución, pero sí tiene visualización alfanumérica, además de la visualización de bitmap.
El modo bitmap del VDC tiene celdas de color, dos colores diferentes entre los 16 de la paleta, por celda. Es por tanto, muy parecido al modo bitmap de alta resolución del C64. Que a su vez se refiere a veces como "modo Spectrum", por el parecido con el bitmap del Sinclair Spectrum.
Quien haga las cuentas verá que son necesarios más de 16 kB, concretamente 18 kB. Los que estén acostumbrados al C128 sabrán que el ordenador estándar tenía 16 kB, de memoria de video VDC, y que se pueden ampliar a 64 kB. El modelo C128 DCR sí llevaba 64 kB de serie.
Por ello hay un modo bitmap monocromo, de 640x200 sin celdas de color, que requiere 16 kB justos y utiliza, por ejemplo, el entorno operativo gráfico GEOS para C128 en 80 columnas.
El modo alfanumérico también tiene celdas de color, pero por desgracia sólo los pixels en primer plano toman un color diferencia por celda. Es un modo parecido al que usa el C64 al arrancar. Los pixels del fondo toman todos un mismo color. Los otros bits de atributos se gastan en cosas como el subrayado, el parpadeo o el set de caracteres (pueden visualizarse los dos sets, 512 caracteres, a la vez).
Demo de Boulder Dash de Pyrofer, en modo alfanumérico, 80x50 caracteres entrelazado, 16 kB. Es el aspecto que cabe esperar si un modo gráfico tiene un color de fondo común para todas las celdas (en este caso, negro).
Modos bitmap
¿Puede entonces reproducirse en el VDC el modo CGA de 160x100 en 16 colores? Pues sí, pero no utilizando el modo alfanumérico sino el modo bitmap. No se "malgastan" 8 kB como en CGA, sino 16 kB. En conjunto requiere 24 kB, y por tanto no va en un VDC de 16 kB. Esto se molestó en explicarlo en un video el canal The 8 bit theory. La imagen siguiente es el ejemplo que utiliza esta persona.
Puede hacerse algo parecido que entre en 16 kB si se reducen las dimensiones de la zona visible a 128x80. La imagen siguiente es un ejemplo. Es una imagen que he intentado hacer yo utilizando el programa GIMP, intentando importar un trozo de una imagen de Railroad Tycoon. Lo comento más tarde en el apartado "Haciendo pinitos con el VDC". The 8 bit theory utiliza un programa que se llama Pro Motion NG.
Pero puesto que se está utilizando el modo de bitmap no hay porqué ceñirse a las restricciones del modo alfanumérico en CGA que, resumiendo, consiste en usar sólo dos pixels por celda de color, teniendo estas celdas 8 pixels en horizontal y 2 vertical. Aquí hay una explicación técnica en lo referente a CGA.
En resumidas cuentas, VDC puede tener algo de compatibilidad con CGA, pero viene con cargas, y más vale crear el arte desde cero adaptándose a las restricciones propias.
Llegados a este punto, alguien que conozca CGA o haya empezado a estudiarlo en los links anteriores, sabrá que el truco se basa en utilizar celdas de color de 8x2 pixels, más bajas que las celdas de 8x8 que estamos acostumbrados en Spectrum o en Commodore. Otros ordenadores utilizan celdas bajas, por ejemplo el Thomson y el Oric, de 1 pixel de altura.
De hecho The 8-bit theory se viene arriba y piensa que con un poco de gracia y aceptando algo de color clash es posible convertir imágenes EGA de 640x200 en 16 colores. Dedica varios vídeos a ello, en este primero explica además cómo usa el ProMotion NG. Ese modo gráfico se utilizó bastante en juegos de PC a finales de los 80, porque a pesar de requerir una tarjeta gráfica compatible EGA el monitor podía ser del estándar anterior, CGA.
Restringiendo las dimensiones a 512x160 para que puedan funcionar en un C128 "stock" con VDC de 16 Kb, yo creo que es el modo que se utiliza por ejemplo en el juego Hose it Out Deluxe.
Como se ha comentado anteriormente, la memoria dedicada hace lento utilizar el VDC. Supongo que lo que hace este juego posible es la facilidad estilo blitter que tiene para mover bloques de memoria.
Entrelazado
Una característica que tiene el VDC es que puede sacar video entrelazado, o sea puede doblar la resolución vertical hasta las 400 líneas. Es un sistema que trata de sacar más resolución vertical en sistemas con señal de video de 15kHz, a cambio se nota un parpadeo, el VGA acabó con él. Estoy escribiendo esto sin tener mucha idea. Por aportar algo más, el C64 no soporta entrelazado (en esa carencia se fundamenta la mezcla de colores para conseguir más), pero el Commodore 16/+4 se ve que sí.
Pero el caso es que tiene algunas implicaciones interesantes, que se muestran en el blog y canal de video de I Dreamt in 8 bits.
- Se puede hacer arte PETSCII o ANSI en pantalla de 80x50, con el aspect ratio del C64, pero el doble de anchura y la altura, como el editor para C128 VDC Screen Editor de I Dream in 8 bits. La imagen siguiente es obra de Wbochar / Triad.
- En modo de bitmap se pueden meter 4 imágenes tipo Spectrum juntas, en los binarios de las imágenes de disco D71 y D81 incluidas en el link anterior hay ejemplos. Este vídeo explica cómo usar VDC Screen Editor para este fin.
Demoescena
Hay algo más de demoescena del VDC que trata de demostrar más capacidades del VDC. Por ejemplo, recortando la anchura de la pantalla del VDC de 80 a 60 columnas (480 pixels en horizontal) se libera el tiempo necesario para que las celdas de color queden reducidas a una altura de una única línea o pixel (celdas de 8x1 pixels).
Una "slideshow" famosa por mostrar imágenes que aprovechan ese mecanismo y otras imágenes en otras resoluciones peculiares es VDCmodemania de Tokra. Aparentemente algunas de esas resoluciones no se ajustan a las normas PAL o NTSC y sólo funcionan en algunos monitores.
Otra "slideshow" famosa que ahonda en la conexión con el ZX Spectrum es Colour Spectrum de Crest. Porque además de que Spectrum y VDC están limitados a alta resolución y celdas de color, resulta que la paleta de colores es la misma: a diferencia de CGA, que usa color marrón, en Commodore usan dos tonos de amarillo, como en el Spectrum (es cosa del monitor 1084, no del C128). Corre en el emulador VICE, pero hay que configurarlo para que use amarillo oscuro y no marrón. No necesita 64 kB de VDC.
La demo Raisen from Oblivion es la primera que salió y de las pocas demos propiamente dichas que existen. No me ha funcionado en VICE.
Juegos en VDC: es interesante este artículo en que el autor explica el port de Amaurote a C128 con salida VDC. Como explica, la versión C64 de ese juego usa la mayor velocidad de CPU en el borde de la imagen si está disponible (corriendo en un C128). Pero le pareció interesante pasar el juego a VDC. Hay otros ports de juegos isométricos a VDC de otro autor: Knight Lore, Gunfright, Alien 8, Pentagram. Todos estos juegos tienen versiones para C64/C128 que funcionan con el VIC.
También hay juegos que usan doble pantalla, la salida del VDC para mostrar un mapa: Eye of the Beholder, PETSCII Robots.
En el foro del C128 se tratan diferentes temas, no necesariamente bien ordenados, aquí dejo el enlace al foro.
Hacer pinitos con el VDC
Aquí voy a comentar mis pinitos, concretamente el programa de The 8-bit theory sobre el "modo CGA", las modificaciones que hice para usar una imagen más pequeña que cupiera en 16 kB.
Si os descargáis la imagen de disco con ejemplos de dicho canal podéis ejecutar los ejemplos y ellos mismos descargan el VDCBASIC. Pero si queréis listar los programas sin ejecutarlos primero tendréis que ejecutar VDCBASIC porque si no se listan mal. Es la instrucción:
BLOAD"VDCBASICAC6.BIN",B0,U8:SYSDEC("AC6")
El listado del programa VDCLORES2, que es un poco el definitivo, es el siguiente:
En la instrucción 20 carga VDCBASIC es una dirección de memoria que no interfiere con los programas BASIC. En la instrucción 35 carga un poco a lo bestia en memoria RAM el binario de 8 kB, con los datos de la imagen. Las instrucciones 1 a 7 le sirven un poco para ver si el binario interfiere con el BASIC. La instrucción 100 copia ese binario al VDC. La instrucción 46 prepara los 16 kB de memoria que se malgastan en ese modo. El resto de instrucciones 40-48 preparan los registros del VDC.
Adjunto una imagen de disco con ese programa modificado para que acepte imágenes de 128x80, de 5 kB, más pequeñas pero que caben en un VDC de 16 kB.
Para preparar nosotros una imagen con el GIMP para convertir, los pasos son los siguientes:
- Recortar la imagen para que se corresponda con los 160x100 pixels (64k VDC) o 128x80 pixels (VDC estándar).
- Importar la imagen en GIMP, antes o después de recortar la imagen, según vuestras preferencias.
- Importar la paleta CGA, es un fichero gpl. La adjunto en el mismo Zip. Me la he encontrado por internet, quizá sería mejor la paleta VDC auténtica.
- Eliminar canal alfa.
- Convertir a modo indexado.
- Abrir consola python-fu, copiar y pegar script para exportar el binario para C128. Lo adjunto en el mismo zip.
- Ejecutar el script, poniendo la ruta donde queráis que se cree el binario.
Con el binario preparado tenéis que trabajar un poco en el entorno del C128:
- Con Dirmaster o así, meter el binario en la imagen D64 donde está VCLORESCP, VDCBASIC.
- Cambiar la línea 35 para que concuerde el nombre del binario.
Es bastante probable que al cambiar a la paleta de 16 colores la imagen importada pierda todo el encanto. Podéis entonces intentar recuperarlo editando pixel por pixel (haciendo pixel-art). El GIMP hace eso una tarea muy cómoda. Yo lo he intentado sin mucho éxito con la imagen importada del Railroad Tycoon, quizá por falta de práctica.
Descargas
En este enlace podréis encontrar un archivo Zip con la imagen de disco del canal The 8-bit theory, otras dos imágenes de disco con las dos imágenes que se muestran en este artículo, de 128x80, así como el texto que tenéis que copiar y pegar en la consola de GIMP para exportar vuestras imágenes siguiendo los pasos que enumeré arriba. También está el juego rockfall de Pyrofer.
Recapitulación
Podréis observar que he sacado la mayoría de la información del canal The 8-bit theory y además de lo comentado sobre modos de vídeo, también ha hecho experimentos con scroll por hardware (aparentemente con poco éxito para el esfuerzo dedicado) y sprites por software (pero utilizando la copia de bloques de memoria por hardware). Seguiré siguiendo ese canal. De hecho ya puse un post en Commodoremanía explicando su canal.
Otras personas han hecho cosas en VDC, como Pyrofer, Tokra, xahmol (I Dreamt in 8 bits), pero quizá no están tan activas ahora.
En la época sí me gustaba el VDC pero ahora no me interesa especialmente, así que a los que tengáis C128 no recomiendo ampliar el VDC a 64 kB. No creo que valga la pena para lo que hay. Sin embargo voy a seguir de cerca lo que vaya saliendo.
Algunas de las cosas que explico podrían estar mal. Sería debido a que el BBC Micro lo he tocado poco, el Amstrad me importa un comino, etc. Podéis poner vuestros comentarios.
Otras cosas de otros ordenadores con 6845
Un juego que salió para muchas tarjetas gráficas de IBM PC, desde las más viejas, es Simcity, en este blog. Podéis ver un poco las diferencias entre los modos gráficos del IBM.
Programar en CGA
Para el modo de 160x100x16 colores hay en Github de un programa que os puede servir de tutorial, es cgax16demo.
Yo también hice mis pinitos, un juego en C para VIC20 y C16 llamado Tomatoworm que cambiando pocas cosas pude hacer funcionar en PC XT. Hay que decir que, probado en un Amstrad PC1512 real, no quedan los pixels de colores tan bien delimitados como en la emulación. Pero podría ser un problema del PC1512 que no apareciera en un monitor CGA real.
Memoria de video
Otra de las características que diferencian los sistemas es cómo se ordenan en la memoria los bits que representan los diferentes pixels.
Los que estén acostumbrados al C64 sabrán que los caracteres en la pantalla están ordenados de izquierda a derecha y de arriba abajo, correspondiendo el carácter en la esquina superior izquierda a la posición 1024, y el carácter en la esquina inferior derecha a la posición 1024+999.
Algunos también sabrán que el modo bitmap se organiza en celdas en las mismas ubicaciones que los caracteres mencionados en el párrafo anterior. Las celdas se ordenan también de izquierda a derecha y de arriba abajo, pero cada celda toma 8 bytes en vez de uno. La celda que estaría en la posición n relativa a la esquina superior izquierda toma los bytes 8n, 8n+1, …, 8n+7, relativos a la dirección base de la memoria de video.
Pues bien, en el BBC Micro/Electron la memoria está ordenada de la misma manera.
En el Amstrad CPC los 8 bytes de cada celda en vez de estar en direcciones de memoria consecutivas están separados en bloques de 2 kB. Como se comenta en esta página es relativamente fácil intuir cómo se ordenan los bytes al cargar un gráfico bitmap desde cassette Ver explicación en cpcmania.
En la tarjeta CGA los bytes de una pantalla bitmap se ordenan de izquierda a derecha y de arriba abajo, pero en dos bloques de 8 kB. Las líneas pares van a un bloque y las impares a otro. No hay celdas que jueguen ningún papel de ordenación.
Modos gráficos del CPC 0 160x200 16 1 320x200 4 2 640x200 2
Estructura de memoria (16k, 80 columnas, 40 bytes) 0 1 ... 79 2000 2001 ... 2079 4000 4001 ... 4079 6000 6001 ... 6079 8000 8001 ... 8079 10000 10001 ... 10079 12000 12001 ... 12079 14000 14001 ... 14079 80 81 ... 159 2080 2081 ... 2159 4080 4081 ... 4159 6080 6081 ... 6159 8080 8081 ... 8159 10080 10081 ... 10159 12080 12081 ... 12159 14080 14081 ... 14159 ... 1920 1921 ... 1999 3920 3921 ... 3999 5920 5921 ... 5999 7920 7921 ... 7999 9920 9921 ... 9999 11920 11921 ... 11999 13920 13921 ... 13999 15920 15921 ... 15999
Modos gráficos del BBC Micro 0 bitmap 640x256 2 20 1 bitmap 320x256 4 20 2 bitmap 160x256 "16" 20 3 "alfanumerico" 80x25* 2 16 4 bitmap 320x256 2 10 5 bitmap 160x256 4 10 6 "alfanumerico" 40x25* 2 8 7 TELETEXTO alfanumerico 40x25 "16" 16
Estructura de memoria (modos 10k, 40 columnas, 40 bytes) 0 8 ... 312 1 9 ... 313 2 10 ... 314 3 11 ... 315 4 12 ... 316 5 13 ... 317 6 14 ... 318 7 15 ... 319 320 328 ... 336 321 329 ... 337 322 330 ... 338 323 331 ... 339 324 332 ... 340 325 333 ... 341 326 334 ... 342 327 335 ... 343
1 Comentarios
Deberías infórmarte más de las características técnicas del c64, hubieron modelos de c64 con memoria contended que no podían programarse como los normales, venían con un switch de memoria estilo mux que automáticamente subía el basic a esas posiciones de memoria, si nomse pokeaba antes en el loader el juego iba un 15% más lento por las sincronizaciones entre el chip gráfico y la salida de video,al cga le pasaba algo parecido en los primeros pcs
ResponderEliminar