Comando TRA

Rafael Candau
Enero 1989

El presente articulillo es un intento de utilización del comando TRA, para algo más que para cambiar la tabla de traducción de caracteres del QL.

Si jugamos un poquillo con la sentencia TRA podríamos hacer por ejemplo TRA 0,40000. Escribirlo y dar ENTER, ahora hacer CTRL SPACE y veréis que cosa más rara sale. Horror se nos ha escacharrado el QL.

Bien, no es así simplemente hemos cambiado la dirección de la tabla de errores del QL que ahora comienza en la dirección 40.000.

Obviamente ya nos ha entrado el gusanillo y ahora lo que queríamos hacer, seria en vez de que salgan esos signos extraños cuando se produce un error que nos salgan unos mensajes inteligibles y que nos digan algo.

La dirección de la tabla de errores en el QL se haya contenida en el valor depositado en la variable del sistema SV.MESBAS que es un longword y que tiene un OFFSSET de $14A con respecto a la base de la tabla de variables del sistema.

Dejándonos de rollos os diré que la dirección de esta tabla se haya escribiendo Print Peek_l (164170) lo que nos da un valor de 47084. Es decir la tabla se encuentra en la dirección 47084, como es natural y dada nuestra insana curiosidad "esto" hay que verlo, nada más fácil, teclear este programilla:

10 A=PEEK_L(164170)

20 FOR N=A TO A+1024

30 PRINT CHR$(PEEK(N));

40 END FOR N

Qué os ha parecido... estaba ahí la dichosa tabla. Bien ahora vamos a cambiarla.

Si os fijáis los dos primeros bytes son un 74 y un 251 lo que forma en un LONGWORD la cantidad de 19.195 o dicho en hexadecimal 4AFB, esta es la palabra identificativa de comienzo de tabla.

Luego vienen 29 punteros donde están las direcciones de todos y cada uno de los mensajes de error con respecto al comienzo de la tabla, esto es el offsset de comienzo de cada mensaje.

Una forma de ver esto sería el siguientes programita:

10 A=PEEK_L(164170)

20 FOR N=A TO A+60 STEP 2

30 PRINT PEEK_W(N);" ";

40 END FOR N

Si ejecutáis el programa obtendréis unos números de desplazamientos estos números sumados al número de comienzo de la tabla nos dará la posición de memoria donde comienza el mensaje de error, los dos primeros bytes que hay en esta esta dirección de desplazamiento nos dan la longitud del mencionado mensaje de error.

Esto parece muy lioso y de hecho lo es, pero también es muy ingenioso como todo el manejo de las variables del sistema por parte del QDOS que como sabéis esta todo hecho en base a desplazamientos relativos con respecto a una dirección de memoria, esta es precisamente una de las cosas que hacen el QDOS un sistema operativo bastante potente.

Y como hemos dicho que es un poco lioso vamos a hacer un programa que nos explique un poco todo este tema de los desplazamientos, programa que nos sirve para entender como esta dispuesta la tabla de errores en el QL.

10 CLS:INK 7

20 a=PEEK_L(164170)

30 INPUT "¿ Cuál es el mensaje que quieres visualizar ?      ";c:c=c*2

40 b=PEEK_W(a+c)+a:l=PEEK(b+1)+PEEK(b)*256

50 PRINT "Dirección de la base de la tabla de errores: ";a

60 PRINT "Dirección de la del mensaje de error: ";b

70 PRINT "Longitud del mensaje de error: ";l;" Bytes"

80 PRINT "Contenido del mensaje de error: ";:INK 0

90 FOR n=b+2 TO b+l

100 PRINT CHR$(PEEK(n));

110 END FOR n

La línea 20 contiene la dirección SV.MESBAS si os fijáis esta es la única dirección absoluta que sale en el programa y no obstante también es relativa ya que tiene el Offsset de $14A con respecto al inicio de la tabla de variables del sistema.

La línea 30 nos pregunta cuál es el número de error que queremos visualizar.

En la línea 40 hacemos dos cosas la primera es calcular la dirección donde se encuentra el error y la longitud del mismo.

Las líneas 50-80 son líneas informativas que se las puede uno ahorrar pero que aquí se ponen para mejor exposición del programa.

Las líneas 90-110 escriben el mensaje de error.

Fijaos que el bucle no lo comenzamos en la posición b posición donde comienza el mensaje, sino que lo empezamos en la b+2 ya que los bytes b y b+1 lo que contienen es información de cómo de largo es el mensaje en si. ¿Curioso no?

Bueno después de todo este rollo y sabido ya cómo está dispuesta la tabla de errores en el QL, vamos ¡¡POR FIN!! a hacer un programa que nos la cambie y ponga los errores que nosotros queramos.

Para ello sirve el siguiente (y ultimo) programita:

10 RESTORE 140

20 comienzo=RESPR(1024)

30 puntero=comienzo+60

40 POKE_W comienzo,19195

50 FOR i=1 TO 29

60 POKE_W comienzo+i*2,puntero-comienzo

70 READ a$

80 IF i<>22 THEN a$=a$&CHR$(10)

90 IF i <28 THEN POKE_W puntero,LEN(a$):puntero=puntero+2

100 FOR j=1 TO LEN(a$):POKE puntero,CODE(a$(j)):puntero=puntero+1

110 IF puntero/2<>INT(puntero/2) THEN puntero =puntero+1

120 END FOR i

130 TRA 0,comienzo

140 DATA "! Aun no he Terminado !","Mierda de JOB","Compra      mas memoria Tío","Vaya numero mas gordo tío"

150 DATA "Ya esta llena la memoria intermedia","Quillo no encuentro      er canal","Macho, ese fichero no lo encuentro"

160 DATA "Tío ese fichero ya existe","Espera tío      que esta en uso","Se acabo el fichero"

170 DATA "Ya esta el mdv/disco...Jodete","Ese nombre no vale"

180 DATA "Se jodió la transmisión","Se jodió      el formateo","Ese dato es una mierda"

190 DATA "Este mdv/disco es una mierda","Te has equivocado      en la sintaxis","Quillo vaya numero mas gordo"

200 DATA "Eso aun no lo sé hacer","Este Mdv/disco es      solo para leer","Mierda de linea"

210 DATA "en linea "," cachos "

220 DATA "F1...Monitor"&CHR$(10)&"F2...Tele"

230 DATA "1989 Pispa Serbalabari CUQ"

240 DATA "Me has parado en mitad de un WHEN","Me has liado      tanto que ya no sé que estaba haciendo"

250 DATA "DomLunMarMieJueVieSab"

260 DATA "EneFebMarAbrMayJunJulAgoSetOctNovDic"

Perdonar pero este programa lo he importado a Quill y ahora no se como hacer para que me respete los márgenes de Quill me calculo que será con el guionador.

De todas las maneras y dado que este programita ya es un poco grande lo he incluido en la librería que mando al CUQ para que así no lo tengáis que teclear y si queréis cambiarle los mensajes de error pues ya sabéis os vais a las lineas de Data y le ponéis los mensajes que queráis.

Bueno empece ayer a hacer esta pequeña contribución al CUQ y ya llevo escritas 10 paginas !veis como es fácil! hasta el mes que viene.


Sinclair QL Recursos en Castellano Alojado en / Hosted at:
Sinclair QL Recursos en Castellano
Sinclair QL Spanish Resources