
StackLink
gusmanb/logicanalyzer
24 channel, 100Msps logic analyzer hardware and software

A handheld retro gaming device
Trashboy is an open-source printed circuit board by shaeberling, from the shaeberling/trashboy repository on GitHub. It is a 2-layer board of 75 × 67 mm with 29 parts on 58 nets, routed with 242 tracks and 8 vias.
Its parts include 3 capacitors, 3 resistors, 1 IC, 1 connector and 1 crystal.
A pocketable TRS-80 Model III/IV. Yes, really.
A handheld TRS-80 Model III / IV emulator running on an ESP32-S3 board with a 640×480 RGB LCD.
It runs at original-hardware clock speed — 2.028 MHz for Model III, 4.055 MHz for Model IV — synchronised to wall-clock time so games play at their original speed. The 8 × 12 (M3) and 8 × 10 (M4) glyphs are blitted into an LVGL canvas with 90° rotation, so the portrait panel reads as a landscape Model III screen.
| Part | Role |
|---|---|
| ESP32-S3 with 8 MB octal PSRAM | Runs the emulator, LVGL UI, BT, Wi-Fi, and a 16-bit RGB LCD bus simultaneously. |
| ST7701S 480×640 RGB LCD | Drawn as 640×480 landscape via software rotation in the LVGL flush callback. |
| GT911 capacitive touch | I²C; used for the boot-time input-test screen. |
| TCA9554PWR I/O expander @ 0x20 | On-board: LCD CS, backlight enable, buzzer reset, etc. |
| MCP23017 I/O expander @ 0x21 | Physical board buttons. Interrupt-driven via INTA → GPIO4. |
| Bluetooth HID keyboard | Any generic BT keyboard. Pairing persists in NVS. |
| Buzzer | LEDC PWM on GPIO 6 (shared with the LCD backlight channel). |
LV_DISPLAY_RENDER_MODE_PARTIAL with software rotation done inside the flush callback (the panel has no hardware rotation, and lv_display_set_rotation alone only swaps reported dimensions). An adaptive flush callback skips the rotation entirely when the emulator is running, since its TRSCanvas pre-rotates glyphs into an unrotated buffer.components/ptrs/, derived from apuder/pTRS-80.components/retrostore-c-sdk/, git submodule) for fetching downloadable game media. HTTP and decode buffers live in PSRAM to keep internal SRAM available for BT/Wi-Fi coexistence working memory.components/trs-io/, components/trs-lib/) for on-screen menus, the F5 settings UI, and TRS-80 system I/O glue.Want the full picture? See firmware/ARCHITECTURE.md — boot sequence, task layout, the rotation handoff between splash and emulator, memory placement rules, and lessons-learned annotations.
# Once per shell session:
source ~/.espressif/tools/activate_idf_v6.0.1.sh
cd firmware
idf.py set-target esp32s3 # only the first time
idf.py build
idf.py -p /dev/ttyACM0 flash monitorOn WSL2, the USB device routing is its own little adventure — see firmware/wsl.md.
.
├── assets/ Artwork (logo PNGs)
└── firmware/ ESP-IDF project — the action lives here
├── main/ app_main, LVGL UI, splash, Wi-Fi setup,
│ RetroStore browser, MCP23017 buttons, input test
├── components/ Z80 core, TRS-80 emulator, BT keyboard,
│ RetroStore SDK, TRS-IO, TRS-LIB
├── scripts/ Serial logger, asset rotation helpers
├── ARCHITECTURE.md
└── wsl.mdActive development on the lvgl9 branch. Recent direction: ESP-IDF v6 migration, MCP23017 board buttons over IRQs, GT911 touch driver, RetroStore game launching with PSRAM-backed buffers, an adaptive flush callback for the LVGL pipeline.
Not affiliated with Tandy or Radio Shack. The TRS-80 trademark belongs to whoever owns it now.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 14 | SW_Push_Dual | buttons:SW_Push_Silicone_8x5mm | BTN_L_DOWN1, BTN_L_UP1, BTN_META_DOWN1, BTN_META_UP1, BTN_R_DOWN1, BTN_R_UP1, CR_L_DOWN1, CR_L_LEFT1, CR_L_RIGHT1, CR_L_UP1, CR_R_DOWN1, CR_R_LEFT1, CR_R_RIGHT1, CR_R_UP1 |
| 3 | 10nF | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C1, C2, C3 |
| 3 | Conn_01x02 | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J_BTN_L_BACK1, J_BTN_R_BACK1, J1 |
| 2 | 1K | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R1, R2 |
| 2 | R_Network08_US | Resistor_THT:R_Array_SIP9 | RN1, RN2 |
| 1 | 10K | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R3 |
| 1 | Conn_01x07_Socket | Connector_PinHeader_2.54mm:PinHeader_1x07_P2.54mm_Vertical | J2 |
| 1 | HEADER-1X570MIL | PAM8302A:1X05_ROUND_70 | JP1 |
| 1 | MCP23017x-x-SP | Package_DIP:DIP-28_W7.62mm | U1 |
| 1 | TERMBLOCK_1X2 | PAM8302A:TERMBLOCK_1X2-3.5MM | X1 |
It measures 75 × 67 mm and has 2 copper layers, 1.6 mm thick.
29 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the shaeberling/trashboy repository on GitHub, at the commit this page was made from: the board is kicad/trashboy.kicad_pcb and its schematic kicad/trashboy.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask shaeberling before reusing the design.

gusmanb/logicanalyzer
24 channel, 100Msps logic analyzer hardware and software

VoronDesign/Voron-Hardware
Cool Hardware designed by the Voron Design group

hoglet67/RGBtoHDMI
Bare-metal Raspberry Pi project that provides pixel-perfect sampling of Retro Computer RGB/YUV video and conversion to HDMI

hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

OLIMEX/DIY-LAPTOP
Do It Yourself Open Source Hardware and Software Modular Hacker's Friendly Laptop

UtilitechAS/amsreader-firmware
ESP8266 and ESP32 compatible firmware to read, interpret and publish data to MQTT from smart electrical meters, both DLMS and DSMR is supported

