21-abr-2007, 18:57 | #51 |
Moderador
|
¿Os habeis fijado, que en las fotos del tutorial que ha posteado leo, aparece el "Zunchadores mega arcade" de Macarro? je je.
Edito: Macarro, has respondido mientras yo escribía, jeje |
21-abr-2007, 19:10 | #52 |
Editor Marciano
|
AJAJAJAAAA ¿Tú eres Macarro Martín?
|
21-abr-2007, 19:16 | #53 |
Administrador
|
Yo es que flipo... Spain is different y aquí queremos reinventar todos la rueda. Con lo fácil que sería enlazar a marcianitos...
|
21-abr-2007, 20:34 | #54 |
Usuario registrado
|
Perdon pero yo no lo cree al tutorial, solo lo encontre navegando y puse el link por si era de interes, no sabia que era de alguien de esta comunidad y le copiaron las imagenes para posearlo en dicha pagina, disculpas si hubo un malentendido.
|
21-abr-2007, 20:52 | #55 |
Editor Marciano
|
oye manofwar.. no pillo el link para bajarlo y probarlo, ande para ?
estoyyy perdioooo y esta noche despedia de soltero.. (pobre ingenuo jajaa) |
21-abr-2007, 22:17 | #56 |
Administrador
|
No, si a mi no me molesta para nada, al contrario, me alegra.
Mi pequeña crítica no era hacia ti, sino a ese sitio. Desde luego, veo bien cualquier iniciativa creadora, sin embargo creo que en internet, y en especialmente españoles y latinoamericanos, somos muy dados a estar reinventando la rueda constantemente. Y de ese modo se "pierde" mucho trabajo. Aunque por otro lado, es lo que a mi me gustaría hacer con marcianitos, convertirla en el portal de emulación en español por excelencia |
24-abr-2007, 22:21 | #57 |
Moderador
|
ManofWar, aunque veo que vas empezando te pongo mi idea de la implementación del driver a ver que te parece
Array (dinámico?) DATA para guardar los valores del LPT, sería algo como: Code:
int Data[12] 1 (10) | 2 (11) | 3 (12) | 4 (13) | 5 (15) | (2) 1 0 | 1 | 0 | 1 | 1 | <=== 1 (3) 2 0 | 0 | 1 | 0 | 1 | <=== 1 (4) 3 0 | 0 | 0 | 0 | 0 | <=== 1 (5) 4 .... (6) 5 .... (7) 6 .... (8) 7 .... (9) 8 .... (1) 9 0 | 0 | 1 | 1 | 1 | <=== 1 (14) 10 0 | 0 | 0 | 0 | 1 | <=== 1 (16) 11 1 | 0 | 0 | 0 | 0 | <=== 1 (17) 12 1 | 0 | 1 | 0 | 1 | <=== 1 En el ejemplo del data, las lineas 8 y 9 no se comprueban ni se mandan señales, sin embargo en la 17 imagenemos que hemos puesto un boton de pinball que no nos cabía en la rama 16 entonces tendremos que enviar la señal a toda la rama, aun cuando solo necesitamos comprobar si se ha pulsado algo en la posición 17-1 del LPT. Para saber las ramas que el usuario necesita tengo una variable llamada ramas que contendría algo como: Code:
int ramas [ 1, 2, 3, 9, 10, 11, 12 ] Code:
userdata [ dev ] [ boton ] [ dpos ] Joy1 BTN_15 23 Bueno esta es más o menos la idea, ya me comentas compa Un Saludo! |
27-abr-2007, 14:58 | #58 |
Marciano
|
Hola D_Skywalk
Justamente todo lo que propones es como lo he hecho, excepto la parte de no comprobar rama, ya que el código para ver si esa rama debía comprobarla o no era más largo (lento) que directamente comprobar si la rama a cambiado. Por lo que me he decantado por esto último, compruebo si ha cambiado algo en la rama (XOR Estado, Estado_Anterior); si no hay cambio me voy a la siguiente rama o si ha cambiado compruebo pin a pin. Saludos |
27-abr-2007, 18:29 | #59 |
Moderador
|
Tio, tenemos que hablar por MSN o Jabber, vamos a terminar antes , pasame el tuyo por mensaje o algo xd
Por lo que he entendido compruebas pin a pin si hay cambio, pero tio eso es muy pesado (creo yo), en mi opinión es mucho más rápido simplemente enviar señales por los ramales que el usuario está usando y enviar pulsado si está en uso... Ej: Code:
for ( nSignal = 0; nSignal < RAMA_MAX_CONFIGURADA; nSignal ++ ) { sendsignal(rama[nSignal],&data[nSignal]); //data será modificado con los valores actuales. for(nCheck=0; nCheck < 5; nCheck ++ ) { if( data[nSignal][nCheck] == PULSADO_CONFIGURADO ) sendButton(userdata[nSignal][nCheck]); } } Un Saludo y a ver que te parece, de todas formas por msn seguro que charlamos más activamente y nos enteramos cada uno de la idea del otro mejor xD [Update] Añado una posible implementación de la función sendButton, por si se entiende mejor, aunque estoy programando a cabeza, habrá cosas mejorables, sure xD Code:
void sendButton (userdata * buttonInfo){ osSendButton(buttonInfo->dev, buttonInfo->boton) //imagina que esa función existiera, es solo un ejemplo de como se usaria esa estructura :) } Pega algo de tu code, que me entere io :b Nos leemos Editado por D_Skywalk en 27-abr-2007 a las 18:42. |
29-abr-2007, 20:14 | #60 |
Marciano
|
Hola D_Skywalk
El procedimiento que utilizao para comprobar si se ha pulsado un botón o no es el siguiente: - En principio todos los pines de Datos y Control están a 1. - Pongo a 0 el pin de la rama a comprobar - Si ha cambiado algún pin del Estado desde la última vez que se interrogó (XOR Estado, Estado_anterior) entonces es cuando se mira pin a pin los 5 bits del byte de Estado. Aquí te pongo la parte de código que hace esto, espero que se entiendan los comentarios. Saludos Code:
LeePuertoP proc MOV pb cs:[Fila], 0 MOV pw cs:[Puerto_Fila], 0FFEh;Cargamos el valor para interrogar la primera fila LEA BX, Offset_Estados MOV pw cs:[Estados_ant], BX LEA BX, ConfBoton; ;Ponemos en BX el inicio de la configuración de teclas MOV pw cs:[Mapa],BX BucleFila: MOV AX, pw cs:[Puerto_Fila] ;Cargamos AX con la fila que vamos a interrogar MOV DX, 378h ;pasamos a datos el valor de la fila que OUT DX, AL ;vamos a interrogar MOV DX, 37Ah ;pasamos a control el valor de la fila que vamos a interrogar XOR AH, 00001011b ;invertimos los bits necesarios XCHG AH,AL OUT DX, AL ; MOV DX, 379h ;Leemos el estado de los IN AL, DX ;botones conectados XOR AL, 10000000b ;Invertimos el bit 7 al registro de estado OR AL, 00000111b ;Ponemos a 1 los bits que no utilizamos(algunos pc los ponen a 1 y otros a 0) MOV pb cs:[estado], AL ;Guardamos el estado del puerto paralelo MOV BX, pw cs:[Estados_ant] ;Cargamos el estado anterior de la fila actual XOR AL, pb cs:[BX] ;Comprobamos si ha cambiado alguna columna JZ FinBucleFila ;Si no ha habido cambios comprobamos la siguiente fila MOV pb cs:[cambios], AL ;Si hay cambios los guardamos para comprobar que pines (botones) han cambiado MOV pb cs:[Puerto_Columna],8 ;Cargamos el valor para interrogar la primera columna MOV BX, pw cs:[Mapa] ;Ponemos en BX el inicio del mapa de teclas BucleColumna: MOV AL, pb cs:[cambios] TEST AL, pb cs:[Puerto_Columna] ;Comprobamos si ha cambiado esta columna (botón) JZ FinBucleColumna ;Si no ha cambiado saltamos a la siguiente columna (botón) mov al, pb cs:[MODO] CMP al, 1 JNE comp_estad SUB BX,offset ConfBoton MOV EDITADO, BL RET ;BX-offset ConfBoton=Boton comp_estad: MOV AL, pb cs:[estado] TEST AL, pb cs:[Puerto_Columna] ;Comprobamos si ha sido pulsado MOV AL, pb cs:[BX] ;o soltado el botón JZ pulsada ADD AL, 128 pulsada: CALL TeclaPS2 FinBucleColumna: SHL pb cs:[Puerto_Columna], 1 ;Desplazamos la variable para más tarde ;interrogar la siguiente columna INC BX ;Nos posicionamos al principio del scancode del próximo botón CMP pb cs:[Puerto_Columna],0 ;Vemos si hemos comprobado todas las columnas JNZ BucleColumna FinBucleFila: SHL pw cs:[Puerto_Fila], 1 ;Desplazamos la variable para más OR pw cs:[Puerto_Fila], 1 ;tarde interrogar la siguiente fila MOV AL, pb cs:[estado] ;Guardamos el valor actual MOV BX, pw cs:[Estados_Ant] ;del estado del puerto MOV pb cs:[BX], AL ;para comprobar la próxima vez add pw cs:[Mapa], 5 ;Nos posicionamos en la siguiente fila (ScanCode) inc pb cs:[Estados_ant] ;Nos posicionamos en la siguiente fila (Estados) INC byte ptr cs:[Fila] cmp byte ptr cs:[Fila], 12 JNZ SaltaBucleFila; JMP Salir SaltaBucleFila: JMP BucleFila Salir: RET Editado por Manofwar en 04-may-2007 a las 02:20. |