Machines › Computers › Espressif › ESP8266
ESP8266
2014
Espressif's ESP8266 (2014) is the low-cost WiFi microcontroller that launched the hobbyist WiFi boom, built on a single 32-bit Tensilica Xtensa LX106 at up to 80MHz (boostable to 160). A typical module exposes an on-board LED on GPIO2 and a UART0 serial console. Here it boots real bare-metal firmware on a from-scratch Xtensa LX106 interpreter, sharing the Xtensa core with the ESP32, with the WiFi radio stubbed out. On-board only, and the bare module has no audio, so it is silent.
ESP8266 Online Emulator
Play ESP8266 using JavaScript directly in your browser.
Controls
Boots real firmware on a from-scratch Tensilica Xtensa LX106 interpreter. The ESP8266 is a single-core LX106 — a cut-down Xtensa that is CALL0-only (no register windows), so code uses the plain CALL0 ABI (a0-a15, call0/callx0/ret). The core implements the 24-bit and 16-bit (density) encodings, the ALU / SAR shift / load-store / branch set, L32R literal loads, the 16-bit and 32-bit multiplies (MUL16/MULL), the normalize (NSA/NSAU) and unaligned-access (SSA8L) ops, and the special registers (SAR, PS, EPC1/EXCCAUSE) via RSR/WSR/XSR. It is wired to an ESP8266 SoC model at the real hardware addresses: the internal SRAM (IRAM 0x40100000 / DRAM 0x3FFE8000), the cache-mapped SPI flash (0x40200000), the eFuse block, the FRC2 timer + WDEV microsecond timer, the GPIO block (on-board LED on GPIO2, 0x60000300), and UART0 (the serial console, 0x60000000). The default is stock, unmodified MicroPython v1.23.0 (MIT): the emulator HLE-s the ESP8266 mask ROM (from the public eagle.rom.addr.v6.ld addresses) and boots the real NONOS SDK all the way through RF/clock bring-up and the task loop to a live Python >>> REPL over UART0 — it auto-runs print(2+2) -> 4 and 6*7 -> 42 the moment it comes up, and you can type more: floats, math, time and sleeps, machine.Pin on the LED (high lights it here), machine.Timer, files that survive machine.reset() and Reboot until the page reloads, arrow-up history, Ctrl-C and Ctrl-D. Also in the picker: an original CC0 bare-metal mini-REPL, Blink (toggles GPIO2), and Hello UART (streams a counter). Open the debugger to single-step the Xtensa core, read/write the a0-a15 registers + PC + SAR/PS/EPC1/EXCCAUSE, disassemble IRAM and flash with the shared from-scratch Xtensa decoder, set breakpoints and write-watchpoints over the real ESP8266 memory map. WiFi has no radio here: its register windows are HLE stubs so firmware that probes them keeps running, but no packets move and a scan fails. On-board only, and the bare module has no on-board audio, so this emulator is silent. Honest limits: no WiFi traffic, machine.PWM drives no output, the ADC always reads 1024, machine.deepsleep() never comes back (use Reboot), the hardware watchdog never fires, and timing is instruction-approximate with time held to the wall clock, not cycle-exact.
Boots real firmware on a from-scratch Tensilica Xtensa LX106 interpreter. The ESP8266 is a single-core LX106 — a cut-down Xtensa that is CALL0-only (no register windows), so code uses the plain CALL0 ABI (a0-a15, call0/callx0/ret). The core implements the 24-bit and 16-bit (density) encodings, the ALU / SAR shift / load-store / branch set, L32R literal loads, the 16-bit and 32-bit multiplies (MUL16/MULL), the normalize (NSA/NSAU) and unaligned-access (SSA8L) ops, and the special registers (SAR, PS, EPC1/EXCCAUSE) via RSR/WSR/XSR. It is wired to an ESP8266 SoC model at the real hardware addresses: the internal SRAM (IRAM 0x40100000 / DRAM 0x3FFE8000), the cache-mapped SPI flash (0x40200000), the eFuse block, the FRC2 timer + WDEV microsecond timer, the GPIO block (on-board LED on GPIO2, 0x60000300), and UART0 (the serial console, 0x60000000). The default is stock, unmodified MicroPython v1.23.0 (MIT): the emulator HLE-s the ESP8266 mask ROM (from the public eagle.rom.addr.v6.ld addresses) and boots the real NONOS SDK all the way through RF/clock bring-up and the task loop to a live Python >>> REPL over UART0 — it auto-runs print(2+2) -> 4 and 6*7 -> 42 the moment it comes up, and you can type more: floats, math, time and sleeps, machine.Pin on the LED (high lights it here), machine.Timer, files that survive machine.reset() and Reboot until the page reloads, arrow-up history, Ctrl-C and Ctrl-D. Also in the picker: an original CC0 bare-metal mini-REPL, Blink (toggles GPIO2), and Hello UART (streams a counter). Open the debugger to single-step the Xtensa core, read/write the a0-a15 registers + PC + SAR/PS/EPC1/EXCCAUSE, disassemble IRAM and flash with the shared from-scratch Xtensa decoder, set breakpoints and write-watchpoints over the real ESP8266 memory map. WiFi has no radio here: its register windows are HLE stubs so firmware that probes them keeps running, but no packets move and a scan fails. On-board only, and the bare module has no on-board audio, so this emulator is silent. Honest limits: no WiFi traffic, machine.PWM drives no output, the ADC always reads 1024, machine.deepsleep() never comes back (use Reboot), the hardware watchdog never fires, and timing is instruction-approximate with time held to the wall clock, not cycle-exact.
Boots real firmware on a from-scratch Tensilica Xtensa LX106 interpreter. The ESP8266 is a single-core LX106 — a cut-down Xtensa that is CALL0-only (no register windows), so code uses the plain CALL0 ABI (a0-a15, call0/callx0/ret). The core implements the 24-bit and 16-bit (density) encodings, the ALU / SAR shift / load-store / branch set, L32R literal loads, the 16-bit and 32-bit multiplies (MUL16/MULL), the normalize (NSA/NSAU) and unaligned-access (SSA8L) ops, and the special registers (SAR, PS, EPC1/EXCCAUSE) via RSR/WSR/XSR. It is wired to an ESP8266 SoC model at the real hardware addresses: the internal SRAM (IRAM 0x40100000 / DRAM 0x3FFE8000), the cache-mapped SPI flash (0x40200000), the eFuse block, the FRC2 timer + WDEV microsecond timer, the GPIO block (on-board LED on GPIO2, 0x60000300), and UART0 (the serial console, 0x60000000). The default is stock, unmodified MicroPython v1.23.0 (MIT): the emulator HLE-s the ESP8266 mask ROM (from the public eagle.rom.addr.v6.ld addresses) and boots the real NONOS SDK all the way through RF/clock bring-up and the task loop to a live Python >>> REPL over UART0 — it auto-runs print(2+2) -> 4 and 6*7 -> 42 the moment it comes up, and you can type more: floats, math, time and sleeps, machine.Pin on the LED (high lights it here), machine.Timer, files that survive machine.reset() and Reboot until the page reloads, arrow-up history, Ctrl-C and Ctrl-D. Also in the picker: an original CC0 bare-metal mini-REPL, Blink (toggles GPIO2), and Hello UART (streams a counter). Open the debugger to single-step the Xtensa core, read/write the a0-a15 registers + PC + SAR/PS/EPC1/EXCCAUSE, disassemble IRAM and flash with the shared from-scratch Xtensa decoder, set breakpoints and write-watchpoints over the real ESP8266 memory map. WiFi has no radio here: its register windows are HLE stubs so firmware that probes them keeps running, but no packets move and a scan fails. On-board only, and the bare module has no on-board audio, so this emulator is silent. Honest limits: no WiFi traffic, machine.PWM drives no output, the ADC always reads 1024, machine.deepsleep() never comes back (use Reboot), the hardware watchdog never fires, and timing is instruction-approximate with time held to the wall clock, not cycle-exact.
Boots real firmware on a from-scratch Tensilica Xtensa LX106 interpreter. The ESP8266 is a single-core LX106 — a cut-down Xtensa that is CALL0-only (no register windows), so code uses the plain CALL0 ABI (a0-a15, call0/callx0/ret). The core implements the 24-bit and 16-bit (density) encodings, the ALU / SAR shift / load-store / branch set, L32R literal loads, the 16-bit and 32-bit multiplies (MUL16/MULL), the normalize (NSA/NSAU) and unaligned-access (SSA8L) ops, and the special registers (SAR, PS, EPC1/EXCCAUSE) via RSR/WSR/XSR. It is wired to an ESP8266 SoC model at the real hardware addresses: the internal SRAM (IRAM 0x40100000 / DRAM 0x3FFE8000), the cache-mapped SPI flash (0x40200000), the eFuse block, the FRC2 timer + WDEV microsecond timer, the GPIO block (on-board LED on GPIO2, 0x60000300), and UART0 (the serial console, 0x60000000). The default is stock, unmodified MicroPython v1.23.0 (MIT): the emulator HLE-s the ESP8266 mask ROM (from the public eagle.rom.addr.v6.ld addresses) and boots the real NONOS SDK all the way through RF/clock bring-up and the task loop to a live Python >>> REPL over UART0 — it auto-runs print(2+2) -> 4 and 6*7 -> 42 the moment it comes up, and you can type more: floats, math, time and sleeps, machine.Pin on the LED (high lights it here), machine.Timer, files that survive machine.reset() and Reboot until the page reloads, arrow-up history, Ctrl-C and Ctrl-D. Also in the picker: an original CC0 bare-metal mini-REPL, Blink (toggles GPIO2), and Hello UART (streams a counter). Open the debugger to single-step the Xtensa core, read/write the a0-a15 registers + PC + SAR/PS/EPC1/EXCCAUSE, disassemble IRAM and flash with the shared from-scratch Xtensa decoder, set breakpoints and write-watchpoints over the real ESP8266 memory map. WiFi has no radio here: its register windows are HLE stubs so firmware that probes them keeps running, but no packets move and a scan fails. On-board only, and the bare module has no on-board audio, so this emulator is silent. Honest limits: no WiFi traffic, machine.PWM drives no output, the ADC always reads 1024, machine.deepsleep() never comes back (use Reboot), the hardware watchdog never fires, and timing is instruction-approximate with time held to the wall clock, not cycle-exact.
Configurations
| Configuration | Emulator | Machine | OS | Legal | |
|---|---|---|---|---|---|
| MicroPython v1.23.0 | ESP8266 | ESP8266 | open | Open ⛶ | |
| Mini-REPL (UART0) | ESP8266 | ESP8266 | open | Open ⛶ | |
| Blink (on-board LED) | ESP8266 | ESP8266 | open | Open ⛶ | |
| Hello UART (serial) | ESP8266 | ESP8266 | open | Open ⛶ |
Downloads — ROMs & software
| Title | Type | Size (bytes) | Legal | |
|---|---|---|---|---|
| Blink (on-board LED) | demo | 0 | open | Download ↓ |
| Hello UART (serial) | demo | 0 | open | Download ↓ |
| MicroPython v1.23.0 | firmware | 0 | open | Download ↓ |
| Mini-REPL (UART0) | demo | 0 | open | Download ↓ |
Downloads — ROMs & software
| Title | Type | Size (bytes) | Legal | |
|---|---|---|---|---|
| Blink (on-board LED) | demo | 0 | open | Download ↓ |
| Hello UART (serial) | demo | 0 | open | Download ↓ |
| MicroPython v1.23.0 | firmware | 0 | open | Download ↓ |
| Mini-REPL (UART0) | demo | 0 | open | Download ↓ |
Downloads — ROMs & software
| Title | Type | Size (bytes) | Legal | |
|---|---|---|---|---|
| Blink (on-board LED) | demo | 0 | open | Download ↓ |
| Hello UART (serial) | demo | 0 | open | Download ↓ |
| MicroPython v1.23.0 | firmware | 0 | open | Download ↓ |
| Mini-REPL (UART0) | demo | 0 | open | Download ↓ |
Downloads — ROMs & software
| Title | Type | Size (bytes) | Legal | |
|---|---|---|---|---|
| Blink (on-board LED) | demo | 0 | open | Download ↓ |
| Hello UART (serial) | demo | 0 | open | Download ↓ |
| MicroPython v1.23.0 | firmware | 0 | open | Download ↓ |
| Mini-REPL (UART0) | demo | 0 | open | Download ↓ |
Chips
Emulators
| Emulator | Type | License | Site |
|---|---|---|---|
| ESP8266 | online | CC0 firmware · from-scratch core | Website ↗ |