Building a Virtual Computer for the Intel 80286
You don't need a vintage motherboard to get a 286 CPU running if you have a Raspberry Pi Pico. Nagy Krisztián used one to make a virtual PC.
Whether you are going to build your own computer or are just interested in learning more about how CPUs work, the first step is usually to free run the chip on a breadboard. This involves sitting down with the datasheet and wiring up the pins with the necessary signals such that the processor receives a steady stream of NOP opcodes. This causes it to continually increment its address counter, which doesn’t accomplish much of anything—but it does provide verification that the CPU is up and running.
This introductory step is easy enough for early processors such as the 6502 or Z80. However, by the mid-1980s chip complexity increased to the point that a free run was no longer a simple task. The number of signal pins significantly increased, and the chip packages were no longer breadboard-friendly. Furthermore, with clock speeds on the rise, hacked-together circuits were prone to electromagnetic interference that would make the chip go haywire.
Nagy Krisztián wanted to play around with an 80286 CPU to better understand how it works. But since this chip slots into a PLCC-68 socket with 68 pins, it is not easy to work with unless you are going to insert it into a motherboard that was designed for it.
Instead of tracking down a vintage AT motherboard, Krisztián decided to build a minimalist “virtual” computer around a standalone Intel 80286-compatible processor: the Harris 80C286-12. His goal was not to recreate an entire IBM PC clone, but to simulate just enough of the surrounding hardware — memory, control signals, and peripherals — to coax the CPU into booting and executing real assembly code.
The project began with a PLCC-68 socket mounted to an adapter PCB to break the fine-pitch pins out to jumper-friendly headers. Even then, the wiring challenge was substantial: 57 pins needed to be driven or monitored. The Raspberry Pi Pico used in this project doesn’t have that many GPIOs available, so Krisztián enlisted four MCP23S17 SPI I/O expanders to make it work.
Each expander handled a logical group of signals — address lines, data bus, miscellaneous control pins, and status flags. After wrestling with hardware addressing quirks in the expanders, he was finally able to reliably configure input and output directions and communicate with the CPU over SPI. Clock and reset were manually toggled in software, with millisecond delays instead of the 12 MHz the chip was rated for. Since it is a CMOS variant of the processor, it tolerated these slow, hand-stepped cycles without complaint.
Once reset was synchronized to at least 16 clock cycles, the 80286 entered its defined startup state and began fetching its first instruction from physical address 0xFFFFF0. By monitoring control lines such as COD/INTA, M/IO, S0, and S1, Krisztián decoded each bus cycle to determine whether the CPU was reading instructions, accessing data memory, writing results, or halting.
When the processor signaled a memory read, the Pico placed the appropriate byte or word onto the 16-bit data bus, respecting little-endian ordering and the BHE/A0 signals that distinguish upper and lower byte transfers. For writes, the system captured the data from the bus and stored it in a dictionary.
After proving the concept with NOP instructions, Krisztián assembled a short program that jumped from the reset vector to address 0x0500, loaded two 16-bit values from memory, added them, stored the result, and halted. At the end, the correct result appeared in virtual memory, proving that the processor was working as expected.
While the 80286 was never designed to work with a Raspberry Pi Pico, there is nothing unusual about this setup from where it sits. As long as valid electrical signals arrive on its pins, it executes instructions without question.
R&D, creativity, and building the next big thing you never knew you wanted are my specialties.