MartyPC

MartyPC Logo MartyPC Logo

MartyPC is a cross-platform emulator of early PCs written in Rust. It supports Windows, Linux, and macOS, emulating several 8088-based systems, including the IBM PC, XT, PCJr, and Tandy 1000.

User Guide

For a comprehensive guide on using MartyPC, click here.

Downloading MartyPC

You can find builds through periodic releases. For the latest automatic builds, check the Actions tab under the Artifacts for each workflow run. (Note: You must be logged in to GitHub to download Artifacts).

Project Background

MartyPC began as a hobby project to explore the process of writing an emulator from scratch while learning Rust. Initially, the goals were modest, but the project evolved to offer advanced functionality and accuracy, making it a valuable tool for retro PC development. MartyPC is particularly useful for programmers working with the Intel 8088, offering precise cycle-by-cycle execution analysis.

Accuracy and Development

Started in April 2022, MartyPC's 8088 CPU emulation was enhanced to achieve cycle-accuracy by November 2022. This was validated against a real 8088 CPU connected to an Arduino MEGA microcontroller. More details can be found in the Arduino8088 project and this blog post.

In June 2024, the 8088 test suite was updated to support the prefetch queue, leading to further accuracy improvements. MartyPC now passes the 8088 V2 Test Suite with 99.9997% cycle-accuracy.

Extensive research has also been conducted to enhance peripheral emulation, including the 8253 timer chip, DMA timings, and building a bus sniffer. MartyPC can accurately run the PC demo 8088 MPH and Area 5150.

Online Demos

You can run MartyPC directly in your browser using WebAssembly builds:

Features

MartyPC offers extensive features for accurate emulation and debugging:

Emulated Devices

CPUs:

  • Intel 8088: Cycle-accurate implementation, tested against hardware.
  • NEC V20: Preliminary implementation, not fully cycle-accurate.

Video Cards:

  • CGA: Cycle-or-character clocked implementation, supports composite output and monitor simulation.
  • TGA: Work in progress, supports PCJr and Tandy Graphics.
  • MDA: Supports multi-monitor operation, Hercules Graphics Adapter emulation.
  • EGA: Supports redefinable fonts, vsync interrupts, and smooth scrolling.

Storage Devices:

  • µPD765 FDC: Supports DOS and Minix OS, limited to raw sector images.
  • IBM/Xebec 20MB HDC: Basic VHD support.
  • PCJr Cartridges: Supports JrRipCart (.JRC) format.

System Hardware:

  • 8255 PPI: Low-level keyboard emulation, turbo bit support.
  • 8259 PIC: Mostly complete, missing some advanced features.
  • 8253 PIT: Highly accurate, supports PCM audio.
  • 8237 DMAC: Mostly implemented, DMA transfers are "faked".
  • 8250 UART: Serial passthrough or mouse emulation.
  • Game Port: Supports analog joysticks.
  • PC Speaker: Produces reasonable PCM audio, occasionally glitchy.

Add-on Cards:

  • LoTech 2MB EMS Card: Provides 2MB of EMS memory.

Input Devices:

  • Keyboard: Emulates IBM Model F and Tandy 1000 keyboards.
  • Serial Mouse: Supports Microsoft serial mouse.
  • Joystick: Configurable keyboard controls for game port joysticks.

Configuration and Debugging

MartyPC supports custom machine configurations via profiles and overlays, similar to installing extension cards. The debugging GUI includes instruction disassembly, CPU state, memory viewer, and peripheral states. Breakpoints and instruction/cycle-based logging are supported.

Multi-window and Shader Support

MartyPC supports multi-window operation and includes a basic, configurable CRT shader with plans for more shader support.

Screenshots

For more images, visit the Screenshot Gallery.

Similar Projects