¿Interesado en ZX-uno que encaje en caja de ZX Spectrum + o gomas? ¡Apuntate!

Proyectos ajenos al equipo oficial pero desarrollados o promovidos por la comunidad, relacionados con el ZX-UNO / Projects outside the official team but developed or promoted by the community, related to the ZX-UNO
Avatar de Usuario
spark2k06
Mensajes: 1188
Registrado: 12 Feb 2016, 13:58

Re: RE: Re: ¿Interesado en ZX-uno que encaje en caja de ZX Spectrum + o gomas? ¡Apuntate!

Mensaje por spark2k06 » 06 Sep 2017, 09:29

ManuFerHi escribió:Probado, va muy bien, los timings están mejor ajustados, si publicas los fuentes los pongo en el github.
Estupendo, en cuanto pueda publico los cambios y os explico lo que he hecho. A falta de una nueva membrana que he pedido para sustituir la maltrecha que tengo he improvisado con un arduino uno para las pruebas.

Imagen

Enviado desde mi Thor mediante Tapatalk

Avatar de Usuario
neuro_999
Mensajes: 692
Registrado: 06 Oct 2015, 10:14

Re: ¿Interesado en ZX-uno que encaje en caja de ZX Spectrum + o gomas? ¡Apuntate!

Mensaje por neuro_999 » 06 Sep 2017, 09:45

Genial, a ver si lo pruebo en el mio en un ratillo que saque.

Enviado desde mi ONE A2003 mediante Tapatalk

Avatar de Usuario
spark2k06
Mensajes: 1188
Registrado: 12 Feb 2016, 13:58

Re: ¿Interesado en ZX-uno que encaje en caja de ZX Spectrum + o gomas? ¡Apuntate!

Mensaje por spark2k06 » 06 Sep 2017, 16:04

Adjunto los fuentes modificados a partir de los últimos que ha publicado @neuro_999, así como el fichero .HEX listo para flashear, que como veis respeta el último nombre elegido por neuro en su github.

Lo primero que he hecho es entrar en la BIOS del ZXUno y ver exactamente qué estaba sucediendo al pulsar cualquier tecla especial en un modo cualquiera distinto al inicial del Spectrum (tecla especial sería combinación con shift o con symbol) y ya desde ahí se puede ver un comportamiento extraño, observándose múltiples repeticiones de dicha tecla especial combinada. Si conectamos un teclado convencional y hacemos las mismas combinaciones vemos que esto no sucede, las teclas se mantienen pulsadas, que es como debe ser.

Analizado dicho comportamiento extraño, revisé las funciones pulsaysueltateclaconsymbol y pulsaysueltateclaconshift. En estas se puede observar que se realiza la pulsación de dichas combinaciones y acto seguido tras el transcurso de un periodo excesivamente corto (delay), se sueltan... con lo que en muchas ocasiones esto provoca que al core correspondiente no le de tiempo de procesarlo y por tanto a mostrarse en pantalla. Tras ello, se realiza otro delay variable según el core (que es a lo que neuro se refería con los timmings), esta función es continuamente llamada mientras la combinación de teclas sea mantenida, y aquí realmente es donde se encuentra el fallo. La gestión de repetición de teclas hay que dejar que la lleve a cabo el propio core, nosotros lo único que tenemos que hacer enviar los scancodes de pulsación y esperar hasta que se suelte la tecla correspondiente, tras lo cual enviamos los scancodes de liberación, y esto precisamente es lo que he hecho, eliminar :llamarada: cualquier relación de los timmings y separar la función en dos, una que se encarga de pulsar la combinación y otra que se encarga de soltarla:

Código: Seleccionar todo

/*
void pulsaysueltateclaconsymbol(unsigned char row, unsigned char col, enum KBMODE modokb)
{
unsigned char key=0, shift=0;

if(modokb==cpc) {key=mapCPC[row][col]; shift=modCPC[row][col];}
if(modokb==msx) {key=mapMSX[row][col]; shift=modMSX[row][col];}
if(modokb==c64) {key=mapC64[row][col]; shift=modC64[row][col];}
if(modokb==at8) {key=mapAT8[row][col]; shift=modAT8[row][col];}
if(modokb==bbc) {key=mapBBC[row][col]; shift=modBBC[row][col];}
if(modokb==aco) {key=mapACO[row][col]; shift=modACO[row][col];}
if(modokb==ap2) {key=mapAP2[row][col]; shift=modAP2[row][col];}
if(modokb==vic) {key=mapVIC[row][col]; shift=modVIC[row][col];}
if(modokb==ori) {key=mapORI[row][col]; shift=modORI[row][col];}
if(modokb==sam) {key=mapSAM[row][col]; shift=modSAM[row][col];}
if(modokb==jup) {key=mapJUP[row][col]; shift=modJUP[row][col];}
if(modokb==xt1) {key=mapXT1[row][col]; shift=modXT1[row][col];}

if(shift) {if(codeset==2) sendPS2(KEY_RSHIFT); else sendPS2(KS1_RSHIFT); }// _delay_us(5);}
sendPS2(key); _delay_us(50);
if(codeset==2) {sendPS2(0xF0);sendPS2(key);} else sendPS2(key+KS1_RELEASE);
if(shift) {if(codeset==2) {sendPS2(0xF0); sendPS2(KEY_RSHIFT);} else sendPS2(KS1_RSHIFT+KS1_RELEASE); }// _delay_us(5);}
_delay_ms(KBp); //Pequeña pausa para evitar la "super-repeticion-atodapastilla"
matriz[row][col]=0;
}
*/
void pulsateclaconsymbol(unsigned char row, unsigned char col, enum KBMODE modokb)
{
	unsigned char key = 0, shift = 0;

	if (modokb == cpc) { key = mapCPC[row][col]; shift = modCPC[row][col]; }
	if (modokb == msx) { key = mapMSX[row][col]; shift = modMSX[row][col]; }
	if (modokb == c64) { key = mapC64[row][col]; shift = modC64[row][col]; }
	if (modokb == at8) { key = mapAT8[row][col]; shift = modAT8[row][col]; }
	if (modokb == bbc) { key = mapBBC[row][col]; shift = modBBC[row][col]; }
	if (modokb == aco) { key = mapACO[row][col]; shift = modACO[row][col]; }
	if (modokb == ap2) { key = mapAP2[row][col]; shift = modAP2[row][col]; }
	if (modokb == vic) { key = mapVIC[row][col]; shift = modVIC[row][col]; }
	if (modokb == ori) { key = mapORI[row][col]; shift = modORI[row][col]; }
	if (modokb == sam) { key = mapSAM[row][col]; shift = modSAM[row][col]; }
	if (modokb == jup) { key = mapJUP[row][col]; shift = modJUP[row][col]; }
	if (modokb == xt1) { key = mapXT1[row][col]; shift = modXT1[row][col]; }

	if (shift) { if (codeset == 2) sendPS2(KEY_RSHIFT); else sendPS2(KS1_RSHIFT); }
	sendPS2(key);
	matriz[row][col] = 3;
}
void sueltateclaconsymbol(unsigned char row, unsigned char col, enum KBMODE modokb)
{
unsigned char key=0, shift=0;

if(modokb==cpc) {key=mapCPC[row][col]; shift=modCPC[row][col];}
if(modokb==msx) {key=mapMSX[row][col]; shift=modMSX[row][col];}
if(modokb==c64) {key=mapC64[row][col]; shift=modC64[row][col];}
if(modokb==at8) {key=mapAT8[row][col]; shift=modAT8[row][col];}
if(modokb==bbc) {key=mapBBC[row][col]; shift=modBBC[row][col];}
if(modokb==aco) {key=mapACO[row][col]; shift=modACO[row][col];}
if(modokb==ap2) {key=mapAP2[row][col]; shift=modAP2[row][col];}
if(modokb==vic) {key=mapVIC[row][col]; shift=modVIC[row][col];}
if(modokb==ori) {key=mapORI[row][col]; shift=modORI[row][col];}
if(modokb==sam) {key=mapSAM[row][col]; shift=modSAM[row][col];}
if(modokb==jup) {key=mapJUP[row][col]; shift=modJUP[row][col];}
if(modokb==xt1) {key=mapXT1[row][col]; shift=modXT1[row][col];}

if(codeset==2) {sendPS2(0xF0);sendPS2(key);} else sendPS2(key+KS1_RELEASE);
if(shift) {if(codeset==2) {sendPS2(0xF0); sendPS2(KEY_RSHIFT);} else sendPS2(KS1_RSHIFT+KS1_RELEASE); }
matriz[row][col]=0;
}
/*
void pulsaysueltateclaconshift(unsigned char row, unsigned char col, unsigned char key)
{
unsigned char cursores=0;
if(!key) //si no esta mapeada saca la mayuscula
{
if(codeset==2) sendPS2(KEY_RSHIFT); else sendPS2(KS1_RSHIFT);//_delay_us(5);
if(codeset==2) sendPS2(mapZX[row][col]); else sendPS2(mapSET1[row][col]);
_delay_us(5);
if(codeset==2) {sendPS2(0xF0); sendPS2(mapZX[row][col]); sendPS2(0xF0); sendPS2(KEY_RSHIFT); } //_delay_us(5);
else           {sendPS2(mapSET1[row][col]+KS1_RELEASE); sendPS2(KS1_RSHIFT+KS1_RELEASE);}
}else
{
if(codeset==2 && (key==KEY_LEFT || key==KEY_RIGHT || key==KEY_UP || key==KEY_DOWN)) {sendPS2(0xE0); cursores=1;} //Es una tecla del codeset2 que necesita E0
if(codeset==1 && (key==KS1_LEFT || key==KS1_RIGHT || key==KS1_UP || key==KS1_DOWN)) {sendPS2(0xE0); cursores=1;}//Es una tecla del codeset1 que necesita E0
sendPS2(key); _delay_us(5);
if(codeset==2 && (key==KEY_LEFT || key==KEY_RIGHT || key==KEY_UP || key==KEY_DOWN)) sendPS2(0xE0); //Es una tecla del codeset2 que necesita E0
if(codeset==1 && (key==KS1_LEFT || key==KS1_RIGHT || key==KS1_UP || key==KS1_DOWN)) sendPS2(0xE0); //Es una tecla del codeset1 que necesita E0
if(codeset==2) {sendPS2(0xF0); sendPS2(key);} else sendPS2(key+KS1_RELEASE); //_delay_us(5);
}
if(!cursores) _delay_ms(KBp); else if(KBc) _delay_ms(KBc);  //Pequeña pausa para evitar la "super-repeticion-atodapastilla"
matriz[row][col]=0;
}
*/
void pulsateclaconshift(unsigned char row, unsigned char col, unsigned char key)
{
	unsigned char cursores = 0;
	if (!key) //si no esta mapeada saca la mayuscula
	{
		if (codeset == 2) sendPS2(KEY_RSHIFT); else sendPS2(KS1_RSHIFT);
		if (codeset == 2) sendPS2(mapZX[row][col]); else sendPS2(mapSET1[row][col]);
	}
	else
	{
		if (codeset == 2 && (key == KEY_LEFT || key == KEY_RIGHT || key == KEY_UP || key == KEY_DOWN)) { sendPS2(0xE0); cursores = 1; } //Es una tecla del codeset2 que necesita E0
		if (codeset == 1 && (key == KS1_LEFT || key == KS1_RIGHT || key == KS1_UP || key == KS1_DOWN)) { sendPS2(0xE0); cursores = 1; }//Es una tecla del codeset1 que necesita E0
		sendPS2(key);
	}
	matriz[row][col] = 3;
}

void sueltateclaconshift(unsigned char row, unsigned char col, unsigned char key)
{
	unsigned char cursores = 0;
	if (!key) //si no esta mapeada saca la mayuscula
	{
		if (codeset == 2) { sendPS2(0xF0); sendPS2(mapZX[row][col]); sendPS2(0xF0); sendPS2(KEY_RSHIFT); }
		else { sendPS2(mapSET1[row][col] + KS1_RELEASE); sendPS2(KS1_RSHIFT + KS1_RELEASE); }
	}
	else
	{
		if (codeset == 2 && (key == KEY_LEFT || key == KEY_RIGHT || key == KEY_UP || key == KEY_DOWN)) sendPS2(0xE0); //Es una tecla del codeset2 que necesita E0
		if (codeset == 1 && (key == KS1_LEFT || key == KS1_RIGHT || key == KS1_UP || key == KS1_DOWN)) sendPS2(0xE0); //Es una tecla del codeset1 que necesita E0
		if (codeset == 2) { sendPS2(0xF0); sendPS2(key); }
		else sendPS2(key + KS1_RELEASE);
	}
	matriz[row][col] = 0;
}

Código: Seleccionar todo

			//Si esta pulsada la tecla symbol se pulsa y suelta esa tecla
			if (symbolmod == 3)
			{
				for (r = 0; r<ROWS; r++) for (c = 0; c<COLS; c++)
				{
					//if(matriz[r][c]>1 && matriz[r][c]<4) pulsaysueltateclaconsymbol(r,c,modo);
					if (matriz[r][c] == 2) pulsateclaconsymbol(r, c, modo);
					if (matriz[r][c] == 1) sueltateclaconsymbol(r, c, modo);

					//if(matriz[r][c]==1) matriz[r][c]=0; //Si esta marcada para soltar se pone a 0
				}
			}
			//Si esta pulsada la tecla shift se pulsa y suelta esa tecla
			if (shiftmod == 3)
			{
				for (r = 0; r<ROWS; r++) for (c = 0; c<COLS; c++)
				{
					//if(matriz[r][c]>1 && matriz[r][c]<4) { if(codeset==2) pulsaysueltateclaconshift(r,c,mapEXT[r][c]); else pulsaysueltateclaconshift(r,c,mapEXT1[r][c]); }
					if (matriz[r][c] == 2) { if (codeset == 2) pulsateclaconshift(r, c, mapEXT[r][c]); else pulsateclaconshift(r, c, mapEXT1[r][c]); }
					if (matriz[r][c] == 1) { if (codeset == 2) sueltateclaconshift(r, c, mapEXT[r][c]); else sueltateclaconshift(r, c, mapEXT1[r][c]); }
				}
			}
Y eso es todo amigos :boingg:, ahora sí, a disfrutarlo a tope :luigi:
Adjuntos
zxunops2.zip
(24.37 KiB) Descargado 250 veces

Avatar de Usuario
Uto
Mensajes: 1394
Registrado: 17 Dic 2015, 16:39

Re: ¿Interesado en ZX-uno que encaje en caja de ZX Spectrum + o gomas? ¡Apuntate!

Mensaje por Uto » 06 Sep 2017, 16:30

El core de Spectrum tiene una NMI especial, que está mapeada a F12 en el keymap Spectrum. No estaría mal meterla en el core de Spectrum con un Caps+Shift+T por ejemplo.

Podría ser la E de especial, pero está demasido cerca de los lados, y cuando se juega a 2 player con teclado se suelen elegir combinaciones en ambos, lados, y no es imposible elegir Caps y Symbol, por lo que no es recomendable poner la tercera tecla tan de lado :-D

Avatar de Usuario
neuro_999
Mensajes: 692
Registrado: 06 Oct 2015, 10:14

Re: ¿Interesado en ZX-uno que encaje en caja de ZX Spectrum + o gomas? ¡Apuntate!

Mensaje por neuro_999 » 06 Sep 2017, 16:36

F11 estaba en la q y f12 en la w, pero no recuerdo si las limite fuera del core.
Lo que has hecho Spark es lo primero que hice yo, pero los problemas venian cuando querias sacar simbolos que se sacaban con el shift y otro simbolo. X eso lo reverti, xq me daba muchos problemas cnd se pulsaban varias a la vez. Ya probaré el tuyo, que lo mismo a ti no te pasa. :)

Enviado desde mi ONE A2003 mediante Tapatalk

Avatar de Usuario
spark2k06
Mensajes: 1188
Registrado: 12 Feb 2016, 13:58

Re: RE: Re: ¿Interesado en ZX-uno que encaje en caja de ZX Spectrum + o gomas? ¡Apuntate!

Mensaje por spark2k06 » 06 Sep 2017, 16:43

neuro_999 escribió:F11 estaba en la q y f12 en la w, pero no recuerdo si las limite fuera del core.
Lo que has hecho Spark es lo primero que hice yo, pero los problemas venian cuando querias sacar simbolos que se sacaban con el shift y otro simbolo. X eso lo reverti, xq me daba muchos problemas cnd se pulsaban varias a la vez. Ya probaré el tuyo, que lo mismo a ti no te pasa. :)

Enviado desde mi ONE A2003 mediante Tapatalk
Pues este es el funcionamiento normal, no entiendo lo del shift y otro símbolo, si no funciona lo revisamos pero deberíamos hacerlo bajo el mismo planteamiento, y ver que sucede si se hace con un teclado convencional.

Enviado desde mi Thor mediante Tapatalk

Avatar de Usuario
neuro_999
Mensajes: 692
Registrado: 06 Oct 2015, 10:14

Re: ¿Interesado en ZX-uno que encaje en caja de ZX Spectrum + o gomas? ¡Apuntate!

Mensaje por neuro_999 » 06 Sep 2017, 16:45

Intenta mantenes pulsado un simbolo que no requiera de pulsacion de shift y otro que si lo requiera a la vez. A ver que pasa.

Enviado desde mi ONE A2003 mediante Tapatalk

Mikes
Mensajes: 28
Registrado: 11 Oct 2016, 12:57

Re: ¿Interesado en ZX-uno que encaje en caja de ZX Spectrum + o gomas? ¡Apuntate!

Mensaje por Mikes » 06 Sep 2017, 17:08

Buenas! Al final se hizo tirada? Cuánto subía? Queda alguno?

Avatar de Usuario
spark2k06
Mensajes: 1188
Registrado: 12 Feb 2016, 13:58

Re: RE: Re: ¿Interesado en ZX-uno que encaje en caja de ZX Spectrum + o gomas? ¡Apuntate!

Mensaje por spark2k06 » 06 Sep 2017, 17:10

neuro_999 escribió:Intenta mantenes pulsado un simbolo que no requiera de pulsacion de shift y otro que si lo requiera a la vez. A ver que pasa.

Enviado desde mi ONE A2003 mediante Tapatalk
Ahora no estoy en casa pero id reportandome fallos a partir de mi modificación y lo voy revisando ;-)

Enviado desde mi Thor mediante Tapatalk

ManuFerHi
Mensajes: 752
Registrado: 15 Nov 2015, 17:50

Re: ¿Interesado en ZX-uno que encaje en caja de ZX Spectrum + o gomas? ¡Apuntate!

Mensaje por ManuFerHi » 06 Sep 2017, 17:19

He montado algunas placas más, porque van saliendo poco a poco, tengo algunas de 512K, y de 2Mb. También tengo un par de carcasas si la quieres ya con carcasa.
El precio depende de la configuración, por ejemplo una placa básica ZX GO+ 512K con speaker y cable RGB SCART vale 83€ + 5€ de envío.

Responder