Close
0%
0%

ArduinoX86

A project to interface Intel CPUs with the Arduino Giga

Similar projects worth following
This project aims to provide interfaces for connecting early Intel CPUs to Arduinos. The Arduino code implements a "CPU Server" which you can communicate with via a host computer connected via USB. In this way you can upload code you've assembled on your PC and then download and examine the resulting cycle traces. A GUI is under development.

The ArduinoX86 project is comprised of a few components:

  • Software that runs on the Arduino Giga and provides a CPU server over USB
  • Client software that runs on your PC and communicates with the server to operate the CPU
  • Hardware shields that plug into the Arduino and provide sockets / pads for hosting CPUs

ArduinoX86 supports the following CPUs:

  • 80C88
  • 80C86
  • NEC V20
  • NEC V30
  • 80L186
  • 80C286
  • 386EX

The Server software supports resetting and setting up the CPU, emulating memory (backed by the Arduino Giga's 8MB of SDRAM), loading an initial register state, uploading code, executing code, logging cycle states and bus operations, and retrieving the logged states and final register state.

Register set-up is accomplished programmatically on the 808X and 80186, via LOADALL on the 286 and via SMM on the 386EX.

Register read-out is accomplished programmatically on the 808X and 80186, via STOREALL on the 286, and via SMM on the 386EX.

  • 1 × Arduino Giga
  • 1 × Intel 386EX

  • V4 Boards Arrive, VCF Midwest Video

    Daniel Balsom10/05/2025 at 13:50 0 comments

    I'd like to thank PCBWay for reaching out with an offer to sponsor my V4 boards.

    It never gets old getting a delivery of fresh PCBs. :)

    In other news, my talk at the Vintage Computer Festival Midwest this year was posted to YouTube:

    Check it out if you'd like to see this project in action!

  • 386EX/387SX V4 Board Design, FPU progress, VCF Midwest

    Daniel Balsom08/31/2025 at 15:24 0 comments

    V4 Board Design

    I've taken some lessons learned from the V2 board design, most relevant being that the extension of the clock line over to the 387SX socket has been problematic due to its length and lack of series termination.

    The size of the PCB also makes it more expensive.

    So I decided to split the board into two modules, one for the CPU and one for the FPU.

    I made a 'V3' design that connected these two boards via a 40-pin ribbon cable, but @f4grx@chaos.social on Mastodon gave me a great suggestion to make them simply stack on top of each other.  I'm not sure why I didn't think of that. So V3 went in the bin, and now we have V4.

    Stacking the modules neatly solves the issue of the clock line - it's not extended at all if you don't have the FPU module plugged in, and it's much shorter even when you do.

    I also had some fun by rotating the 387SX socket 45 degrees.  This actually does make the routing a bit cleaner. 
    Power is brought up on the JTAG header, which if you plan to stack these modules should be a female 2x4 header on the CPU board. 

    Some other additions include spots for series termination resistors on the clock lines, test pads, some extra filtering caps on the external power connector, and an i2c EEPROM I plan to add to all my boards for automatic shield detection.

    FPU Progress

    The V2 board is not a total loss, however, as I did get the 387SX to function with some tinkering to reducing ringing on the clock line.  

    Here is a simple program to calculate 1+2 using the FPU, you can see the correct result 3 in the final ECX register. 

    Ultimately, I'd like to provide a window where you can define the initial FPU state just as you can define the initial register state for the FPU.   We'll use the FSAVE and FRSTOR instructions to bookend program execution when an FPU is detected. 

    VCF Midwest 2025

    I'll be giving a talk at the upcoming Vintage Computer Festival Midwest on the topic "Controlling Intel CPUs with Microcontrollers".   The talk is on Saturday the 13th, at 11 AM.   I'll be providing a high level overview of how to control a CPU, as well as showing off some of the fun things you can do with the ArduinoX86 GUI.  Hope to see you there!

  • 386EX V2 Boards are Here

    Daniel Balsom08/19/2025 at 20:14 0 comments

    New 386EX boards have arrived from OSH Park.

    These add the SMI and SMIACT pin connections needed to capture the internal register state for test generation that I had to bodge in on the previous board. While I was at it, I ran headers for the 386EX's JTAG port, asynchronous serial port 0, and external interrupt lines 0-7. 

    And of course, I've added some bus-status blinkenlights.  Gotta have blinkenlights.

    The biggest addition is a PLCC68 footprint for adding a 387SX FPU. The 387SX was never advertised as a static core, but it is a CHMOS design - will it function at 150KHz?  I guess we'll find out!

    I'm using some small 386EX Single Board Computers as CPU donors.

    These are i386-Engine-M boards from Tern, Inc.  They lived their previous lives as serial interface boards in gambling machines.  386EX's aren't exactly growing on trees these days, so when I had the opportunity to acquire the lot I jumped on it.

    Getting the CPUs off is a simple matter of applying hot air for about five minutes until the PCB is hot enough to melt the solder itself.  Patience is key. 

    Meanwhile, progress on the GUI for ArduinoX86 continues. 

    We can assemble x86 programs in NASM-syntax, set up a desired initial register state, then execute the code on the 386EX and receive traces showing each cycle of execution and all bus activity. 

    It would be really cool to be able to add floating-point instructions to our repertoire.

View all 3 project logs

Enjoy this project?

Share

Discussions

Does this project spark your interest?

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