La importancia de los gráficos en cualquier programa, sobre todo si es un juego, es algo incuestionable, pero conllevan una sene de problemas. Con la rutina que hoy presentamos, damos una sencilla solución a uno de los escollos más importantes: la limitación de memoria. Cuando nos proponemos hacer un programa en el que los gráficos deben jugar un papel importante, nos encontramos con un problema insalvable, como es la limitación de memoria de nuestro ordenador. El problema se agrava aun más en un ordenador como el nuestro, es decir, un Amstrad, ya que la memoria de pantalla se eleva a 16.000 bytes, lo cual significa que como mucho se podrán almacenar tres pantallas completas en memoria. Podemos comprobar de entrada que el almacenamiento de pantallas enteras es algo impensable, salvo en aquellos casos en los que el programa utilice únicamente una pantalla de trabajo. Dado que este tipo de aplicaciones son realmente escasas, y lo que nos gusta a todos es encontrarnos con las que tienen multitud de pantallas, debemos encontrar una solución al almacenamiento de gráficos. Por regla general, se almacenan en memoria en forma de bloques, con los cuales se van contruyendo las diversas pantallas de juego. La ventaja que ofrece este método es que todas aquellas zonas de pantalla que sean iguales, se conseguirán imprimiendo el mismo bloque gráfico, con lo cual el ahorro de memoria va a resultar considerable. Pero aun así, la cantidad de memoria utilizada para almacenar gráficos puede ser tan elevada, que sea imposible introducirla en nuestro ordenador. Así por ejemplo, existen gran cantidad.de juegos comerciales en los cuales aparecen tal cantidad de gráficos, que sin la utilización de rutinas especiales hubiera sido imposible su creación. Vamos, pues, a desvelar el misterio de esas rutinas que nos permitirán almacenar gráficos, utilizando únicamente la mitad de espacio. Funcionamiento de la rutina Ante todo, debemos decir que estas rutinas serán utilizables únicamente en el modo 1, que es el que permite la mejor proporción color/resolución. Ya hemos dicho en multitud de ocasiones que al crear un gráfico, aparte de darle la forma, le indicamos, además, el color con el que se debe imprimir, con lo cual la longitud de ese gráfico es doble, ya que se almacena la forma y el color. La solución al problema del ahorro de memoria reside, precisamente, en almacenar únicamente la forma del gráfico, y el color se le dará, mediante la rutina correspondiente, cuando se desee imprimir en pantalla. La pregunta que surge seguidamente es: ¿Cómo almacenar únicamente la forma dejando de lado el color? La respuesta es de lo más sencillo que podamos imaginar, ya que lo que se debe hacer es generar el gráfico que se va a utilizar en formato de pantalla de alta resolución, es decir, generar el gráfico en modo 2, para luego imprimirlo por programa en modo 1. De esta forma, la longitud del gráfico queda reducida a la mitad, por lo que se pueden tener en memoria el doble de gráficos que en el formato original. Veamos a continuación cómo funciona nuestra rutina y en qué forma se deberá utilizar. Los datos iniciales necesarios para el funcionamiento, serán los siguientes: HL ....... dirección del gráfico D ........ coordenada vertical E ......... coordenada horizontal B ......... altura del gráfico C ......... anchura del gráficoAdemás, en la variable COLOR, deberá ir el valor correspondiente a la tinta con que se desea imprimir el gráfico; así pues, esta variable podrá contener los siguientes valores, según la tinta con que se desee imprimir:TINTA 1 ....... color = 1 TINTA 2 ....... color = 2 TINTA 3 ....... color =3 Debemos aclarar que como ancnura de gráfico, se deberá indicar la que posee tal y como está almacenado en memoria, aunque una vez imprimido en pantalla, ocupará una anchura igual al doble de la que ocupaba en memoria, con lo cual se puede observar el gran ahorro de memoria que se obtiene con la utilización de dicha rutina.Una vez colocados estos datos iniciales en los registros y variables correspondientes, llamaremos a la rutina de impresión, la cual ya ha sido anteriormente explicada en capítulos anteriores. La única diferencia radica en las líneas encargadas de pasar los valores a la memoria de pantalla. Así pues, donde antes se encontraban las instrucciones siguientes: LD A,(IX + 0) LD (HL),Aahora deberá ir:CALL PONESLa rutina PONES será, precisamente, la encargada de aumentar el gráfico a modo 1, con el color indicado en la variable COLOR.Desde aquí se llamará a la rutina correspondiente al color elegido. Cómo imprimir los colores Vamos a. ver a continuación qué operaciones debemos realizar para imprimir el gráfico con cada uno de los tres colores posibles en modo 1. Para imprimir el gráfico en tinta 1, debemos colocar la información del gráfico en los cuatro bits de mayor peso, para lo cual tomaremos los cuatro primeros bits del byte correspondiente al gráfico, y los pasaremos a la dirección actual de pantalla, seguidamente incrementaremos el puntero, y haremos lo mismo con los cuatro bits restantes del gráfico en memoria: LD C,(HL): tomamos el valor almacenado en memoria. XOR A: reseteamos el acumulador. RRD: pasamos los cuatro primeros bits al acumulador. RLA: rotamos a la izquierda cuatro veces. RLA RLA RLA AND 240: despreciamos los bits de menor peso. INC DE: incrementamos el puntero de pantalla. LD (DE),A: cargamos el valor en la dirección de pantalla. XOR A: reseteamos el acumulador. RRD: pasamos los siguientes cuatro bits al acumulador. RLA: rotamos cuatro veces a izquierda. RLA RLA RLA AND 240: despreciamos los cuatro bits de menor peso. DEC DE: decrementamos el puntero de pantalla. LD (DE),A: colocamos el valor correspondiente. LD (HL),C: restablecemos el contenido de la memoria. INC HL: incrementamos el puntero de memoria. INC DE: incrementamos el puntero de pantalla. INC DE RETComo se puede comprobar, de cada byte del gráfico en memoria se obtienen dos bytes para la pantalla, con lo cual el gráfico definido en modo de alta resolución se obtiene en pantalla en forma de modo 1, con el color correspondiente al indicado por nosotros.Para obtener los restantes colores, deberemos hacer exactamente lo mismo, teniendo únicamente en cuenta cuáles son los bits que contienen la información para cada una de las distintas tintas. De esta forma, para la tinta dos, la información se deberá introducir en los cuatro bits de menor peso, y para tinta 3, la dicha información se deberá indicar tanto en los bits de menor como de mayor peso. Una vez ejecutadas las rutinas de transformación de color para un byte de gráfico, el programa retorna a la rutina de impresión para calcular la siguiente dirección de pantalla. Debemos hacer una última aclaración respecto a la utilización de la rutina. El bloque gráfico que se imprima utilizando esta rutina, deberá ser de un único color, es decir, no se podrá imprimir un bloque con dos colores distintos, ya que únicamente podemos colocar un valor en la variable correspondiente. Con todo y con esto, si deseamos que un bloque gráfico almacenado en memoria se imprima con dos colores distintos, tendremos que, en primer lugar, imprimir el trozo de gráfico que debe ir con un color y a continuación lo restante con el otro color deseado. Creemos que con esto queda lo suficientemente claro el funcionamiento de esta rutina, que nos permitirá un ahorro de memoria considerable. Sólo nos resta decir que aquellos que deseen utilizar este programa, únicamente deberán copiar el listado ensamblador que aparece al final del artículo. Aquellos que lo deseen, podrán teclear el cargador Basic que aparece a continuación. Para salvar el código objeto, se deberá proceder de la siguiente forma: SAVE“IMPRE”,B,&A000,245con lo cual tendremos la rutina a nuestra disposición para ejecutarla cuando lo deseemos.AS
| ★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.732-desktop/c Page créée en 699 millisecondes et consultée 16 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|
|