021:consultorio

Microhobby 21. Año II, del 26 de marzo al 1 de abril de 1985

OJO CON LA POTENCIA DE PROBLEMAS MATEMATICOS

Soy un asiduo lector de Microhobby y en el número 1 viene un programa que se llama Microcopi. Tengo la costumbre de hacer una copia de cada cinta que compro por seguridad; gracias a Microcopi lo he podido hacer. Hace unos días compré una cinta de juego, se trata de un simulador de vuelo, y ésta no he podido copiarla porque sobrepasa los 41471 bytes que admite Microcopi.

Mi pregunta es si hay alguna posibilidad de alterar el programa Microcopi para que pueda admitir más bytes, o si existe algún otro programa que pueda hacerlo.

David Martínez :: Vizcaya

Microcopi le permitirá sacar copias de todos los programas con cabecera real, en caso de tener cabecera falsa (como el que usted nos comenta), o sin cabecera, deberá recurrir a un copiador comercial.

El motivo de mi carta se encuentra en la revista número 5, concretamente en la sección de trucos, ya que al probar el truco referente a la auto-repetición de las teclas, éste no me daba el resultado deseado, lo cual me extrañaba mucho debido a la calidad de vuestra revista. La causa estaba en un error en las posiciones 23651 y 23652, correspondientes a las variables REPDEL y REPPER; las verdaderas posiciones son 23561 y 23562, con el númeo 5 y 6 cambiados de lugar. Quisiera que me explicárais la utilidad verdadera de las posiciones erróneas.

Guillermo Pérez :: Burgos

Le pedimos disculpas por el error.

Las posiciones de memoria 23651 y 23652 corresponden a la variable del sistema STKBOT que apunta al fondo de la pila del calculador.

Poseo un Spectrum Plus y la verdad es que se nota la diferencia con el de 48K en cuanto al teclado, pero tengo una duda con el mismo, concretamente en dos sentencias «INV. VIDEO» y «TRUE VIDEO»; ¿para qué me pueden servir?

Manuel L. Muñoz :: Sevilla

La sentencia «INV. VIDEO» sirve para imprimir en vídeo inverso, púlsela antes de lo que quiera imprimir. La sentencia «TRUE VIDEO» retorna a vídeo normal.

No son comandos de Basic, sino simplemente funciones del teclado. Los comandos correspondientes son «INVERSE 1» e «INVERSE 0».

Poseo un Spectrum Plus y quisiera hacerles una pregunta respecto a la extracción de subcadenas dentro de una cadena alfanumérica.

Tengo entendido que en Basic existen tres funciones, según que los caracteres que se quieren extraer estén al principio, al final o en medio de la cadena. Estas funciones son: LEFT$, RIGHT$ y MID$.

El problema es que mi ordenador no asimila estas funciones. ¿Cómo puedo realizarlas?

Jorge Requena :: Málaga

El Spectrum utiliza para fragmentar cadenas, la notación «TO»; por ejemplo: a$ (TO 3) le dará los tres primeros caracteres de a$; a$ (3 TO) le dará del tercero en adelante; y a$(2 TO 5) le dará del segundo al quinto.

En el número 7 de la revista salió, en el apartado de novedades, que ya hay una unidad de disco para el ZX Spectrum. Quisiera saber si esta unidad sirve para cualquier tipo de ordenador (sin tener que ser Sinclair).

Enrique Pons :: Barcelona

La unidad de disco es tipo IBM, no así la interface, que es exclusiva para el Spectrum.

Poseo un Interface 1 y cuando está funcionando algún programa en Basic que utiliza el modo IN 1 para joystick, me encuentro con el problema de que se bloquea. ¿Cómo se podría solucionar?

La otra pregunta es si se pueden imprimir los caracteres gráficos, tanto los predefinidos como los definibles en una impresora que utilice el interface RS 232 (en mi caso una BROTHER EP-22). Supongo que esto debe ser casi imposible en una impresora de margarita, pero parece factible en una matricial, por los puntos.

Daniel Julia :: Barcelona

El joystick tipo Kempston deberá leerlo con «IN 223», ya que la «IN 1» crea problemas si tiene la Interface 1 conectada.

No es posible imprimir los caracteres gráficos, ya que la RS 232 manda códigos, y los códigos de los caracteres gráficos son de control para la impresora. Puede, no obstante, intentar mandar bytes a través del canal «B» aunque el resultado depende de la impresora que utilice.

Me gustaría, a ser posible, que me explicaran el significado de la función STR$ y SQR.

Antonio J. Cabezas :: Barcelona

STR$: su argumento es un número, y su resultado es la cadena que representa a ese número. Ejemplo:

STR$ 4 = "4"
STR$ (5 + 3) = "8"

SQR: su argumento es un número positivo, y su resultado es la raíz cuadrada de ese número. Ejemplo:

SQR 9 = 3

Me sería sumamente útil, por motivos profesionales, poder eliminar los márgenes de la pantalla del televisor.

Luis Gutierrez :: Pontevedra

Por motivos de construcción interna, no es posible eliminar el «BORDER», a menos que actúe sobre el televisor.

Para que se ejecute un programa, al grabar con SAVE «Nombre» LINE x no soy capaz de meter el comando «LINE», porque después de las comillas no entra LINE sino L.

¿Me podría explicar el método de hacerlo?

Fermín González :: Gijón

El comando «LINE» se obtiene con «SIMBOL SHIFT» y «3» en modo extendido.

¿Es posible con el uso del conector posterior del Spectrum accionar el teclado, cortocircuitando, por ejemplo, un Ax con un Dx determinado?

Angel F. Perles :: Alicante

Al teclado hay que acceder a través de un «port», por tanto, lo que usted propone no es posible. Le remitimos al número 13, página 21 de nuestra revista.

Me dirigo a Vdes. aprovechando la sección que nos ofrecen a los lectores para efectuar consultas, y lo hago para exponerles un problema que, simple en principio, no me lo ha podido explicar el servicio técnico de Spectrum, con el cual me puso en contacto telefónico la tienda donde adquirí mi Spectrum Plus.

Este problema puede resultar muy grave para los usuarios que utilizamos el Spectrum en programación numérica, en mi caso soy profesor de matemáticas, y aunque seguidamente voy a plantear el problema, en resumen podemos decir:

El microordenador Spectrum Plus falla en cierto trabajos sencillos con la operación aritmética de potenciación (he probado otros Spectrum Plus, apreciando en todos el mismo error lógico).

Veamos en qué consiste el problema:

  1. La máquina calcula correctamente el valor numérico de una potencia, y, en consecuencia, en pantalla aparece el valor correcto.
  2. Pero si utilizamos el valor numérico hallado mediante la potenciación, la máquina se comporta como si este valor fuese mayor del que realmente es al ser utilizado en la instrucción «IF-THEN».

Tal vez se entiendan mejor las cosas con un programa de ejemplo de lo que quiero decir:

10 LET a = 3^2
20 PRINT a
30 IF a = 9 THEN PRINT «bien»
40 IF a > 9 THEN PRINT «mal»

corrido el programa, aparece en pantalla: 9 mal.

Aunque sencillo, el problema resulta de «órdago» en programación numérica. Por ello, y porque he dejado de «hablarle» al microordenador, es por lo que les molesto y les agradecería en el alma que tuviesen la amabilidad de ofrecerme una respuesta.

A. Petro Etxeberría :: Pamplona

Efectivamente, se trata de un problema aparentemente grave, si bien es posible solucionarlo profundizando algo más en la forma de trabajar de nuestro ordenador.

En principio, hay que tener en cuenta que el Spectrum, al igual que todos los ordenadores, trabaja en binario y en coma flotante. Asimismo, para elevar el número «a» al exponente «b» primero halla el logaritmo neperiano de «a»; a continuación, lo multiplica por «b», y el resultado lo utiliza como exponente para elevar a él la constante de Euler, o lo que es lo mismo, le halla el «antilogaritmo» neperiano.

Tanto el logaritmo neperiano como el número «e», se hallan generando una serie mediante polinomios de Tchebycheff, por lo que el resultado nunca es exacto.

Al imprimir en pantalla, el ordenador toma un máximo de ocho cifras significativas; pero al efectuar sus cálculos, lo hace en binario y en coma flotante; concretamente, la comparación se hace bit a bit. La razón de hacerlo así, es para evitar la acumulación de errores en cálculos repetitivos (imagínese la resolución de una integral por métodos numéricos) que produciría resultados catastróficos.

En general, estas pequeñas dificultades se pueden solucionar recurriendo a determinadas facilidades que nos brinda el Basic. Añada a su programa la línea:

15 LET a=VAL STR$ a

y verá cómo se reconcilia con su ordenador.

Para mayor información, le recomendamos el libro de los doctores Ian Logan y Frank O'Hara: «The complete Spectrum ROM disas-sembly», Ed. Melbourne House, 1983; pág. 222 a 230.

Al intentar crear un juego con una variedad de pantallas, y con una ejecución aleatoria, el ordenador sólo me ejecuta la primera de ellas. La función que he utilizado es:

10 IF Y = 27 THEN LET J = J (RND*10)
20 IF J = 0 THEN PRINT...
30 IF J = 1 THEN PRINT...

En la primera línea pongo el Y = 27 porque es el punto que me interesa para que cambie la pantalla.

Julián Rodríguez :: Gerona

Sustituya las líneas 20 y 30 por:

20 IF J < 5 THEN PRINT...
30 IF J > 5 THEN PRINT...
  • 021/consultorio.txt
  • Última modificación: d/m/Y H:i
  • por miguel