VIC-veinte...ando con un ZX Spectrum o del Basic 2.0 al Basic Sinclair (2DA. PARTE) Comparando el VIC-20 con el ZX Spectrum En la primera parte de este artículo, traté sobre el emulador TWENTY COMMODES y el BASIC 2.0 del VIC=20. Ahora pasamos a ver sus capacidades gráficas y sonido, para su comparación con las del Spectrum. Para empezar, cualquiera que haya visto y tratado de comparar un listado Basic de Commodore y uno del Spectrum, notará que el de Commodore es menos legible de entender, debido a que por un lado se omiten los espacios para ahorrar memoria y por otro, tiene muchos caracteres especiales dentro de sus líneas PRINT para el manejo de la pantalla y el posicionado del cursor de texto. Así como hartos POKEs y PEEKs para todo lo demás. A menos que uno sea un usuario habitual de Commodore, el listado de un programa puede verse todo, menos entendible. Un programa en Basic estandar, es facil de adaptar de una máquina a otra, pero el Basic 2.0 es todo, menos estandar, cuando se trata de manejo de sonido, gráficos y texto en pantalla. Debido a eso, para los listados ejemplos en este texto, vamos a usar las sigtes. abreviaciones, las cuales tratan de aproximarse a los códigos que uno encuentra en los programas Basic originales del Commodore: N = negro S = cursor a inicio R = reverso B = blanco H = limpia pantalla (SH+S) _ = normal £ = rojo ] = cursor derecha I = insertar C = cian | = curs. izq. V = verde Q = curs. abajo SH = SHIFT A = azul ^ = cur. arriba CT = CONTROL Y = amarillo D = borrar C= = tecla Commodore I - GRAFICOS Y COLOR I.a) Commodore en general Las sigtes. instrucciones son comunes a todas las máquinas de Commodore: CLS Clear Screen (borrar pantalla), típica de muchas versiones de Basic. El Basic de Commodore carece de esta sentencia, pero la reemplaza por: H (como comando directo) PRINT"H (dentro de lineas PRINT) ? CHR$(147) (como comando y sentencia dentro de programas) Equivalente en el Spectrum: CLS HOME El Basic de Apple la usa en vez de CLS, pero Commodore la usa para ir al inicio de la pantralla sin borrar nada. Y se obtiene así: S (como comando directo) PRINT"S (dentro de lineas PRINT) ? CHR$(19) (como comando y sentencia dentro de programas) En el Basic Sinclair: PRINT AT 0,0; CURSORES El Spectrum usa AT para posicionar el cursor de texto, mientras otros BASICs usan LOCATE (Microsoft), POSITION (Atari), HTAB y VTAB (Apple) o @ (Dragon). Commodore en cambio, eligió usar caracteres especiales dentro de PRINT, para ello. De este modo, tipear: PRINT"Q equivale a PRINTCHR$(16) - curs. abajo PRINT"] equivale a PRINTCHR$(29) - curs. derecha PRINT"| equivale a PRINTCHR$(157) - curs. izq. PRINT"^ equivale a PRINTCHR$(145) - curs. arriba En el Spectrum solamente CHR$ 8 (cursor hacia atras) funciona. Todo es con AT. Teclas de Función F1 - F8 Estas teclas están asociadas a los códigos CHR$ desde el 133 al 140. El Spectrum carece de teclas de función. I.b) VIC-20 Ahora pasamos a ver como el VIC maneja la pantalla. Su modo de texto, normalmente es de 22 x 23 (eso es 506 posiciones en pantalla), pero esto puede ser cambiado pokeando en las direcciones $9002 y $9003. Eso es 36866 y 36867, cuyos valores por defecto son 150 y 46. Su resolución máxima es de 184 x 176 pixeles. No tiene más modos gráficos. No oficialmente, pero la resolución del VIC puede incrementarse con los mismos POKEs que cambian el modo de texto. Ya que cambian la vertical y horizontal de la pantalla del chip VIC-I. La horizontal puede dar hasta 27 caracteres (216 pix.), pero la vertical puede asombrosamente llegar hasta los ¡35 caracteres! (280 pix.) El modo texto El posicionamiento del cursor en pantalla así como la impresión de caracteres se obtiene de dos modos, uno mediante PRINT (el cual ya vimos) y el otro es mediante POKEs, como lo veremos a continuación. POKE(7680+x+y*22),z Imprime en la pantalla el caracter z, en las posiciones x,y. Empezando por el área de memoria 7680 hasta la 8185. Si se desea un caracter inverso, basta con hacer z+128. Los valores de z a POKEar son: POKE Signo POKE Signo POKE Signo POKE Signo 0 @ 21 U 42 * 63 ? 1 A 22 V 43 + 64 en adelante 2 B 23 W 44 , hasta el 127 3 C 24 X 45 _ son todos 4 D 25 Y 46 . los símbolos 5 E 26 Z 47 / gráficos 6 F 27 [ 48 0 propios de 7 G 28 £ 49 1 Commodore 8 H 29 ] 50 2 128 en adelante 9 I 30 ↑ 51 3 son los mismos 10 J 31 ← 52 4 caracteres 11 K 32 espacio 53 5 pero en modo 12 L 33 ! 54 6 inverso 13 M 34 " 55 7 14 N 35 # 56 8 15 O 36 $ 57 9 16 P 37 % 58 : 17 Q 38 & 59 ; 18 R 39 ' 60 < 19 S 40 ( 61 = (-) 20 T 41 ) 62 > Solamente el ZX-81 puede replicar esto con: POKE Y*33+X+1+PEEK(16396)+PEEK(16397)*256,z El Spectrum en cambio usa "PRINT AT x,y;CHR$ z" en su lugar. Los colores Los colores también son seleccionados ya sea mediante PRINT o POKEs. Así: POKE36879,c El VIC-20 tiene 8 colores para el borde, 16 para papel o fondo, y 8 para tinta. negro 0 naranja 8 blanco 1 nar. claro 9 rojo 2 rosa 10 cyan 3 cyan claro 11 purpura 4 purp. claro 12 verde 5 verde claro 13 azul 6 azul claro 14 amarillo 7 amar. claro 15 de este modo la formula de c es: 8 + (16 * fondo) + borde. Al iniciar el VIC, el valor por defecto de c es 27, eso es 8 + 16 + 3. El Spectrum usa BORDER c, para cambiar el color del borde, pero puede usar tambien POKE 23624,(c*8) con la ventaja de que esto afecta los atributos de la parte inferior de la pantalla. PAPER c no afecta directamente al color de la pantalla, a menos que se haga un CLS enseguida. POKE(38400+x+y*22),n colorea el texto en la pantalla con el color n (un valor de 0 a 7). Empezando por el área de memoria 38400 hasta la 38905. Por defecto n es 6, al encender o reiniciar el sistema. El Spectrum usa INK n, para cambiar el color de toda la pantalla, así como también PRINT INK n; AT... si solo se desea afectar un texto en una posición dada. También se puede alterar los colores en pantalla mediante POKE 23693, pero esto afecta tanto al papel como a la tinta así como al brillo y parpadeo y al igual que PAPER, también requiere de un CLS para ser efectivo. Alta resolución Como ya fue mencionado más antes, el VIC-20 tiene una alta resolución de 184 x 176 pixeles accesibles mediante PEEKs y POKEs al igual que el color y textos en pantalla, pero no es tan facil de accesar en este caso. Debido a ello Commodore ofrecía un cartucho que añadía las sentencias para manejo de gráficos llamado SUPER EXPANDER, preo limitándolo a una resolución de tan solo 160x160. Con unas cuantas sentencias el VIC-20 ahora podía trazar puntos, líneas círculos y elipses del mismo modo que el ZX Spectrum lo hace desde el BASIC Sinclair con PLOT, DRAW y CIRCLE. II - SONIDO VIC-20 El VIC contiene cuatro generadores de tonos, que se controlan mediante: POKE 36874,N da un tono bajo (ALTO) POKE 36875,N una octava más alta (TENOR) POKE 36876,N otra octava más alta (SOPRANO) POKE 36877,N ruido donde: N puede ser un valor de 0 a255. Cualquier valor entre 0 y 127 produce silencio. 128 es la nota más baja, y 254 es la más alta. Nunca usar 255. El volumen es fijado con: POKE 36878,N donde N puede ser un valor de 0 a 15 para apagar o subir el volumen. El valor de N para las notas musicales aproximadas: -------------Octavas-------------- Nota Baja Media Alta Elevada c 135 195 225 240 c# 143 199 227 241 D 147 201 228 · D# 151 203 229 · E 159 207 231 no F 163 209 232 usadas F# 167 212 233 · G 175 215 235 · G# 179 217 236 · A 183 219 237 · A# 187 221 238 · B 191 223 239 · El Spectrum 48k solamente tiene un canal y 10 oct., accesibles mediante BEEP. El T/S-2068 tiene 3 canales de sonido y 3 de ruido, accesibles mediante SOUND. El Spectrum 128k tiene 3 canales de sonido y uno de ruido accesibles con PLAY. III - ZX Spectrum III.a) Comparando con el VIC-20 La memoria RAM libre del VIC-20 según su configuración: VIC Total de RAM RAM libre para el BASIC Sin expansión 5K 3.5K con expansión 3K 8K 6.5K con expansión 8K 13K 11.5K con expansión 16K 21K 19.5K con expansión 32K 37K 27.5K Cuando el VIC 20 tiene la expansión de 3k, la RAM se ve como sigue: 0-1023: 1K de memoria usada por el sistema 1024-7679: 6.5K de RAM disponible para programas BASIC 7680-8191: 0.5K usado para la memoria de pantalla de caracteres 38400-38911: 0.5K para la memoria del color de la pantalla El sistema siempre usa 1.5K (1K para el área del sistema más 0.5K para la pantalla de caracteres). Hay además 0.5K adicionales (cuartetos de) color de RAM, que usualmente no son contados en las especificaciones del VIC. Oficialmente Commodore solo hizo hasta la expansión de 16k para su VIC, por lo que las expansiones RAM de 32k en adelante, fueron ya de terceras partes. Sobre el teclado El teclado del VIC está siempre en modo gráfico desde que se enciende la máquina y siempre en mayúsculas. Para pasar al modo de texto, hay que hacer POKE36869,242. En este modo el teclado se comporta más como el una máquina de escribir. Para volver al modo anterior: POKE36869,240. Para leer las teclas de función F1 - F8 y ejecutar una acción según se pulsen, se aplica lo sigte.: Para F1: IF PEEK(l97)=39 AND PEEK(653)=0 THEN .... Para F2: IF PEEK(l97)=39 AND PEEK(653)=1 THEN .... Para F3: IF PEEK(l97)=47 AND PEEK(653)=0 THEN .... Para F4: IF PEEK(l97)=47 AND PEEK(653)=1 THEN .... Para FS: IF PEEK(l97)=55 AND PEEK(653)=0 THEN .... Para F6: IF PEEK(l97)=55 AND PEEK(653)=1 THEN .... Para FS: IF PEEK(l97)=63 AND PEEK(653)=0 THEN .... Para F6: IF PEEK(l97)=63 AND PEEK(653)=1 THEN .... Si las funciones se pulsan en combinación con C=, entonces 653 da 2. Si se pulsan en combinación con CTRL, 653 da 4. Si no se pulsa ninguna, entonces 197 y 653 devuelven 64 y 0 respectivamente. Sobre las variables El VIC-20 retiene el último texto dado a una variable de cadena, por lo que pulsar ENTER a un INPUT de cadena, nunca genera la cadena vacía como hace el Spectrum. Para lograr el mismo efecto en el VIC hay que tipearlo del modo sigte.: A$="":INPUT A$ eso borra el contenido previo de la cadena a ingresar por teclado. Lo mismo ocurre con las variables numéricas. Si hacemos A=5: INPUT A y en vez de tipear un número, se le responde con RETURN, entonces A retendrá el valor que tenía antes. III.b) Volviendo al emulador del VIC Cuando el emulador Twenty Commodes se carga, aparece la sigte. pantalla: VIC 20 emulator v1.90 1. VIC-20 básico (4.5k) 2. VIC expandido (base + 3k) (los sigtes. son solo para +2a/+3) 3. VIC extendido (base + 8k) 4. Super extd VIC (base + 11k) 5. VIC extend. + cartucho de 8k 6. VIC expand. + cartucho de 16k 7. Max extd VIC (base + 19k) Una vez que se elige la configuración con la cual se va a trabajar, pasa a preguntar si se desea usar o no, la paleta de color extendido ULA II. Sólo entonces el sistema pasa a modo VIC y espera que uno tipee algo. Sin el ULA II, el VIC se inicia con papel blanco, tinta azul y borde cyan, que es lo esperado, pero cuando se selecciona el ULA II, todo cambia iniciandose con papel azul, tinta amarilla y borde magenta. Elijo esta vez FUSE y voy al 48k (NTSC), cargo el Twenty Commodes y elijo la configuración base con ULA II. Se ejecuta el emulador y empiezo con 3583 bytes libres para tipear un programa. Ya que el autor del TC v1.9 nos dice que el equivalente a la RAM del VIC empieza en el Spectrum en $8000, pruebo a tipear un programita a modo de ejemplo y procedo en seguida a salvar un binario como "v20p00.bin" con inicio en 33793 y largo 3583. Paso a cargar con el REALS y tras un LIST, aparece el listado, trato de ejecutarlo pero me sale un "syntax error in 1", edito la línea y me da un error sintáctico en 88, una línea que no existe. Fuerzo editando la línea y se me cuelga todo. En suma, el fichero binario se corrompió. Pruebo esta vez a salvarlo desde la 32768 con largo 8k. Reseteo, la cargo, hago LIST y RUN. Ahora si sale bien. A veces parece colgarse el sistema al cargar el .BIN, pero basta con CAPS + SPACE para que se normalice y se pueda listar y ejecutar correctamente. Paso ahora a cargar esta vez la configuración con expansión de 3k extras, aun en 48k. Eso me da 6655 bytes libres. Sigo el proceso anterior con el mismo exito. Igual con el 128k y +2. Ahora voy a probar con los modelos +2a y +3. Aquí puedo probar con la opción 3, la cual me da 11775 bytes libres. La 4 me da el mismo monto de RAM libre. La 5 da 28159 bytes libres. La 6 deja solo 6655 de RAM libre para BASIC. La 7 me da 19967 de RAM libre. En todas, el fichero .BIN carga y corre sin problemas. Una vez creado el BINario, si queremos que lo lea el emulador del Commodore VIC-20 como el WIN-VICE, tenemos que cambiar la extensión a PRG, modificarlo con un editor hexadecimal como "xvi32" y añadirle dos bytes al inicio del fichero: $01 y $10. Para ir del WIN-VICE al Spectrum, se hace a la inversa, se eliminan esos dos bytes del fichero PRG con el mismo editor. Paso a probar otro emulador de VIC-20 para Spectrum +3, el de A. Owen que está disponible para descargar en su web, pero en formato SNA. Pruebo a tipear un listado publicado en TuMicro #2 y una vez terminado lo salvo como un Z80 usando REALS. Mas tarde lo cargo con FUSE y me doy conque el programa se halla a partir de cero en vez de 32768. Lo salvo bajo el nombre "v20bomb.bin", con inicio cero y 8k de largo. Luego lo pruebo a cargar en cada configuración del T.Commode y los resultados son: Se carga correctamente en las opciones 1 al 7, se puede ver el listado mediante LIST, pero solamente se puede ejecutar correctamente con RUN en las opciones de configuración de RAM 4, 5 y 6; pero no en las 1, 2, 3 y 7. El programa se llama "Bombardero" y es para un VIC con 5k de base. Cargar el BIN en la config. 2 hace que cualquier comando que uno tipee, dé error de sintaxis, obligando a uno a salir con un reset. Bien paso ahora a ver el modo inverso, descargo unos cuantos PRGs de la WEB y los pruebo a cargar primero con WIN-VICE y descubro que su inicio propiamente es en la $1001, eso es 36865 en la RAM del Spectrum y que eliminando los bytes iniciales sí puedo cargar correctamente los PRG ya sea en FUSE o REALS. Lo extraño es que si no salvo el BIN a partir de 32768, al cargarlo, se corrompe la información de aguna forma, quedando solo el listado pero al hacer RUN devuelve error sintactico como ya antes mencioné. Debido a que el programa se ejecuta muy lento en el emulador en comparación con un VIC real, hay que ver si el emulador como por ejemplo el REALS, tiene opción para incrementar la velocidad del sistema emulado. Solo así se obtiene una ejecución aceptable. Es decir modo de velocidad normal para tipear el listado y aumentar la velocidad durante la ejecución del programa cuando se vea que es demasiado lento. Muy bien, ahora que ya sé como importar y exportar info entre emuladores paso a... En suma: Con esto cierro esta segunda parte, pero siento que aun queda más por decir acerca del VIC-20 y su emulación en el ZX Soectrum, así como de la comparativa que hago al mismo tiempor entre ambos micros de 8 bits de aquellos días. (c)2018 - 2021 zx_if1@hotmail.com