Basic optimizer for 8BP

Cómo pasar juegos a diferentes archivos, herramientas, software.
Avatar de Usuario
shao
Forum Addict
Forum Addict
Mensajes: 381
Registrado: Sab 06 Oct , 2012 8:37 pm
Ubicación: Alicante

Basic optimizer for 8BP

Mensajepor shao » Sab 21 May , 2022 9:22 pm

Descarga al final del mensaje

Mensaje inicial:
Hola, empiezo a crear este optimizador de código Basic para 8BP.
Lo que pretendo incluir sería:
  • Cambiar comandos 8BP por sus equivalente CALL.
  • Reducir extensión del nombre de las variables, puedes usar una variable como "energiaPersonaje" que luego en el código optimizado pasará a ser "D" o "A3" dependiendo del caso.
    Esto funcionará de modo que la primera variable que encuentre declarada le cambiará el nombre por "A", a la siguiente se le asignará el
    nomre "B" y así consecutivamente, cuando se haya completado el abecedario, entonces ahora será A1, A2 y, de nuevo, así consecutivamente.
  • Eliminar espacios de código en BASIC.
    No estoy seguro de en qué partes se puede hacer esto y en cuales no, por ejemplo, no se puede reemplazar "if inkey(67)" por "ifinkey(67)" porque Basic te informará de error de sintaxis.
  • Convertir todo el código Basic a una única línea, los gotos serán convertidos en arcoiris y unicornios aleatoriamente.
  • Poder declarar valores "constantes" que luego serán reemplazados por su valor.
    Declaras algo como "const PERSONAJE = 31" en el código basic, esto permitirá poder identificar mejor las líneas en las que se hace referencia a tu personaje y mejorar la comprensión del código basic de tu juego al poder poner un nombre al número de sprite. El optimizador reemplazara "PERSONAJE" por el valor 31. Con esto, tu código ya no sería ejecutable directamente en basic si no que necesitaría si o si que el optimizador haga su trabajo.
Todo esto son los objetivos iniciales, no sé si alguna de ellas no sería posible por alguna razón por lo que si alguien tiene alguna sugerencia o comentario, adelante, se puede discutir cualquier punto.
El asunto de los comentarios, no eliminaría comentarios ya que eso queda cubierto simplemente asignando el mismo número de línea al comentario y, al final del cóigo basic, especificar la línea como vacía.
También incluye una característica que te permitirá usar constantes en tu código Basic y que gracias a ello hará el código mucho más legible.

¿Cómo funcionaría?.
Mi idea es incluirlo en la automatización con notepad++.
Entonces el proceso sería:
Pulsas F6 desde notepad++ para ejecutar tu código basic en winape.
Se optimiza el código basic.
Se crea un fichero .bas que contendrá el código basic optimizado y ese fichero se incluye al dsk.
Se carga y se ejecuta en winape.

El optimizador traerá un archivo .txt en el que se definen todos los comandos de 8BP y su equivalente CALL, el optimizador cargará esos datos y hará el trabajo, así, si se cambia o se añade algún comando en el futuro en 8BP, se podrá modificar o añadir fácilmente.
Bof8BP es un optimizador de código Basic que incluye, entre otras opciones, la posibilidad de reemplazar las llamadas a la librería 8BP por sus correspondientes CALL de modo automático.
Bof8BP puede optimizar el código truncando los nombres de las variables, concatenando líneas y aplicando una serie de optimizaciones que harán que el interprete Basic ejecute el código más rápidamente, además de que ocupará menos espacio. Puedes encontrar más información en el LEEME.txt incluido en la descarga.

ATENCION:
PARA EL REEMPLAZO DE LAS LLAMADAS A 8BP POR SUS CORRESPONDIENTES CALL, BOF8BP SOLO FUNCIONA CON LA ULTIMA VERSION DE 8BP V41_05. LA MAYORIA DE LOS JUEGOS DE EJEMPLO QUE VIENEN EN 8BP EN LA CARPETA "GAME EXAMPLES" USAN UNA VERSION ANTERIOR DE 8BP POR LO QUE USAR BOF8BP CON ESOS JUEGOS PODRA PROVOCAR ERRORES.


//=================================
Versión 1.1:
- La eliminación de los espacios entre los números de línea y el primer carácter de código ahora es una optimización separada de la eliminación de espacios "normal". En el LEEME.txt está la información.
- Solucionado un problema con el truncado de las variables y el concatenado.
//=================================
Versión 1.1.1:
- Un pequeño problema con los espacios solucionado.
//=================================
Versión 1.1.2:
- Problema con la optimización de espacios solucionado, se imprimía un carácter $ en lugar del número de línea inicial.
//=================================
Versión 1.1.3:
- Problema con la deteccion de THEN en la concatenación cuando tiene un valor sin espacios a su izquierda solucionado.
//=================================
Versión 1.1.4:
- |MUSICOFF no está documentado en la doc de 8BP y el optimizador cometía un error cuando encontraba el comando, ahora el optimizador no modificará |MUSICOFF (no lo reemplazará por su CALL XXXX) ya que su dirección de memoria no está documentada y es desconocida.
- Se ha añadido info en LEEME.txt recomendando el orden para aplicar todas las optimizaciones.
//=================================
Versión 1.1.5 - 20/9/2022:
- Solucionado bug que impedía detectar los "then" seguidos de un número de línea y antecedidos de uno o más dígitos sin espacios de por medio. Esto permite ejecutar el juego "Paco el hombre" optimizado ya que anteriormente se producía el bug aquí solucionado. Este bug es parecido al solucionado en 1.1.3 pero con condiciones diferentes.
//=================================
Versión 1.1.6 - 21/9/2022:
- Se ha añadido el parámetro lcom, más info en el LEEME.txt.
Adjuntos
Bof8BP.zip
1.1.6
(67.9 KiB) Descargado 13 veces
Última edición por shao el Mié 21 Sep , 2022 8:09 pm, editado 36 veces en total.

Ivan
Forero habitual
Forero habitual
Mensajes: 157
Registrado: Dom 03 May , 2020 6:07 pm

Re: Basic for 8BP Optimizer

Mensajepor Ivan » Dom 22 May , 2022 7:55 am

Buena idea, sugerencias....
  • Cambiar comandos 8BP por sus equivalente CALL.
Esto es complicado. Cada versión de 8BP pueden cambiar las direcciones (pag. 275 del manual). Si aparece una nueva versión puede que los CALL sustituidos por el optimizador no funcionen.
  • Eliminar espacios de código en BASIC.
    No estoy seguro de en qué partes se puede hacer esto y en cuales no, por ejemplo, no se puede reemplazar "if inkey(67)" por "ifinkey(67)" porque Basic te informará de error de sintaxis.
  • Después de cada número de linea no es necesario el espacion en blanco: 10PRINT
  • Si en IF...THEN antes del THEN hay número se puede eliminar el espacio:IF a=1THEN
  • Si después del THEN O ELSE comienza con comando 8BP se elimina espacio: IF XXX THEN|SETUPSP..... ELSE|PRINTSP
  • Después de un THEN viene un GOTO se puede eliminar:IF XXXX THEN 360 ELSE 420
  • Convertir todo el código Basic a una única línea.
Controlar que cada línea en BASIC puede tener 256 carácteres como máximo

Avatar de Usuario
shao
Forum Addict
Forum Addict
Mensajes: 381
Registrado: Sab 06 Oct , 2012 8:37 pm
Ubicación: Alicante

Re: Basic for 8BP Optimizer

Mensajepor shao » Dom 22 May , 2022 7:47 pm

Buena idea, sugerencias....
  • Cambiar comandos 8BP por sus equivalente CALL.
Esto es complicado. Cada versión de 8BP pueden cambiar las direcciones (pag. 275 del manual). Si aparece una nueva versión puede que los CALL sustituidos por el optimizador no funcionen.
Si, por eso comenté que los comandos y sus equivalente CALL irán configurados en un txt para que se pueda editar fácilmente.
Esto es el .txt con las equivalencias, se puede añadir o modifcar fácilmente respetando el formato.
Imagen

Igualmente ya tengo esto programado y funcionando, genera un archivo con el código reemplazado.

Código original:
Imagen

Con CALL:
Imagen

Por lo que pone en el manual, esto de usar CALL hace el juego bastante más rápido aunque no he hecho comparaciones de fps respecto de usar CALL y no hacerlo.

Otra cosa es que si eliminamos números de línea ¿como funcionarán luego los goto a una línea que no existe?.

Lo otro que comentas queda anotado para lo siguiente.

Ivan
Forero habitual
Forero habitual
Mensajes: 157
Registrado: Dom 03 May , 2020 6:07 pm

Re: Basic for 8BP Optimizer

Mensajepor Ivan » Dom 22 May , 2022 8:50 pm

Por lo que he comprobado cambiar los comandos de 8BP por CALL solo ofrecen mejoras significativas cuando son llamados de forma repetitiva, por ejemplo en el ciclo del juego. Invocar de forma aislada a un CALL o a un comando es indiferente en cuanto a ganancia.

No se trata de borrar líneas sino de eliminar el espacio entre el número de línea y lo siguiente en BASIC: 10 PRINT -> 10PRINT

Avatar de Usuario
shao
Forum Addict
Forum Addict
Mensajes: 381
Registrado: Sab 06 Oct , 2012 8:37 pm
Ubicación: Alicante

Re: Basic for 8BP Optimizer

Mensajepor shao » Dom 22 May , 2022 9:48 pm

Si, entiendo lo de eliminar espacios pero yo me refería a concatenar líneas, aunque yo lo llamé "eliminar líneas", no sé exactamente cómo hacerlo porque no entiendo exactamente qué hace ese programa del que hablamos hace tiempo.

A ver si los fieras de por aquí ponen más optimizaciones
Para "fiera" acabo de descubrir una herramienta "Toolkit Basic Programmer's Aid - Amstrad Toolkit", de Beebugsoft (1985). Los créditos de la recomendación son de la página web del Profe (y a su vez de MiguelSky) en un post:
http://fremos.cheesetea.com/2014/06/06/ ... strad-cpc/

Entre otras muchas lleva una opción "|Pack" para compactar un programa BASIC. En mi caso, tras quedarme sin memoria, me recuperó más de 3KB libres.

Se ocupa de los REMs, Espacios, Variables (las trunca) y Concatenado de líneas. Puedes programar normalmente y optimizar con este programa al final, y que él se lo curre automáticamente. Ocupa memoria por lo que es recomendable cargar su versión cartucho ROM en emulador dejando tus 42KB para permitir cargar tu programa BASIC aun sin optimizar.

"Toolkit Basic Programmer's Aid - Amstrad Toolkit", de Beebugsoft (1985)
https://www.cpc-power.com/index.php?pag ... l&num=7261
Concatenar líneas es unir líneas, ¿ese programa cómo hace ese concatenado exactamente? ¿algún ejemplo para poder replicarlo?.

Avatar de Usuario
jjaranda13
Forero habitual
Forero habitual
Mensajes: 129
Registrado: Jue 18 Feb , 2016 4:12 pm

Re: Basic for 8BP Optimizer

Mensajepor jjaranda13 » Mar 24 May , 2022 7:48 pm

la idea de automatizar la optimizacion de un codigo BASIC 8BP me parece muy interesante y buena
Si puedo ayudar con cualquier duda u opinion aqui me teneis.
por ejemplo automatizar el cambio de comandos RSX a CALL me parece que es muy bueno. Hacerlo a mano es un poco pesado.
Ademas, asi solo hay que mantener y evolucionar el codigo original (el no optimizado) del juego y pasarlo por la herramienta si se evoluciona o se añade una fase nueva, cualquier cosa nueva

en fin, que me gusta la idea. Incluso podriamos meterlo dentro de 8BP como herramienta (si te parece a ti bien, respetando tu autoria)

lo dicho, intentare aportar a este hilo posibles ideas o sugerencias para construirlo

ideas:
- podrias usar el wrapper de 8bp (fichero 8bp.h) para extraer las direcciones de los CALL de forma coherente aunque cambien en el futuro
- podrias reemplazar cualquier secuencia de dos o mas espacios por uno solo
- podrias reemplazar cualquier IF ( A and B) por IF A THEN IF B THEN
- podrias eliminar cualquier comentario que no vaya despues de un goto (los que van despues de gotos no se ejecutan y no molestan)
- reducir longitud de nombre de variables es buena idea. No he medido la diferencia de rendimiento entre variables largas y cortas pero seguro que hay diferencia. Voy a hacer una medicion

en fin, ire dando ideas que se me vayan ocurriendo

Avatar de Usuario
shao
Forum Addict
Forum Addict
Mensajes: 381
Registrado: Sab 06 Oct , 2012 8:37 pm
Ubicación: Alicante

Re: Basic for 8BP Optimizer

Mensajepor shao » Mar 24 May , 2022 10:35 pm

la idea de automatizar la optimizacion de un codigo BASIC 8BP me parece muy interesante y buena
Si puedo ayudar con cualquier duda u opinion aqui me teneis.
por ejemplo automatizar el cambio de comandos RSX a CALL me parece que es muy bueno. Hacerlo a mano es un poco pesado.
Ademas, asi solo hay que mantener y evolucionar el codigo original (el no optimizado) del juego y pasarlo por la herramienta si se evoluciona o se añade una fase nueva, cualquier cosa nueva

en fin, que me gusta la idea. Incluso podriamos meterlo dentro de 8BP como herramienta (si te parece a ti bien, respetando tu autoria)

lo dicho, intentare aportar a este hilo posibles ideas o sugerencias para construirlo

ideas:
- podrias usar el wrapper de 8bp (fichero 8bp.h) para extraer las direcciones de los CALL de forma coherente aunque cambien en el futuro
- podrias reemplazar cualquier secuencia de dos o mas espacios por uno solo
- podrias reemplazar cualquier IF ( A and B) por IF A THEN IF B THEN
- podrias eliminar cualquier comentario que no vaya despues de un goto (los que van despues de gotos no se ejecutan y no molestan)
- reducir longitud de nombre de variables es buena idea. No he medido la diferencia de rendimiento entre variables largas y cortas pero seguro que hay diferencia. Voy a hacer una medicion

en fin, ire dando ideas que se me vayan ocurriendo
¡Gracias!, queda todo anotado aquí, de momento estaba quitando espacios, por ejemplo los espacios después del número de línea inicial pero di con un pequeño problema, minúsculo, pero ya seguiré quizá mañana.
Sólo se trata de que al quitar el espacio entre un THEN o ELSE y un comando 8BP:
ELSE |PRINTSP...
El comando 8BP ya no existe y en su lugar está el CALL, entonces esto daría problema:
ELSECALL...
Por lo que no se puede eliminar ese espacio creo.

Cuando termine este asunto de los espacios miraré eso de extraer las direcciones de memoria del archivo 8bp.h

El asunto de los comentarios, yo creo que simplemente asignando siempre a la misma línea el comentario y poniendo al final del código la línea como vacía está resuelto el asunto pero bien, es fácil hacer eso que dices de eliminarlos.

Como digo, todas las demás ideas quedan aquí registradas, poco a poco...

A ver que dice esa comparación sobre nombres largos y más cortos.

Avatar de Usuario
shao
Forum Addict
Forum Addict
Mensajes: 381
Registrado: Sab 06 Oct , 2012 8:37 pm
Ubicación: Alicante

Re: Basic for 8BP Optimizer

Mensajepor shao » Mié 25 May , 2022 4:50 pm

Ok, yo creo que, en principio, lo de los espacios está completado.
En este gif se puede ver un poco la eliminación de los espacios y eliminación de comentarios, está todo lo sugerido por Iván y jjaranda además de algunas otras pequeñas cosas.
Si se me está escapando algo sólo decidlo.

Lo siguiente será lo de los ifs que sugeriste, jjaranda.
Adjuntos
espacios.gif

Avatar de Usuario
jjaranda13
Forero habitual
Forero habitual
Mensajes: 129
Registrado: Jue 18 Feb , 2016 4:12 pm

Re: Basic for 8BP Optimizer

Mensajepor jjaranda13 » Jue 26 May , 2022 4:15 pm

genial shao!

por mi parte he hecho los deberes:

test de velocidad con variables de diferentes tamaños

a=a+1 ( 1 letra, tarda 1.18 ms)
ho=ho+1 (dos letras, tarda 1.2 ms) --> 2% mas
holaa =holaa+1 ( 5 letras, tarda 1.25 ms) --> 6% mas
holaamigos=holaamigos+1 (10 letras , tarda 1.34 ms) --> 13% mas

es decir que si se consigue reducir la longitud del nombre de las variables, la velocidad sube entre un 2% y un 13% en las operaciones con ellas. hablando a ojo en media podriamos ganar 0.05 ms en cada operacion , ya que muchas veces las variables de partida ya son cortas, de dos o 4 caracteres.
por ejemplo en un ciclo de juego con 20 accesos a variables (que no es mucho) podemos hablar de ganar 1ms en total, lo cual esta muy bien. Seguramente se ganará mas y cada milisegundo cuenta para aumentar los fps

tambien influye que haya muchas variables declaradas. SI creo un array de 1000 posiciones, aunque no lo use, lo que tarda 1.2 pasa a tardar 1.26. Es decir, la cantidad de variables declaradas afecta al rendimiento del acceso a las variables

Avatar de Usuario
shao
Forum Addict
Forum Addict
Mensajes: 381
Registrado: Sab 06 Oct , 2012 8:37 pm
Ubicación: Alicante

Re: Basic for 8BP Optimizer

Mensajepor shao » Jue 26 May , 2022 9:07 pm

Curiosos los resultados.
A parte de los tiempos, también se gana en memoria ya que, obviamente, cuanto más corto es el nombre menos caracteres habrá que guardar en memoria.

Yo estoy medio atascado con esto, no encuentro como crear una expresión regex que me excluya el código entre comillas, que sería el código de un print.
Necesito modificar todo el código basic excepto lo que pones en un PRINT, por lo que debo excluir todo lo que está escrito entre comillas.

Avatar de Usuario
shao
Forum Addict
Forum Addict
Mensajes: 381
Registrado: Sab 06 Oct , 2012 8:37 pm
Ubicación: Alicante

Re: Basic for 8BP Optimizer

Mensajepor shao » Sab 28 May , 2022 1:18 pm

Hay una anotación respecto a la sugerencia sobre:
- podrias reemplazar cualquier IF ( A and B) por IF A THEN IF B THEN
Si no me equivoco esa modificación sólo se podría hacer si el IF inicial no tiene un ELSE, ya que si no, entonces ese ELSE pasaría a formar parte del último if que se añadió en la modificación, cuando la intención inicial era que formara parte del primer if.
Se vuelve demasiado complejo comprobar que exista al menos un AND, también se debe comprobar que no exista un ELSE para el primer if, y también que THEN puede estar entre espacios o no, es decir, THEN podría estar así:

if x = 0 and y = 0then s = 9 else...
o así:
if x = 0 and y = 0 then s = 9 else...

Entonces, se debe comprobar:
- Que no exista un ELSE para el primer if
- La forma en la que está colocado el THEN para saber qué expresión podría tener a su izquierda
- Comprobar cuantos AND encadenados hay, ya que podría ser algo como:
if x = 6 AND y = 0 AND t = 3 AND...

Se vuelve demasiado complejo, creo que eso va a quedar en manos del programador y no del optimizador, me refiero a cambiar esto:
if x = 0 and y = 0...
por esto
if x = 0 then if y = 0

Fuera de eso todos los ejemplos que trae la librería 8BP en BASIC probados y funcionando.

Ivan
Forero habitual
Forero habitual
Mensajes: 157
Registrado: Dom 03 May , 2020 6:07 pm

Re: Basic for 8BP Optimizer

Mensajepor Ivan » Sab 28 May , 2022 7:12 pm

Muy buen trabajo!!!

Pensando en la concatenación de líneas podrías probar a concantenar excepto aquellas que tengan un GOTO

10 print a
20 print b:GOTO 100
30 print c:GOTO 200

Concantenando....

10 print a:print b:GOTO 100:print c:GOTO 200
Nunca llegaría al print c

También habría que tener en cuenta que si después de un THEN viene un número equivale a un GOTO

10 IF xxxx THEN 100 ->Igual que IF xxxx THEN GOTO 100


Si pruebas el BASIC toolkit que te han recomendado podrás ver como optimiza el código aunque es mejorable porque no tiene en cuenta todos los casos.

Avatar de Usuario
shao
Forum Addict
Forum Addict
Mensajes: 381
Registrado: Sab 06 Oct , 2012 8:37 pm
Ubicación: Alicante

Re: Basic for 8BP Optimizer

Mensajepor shao » Sab 28 May , 2022 8:18 pm

¡Gracias!.
Si, habría que controlar varias cosas ahí, además de lo que mencionas.
- Que la concatenación no supere los 256 caracteres.
- Comprobar qué líneas son referenciadas por un goto para no alterar esas líneas y no modificarlas o eliminar su número de línea.

Intenté usar ese programa y ahora estoy intentando de nuevo pero no sé cómo debo ejecutarlo, he probado a hacer run con todo pero no pude ejecutarlo.

Estoy viendo que se debe ejecutar como run"DISC pero ¿y luego qué?, eso no ejecuta ningún menú.

Ivan
Forero habitual
Forero habitual
Mensajes: 157
Registrado: Dom 03 May , 2020 6:07 pm

Re: Basic for 8BP Optimizer

Mensajepor Ivan » Sab 28 May , 2022 8:46 pm

-Cargas el primer disco
-Run "toolkit1.bas". No pasará nada, simplemente se queda el programa residente en memoria
-Copias y pegas el código de BASIC que quieres optimizar
-Ejecutas |PACK y te aparecerán las opciones
-Una vez realizada la optimización, desde la ventana Assembler(F3) del Winape, menú->Read BASIC y te pegará el código optimizado

Avatar de Usuario
shao
Forum Addict
Forum Addict
Mensajes: 381
Registrado: Sab 06 Oct , 2012 8:37 pm
Ubicación: Alicante

Re: Basic for 8BP Optimizer

Mensajepor shao » Sab 28 May , 2022 9:27 pm

Ok, ya veo, hace muy buen trabajo.
Aunque no elimina esos espacios al inicio de línea y para acortar los nombres de las variables utiliza más de un carácter, no entiendo porqué.
En vez de llamar a las variables A,B,C,D hace B,C0,J0,E..., es decir, que tiene pocas variables para renombrar y podría llamarlas A,B,C,D etc...

Un programa de 3000 (el spedit en basic) lo dejó en 800 o así, está muy bien.

Lo que no sé muy bien cómo hacer es cómo detectar las variables que se declaran y que se deben acortar.
Anteriormente ya dije que se podría declarar al inicio del código simplemente algo como:

const energiaPersonaje = 30;
o para variable
var municion;

Eso tendríamos que valorarlo, ¿qué os parece ese modo?.
Es decir, al inicio del código se declaran las const y las var, las const serán reemplazadas por el valor y a las var se les recortará el nombre. Con eso el código BASIC ya está siendo "invadido" por las características del optimizador pero bueno, hay que ver.

const cambio_animacion = X
var cantidad_municion
5 cantidad_municion = 20
10 MEMORY 23999
11 banco=42540
12 for dir=banco to banco+40*2 step 2: y=int(rnd*200):x=int(rnd*80):poke dir,y:poke dir+1,x:next
20 MODE 0: DEFINT A-Z: CALL &6B78:' install RSX
25 ON BREAK GOSUB 2800
30 CALL &BC02:INK 0,0:'restaura paleta por defecto
50 FOR j=0 TO 31:|SETUPSP,j,0,0:NEXT:'reset sprites
80 |SETLIMITS,12,80,0,125:|3d,0

Y el optimizador muy fácilmente obtiene esos nombres y los reemplaza, pero sin hacer eso, es decir, haciendo como lo que hace esta tool, no sé muy bien, en principio, cómo podría detectar las variables declaradas por el usuario.
Me da que esta tool debe acceder de algún modo a esos nombres declarados por el usuario, es decir, debe acceder a la memoria para obtener esa información, cosa que yo no puedo, obviamente.
Tendría que comprobar cada palabra para ver si no es un comando BASIC ni 8BP, las variables BASIC solo pueden tener letras y números si no me equivoco, si es así, facilitaría algo la cosa.

Es decir, las variables BASIC sólo pueden ser caracteres alfanuméricos: a-z A-Z 0-9


¿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