ZX BORIEL errores mios de sintaxis o incompati con Sinclair?

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

Moderador: Sir Cilve Sinclair

Avatar de Usuario
tachbach
rst 0
Mensajes: 44
Registrado: Dom Feb 26, 2012 10:16 am
Ubicación: Montevideo, Uruguay
Contactar:

ZX BORIEL errores mios de sintaxis o incompati con Sinclair?

Mensaje por tachbach » Vie Jul 20, 2012 12:07 am

Muchachos, son unos genios. Agradezco-les de antemano todo el cariño, empeño y dedicación que le ponen a este foro y a mi ordenador del alma.

Bien, ahora me pongo SANGUIJUELA... les cuento que estoy creando un TRACKER para el AY 3-8912 con zx boriel puramente en basic, para poder hacerle Musica y FX a mis juegos, claro que tambien para compartirlo (y aunque alguien me explique algun dia como rayos compilo el WYZ player, creo que tiene mucho mas mérito para mi, lo tomo como desafio propio).

No es la primera vez que me sucede que alguna rutina no me funciona. Puntualmente en este post les dejare' las que mas me dieron problema y no entiendo donde esta mi error.

Este "retazo" de rutina funciona con una doble tabla ascii alojada en memoria (50000) brindando 64 columnas a imprimir, para aprovechar mas pantalla. (si, ya se que en LIBRARY de ZX BORIEL hay un programita que imprime en 64 col, pero como dije, a mi me gusta el desafio: "hazlo tu mismo"... tambien se que esta' es bastante precaria a lo basic espectrumero, pero para mejorarla, necesito primero que nada que funcione)

Código: Seleccionar todo

9550   '------------------------------
    '|   IMPRIME PATTERN      |
   '------------------------------
   PAUSE 0
   BRIGHT 0
   FOR f= 0 TO 15
      PAPER 7
      IF f=0 OR f=4 OR f=8 OR f=12 OR f=16 THEN
         PAPER 3
      END IF
      
      LET fil    = 8 + f
      LET col    = 1
      LET numero   = f
      LET decimales    = 2
      GOSUB 9605
   NEXT f

   STOP

9605   '------------------------------------------------
   '\                                         /
   ' |   INPRESION DE NUMEROS EN 64 COLUMNAS      |
   '/                                        \
   '------------------------------------------------
   'enviar a esta sub rutina:
   '   fil = fila
   '   col = columna
   '   numero
   '   decimales = 1-unidades
   '         2-decenas
   '         3-centenas
   '         4-mil
   '         5-decenas de mil


9606   LET X$=STR$ (numero)
9607   IF decimales > LEN X$ THEN
      LET X$="0"+X$
      GOTO 9607
   END IF
   FOR z=0 TO LEN X$ STEP 2
      POKE 23607,194
      POKE 23606,80
      PRINT AT fil,col+(z/2); X$(z)
      IF z+1 <= LEN X$ THEN
         POKE 23607,197
         POKE 23606,80
         PRINT AT fil,col+(z/2) ; OVER 1 ; X$(z+1)
      END IF   
      IF z+col > 31 THEN
         LET col = 0
          LET fil = fil + 1
      END IF
   NEXT z
   POKE 23606,0
   POKE 23607,60
   RETURN

Aqui les dejo el el .z80 en spectrum basic, el cual funciona a la perfeccion
http://www.mediafire.com/?e1331ilv7wa7k42

el siguiente es el archivo .TAP generado por el compilador del codigo escrito arriba (se resetea)
http://www.mediafire.com/?nubshu8qjaj1kwa

...y el .BIN que debe cargarse en la direccion 50000 con los graficos
http://www.mediafire.com/?fwar9f2ly17hinm

Gracias Boriel por devolverme a la vida; perdon Mojon Twins por atomizarlos por facebook y mails :mrgreen: gracias a todos, espero respuestas
Última edición por tachbach el Dom Jul 22, 2012 11:18 pm, editado 1 vez en total.
RANDOMIZE USR 1234

Avatar de Usuario
Zeit
Herbert
Mensajes: 87
Registrado: Jue Oct 22, 2009 1:49 am
Ubicación: Montevideo, Uruguay
Contactar:

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por Zeit » Vie Jul 20, 2012 2:55 pm

Tach, me pasó lo mismo que a vos. Ahora me resta probarlo en los otros modelos de ZX Spectrum que tengo. Lo probé en la +2, voy a intentarlo en la +3 y en la 128 luego, te comento los resultados. Nos mantenemos en contacto!!!
8 bits forever!

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

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por na_th_an » Vie Jul 20, 2012 7:53 pm

Creo que será mucho más producente preguntar esto en el foro del propio autor del compilador http://www.boriel.com/forum/


Avatar de Usuario
Alxinho
Freddy Hardest
Mensajes: 896
Registrado: Mar Jun 19, 2007 11:20 am
Ubicación: Barcelona
Contactar:

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por Alxinho » Lun Abr 29, 2013 9:33 am

Hola a todos y un abrazote fuerte!

Desde que me compré la Ps3 la verdad es que no he tenido otro mundo, menudas obras maestras, qué vicio ... me he desconectado totalmente ...

Me he puesto de nuevo y a pesar de haber olvidado muchas cosas me voy recuperando. Estoy liado con un nuevo juego y me pasa una cosa muy rara.

En el anterior juego tenía ésto y el compilador me lo cogía bien:

Código: Seleccionar todo

g=abs(increnergia)

Ahora en el nuevo juego intento ésto y no hay manera:

Código: Seleccionar todo

g=abs(xesq-x)

Me dice que Redundant operation ABS for unsigned value, aunque le ponga solo una variable me dice lo mismo. No lo entiendo porque con el otro me funcionaba.

Lo que pretendo es conseguir el valor positivo de la resta de dos variables, vamos, algo básico y sencillo pero me está dando dolor de cabeza joder ...

Gracias de antemano! :)

EDITO: Creo que ya lo he resuelto ... en el anterior programa sin querer tengo la variable increnergia como FLOAT y parece ser que ABS necesita variables tipo BYTE (con negativo) para operar, sino se le va la pinza. Declarando xesq y x como BYTE ya funciona, joder qué chorrada ...
Retrobytes Productions --> http://retrobytesproductions.blogspot.com.es

Soy un tío feliz, más que nada ... porque me sale más a cuenta.

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

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por na_th_an » Lun Abr 29, 2013 11:29 am

Seguramente estabas usando un tipo de variable que no tenía signo. Aunque el resultado pudiese ser negativo, en este compilador hay un comportamiento algo "peculiar" con lo que se llama "automatic type promotion" (no lo implementa), y tienes que convertir tú los tipos de datos a mano para obtener lo que cabría obtener (usando la operación CAST).

En otros compiladores de BASIC o C, las operaciones se hacen tomando el tipo de datos que se espera en el resultado. En ZX Basic, se hace con el tipo de datos de los operandos.

Por ponerte un ejemplo, imagínate que x e y son uByte y sirven para especificar una coordenada dentro de los atributos (0 a 31 para x, 0 a 24 para y). Para obtener qué atributo es, habría que sumar 32*y+x:

Código: Seleccionar todo

Dim address as uInteger
Dim x as uByte
Dim y as uByte

' Por ejemplo:
x=16
y=23

' Ahora calculamos address:
address = 32 * y + x;


En ZX Basic, el resultado no es el esperado, ya que 32 * y = 32 * 23 = 736, que se sale del rango de los uBytes, y por tanto es truncado. En otros compiladores, incluso de BASIC, o de lenguajes de más bajo nivel como C, como el tipo de datos del resultado es uInteger (address es uInteger), el compilador hace "type promotion", convirtiendo automáticamente x e y a uInteger para que el resultado sí sea el correcto y esperado.

Este detalle me suele traer de cabeza porque nunca cambio el chip y casi todos los fallos en mis programas en ZX Basic son debidos a esto, pero parece que no se va a cambiar... Así que nos toca tener cuidado y hacer los castings a mano.

Avatar de Usuario
Alxinho
Freddy Hardest
Mensajes: 896
Registrado: Mar Jun 19, 2007 11:20 am
Ubicación: Barcelona
Contactar:

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por Alxinho » Lun Abr 29, 2013 12:24 pm

Creo que te he entendido más o menos jejeje ... que me haces perderme siempre :lol:

Entiendo que con declarar las variables que usan el ABS como BYTE ya me vale supongo...

Muchas gracias como siempre!
Retrobytes Productions --> http://retrobytesproductions.blogspot.com.es

Soy un tío feliz, más que nada ... porque me sale más a cuenta.

Avatar de Usuario
Alxinho
Freddy Hardest
Mensajes: 896
Registrado: Mar Jun 19, 2007 11:20 am
Ubicación: Barcelona
Contactar:

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por Alxinho » Mar Abr 30, 2013 11:37 pm

Buenas de nuevo, sólo una chorradita ...

¿Se pueden declarar variables que sólo sean de rango 0 y 1 (me suena de verlo en algún sitio) para declarar una array con sólo unos y ceros para que ocupe menos?

En la wiki no se contempla esto creo ...

Gracias :) ...
Retrobytes Productions --> http://retrobytesproductions.blogspot.com.es

Soy un tío feliz, más que nada ... porque me sale más a cuenta.

Avatar de Usuario
JBGV
Manic Miner
Mensajes: 279
Registrado: Vie Feb 11, 2011 9:16 am

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por JBGV » Mié May 01, 2013 8:41 am

Hola Alxinho .

Los únicos tipos de datos definidos creo que son los que puedes ver en la wiki.

http://www.boriel.com/wiki/en/index.php/ZX_BASIC:Types

Yo alguna vez he metido 2 datos en un byte (con valores del 0 al 15), me imagino que se podría meter 8 valores (0/1) en un solo byte pero no se si compensaría el lío para montar eso , y acceder a los datos me imagino que sería lento.

Avatar de Usuario
Alxinho
Freddy Hardest
Mensajes: 896
Registrado: Mar Jun 19, 2007 11:20 am
Ubicación: Barcelona
Contactar:

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por Alxinho » Mié May 01, 2013 11:17 am

Gracias JBGV! :D

Sí, era la lista que había visto y que eso no estaba. Me parece que lo que digo se podía hacer en Fénix, por eso me sonaba. Yo creo que sería práctico, no sé cuanta memoria se ahorraría, pero quizás mereciera la pena.

Un abrazo!
Retrobytes Productions --> http://retrobytesproductions.blogspot.com.es

Soy un tío feliz, más que nada ... porque me sale más a cuenta.

Avatar de Usuario
Alxinho
Freddy Hardest
Mensajes: 896
Registrado: Mar Jun 19, 2007 11:20 am
Ubicación: Barcelona
Contactar:

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por Alxinho » Mié May 01, 2013 7:49 pm

No quiero ser pesado pero es que llevo todo el día encasquillado y a pesar de que debe ser una tontería no lo soluciono, al menos de la manera que yo querría.

Se trata de lo de actualizar el gráfico del muñequito. El problema que tengo es que me funciona cuando va hacia la derecha pero no hacia la izquierda. Cuando lo borro para actualizarlo en las nuevas coordenadas calculo en la tabla que número de tile tiene en la posición actual y con eso en lugar de pintar en negro pinto ese tile y seguido el muñeco en las nuevas coordenadas. Pero claro, el jodío cuando va hacia la izquierda si viene del 3 y está a 2,5 considera 2 cuando necesito que siga siendo el 3. Hacia la derecha no pasa porque a 3,5 sigue siendo 3 y lo hace bien.

Sé que es un problema super básico, pero yo es que de programación soy muy básico :lol:

Gracias!

P.D: Por cierto, los tiles son de 3x3!

El cutre código sería este:

Código: Seleccionar todo

sub borraprota(x,y)
    xx=x/3
    yy=y/3
    tile=mapa(pant,yy,xx)
    IF tile=2 THEN
          POKE UINTEGER iniUDGS,@escalera(0)
          paper 0:ink 2
          print at yy*3,xx*3;"\a\b\c"
          print at (yy*3)+1,xx*3;"\d\e\f"
          print at (yy*3)+2,xx*3;"\g\h\i"
    END IF
Retrobytes Productions --> http://retrobytesproductions.blogspot.com.es

Soy un tío feliz, más que nada ... porque me sale más a cuenta.

Avatar de Usuario
Alxinho
Freddy Hardest
Mensajes: 896
Registrado: Mar Jun 19, 2007 11:20 am
Ubicación: Barcelona
Contactar:

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por Alxinho » Mié May 01, 2013 10:53 pm

Buah ... todo el día que llevo con esto pero al final lo he resuelto, muy chapucero eso sí ...

He hecho un proceso cursor que sólo se mueve cuando el muñeco está en otro tile, no entre medias y actualiza esa posición correcta. El muñeco se mueve por caracter y el cursor cada tres carácteres del muñeco.

Vamos, estoy completamente seguro que esto vosotros lo hacéis de una forma mucho más fácil y óptima, pero es que estaba atrancado. Si alguien me suguiere otra manera encantado :)

Gracias!
Retrobytes Productions --> http://retrobytesproductions.blogspot.com.es

Soy un tío feliz, más que nada ... porque me sale más a cuenta.

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

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por na_th_an » Jue May 02, 2013 10:26 am

El tema de restaurar el fondo es siempre peliagudo. Hay varias formas de conseguirlo.

1.- Capturar lo que hay antes de imprimir el sprite, y luego restaurarlo. Para evitar parpadeos, hay que hacer esto muy rápido para que no te pille el raster. ZX Basic por sí sólo no te da la velocidad necesaria para hacerlo, y hay que hacerlo en ASM. Fue lo que hicimos nosotros para el Maritrini. Si quieres, puedes usar la SUBACOlib, que es la biblioteca de tiles y sprites que emplea este juego, y que te deja tener 3 sprites de 24x24 en pantalla que podrás mover sin tener que preocuparte de restablecer el fondo.

2.- Montarte un sistema de "dirty rectangles", o, mejor dicho, "dirty chars". Básicamente tienes un buffer que dice qué caracter hay en cada posición y cada vez que imprimes actualizas una lista con los caracteres que has tocado (invalidado). Una función de actualización volverá a dibujar en pantalla sólo estos caracteres. No es complicado de montar y creo que para un juego que se mueva a caracter puede hacerse en ZX Basic puro. Tenía pendiente hacer un tuto explicando esto, pero el tiempo...

3.- Inventarte cualquier pifostio raro :D

No he tenido ocasión de ver exactamente qué estás haciendo, pero si te has decantado por "3" y te funciona, ¡avanti! :D

Avatar de Usuario
Alxinho
Freddy Hardest
Mensajes: 896
Registrado: Mar Jun 19, 2007 11:20 am
Ubicación: Barcelona
Contactar:

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por Alxinho » Jue May 02, 2013 9:06 pm

Ole ole ...

Pues entonces no iba tan mal encaminado, en el punto 3. pone claramente inventarte cualquier pifostio :lol:

Lo del punto 1. lo malo es que como me ponga a mezclar eso con el código la puedo liar jejeje ... y ahora que me rula me da miedito ...

Lo que he hecho en el fondo es muy sencillo, y creo que no chupa mucho recurso. Es tan sólo estas pocas líneas:

Código: Seleccionar todo

sub cursor()                      PARA SABER DONDE ACTUALIZAR

IF x>xcur+2 THEN xcur=x:END IF    ... si la x del personaje es mayor que la del cursor+2,
                                      la x del cursor es = a la del personaje.
IF x<xcur-2 THEN xcur=x:END IF
IF y>ycur+2 THEN ycur=y:END IF
IF y<ycur-2 THEN ycur=y:END IF

end sub


Esto es lo único que ha de estar continuamente funcionando, que símplemente cambia sus coordenadas cuando el personaje se ha alejado 3 carácteres por cualquier lado (sin diagonales) y después ...

Código: Seleccionar todo

sub borraprota(x,y)             PARA BORRAR AL MUÑEQUITO
   
    paper 0:ink 0
    print at y,x;"   "
    print at y+1,x;"   "
    print at y+2,x;"   "
   
    xx=xcur/3
    yy=ycur/3
    tile=mapa(pant,yy,xx)
       
    IF tile=2 THEN
        POKE UINTEGER iniUDGS,@escalera(0)
        paper 0:ink 2
        print at yy*3,xx*3;"\a\b\c"
        print at (yy*3)+1,xx*3;"\d\e\f"
        print at (yy*3)+2,xx*3;"\g\h\i"
    END IF
               
end sub


Que es cuando realmente lo usa, primero a la fuerza por seguridad lo borra a negro y después actualiza el tile. Ésto lo tengo que hacer así porque sino a veces dejaba trozos del muñequito cuando estaba justo a ras del cambio.
Una cosa indispensable es que cualquier inicio del personaje a de ser en coordenadas múltiplo de 3: 0, 3, 6, 9 .. 21,23 ... para no descuadrarse.

En fin, lo pongo aquí por si a alguien le pudiera servir :)

Muchas gracias!
Retrobytes Productions --> http://retrobytesproductions.blogspot.com.es

Soy un tío feliz, más que nada ... porque me sale más a cuenta.

Avatar de Usuario
Alxinho
Freddy Hardest
Mensajes: 896
Registrado: Mar Jun 19, 2007 11:20 am
Ubicación: Barcelona
Contactar:

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Mensaje por Alxinho » Jue May 02, 2013 9:45 pm

Mierda ... me acabo de dar cuenta que de esta manera los puntos intermedios que invade, si te mueves uno o dos carácteres, al dar mediavuelta no los actualiza.

Imagen

Creo que tendré que plantearme tu punto 2 :? ...
Retrobytes Productions --> http://retrobytesproductions.blogspot.com.es

Soy un tío feliz, más que nada ... porque me sale más a cuenta.

Responder

¿Quién está conectado?

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