Jump to content
SINGLE TOOTH

3d0 Controller Pinout needed

Recommended Posts

Been scouring the internets for a pinout for a 3do controller. Cant seem to find anything useful. Surly one of you gentlemen have the answer.

Share this post


Link to post
Share on other sites

I couldn't locate a pin-out either online.

 

But, from what I did find and read it seems to work much like the NES/SNES controllers by sending a stream of data (serially) to the console as to the state of the controller. That means it doesn't have a wire dedicated to each button/direction like 2600/Genesis controllers do. Maybe someone else might know more about them.

Share this post


Link to post
Share on other sites

possibly there is no intrest in resurecting such old thread, but since i've already put 3 days of my time into this, maybe it would be good for someone somewhere if i shared the results

 

i've developed simple SNES to 3DO adaptor, currently supporting only one controller - its not that its complicated when you've basics covered, but i would like to get some feedback or buttons mappings first

 

so here we go

 

schematics - (warining - do not mount R1 and R2, add crystal to pins #4 and #5 of MCU)

 

board layout - easy enough to do at home with modest setup

 

assembly drawings

 

HEX file for programming AVR - please set CLKDIV8 to disabled and CLKSEL so it would use crystal over 8mhz (1110 it was)

 

thing in action

DSC01663.JPG

 

closeup of the board

DSC01664.JPG

 

this board was designed to fit inside KM-100B case by maszczyk

 

pins for SNES ports were taken from split DB25 male plug as i couldn't find any supplier for these sockets locally

 

Sebastian

Share this post


Link to post
Share on other sites

Howdy-

 

Slightly off-topic, but I think you guys might be able to help. I got an ALG Light Gun for my 3DO, but as soon as I plug it into my FZ-1, the FZ-1 starts resetting repeatedly over & over till I unplug it.

 

I gather that the gun is shorting the ground & power pins on the controller port...?

 

 

Thanks,

-Jason

Share this post


Link to post
Share on other sites

possibly there is no intrest in resurecting such old thread, but since i've already put 3 days of my time into this, maybe it would be good for someone somewhere if i shared the results

 

i've developed simple SNES to 3DO adaptor, currently supporting only one controller - its not that its complicated when you've basics covered, but i would like to get some feedback or buttons mappings first

 

 

Sebastian

Hi Sebastian, I have a couple of questions. I need a 3DO pad, but where I'm livin it's already impossible to buy one.

So ¿why they can't adapt the snes pad directly to the 3DO? ¿What's the difference between both pads?

I'm asking because both pads looks almost identical.

 

ZZT

Share this post


Link to post
Share on other sites

Hi Sebastian, I have a couple of questions. I need a 3DO pad, but where I'm livin it's already impossible to buy one.

So ¿why they can't adapt the snes pad directly to the 3DO? ¿What's the difference between both pads?

I'm asking because both pads looks almost identical.

 

ZZT

The two controllers send different data. Similar to the way you can't play a dreamcast disc on a playstation. It's just not going to send what the system is expecting to see.

Share this post


Link to post
Share on other sites

The two controllers send different data. Similar to the way you can't play a dreamcast disc on a playstation. It's just not going to send what the system is expecting to see.

Thanks for your answer, if I understood well the difference is only the data. ¿right?

Share this post


Link to post
Share on other sites
Sorry to resurrect an ancient thread but I'm trying to put together a two player SNES to 3DO adapter based on candle's design and for some reason he's unable to receive PMs.


Candle - did you get two player functionality to work? Do you have any other images/documents/information about your progress with the project? Perhaps a parts list?


Thanks very much!

Share this post


Link to post
Share on other sites

Well, somehow I got it to work. Haven't tested second player functionality yet but 1P works great with stock SNES pad.

 

Dn3aF3v.jpg

Share this post


Link to post
Share on other sites

I got s UFO 3DZero SNES->3DO adapter, and it has a daisy chain port to allow as many players ad the 3DO can allow (8? 10?)

 

I found one flaw with a 3DZero... A game called Pataaank.

 

If that's the only multiplayrr game that does work. No big deal when players 1 and 2 are alternating  like in Pataaank.

 

But if a 2 or more players simultanious game doesn't, that'd be awful.

 

And red flagged games other than Pataaank?

Share this post


Link to post
Share on other sites

here is code i've wrote back then

perhaps it will be any good for someone

.include "tn2313def.inc"
.def        zero =    r10
.def        one =    r11
.def        two =    r12

;-------------------------------------------------------------------------------;
;                                    Data Segment                                ;
;-------------------------------------------------------------------------------;
.dseg
.org    SRAM_Start

PadA:    .byte    2
PadB:    .byte    2
Pad3A:    .byte    2
Pad3B:    .byte    2
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; General
;-------------------------------------------------------------------------------;
;                                    Code Segment                                ;
;-------------------------------------------------------------------------------;
.cseg
.overlap
.org    0
            rjmp    start
.org    INT0Addr


.macro        wait
            ldi        @0,@1
ll:            dec        @0
            brne    ll
.endmacro

start:        cli                                ; Disable Interrupts
            ldi        r16,low(RAMEND)
            out        SPL,r16
            rcall    MCU_Setup                ; Setup ports

            sbi        PORTD,4
main_l1:    sbis    PIND,3
            rjmp    main_strobe_low
main_strobe_high:
            sbi        PORTD,4
            sbi        PORTD,0
            rcall    SNES_Receive
            rcall    SNES23DO
            sbi        PORTD,4
            cbi        PORTD,0
main_strobe_high_s1:
            sbic    PIND,3
            rjmp    main_strobe_high_s1
            rjmp    main_l1
main_strobe_low:
            rcall    TDO_Send
            sbi        PORTD,4
main_strobe_low_s1:
            sbis    PIND,3
            rjmp    main_strobe_low_s1
            rjmp    main_strobe_high

;-------------------------------------------------------------------------------
SNES23DO:    lds        r16,PadA
            ldi        zl,Low(Translation*2)        ;r30
            ldi        zh,High(Translation*2)        ;r31
            clr        r20
            clr        r21
            ldi        r17,8
SNES23DO_l1:
            lpm        r18,z+
            lpm        r19,z+
            lsl        r16
            brcs    SNES23DO_s1
            or        r20,r18
            or        r21,r19
SNES23DO_s1:
            dec        r17
            brne    SNES23DO_l1

            lds        r16,PadA+1
            ldi        r17,8
SNES23DO_l2:
            lpm        r18,z+
            lpm        r19,z+
            lsl        r16
            brcs    SNES23DO_s2
            or        r20,r18
            or        r21,r19
SNES23DO_s2:
            dec        r17
            brne    SNES23DO_l2
            sts        Pad3A,r21
            sts        Pad3A+1,r20
            ret
;-------------------------------------------------------------------------------
;    SNES: YGSSUDLR RBLR----
;            ltpntt     
;    3DO:  00DURLAB CPXRL001
; Yellow (15) -> A     ( 9)
; Green  (14) -> B     ( 
; Select (13) -> X     ( 5)
; Start  (12) -> P     ( 6)
; Up     (11) -> Up    (12)
; Down   (10) -> Down  (13)
; Left   ( 9) -> Left  ( 7)
; Right  (  -> Right (13)
; Red    ( 7) -> C     ( 7)
; Blue   ( 6) -> P     ( 6)
; L      ( 5) -> L     ( 3)
; R      ( 4) -> R     ( 4)

Translation:
            .dw        0b0000000100000000    ; Yellow (15) -> A     ( 9)
            .dw        0b0000001000000000    ; Green  (14) -> B     ( 
            .dw        0b0000000000010000    ; Select (13) -> X     ( 5)
            .dw        0b0000000000100000    ; Start  (12) -> P     ( 6)
            .dw        0b0001000000000000    ; Up     (11) -> Up    (12)
            .dw        0b0010000000000000    ; Down   (10) -> Down  (13)
            .dw        0b0000010000000000    ; Left   ( 9) -> Left  (10)
            .dw        0b0000100000000000    ; Right  (  -> Right (11)
            .dw        0b0000000010000000    ; Red    ( 7) -> C     ( 7)
            .dw        0b0000000000100000    ; Blue   ( 6) -> P     ( 6)
            .dw        0b0000000000001000    ; L      ( 5) -> L     ( 3)
            .dw        0b0000000000010000    ; R      ( 4) -> R     ( 4)
            .dw        0b0000000000000000    ; -
            .dw        0b0000000000000000    ; -
            .dw        0b0000000000000000    ; -
            .dw        0
;-------------------------------------------------------------------------------
TDO_Send:    lds        r18,Pad3A
            lds        r19,Pad3A+1
            lds        r20,PadB
            lds        r21,PadB+1
            ldi        r16,8
            ldi        r17,128
            ldi        r24,16
            sbi        PORTD,4
TDO_Send_l1:
            sbic    PIND,2
            rjmp    TDO_Send_l1        ; wait for clock line going high
            mov        r22,r18
            and        r22,r17
            clr        r23
            cpse    r22,zero
            mov        r23,r24
            out        PORTD,r23
TDO_Send_s1:
            sbis    PIND,2            ; wait for clock line going low
            rjmp    TDO_Send_s1
            lsr        r17
            dec        r16
            brne    TDO_Send_l1

            ldi        r16,8
            ldi        r17,128
TDO_Send_l2:
            sbic    PIND,2
            rjmp    TDO_Send_l2
            mov        r22,r19
            and        r22,r17
            clr        r23
            cpse    r22,zero
            mov        r23,r24
            out        PORTD,r23
TDO_Send_s2:
            sbis    PIND,2
            rjmp    TDO_Send_s2
            lsr        r17
            dec        r16
            brne    TDO_Send_l2
            sbi        PORTD,4
            ret
;-------------------------------------------------------------------------------
SNES_Pulse:
            sbi        PORTB,1
            wait    r22,10
            cbi        PORTB,1
            ret
;-------------------------------------------------------------------------------
SNES_Strobe:
            sbi        PORTB,2
            wait    r22,20
            rcall    SNES_Pulse
            wait    r22,20
            cbi        PORTB,2
            ret
;-------------------------------------------------------------------------------
SNES_Receive:
            rcall    SNES_Strobe
            clr        r18
            clr        r19
            clr        r20
            clr        r21
            ldi        r16,8
            ldi        r17,128
SNES_Receive_l1:
            sbic    PINB,3
            or        r18,r17

            sbic    PINB,4
            or        r20,r17
            rcall    SNES_Pulse

            lsr        r17
            dec        r16
            brne    SNES_Receive_l1

            ldi        r16,8
            ldi        r17,128
SNES_Receive_l2:
            cbi        PORTB,1
            sbic    PINB,3
            or        r19,r17

            sbic    PINB,4
            or        r21,r17
            rcall    SNES_Pulse

            lsr        r17
            dec        r16
            brne    SNES_Receive_l2
            sts        PadA,r18
            sts        PadA+1,r19
            sts        PadB,r20
            sts        PadB+1,r21
            ret
;-------------------------------------------------------------------------------
Dec_digit:    ldi        r17,255
Dec_digit_l1:
            inc        r17
            subi    r16,10
            brcc    Dec_digit_l1
            subi    r16,-10
            mov        zl,r16
            mov        r16,r17
            ldi        r17,255
Dec_digit_l2:
            inc        r17
            subi    r16,10
            brcc    Dec_digit_l2
            subi    r16,-10
            push    r17
            mov        r17,r16
            pop        r16
            ret

Hex_digit:    andi    r16,0x0f
            subi    r16,-48
            cpi        r16,58
            brlo    Hex_digit_ok
            subi    r16,-7
Hex_digit_ok:
            ret

;-------------------------------------------------------------------------------
; Initial setup of microcontroller
MCU_Setup:    ldi        r16,0b11100110
            out        DDRB,r16                ; set PORT B as output
            ldi        r16,0b00011001
            out        PORTD,r16
            ldi        r16,0b00010001
            out        DDRD,r16                ; set PORT D as input
            ldi        r16,0b00001000
            out        PORTD,r16
            clr        r16
            mov        zero,r16
            inc        r16
            mov        one,r16
            inc        r16
            mov        two,r16
            ldi        r17,255
MCU_Setup_l1:
            wait    r16,255
            dec        r17
            brne    MCU_Setup_l1
            ldi        r16,0xFF
            sts        PadA,r16
            sts        PadB,r16
            ldi        r16,0xFF
            sts        PadA+1,r16
            sts        PadB+1,r16
            ret

;-------------------------------------------------------------------------------
 

 

oh, it's in assembler ;)

  • Like 1

Share this post


Link to post
Share on other sites

@candle I got all the components and assembled on a breadboard over the weekend. Having some trouble though getting it to work.

I flashed the chip with your hex file, I didn't connect the zero-resistors on clock/ps lines, and added a 8mhz crystal between pins 4/5 and setup CKSEL to 1110. I am suspecting it may be a fuse configuration issue. Do you happen to remember or know how to calculate correct fuse config? I used engbedded.com/fusecalc to generate: 
 

avrdude -c usbtiny -p attiny2313 -v -U lfuse:w:0x3e:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m

 

Thanks again for sharing your assets to allow me to rebuild this. 🙏

Share this post


Link to post
Share on other sites

you don't need external crystal for this, so i would leave that as it were right from factory

the only thing i suspect you must change is clockdiv/8 bit changing default cpu speed to 8mhz (factory sets this to 1mhz instead)

 

Share this post


Link to post
Share on other sites
46 minutes ago, candle said:

you don't need external crystal for this, so i would leave that as it were right from factory

the only thing i suspect you must change is clockdiv/8 bit changing default cpu speed to 8mhz (factory sets this to 1mhz instead)

 

I reset to defaults except for CKDIV8 not enabled. Still nothing, but I did notice if I enable CKOUT I get random directional controller input (without actually pressing buttons). I'm going to double check my wiring but I'm pretty sure I got everything connected correctly. Does CKOUT need to be enabled?

Share this post


Link to post
Share on other sites

certainly not

but if you take a look on the pictures, you'll find that 0R resistors are not populated on the board

Share this post


Link to post
Share on other sites
5 hours ago, candle said:

certainly not

but if you take a look on the pictures, you'll find that 0R resistors are not populated on the board

Here is how I have my prototype wired up. I made sure to take the 0R resistors and the crystal out. I have tried numerous different fuse configurations but just can't seem to get this working this evening. 

SNES-to-3DO-proto.jpg

3DOSNES2.png

Share this post


Link to post
Share on other sites

perhaps this will help someone building it

there is a crystal soldered underneath of my original board - 20mhz one with some 22pF caps parallel to it

so i guess you need to set up fuses to use it after all

anyways, here are the pics

 

WhatsApp Image 2021-02-05 at 12.25.22.jpeg

WhatsApp Image 2021-02-05 at 12.25.21.jpeg

Share this post


Link to post
Share on other sites
6 hours ago, candle said:

perhaps this will help someone building it

there is a crystal soldered underneath of my original board - 20mhz one with some 22pF caps parallel to it

so i guess you need to set up fuses to use it after all

Nice! I got mine working!

 

I didn't see an option for 20mhz on the AVR fuse calculator website. I went with Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 14 CK + 0 ms; [CKSEL=1110 SUT=10]. Just out of curiosity I went back to the 8mhz crystal and it also works.

 

While testing I found a few bugs I will need to debug.
 - MNEMO's USB Host mod only receives single axis directional inputs.
 - 8BitDo Wireless Receiver incorrectly maps buttons start/pause action on several.

@candle you mentioned some 22pF caps parallel to the crystal.. Are these in these recent photos you posted? I'm not sure how to place these caps in "parallel". (sorry im a newb) Also are these BOJACK 0.1uF caps suitable for the C1 in the schematic? 

 

Now my next steps are to figure out how to compile this assembly code myself so that I can start debugging and updating it. 🙏🙏
 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...