Dudas desarrollando en ZX Basic

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

Moderador: Sir Cilve Sinclair

Responder
Avatar de Usuario
oblo
Sabreman
Mensajes: 327
Registrado: Lun Feb 07, 2011 9:53 am

Dudas desarrollando en ZX Basic

Mensaje por oblo » Jue Nov 08, 2012 10:35 pm

Hola a todos

Estoy volviendo a la carga en el desarrollo de un juego que me lleve a la fama, la gloria y las mancebas fermosas :mrgreen: pero como siempre el duro código se vuelve en mi contra... Tonterías aparte tengo un par de dudas, a ver si me podéis echar un cable

1) Necesito almacenar el nombre de las etiquetas en una variable para luego hacer GOSUBs usando la variable en sí y no tener que usar los nombres fijos como tal, pero se ve que algo hago mal (o no es posible) porque el compilador me devuelve el error 'identifier 'eti$' is a var, not a label'. Como muestra este código de lo que pretendo hacer:

Código: Seleccionar todo

    #INCLUDE <keys.bas>
    paper 0: border 0: ink 7: cls
    dim eti$
    eti$="l01"
    while 1=1
       if Multikeys(KEY1)<>0 then
          eti$="l01"
          gosub eti$
       elseif Multikeys(KEY2)<>0 then
          eti$="l02"
          gosub eti$
       elseif Multikeys(KEY3)<>0 then
          eti$="l03"
          gosub eti$
       end If
    end While
    l01:
    print at 0,0;ink 1;"ESTAS EN LA ETI1";
    RETURN
    l02:
    print at 0,0;ink 2;"ESTAS EN LA ETI2";
    RETURN
    l03:
    print at 0,0;ink 3;"ESTAS EN LA ETI3";
    RETURN


2) Usando la librería print42.bas se pueden usar caracteres a 6 columnas pero adolece de caracteres españoles tales como '¿' 'ñ' o las vocales con tilde. Abriendo la librería hay algunos caracteres que se pueden personalizar pero es insuficiente y querría sustituir algunos que no vaya a usar, caso de los corchetes. ¿Esto es posible? Entiendo que esta pregunta ya es de nota y para alguien que haya trasteado con la librería en sí.

Aunque ya he hecho estas preguntas en su foro, las pongo también por aquí por si hubiera alguien que me pudiera echar una mano.

Gracias y salu2

Avatar de Usuario
wilco2009
Freddy Hardest
Mensajes: 543
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Dudas desarrollando en ZX Basic

Mensaje por wilco2009 » Vie Nov 09, 2012 12:20 am

Eso que dices de utilizar variables como argumento de gosub creo que no es posible en el ZXBasic de Boriel aunque sí en el del Spectrum.
De todas formas no acabo de entender para que lo necesitas y hace el código difícil de entender.
Quizás podría ser aplicable para los mismos casos que se usa el paso de funciones como parámetro en C, o por ejemplo en el desarrollo de un emulador en el que es mucho más rápido hacerse un array con las funciones a llamar cuando lees el opcode correspondiente, pero esos casos son contadísimos y en el resto de los casos siempre hay alternativas más claras.

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

Re: Dudas desarrollando en ZX Basic

Mensaje por JBGV » Vie Nov 09, 2012 8:47 am

Hola Oblo.

Te deseo mas suerte que yo en tu búsqueda de fama, la gloria y las mancebas fermosas :lol: :lol: :lol: , yo después de 2 años estoy empezando a sospechar que hacer juegos para el ZX quizás no sea la mejor manera, sobre todo por lo de las mancebas fermosas :mrgreen:.

A la espera de una respuesta mas sensata que la mía :lol: , el ZXB no permite usar variables en los GOSUB ni GOTO, aquí no podemos hacer "GOSUB 100+variable" (por ejemplo) que si permite el basic del ZX, de todas formas los GOSUB ocupan muy poco. En el ejemplo que pones en realidad el no usar esa característica del BASIC original te permite ahorrarte código:

Código: Seleccionar todo

    #INCLUDE <keys.bas>
    paper 0: border 0: ink 7: cls
                                                                     

    while 1=1
       if Multikeys(KEY1)<>0 then
"
          gosub l01
       elseif Multikeys(KEY2)<>0 then

          gosub l02
       elseif Multikeys(KEY3)<>0 then

          gosub l03
       end If
    end While
    l01:
    print at 0,0;ink 1;"ESTAS EN LA ETI1";
    RETURN
    l02:
    print at 0,0;ink 2;"ESTAS EN LA ETI2";
    RETURN
    l03:
    print at 0,0;ink 3;"ESTAS EN LA ETI3";
    RETURN


Respecto a lo de la librería PRINT42 no tengo ni idea, pero parece que quizás habría que modificar esta linea:

Código: Seleccionar todo

 ld de, 15360       ; Character set-256. We could use CHARS here, maybe; but might not work with a redefiend character set.


En vez de 15360 habría que poner la dirección donde estarían tus propios caracteres, pero no lo he podido probar :roll: .

Avatar de Usuario
oblo
Sabreman
Mensajes: 327
Registrado: Lun Feb 07, 2011 9:53 am

Re: Dudas desarrollando en ZX Basic

Mensaje por oblo » Vie Nov 09, 2012 9:20 am

Lo primero gracias por las respuestas :)
Para el primer caso, el ejemplo que he puesto es eso, un ejemplo para mostrar en esencia el error pero el código real es más complejo (o yo lo veo así) Lo que realmente tengo son varias etiquetas y en cada una de ellas se define un lugar; como hay ocasiones en que hay que volver automáticamente al penúltimo lugar visitado, lo de almacenar la etiqueta en una variable lo decía pq me ahorra mucho código (un GOSUB o GOTO ultimositio$ frente a varias condiciones y variables) ¿Se os ocurre alguna forma mejor de hacerlo?
Para el segundo voy a trastear un poco con la linea que dices, pero precisamente no la he tocado por lo que pone de "...might not work with a redefiend character set...."

salu2

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

Re: Dudas desarrollando en ZX Basic

Mensaje por na_th_an » Vie Nov 09, 2012 9:32 am

Lo suyo sería que organizases el tema de otra forma. Tener la localización actual en una variable y luego que tu motor fuera actuando en consecuencia según esta variable, y no tener un puñado de etiquetas (en las que seguramente estés duplicando partes de código). De esta forma incluso podrías recortar un montón de niveles de "últimos visitados" simplemente usando una pila.

Si estás haciendo, por ejemplo, una aventura conversacional, lo suyo es tener las localizaciones y todo lo general en arrays y usar una única rutina para imprimir la descripción actual y manejar las conexiones entre las mismas, en lugar de cascarlo a pelo en IFs y en etiquetas y en un montón de cosas que al final lo que hacen es ocupar memoria en código duplicado. Imagina, por ejemplo, que tienes un array con todas las localizaciones y en otra, de algún modo, codificas las salidas que son correctas y a qué localización llevan. En plan "Norte en 1 lleva a 7" (pero en lenguaje informático :lol:). Así puedes automatizar todo el movimiento entre localizaciones en unas cuantas lineas.

Avatar de Usuario
wilco2009
Freddy Hardest
Mensajes: 543
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Dudas desarrollando en ZX Basic

Mensaje por wilco2009 » Vie Nov 09, 2012 4:56 pm

Si realmente estás muy interesado en hacer las llamadas a subrutina mediante una variable, algo se podría hacer en ensamblador a base de hacer la llamada con Call y escribir directamente en el byte que sigue a dicha instrucción, aunque esto, claro está, sería una guarrada supina.

Prodrías hacerte una especie de simulación de paso de procedimientos como parámetros haciendo algo así:

Código: Seleccionar todo

sub llamada_indirecta(Dirección as uinteger)
  asm
     ex de,hl              ; Cargo dirección en de
     ld hl,call_eti       
     inc hl                  ; en hl tengo la dirección del call+1
     ld (hl),e              ; copiar el valor de la dirección en el byte siguiente al call (byte menos significativo)
     inc hl                  ; copiar el byte más significativo
     ld (hl),d           
 
 call_eti:             
     call 0000             ; llamo a dicha dirección
  end asm
end sub


Esto no está probado por lo que disculpadme si tiene algún error, aunque creo que el concepto debería ser válido (correjidme si me equivoco). Es una ventaja (o un inconveniente segun se mire) que tiene no tener protegida la memoria de código.

Aunque estoy totalmente de acuerdo con na_th_an en que lo mejor es que reestructures el código.

Avatar de Usuario
wilco2009
Freddy Hardest
Mensajes: 543
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Dudas desarrollando en ZX Basic

Mensaje por wilco2009 » Vie Nov 09, 2012 5:59 pm

Acabo de probar el código anterior y funciona (bueno le he hecho una pequeña modificación).

Código: Seleccionar todo

' llamada indirecta

Sub icall(Direccion as uinteger)
   asm
      ex de,hl              ; Cargo dirección en de
      ld hl,call_eti+1       
      ld (hl),e              ; copiar el valor de la dirección en el byte siguiente al call (byte menos significativo)
      inc hl                  ; copiar el byte más significativo
      ld (hl),d           

   call_eti:   
      call 0000             ; llamo a dicha direccion
   end asm
end sub

Sub uno()
   Print "Uno"
end sub

Sub dos()
   Print "Dos"
end sub

   icall(@uno)
   icall(@dos)

Avatar de Usuario
oblo
Sabreman
Mensajes: 327
Registrado: Lun Feb 07, 2011 9:53 am

Re: Dudas desarrollando en ZX Basic

Mensaje por oblo » Vie Nov 09, 2012 8:41 pm

na_th_an: está claro que me he equivocado a la hora de plantear el motor del juego pero como este le llevo bastante avanzado, creo que se va aquedar con el 'pegote' :( eso sí, tomo nota porque me interesa crear un pseudo-parser para lo que estoy haciendo, ya que quisiera hacer varias entregas (ya os iré contando) :wink:

wilco2009: muchísimas gracias :D ya me he dado cuenta que queda un poco 'guarro' pero ahora mismo me sirve más que bien para salir del paso :)

salu2

Avatar de Usuario
wilco2009
Freddy Hardest
Mensajes: 543
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Dudas desarrollando en ZX Basic

Mensaje por wilco2009 » Sab Nov 10, 2012 12:16 am

wilco2009: muchísimas gracias :D ya me he dado cuenta que queda un poco 'guarro' pero ahora mismo me sirve más que bien para salir del paso :)


Me alegro de que te sirva. Me ha venido la inspiración de repente. :lol:

Avatar de Usuario
oblo
Sabreman
Mensajes: 327
Registrado: Lun Feb 07, 2011 9:53 am

Re: Dudas desarrollando en ZX Basic

Mensaje por oblo » Lun Nov 12, 2012 12:14 am

Ni por esas :( Gracias por la rutina pero na_th_an tiene razón y me quedo sin memoria, así que me toca replantearme el motor y hacer uno más óptimo que como lo estaba haciendo hasta ahora.
SI alguien se presta como betatester, le puedo mandar lo que llevo hecho hasta ahora para que vea el enfoque.

salu2

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

Re: Dudas desarrollando en ZX Basic

Mensaje por na_th_an » Lun Nov 12, 2012 1:54 pm

Si necesitas ayuda con el tema grita. He programado unos cuantos sistemas de aventuras ya y tengo muchos tiros dados :-) Lo malo de ZX Basic es que aún no soporta estructuras, que si no esto sería coser y cantar.

Te doy una idea:

Código: Seleccionar todo

' Ejemplo con 4 pantallas (0 a 3)
Const NUMSITIOS As uByte = 3

Dim conexiones(NUMSITIOS, 3) As uByte

' Codificamos 0 = norte, 1 = sur, 2 = este, 3 = oeste
Const DIRNORTE AS uByte = 0
Const DIRSUR AS uByte = 1
Const DIRESTE AS uByte = 2
Const DIROESTE AS uByte = 3

' Si la pantalla N tiene salida al Norte que lleva a la pantalla M,
' entonces conexiones (N, DIRNORTE)=M
' Si no hay conexión, el valor es -1.


Puedes, por un lado, hacer una

Código: Seleccionar todo

Sub printDescription (sitio as uByte)


Que dependiendo de sitio imprima la descripción de la localización. Luego puedes hacerte otra Sub que imprima las salidas actuales:

Código: Seleccionar todo

Sub printSalidas (sitio as uByte)
   Print "SALIDAS: ";
   If conexiones(sitio, DIRNORTE) >= 0 THEN PRINT "NORTE ";
   If conexiones(sitio, DIRSUR) >= 0 THEN PRINT "SUR ";
   If conexiones(sitio, DIRESTE) >= 0 THEN PRINT "ESTE ";
   If conexiones(sitio, DIROESTE) >= 0 THEN PRINT "OESTE ";
   Print
End Sub


Para moverte de un sitio a otro...

Código: Seleccionar todo

nuevoSitio = sitio
Do
   cmd$=leeComando ()
   ...
   If cmd$="N" AND conexiones (sitio, DIRNORTE)>= 0 THEN nuevoSitio = conexiones (sitio, DIRNORTE)
   ...
Loop While sitio = nuevoSitio

Avatar de Usuario
oblo
Sabreman
Mensajes: 327
Registrado: Lun Feb 07, 2011 9:53 am

Re: Dudas desarrollando en ZX Basic

Mensaje por oblo » Lun Nov 12, 2012 4:01 pm

Gracias na_th_an :) He pensado en hacer algo parecido, en plan Kempston (1=N 2=E 4=S 8=O) y así cada localización tiene las salidas separadas (ej: el valor 5 serían salidas Norte y Sur)
En fin, vuelta a empezar de 0. Según avance iré contando :)

salu2

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

Re: Dudas desarrollando en ZX Basic

Mensaje por na_th_an » Lun Nov 12, 2012 4:04 pm

Perfecto, así en 1 byte puedes representar 8 salidas distintas (puedes añadir ARRIBA ABAJO ENTRAR SALIR, por ejemplo)

Responder

¿Quién está conectado?

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