008:utilidades

No renderer 'odt' found for mode 'odt'

Microhobby 8. Año I, del 25 al 31 de diciembre de 1984

Jesús Alonso

Spectrum 48 K

Algunos lectores nos han preguntado sobre la forma de utilizar la rutina en código máquina de la cita «Horizontes» de «Psión», para generar rótulos de gran tamaño en sus propios programas, y especialmente, sobre la forma de relocalizarla en otra zona más alta de memoria para ser utilizada en el modelo de 48 K. sin que afecte al programa Basic.

Ante esta insistencia vamos a abordar, en primer lugar, el tema de la localización de la rutina en cualquier zona de memoria, para pasar después a describir la forma de acceder a ella, tanto desde Basic como desde Código Máquina.

La rutina no es relocatable de forma directa debido a que tiene cuatro saltos absolutos y un CALL. El resto de las instrucciones pueden funcionar correctamente en cualquier posición de memoria, pero los saltos absolutos no se pueden cambiar por relativos ya que se salen del rango permitido por éstos, y por supuesto, no hay forma de hacer un CALL relocatable. Lo que sí es posible es hacer un programa en Basic que cargue la rutina a partir de cualquier dirección y, a continuación, la modifique renumerando los saltos absolutos y el CALL a partir de la dirección de carga para permitir que la rutina corra sin problemas; esta es la solución por la que hemos optado en este caso.

Esta rutina utiliza también unas variables en las que se almacenan una serie de datos como son anchura y altura de los caracteres, punto de impresión y mensaje a imprimir, variables que han sido situadas en la memoria intermedia (Buffer) de impresora, por lo que no hace falta relocatarlas dado que no afectan para nada, incluso si se está utilizando impresora. Con esto los programadores de «Psion» nos dan un ejemplo de buena práctica de programación.

El programa Basic que se muestra en el cuadro le permitirá cargar la rutina en cualquier lugar de la memoria sin más que seguir las instrucciones que él mismo le dará. En este programa se puede ver también, un ejemplo de cómo acceder a la rutina desde el Basic. Primero se fijan las variables; «xx» almacena la coordenada horizontal del pixel de comienzo del primer carácter del mensaje, también es posible un centrado automático que se explicará más adelante; «yy» la coordenada vertical de este pixel, pero contada de arriba abajo, es decir, al revés de como se hace para el comando «PLOT»; «xs» almacena el ancho del carácter contado, no en pixels, sino en posiciones de impresión; «ys» almacena el alto del carácter de la misma forma que «xs» (si se desea el doble del ancho y de alto, «ys» y «xs» han de valer 2); finalmente, P$ almacena el texto a imprimir.

Una vez fijadas las variables, se hará un GO SUB 9100, con lo que los valores de éstas pasarán a almacenarse en las variables correspondientes de la rutina máquina situadas en el «Buffer» de impresora. Si se desea un centrado automático del texto, no se deberá fijar la variable «xx» y se hará GO SUB 9000 en lugar de GO SUB 9100.

Cuando haya ejecutado el programa Basic del cuadro tendrá la rutina en memoria a partir de la posición que Vd. haya fijado. La RAMTOP habrá sido también alterada para evitar que el Basic destruya la rutina máquina. Ya no necesitará más este programa, por lo que puede hacer NEW con toda tranquilidad; no obstante, las líneas a partir de la 9000 puede incluirlas en sus programas y le permitirán el acceso a esta rutina (la variable «di» deberá contener siempre la dirección de carga de la rutina en máquina).

También es posible acceder a esta rutina desde un programa en código máquina, para ello haga una lista en cualquier lugar de la memoria en la que el primer byte contenga el valor de «xx», el segundo el valor de «yy», el tercero el valor de «xs», el cuarto el valor de «ys», el quinto deberá contener «8», a partir de ahí los bytes siguientes deberán contener los códigos de los caracteres que forman el mensaje a imprimir, y finalmente, el último byte deberá contener «255» que es el código que indica a la rutina el final de texto. Deberá hacer una de estas listas por cada línea de texto a imprimir. Cuando tenga las listas hechas, cargue el registro «HL» con la dirección de comienzo de la lista correspondiente al mensaje que desea imprimir, el registro «BC» con el número de bytes que componen la lista, y el registro «DE» con el valor «5B0AH» (que corresponde a la dirección inicial de las variables en el buffer de impresora). A continuación haga «LDIR» y seguidamente un CALL a la dirección de comienzo a partir de la cual ha cargado la rutina máquina de la cinta «Horizontes».

Por último, hay que señalar que con esta rutina sólo podrá imprimir los caracteres que componen el juego de caracteres en ROM del Spectrum, no pudiendo imprimir, por ejemplo, los Gráficos Definidos por el Usuario (UDG).

  • 008/utilidades.txt
  • Última modificación: d/m/Y H:i
  • por miguel