Einen 3DO heute onlinefähig machen – ein experimenteller Ansatz

merlin123

Lt. Commander
Registriert
Jan. 2018
Beiträge
1.854
Hi zusammen 👋,

der 3DO war seiner Zeit technisch voraus, besaß jedoch nie echte Online-Funktionalität im heutigen Sinn. Dennoch lässt sich mit moderner Hardware – insbesondere einem PC als privatem Server und einem Raspberry Pi als Brücke – ein spannendes, experimentelles Setup realisieren.

ich wollte schon länger wissen, ob man einen alten 3DO mit heutigen Mitteln irgendwie „online“ bringen kann – nicht im Sinne von Echtzeit-Multiplayer, sondern eher so, wie es zur Hardware passt. Nach ein paar Abenden Basteln, Lesen alter Dokus sowie Forenbeiträge und Fluchen über serielle Schnittstellen ist daraus dieses kleine Projekt entstanden.

Vielleicht ist es für den einen oder anderen hier interessant oder zumindest eine nette Inspiration.


(Dieser Artikel beschreibt kein offizielles oder historisch korrektes Verfahren, sondern einen theoretisch-praktischen Bastelansatz, wie man einem 3DO eine Art „Pseudo-Onlinefähigkeit“ verleihen könnte)

---

Die Idee

Einfach gesagt:

Mein 3DO soll Highscores an einen privaten Server schicken und beim nächsten Start wieder abrufen können.

Kein Internet direkt, kein WLAN-Modul, kein Zauber – sondern ein Raspberry Pi als Dolmetscher zwischen 90er-Jahre-Hardware und einem stinknormalen PC.


---

Setup (wie es bei mir aussieht)

3DO → serielle Verbindung → Raspberry Pi → LAN/WLAN → PC (Server)

Der Pi hängt bei mir unscheinbar hinter dem Fernseher und macht genau eine Sache: Daten weiterreichen.


---

Hardware, die ich benutzt habe:

Panasonic 3DO FZ-10

Raspberry Pi 3 (lag noch rum)

USB-zu-TTL-Seriell-Adapter (FTDI FT232RL (3,3V))

Pegelwandler (wichtig!) (Logic level converter bss138 3.3V)

ein selbstgelötetes Kabel (flexible Einzellitzen 0,25mm"2,rot=TX,gelb=RX,schwarz=masse)

viel Geduld 😅


Hinweis: Ohne Pegelwandler würde ich das keinem empfehlen. Alte Hardware ist da sehr unforgiving.

---
Kabel bauen:

Erstmal 2-3mm abisolieren an beiden Enden und diesen dann vorverzinnen (zur Besseren Übersicht TX/RX und GND markieren)

Anschlussplan:

Code:
3DO Mainboard
           -----------------
          | |
  TX ────|─────────────────┐ (rote Litze)
  RX ────|─────────────────┘ (gelbe Litze)
  GND ────|─────────────────■ (schwarze Litze)
          | |
           -----------------
                  │
                  │ selbstgelötetes Kabel
                  ▼
          ---------------------
          | Pegelwandler BSS138|
          | LV HV |
          |-------------------|
  TX LV1 ◀── LV 3,3V vom Pi │
  RX LV2 ◀── LV 3,3V vom Pi │
  GND ◀─ LV GND ─────────────────┤
          | |
  TX HV1 ──▶ HV TX 3DO (rot) │
  RX HV2 ──▶ HV RX 3DO (gelb) │
  GND ──▶ HV GND 3DO (schwarz) │
          ---------------------
                  │
                  │ kurze Jumper- oder Dupont-Kabel
                  ▼
            USB-TTL Adapter
           -----------------
          | |
   RX ◀── LV1 TX │ (rot)
   TX ─▶ LV2 RX │ (gelb)
   GND ──┘ │ (schwarz)
           -----------------
                  │
                  ▼
           Raspberry Pi
           -----------------
          | |
   USB-Port (ttyUSB0) │
           -----------------
                  │
                  ▼
              Python-Script
      (Serial-Bridge 3DO ↔ Server)

Kurze Zwischen Notiz, der 3do hat keinen Standard uart-Port. ich habe durch messen/testen an den Testpunkten Signale gemessen die Rückschlusse auf "senden" oder "Empfangen" geben. Ich glaube sogar (weil ich nur den 3DO habe) das die anderen Mainboards sogar anders aufgebaut sind.

---

Warum seriell?

Ich habe kurz überlegt den Controller-Port zu missbrauchen, mich dann aber für serielle Kommunikation entschieden:
  • leichter zu debuggen
  • stabil
  • fühlt sich irgendwie „richtig“ an


Einstellungen:
9600 Baud
8N1

Langsam? Ja. Aber absolut ausreichend.


---

Mini-Protokoll (extra simpel)

Ich wollte kein Binärformat bauen, sondern etwas, das ich mitlesen kann:

Python:
SEND|PLAYER=MIKA|SCORE=123456|TIME=2025-12-13

Antwort:

Python:
OK|RANK=3

Bestenliste abrufen:

Python:
GET|HIGHSCORES

Antwort:

Python:
LIST|1,AAA,999999;2,BBB,500000;3,MIKA,123456

Das Ganze ist absichtlich primitiv – Debugging per Terminal ist Gold wert.


---

3DO-Seite (stark vereinfacht)

Das "Spiel" blockiert einfach, bis eine Antwort kommt. Multitasking wäre Overkill.

Python:
send("SEND|PLAYER=MIKA|SCORE=123456");
response = receive();
showMessage("Score gespeichert!");

---

Raspberry Pi: die Brücke

Der Pi ist bei mir bewusst dumm gehalten. Keine Logik, kein Cache – nur Weiterleiten.

Python:
import serial, socket

ser = serial.Serial('/dev/ttyS0', 9600)
sock = socket.socket()
sock.connect(('192.168.0.10', 9000))

while True:
    msg = ser.readline()
    sock.send(msg)
    reply = sock.recv(1024)
    ser.write(reply)
/CODE]

---

Server auf dem PC

Läuft auf meinem normalen Rechner im LAN. Erstmal nur rudimentär:

[CODE=python]
import socket

scores = []

srv = socket.socket()
srv.bind(('0.0.0.0', 9000))
srv.listen(1)

conn, _ = srv.accept()
while True:
    data = conn.recv(1024).decode()
    if data.startswith('SEND'):
        scores.append(data)
        conn.send(b'OK|RANK=3')


Das Ganze ist natürlich komplett unnötig – aber genau das macht für mich den Reiz aus.

Einen 30 Jahre alten 3DO Daten an einen Server schicken zu sehen, fühlt sich einfach falsch und richtig zugleich an.

Natürlich gibt es keine Spiele die sowas tatsächlich nutzen, aber irgendiwe hat es seinen Reiz Homebrew bzw. tests und solche Späße auszuprobieren


Fazit

Einen 3DO heute „onlinefähig“ zu machen ist:

- technisch anspruchsvoll
-langsam
-absolut unnötig


…aber genau deshalb fantastisch.

Mit einem Raspberry Pi als intelligenter Brücke lässt sich ein privates Retro-Netzwerk erschaffen, das zeigt, wie flexibel alte Systeme sein können, wenn moderne Technik ihnen zur Seite steht.




Software auf dem 3DO

Eigene Homebrew-Software

Python:
import serial
import socket
import time
import queue
import threading

# -----------------------
# Konfiguration
# -----------------------

SERIAL_PORT = "/dev/ttyS0"
SERIAL_BAUD = 9600

SERVER_IP = "192.168.0.10"
SERVER_PORT = 9000

SERIAL_TIMEOUT = 0.1
NETWORK_TIMEOUT = 5

# -----------------------
# Queues für Puffern
# -----------------------

to_server = queue.Queue()   # Daten vom 3DO → Server
to_3do = queue.Queue()      # Daten vom Server → 3DO

# -----------------------
# Serielle Verbindung
# -----------------------

ser = serial.Serial(
    SERIAL_PORT,
    SERIAL_BAUD,
    timeout=SERIAL_TIMEOUT
)

# -----------------------
# Netzwerkverbindung
# -----------------------

def connect_server():
    while True:
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.settimeout(NETWORK_TIMEOUT)
            s.connect((SERVER_IP, SERVER_PORT))
            print("[NET] Verbunden mit Server")
            return s
        except Exception as e:
            print("[NET] Verbindung fehlgeschlagen, retry in 3s")
            time.sleep(3)

sock = connect_server()

# -----------------------
# Thread: Lesen vom 3DO
# -----------------------

def read_from_3do():
    buffer = b""

    while True:
        try:
            data = ser.read(64)
            if data:
                buffer += data

                if b"\n" in buffer:
                    line, buffer = buffer.split(b"\n", 1)
                    msg = line.decode(errors="ignore").strip()
                    print(f"[3DO → PI] {msg}")
                    to_server.put(msg)

        except Exception as e:
            print("[3DO] Fehler:", e)
            time.sleep(1)

# -----------------------
# Thread: Senden zum 3DO
# -----------------------

def write_to_3do():
    while True:
        msg = to_3do.get()
        try:
            ser.write((msg + "\n").encode())
            print(f"[PI → 3DO] {msg}")
        except Exception as e:
            print("[3DO] Schreibfehler:", e)

# -----------------------
# Thread: Kommunikation mit Server
# -----------------------

def server_loop():
    global sock

    while True:
        try:
            msg = to_server.get()
            sock.sendall((msg + "\n").encode())
            print(f"[PI → SERVER] {msg}")

            reply = sock.recv(1024)
            if not reply:
                raise ConnectionError("Server disconnected")

            reply_msg = reply.decode().strip()
            print(f"[SERVER → PI] {reply_msg}")
            to_3do.put(reply_msg)

        except Exception as e:
            print("[NET] Fehler:", e)
            sock.close()
            sock = connect_server()
            time.sleep(1)

# -----------------------
# Threads starten
# -----------------------

threads = [
    threading.Thread(target=read_from_3do, daemon=True),
    threading.Thread(target=write_to_3do, daemon=True),
    threading.Thread(target=server_loop, daemon=True),
]

for t in threads:
    t.start()

print("3DO Bridge läuft...")

while True:
    time.sleep(1)
--






Weiterleitung an Server


Beispiel-Software (Python, vereinfacht)

Python:
import serial
import socket

ser = serial.Serial('/dev/ttyS0', 9600)
sock = socket.socket()
sock.connect(('192.168.0.10', 9000))

while True:
    data = ser.readline()
    sock.send(data)

---
 
  • Gefällt mir
Reaktionen: pixelwanderer, DTFM, gman32 und 9 andere
Okay, höchst spannend - als wenn der 3DO nicht ansich schon exklusiv genug wäre - ihm dann aber noch Online-Leben einzuhauchen geht ja selbst über die Community-Bewegungen bezüglich einer Dreamcast weit hinaus :)

Wie schaut's denn mit dem Circuit Board aus, bist du dort aktiv? Im deutschsprachigen Raum wirst du kaum mehr geballtes Wissen bezüglich solch tiefgreifender Retro-Basteleien finden, wie dort.
 
  • Gefällt mir
Reaktionen: merlin123
@DJMadMax nicht direkt angemeldet aber jahrelanger Leser. Als Jugendlicher war ich dort oft unterwegs und es war tatsächlich die Dreamcast und die Leute dort, die mich zu meinen beiden Berufen (Elektriker/Systemadmin) geführt haben. Seitdem denke ich mir immer wieder irgendwelche Projekte aus
 
  • Gefällt mir
Reaktionen: DJMadMax
Sehr beeindruckend - cool :)
 
@Archivar vielen Dank! Momentan bin ich an mehreren Projekten parallel zugange. Da keines bisher fertig ist und dieses nur zum Teil dachte ich mir ich teile es mal.
Vieles ist durch messen und testen entstanden, und ich habe zu spät angefangen zu dokumentieren..dachte ich schreib es schnell mal auf solange es noch im Kopf ist
 
  • Gefällt mir
Reaktionen: Archivar und FCK_PTN
hahah letztens noch ein Panasonic 3DO im Keller, beim aufräumen gefunden ... ob der noch löppt? :D
 
@xap Was richtig verrückt wäre, eine Runde Need for Speed auf dem 3DO Online...
Hatte das nicht Splitscreen?

Irgendwie Controller Port abgreifen, irgendwie rüberschicken auf meinem Server (was dann öffentlich sein müsste ui ui ui xD) und dann irgendwie zusammen online Spielen können...
 
  • Gefällt mir
Reaktionen: xap
Zurück
Oben