3DO interface

A project log for BlueRetro

Multiplayer Bluetooth controllers adapter for retro video game consoles

Jacques GagnonJacques Gagnon 03/29/2021 at 00:450 Comments

I just added 3DO support with version v0.13! Regular pad, flightstick and mouse are supported. Any mix of devices is supported for up to 8 players! Refer to wiki for cable schematic and config documentation.

The 3DO interface is quite unique as 8 players are supported via a single port! 3DO peripherals for the most part include an input port on them allowing to daisy-chain controller back to back. No extra port on console or multitap are required!

The low level protocol is pretty much like SPI mode 3. You got the CLK, a data output and a data input. Base on my test the console data output is not used by the controller. The big difference with SPI is that there is no chip select signal. Frame start is signaled by holding the CLK line high for 500 us.

Data from daisy-chained peripherals are simply appended to the transmission back to back, first controller transmitted first. 3DO BIOS and some games will always query for 200 bytes of data. Some games only query what they need. Extra read data is always 0xFF.

This is one of the easiest systems to implement in BlueRetro. The only challenge was to generate a chip select signal for the ESP32 SPI hardware. The ESP32 SPI slave hardware is unfortunately not very flexible. I loop back my generated CS GPIO output into the ESP32 SPI CS input.

See generated CS signal in yellow base on CLK signal Start

Regular controller

RX: 8000
    │││└ R, L , 0, 0
    ││└ B, C, P, X
    │└ Up, Right, Left, A
    └ 8, 0, 0, Down


        ┌ Y axis (10 bits) (Up: -, Down: +, Two's complement)
RX: 49000000
    ├┘│  └┬┘
    │ │   └ X axis (10 bits) (Left: -, Right: +, Two's complement)
    │ └ Buttons (Left, Middle, Right, 0)
    └ ID


I didn't RE this one my self, base on:

           ┌ X axis (10 bits) (Left: -, Right: +, Two's complement)
RX: 017B08802008020000
    └┬───┘  └┬┘└┬┘│││
     └ IDs?  │  │ ││└ P, X, L, R
             │  │ │└ Up, Down, Right, Left
             │  │ └ Trigger, A, B, C
             │  └ Z axis (10 bits) (Two's complement)
             └ Y axis (10 bits) (Up: -, Down: +, Two's complement)