The Pico-286 project is an endeavor to emulate a classic PC system, reminiscent of late 80s and early 90s computers, on the Raspberry Pi Pico (RP2040/RP2350 microcontroller). It aims to provide a lightweight and educational platform for experiencing retro computing and understanding low-level system emulation. 🖥️✨
- 🧠 8086/8088/80186/286 CPU Emulation: At its core, the project emulates an Intel cpu up to 286 family.
- 🌐 Cross-platform: Can be built for Raspberry Pi Pico, Windows, and Linux.
- 🔌 Retro Peripheral Emulation: Includes support for common peripherals from the era.
- 🎨 Text and Graphics Modes: Supports various display modes common in early PCs.
- 🔊 Sound Emulation: Recreates sound capabilities of classic sound cards.
- 🍓 Designed for Raspberry Pi Pico: Optimized for the RP2040/RP2350 with minimal external components.
- Intel 8086/8088/80186/286 processor family
- 📢 PC Speaker (System Beeper): Authentic emulation of the original PC's internal speaker system
- 🎚️ Covox Speech Thing: Compatible emulation of the simple parallel port DAC
- 🎭 Disney Sound Source (DSS): Emulation of the popular parallel port digital audio device
- 🎹 Adlib / Sound Blaster (OPL2 FM Synthesis): High-quality emulation of the Yamaha OPL2 chipset for classic FM music and sound effects.
- 🔊 Sound Blaster (Digital Audio): Support for Sound Blaster's digital sound capabilities, including DMA-based playback.
- 🎼 MPU-401 (MIDI Interface with General MIDI Synthesizer): Provides a MIDI interface and includes an integrated General MIDI (GM) software synthesizer, allowing playback of GM scores without external MIDI hardware. This is a key feature for many later DOS games.
- 📢 Tandy 3-voice / PCjr (SN76489 PSG): Emulation of the Texas Instruments SN76489 Programmable Sound Generator.
- 🎮 Creative Music System / Game Blaster (CMS/GameBlaster): Emulation of the dual Philips SAA1099 based sound card.
All graphics card emulations support standard text display modes for character-based applications:
- 16 foreground colors with 8 background colors
- Full color attribute support including blinking text
📝 Standard Text Modes:
- 80×25 Text Mode: Standard 80 columns by 25 rows character display
- 40×25 Text Mode: Lower resolution 40 columns by 25 rows display
🚀 Advanced CGA Text Modes (8088 MPH Demo Techniques):
- 🎨 160×100×16 Text Mode: Ultra-low resolution high-color text mode
- Revolutionary technique showcased in the famous "8088 MPH" demo by Hornet
- 16 simultaneous colors from CGA palette in text mode
- Achieved through advanced CGA register manipulation and timing tricks
- Demonstrates the hidden capabilities of original CGA hardware
- 🌈 160×200×16 Text Mode: Enhanced color text mode
- Extended version of the 8088 MPH technique with double vertical resolution
- Full 16-color support in what appears to be a text mode
- Pushes CGA hardware beyond its original specifications
- Compatible with software that uses advanced CGA programming techniques
The CGA emulation provides authentic IBM Color Graphics Adapter functionality, supporting the classic early PC graphics modes:
🎮 Graphics Modes:
- 🌈 320×200×4 Colors: Standard CGA graphics mode with selectable color palettes
- ⚫⚪ 640×200×2 Colors: High-resolution monochrome mode (typically black and white)
- 📺 Composite Color Mode (160×200×16): Emulates the artifact colors produced by CGA when connected to composite monitors, creating additional color combinations through NTSC color bleeding effects
The Hercules Graphics Card emulation recreates the popular monochrome high-resolution graphics standard:
🖥️ Graphics Mode:
- ⚫⚪ 720×348×2 Colors: High-resolution monochrome graphics mode
The Tandy Graphics Adapter emulation recreates the enhanced graphics capabilities of Tandy 1000 series computers:
🚀 Enhanced Graphics Modes:
- 🎨 160×200×16 Colors: Low-resolution mode with full 16-color palette
- 🌈 320×200×16 Colors: Medium-resolution mode with 16 simultaneous colors from a larger palette
- ✨ 640×200×16 Colors: High-resolution mode with 16-color support
The VGA emulation provides comprehensive Video Graphics Array support with multiple advanced modes:
📊 Standard VGA Modes:
- 🎮 320×200×256 Colors: Mode 13h - the famous "Mode X" used by many DOS games
- 🖥️ 640×480×16 Colors: Standard VGA high-resolution mode
- 📺 720×480×16 Colors: Extended VGA mode
- 📝 Text modes: 80×25 and 80×50 with enhanced character sets
The emulator supports up to two floppy disk drives (A: and B:) and up to two hard disk drives (C: and D:). Disk images are stored on the SD card.
The emulator expects the following file paths and names for the disk images:
- Floppy Drive 0 (A:):
\\XT\\fdd0.img
- Floppy Drive 1 (B:):
\\XT\\fdd1.img
- Hard Drive 0 (C:):
\\XT\\hdd.img
- Hard Drive 1 (D:):
\\XT\\hdd2.img
Important Notes:
- The disk type (floppy or hard disk) is determined by the drive number it is assigned to in the emulator, not by the filename itself.
- The emulator automatically determines the disk geometry (cylinders, heads, sectors) based on the size of the image file. Ensure your disk images have standard sizes for floppy disks (e.g., 360KB, 720KB, 1.2MB, 1.44MB) for proper detection. For hard disks, the geometry is calculated based on a standard CHS (Cylinder/Head/Sector) layout.
The Pico-286 emulator is designed to run on Raspberry Pi Pico (RP2040) based hardware. 🍓
- ⌨️ PS/2 keyboard and mouse
- 💾 SD card for storage
- 📺 VGA and HDMI for video output
- 🔊 Audio output
- 🎮 NES gamepad
- 🍓 Raspberry Pi Pico (RP2040)
- 🧠 External PSRAM chip (minimum 8MB recommended for broader compatibility) connected via SPI.
- 🍓 Raspberry Pi Pico 2 (RP2350)
- ⚡ QSPI PSRAM for faster memory access.
- This project primarily uses the MURMULATOR dev board as its hardware base. This board provides an RP2040, PSRAM, and various peripherals suitable for the emulator's development and testing. 🎯
- Pico SDK: Install and configure the Raspberry Pi Pico SDK
- CMake: Version 3.22 or higher
- ARM GCC Toolchain: For cross-compilation to ARM Cortex-M0+/M33
- Git: For cloning the repository and submodules
- CMake: Version 3.22 or higher
- MSVC/GCC: C++20 compatible compiler
- Git: For cloning the repository
- CMake: Version 3.22 or higher
- GCC/Clang: C++20 compatible compiler (GCC 11+ or Clang 13+)
- Git: For cloning the repository
- X11 development libraries: Required for graphics output
- Threading support: pthread library (usually included with GCC)
The project uses CMake with platform-specific configurations. All builds require exactly one display option and one audio option.
ENABLE_TFT=ON
- TFT display output via ST7789ENABLE_VGA=ON
- VGA outputENABLE_HDMI=ON
- HDMI output (locks CPU frequency to 378MHz)
ENABLE_I2S_SOUND=ON
- I2S digital audio outputENABLE_PWM_SOUND=ON
- PWM audio outputENABLE_HARDWARE_SOUND=ON
- Hardware DAC audio output
- PSRAM (Default for RP2350):
ONBOARD_PSRAM=ON
- Use onboard PSRAM (RP2350 only)ONBOARD_PSRAM_GPIO=19
- GPIO pin for onboard PSRAM
- Virtual Memory:
TOTAL_VIRTUAL_MEMORY_KBS=512
- Enable virtual memory instead of PSRAM
- CPU Frequency:
CPU_FREQ_MHZ=378
- Set CPU frequency (default varies by platform)
# Clone the repository
git clone <repository-url>
cd pc
# Create build directory
mkdir build && cd build
# Configure for RP2350 with VGA and PWM audio
cmake -DCMAKE_BUILD_TYPE=Release \
-DPICO_PLATFORM=rp2350 \
-DENABLE_VGA=ON \
-DENABLE_PWM_SOUND=ON \
..
# Build
make -j$(nproc)
# Configure for RP2040 with TFT and I2S audio
cmake -DCMAKE_BUILD_TYPE=Release \
-DPICO_PLATFORM=rp2040 \
-DENABLE_TFT=ON \
-DENABLE_I2S_SOUND=ON \
..
# Build
make -j$(nproc)
# Install dependencies (Ubuntu/Debian)
sudo apt update
sudo apt install build-essential cmake git libx11-dev
# Clone and build
git clone <repository-url>
cd pc
mkdir build && cd build
# Configure for Linux host platform
cmake -DCMAKE_BUILD_TYPE=Release \
-DPICO_PLATFORM=host \
..
# Build
make -j$(nproc)
# Configure for host platform (development/testing)
cmake -DCMAKE_BUILD_TYPE=Release \
-DPICO_PLATFORM=host \
..
# Build
make -j$(nproc)
# On Windows with Visual Studio: cmake --build . --config Release
cmake -DCMAKE_BUILD_TYPE=Release \
-DPICO_PLATFORM=rp2040 \
-DTOTAL_VIRTUAL_MEMORY_KBS=512 \
-DENABLE_VGA=ON \
-DENABLE_PWM_SOUND=ON \
..
cmake -DCMAKE_BUILD_TYPE=Release \
-DPICO_PLATFORM=rp2350 \
-DENABLE_HDMI=ON \
-DENABLE_I2S_SOUND=ON \
-DONBOARD_PSRAM=ON \
-DONBOARD_PSRAM_GPIO=19 \
..
After successful compilation, you'll find:
286-<platform>-<frequency>-<display>-<audio>.uf2
- Firmware file for flashing286-<platform>-<frequency>-<display>-<audio>.elf
- ELF binary for debugging286-<platform>-<frequency>-<display>-<audio>.bin
- Raw binary
286
(Linux) or286.exe
(Windows) - Executable for testing
- Hold the BOOTSEL button while connecting your Pico to USB
- Copy the
.uf2
file to the mounted RPI-RP2 drive - The Pico will automatically reboot and start running the emulator
Create the required directory structure on your SD card:
SD Card Root/
└── XT/
├── fdd0.img # Floppy Drive A:
├── fdd1.img # Floppy Drive B: (optional)
├── hdd.img # Hard Drive C:
└── hdd2.img # Hard Drive D: (optional)
Place disk images in the project root directory:
# From your project directory (pc/)
# Place disk images directly in the root:
cp your-boot-disk.img fdd0.img # Floppy Drive A:
cp your-floppy2.img fdd1.img # Floppy Drive B: (optional)
cp your-harddisk.img hdd.img # Hard Drive C:
cp your-harddisk2.img hdd2.img # Hard Drive D: (optional)
# Run from build directory
cd build
../bin/host/Release/286 # Linux
# or ../bin/host/Release/286.exe # Windows
Supported disk image sizes:
- Floppy disks: 360KB, 720KB, 1.2MB, 1.44MB
- Hard disks: Any size (geometry calculated automatically)
Build fails with "display/audio option required":
- Ensure exactly one
ENABLE_*
option is set for both display and audio
Linux build fails with "X11 not found":
- Install X11 development headers:
sudo apt install libx11-dev
- On other distributions:
sudo dnf install libX11-devel
(Fedora) orsudo pacman -S libx11
(Arch)
Host build shows "DISK: ERROR: cannot open disk file":
- Ensure disk images are in the project root directory (not build directory)
- Check file permissions:
chmod 644 *.img
- Verify disk images exist:
ls -la *.img
Linux emulator window appears but shows black screen:
- Ensure you have a bootable disk image in
fdd0.img
- Check disk image format is valid DOS/PC format
- Try running from terminal to see debug messages
Out of memory errors on RP2040:
- Try enabling virtual memory:
-DTOTAL_VIRTUAL_MEMORY_KBS=512
- Use smaller disk images
- Disable unused emulation features
HDMI not working:
- Ensure CPU frequency is set to 378MHz (automatic with
ENABLE_HDMI=ON
) - Check HDMI cable and display compatibility
- Hardware setup: See
boards/
directory for reference designs - Pin configurations: Defined in
CMakeLists.txt
compile definitions - Development board: MURMULATOR recommended for development
Contributions to the Pico-286 project are welcome! Please refer to the CONTRIBUTING.md
file (to be created) for guidelines. 💪
The Pico-286 project is typically released under an open-source license (e.g., MIT, GPL). The specific license details will be found in a LICENSE
file in the repository. (To be confirmed by checking repository) ⚖️