Close
0%
0%

PicoCRT

Using a classic Macintosh 1-bit monochrome analog CRT as monitor for a modern computer,

Public Chat
Similar projects worth following
0 followers
I have a strong affinity for Classic Macintosh computers. When a Mac SE FDHD proved beyond repair, the analog board and CRT survived — and took on a life of their own.

Inspired by Spritemod’s work on interfacing a Macintosh CRT, I wanted to build a more generic video interface usable from Mac, PC and Linux alike. I settled on the Raspberry Pi Pico. The CRT requires three signals: H-sync, V-sync and data. The RP2040 handles all three simultaneously using its Programmable I/O state machines. A full frame is just 22 KB (512×342 pixels, 1 bit per pixel), well within the chip’s 264 KB SRAM — and it doubles as a USB device.

It works. On Linux it can be driven by a kernel module or from user space. A Python script pushes still images to the screen. A macOS proof-of-concept captures the screen, scales and dithers it to 1-bit monochrome, and streams it live to the display.

PicoCRT is a hardware/software project that drives the internal CRT of a Compact Macintosh (SE, Classic, Plus) using a Raspberry Pi Pico (RP2040), without the original Apple logic board.

The Compact Mac CRT requires three TTL-level signals: horizontal sync (HSYNC), vertical sync (VSYNC) and monochrome pixel data (DATA). The display runs at a fixed 512×342 resolution with a dot clock of 15.625 MHz, HSYNC at ~22.2 kHz and VSYNC at ~60 Hz. The pixel data is 1-bit monochrome with inverted polarity — high means black, low means white — and the electron beam must be blanked (data held high) outside the active video area, including during both horizontal and vertical retrace.

The RP2040’s Programmable I/O (PIO) subsystem makes this possible. Three PIO state machines run simultaneously and independently: one generates HSYNC with precise dot-clock timing, one generates VSYNC and counts scan lines, and one clocks out pixel data from a framebuffer in RAM. The state machines are synchronized via PIO interrupt flags rather than software, giving cycle-accurate timing without any CPU involvement. DMA transfers the framebuffer to the data state machine in a continuous loop, freeing the CPU entirely for application logic.

The framebuffer is 512×342 pixels at 1 bit per pixel  (21,888 bytes) - a small fraction of the RP2040’s 264 KB SRAM. Pixel data is packed MSB-first, with bit 31 representing the leftmost pixel in each word.

The RP2040’s GPIO outputs (3.3V) connect directly to the analog board without a level shifter. In practice the analog board’s TTL inputs trigger reliably at 3.3V, as confirmed by testing against both Mac SE - however I have not made it work on a otherwise identical Mac Classic display.

The Pico’s USB device capability enables a simple host-side protocol for pushing framebuffer content to the display. Current software includes a Python script for still images, a Linux kernel module, and a macOS proof-of-concept that captures the screen, scales it to 512×342 and dithers it to 1-bit monochrome using Floyd-Steinberg dithering before streaming it live to the CRT.

  • 1 × Raspberry Pi Pico (rp2040)
  • 1 × 4 wires
  • 1 × Analog board, CRT and power supply from a Mac SE or similar

  • 1
    Step 1

    The Mac SE and Mac Classic use different connectors on the analog board, the signals are the same, but this only works for SE 

    All you will need is a RP2040 and four wires and a ground connection. Connect directly from the Pico’s GPIO pins to the analog board’s signal pins.

    Flash the Pico with the firmware and connect the wires as follows

    • GPIO18 -> DATA
    • GPIO19 -> VSYNC
    • GPIO21 -> HSYNC
    • GND -> GND

    The analog board must be powered independently — either inside a Compact Mac chassis with its original power supply, or via an ATX power supply providing +5V, +12V and −12V. Do not attempt to power the analog board from the Pico ;)

    Warning:The CRT operates at up to 15,000 volts at the anode. Always discharge the CRT before working inside the chassis, and treat all high-voltage areas with appropriate caution. If you have no idea what I'm talking about, please don't go on 

    GitHub repo available soon

View all instructions

Enjoy this project?

Share

Discussions

Does this project spark your interest?

Become a member to follow this project and never miss any updates