En las entradas anteriores hemos revisado las funcionalidades principales del VIC. El objetivo de esta entrada es hacer un repaso sistemático de sus registros, para que sirva de referencia, y para prepararnos ya para cambiar de temática y pasar a tratar la música y el sonido con el SID.
Además de indicar las direcciones de los registros, indicaremos sus nombres según el libro “Mapping the Commodore 64”.
Los registros principales del VIC son:
REGISTRO | DIRECCIÓN | FUNCIÓN |
SP0X, SP0Y, SP1X, SP1Y, … | $d000 – $d00f | Coordenadas X e Y de los ocho sprites. |
MSIGX | $d010 | Bits más significativos de las coordenadas X de los ocho sprites. |
SCROLY | $d011 | Bits 0, 1 y 2: Scroll en la dirección Y.
Bit 3: Modo 24 o 25 filas (1=25, 0=24). Bit 4: Blanqueo de pantalla (0=blanqueo). Bit 5: Modo bitmap (1=activo). Bit 6: Modo carácter con color de fondo extendido (1=activo). Bit 7: Bit más significativo –bit 8– del RASTER ($d012). |
RASTER | $d012 | Bits 0 – 7 del RASTER. |
SPENA | $d015 | Bits para activar / desactivar los ocho sprites (1=activo). |
SCROLX | $d016 | Bits 0, 1 y 2: Scroll en la dirección X.
Bit 3: Modo 38 o 40 columnas (1=40, 0=38). Bit 4: Modo bitmap multicolor (1=activo). |
YXPAND | $d017 | Bits para expandir los ocho sprites en la dirección Y (1=expandido). |
VMCSB | $d018 | Bits 1, 2 y 3: Ubicación de los 2K de los juegos de caracteres personalizados.
Bit 3: Ubicación de los 8K del bitmap. Bits 4, 5, 6 y 7: Ubicación de la RAM de pantalla. |
VICIRQ | $d019 | Información sobre las interrupciones VIC generadas:
Bit 0: RASTER. Bit 1: Colisión sprite – fondo. Bit 2: Colisión sprite – sprite. Bit 3: Lápiz óptico. Bit 7: Cualquier fuente. |
IRQMSK | $d01a | Programación de las interrupciones del VIC:
Bit 0: RASTER. Bit 1: Colisión sprite – fondo. Bit 2: Colisión sprite – sprite. Bit 3: Lápiz óptico. |
SPBGPR | $d01b | Bits para controlar la prioridad entre sprites y fondo (0=sprite, 1=fondo). |
SPMC | $d01c | Bits para controlar el multicolor de los ocho sprites (1=multicolor). |
XXPAND | $d01d | Bits para expandir los ocho sprites en la dirección X (1=expandido). |
SPSPCL | $d01e | Bits para controlar las colisiones sprite – sprite (1=sí). |
SPBGCL | $d01f | Bits para controlar las colisiones sprite – fondo (1=sí). |
EXTCOL | $d020 | Color del borde de la pantalla. |
BGCOL0 | $d021 | Color de fondo 0. |
BGCOL1 | $d022 | Color de fondo 1. |
BGCOL2 | $d023 | Color de fondo 2. |
BGCOL3 | $d024 | Color de fondo 3. |
SPMC0 | $d025 | Color compartido 0 de los sprites multicolor. |
SPMC1 | $d026 | Color compartido 1 de los sprites multicolor. |
SP0COL, SP1COL, … | $d027 – $d02e | Colores propios de los ocho sprites. |
El VIC tiene algún registro adicional, y alguno de los registros vistos también tiene algún bit adicional, pero lo recogido en la tabla de arriba es más del 90%.
Y a partir de ahora, música y sonido…
Hola.
Los registros LPENX = $d013 y LPENY = $d014 son para conocer la posición del lápiz óptico.
En la entrada https://programacion-retro-c64.blog/2020/01/21/funcionamiento-del-lapiz-optico/ se hace una descripción de su funcionamiento.
Saludos, HVSW.
Me gustaMe gusta
Hola de nuevo.
Un uso interesante de VMCSB, concretamente de sus bits 4 – 7, consiste en hacer scroll avanzado.
El scroll descrito en:
es un scroll sencillo. Cuando ya se ha desplazado la pantalla 8 pixels a la izquierda o la derecha, hay que mover toda la pantalla una columna a la izquierda o derecha, y meter los datos nuevos por el otro extremo. Hacer esto directamente sobre la «pantalla visible» ($0400 – $07e7) puede notarse.
Una alternativa consiste en usar «dos pantallas», una que se está viendo (ej. $0400 – $07e7) y otra que está oculta (ej. $3c00 – $3fe7).
La que se está viendo es la que desplazamos pixel a pixel a izquierda o derecha, y la que no se está viendo es la que copiamos una columna a la izquierda o derecha. Además, esta copia no hace falta hacerla de golpe tras haber «escroleado» 8 pixels; se puede ir copiando poco a poco, a razón de 1000 / 8 = 125 bytes por cada desplazamiento de pixel.
Por último, cuando ya se han «escroleado» 8 pixels y ya toca mover toda la pantalla una columna a izquierda o derecha, en vez de ponernos a copiar en ese momento, como ya tenemos el trabajo hecho sobre la «pantalla oculta», lo que hacemos es conmutar de la «pantalla visible» a la «pantalla oculta» actuando sobre el registro VMCSB.
Este tipo de scroll se llama «scroll de doble buffer», y es mucho más suave que el scroll normal, porque se evita copiar 1000 caracteres de golpe tras haber desplazado 8 pixels. Esa copia se puede ir haciendo poco a poco, en cada desplazamiento de pixel y, además, se hace sobre una pantalla o buffer que todavía no se ve.
Interesante…
Saludos, HVSW.
Me gustaMe gusta