Curiosidades de Locomotive Basic

Programando el Amstrad en BASIC, C, etc.
Avatar de Usuario
NotFound
Me voy lanzando
Me voy lanzando
Mensajes: 36
Registrado: Mié 17 Ene , 2007 4:31 pm

Curiosidades de Locomotive Basic

Mensajepor NotFound » Sab 17 Abr , 2021 3:34 pm

El Locomotive Basic tiene un máximo de longitud de línea de 255 caracteres. Probemos:

Código: Seleccionar todo

1'XXXXXXX.....muchas X......XXabcdef
Tecleando esto rellenando con X hasta llenar el buffer de entrada.

Código: Seleccionar todo

LIST
1 'XXX......XXXXXabcde
¿Qué ha pasado con la 'f'? Pues que al listar incluye automáticamente un espacio tras el número de línea y eso no deja espacio para ella.

Código: Seleccionar todo

RENUM 10000
LIST
10000 'XXXXX......XXXXa
Ahora el número de línea ocupa cuatro caracteres mas, y se come otros tantos del final.

Código: Seleccionar todo

RENUM 1
LIST
1 'XXX......XXXXXabcde
Pero realmente siquen ahí aunque no los liste. Solo desparecerán si usamos EDIT.

Ahora probemos con algo que no sean comentarios:

Código: Seleccionar todo

10 i=i+i+i+i(59 veces)+i
Un solo caracter mas y nos responderá 'Line too long'. Pero la línea es mucho mas corta que antes. ¿Qué ocurre?

Una variable con nombre de un solo caracter ocupa 4 bytes: el ćodigo de variable sin sufijo, el nombre, y dos bytes de espacio para acelerar la búsqueda de variables en ejecución. Así que topamos con otro límite, distinto del de edición/listado. Si curioseamos con un depurador o con PEEK veremos que la longitud de línea es 130 hex, 304 decimal. Como la longitud incluye 4 bytes para número y longitud de línea y otro para un caracter 0 al final tenemos que el tamaño máximo del contenido usando el editor (sin hacer trampas con POKE u otras utiliades) es de 299 bytes.

Curioso ¿verdad?
Salu2

Avatar de Usuario
NotFound
Me voy lanzando
Me voy lanzando
Mensajes: 36
Registrado: Mié 17 Ene , 2007 4:31 pm

Re: Curiosidades de Locomotive Basic

Mensajepor NotFound » Mié 07 Jul , 2021 4:00 pm

Ampliando un poco el asunto: el límite del tamaño de línea viene del buffer de tokens, que está en el área de memoria baja reservada por la ROM Basic, habitualmente empezando en #40 y hasta #16F inclusive. O sea, los 304 bytes.

Lo de habitualmente viene de que otras ROM pueden reservar espacio antes de que se inicialice la de Basic. No se si hay alguna que lo haga, ya que todo el mundo suele hablar de que el Basic se almacena a partir de #170 sin mencionar excepciones.
Salu2

Avatar de Usuario
NotFound
Me voy lanzando
Me voy lanzando
Mensajes: 36
Registrado: Mié 17 Ene , 2007 4:31 pm

Línea número 0?

Mensajepor NotFound » Sab 17 Jul , 2021 4:36 pm

Otra curiosidad:

Sabemos que 0 no es un número de línea válido en Locomotive Basic (ni en la mayoría de los Basic, aunque hay excepciones). Pero ¿qué ocurre si hacemos trampa?

El comienzo de Basic casi siempre está en &170, así que el byte bajo del número de línea de la primera línea estará en &172

Código: Seleccionar todo

10 print"Hi"
poke &172, 0
list
Ha desparecido.

Probemos con mas líneas;

Código: Seleccionar todo

new
10 print"Hi"
20 print "Oh"
poke &172, 0
list
20 PRINT "Oh"
La línea 0 no se muestra, pero la siguiente sí. ¿Y si ejecutamos?

Código: Seleccionar todo

run
Hi
Oh
tron
run
[0]Hi
[20]Oh
La línea invisible se ejecuta, y TRON muestra su número.

Y el programa puede guardarse y cargarse. Útil para gastar alguna bromilla... :D

(Editado)

Uh... ¿cómo se me coló este error? Por supuesto la dirección es &172, &173 es el byte alto del número de línea. Corregido,
Última edición por NotFound el Sab 24 Jul , 2021 3:25 pm, editado 1 vez en total.
Salu2

Poliyo
Keeper of The Forum
Keeper of The Forum
Mensajes: 909
Registrado: Jue 12 May , 2016 10:07 pm
Ubicación: Valencia

Re: Curiosidades de Locomotive Basic

Mensajepor Poliyo » Lun 19 Jul , 2021 8:43 am

Con respecto a lo último que comentas añadirte algo con respecto a la linea 0
Solo funciona el truco de no visible si es, o son, principio de programa.
Si la línea 0 no están al comienzo si que se muestran.
Te recomiendo le eches un ojo al Protector 3 (creo que lo llamé así) que es un programa en Basic que maneja todo este tipo de "protección" muy usado en su época

Poliyo
Keeper of The Forum
Keeper of The Forum
Mensajes: 909
Registrado: Jue 12 May , 2016 10:07 pm
Ubicación: Valencia

Re: Curiosidades de Locomotive Basic

Mensajepor Poliyo » Lun 19 Jul , 2021 9:05 am

Por si quieres avanzar en esto añadirte dos sistemas mas, uno de ellos muy usado, el otro no tanto (solo lo he visto una vez y tengo que volver a localizarlo para investigarlo)
El primero es el de insertar el propio cargador en código máquina en el programa basic.
El segundo, ya digo que solo lo he visto una vez y tengo que volver a localizarlo, era un cargador supuestamente basic, lo cargabas con Load "programa" pero al hacer LIST sale mensaje de comando desconocido

Avatar de Usuario
NotFound
Me voy lanzando
Me voy lanzando
Mensajes: 36
Registrado: Mié 17 Ene , 2007 4:31 pm

Re: Curiosidades de Locomotive Basic

Mensajepor NotFound » Lun 19 Jul , 2021 5:09 pm

Gracias por la info, eso aún no lo había probado.

Lo de profundizar, este hilo es para curiosidades, o sea, cosas que puedan probar usuarios con conocimientos elementales del Basic sin necesidad de mas que algún POKE.

Lo de que falle LIST se puede hacer pokeando uno de los token no usados E8 y E9.

Código: Seleccionar todo

10 rem Hello
list
10 REM Hello
print peek &174
197
Ready
poke &174,&e8
Ready
list
Syntax error
Ready
Salu2

Poliyo
Keeper of The Forum
Keeper of The Forum
Mensajes: 909
Registrado: Jue 12 May , 2016 10:07 pm
Ubicación: Valencia

Re: Curiosidades de Locomotive Basic

Mensajepor Poliyo » Lun 19 Jul , 2021 7:30 pm

Ese poke lo desconocía
Lo anoto, pero lo que me ralla es que ese error me lo da despues de un LOAD "programa" y no ser ha ejecutado nada antes, por lo que no se ha hecho ese poke. Tiene que haber un sistema para hacerlo desde la propia cabecera del fichero o...

Avatar de Usuario
NotFound
Me voy lanzando
Me voy lanzando
Mensajes: 36
Registrado: Mié 17 Ene , 2007 4:31 pm

Re: Curiosidades de Locomotive Basic

Mensajepor NotFound » Lun 19 Jul , 2021 11:20 pm

Con ese POKE y grabando el fichero después también pasará lo mismo al hacer LOAD.

El problema es conseguir que sea ejecutable. Probemos....

Código: Seleccionar todo

10 on error goto 100:print
20 print "Hi"
30 end
100 resume next
poke &17e, &e8
Ready
run
Hi
Ready
list
Syntax error
La dirección para machacar el PRINT se saca con unos pocos PEEK.

Como protección no es que sea muy eficaz, ya que un simple LIST 20- mostrará todo lo que vaya después.
Salu2

Poliyo
Keeper of The Forum
Keeper of The Forum
Mensajes: 909
Registrado: Jue 12 May , 2016 10:07 pm
Ubicación: Valencia

Re: Curiosidades de Locomotive Basic

Mensajepor Poliyo » Mar 20 Jul , 2021 8:22 am

Ok.
Ahora comprendida.
Ahora entiendo porque solo la ví en un cargador

banshie
Lechoncillo
Lechoncillo
Mensajes: 9
Registrado: Jue 05 Ago , 2021 2:39 pm
Ubicación: Ars Gratia Artis!

Re: Curiosidades de Locomotive Basic

Mensajepor banshie » Jue 05 Ago , 2021 11:52 pm

Buenas,

Si la memoria no me falla, para meter un binario, podías llegar hasta los 42K, había que pokear una dirección para decirle la longitud total o la dirección final (no lo recuerdo bien) y al guardar el fichero basic guardaba todo incluido el binario. Recuerdo que metía una línea 0 con un REM para 'taggear' el release y ocultabam la línea que hacía el CALL &xxxx que lanzaba el binario. Cargabas un basic de 42K lo listabas y salía una línea '0 Cracked by Steel McKraken' pero si lo ejecutabas salía el juego completo.

Supongo que alguien habrá mencionado ya estos trucos :)

Recuerdo que Wizard hizo un programita que restauraba todo a la normalidad y mostraba todas las líneas ocultas. Este vigués era un auténtico figura.

Avatar de Usuario
NotFound
Me voy lanzando
Me voy lanzando
Mensajes: 36
Registrado: Mié 17 Ene , 2007 4:31 pm

Compresor Basic de andar por casa

Mensajepor NotFound » Lun 24 Ene , 2022 12:21 am

En la dirección &AC00 hay un "redundant spaces flag" según la guía del firmware.

Con POKE, &AC00, 1 se activa, y a partir de ese momento al crear o editar una línea se eliminan todos los espacios innecesarios.

Pero claro, cuando nos damos cuenta de que hace falta algo mas de espacio es porque ya tenemos un programa de buen tamaño, y sería un latazo volverlo a teclear tras activar el flag, aunque sea con ayuda de AUTO.

La solución es sencilla:

Código: Seleccionar todo

SAVE "t",a
POKE &AC00, 1
LOAD "t"
Al guardarlo en modo ascii, al volverlo cargar se tienen que reinterpretar las líneas, y así el flag hace su efecto.

Normalmente hay bastantes espacios innecesarios aunque no lo parezca, porque al listar se añaden los que hacen falta para delimitar palabras clave (salvo FN que es un caso especial).
Salu2


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic