Examinando la RAM video del Spectrum A continuacion una traduccion al castellano del texto original en ingles publicado por COMPUTING TODAY en su edicion de marzo de 1983. El articulo se llama "PEEKING THE SPECTRUM" y trata de un modo sencillo y claro acerca de como el Spectrum maneja sus graficos tanto en la RAM como en la pantalla, dando al final algunos consejos sobre como manejar e identificar las UDGs. " Articulo: PEEKeando el ZX Spectrum por Don Thomasson Tratar de PEEKear en memoria del Spectrum puede causar toda clase de problemas. Aqui les mostramos como hacerlo sin tantos dolores de cabeza. El Spectrum es una maquina muy interesante en muchaa maneras, pero tiene una caracteristica que puede hacernos enfurecer. Una pantalla mapeada en la memoria permite que un caracter en una posicion dada sea determinada mediante un simple PEEK, el Spectrum almacena la pantalla de tal modo que parece a primera vista, haber sido arreglada de una forma totalmente caotica, y PEEKear en ella no nos provee de ninguna informacion util. El manual le advierte al usuario de eso, y le sugiere el uso de SCREEN$ como alternativa, pero eso de nada sirve con los UDGs (graficos definibles por el usuario) los cuales son considerados como espacios. Un pequeno experimento con algo de paciencia nos muestra que los 8 bytes que conforman al caracter en la esquina superior izquierda de la pantalla son puestas en las direcciones: 16384 16640 16896 17152 17408 17664 17920 18176 16384 marca el comienzo del area de la memoria de la pantalla, y las otras direcciones son obtenidas anadiendo 256 sucesivamente. Ah! Asi que lo podemos escribir como: direccion = 16384 + 256 * (n - 1) + 32 * x + y = 16128 + 256 * n + 32 * x + y donde las direcciones contienen el byte N del caracter en la linea x, columna y. DESBLOQUEANDO LA PANTALLA Pero esa formula falla tras examinar esas 8 lineas de pantalla. Un bloque enteramente nuevo empieza, 2048 posiciones despues de la primera y ahora tenemos: direccion = 18176 + 256 * n + 32 * (n—8) + y = 17920 + 256 * n + 32 * x + y. Tras un total de 16 lineas, un tercer bloque empieza, y entonces tenemos: direccion = 20224 + 256 * n + 32 * (x- 16) + y = 19712 + 256 * n + 32 * x + y. esta bien tener una computadora a mano, pero que de bueno es eso para nosotros? El programa que ofrecemos a continuacion nos ofrece una especie de respuesta. Programa Screenpeek: 10 INPUT N 20 LET A=0 30 LET B=INT(A/95):LET C=A-95*B 40 PRINT CHR$(C+32); 50 IF A<703 THEN LET A=A+l:GOTO 30 60 INK 2 70 FOR X=0 TO 21 80 FOR Y=0 TO 31 90 LET BASE=l8l76 100 IF X>7 THEN LET BASE=l9968 110 IF X>l5 THEN LET BASE=2l760 120 LET D=(BASE+32*X+Y) 130 IF PEEK(D)=N THEN PRINT OVER l;AT X,Y;"RV SP" 140 NEXT Y:NEXT X 150 INPUT M:INK M 160 INPUT N 170 GOTO 70 Ingresa un numero, y la pantalla se llenara de caracteres. Entonces se da un escaneo, en el cual el byte 8 de cada caracter es comparado con el numero que fuera ingresado. Si los 2 valores son iguales, el caracter es convertido a video inverso con PRINT OVER. De lo contrario, el caracter queda sin ser alterado. Tipea un cero, y muchos de los caracteres cambiaran. Los caracteres que no tengan descendientes, es decir partes que se extiendan por debajo de su base como p y q por ejemplo, con al menos un bit alto en el ultimo byte. Ingrese 56, y p y q seran elegidos. Para ahorrarle tediosos experimentos, los numeros que valen la pena de probar son 0, 6, 8, 16, 24, 32, 56, 60, 64 and 255. El segundo dato a ingresar permite establecer un color y entonces otra verificacion de numero, asi, le sera posible poner un color en contra de un ultimo byte especifico. No es un programa particularmente util, pero si muy entretenido. Ahora creamos algunos graficos de usuario y aumentamos el programa original para que los pueda imprimir, cambiando las 95 entradas a 132. Con un poco de habilidad, se puede hacer que la linea mas baja de cada cada grafico especial tenga un numero diferente, preferiblemente que no sea ninguno de la lista antes mencionada. El programa entonces cogera este numero para identificar cada uno de los graficos individualmente. Para un programa como "el valle" (The Valley), una rutina algo diferente es necesaria. Los valores actuales de x e y son conocidos, asi que todo lo que se necesita hacer es definir la base y hacer un PEEK. El resto del programa podria ser casi identico al original. Ya solo queda decir que el byte examinado no necesita ser el ultimo que conforma ese caracter. Si los graficos tienen un byte diferente de modo mas conveniente, todo lo que se necesita hacer es un cambio al valor BASE. Con esto podemos suponer, que SCREEN$ puede comparar los bytes que lee de un caracter con los datos del patron de caracteres almacenados cerca de lo alto de la ROM. Asi que seria posible llevar a cabo el mismo truco con los datos de los graficos especiales, pero eso probablemente podria ser muy exagerado. Sin embargo, hay casos en los que hacer eso podria valer la pena, claro que seria necesario usar rutinas en codigo maquina para mantener un correcto tiempo de respuesta. Que se diviertan! " (c)2022 zx_if1@hotmail.com