Página 18 de 20

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Mié, 18 Jun 2014, 12:34
por D_Skywalk
Gracias nath, acabo de probarla pero me parpadea y la de antonio se veía bien :?

$this->bbcode_second_pass_code('', '
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...
$this->bbcode_second_pass_code('', '

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;
}
}')

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Mié, 18 Jun 2014, 12:54
por na_th_an
$this->bbcode_second_pass_quote('D_Skywalk', 'G')racias 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.

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Mié, 18 Jun 2014, 13:02
por D_Skywalk
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...
$this->bbcode_second_pass_code('', '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:

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Mié, 18 Jun 2014, 13:50
por antoniovillena
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.

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Mié, 18 Jun 2014, 14:08
por D_Skywalk
ok!

$this->bbcode_second_pass_quote('antoniovillena', 'J')eje, 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?
$this->bbcode_second_pass_code('', '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:

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Mié, 18 Jun 2014, 15:45
por antoniovillena
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.

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Mié, 18 Jun 2014, 16:50
por D_Skywalk
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:

Publicado: Mié, 18 Jun 2014, 17:07
por antoniovillena
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

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Mié, 18 Jun 2014, 18:33
por antoniovillena
Te acabo de crear la función PrintStr, añádela a fase.h

$this->bbcode_second_pass_code('', '
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.

$this->bbcode_second_pass_code('', '
char cadena[]= "hola";
')

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

$this->bbcode_second_pass_code('', '
PrintStr(cadena, 3, 21);
')

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Mié, 18 Jun 2014, 18:41
por angel
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: