/******************************************************************* * Playstation USB Controller Program for Devasys EZ-USB Board * * This program simulates the Playstation host and recieves a signal * from the Playstation controller representative of the current * state of the buttons. This code will read this value and place it * in a buffer to be read by a USB interrupt and transmitted to the * computer. * * Code written by Frederick N. Genthner & Patrick T. Phelan * * Group: "Rokken Like Dokken" * *******************************************************************/ /******************************************************************* * * Pin Description * * Port B * OUTB 4: * OUTB 5: * OUTB 6: DATA * OUTB 7: ACK * * Port A * OUTA 4: * OUTA 5: CMD * OUTA 6: CLK * OUTA 7: ATT * *******************************************************************/ #include #include #define CYCLECMD1 OUTA=0x30; OUTA=0x30; OUTA=0x70; OUTA=0x70; #define CYCLECMD0 OUTA=0x10; OUTA=0x10; OUTA=0x50; OUTA=0x50; /* Define global variables for PlayStation Controller Communication/Operation */ static unsigned timer0_tick; // timer tick variable BYTE t=0; BYTE ps_count=0; BYTE THIGH=0x00; BYTE TLOW=0x00; BYTE L1=0; BYTE L2=0; BYTE R1=0; BYTE R2=0; BYTE SQA=0; BYTE CIR=0; BYTE TRI=0; BYTE X=0; BYTE START=0; BYTE SELECT=0; BYTE UP=0; BYTE DOWN=0; BYTE LEFT=0; BYTE RIGHT=0; /************************************************************* * * do_cmd(BYTE b) - Communicates w/ Playstation controller and * stores data from button presses for later use * * Parameters - BYTE b - case statement switch value * * Return - void * *************************************************************/ void do_cmd(BYTE b) { switch(b) { case 1: CYCLECMD1 // CYCLE 1 CMD = 1 CYCLECMD0 // CYCLE 1 CMD = 0 CYCLECMD0 // CYCLE 1 CMD = 0 CYCLECMD0 // CYCLE 1 CMD = 0 CYCLECMD0 // CYCLE 1 CMD = 0 CYCLECMD0 // CYCLE 1 CMD = 0 CYCLECMD0 // CYCLE 1 CMD = 0 CYCLECMD0 // CYCLE 1 CMD = 0 OUTA = 0x70; // idle high break; case 2: CYCLECMD0 // CYCLE 2 CMD = 0 CYCLECMD1 // CYCLE 2 CMD = 1 CYCLECMD0 // CYCLE 2 CMD = 0 CYCLECMD0 // CYCLE 2 CMD = 0 CYCLECMD0 // CYCLE 2 CMD = 0 CYCLECMD0 // CYCLE 2 CMD = 0 CYCLECMD1 // CYCLE 2 CMD = 1 CYCLECMD0 // CYCLE 2 CMD = 0 OUTA = 0x70; // idle high break; case 3: CYCLECMD0 // CYCLE 3 CMD = 0 CYCLECMD0 // CYCLE 3 CMD = 0 CYCLECMD0 // CYCLE 3 CMD = 0 CYCLECMD0 // CYCLE 3 CMD = 0 CYCLECMD0 // CYCLE 3 CMD = 0 CYCLECMD0 // CYCLE 3 CMD = 0 CYCLECMD0 // CYCLE 3 CMD = 0 CYCLECMD0 // CYCLE 3 CMD = 0 OUTA = 0x70; // idle high break; case 4: OUTA=0x10; OUTA=0x10; OUTA=0x50; SELECT=PINSB; OUTA=0x10; OUTA=0x10; OUTA=0x50; OUTA=0x50; OUTA=0x10; OUTA=0x10; OUTA=0x50; OUTA=0x50; OUTA=0x10; OUTA=0x10; OUTA=0x50; START=PINSB; OUTA=0x10; OUTA=0x10; OUTA=0x50; UP=PINSB; OUTA=0x10; OUTA=0x10; OUTA=0x50; RIGHT=PINSB; OUTA=0x10; OUTA=0x10; OUTA=0x50; DOWN=PINSB; OUTA=0x10; OUTA=0x10; OUTA=0x50; LEFT=PINSB; ////////////////////////// OUTA = 0x70; // idle high break; case 5: OUTA=0x10; OUTA=0x10; OUTA=0x50; L2=PINSB; OUTA=0x10; OUTA=0x10; OUTA=0x50; R2=PINSB; OUTA=0x10; OUTA=0x10; OUTA=0x50; L1=PINSB; OUTA=0x10; OUTA=0x10; OUTA=0x50; R1=PINSB; OUTA=0x10; OUTA=0x10; OUTA=0x50; TRI=PINSB; OUTA=0x10; OUTA=0x10; OUTA=0x50; CIR=PINSB; OUTA=0x10; OUTA=0x10; OUTA=0x50; X=PINSB; OUTA=0x10; OUTA=0x10; OUTA=0x50; SQA=PINSB; ////////////////////////// OUTA = 0x70; // idle high break; } // End switch(b) } // End do_cmd(BYTE b) /************************************************************* * * timer0(void) - Interrupt to call do_cmd() function for * PlayStation communication. * * Parameters - void * * Return - void * *************************************************************/ void timer0 (void) interrupt 1 using 1 { BYTE i; EA = 0; // disable interrupts TR0 = 0; // stop timer OUTA = 0x70; // pull ATT low to communicate with psx controller i=0; for(i=0;i<30;i++) {} do_cmd(1); for(i=0;i<30;i++) {} do_cmd(2); for(i=0;i<30;i++) {} do_cmd(3); for(i=0;i<30;i++) {} do_cmd(4); for(i=0;i<30;i++) {} do_cmd(5); for(i=0;i<30;i++) {} //test_buttons(); OUTA = 0xF0; // all signals idle high TL0 = TL0 + TLOW; // reset timer counter value TH0 = TH0 + THIGH; // reset timer counter value TR0 = 1; // start Timer 0 EA = 1; // enable interrupts } // End timer0 interrupt /************************************************************* * * timer0_init(void) - Initializes timer0 interrupt. * * Parameters - void * * Return - void * *************************************************************/ void timer0_init (void) { EA = 0; // disables all interrupts TR0 = 0; // stops Timer 0 CKCON = 0x03; // Timer 0 using CLK24/12 TMOD &= ~0x0F; // clear Timer 0 mode bits TMOD |= 0x01; // setup Timer 0 as a 16-bit timer TL0 = TL0 + THIGH; // set low byte of counter TH0 = TH0 + TLOW; // set high byte of counter PT0 = 0; // sets the Timer 0 interrupt to low priority ET0 = 1; // enables Timer 0 interrupt TR0 = 1; // starts Timer 0 EA = 1; // enables all interrupts } // End timer0_init