#include /* include la libreria base della Playstation*/ extern const u_char B_J_L;/* buffer joypad length */ extern const u_char NUM_SEQ;/* buffer joypad length */ extern int contatore;/* contatore temporale */ extern volatile u_char *buf1;/* Creo i puntatori ai buffers dei joypads */ extern volatile u_char *buf2;/* */ extern int SEQUENZA1;/* Esterne globali delle sequenze */ extern int SEQUENZA2; /* // */ extern int j1;/* Indice vettore 1 */ extern int j2;/* Indice vettore 2 */ extern u_long vj2[10];/* Vettore che immagazzina le sequenze del joypad 2 */ extern u_long vj1[10];/* Vettore che immagazzina le sequenze del joypad 1 */ extern u_long matrseq[6][20];/* Matrice delle 10 sequenze e delle 6 informazioni per sequenza */ /* Inizializza la matrice sequenze */ void InitMs() { /* Azzero tutta la matrice e i vettori */ u_char i; u_char j; for (i=0;i<=(NUM_SEQ-1);i=i+1) for(j=0;j<=5;j=j+1) matrseq[j][i]=0; for(i=0;i<=(B_J_L-1);i++)/* Azzero i vettori buffer dei joypad */ { vj1[i]=0; vj2[i]=0; } /* Azzero tutta la matrice e i vettori */ /* Sequenze inizializzate relative al giuoco */ matrseq[5][0]=0;/* inizializzo dimensioni sequenze */ matrseq[5][1]=0; matrseq[5][2]=0; matrseq[5][3]=0; matrseq[5][4]=0; matrseq[5][5]=0; matrseq[5][6]=0; matrseq[5][7]=0; matrseq[5][8]=0; matrseq[5][9]=0; matrseq[5][10]=0; matrseq[5][11]=0; matrseq[5][12]=0; matrseq[5][13]=0; matrseq[5][14]=1; matrseq[5][15]=1; matrseq[5][16]=1; matrseq[5][17]=1; matrseq[5][18]=1; matrseq[5][19]=1;/* inizializzo dimensioni sequenze */ /* Sequenze da 1 tasto(14) */ matrseq[0][0]=64;/* XXXXXXXX */ matrseq[0][1]=32;/* Tondo */ matrseq[0][2]=16;/* Triangle */ matrseq[0][3]=128;/* Quadrato */ matrseq[0][4]=8;/* R1 */ matrseq[0][5]=2;/* R2 */ matrseq[0][6]=2048;/* Start */ matrseq[0][7]=256;/* Select */ matrseq[0][8]=8192;/* Destra */ matrseq[0][9]=4096;/* S */ matrseq[0][10]=32768;/* Sinistra */ matrseq[0][11]=16384;/* Gi */ matrseq[0][12]=4;/* L1 */ matrseq[0][13]=1;/* L2 */ /* Sequenze da 1 tasto(14) */ /* Sequenze inizializzate relative al giuoco */ } /* Inizializza la matrice sequenze */ /* Controllo sequenze */ void ContrSeq(u_char quale) { u_char esatto=1;/* Flag di esattezza della sequenza immessa */ u_char i1=0;/* Contatore righe buffer pressed 1*/ u_char j=0;/* Contatore colonne */ long k; if (quale==1)/* Controllo il primo joypad */ { j1=0; while((vj1[j1]==0)&&(j1<=(B_J_L-1)))/* Mi posiziono all'inizio della sequenza */ j1++; k=j1; while((j<=(NUM_SEQ-1))&&(SEQUENZA1==-1)&&(k<=(B_J_L-1)))/* Scorro le colonne della matrseq */ { while ((i1<=matrseq[5][j])&&(k<=(B_J_L-1))&&(esatto==1)) { if (matrseq[i1][j]!=vj1[k]) esatto=0; else/* Il valore esatto */ { if (i1!=matrseq[5][j])/* se non sono all'ultimo elemento esatto */ { while((vj1[k]==matrseq[i1][j])&&(k<=(B_J_L-1)))/* Incremento sino a qualcosa di diverso a ci˜ che esatto */ k++; if (k<=(B_J_L-1))/* se ho trovato un elemento diverso da quello esatto e sono ancora nel buffer*/ if(vj1[k]==0)/* se uno zero */ { while((vj1[k]==0)&&(k<=(B_J_L-1)))/* incremento sino a trovare un numero diverso da zero */ k++; if (k<=(B_J_L-1))/* se l'ho trovato */ i1++;/* aumento il contatore della sequenza */ else esatto=0; } else i1++;/* aumento il contatore della sequenza */ else esatto=0; } else i1++; } } if ((esatto==1)&&(k<=(B_J_L-1)))/* controllo se esatta la sequenza */ SEQUENZA1=j; i1=0; esatto=1; k=j1; j=j+1; } /* Svuoto il buffer del joypad */ for(i1=0;i1<=(B_J_L-1);i1++) { vj1[i1]=0; } j1=0; } else/* Controllo il secondo joypad */ { j2=0; while((vj2[j2]==0)&&(j2<=(B_J_L-1)))/* Mi posiziono all'inizio della sequenza */ j2++; k=j2; while((j<=(NUM_SEQ-1))&&(SEQUENZA2==-1)&&(k<=(B_J_L-1)))/* Scorro le colonne della matrseq */ { while ((i1<=matrseq[5][j])&&(k<=(B_J_L-1))&&(esatto==1)) { if (matrseq[i1][j]!=vj2[k]) esatto=0; else/* Il valore esatto */ { if (i1!=matrseq[5][j])/* se non sono all'ultimo elemento esatto */ { while((vj2[k]==matrseq[i1][j])&&(k<=(B_J_L-1)))/* Incremento sino a qualcosa di diverso a ci˜ che esatto */ k++; if (k<=(B_J_L-1))/* se ho trovato un elemento diverso da quello esatto e sono ancora nel buffer*/ if(vj2[k]==0)/* se uno zero */ { while((vj2[k]==0)&&(k<=(B_J_L-1)))/* incremento sino a trovare un numero diverso da zero */ k++; if (k<=(B_J_L-1))/* se l'ho trovato */ i1++;/* aumento il contatore della sequenza */ else esatto=0; } else i1++;/* aumento il contatore della sequenza */ else esatto=0; } else i1++; } } if ((esatto==1)&&(k<=(B_J_L-1)))/* controllo se esatta la sequenza */ SEQUENZA2=j; i1=0; esatto=1; k=j2; j=j+1; } /* Svuoto il buffer del joypad */ for(i1=0;i1<=(B_J_L-1);i1++) { vj2[i1]=0; } j2=0; } } /* Controllo sequenze */ /* Ritorno Pressed */ u_long Joy(u_char Joypad)/* ritorna il valore dei tasti spinti anche se 2,3 etc. insieme */ { if (Joypad==1)/* Controllo il primo joypad */ { if (*buf1==0x00)/* Controlla se i joypad1 attaccato*/ { /* Controllo valori joy1*/ u_char byte2=255-(*(buf1+2));/* Setto la variabile byte2 per avere valori come in pagina 106 dell'user manual*/ u_char byte3=255-(*(buf1+3));/* Setto la variabile byte3 per avere valori come in pagina 106 dell'user manual*/ if ((byte2==0)&&(byte3==64))/* Tasto X */ return 64; else if ((byte2==0)&&(byte3==32))/* Tasto O*/ return 32; else if ((byte2==0)&&(byte3==16))/* Tasto Triangolo */ return 16; else if ((byte2==0)&&(byte3==128))/* Tasto Quadrato */ return 128; else if ((byte2==0)&&(byte3==8))/* Tasto Destra 1 */ return 8; else if ((byte2==0)&&(byte3==2))/* Tasto Destra 2*/ return 2; else if ((byte2==0)&&(byte3==4))/* Tasto Sinistra 1 */ return 4; else if ((byte2==0)&&(byte3==1))/* Tasto Sinistra 2*/ return 1; else if ((byte2==8)&&(byte3==0))/* Tasto Start*/ return 2048; else if ((byte2==1)&&(byte3==0))/* Tasto Select*/ return 256; else if ((byte2==16)&&(byte3==0))/* Tasto S*/ return 4096; else if ((byte2==64)&&(byte3==0))/* Tasto Gi*/ return 16384; else if ((byte2==128)&&(byte3==0))/* Tasto Sinistra */ return 32768; else if ((byte2==32)&&(byte3==0))/* Tasto Destra */ return 8192; else return 0; } else return 0; } else /* Controllo il secondo joypad */ { if (*buf2==0)/* Controlla se i joypad2 attaccato*/ { /* Controllovalori joy2*/ u_char byte2=255-(*(buf2+2));/* Setto la variabile byte2 per avere valori come in pagina 106 dell'user manual*/ u_char byte3=255-(*(buf2+3));/* Setto la variabile byte3 per avere valori come in pagina 106 dell'user manual*/ if ((byte2==0)&&(byte3==64))/* Tasto X */ return 64; else if ((byte2==0)&&(byte3==32))/* Tasto O*/ return 32; else if ((byte2==0)&&(byte3==16))/* Tasto Triangolo */ return 16; else if ((byte2==0)&&(byte3==128))/* Tasto Quadrato */ return 128; else if ((byte2==0)&&(byte3==8))/* Tasto Destra 1 */ return 8; else if ((byte2==0)&&(byte3==2))/* Tasto Destra 2*/ return 2; else if ((byte2==0)&&(byte3==4))/* Tasto Sinistra 1 */ return 4; else if ((byte2==0)&&(byte3==1))/* Tasto Sinistra 2*/ return 1; else if ((byte2==8)&&(byte3==0))/* Tasto Start*/ return 2048; else if ((byte2==1)&&(byte3==0))/* Tasto Select*/ return 256; else if ((byte2==16)&&(byte3==0))/* Tasto S*/ return 4096; else if ((byte2==64)&&(byte3==0))/* Tasto Gi*/ return 16384; else if ((byte2==128)&&(byte3==0))/* Tasto Sinistra */ return 32768; else if ((byte2==32)&&(byte3==0))/* Tasto Destra */ return 8192; else return 0; } else return 0; } } /* Ritorno Pressed */ /* Lettura joypad */ void LetturaJoy()/* Funzione richiamata nel main per i joypads dopo il VSync */ { vj1[j1]=Joy(1); j1++; vj2[j2]=Joy(2); j2++; if (contatore==B_J_L) { ContrSeq(1);/* Controllo la sequenza */ ContrSeq(2); /* controllo la sequenza */ contatore=0; } } /* Lettura joypad */