Un compilador de ZX Spectrum BASIC

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Lun Abr 19, 2010 1:26 pm

na_th_an escribió:Vale, he puesto la corrección, y sí compila. Cuando pass sólo tiene un carácter e intento hacerlo se cuelga (porque estoy haciendo un "1 TO 0"), pero esto es normal (ayudaría que en estos casos se devolviese la cadena vacía, pero no importa). Gracias :)

?? DEBE devolver cadena vacía. :( Evidentemente, con los últimos cambios debo de haber "roto" algo.

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Lun Abr 19, 2010 1:49 pm

Pues no, se queda el emu colgao :D He tenido que poner una guarda que compruebe antes que no se da el caso. Otra cosilla es el optimizador. He incluido la biblioteca que implementa la función "screen". Si llamo al compilador sin -O 3, se compila sin problemas. Si no, obtengo errores:

Código: Seleccionar todo

cabezooon.bas:29: warning: Variable 'col' is never used
cabezooon.bas:29: warning: Variable 'row' is never used
[...] (un montón de "INFO"s que salen siempre)
cabezooon.bas:49: Error: Undefined label 'PROC0.__S_SCRNS_BC'


He omitido una ristra de INFOs que suele salir cuando la compilación es correcta.

Estoy haciendo un juego completo usando BASIC puro (sin llamar a nada en ensamblador), por cierto. Cuando lo acabe te pasaré el código para que lo pongas en tu web, of course :)

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Lun Abr 19, 2010 1:55 pm

na_th_an escribió:Pues no, se queda el emu colgao :D He tenido que poner una guarda que compruebe antes que no se da el caso. Otra cosilla es el optimizador. He incluido la biblioteca que implementa la función "screen". Si llamo al compilador sin -O 3, se compila sin problemas. Si no, obtengo errores:

Código: Seleccionar todo

cabezooon.bas:29: warning: Variable 'col' is never used
cabezooon.bas:29: warning: Variable 'row' is never used
[...] (un montón de "INFO"s que salen siempre)
cabezooon.bas:49: Error: Undefined label 'PROC0.__S_SCRNS_BC'


He omitido una ristra de INFOs que suele salir cuando la compilación es correcta.

Estoy haciendo un juego completo usando BASIC puro (sin llamar a nada en ensamblador), por cierto. Cuando lo acabe te pasaré el código para que lo pongas en tu web, of course :)

Parece, por lo que cuentas, que el compilador está eliminando las variables col y row (que son locales), porque no entiende que el código ensamblador las utiliza. Precisamente es lo que estaba trabajando. La idea es notificar al compilador que no elimine ciertas variables o funciones del listado basic, porque el ASM las va a utilizar. Esto se podría hacer, por ejemplo, con alguna directiva tipo:

Código: Seleccionar todo

#pragma required(col, row)

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Lun Abr 19, 2010 1:59 pm

Me parece muy buena solución.

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Lun Abr 19, 2010 8:42 pm

na_th_an escribió:Pues no, se queda el emu colgao :D He tenido que poner una guarda que compruebe antes que no se da el caso. Otra cosilla es el optimizador. He incluido la biblioteca que implementa la función "screen". Si llamo al compilador sin -O 3, se compila sin problemas. Si no, obtengo errores:

Código: Seleccionar todo

cabezooon.bas:29: warning: Variable 'col' is never used
cabezooon.bas:29: warning: Variable 'row' is never used
[...] (un montón de "INFO"s que salen siempre)
cabezooon.bas:49: Error: Undefined label 'PROC0.__S_SCRNS_BC'


He omitido una ristra de INFOs que suele salir cuando la compilación es correcta.

Vale, este error ya está corregido. Bájate la última versión 1.2.6 que hay online, y prúebala, porfa-plis.

Estoy haciendo un juego completo usando BASIC puro (sin llamar a nada en ensamblador), por cierto. Cuando lo acabe te pasaré el código para que lo pongas en tu web, of course :)

Pues se agradece (el compilador es libre, y se pueden hacer juegos comerciales con él incluso). Si te puedo echar alguna mano explicándote algo, avisa. Por ejemplo, recuerda que con OVER 2 y OVER 3 puedes hacer algo de "Filmation", y que puedes usar la función GetKey para leer múltiples teclas a la vez (incluso con las interrupciones desactivadas). Lo usa apenao en su juego para mover el personaje en diagonal.

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Lun Abr 19, 2010 10:50 pm

na_th_an escribió:Vale, he puesto la corrección, y sí compila. Cuando pass sólo tiene un carácter e intento hacerlo se cuelga (porque estoy haciendo un "1 TO 0"), pero esto es normal (ayudaría que en estos casos se devolviese la cadena vacía, pero no importa). Gracias :)

No consigo reproducir este problema. De hecho a mi me da cadena vacía (como debe ser). ¿Podrías comprobarlo con la última versión?
También te recuerdo que el string slicing cuenta desde 0, como en C: "JUAN"(0) = "J"

Si el problema persiste, por la experiencia que tengo con los otros usuarios del foro, suele ser que se ha corrompido el HEAP (el área de memoria donde se guardan las cadenas). En la siguiente versión pondré un "boundary check" entre otras cosas: un modo de depuración para que el programa cante de inmediato ante un fallo.

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Mar Abr 20, 2010 9:52 am

Boriel escribió:
na_th_an escribió:Vale, he puesto la corrección, y sí compila. Cuando pass sólo tiene un carácter e intento hacerlo se cuelga (porque estoy haciendo un "1 TO 0"), pero esto es normal (ayudaría que en estos casos se devolviese la cadena vacía, pero no importa). Gracias :)

No consigo reproducir este problema. De hecho a mi me da cadena vacía (como debe ser). ¿Podrías comprobarlo con la última versión?
También te recuerdo que el string slicing cuenta desde 0, como en C: "JUAN"(0) = "J"

Si el problema persiste, por la experiencia que tengo con los otros usuarios del foro, suele ser que se ha corrompido el HEAP (el área de memoria donde se guardan las cadenas). En la siguiente versión pondré un "boundary check" entre otras cosas: un modo de depuración para que el programa cante de inmediato ante un fallo.


Puede ser que se me haya corrompido el heap, y por eso ocurre lo de la comparación de cadenas que te dije que fallaba. Voy a probarlo todo con la última versión que has puesto y ya te comento.

Pues se agradece (el compilador es libre, y se pueden hacer juegos comerciales con él incluso). Si te puedo echar alguna mano explicándote algo, avisa. Por ejemplo, recuerda que con OVER 2 y OVER 3 puedes hacer algo de "Filmation", y que puedes usar la función GetKey para leer múltiples teclas a la vez (incluso con las interrupciones desactivadas). Lo usa apenao en su juego para mover el personaje en diagonal.


Pues me tengo que mirar bien la documentación porque no sabía nada de eso :D Las teclas estaba leyéndolas yo a pelo mirando en los puertos con IN :lol: Lo que sí necesitaría saber cómo se hace es lo que te pregunté el otro día sobre pasar información entre BASIC y las secciones ASM, valores de variables, y cosas así. Mis experimentos han resultado en bonitos cuelgues.

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Mar Abr 20, 2010 11:08 am

Vale, he desinstalado la versión de ayer (zxbasic-1.2.6r1550.msi 19-Apr-2010 19:35 2.4M), he instalado la de hoy, y he hecho pruebas.

1.- Activando -O 3, si incluyo screen.bas sigo obteniendo los mismos warnings, pero compila y funciona perfectamente.

Código: Seleccionar todo

F:\Dev\Speccy\Cabezooon>"\Dev\Utils\zxbasic\zxb.exe" -O3 -T -B -a cabezooon.bas
cabezooon.bas:29: warning: Variable 'col' is never used
cabezooon.bas:29: warning: Variable 'row' is never used
INFO: __STORE_STR is not defined. No optimization is done.
INFO: BORDER is not defined. No optimization is done.
INFO: COPY_ATTR is not defined. No optimization is done.
INFO: CLS is not defined. No optimization is done.
INFO: __EQ16 is not defined. No optimization is done.
INFO: __LOADSTR is not defined. No optimization is done.
INFO: __STORE_STR2 is not defined. No optimization is done.
INFO: __STREQ is not defined. No optimization is done.
INFO: __FTOU32REG is not defined. No optimization is done.
INFO: __STRLEN is not defined. No optimization is done.
INFO: __STRSLICE is not defined. No optimization is done.
INFO: __ASC is not defined. No optimization is done.
INFO: __MEM_FREE is not defined. No optimization is done.
INFO: __MEM_ALLOC is not defined. No optimization is done.
INFO: PROC0.__S_SCRNS_BC is not defined. No optimization is done.
INFO: __FPSTACK_POP is not defined. No optimization is done.
INFO: PROC0.RECLAIM2 is not defined. No optimization is done.
INFO: __U8TOFREG is not defined. No optimization is done.
INFO: __AND8 is not defined. No optimization is done.
INFO: BRIGHT_TMP is not defined. No optimization is done.
INFO: PRINT_STR is not defined. No optimization is done.
INFO: __ILOADSTR is not defined. No optimization is done.
INFO: PRINT_STR_FREE is not defined. No optimization is done.
INFO: PRINT_EOL_ATTR is not defined. No optimization is done.
INFO: BEEP is not defined. No optimization is done.
INFO: __NEF is not defined. No optimization is done.
INFO: __SUB32 is not defined. No optimization is done.
INFO: __AND16 is not defined. No optimization is done.
INFO: __I32TOFREG is not defined. No optimization is done.
INFO: CHR is not defined. No optimization is done.
INFO: __MUL16_FAST is not defined. No optimization is done.
INFO: __MUL8_FAST is not defined. No optimization is done.
INFO: RANDOMIZE is not defined. No optimization is done.
INFO: __STRNE is not defined. No optimization is done.
INFO: __ADDSTR is not defined. No optimization is done.
INFO: __PRINTI16 is not defined. No optimization is done.
INFO: PRINT_EOL is not defined. No optimization is done.
INFO: __PAUSE is not defined. No optimization is done.
cabezooon.bas:20: warning: Variable 'i' is never used
cabezooon.bas:22: warning: Variable 'k' is never used
cabezooon.bas:21: warning: Variable 'j' is never used


2.- El string slicing: ya no se cuelga, pero parece que cadena (0 To -1) devuelve "cadena", sin hacer nada, en lugar de devolver la cadena vacía. Con este código:

Código: Seleccionar todo

pass = "A"
print at 0,0;pass;"     "
pass = pass (0 To Len (pass) - 2)
print at 1,0;pass;"     "


Como pass vale "A", Len (pass) vale 1. En la asignación, por tanto, se hace pass = pass (0 To -1), que devería devolver "". Sin embargo, en el segundo print se imprime "A".

3.- EDITO: Comparación de cadenas: Sigue sin funcionar correctamente. Sólo es necesario que tengan el mismo número de carácteres para que una comparación devuelva "cierto":

Código: Seleccionar todo

pass = "ITYC"

Print pass
If pass = "CACA" Then
   Print "check"
Else
   Print "not check"
End If


Imprime "check".

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Vie Abr 30, 2010 8:51 pm

Dios, no había leído este mensaje! Pues sí, Nathan. :x Fallan las comparaciones de cadenas. Lo he corregido. ¿Podrías bajarte la nueva versión? (La acabo de subir). Pensé que era un error que había reintroducido recientemente, pero no... es un fallo en la rutina central de comparación de cadenas, desde siempre. :shock: Básicamente, puse JP PE en vez de JP PO :x

Si puedes, please, bájatela y pruébala. A ver si cerramos este bug de una vez...

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por radastan » Sab May 01, 2010 12:00 am

Boriel, la semana que viene anuncio el nuevo concurso BASIC y una de las categorías pretende fomentar tu compilador. Dime si empleo el último enlace como versión a descargar o cómo lo hacemos. Pondré este hilo como foro de soporte para tu herramienta.

Creo que van a salir cosas muy sorprendentes, a ver que tal sale el asunto.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Sab May 01, 2010 12:17 am

radastan escribió:Boriel, la semana que viene anuncio el nuevo concurso BASIC y una de las categorías pretende fomentar tu compilador. Dime si empleo el último enlace como versión a descargar o cómo lo hacemos. Pondré este hilo como foro de soporte para tu herramienta.

Si, la última versión siempre estará disponible en http://www.boriel.com/files/zxb. Si quieres, para ser justos, lo que puedo hacer es "congelar" el desarrollo, para que todo el mundo use la misma versión (tenga los bugs que tengan). O si no, que pongan los problemas que encuentran en el foro (en español o en inglés: yo no hablo otra cosa, y en inglés me defiendo, más bien) y los corregiré los más rápido posible. Además, la documentación está incompleta. Lo mejor es preguntar (no tengo problema en contestar, o enlazar a las preguntas ya contestadas).
Creo que van a salir cosas muy sorprendentes, a ver que tal sale el asunto.
Yo con lo de apenao toy alucinando. Ahora resulta que hago el compilador y hay gente que lo usa mejor que yo :?: :?: :?: :lol:

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Sab May 01, 2010 12:24 am

na_th_an escribió:2.- El string slicing: ya no se cuelga, pero parece que cadena (0 To -1) devuelve "cadena", sin hacer nada, en lugar de devolver la cadena vacía. Con este código:

Código: Seleccionar todo

pass = "A"
print at 0,0;pass;"     "
pass = pass (0 To Len (pass) - 2)
print at 1,0;pass;"     "


Como pass vale "A", Len (pass) vale 1. En la asignación, por tanto, se hace pass = pass (0 To -1), que devería devolver "". Sin embargo, en el segundo print se imprime "A".

Olvidé comentar que aquí lo que sucede es distinto: CADENA$(x TO y) es una función que primero convierte a Uinteger (entero sin signo de 16 bits) los valores X e Y. Esto se hace así por velocidad (si no, el código sería más lento y largo). Lo más probable es que -1 se esté tomando como 65535, por lo que pass(0 TO 65535) sea efectivamente la cadena completa. Prueba con pass(3 TO 2) y verás que da cadena vacía. He estado pensando en aceptar el comportamiento que dices, pero sería complejísimo entonces, y creo que no valdría la pena.

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Lun May 03, 2010 8:49 am

Yo tengo mi rama del IF, pero documenta esto porque el comportamiento, a mi ver, queda poco "claro" (te lo digo mayormente porque llevo haciendo string slicing en BASIC en el Spectrum muchos años y estas cosas siempre las he hecho así) - otra cosa sería meter LEFT, RIGHT y MID.

También solucioné al final lo de la comparación de cadenas que no funciona con mi propia función que compara los valores carácter a carácter, pero apúntate que este programa:

Código: Seleccionar todo

Dim pass As String

pass = "ITYC"

Print pass
If pass = "CACA" Then
   Print "check"
Else
   Print "not check"
End If


no funciona correctamente (imprime "check").

Otra cosa que me gustaría es que me indicaras (o alguien) dónde puedo leer documentación o algún ejemplo sobre cómo mezclar BASIC y ASM, cómo referenciar variables de BASIC desde un bloque ASM como en z88dk y cosas así.

Por cierto, ¿existe alguna forma de compilar el código python del compilador? lo digo porque con el source de mi juego (alrededor de 44Kb) se tira unos cinco minutos para compilar.

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Lun May 03, 2010 11:42 am

na_th_an escribió:Yo tengo mi rama del IF, pero documenta esto porque el comportamiento, a mi ver, queda poco "claro" (te lo digo mayormente porque llevo haciendo string slicing en BASIC en el Spectrum muchos años y estas cosas siempre las he hecho así) - otra cosa sería meter LEFT, RIGHT y MID.

También solucioné al final lo de la comparación de cadenas que no funciona con mi propia función que compara los valores carácter a carácter, pero apúntate que este programa:

Seguramente no habías leído los mensajes anteriores. Básicamente, ya he corregido el error de las cadenas y te decía que te bajaras la nueva versión. En cuanto a las funciones LEFT, RIGHT y MID se pueden meter como librerías (biblioteca) en library/
na_th_an escribió:Otra cosa que me gustaría es que me indicaras (o alguien) dónde puedo leer documentación o algún ejemplo sobre cómo mezclar BASIC y ASM, cómo referenciar variables de BASIC desde un bloque ASM como en z88dk y cosas así.
na_th_an escribió:Por cierto, ¿existe alguna forma de compilar el código python del compilador? lo digo porque con el source de mi juego (alrededor de 44Kb) se tira unos cinco minutos para compilar.

No puede compilarse. Pero existe un "acelerador" de python, tipo Java o .NET (un JIT), llamado psyco. Es un módulo de python. Si tu versión de python es de 32bits, instálate psyco y el compilador la usará de forma automática. Lo normal es esperar una aceleración de x2 a x10.

De todas maneras, me gustaría diagnosticar eso, ya que pocas personas usan la versión python (creo que yo). Cuando ejecutas zxb.py --version qué te sale? ¿sólo la versión o algún aviso de "UMINUS no utilizado" y cosas así? La última vez que pasó algo así resultó ser un bug en las expresiones regulares.

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Lun May 03, 2010 12:30 pm

Cierto, se me habían pasado esos mensajes.

Sobre lo que dices del --version:

Código: Seleccionar todo

F:\Dev\Speccy\Crap Games\Cabezooon>\Dev\Utils\zxbasic\1.2.6\zxb.exe --version
zxb.exe 1.2.6-r1550


No tengo un zxb.py ¿?

¿Y sobre lo de mezclar BASIC/ASM? Es que ya lo he preguntao tres veces y nunca responde nadie :lol:

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 2 invitados