Emulating 8051 with AVR
As stated before, 8051 is here to say. Very much like the 8086 is still alive with the newest x86-64 architecture. Since the Arduino Uno is the de-facto form factor for many things, let’s try to emulate 8051 on AVR.
Planning & Choices
Some choices needs to happen, in order to be able to scope the project.
Chips
For simplicity, I’ll focus on emulating the AT89C2051 with an ATmega328P. Those 2 chips are very good examples of each architecture, as they are now ubiquitous, thanks to 4 digit clocks kits for the AT89C2051 and the Arduino UNO for the ATmega328P.
Pin Mapping
We need to assign pins. I’m trying to keep the functionality the same, even if it means to move bits around when programming.
A major difference is to assign a specific PIN to RST for the 8051, so we can reset the emulated 8051 without resetting the AVR.
8051 | AVR | 51 Function |
---|---|---|
RST | PB2 | RST51 |
XTAL1 | PB6 | OSC1 |
XTAL2 | PB7 | OSC2 |
P3.0 | PD0 | RX |
P3.1 | PD1 | TX |
P3.2 | PD2 | INT0 |
P3.3 | PD3 | INT1 |
P3.4 | PD4 | T0 |
P3.5 | PD5 | T1 |
P3.7 | PD3 | |
P1.0 | PD6 | AIN0 |
P1.1 | PD7 | AIN1 |
P1.2 | PB0 | |
P1.3 | PB1 | |
P1.4 | PC0 | |
P1.5 | PC1 | |
P1.6 | PC2 | |
P1.7 | PC3 |
Some emulator-related PINS are also used.
I’m thinking about reusing a GPIO (PC4/SLOW) to signal that the emulation is lagging from realtime. The idea being that emulator should be running at a precise clock divider from the main clock. Prescaling as much as needed to cope with the emulation tax, and also adding as much delay as needed on the fast instructions.
If there is an instruction that is expensive to emulate, I’m planning to “borrow” delay cycles from the following fast instructions in order to be accurate on average. And have the SLOW pin to signal that ‘borrowing’ state while active.
AVR | EMU | Comment |
---|---|---|
PB3 | SLOW/MOSI | |
PB4 | MISO | |
PB5 | SCK | |
PC4 | SDA | |
PC5 | SCL |
Emulation Software
The chosen software is emu8051 that we covered in a previous post. It is hackable enough to be useful, and not using any library outside standard C.
Some enhancements need to happen, as it needs to be optimized for running on the limited AVR platform.
I’ll also leverage every hardware accelerated feature, such as the AVR USART, in order to decrease the emulation tax.
Execution
Let’s see that in another post. 😉