File size: 3,457 Bytes
799b3f0
d8afd6f
 
 
 
799b3f0
 
d8afd6f
 
799b3f0
 
d8afd6f
 
 
 
 
 
 
 
 
 
 
 
 
 
8d577f5
 
 
 
 
 
d8afd6f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a281c6e
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
---
title: ESP32 Emulator (VGA32 / FabGL / FreeDOS)
emoji: 🔌
colorFrom: blue
colorTo: green
sdk: static
pinned: false
license: gpl-3.0
short_description: "Browser ESP32 emulator - Arduino bins, VGA, PS/2, FreeDOS"
---

# ESP32 模擬器 (ESP32 emulator, runs entirely in the browser)

可載入 **Arduino-ESP32 / ESP-IDF 編譯出來的二進位檔**(完整 flash 映像,或單獨的 bootloader / partitions / app `.bin`),
用真實 **ESP32 ROM** 開機(ROM → 第二階段 bootloader → app),並模擬 **LilyGO TTGO VGA32** 的周邊電路:

| 週邊 | 模擬方式 |
|---|---|
| CPU | Xtensa LX6 雙核(視窗暫存器、loop、MAC16、FPU、32 位元乘除、S32C1I、XEA2 例外/中斷),WebAssembly 核心(C 編譯)+ JS 參考核心 |
| 開機 | 原廠 ESP32 ROM(Espressif QEMU 發行版附的 `esp32-v3-rom*.bin`),SPI flash / PSRAM 晶片模型、cache MMU、eFuse、SHA、RTC、TIMG、FRC… |
| **VGA** | I2S1 LCD 模式 + DMA 描述子鏈 → 依 VGA32 電阻網路(R=22,21 G=19,18 B=5,4 HS=23 VS=15)重建 hsync/vsync 與像素,顯示在 canvas |
| **PS/2 鍵盤/滑鼠** | GPIO 33/32、26/27 開集極匯流排 + FabGL 使用的 **ULP 協處理器**(含 RTC_IO),完整 PS/2 位元協定(可虛擬點擊/實體鍵盤) |
| UART0 | 序列埠終端機(可輸入) |
| GPIO | 40 腳狀態、板子示意圖 |

內建範例(皆為真實 Arduino-ESP32 2.0.17 編譯的二進位):

1. **FreeDOS 1.4**(預設)— FabGL 的 8086 PC 模擬器跑在被模擬的 ESP32 上開機,VGA 輸出、PS/2 鍵盤輸入。
2. **FabGL VGA 示範** — 16 色 640×480 VGA + 色塊動畫,PS/2 鍵盤輸入即時回顯(可用虛擬鍵盤)。
3. **序列埠回音 + LED** — `Serial`、`millis()`、`digitalWrite(2)`,GPIO 面板可看到腳位閃爍。
4. Hello(Serial)。

## 使用

1. 開啟頁面自動載入 FreeDOS 範例;畫面點一下即可用實體鍵盤,或用下方虛擬鍵盤(Shift/Ctrl/Alt 為鎖定鍵)。
2. 「載入二進位…」:選擇 `.bin`(可多個)。位址自動猜測 (bootloader 0x1000、partitions 0x8000、boot_app0 0xE000、app 0x10000、整份 flash 0x0),可手動修改;只給 app 會自動補上預設開機檔。
3. 「全速」不與實際時間同步;「下載 flash」可取回含寫入結果的 flash。

## 速度

虛擬 ESP32 為 2×240 MHz,瀏覽器以直譯方式執行,視裝置約為真機的 25–100%(狀態列顯示)。FreeDOS 約需 1–2 分鐘到提示字元,可按 Enter 略過開機選單。

## 目錄

- `index.html / app.js / js/*.js` — 模擬器(`soc.js` 週邊、`xtensa.js` JS 核心、`cpu_wasm.js`+`wasm/xtensa.c` WASM 核心、`i2s.js` VGA、`ps2.js` / `ulp.js` 鍵盤)
- `assets.js` — gzip+base64 內嵌的 ROM、WASM、範例韌體(Space 的二進位檔會被 CDN 重新導向而無 CORS,所以內嵌)
- `firmware/dosvga32/` — 範例韌體原始碼(FabGL PCEmulator 改寫,磁碟映像放在 flash 分區 `dosdisk`)
- `tools/` — 建置/除錯腳本(`build_assets.py`、`run.mjs`、`vga.mjs` …)

## 授權

模擬器程式 GPL-3.0-or-later(範例韌體包含 FabGL,GPL-3)。ESP32 ROM 映像取自 Espressif QEMU 發行版;FreeDOS 為 GPL。

## 開發 / 部署
見 `docs/DEVELOPING.md`。部署:`export HF_TOKEN=hf_...; scripts/deploy.sh`(Token 只用環境變數)。整個專案的壓縮原始碼包在 Space 的 `downloads/esp32emu-source.tar.gz`。