Play ESP32-C6 using JavaScript directly in your browser.
Controls
Boots real firmware on a from-scratch RISC-V RV32IMAC interpreter (RV32I + M mul/div + A atomics + C compressed, the machine-mode CSRs, traps and a functional interrupt controller) wired to an ESP32-C6 SoC model at the real hardware addresses: the 512 KB HP SRAM (unified I/D bus at 0x40800000), XIP flash + the flash-cache MMU + SPI-flash controller, the GPIO block (0x60091000, with the on-board WS2812 RGB LED on GPIO8), UART0 and the USB-Serial-JTAG console, the systimer and the interrupt matrix (PLIC). The default is stock, unmodified MicroPython v1.24.1 (MIT): the emulator HLE-s the ESP32-C6 mask ROM (from public linker-script addresses) and boots the real ESP-IDF + FreeRTOS all the way to a live Python >>> REPL — it auto-runs print(2+2) -> 4 and 6*7 -> 42 the moment it comes up, and you can type more (integer/float math, or drive the on-board GPIO8 RGB LED); stdin is delivered through the USB-Serial-JTAG console so typing stays reliable. Also in the picker: an RGB cycle that bit-bangs the DevKitC-1 WS2812 RGB LED as a real 800 kHz one-wire waveform (decoded from the GPIO edge timing), a Rainbow hue wheel, an original CC0 bare-metal mini-REPL, and Hello UART. Open the debugger to single-step the RISC-V core, read/write x0-x31 + pc + the machine CSRs, disassemble HP SRAM and flash with the shared RISC-V decoder, set breakpoints and write-watchpoints over the real ESP32-C6 memory map. WiFi 6, BLE and 802.15.4 have no radio here: their register windows are HLE stubs so firmware that probes them keeps running.
Boots real firmware on a from-scratch RISC-V RV32IMAC interpreter (RV32I + M mul/div + A atomics + C compressed, the machine-mode CSRs, traps and a functional interrupt controller) wired to an ESP32-C6 SoC model at the real hardware addresses: the 512 KB HP SRAM (unified I/D bus at 0x40800000), XIP flash + the flash-cache MMU + SPI-flash controller, the GPIO block (0x60091000, with the on-board WS2812 RGB LED on GPIO8), UART0 and the USB-Serial-JTAG console, the systimer and the interrupt matrix (PLIC). The default is stock, unmodified MicroPython v1.24.1 (MIT): the emulator HLE-s the ESP32-C6 mask ROM (from public linker-script addresses) and boots the real ESP-IDF + FreeRTOS all the way to a live Python >>> REPL — it auto-runs print(2+2) -> 4 and 6*7 -> 42 the moment it comes up, and you can type more (integer/float math, or drive the on-board GPIO8 RGB LED); stdin is delivered through the USB-Serial-JTAG console so typing stays reliable. Also in the picker: an RGB cycle that bit-bangs the DevKitC-1 WS2812 RGB LED as a real 800 kHz one-wire waveform (decoded from the GPIO edge timing), a Rainbow hue wheel, an original CC0 bare-metal mini-REPL, and Hello UART. Open the debugger to single-step the RISC-V core, read/write x0-x31 + pc + the machine CSRs, disassemble HP SRAM and flash with the shared RISC-V decoder, set breakpoints and write-watchpoints over the real ESP32-C6 memory map. WiFi 6, BLE and 802.15.4 have no radio here: their register windows are HLE stubs so firmware that probes them keeps running.
Boots real firmware on a from-scratch RISC-V RV32IMAC interpreter (RV32I + M mul/div + A atomics + C compressed, the machine-mode CSRs, traps and a functional interrupt controller) wired to an ESP32-C6 SoC model at the real hardware addresses: the 512 KB HP SRAM (unified I/D bus at 0x40800000), XIP flash + the flash-cache MMU + SPI-flash controller, the GPIO block (0x60091000, with the on-board WS2812 RGB LED on GPIO8), UART0 and the USB-Serial-JTAG console, the systimer and the interrupt matrix (PLIC). The default is stock, unmodified MicroPython v1.24.1 (MIT): the emulator HLE-s the ESP32-C6 mask ROM (from public linker-script addresses) and boots the real ESP-IDF + FreeRTOS all the way to a live Python >>> REPL — it auto-runs print(2+2) -> 4 and 6*7 -> 42 the moment it comes up, and you can type more (integer/float math, or drive the on-board GPIO8 RGB LED); stdin is delivered through the USB-Serial-JTAG console so typing stays reliable. Also in the picker: an RGB cycle that bit-bangs the DevKitC-1 WS2812 RGB LED as a real 800 kHz one-wire waveform (decoded from the GPIO edge timing), a Rainbow hue wheel, an original CC0 bare-metal mini-REPL, and Hello UART. Open the debugger to single-step the RISC-V core, read/write x0-x31 + pc + the machine CSRs, disassemble HP SRAM and flash with the shared RISC-V decoder, set breakpoints and write-watchpoints over the real ESP32-C6 memory map. WiFi 6, BLE and 802.15.4 have no radio here: their register windows are HLE stubs so firmware that probes them keeps running.
Boots real firmware on a from-scratch RISC-V RV32IMAC interpreter (RV32I + M mul/div + A atomics + C compressed, the machine-mode CSRs, traps and a functional interrupt controller) wired to an ESP32-C6 SoC model at the real hardware addresses: the 512 KB HP SRAM (unified I/D bus at 0x40800000), XIP flash + the flash-cache MMU + SPI-flash controller, the GPIO block (0x60091000, with the on-board WS2812 RGB LED on GPIO8), UART0 and the USB-Serial-JTAG console, the systimer and the interrupt matrix (PLIC). The default is stock, unmodified MicroPython v1.24.1 (MIT): the emulator HLE-s the ESP32-C6 mask ROM (from public linker-script addresses) and boots the real ESP-IDF + FreeRTOS all the way to a live Python >>> REPL — it auto-runs print(2+2) -> 4 and 6*7 -> 42 the moment it comes up, and you can type more (integer/float math, or drive the on-board GPIO8 RGB LED); stdin is delivered through the USB-Serial-JTAG console so typing stays reliable. Also in the picker: an RGB cycle that bit-bangs the DevKitC-1 WS2812 RGB LED as a real 800 kHz one-wire waveform (decoded from the GPIO edge timing), a Rainbow hue wheel, an original CC0 bare-metal mini-REPL, and Hello UART. Open the debugger to single-step the RISC-V core, read/write x0-x31 + pc + the machine CSRs, disassemble HP SRAM and flash with the shared RISC-V decoder, set breakpoints and write-watchpoints over the real ESP32-C6 memory map. WiFi 6, BLE and 802.15.4 have no radio here: their register windows are HLE stubs so firmware that probes them keeps running.
Boots real firmware on a from-scratch RISC-V RV32IMAC interpreter (RV32I + M mul/div + A atomics + C compressed, the machine-mode CSRs, traps and a functional interrupt controller) wired to an ESP32-C6 SoC model at the real hardware addresses: the 512 KB HP SRAM (unified I/D bus at 0x40800000), XIP flash + the flash-cache MMU + SPI-flash controller, the GPIO block (0x60091000, with the on-board WS2812 RGB LED on GPIO8), UART0 and the USB-Serial-JTAG console, the systimer and the interrupt matrix (PLIC). The default is stock, unmodified MicroPython v1.24.1 (MIT): the emulator HLE-s the ESP32-C6 mask ROM (from public linker-script addresses) and boots the real ESP-IDF + FreeRTOS all the way to a live Python >>> REPL — it auto-runs print(2+2) -> 4 and 6*7 -> 42 the moment it comes up, and you can type more (integer/float math, or drive the on-board GPIO8 RGB LED); stdin is delivered through the USB-Serial-JTAG console so typing stays reliable. Also in the picker: an RGB cycle that bit-bangs the DevKitC-1 WS2812 RGB LED as a real 800 kHz one-wire waveform (decoded from the GPIO edge timing), a Rainbow hue wheel, an original CC0 bare-metal mini-REPL, and Hello UART. Open the debugger to single-step the RISC-V core, read/write x0-x31 + pc + the machine CSRs, disassemble HP SRAM and flash with the shared RISC-V decoder, set breakpoints and write-watchpoints over the real ESP32-C6 memory map. WiFi 6, BLE and 802.15.4 have no radio here: their register windows are HLE stubs so firmware that probes them keeps running.