Basic optimizer for 8BP

Cómo pasar juegos a diferentes archivos, herramientas, software.
Avatar de Usuario
MoteroV4
Forero habitual
Forero habitual
Mensajes: 106
Registrado: Jue 02 May , 2019 9:26 pm

Re: Basic for 8BP Optimizer

Mensajepor MoteroV4 » Dom 29 May , 2022 2:55 am

Lo que no sé muy bien cómo hacer es cómo detectar las variables que se declaran y que se deben acortar.
Yo cargo Toolkit en Winape desde la versión ROM, así te deja 41.6 KB libres para tu programa BASIC. Luego llamo al |PACK.

Las variables las acorta a una letra y un número. De forma que las que empiezan por A las llama A0, A1, A2... Supongo que si hubiera más de 9 pasaría a AA, AB, AC...AZ. Las que empiezan por B, lo mismo.
Toda variable en orígen con más de 2 caracteres las acorta.

Para detectar las variables, todo texto no encerrado entre "", o tras un REM o ', empiece por |, etc. yo las compararía con una matriz de palabras clave reservadas de Locomotive BASIC, introducida de antemano. Y si dicho texto encontrado en el programa no consta en la matriz, pues entonces se trata de una variable.

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 29 May , 2022 9:19 am

Ese sería el modo, digamos, más elegante pero también el más pesado por la cantidad de palabras que habría que comprobar, en un texto largo como el ejemplo del spedit que trae 8BP quizá se empezaría a notar la carga de procesamiento, me refiero a que actualmente es bastante ligero y la optimización se produce al vuelo, usando ese modo eso podría cambiar, sobre todo si hay mucho código BASIC. No he realizado pruebas pero es mi impresión inicial.

El modo que propuse yo sería más rápido aunque, como dije, "invadirá" al código BASIC + 8BP, haría la mitad de comprobaciones ya que tú ya le estás indicando al optimizador el nombre de tus variables y constantes al inicio del código y el optimizador lo tendrá mucho más fácil para saber qué nombres les has asignado.
Igualmente ese modo se va a implementar para poder declarar esas constantes que permitirán mejorar mucho la legibilidad del código.

Igual simplemente indicando cómo vas a hacer la optimización se podría elegir entre un modo u otro.


A mi me puso los nombres de variables como A J0 B0 C etc... yo sólo asignaré letras A B C D... y si se sobrepasa el abecedario entonces A1 etc...

Probé esa versión ROM pero no supe como se carga.

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 29 May , 2022 1:30 pm

Ok, aquí está funcionando correctamente en el modo "pesado" con las variables del código de spedit.

Imagen

¿Qué ocupa un carácter en memoria?, a ver si podría calcular cuantos bytes se ahorra el optimizador.
La cuenta es que por cada espacio habría que ir sumando lo que ocupa un caracter para tener la cuenta de los byte ahorrados.

Yo creo que bien para el código BASIC ya no habría que reservar 24000 si no 20000 quizás.

Avatar de Usuario
MoteroV4
Forero habitual
Forero habitual
Mensajes: 106
Registrado: Jue 02 May , 2019 9:26 pm

Re: Basic for 8BP Optimizer

Mensajepor MoteroV4 » Dom 29 May , 2022 3:06 pm


Probé esa versión ROM pero no supe como se carga.
Para cargar la versión ROM de Toolkit en Winape hay que ir a -->Settings --> Memory --> ROMs Upper 8 (o cualquiera libre) --> Select File... -->"toolkit.rom" --> OK -->Settings--> Reset

Aparecerá el mensaje de "Toolkit (c) 1985 Beebugsoft" iincrustado antes del BASIC 1.1 y el Ready.

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 29 May , 2022 8:52 pm

Ok, gracias por la info, nunca hice eso entonces no tenía ni idea.

Aquí os dejo el listado de spedit con las variables truncadas por si hay algún curioso. Di con un problema esta mañana por la modificación de la longitud del código al ir truncando las variables, hay que ir aplicando un offset al index pero ahora lo tengo solucionado.

Se pueden comparar la memoria que se gana comparando el archivo original de spedit con el de las variables truncadas ya que en este archivo no hay ninguna modificación más que cambiar los nombres de las variables por su truncado.
Lo que no sé, como dije ántes, es lo que ocupa un carácter en BASIC, entonces, por cada carácter eliminado, se gana esa memoria.
Adjuntos
spedit_variables_truncadas.zip
(4.09 KiB) Descargado 20 veces

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

Re: Basic for 8BP Optimizer

Mensajepor Ivan » Lun 30 May , 2022 4:42 pm

He visto el archivo y está muy bien. El hecho de tener que designar las variables de una forma predeterminada para que funcione el optimizador... me chirría un poco aunque entiendo el razonamiento

-Poner LET antes de cada declaración de variables ayudaría al optimizador aunque seguimos "forzando" la escritura de código
-Una forma para detectar variables es que a la izquierda de un = suele haber una. Excepciones que se me ocurren:
Arrays: a(3)=x
Funciones definidas: DEF FNa(i,j)=VAL(MID$(b$,i,j))


He probado el Toolkit para concatenar líneas y no lo hace bien. Después de RETURN me mete líneas que, obviamente, nunca se llegaran a ejecutar. Recuerdo de haberlo utilizado anteriormente y funcionar bien. Curioso.

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 » Lun 30 May , 2022 6:36 pm

He visto el archivo y está muy bien. El hecho de tener que designar las variables de una forma predeterminada para que funcione el optimizador... me chirría un poco aunque entiendo el razonamiento

-Poner LET antes de cada declaración de variables ayudaría al optimizador aunque seguimos "forzando" la escritura de código
-Una forma para detectar variables es que a la izquierda de un = suele haber una. Excepciones que se me ocurren:
Arrays: a(3)=x
Funciones definidas: DEF FNa(i,j)=VAL(MID$(b$,i,j))


He probado el Toolkit para concatenar líneas y no lo hace bien. Después de RETURN me mete líneas que, obviamente, nunca se llegaran a ejecutar. Recuerdo de haberlo utilizado anteriormente y funcionar bien. Curioso.
He visto el archivo y está muy bien. El hecho de tener que designar las variables de una forma predeterminada para que funcione el optimizador... me chirría un poco aunque entiendo el razonamiento
Eso es necesario para las constantes pero para las variables no, podrás tener variables como "energiaEnemigo" que luego serán truncadas y no necesitarás declararla de forma predeterminada antes o fuera del código, pero las constantes si es necesario declararlas, no hay otro modo para las constantes me temo.
-Una forma para detectar variables es que a la izquierda de un = suele haber una. Excepciones que se me ocurren:
Arrays: a(3)=x
Funciones definidas: DEF FNa(i,j)=VAL(MID$(b$,i,j))
Esas excepciones... no las estoy controlando, necesitaría un código de ejemplo que haga algo mínimamente para yo poder testearlo y que tras ser optimizado siga funcionando correctamente. Un código de pocas líneas que incluya esos casos más raros pero que deben ser soportados claro.

Ahora mismo también le implementé un renum, los casos que he tenido en cuenta para ser readaptados son:
GOTO xxx
THEN xxx
GOSUB xxx
Esos valores son reasignados a su nuevo número de línea, que yo sepa no hay otros ¿estoy en lo cierto?.

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

Re: Basic for 8BP Optimizer

Mensajepor Ivan » Lun 30 May , 2022 7:13 pm

Vigila con las expresiones
On xx GOTO 10,20,30,40
ON xx GOSUB 10,20,30,40

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é 01 Jun , 2022 1:20 pm

Ok, la renumeración funciona con los GOTO X, X, XXX y los GOSUB X, XX, XXX etc...
La renumeración no comprueba si tu tienes un ON antes del GOTO/GOSUB, eso es error tuyo de sintaxis, lo que hace es corregir los valores que hay después del GOTO/GOSUB, ya sea un valor o varios separados por comas.
Supongamos el caso en el que tienes esto:
50 GOTO 10,30
No tiene sentido que escribas eso en tu código BASIC pero el renumerado tomará esos números después del GOTO y los corregirá, considero que no es tarea del renumerado el hecho de avisarte de que te falta el ON. De eso te avisará el interprete BASIC.

Para la concatenación sé que no se debe hacer si se cumple alguna de estas condiciones:
- Si tiene un GOTO o un THEN xxx, no debe modificarse la línea. Con GOSUB si porque habrá un RETURN.
- El número de línea a concatenar está referenciado por un GOTO/THEN/GOSUB, por lo que la línea no puede modificarse.
- Si como resultado de concatenar la línea se sobrepasan los 256 caracteres, no debe realizarse el concatenado.


La concatenación se hace tal y como tienes el código, si tienes espacios por ahí duplicados etc... entonces primero deberías hacer una optimización de los espacios, además también le vendría bien una de truncamiento para nombres de variables. Pero, por si sola, no hace nada de eso.

¿Alguna condición más que deba tener en cuenta?.
Última edición por shao el Jue 02 Jun , 2022 8:44 am, editado 1 vez en total.

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

Re: Basic for 8BP Optimizer

Mensajepor Ivan » Mié 01 Jun , 2022 6:52 pm

Ok, la renumeración funciona con los GOTO X, X, XXX y los GOSUB X, XX, XXX etc...
La renumeración no comprueba si tu tienes un ON antes del GOTO/GOSUB, eso es error tuyo de sintaxis, lo que hace es corregir los valores que hay después del GOTO/GOSUB, ya sea un valor o varios separados por comas.
Supongamos el caso en el que tienes esto:
50 GOTO 10,30
No tiene sentido que escribas eso en tu código BASIC pero el renumerado tomará esos números después del GOTO y los corregirá, considero que no es tarea del renumerado el hecho de avisarte de que te falta el ON. De eso te avisará el interprete BASIC.
Lo que indicaba es que hay expresiones en las que después de GOTO/GOSUB pueden haber varios números de línea y no solo uno. Si ya lo tienes controlado... perfecto.


Por cierto, acabo de cambiar los CALL &XXX por CALL&XXX y funciona
También funciona FOR i=0TO 10 :mrgreen:

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é 01 Jun , 2022 8:11 pm

Si, los GOTO/GOSUB con varias referencias a números de línea están soportados.

Sobre esos espacios extras en los CALL y FOR pues perfecto más espacio ahorrado.

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 02 Jun , 2022 9:09 am

No tengo claro cuando puedo hacer el concatenado o cuando no, viendo como funciona toolkit no entiendo porqué razón no hace un concatenado en algunas ocasiones y me da que quizá estoy pasando algo por alto, no tengo un conocimiento todo lo amplio que se puede tener de BASIC.

Por ejemplo ¿por qué tookit aquí no concatenó las siguientes líneas?, concatenó las que he señalado pero las otras con "?" no y no entiendo porqué, no fue porque ya superó los 256 caracteres.

Imagen

Avatar de Usuario
MoteroV4
Forero habitual
Forero habitual
Mensajes: 106
Registrado: Jue 02 May , 2019 9:26 pm

Re: Basic for 8BP Optimizer

Mensajepor MoteroV4 » Jue 02 Jun , 2022 4:31 pm

No tengo claro cuando puedo hacer el concatenado o cuando no, viendo como funciona toolkit no entiendo porqué razón no hace un concatenado en algunas ocasiones y me da que quizá estoy pasando algo por alto, no tengo un conocimiento todo lo amplio que se puede tener de BASIC.

Por ejemplo ¿por qué tookit aquí no concatenó las siguientes líneas?, concatenó las que he señalado pero las otras con "?" no y no entiendo porqué, no fue porque ya superó los 256 caracteres.

Imagen
Toolkit no concatena aquellas líneas que están siendo llamadas desde otros puntos del programa, ya sea con GOTO, THEN (como haces en 590) o GOSUB. Si lo hiciera, al eliminar esas líneas daría error.

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 02 Jun , 2022 5:47 pm

Es cierto, descuido mío y ¿qué hay de este caso? ¿por qué no concatenó estas dos líneas a la 740?.

Imagen

Esas líneas 744 y 745 no están siendo referenciadas desde ninguna parte del código.

Avatar de Usuario
MoteroV4
Forero habitual
Forero habitual
Mensajes: 106
Registrado: Jue 02 May , 2019 9:26 pm

Re: Basic for 8BP Optimizer

Mensajepor MoteroV4 » Jue 02 Jun , 2022 6:05 pm

Es cierto, descuido mío y ¿qué hay de este caso? ¿por qué no concatenó estas dos líneas a la 740?.

Imagen

¿Quizá toolkit detecto el THEN en 744 y 745 y eso fue suficiente para no concatenar?, es decir, no fue más allá para comprobar si el THEN hacía referencia a un número de línea o no, simplemente detecto un THEN en las líneas 744 y 745 y con eso ya no hizo la concatenación de dichas líneas a la 740.
Esas líneas 744 y 745 no están siendo referenciadas desde ninguna parte del código.
No puede concatenar por el IF en la 740. Cuando la condición no da "true", no se cumple, BASIC ignora el resto de la línea, no la ejecuta, incluyendo todos los dos puntos (:) concatenados que se pusieran posteriormente.


¿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