// ========================= // | o o o | o o o | o o o | Controller plug // \_____________________/ // 1 2 3 4 5 6 7 8 9 // // Controller Parallel // 1 - Data 10(pad1),13(pad2) // 2 - Command 2 // 3 - 9V(shock) +9V battery terminal // 4 - GND 18 , also -9V battery terminal // 5 - V+ 6,7,8,9 through diodes // 6 - ATT 3 // 7 - Clock 4 // 9 - ack 12(pad1), 15(pad2) unsigned char p0 = 0xf8+4+2+1; void Clk(int i, int base) { const clk=0x04; // Bit 3 Base+0 (parallel port) if (i) p0 |= clk; else p0 &= ~clk; _outp(base+0, p0); } void Sel(int i, int id, int base) { const power=0xf8; // Bits 3-7 Base+0 (parallel port) const att=0x02; // Bit 2 Base+0 (parallel port) unsigned char attary[] = { 0, 0x02, 0x08, 0x10, 0x20, 0x40 }; unsigned char attval; if (multitap) attval = attary[id]; else attval = att; p0 |= power; if (i) p0 |= attval; else p0 &= ~attval; _outp(base+0, p0); } void Cmd(int i, int base) { const cmd=0x01; // Bit 1 Base+0 (parallel port) if (i) p0 |= cmd; else p0 &= ~cmd; _outp(base+0, p0); } int Dat(int id, int base) { unsigned char data; if (multitap) data = 0x40; else { if (id==1) data = 0x40; else data = 0x10; } if (_inp(base+1)&data) return 1; else return 0; } int Ack(int id, int base) { unsigned char ack; if (multitap) ack = 0x20; else { if (id==1) ack = 0x20; else ack = 0x08; } if (_inp(base+1)&ack) return 1; else return 0; } void Slow(int base) { int i; if (psxdelay==3) { for (i=0; i<3; i++) _outp(base+0, p0); } else { for (i=0; ilf = data[3]&0x80?0:1; psx->dn = data[3]&0x40?0:1; psx->rt = data[3]&0x20?0:1; psx->up = data[3]&0x10?0:1; psx->start = data[3]&0x08?0:1; psx->select = data[3]&0x01?0:1; psx->cross = data[4]&0x40?0:1; psx->circle = data[4]&0x20?0:1; psx->l2 = data[4]&0x01?0:1; psx->r3 = data[3]&0x04?0:1; psx->l3 = data[3]&0x02?0:1; if (data[1]!=0x41) { psx->rx = data[5]; psx->ry = data[6]; psx->lx = data[7]; psx->ly = data[8]; } else { psx->lx = psx->rx = psx->lf?(MINJOY/256):(psx->rt?(MAXJOY/256):(MIDJOY/256)); psx->ly = psx->ry = psx->up?(MINJOY/256):(psx->dn?(MAXJOY/256):(MIDJOY/256)); } switch (data[1]) { case 0x73: //analog red mode case 0x53: //analog green mode psx->l1 = data[4]&0x04?0:1; psx->r1 = data[4]&0x08?0:1; psx->triangle = data[4]&0x10?0:1; psx->r2 = data[4]&0x02?0:1; psx->box = data[4]&0x80?0:1; break; default: psx->box = data[4]&0x80?0:1; psx->triangle = data[4]&0x10?0:1; psx->r1 = data[4]&0x08?0:1; psx->l1 = data[4]&0x04?0:1; psx->r2 = data[4]&0x02?0:1; break; } ForceFeedback( curJoy-1, id, base, 0, psx ); return data[1]; }