|
1 | 1 | # Joypad Tester — 3DO |
2 | 2 |
|
3 | | -3DO Opera (Panasonic FZ-1 / FZ-10, GoldStar GDO, Sanyo TRY, etc.) |
4 | | -build of the [Joypad Tester](../README.md). Reads the 3DO control |
5 | | -pad daisy-chain and renders the live button state on screen. |
| 3 | +3DO build of the [Joypad Tester](../README.md). Talks directly to the |
| 4 | +Portfolio event broker and renders the live state of every PBUS |
| 5 | +device on the daisy chain. |
6 | 6 |
|
7 | | -## What it tests |
| 7 | +## What it shows |
8 | 8 |
|
9 | | -The active 3DO control pad's full 32-bit `DoControlPad` bitfield, |
10 | | -shown as raw hex plus a per-button held-or-not grid: |
| 9 | +One row per detected pod. Layout: |
11 | 10 |
|
12 | 11 | ``` |
13 | 12 | Joypad Tester - 3DO |
14 | 13 | =================== |
15 | 14 |
|
16 | | -P1 raw: 0x00000000 |
17 | | -P2 raw: 0x00000000 |
18 | | -
|
19 | | -P1 buttons: |
20 | | -. . |
21 | | -. . |
22 | | -. . |
23 | | -. . |
24 | | -. . |
25 | | -. |
| 15 | +P TYPE ID |
| 16 | +1 PAD 80 U . . R . A B C . P . R |
| 17 | +2 MOUSE 49 X-032 Y+069 L . R |
| 18 | +3 STICK 01 . . L . F A . . . P . . |
| 19 | + H+000 V-018 D+002 |
| 20 | +4 GUN 4D C 28800 L1 T |
| 21 | +5 ARCADE C0 . S1 . S2 Sv |
| 22 | +6 KEYB 4B K:02 1C 23 -- -- |
| 23 | + > hello world_ |
26 | 24 | ``` |
27 | 25 |
|
28 | | -| Source | Detected as | |
29 | | -|--------|-------------| |
30 | | -| 3DO control pad (D-pad, A/B/C, Start, Stop, L/R shift) | `DoControlPad` slot 1 / slot 2 | |
31 | | -| 3DO mouse / lightgun / arcade panel | not yet wired (uses different SDK calls) | |
32 | | - |
33 | | -Buttons rendered: Up, Down, Left, Right, A, B, C, Start, Stop, L (Left |
34 | | -Shift), R (Right Shift). "Stop" is the X button on the original 3DO |
35 | | -pad — its symbol is the eject-style square. |
36 | | - |
37 | | -## trapexit/3do-devkit toolchain |
38 | | - |
39 | | -3DO homebrew is built with the Norcroft ARM C/C++ compilers (originally |
40 | | -1990s ARM Ltd / Acorn) bundled in |
41 | | -[trapexit/3do-devkit](https://github.com/trapexit/3do-devkit). The |
42 | | -devkit also ships 3DO Portfolio SDK headers + a small modern C++ |
43 | | -helper layer (`BasicDisplay`, `abort_err`, etc.) that we link |
44 | | -against unmodified. We pin to a specific devkit commit |
45 | | -(`e0845bc4` at v0.1.0) inside [`buildtools/Dockerfile`](buildtools/Dockerfile); |
46 | | -bumping it = rebuilding the image. |
| 26 | +| Class | PBUS ID(s) | Decoded fields | |
| 27 | +|------------|-------------|-----------------------------------------------| |
| 28 | +| `PAD` | 0x80 / 0xA0 | D-pad, A/B/C, X, P (Start), L/R Shift | |
| 29 | +| `MOUSE` | 0x49 | X / Y delta, L / M / R | |
| 30 | +| `STICK` | 0x01 | H / V / D analog, Fire/A/B/C/X/P/Shifts + hat | |
| 31 | +| `GUN` | 0x4D | timing counter, line pulse, trigger | |
| 32 | +| `ARCADE` | 0xC0 | P1/P2 Coin / Start, Service | |
| 33 | +| `KEYB` | 0x02 / 0x4B | 256-bit matrix + terminal-style typed text | |
| 34 | +| any other | `0xNN` | shown by raw class byte | |
47 | 35 |
|
48 | | -The compilers are 32-bit x86 binaries (Linux only) — and one |
49 | | -post-compile step (`3doiso`) is a Windows binary the devkit runs via |
50 | | -Wine. The Docker image bakes both: `libc6-i386` for the 32-bit |
51 | | -dynamic loader, `wine32` for the iso composer. On Apple Silicon or |
52 | | -any non-x86 host, the container runs under `--platform=linux/amd64`. |
| 36 | +After 30 s of no input → bouncing-logo screensaver. Any input wakes. |
53 | 37 |
|
54 | 38 | ## Build |
55 | 39 |
|
56 | | -The toolchain is Docker-only: |
| 40 | +Docker-only: |
57 | 41 |
|
58 | 42 | ``` |
59 | | -./build_docker.sh # build (first run also builds image) |
60 | | -./build_docker.sh clean # nuke build/ |
61 | | -./build_docker.sh rebuild-image # force toolchain image rebuild |
| 43 | +./build_docker.sh # build |
| 44 | +./build_docker.sh clean |
| 45 | +./build_docker.sh rebuild-image |
62 | 46 | ``` |
63 | 47 |
|
64 | | -`build/joypad-tester.iso` is the in-tree output. CI builds on every |
65 | | -push to `main` (see |
66 | | -[`.github/workflows/verify-build.yml`](../.github/workflows/verify-build.yml)). |
67 | | - |
68 | | -## Loading on hardware |
69 | | - |
70 | | -### 3DO emulator (Opera / Phoenix / RetroArch's Opera core) |
71 | | - |
72 | | -Drop `joypad_tester_v<ver>.iso` onto the emulator. Opera-based |
73 | | -cores require a 3DO BIOS dump in their `system/` directory |
74 | | -(`panafz1.bin` / `panafz10.bin` / `goldstar.bin` / `sanyotry.bin`). |
75 | | - |
76 | | -### Real 3DO hardware |
77 | | - |
78 | | -Burn the `.iso` to CD-R (700 MB blank, ISO mode — 3DO Opera |
79 | | -filesystem is iso9660-compatible enough that standard burning tools |
80 | | -handle it). Boot on a chipped console; unmodified retail consoles |
81 | | -won't boot homebrew CDs. |
82 | | - |
83 | | -ODE / SD-loader options like the |
84 | | -[Plextor / Polymega-replacement chips](https://3dodev.com/) are |
85 | | -the contemporary path; check 3dodev.com for current hardware notes. |
86 | | - |
87 | | -## Releases |
88 | | - |
89 | | -Tagged as `3do-v<semver>` from the repo root — see |
90 | | -[`3do/CHANGELOG.md`](CHANGELOG.md) for per-version notes. The release |
91 | | -workflow attaches `joypad_tester_v<semver>_3do.iso` to each GitHub |
92 | | -Release. |
93 | | - |
94 | | -## Origin / credits |
95 | | - |
96 | | -Built on Antonio SJ Musumeci's |
97 | | -[3do-devkit](https://github.com/trapexit/3do-devkit) (ISC) — see |
98 | | -[`LICENSE.md`](LICENSE.md). The Joypad Tester source |
99 | | -(`src/main.cpp`) is original; `BasicDisplay` + `abort_err` come |
100 | | -verbatim from the devkit and link in as part of the standard |
101 | | -homebrew build. |
102 | | - |
103 | | -3DO Portfolio SDK headers / libraries shipped within the devkit are |
104 | | -originally copyrighted by The 3DO Company and widely redistributed |
105 | | -in the 3DO homebrew scene. |
106 | | - |
107 | | -Charles Doty (RasterSoft) wrote the original |
108 | | -**3DO Controller Test Multi** (2016) — released "free of any licences, |
109 | | -credit would be appreciated but not required". Distributed in the |
110 | | -homebrew scene by Aer Fixus. Source is available on |
111 | | -[3dodev.com](https://3dodev.com/software/homebrew/console_tools). |
112 | | -Their 8-pad polling loop + Sprite/CEL rendering modules are the |
113 | | -reference shape for our v0.2 multi-controller + screensaver work |
114 | | -(see `.dev/docs/3do_roadmap.md`). v0.1.0 is a from-scratch bring-up |
115 | | -against the modern trapexit devkit's `BasicDisplay` helper. |
| 48 | +Compiles `main.cpp` against |
| 49 | +[trapexit/3do-devkit](https://github.com/trapexit/3do-devkit), then |
| 50 | +rebuilds the event broker daemon from |
| 51 | +[trapexit/portfolio_os](https://github.com/trapexit/portfolio_os) with |
| 52 | +every driverlet (pad, mouse, stick, lightgun, glasses, keyboard, plus |
| 53 | +a local `SillyPadDriver.c` for 0xC0) static-linked in. Output: |
| 54 | +`build/joypad-tester.iso`. |
| 55 | + |
| 56 | +## Loading |
| 57 | + |
| 58 | +- **CD-R** — burn the ISO, boot it. No modchip needed. |
| 59 | +- **ODE** — drop the ISO on the SD. |
| 60 | +- **Emulator** — RetroArch's Opera core / standalone Opera / Phoenix. |
| 61 | + Requires a 3DO BIOS in the emulator's `system/`. |
| 62 | + |
| 63 | +## Credits |
| 64 | + |
| 65 | +- Build infra: [trapexit/3do-devkit](https://github.com/trapexit/3do-devkit) (ISC). |
| 66 | +- Driverlets: [trapexit/portfolio_os](https://github.com/trapexit/portfolio_os), with the keyboard one finished by us (PR open). |
| 67 | +- `SillyPadDriver.c`: new, written from the PBUS spec + the |
| 68 | + [SNES23DO](https://github.com/SNES23DO/SNES23DO) firmware reference |
| 69 | + (Orbatak baked its 0xC0 driver into its game binary, no |
| 70 | + redistributable `CPORTC0.ROM` ever shipped). |
0 commit comments