Originally appeared at the D-Bug forum

Recently I've been messing around with Jagpad input and while I sorted it out easily, I wanted to add support for the teamtap as well. Not wanting to reinvent the wheel, I asked around for some advice on the matter. Zerosquare of CVSD pointed me to two solutions for this.

One was to use heuristics (i.e. make the user press a jagpad button and see if the button press is shadowed on other pads on the same port - if yes, the user most certainly doesn't have one installed), and the other was in fact a method by Matthias Domin, which reads a seemingly unused bit on the jagpad matrix on jagpad #4. Matthias claimed that if this bit (C1 on the jaguar docs) is inactive (at least on Falcon, jagpad bits are all set to 1 when the user doesn't press any button on the pad), then there's a teamtap installed.

That was just what I needed! So I quickly wrote a test program in GFA Basic and sent it to SH3 (I forgot to mention that I don't own a jagpad ;)). And that didn't work 100%. It turns out that this bit can change if there's no teamtap installed and the user presses the pause button. Fortunately we noticed that only bit C1 changes when you insert the teamtap in the port. So Matthias' claim was partly correct. The check that works 100% is:

  • if (bit c1 in jagpad #4)=set and (bit c2 in jagpad #4)=set then the user is using a single jagpad without teamtap and pressing pause
  • if (bit c1 in jagpad #4)=unset and (bit c2 in jagpad #4)=set then we have a teamtap! (the trick here is that when a teamtap is installed, then if jagpad #1 pause is set, you don't have any shadowing to the other pads)
  • if (bit c1 in jagpad #4)=unset and (bit c2 in jagpad #4)=unset then we have a normal jagpad, pause is not pressed

(note: "unset" means that the bit is in it's natural state and "set" means it's changed. As I mentioned, on the Falcon it's 1 for unset and 0 for set :-))
(note #2: there's a 4th combination of bits, but I don't think it's possible to achieve this with a normal teamtap, so it's left out)

I hope I didn't screw anything up - after all, I tested at blind (sh3 was my eyes :-)). If you find any inaccuracies, please mention them to me so I'll fix the text :-)


Addendum: The shitty GFA program I used to test all of the above. It's not anything brainblasting, but at least it works (it's for port #1 btw) and it displays all ports' pad bits in the same screen.

DO   PRINT AT(0,1)   PRINT "teamtap port a"   SDPOKE &HFFFF9202,&HFFFE   PRINT BIN$(DPEEK(&HFFFF9200),16)'BIN$(DPEEK(&HFFFF9202),16)   SDPOKE &HFFFF9202,&HFFFD   PRINT BIN$(DPEEK(&HFFFF9200),16)'BIN$(DPEEK(&HFFFF9202),16)   SDPOKE &HFFFF9202,&HFFFB   PRINT BIN$(DPEEK(&HFFFF9200),16)'BIN$(DPEEK(&HFFFF9202),16)   SDPOKE &HFFFF9202,&HFFF7   PRINT BIN$(DPEEK(&HFFFF9200),16)'BIN$(DPEEK(&HFFFF9202),16)   '   PRINT "teamtap port b"   SDPOKE &HFFFF9202,&HFFF0   PRINT BIN$(DPEEK(&HFFFF9200),16)'BIN$(DPEEK(&HFFFF9202),16)   SDPOKE &HFFFF9202,&HFFF1   PRINT BIN$(x1%,16)'BIN$(DPEEK(&HFFFF9202),16)   SDPOKE &HFFFF9202,&HFFF2   PRINT BIN$(x2%,16)'BIN$(DPEEK(&HFFFF9202),16)   SDPOKE &HFFFF9202,&HFFF3   PRINT BIN$(x3%,16)'BIN$(DPEEK(&HFFFF9202),16)   '   PRINT "teamtap port c"   SDPOKE &HFFFF9202,&HFFF4   PRINT BIN$(DPEEK(&HFFFF9200),16)'BIN$(DPEEK(&HFFFF9202),16)   SDPOKE &HFFFF9202,&HFFF5   PRINT BIN$(x1%,16)'BIN$(DPEEK(&HFFFF9202),16)   SDPOKE &HFFFF9202,&HFFF6   PRINT BIN$(x2%,16)'BIN$(DPEEK(&HFFFF9202),16)   SDPOKE &HFFFF9202,&HFFF8   PRINT BIN$(x3%,16)'BIN$(DPEEK(&HFFFF9202),16)   '   PRINT "teamtap port d"   SDPOKE &HFFFF9202,&HFFF9   PRINT BIN$(DPEEK(&HFFFF9200),16)'BIN$(DPEEK(&HFFFF9202),16)   SDPOKE &HFFFF9202,&HFFFA   x1%=DPEEK(&HFFFF9200)   PRINT BIN$(x1%,16)'BIN$(DPEEK(&HFFFF9202),16)   SDPOKE &HFFFF9202,&HFFFC   x2%=DPEEK(&HFFFF9200)   PRINT BIN$(x2%,16)'BIN$(DPEEK(&HFFFF9202),16)   SDPOKE &HFFFF9202,&HFFFF   x3%=DPEEK(&HFFFF9200)   PRINT BIN$(x3%,16)'BIN$(DPEEK(&HFFFF9202),16)   '   PRINT   PRINT "C1=";BTST(x1%,0);", C2=";BTST(x2%,0);", C3=";BTST(x3%,0)   PRINT "So..."'   IF BTST(x1%,0)=1 AND BTST(x2%,0)=0     PRINT "you have a teamtap installed!"   ELSE     PRINT "you DO NOT have a teamtap installed!"   ENDIF LOOP UNTIL INKEY$""