El controlador de pantalla de video 8563 ( VDC ) era un circuito integrado producido por MOS Technology . Se utilizó en la computadora Commodore 128 (C128) para generar una pantalla de video RGB de 80 columnas (640 × 200 píxeles ) , que se ejecutaba junto con un VIC-II que admitía gráficos compatibles con Commodore 64. Los modelos DCR (así como algunos modelos D) del C128 usaban el controlador 8568 [D]VDC posterior y técnicamente más avanzado .
Originalmente pensado para un ordenador empresarial basado en UNIX planeado (pero no lanzado) basado en el Zilog Z8000 , Commodore diseñó el VDC en varias máquinas prototipo. De ellas, solo el Commodore 128 llegó a producirse. A diferencia de los chips de vídeo MOS anteriores, como el popular VIC-II, el VDC tenía memoria de vídeo dedicada, 16 kilobytes (16.384 bytes; ampliable a 64 kilobytes, 65.536 bytes) en el C128 original o "plano" y 64 kilobytes en el C128DCR . Esta RAM no era accesible directamente por el microprocesador .
El 8563 fue más difícil de producir que la mayoría del resto de la línea de MOS Technology y los rendimientos iniciales fueron muy bajos. Las primeras unidades también tenían importantes problemas de fiabilidad y tendían a autodestruirse por sobrecalentamiento. [1] Además, había problemas de sincronización con el VDC que provocaban un mal funcionamiento de las operaciones de carga y almacenamiento indirectas en sus registros.
Oficialmente, el VDC era un chip de solo texto, aunque una lectura cuidadosa de la literatura técnica de MOS Technology que se entregó a los primeros desarrolladores del C128 indicó que era posible un modo de mapa de bits de alta resolución ; simplemente no se describía con ningún detalle. BASIC 7.0 , el lenguaje de programación integrado del C128, solo admitía gráficos de alta resolución en modo de 40 columnas a través del chip VIC-II heredado.
Poco después del lanzamiento del C128, el modo de mapa de bits del VDC se describió con considerable detalle en el libro de Data Becker "Commodore 128 - Das große GRAFIK-Buch" (publicado a fines de 1985 en los Estados Unidos por Abacus Software), y los autores alemanes Klaus Löffelmann y Dieter Vüllers proporcionaron un programa en lenguaje ensamblador en el que era posible establecer o borrar cualquier píxel o, usando BASIC para realizar los cálculos necesarios, generar formas geométricas en mapa de bits en la pantalla de 80 columnas. [2] En febrero de 1986, menos de un año después del lanzamiento del Commodore 128 , la revista RUN publicó " Ultra Hi-Res Graphics ", un artículo que describía el modo de mapa de bits del VDC e incluía un programa de escritura en línea (escrito en lenguaje ensamblador 8502 ) que ampliaba las capacidades de BASIC 7.0 para admitir gráficos de alta resolución de 640 × 200 utilizando el 8563.[1] Los autores Lou Wallace y David Darus desarrollaron más tarde la utilidad Ultra Hi-Res en un paquete comercial, BASIC 8. Una de las utilidades de terceros más populares para el C128, que ofrecía capacidades de alta resolución de VDC más avanzadas a una amplia audiencia de programadores.
Commodore finalmente ofreció documentación oficial completa sobre el VDC en la Guía de referencia del programador de Commodore 128. Los modos de mapa de bits del VDC se usaron ampliamente en la versión C128 del sistema operativo GEOS .
El VDC carecía de capacidades de sprites , lo que limitaba su uso en aplicaciones de juegos . Sin embargo, sí contenía capacidades de blitting para realizar de forma autónoma copias de memoria de bloques pequeños dentro de su RAM de video dedicada. Mientras el VDC realiza dicha copia, la CPU del sistema puede continuar ejecutando código, siempre que no se intenten otros accesos al VDC antes de que finalice la copia. Estas funciones fueron utilizadas por la ROM del editor de pantalla del C128 para desplazarse rápidamente o borrar secciones de la pantalla.
* Esto se aplica únicamente a los monitores C128 de 60 Hz de EE. UU. Los monitores C128 de 50 Hz emiten una señal con una frecuencia de actualización vertical de 50 Hz. Aunque no cumplen con el estándar CGA, la mayoría de los monitores CGA podían mostrar la señal de 50 Hz sin problemas. Sin embargo, algunos monitores no lograban resolver la señal o lo conseguían, pero tarde o temprano sus circuitos de deflexión fallaban debido a estrés eléctrico o térmico, lo que requería reparación.
El acceso a los registros internos y a la memoria de vídeo dedicada del VDC debe realizarse por medios indirectos. En primer lugar, el programa debe indicar al VDC a cuál de sus 37 registros internos se debe acceder. A continuación, el programa debe esperar hasta que el VDC esté listo para el acceso, después de lo cual se puede realizar una lectura o escritura en el registro interno seleccionado. El siguiente código ensamblador es típico de una lectura de registro:
ldx # regnum ; registro VDC para acceder a stx $d600 ; escribir en el registro de control loop bit $d600 ; verificar bit 7 del registro de estado bpl loop ; VDC no listo lda $d601 ; leer desde el registro VDC ...
El siguiente código es típico de una operación de escritura de registro:
ldx # regnum ; registro VDC para escribir en stx $d600 ; escribir en el registro de control loop bit $d600 ; verificar bit 7 del registro de estado bpl loop ; VDC no listo sta $d601 ; escribir en el registro VDC ...
Lo mismo es posible en lenguaje BASIC , llamando a rutinas KERNAL específicas :
Este código es típico de una lectura de registro VDC, donde ⟨ registro ⟩ es un número entre 0 y 36, como se muestra a continuación.
BANK15 ... SYS DEC ( "CDDA" ),, registro : RREG VDC REM $ccda también conocido como 52698 en decimal PRINT VDC ...
Este código es típico de una escritura de registro VDC, donde ⟨ registro ⟩ es un número entre 0 y 36, y ⟨ valor ⟩ es un número entre 0 y 255, que desea colocar en ese registro.
BANK15 ... SYS DEC ( "CDCC" ) , valor , registro REM $ccdc también conocido como 52684 en decimal ...
Debido a este método un tanto engorroso de controlar el VDC, la velocidad máxima de cuadros posible en modo de mapa de bits generalmente es demasiado lenta para los videojuegos de acción estilo arcade, en los que se requiere una manipulación intensiva en bits de la pantalla.
En el modo de texto estándar, el VDC se comporta de forma muy similar al VIC-II, excepto que tiene 2k de memoria de pantalla en lugar de 1k. La configuración predeterminada de encendido coloca la memoria de pantalla en $0-$7FF
y la memoria de color en $800-$9FF
y se pueden mover a cualquier lugar en la memoria del VDC siempre que esté en un límite de 2k. Los atributos se manejan como el modo de alta resolución del VIC-II con un color de fondo global y el color de primer plano de cada carácter configurado individualmente según la RAM de color. Además de los datos de color, esta última también contiene datos de atributos para cada carácter. El bit 4 hace que el carácter parpadee si está habilitado, el bit 5 produce caracteres subrayados y el bit 6 invierte el patrón de mapa de bits del carácter. El bit 7 habilita el conjunto de caracteres alternativos. El VDC puede usar hasta 512 caracteres. Cuando se habilita el indicador de carácter alternativo para un carácter determinado, el patrón de caracteres se extraerá de los caracteres 256 a 511. Por lo tanto, si se muestra el carácter 65, al habilitar el indicador de carácter alternativo se mostrará el carácter 321 en su lugar. La bandera de caracteres alternativos se utiliza normalmente cuando está configurado el modo mayúsculas/minúsculas: la bandera está habilitada para todas las posiciones de pantalla VDC, lo que hace que se muestren el conjunto de caracteres mayúsculas/minúsculas y sus versiones de video inversas en lugar del conjunto de caracteres mayúsculas/gráficos predeterminado.
El VDC no utiliza una ROM de caracteres, en su lugar, los patrones de la ROM de caracteres del VIC-II simplemente se copian en la RAM del VDC como parte de la inicialización de encendido del C128, incluidos los patrones para caracteres de video inverso, aunque el VDC es capaz de invertir caracteres en hardware. Los patrones de caracteres ocupan 16 bytes en lugar de 8 para almacenarse, ya que el VDC tiene una altura de caracteres ajustable. Dado que la pantalla tiene 25 líneas, en la práctica la altura de caracteres está limitada a 8 líneas, lo que significa que la mitad del espacio para los datos de caracteres queda sin usar y se desperdicia. La configuración predeterminada de encendido coloca los datos de caracteres en $2000-$3FFF
. $2000-$23FF
contienen los patrones para los caracteres en mayúsculas/gráficos, $2C00-$33FF
los caracteres en mayúsculas/minúsculas, mientras que $2400-$2BFF
y $3400-$3FFF
contienen los patrones de video inverso para cada conjunto. El usuario puede definir libremente cualquier carácter personalizado y asignarlos a la memoria del VDC.
Esta información fue adaptada de la Guía de referencia del programador del Commodore 128 [3]
Registro | Hexadecimal | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Descripción |
---|---|---|---|---|---|---|---|---|---|---|
0 | $00 | HT7 | HT6 | HT5 | HT4 | HT3 | HT2 | HT1 | HT0 | Total horizontal |
1 | $01 | HD7 | HD6 | HD5 | HD4 | HD3 | HD2 | HD1 | HD0 | Visualización horizontal |
2 | $02 | HP7 | HP6 | HP5 | HP4 | HP3 | HP2 | HP1 | HP0 | Posición de sincronización horizontal |
3 | $03 | VW3 | VW2 | VW1 | VW0 | HW3 | HW2 | HW1 | HW0 | Ancho de sincronización vertical/horizontal |
4 | $04 | VT7 | VT6 | VT5 | VT4 | VT3 | VT2 | VT1 | VT0 | Total vertical |
5 | $05 | — | — | — | VA4 | VA3 | VA2 | VA1 | VA0 | Ajuste vertical |
6 | $06 | VD7 | VD6 | VD5 | VD4 | VD3 | VD2 | Enfermedad venérea 1 | VD0 | Visualización vertical |
7 | $07 | VP7 | VP6 | VP5 | VP4 | VP3 | VP2 | Vicepresidente 1 | VP0 | Posición de sincronización vertical |
8 | $08 | — | — | — | — | — | — | IM1 | yo soy0 | Modo entrelazado |
9 | $09 | — | — | — | — | CTV4 | CTV3 | CTV2 | CTV1 | Carácter Total Vertical |
10 | $0A | — | CM1 | CM0 | CS4 | CS3 | CS2 | CS1 | CS0 | Modo cursor, iniciar escaneo |
11 | $0 mil millones | — | — | — | CE4 | CE3 | CE2 | CE1 | CE0 | Línea de escaneo final del cursor |
12 | $0C | DS15 | DS14 | DS13 | DS12 | DS11 | DS10 | DS9 | DS8 | Mostrar byte alto de dirección de inicio |
13 | $0D | DS7 | DS6 | DS5 | DS4 | DS3 | DS2 | DS1 | DS0 | Mostrar dirección de inicio de byte bajo |
14 | $0E | CP15 | CP14 | CP13 | CP12 | CP11 | CP10 | CP9 | CP8 | Byte alto de posición del cursor |
15 | $0F | CP7 | CP6 | CP5 | CP4 | CP3 | CP2 | CP1 | CP0 | Byte bajo de posición del cursor |
16 | $10 | LPV7 | LPV6 | LPV5 | LPV4 | LPV3 | LPV2 | LPV1 | LPV0 | Posición vertical del lápiz óptico |
17 | $11 | LPH7 | LPH6 | LPH5 | LPH4 | LPH3 | LPH2 | LPH1 | LPH0 | Posición horizontal del lápiz óptico |
18 | $12 | UA15 | UA14 | UA13 | UA12 | UA11 | UA10 | UA9 | UA8 | Actualizar dirección de byte alto |
19 | $13 | UA7 | UA6 | UA5 | UA4 | UA3 | UA2 | UA1 | UA0 | Actualizar dirección de bytes bajos |
20 | $14 | AA15 | AA14 | AA13 | AA12 | AA11 | AA10 | AA9 | AA8 | Dirección de inicio del atributo Byte alto |
21 | $15 | AA7 | AA6 | AA5 | AA4 | AA3 | AA2 | AA1 | AA0 | Dirección de inicio del atributo Byte bajo |
22 | $16 | CTH3 | CTH2 | CTH1 | CTH0 | CDH3 | CDH2 | CDH1 | CDH0 | Carácter total horizontal, carácter de visualización horizontal |
23 | $17 | — | — | — | CDV4 | CDV3 | virus de la corona 2 | virus de la corona 1 | CDV0 | Visualización de caracteres verticales |
24 | $18 | COPIAR | RVS | CBRATO | VSS4 | VSS3 | VSS2 | VSS1 | VSS0 | Desplazamiento vertical suave |
25 | $19 | TEXTO | ATR | SEMI | Doble B | HSS3 | HSS2 | HSS1 | HSS0 | Desplazamiento horizontal suave |
26 | $1A | FG3 | GF2 | GF1 | FG0 | BG3 | BG2 | BG1 | BG0 | Color de primer plano/fondo |
27 | $1 mil millones | AI7 | AI6 | AI5 | AI4 | AI3 | AI2 | AI1 | AI0 | Incremento de dirección por fila |
28 | $1C | CB15 | CB14 | CB13 | RAM | — | — | — | — | Dirección base del personaje |
29 | $1D | — | — | — | UL4 | UL3 | UL2 | UL1 | UL0 | Subrayar línea de escaneo |
30 | $1E | WC7 | WC6 | WC5 | WC4 | WC3 | WC2 | WC1 | WC0 | Recuento de palabras |
31 | $1F | DA7 | DA6 | DA5 | DA4 | DA3 | DA2 | DA1 | DA0 | Registro de datos |
32 | $20 | BA15 | BA14 | BA13 | BA12 | BA11 | BA10 | BA9 | BA8 | Dirección de inicio del bloque Byte alto |
33 | $21 | BA7 | BA6 | BA5 | BA4 | BA3 | BA2 | BA1 | BA0 | Dirección de inicio del bloque Byte bajo |
34 | $22 | DEB7 | DEB6 | DEB5 | DEB4 | DEB3 | DEB2 | DEB1 | DEB0 | Habilitar pantalla Comenzar |
35 | $23 | DEE7 | DEE6 | DEE5 | DEE4 | DEE3 | DEE2 | DEE1 | DEE0 | Habilitar pantalla Finalizar |
36 | $24 | — | — | — | — | RRD3 | RRD2 | RRD1 | RRD0 | Frecuencia de actualización de DRAM |