022:utilidade

¡Esta es una revisión vieja del documento!


Microhobby 22. Año II, del 02 al 08 de abril de 1985

Jesús Alonso

Hasta ahora, sólo unos pocos privilegiados podían ver a su Spectrum imprimir 64 columnas en pantalla. Tras leer este artículo, cualquiera podrá escribir sus programas con presentaciones en pantalla a 64 columnas.

Hacer que nuestro Spectrum imprima en pantalla 64 caracteres por línea, no es tarea difícil. No son necesarias largas rutinas en Código Máquina lentas de ejecutar e incomprensibles para el usuario medio. Bastará con conocer la forma en que nuestro ordenador gestiona la pantalla y ayudarnos a una corta rutina en CM cuyo funcionamiento cualquier puede comprender.

Vamos a llamar «posición de carácter» a cada uno de los 704 (32 x 22) cuadritos imaginarios, de ocho por ocho pixels, que componen la pantalla y en los que nuestro ordenador normalmente imprime un caracter.

Como cada línea consta de 32 cuadritos, el Spectrum sólo puede imprimir 32 caracteres por línea. Si conseguimos imprimir dos caracteres en cada cuadrito, habremos conseguido duplicar el número de caracteres por línea (también llamado número de columnas) de nuestro ordenador.

En principio, necesitamos un juego nuevo de caracteres definidos en una matriz de cuatro por ocho pixels, y aprovechamos para definir las letras especiales del castellano, es decir, eñes y vocales acentuadas.

Como vamos a usar la rutina de impresión que se encuentra en la ROM del Spectrum, tendremos que imprimir una posición de caracter completa de cada vez, por lo que necesitaremos dos juegos de caracteres idénticos; pero uno, estará definido en las cuatro columnas de pixels de la izquierda, y el otro, en las de la derecha, los llamaremos respectivamente, primer y segundo juego de caracteres. (Ver Figura 2.)

Los «puristas» podrían objetar que con un solo juego sería suficiente, ya que el otro se podría obtener con simple rotación de las posiciones de memoria correspondientes; pero esto implicaría una mayor complejidad de la rutina en CM y una menor velocidad de ejecución.

El método empleado es el siguiente: primero, abrimos el canal 2 (Pantalla superior), luego fijamos la posición de impresión (que viene dada por dos variables previamente almacenadas en el Buffer de impresora), a continuación, direccionamos el primer juego de caracteres (alterando los valores de la variable del sistema CHARS) y llamamos a la rutina de la ROM que nos permite imprimir un caracter (RST 10H). Seguidamente, retrocedemos una posición de caracter, direccionamos el segundo juego, e imprimimos el segundo caracter de nuestro mensaje, los dos se imprimirán en el mismo cuadrito («posición de caracter»), luego volvemos a direccionar el primer juego para imprimir el tercer caracter, y así sucesivamente hasta encontrar el código 255 que nos indica final de mensaje. Los códigos de los caracteres que componen el mensaje los vamos leyendo del Buffer de impresora donde habrán sido previamente almacenados por una pequeña rutina Basic que, al igual que en la impresión de rótulos de la cinta «Horizontes», sirve para dar entrada a la rutina en CM. Como se verá, los caracteres impares se imprimirán a la izquierda de cada «posición de caracter», utilizando el primer juego de caracteres, y los pares se imprimirán a la derecha, utilizando el segundo juego. Por ello, será necesario hacer OVER 1 antes de llamar a la rutina de impresión ya que si no al imprimirse los caracteres pares se borrarían los impares.

El programa 1 es un cargador escrito en Basic que se encarga de almacenar en memoria tanto la rutina de impresión en CM como el juego de caracteres por duplicado bajando, asimismo, la RAMTOP para protegerlo. Tanto el programa en CM como los juegos de caracteres, se almacenan en posiciones de memoria distintas según se trate de la versión de 16 K o 48 K, pero no se preocupe por ello, ya que el programa 1 lo hace de forma automática chequeando la PRAMT. Si corre en una versión de 48 K, todo se almacenará a partir de la dirección 62642 dejando los 1.110 bytes superiores libres para las interfaces de impresora que los utilizan; por el contrario, si se trata de una versión de 16 K, todo se almacenará a partir de la dirección 30984 y se corregirán de forma automática los cuatro bytes de la rutina CM que direccionan los juegos de caracteres.

Teclee el programa 1 poniendo especial atención en no equivocarse en los DATAS (si esto ocurriera el programa se detendría listando el bloque donde se ha detectado el error para que éste fuera corregido), a continuación salve el programa en cinta antes de hacerlo correr (es una buena práctica el no hacer correr ningún programa que contenga Código Máquina sin salvarlo antes en cinta). Ejecute el programa y si no ha habido error, al cabo de un minuto le saldrá el mensaje: «Start tape, then press any key», ponga en marcha el cassette y pulse una tecla para almacenar el código generado que será el que habrá de incluir luego en sus programas. Una vez verificada la grabación, el programa le imprimirá a 64 columnas unas pequeñas instrucciones a título de demostración.

Incluya en sus programas la línea 9900 del listado del programa 1 y, donde pone LET w = USR (62642 -31658 * (v = 1)), cámbielo por: LET w = USR 62642 si su versión es de 48 K y por: LET w = USR 30984 si su versión es de 16 K. La primera línea de su programa deberá ser:

10 CLEAR 62641: LOAD "64 CHARS" CODE 62642,1616

si su versión es de 48 K o bien:

10 CLEAR 30983: LOAD "64 CHARS" CODE 30984,1616

si su versión es de 16 K.

El código generado por el programa 1, deberá ir grabado en cinta a continuación de su propio programa. Para imprimir un texto a 64 columnas, fije primero en la variable «xx» la línea donde desea imprimirlo (desde cero hasta 21), y en la variable «yy» la columna (desde cero hasta 31), luego introduzca el texto en la variable «p$» y haga GO SUB 9900. Observe las líneas 530 a 830 del programa 1 que podrán servirle de ejemplo.

Para los curiosos del Código Máquina, incluimos en la figura 1, el listado en Assembler de la rutina de impresión.

IMAGEN —Estructura de la «a» minúscula en el juego de caracteres standar de la ROM del Spectrum.

IMAGEN —La «a» del primer juego de caracteres ocupa la parte izquierda de un caracter.

IMAGEN —El segundo juego está desplazado a la derecha para conseguir situar en un solo caracter dos teclas.

LISTADO ASSEMBLER
ENTRADAS: Variables en el Buffer de impresora.
SALIDAS : Impresión de un texto en pantalla a 64 columnas.
LONGITUD: 88 bytes
DIRECCION DE ARRANQUE: 62642d.
DIRECCION DE INICIO : 62642d.
TIEMPO DE EJECUCION : Aproximadamente 1 milisegundo por cada caracter del texto a imprimir
 
3E 02		INIC.	LD	A,02			; Abre canal 2
CD,01,16			CALL	1601
21,0A,58			LD	HL,5B0A		;Inicializa puntero
06,03				LD	B,3		;Posiciona impresión
C5		BUCLE	PUSH	BC
7E			LD	A,(HL)
D7			RST	10
23			INC	HL
C1			POP	BC
10,F9			DJNZ	(BUCLE)
3E,02		REPET	LD	A,02			;Direcciona primer juego
32,36,5C		LD	(5C36),A
3E,F4			LD	A,F4
32,37,5C		LD	(5C37),A
7E			LD	A,(HL)			;Carga caracter
FE,FF			CP	FF			;Si es 255
28,22			JR	Z,(FINAL)		;Vete a FINAL
7E			LD	A,(HL)			;Carga caracter
F6,00			OR	0			;Si es cero
28,1D			JR	Z,(FINAL)		;Vete a FINAL
D7			RST	10			;Imprímelo
3E,08			LD	A,08			;Retrocede cursor
D7			RST	10
23			INC	HL			;Avanza puntero
3E,02			LD	A,02			;Direcciona segundo juego
32,36,5C		LD	(5C36),A
3E,F7			LD	A,F7
32,37,5C		LD	(5C37),A
7E			LD	A,(HL)			;Carga caracter
FE,FF			CP	255			;Si es 255
28,09			JR	Z,(FINAL)		;vete a FINAL
7E			LD	A,(HL)			;Carga caracter
F6,00			OR	0			;Si es cero
28,04			JR	Z,(FINAL)		;Vete a FINAL
D7			RST	10			;Imprímelo
23			INC	HL			;Avanza puntero
18,CF			JR	(REPET)			;Vuelve al principio
3E,00		FINAL	LD	A,00			;Direcciona juego de ROM
32,36,5C		LD	(5C36),A
3E,3C			LD	A,3C
32,37,5C		LD	(5C37),A
C9			RET				;Retorna
00			NOP
00			NOP
00			NOP
  • 022/utilidade.1299784613.txt.gz
  • Última modificación: d/m/Y H:i
  • por miguel