SYNCronizar velocidad juego (variable FRAMES)

Software para o relacionado con el core ZX Spectrum / Software for or related to the ZX Spectrum core
Avatar de Usuario
Haplo
Mensajes: 368
Registrado: 05 Oct 2015, 13:51
Ubicación: Ciudad Real

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Haplo » 06 Dic 2016, 19:03

thEpOpE escribió:Shadow no sirve para generar más rápido la pantalla, sino para mostrar en pantalla un 2° buffer mucho mas rápido (sin usar copias de un buffer en otro con ldir)
Claro, yo lo decía para evitar tanto el "flickering" (creo que se llama así) tanto al redibujar sprites como al volcar la pantalla. Obviamente si tienes mucha carga gráfica, el juego irá igual de lento, pero sin cosas raras en pantalla.

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Hark0 » 05 Ene 2017, 10:49

Bueno.... añado enlace a Youtube: https://youtu.be/tE-La6izZtc

He puesto 32 tiles.... Y SE SIGUE "MOVIENDO" IGUAL QUE CUANDO HABIA SOLO 8!!!!!!!!!

;)
Adjuntos
32_tiles_sync.png
32_tiles_sync.png (19.26 KiB) Visto 6798 veces
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por yombo » 05 Ene 2017, 15:22

Mola!

Pero.. el personaje a veces parpadea :mario:

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Hark0 » 09 Ene 2017, 16:37

yombo escribió:Mola!

Pero.. el personaje a veces parpadea :mario:
No en mi demo... debe ser a la hora de capturar... :(
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por yombo » 09 Ene 2017, 16:55

Hark0 escribió:
yombo escribió:Mola!

Pero.. el personaje a veces parpadea :mario:
No en mi demo... debe ser a la hora de capturar... :(
Ah, bueno, bien pues.

Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por yombo » 09 Ene 2017, 16:57

Haplo escribió:Las interrupciones no es complicado para nada, sólo es cortar/pegar código :)
Justamente voy a necesitar usar la interrupción, podrías darme un trozo de código explicando cómo se hace? (En Z88DK)

Gracias.

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Hark0 » 09 Ene 2017, 17:47

Si te atreves "a pelearte" con toda la morralla del proyecto... ahi lo tienes.... ;)

(Perdón por tanto //.... no está limpio para nada :oops:)

Código: Seleccionar todo

#include <stdio.h>				// break + printf

#include "librerias/esxdos.c"	

#include "librerias/random.h"		    
#include "librerias/zxuno_system.h"
#include "librerias/zxuno_sprites.h"
#include "librerias/zxuno_plot.h"		
#include "librerias/zxuno_paleta.h"	
#include "librerias/zxuno_ascii.h"	

#include "graficos_juego.h"		// hrk
#include "teclado.c"			// hrk

#include "heroe.c"				// hrk
#include "zink.c"				// hrk
#include "objetos.c"			// hrk
#include "mundo.c"				// hrk
#include "render.c"				// hrk - sistema video doble buffer Modo Radastaniano
#include "juego.c"				// hrk - control estado juego




// ---------------------------------------------------------------------------- DEFINE
#define PANTALLA_MENU		0
#define PANTALLA_JUEGO		1

#define EVENTO_NINGUNO		0
#define EVENTO_RENDER		1
#define EVENTO_A_MENU		2
#define EVENTO_SYNC_RELOJ	254
#define EVENTO_FIN_APP		255

#define JUEGO_NO_INICIADO	0
#define JUEGO_INICIADO	    1


// ---------------------------------------------------------------------------- INICIO DECL. VARS
unsigned char *txt_app[1];


// ---------------------------------------------------------------------------- INICIO DECL. VARS JUEGO
unsigned char loop_juego;


// ---------------------------------------------------------------------------- TARJETA SD - YOMBO
int16_t drive;

// ---------------------------------------------------------------------------- FIN DECL. VARS
#pragma output STACKPTR=65000


// ---------------------------------------------------------------------------- MAIN
void main (void)
{
	unsigned char x,y;
	unsigned char evento_juego;
//	unsigned int sync_reloj;
//	unsigned char reloj_delta;
	unsigned int dir_peek_FRAMES;
	unsigned char reloj_A;
//	unsigned char reloj_B;
	unsigned char reloj_diff;

	
	// ------------------------------------------------------------------------ INIT VARS
	txt_app[0]="RADASTIAN FUNC. 4 ZX-UNO BY HRK";
	loop_juego = 1;
	evento_juego = EVENTO_NINGUNO;	// 0 nada - 1 render
	

	// ------------------------------------------------------------------------ Iniciamos el modo Radastaniano
	inicia_render();


	// ------------------------------------------------------------------------ INIT CONTROL EVENTOS
	inicia_eventos_juego();
	

	// ------------------------------------------------------------------------ INICIO VARIABLES JUEGO
	asigna_pantalla_juego(PANTALLA_MENU);	// 0 - menu / 1 - juego


	// ------------------------------------------------------------------------ INIT SCREEN
	dibuja_pantalla_juego(estado_juego);
	
	
	// ------------------------------------------------------------------------ INIT RELOJ
	dir_peek_FRAMES = 23672;
	*dir_peek_FRAMES = 0;
	print_char_zxuno_OK(*dir_peek_FRAMES,57,0);
	
	//sync_reloj = 0;
	//reloj_delta = 0;
	
	
    // ------------------------------------------------------------------------ MAIN LOOP - WHILE
	while (loop_juego == 1)
	{
		reloj_A = *dir_peek_FRAMES;
				
		if (evento_juego == EVENTO_NINGUNO)	// hay que hacer ALGO
		{
			evento_juego = control_evento_juego();	// ------------------------ GESTION EN FICHERO JUEGO.C
		}	
		else//if (evento_juego != EVENTO_NINGUNO)	// hay que hacer ALGO
		{
			if (evento_juego == EVENTO_FIN_APP)	// CERRAMOS TODO Y SALIMOS AL ZX SPECTRUM OS
			{
				loop_juego = 0;
			}

			if (evento_juego == EVENTO_RENDER)		// RENDER
			{
				dibuja_pantalla_juego(estado_juego);
				dibuja_zink_pantalla_juego();
			}

			if (evento_juego == EVENTO_A_MENU)		// pasamos de juego a menu + RENDER
			{
				dibuja_pantalla_juego(estado_juego);
				pausa_juego();
				pausa_juego();
			}

			if (evento_juego == EVENTO_SYNC_RELOJ)	// RUTINA LOOP ANIM SYNC RELOJ
			{
				evento_juego = EVENTO_SYNC_RELOJ;
			}
			else
			{
			evento_juego = EVENTO_NINGUNO; // --------------------------------- OJO SYNC RELOJ!!!!!!!!!!!
			}
		}		

		dibuja_zink_pantalla_juego();
		reloj_diff = *dir_peek_FRAMES - reloj_A;
		
		while (reloj_diff < 3)
		{
			reloj_diff = *dir_peek_FRAMES - reloj_A;
			wait_int();
		}
		*dir_peek_FRAMES = 0;
	}
	
	// ------------------------------------------------------------------------ Cerramos el modo Radastaniano
	cierra_render();

	
	// ------------------------------------------------------------------------ Salimos al Spectrum
	printf(" 2016 Hark0 - www.zxuno.com \n");
	
	drive = ESXDOS_getDefaultDrive();
    iferror {
        printf( "SD Card not inserted." );
    }
	else
	{
		printf( "SD Card Ready..." );
	}
}
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Avatar de Usuario
Haplo
Mensajes: 368
Registrado: 05 Oct 2015, 13:51
Ubicación: Ciudad Real

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Haplo » 09 Ene 2017, 23:01

yombo escribió:
Haplo escribió:Las interrupciones no es complicado para nada, sólo es cortar/pegar código :)
Justamente voy a necesitar usar la interrupción, podrías darme un trozo de código explicando cómo se hace? (En Z88DK)

Gracias.
Yo tiro de ZXBasic y ASM, en C no sabría decirte. Te paso el trozo de código que prepara la IM2:

Código: Seleccionar todo

	
equ dir_rutina_IM2	32768	
di
ld hl,$FE00	; Llenamos en ($FE00-FE) la direccion del salto a la
ld a,$FD		; rutina que queremos que se ejecute en cada IM2 
ld (hl),a
ld de,$FE01
ld bc,256
ldir
ld hl,$FDFD	; (65021)
ld (hl),195	; código JP NN
inc l
ld bc,dir_rutina_IM2	
ld (hl),c
inc l
ld (hl),b		; ahora donde salta IM2 hay un JP dir_rutina_IM2
ld a,$FE		;(253)
ld i,a
im 2
ei 
reti
Esto lo copié/adapté de algún sitio hace tiempo, igual de aquí https://wiki.speccy.org/cursos/ensambla ... rrupciones


Con eso configuras la IM2 para que sea cual sea el valor de i, se apunte siempre a la dirección 65021, donde hay colocado una JP dir_rutina_IM2 y así saltará a esa rutina en 32768 (o la que indiques tú)

en 32768 deberías tener un código que empiece salvando los registros que necesites conservar inalterados, un ejemplo sería esto:

Código: Seleccionar todo

dir_rutina_IM2:
	di
	push af
	push hl
	push de
	...
	código a ejecutar (pintar sprites, volcar pantalla, tocar música...)
	...
	pop de
	pop hl
	pop af
	ei
	reti
como ves es hiperfácil de implementar.

Saludetes.

Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por yombo » 09 Ene 2017, 23:32

Haplo escribió:
Yo tiro de ZXBasic y ASM, en C no sabría decirte. Te paso el trozo de código que prepara la IM2:

Saludetes.
Muchas gracias, a ver si me sale implementarlo en asm empotrado en C :-)

Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por yombo » 09 Ene 2017, 23:35

Hark0 escribió:Si te atreves "a pelearte" con toda la morralla del proyecto... ahi lo tienes.... ;)
Muchas gracias Hark0, pero como ves lo que necesitaba es lo que me ha pasado Haplo. En tu código no implementas un "manejador" de interrupciones propio, sino que usas el contador que es actualizado por el manejador de interrupciones por defecto.

Responder