En el artículo de esta semana presentamos un programa con el que se pueden realizar scrolls de pantalla, en cada uno de los tres modos que poseen los ordenadores Amstrad, con una gran rapidez. Hace unas semanas veíamos en esta misma sección una rutina que nos proporcionaba un scroll pixel a pixel de la pantalla cuando trabajábamos en modo 1. Este programa, a pesar de realizar un desplazamiento suave de la pantalla, posee dos grandes inconvenientes. Uno de ellos es que únicamente podemos utilizarlo correctamente cuando nos encontremos en un modo de pantalla determinado, en este caso el modo 1. El otro gran inconveniente es la gran lentitud de dicha rutina, ya que debe realizar gran cantidad de instrucciones para cada uno de los bytes que posee la pantalla, que son nada más y nada menos que 16.384. Hoy realizaremos una rutina de desplazamiento de pantalla de carácter a carácter, con lo cual se realizará un scroll mucho más rápido, y además será utilizable para cualquiera de los modos de pantalla que posee el Amstrad. Sin embargo, se perderá en parte la suavidad que se conseguía con el anterior programa. Veamos, en primer lugar, cuáles son los parámetros necesarios para que nuestra rutina funcione correctamente. Dichos valores se deberán colocar en los espacios reservados para ellos en el programa, es decir, en los cuatro bytes que siguen a la rutina, que en el listado ensamblador vienen definidos de la siguiente manera: ANCHO: DEFB 50 LINEA: DEFB 2 POSIC: DEFW #0505El primero de ellos, es decir, la variable Ancho, indicará el número de bytes en forma horizontal que serán desplazados por la pantalla. Debemos tener en cuenta que en cada uno de los modos los caracteres están formados por distinto número de bytes.A continuación se exponen los bytes que forman cada carácter en los distintos modos de pantalla. MODO 2... 1 CARACTER... 1 BYTE MODO 1... 1 CARACTER... 2 BYTES MODO 0... 1 CARACTER... 4 BYTESSe debe entender que este número representalos bytes de cada carácter en forma horizontal, ya que en sentido vertical todos los caracteres están formados por ocho bytes, independientemente del modo de pantalla utilizado. Otra de las variables del programa es la que está representada por Línea. Esta indicará el número de líneas sobre las cuales se debe efectuar el scroll. Por último, tenemos la variable Posic, que nos indicará a partir de qué coordenadas de pantalla se desea efectuar el scroll. Esta variable deberá tomar el valor #0000 para la esquina superior izquierda de la pantalla. Se puede decir que toma los mismos valores que la función Lócate de Basic, pero restando una unidad a la coordenada horizontal y vertical. Resumiendo, y a modo de ejemplo, podemos decir que con los valores actuales que contiene el programa. Se lograría un scroll a partir de las coordenadas 5,5 (6,6 para Lócate) de una anchura de 50 bytes y una altura de dos líneas (es decir, de 16 bytes de altura). Veamos ahora cómo funciona nuestro programa. En primer lugar, se carga el registro doble HL con el contenido de la variable Posic, y a continuación se hace una llamada a una rutina del firmware: CALL #BC1AComo recordaremos, esta rutina nos devuelve, en el mismo registro HL, la dirección de pantalla correspondiente a dichas coordenadas. A continuación cargamos en el acumulador la variable Línea, introduciéndola a continuación en el registro B, para formar así un bucle que nos indicará las filas sobre las cuales se debe efectuar el desplazamiento.Seguidamente se forma otro bucle que se repetirá ocho veces, ya que cada una de las filas de la pantalla está compuesta por ocho bytes. En este bucle es donde se realizará el trabajo de scroll de pantalla. Para ello se pasan al registro doble DE los valores actuales del registro HL, que es el que contiene la dirección de pantalla: LD D,H LD E,LAhora cargamos en el acumulador el contenido de la dirección actual de pantalla, y lo preservamos para recuperarlos más tarde: LD A, (HL) ;# PUSH AF ;#A continuación incrementamos el registro HL, y cargamos en el acumulador el contenido de la variable Ancho, que es la que indica el número de bytes en sentido horizontal que deben desplazarse:INC HL LD A, (ANCHO)Seguidamente debemos cargar en el registro doble BC el número de bytes a ‘scrolear'. Para ello, cargamos B con cero y en el registro C cargamos el contenido del acumulador, con lo cual se puede efectuar la operación de movimiento del bloque de pantalla:LD B,0 LD C,A LDIRUna vez hecho esto, debemos recuperar el contenido del acumulador que se había preservado anteriormente y cargarlo en la dirección a la que apunta el registro doble DE, es decir, en el último byte de la línea desplazada:POP AF LD (DE),ACon lo cual se consigue el efecto de rotación de la pantalla; es decir, que lo que desaparece por la parte izquierda se recupere por la parte derecha. En el caso de que se quisiera efectuar un scroll con pérdida del contenido de la pantalla, únicamente deberíamos suprimir del listado del programa estas dos últimas líneas, junto con la marcada con un asterisco '*‘Una vez producido el desplazamiento en una línea, se debería recuperar la dirección de pantalla anterior, a la cual se deberá sumar el valor 2.048, para así obtener la dirección del siguiente byte de pantalla en sentido vertical: POP HL LD DE,2048 ADD HL,DECuando se haya producido el scroll de los ocho bytes que contienen cada una de las líneas, deberíamos calcular la dirección de la siguiente línea de pantalla.Esto lo haremos recuperando la dirección inicial de la anterior línea y sumándole el valor 80: POP HL LD DE,80 ADD HL,DEUna vez finalizado este último bucle, se habrá conseguido el desplazamiento de la parte de pantalla dada en los parámetros iniciales un byte hacia la izquierda.Como se podrá comprobar, la velocidad de ejecución de esta rutina es realmente rápida, si tenemos en cuenta que la pantalla de nuestro Amstrad está compuesta por un elevado número de bytes. Dada la gran versatilidad de esta rutina, ya que podemos elegir la zona de pantalla a desplazar, así como sus dimensiones y las coordenadas iniciales, se podría utilizar como ayuda en cualquier programa Basic o en Código Máquina que deseemos realizar. Como podemos ver, aquí únicamente estamos estudiando el scroll hacia la izquierda, pero realmente también nos puede ser necesario un desplazamiento hacia la derecha. Pues bien, esta tarea os la reservo a todos los que sigáis este Curso de Código Máquina, aunque sí os daré alguna pista que supongo que algunos estarán adivinando. Como hemos visto, nuestra rutina utiliza una instrucción de desplazamiento de bloques como es: LDIRPor tanto, para efectuar el mismo trabajo, pero en sentido contrario, deberemos utilizar la instrucción:LDDRTeniendo en cuenta que en este caso deberemos indicar en los registros dobles HL y DE la dirección más alta a partir de la cual deseamos trasladar los datos. Por hoy no resta nada más por decir, únicamente desearos suerte en la confección de la rutina de desplazamiento a la derecha de la pantalla. AS
| ★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
|
CPCrulez[Content Management System] v8.74-desktop Page créée en 670 millisecondes et consultée 83 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. |
|