FASE (Fucking Awesome Spectrum Engine)

Chit chat general. Habla con los MojonTwins y con los amigos de los MojonTwins. Reza a Vah-ka. Delinque. Aviso: está PROHIBIDO tirarse peos fuerte. Si les cortas el pescuezo, vale.

Moderador: na_th_an

Avatar de Usuario
D_Skywalk
Mensajes: 352
Registrado: Mar, 01 Oct 2013, 13:36

Re: FASE (Fucking Awesome Spectrum Engine)

Mensajepor D_Skywalk » Mié, 18 Jun 2014, 12:34

Gracias nath, acabo de probarla pero me parpadea y la de antonio se veía bien :?

Código: Seleccionar todo

void draw_fast_str () {
   unsigned char *address;
   unsigned char i;
   unsigned char c;
   unsigned char * s = g_string;
   
   //whiteout_everything ();
   
   address = (unsigned char *) (22528 + g_str_x + (g_str_y << 5)) | *shadow << 8;
   ncx [0] = g_str_x;
   ncy [0] = g_str_y;
   while ((*s) != 0) {
      c = (*s);
      ncn [0] = c - 32;
      draw_char ();
      *address = g_color;
      address ++;
      s++;
   }
}



La versión que he adaptado a partir de showscore de antonio...

Código: Seleccionar todo


void show_str()
{
    unsigned char * s = g_string;
   while (*s)   {
        _print_char( g_str_x++, g_str_y, *s++);
    }
}
void _print_char(unsigned char x, unsigned char y, char chr)
{
    unsigned int scr, dst;
    char count;
    scr= 0x3c00 + chr * 8;
    // no fona para mayores de 8
    dst= (y * 0x20 ) + x + 0x4000 | *shadow << 8;

    for ( count= 0; count < 8; count++ )
    {
        zxmem[dst] = zxmem[scr++] ^ 0xff;
        dst+= 0x100;
    }
}
David Skywalker
Weblog: http://david.dantoine.org
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: FASE (Fucking Awesome Spectrum Engine)

Mensajepor na_th_an » Mié, 18 Jun 2014, 12:54

D_Skywalk escribió:Gracias nath, acabo de probarla pero me parpadea y la de antonio se veía bien :?



Te la pasaba para que pillases el array con las direcciones y pudieses imprimir donde te diera la gana, no por otra cosa ;). El sistema de Antonio deja poco tiempo de frame y probablemente mis rutinas sean poco rápidas, por eso parpadea, porque la ejecución se mete en el siguiente frame y se pierde la sincronía.

De todos modos sólo deberías actualizar los marcadores cuando sea necesario y así ahorrar.
Como diría Rorshach: "Urm..."
Avatar de Usuario
D_Skywalk
Mensajes: 352
Registrado: Mar, 01 Oct 2013, 13:36

Re: FASE (Fucking Awesome Spectrum Engine)

Mensajepor D_Skywalk » Mié, 18 Jun 2014, 13:02

Ya, ya, estaba depurando entonces tengo un par de flags todo el rato en pantalla XDDD

Bueno por el momento me quedo con las dos XD
Y bueno he mejorado la version anterior de la que funciona en pantalla, por si a alguien le valiera...

Código: Seleccionar todo

void _show_str()
{
    unsigned char * s = g_string;
    unsigned int scr, dst;
    char count;

    // no fona para mayores de 8
    if( g_str_y < 9)
        dst= (g_str_y * 0x20 ) + g_str_x + 0x4000 | *shadow << 8;
    else
        dst= ((g_str_y - 9 ) * 0x20 ) + g_str_x + 0x5000 | *shadow << 8;

   
   while (*s)   {
       scr= 0x3c00 + *s++ * 8;
      
        for ( count= 0; count < 8; count++ )
        {
            zxmem[dst] = zxmem[scr++] ^ 0xff;
            dst+= 0x100;
        }

        dst-= 0x7ff;

    }
}


Ya con quitar el par de multiplicaciones no se queda mal, tengo para ponerla arriba y en el marcador XD

suficiente, gracias tio :adore:
David Skywalker
Weblog: http://david.dantoine.org
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Re: FASE (Fucking Awesome Spectrum Engine)

Mensajepor antoniovillena » Mié, 18 Jun 2014, 13:50

Jeje, como mola el gatito. Como dice na_th_an, puedes acelerar los cálculos de la dirección de comienzo con una tabla. Yo antes usaba otra tabla distinta que me daba directamente la dirección. Con la que uso ahora sólo hace la permutación, es casi tan rápida como la otra pero sólo gasta 256 bytes. Si quieres usar la del engine está en $fd80 o por ahí cerca (comprueba que coincida con el contenido de file1.bin).

Si necesitas pintar dentro del área jugable avísame, actualmente sólo tengo implementado el "Paint out routine". Esto es así de complicado porque hay que minimizar los parpadeos, y si escribes fuera del área jugable lo que se hace es llamar a la rutina después de haber pintado todo el frame. En el caso de "pintar dentro" la llamada se haría en mitad del pintado (después del borrado de sprites y antes del pintado de los nuevos sprites), así evitamos interferir con los sprites.
Avatar de Usuario
D_Skywalk
Mensajes: 352
Registrado: Mar, 01 Oct 2013, 13:36

Re: FASE (Fucking Awesome Spectrum Engine)

Mensajepor D_Skywalk » Mié, 18 Jun 2014, 14:08

ok!

antoniovillena escribió:Jeje, como mola el gatito. Como dice na_th_an, puedes acelerar los cálculos de la dirección de comienzo con una tabla. Yo antes usaba otra tabla distinta que me daba directamente la dirección. Con la que uso ahora sólo hace la permutación, es casi tan rápida como la otra pero sólo gasta 256 bytes. Si quieres usar la del engine está en $fd80 o por ahí cerca (comprueba que coincida con el contenido de file1.bin).

Chino mandalín... :jias:

antonio, estoy viendo que tile, no está preparado despues de ejecutar frame que función dices que actualiza el tileset?

Código: Seleccionar todo

void prepare_screen( void )
{
    *screen = mapy * mapw + mapx;
   
    //forzamos update screen para poder pillar el tileset para los attr
    FRAME;
    // NO RULA!

    ptr_tmp = &tiles[0];
    ptr_jmp = map_attr;
   
    j = 150;
    do
    {
        if(j & 1)
            *ptr_jmp++ = *ptr_tmp++; // probando solo a meter el propio ntile a ver si rula...
        else
            *ptr_jmp++ = 0;
    }while(--j);
   
}


Estoy viendo que el engine estaba demasiado verde para usarlo para la jam, error mio...
Igualmente espero que las pruebas/minijuego y demás que haga te valgan igual, antonio :tits:

bue, a ver que puedo terminar para el viernes :dalefran:
David Skywalker
Weblog: http://david.dantoine.org
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Re: FASE (Fucking Awesome Spectrum Engine)

Mensajepor antoniovillena » Mié, 18 Jun 2014, 15:45

En realidad no es una función, es una macro. Se llama tilepaint. Después de actualizar los tiles del array tiles tienes que decirle al engine mediante tilepaint cual es el rectángulo de tiles más pequeño que cubre el área que quieres actualizar. Por ejemplo algo así: tilepaint (1, 2, 3, 4) actualiza el rectángulo que va desde (1, 2) hasta (3, 4).

Se que es un poco coñazo pero se hace así por razones de eficiencia. Sería más cómodo tener un segundo array de tiles con el que comparar para ver cuáles son los tiles que el usuario ha cambiado, pero sería más lento.
Avatar de Usuario
D_Skywalk
Mensajes: 352
Registrado: Mar, 01 Oct 2013, 13:36

Re: FASE (Fucking Awesome Spectrum Engine)

Mensajepor D_Skywalk » Mié, 18 Jun 2014, 16:50

Pero a ver si yo quiero, simplemente que cuando cambie de pantalla en tiles estén los nuevos tiles de la nueva pantalla que tengo que llamar?

:cafe:
David Skywalker
Weblog: http://david.dantoine.org
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Mensajepor antoniovillena » Mié, 18 Jun 2014, 17:07

A vale, es el mismo código de antes. Pensé que querías escribir en tiles, perdón por mi equivocación. En teoría está bien, pásame el código fuente y te lo depuro.

Enviado desde mi MI 3W mediante Tapatalk
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Re: FASE (Fucking Awesome Spectrum Engine)

Mensajepor antoniovillena » Mié, 18 Jun 2014, 18:33

Te acabo de crear la función PrintStr, añádela a fase.h

Código: Seleccionar todo

void __CALLEE__ PrintStr ( char *string, unsigned char x, unsigned char y ){
    #asm
        pop     af
        pop     de
        pop     bc
        pop     ix
        push    af
        ld      hl, ($5c00)
        ld      a, e
        and     $18
        or      $40
        or      h
        ld      h, a
        ld      a, e
        rrca
        rrca
        rrca
        and     $e0
        add     a, c
        ld      l, a
print:  ex      de, hl
        ld      a, (ix)
        inc     ix
        add     a, a
        ret     z
        ld      l, a
        ld      h, $0f
        add     hl, hl
        add     hl, hl
        ld      b, 4
print1: ld      a, (hl)
        ld      (de), a
        inc     l
        inc     d
        ld      a, (hl)
        ld      (de), a
        inc     l
        inc     d
        djnz    print1
        ld      hl, $f801
        add     hl, de
        jr      print
    #endasm
}


El código C es muy sencillo, primero declaras el string.

Código: Seleccionar todo

char cadena[]= "hola";


Y luego haces la llamada, asegúrate de que estemos dentro de update_scoreboard para que no haya parpadeos.

Código: Seleccionar todo

PrintStr(cadena, 3, 21);
Avatar de Usuario
angel
Mensajes: 23212
Registrado: Vie, 09 Ene 2009, 13:04
Ubicación: Torreznolandia
Contactar:

Re: FASE (Fucking Awesome Spectrum Engine)

Mensajepor angel » Mié, 18 Jun 2014, 18:41

Jodo D_Skywalk, vas a tener que poner a Antonio en los créditos, casi te está haciendo el juego para la jam :lol:

:porro:
(_\_) (_|_) (_/_) (_|_) ILLO KE HEHEHEHEHEHEEEHEHEHEH!

¡Activa tu rainbow pechónico!

Volver a “General”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado