Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as C by registered user rattlehead ( 15 years ago )
#ifndef _libds
#define _libds
#endif
/***ATT: this is supossed to EMULATE a Dual Shock 2
and not read it.***/
unsigned int xstat; //Button states
unsigned int tristat;
unsigned int sqrstat;
unsigned int circstat;
unsigned int upstat;
unsigned int dwnstat;
unsigned int rtstat;
unsigned int ltstat;
unsigned int l1stat;
unsigned int l2stat;
unsigned int l3stat;
unsigned int r1stat;
unsigned int r2stat;
unsigned int r3stat;
unsigned int ststat;
unsigned int slstat;
unsigned int anstat;
//Joystick states
unsigned int rxjoy;
unsigned int ryjoy;
unsigned int lxjoy;
unsigned int lyjoy;
unsigned int ffsent; //0xFF to spi buffer flag
unsigned int bytecount = 0; //SPI rcv bytes count
unsigned int command; //command rcv'd by spi
unsigned int digital = 1; //digital mode
unsigned int analog; //analog mode
unsigned int config; //config mode
unsigned int bstat1[7]; //button state 1
unsigned int bstat2[7]; //button state 2
unsigned int bstate1; //bstate1 byte
unsigned int bstate2; //bstate2 byte
void dsconf(){
input(DSATT);
input(DSCMD);
input(DSCLK);
setup_spi(SPI_SLAVE | SPI_H_TO_L | SPI_XMIT_L_TO_H);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
}
ack(unsigned int us){
output_low(DSACK);
delay_us(us);
output_high(DSACK);
}
void write(unsigned int data, int doack = 1){
//delay_us(2);
spi_write(data);
//if(doack)
// ack(3);
}
#INT_SSP
void libds_isr(){
ack(2);
command = spi_read(); //IMPORTANT SHIT
//if(command == 0x00 && bytecount == 4)
// output_high(GREEN_LED);
bytecount++; //INCREMENT BYTE COUNT
switch (bytecount){
case 1:
if(digital){
write(0x41,1);
}
//write(0xFE,1);
/*if(analog)
write(0x79,1);
if(config)
write(0xFF,1);*/
break;
case 2:
if(command == 0x42){
//output_high(GREEN_LED);
config = 0;
write(0x5A,1);
break;
}
if(command == 0xFF){
config = 1;
write(0x5A,1);
break;
}
write(0xFF,1);
bytecount = 0;
break;
case 3:
if(config == 0 && command == 0x00){
write(0xFF,1);
output_high(GREEN_LED);
}
break;
case 4:
if(config == 0 && command == 0x00){
write(0xFF,0);
}
if(digital && !config)
write(0xFF,0);
break;
case 5:
if(command == 0x00 && analog && !config){
write(rxjoy);
}
if(command == 0x00 && digital && !config){
write(0xFF);
bytecount = 0;
}
break;
case 6:
if(command == 0x00 && analog && !config){
write(ryjoy);
}
break;
case 7:
if(command == 0x00 && analog && !config){
write(lxjoy);
}
break;
case 8:
if(command == 0x00 && analog && !config){
write(lyjoy);
}
break;
case 9:
if(rtstat){
write(0xFF);
} else {
write(0x00);
}
break;
case 10:
if(ltstat){
write(0xFF);
} else {
write(0x00);
}
break;
case 11:
if(upstat){
write(0xFF);
} else {
write(0x00);
}
break;
case 12:
if(dwnstat){
write(0xFF);
} else {
write(0x00);
}
break;
case 13:
if(tristat){
write(0xFF);
} else {
write(0x00);
}
break;
case 14:
if(circstat){
write(0xFF);
} else {
write(0x00);
}
break;
case 15:
if(sqrstat){
write(0xFF);
} else {
write(0x00);
}
break;
case 16:
if(xstat){
write(0xFF);
} else {
write(0x00);
}
break;
case 17:
if(l1stat){
write(0xFF);
} else {
write(0x00);
}
break;
case 18:
if(r1stat){
write(0xFF);
} else {
write(0x00);
}
break;
case 19:
if(l2stat){
write(0xFF);
} else {
write(0x00);
}
break;
case 20:
if(r2stat){
write(0xFF);
} else {
write(0x00);
}
break;
}
//bytecount++;
}
/*void libds_loop(){
if(!ffsent){
write(0xFF);
ffsent = 1;
}
}*/
Revise this Paste