esp32emu / firmware /README.md
HelloSun's picture
ESP32 emulator update
5ed58f3 verified
|
Raw History Blame Contribute Delete
3.03 kB

FreeDOS on TTGO VGA32 (ESP32, FabGL 8086 emulator)

Sketch dosvga32/: FabGL 1.0.9 Machine (i8086, PIC, PIT, i8042, MC146818, CGA/Hercules adapter, embedded BIOS biosrom.h) from the PCEmulator example, copied locally and modified. No SD, WiFi or BT.

Build

export PATH=/tmp/opencode/w:$PATH ARDUINO_DIRECTORIES_DATA=/tmp/opencode/ard ARDUINO_DIRECTORIES_USER=/tmp/opencode/ardu
arduino-cli compile -b esp32:esp32:esp32:FlashMode=dio,FlashFreq=40 --build-path /tmp/b --jobs 4 dosvga32
# merge: see esptool merge_bin command in the task (0x1000 boot, 0x8000 parts, 0xe000 boot_app0, 0x10000 app, 0x200000 dosdisk.img)

dosvga32/partitions.csv is picked up automatically (PSRAM option must stay Disabled; the code calls esp_spiram_init itself). Extra QEMU test build: add --build-property build.extra_flags=-DDOSVGA_NO_VIDEO (skips VGA mode switching, which hangs in QEMU).

Flash layout (4 MB)

offset size content
0x1000 bootloader
0x8000 0x1000 partition table
0x9000 0x5000 nvs
0xe000 0x2000 otadata (boot_app0.bin)
0x10000 0x1F0000 app0 (ota_0, ~490 KB used)
0x200000 0x168000 dosdisk (data, subtype 0x40) = raw 1.44 MB FreeDOS 1.4 floppy 144m/x86BOOT.img

Pins (FabGL defaults = VGA32)

VGA R=22,21 G=19,18 B=5,4 HS=23 VS=15; PS/2 keyboard CLK=33 DATA=32; mouse CLK=26 DATA=27; audio 25. SD pins unused (MCP23S17 SPI probing removed).

Disk access

diskpart.cpp finds partition dosdisk (esp_partition_find_first) and exposes it as a FILE* via fopencookie for drive A: (fd0, geometry autodetected 80/2/18). Reads use esp_partition_read; writes go to a RAM overlay (copy-on-write 512 B sectors, 1 MB pool in the unused upper half of the emulated-RAM PSRAM block), lost at reset.

Notes

  • Needs PSRAM (1 MB emulated PC RAM at 0x3F800000, as in FabGL PCEmulator). VGA32 v1.4 (WROVER) has it.
  • Video: FabGL GraphicsAdapter -> VGADirectController (64 colours); text = 640x480@60 with 640x400 viewport (80x25, 8x16), Hercules = 720x350@70.
  • Serial 115200 logs: stages + heartbeat with emulated instruction count and CS:IP.
  • dist/: dosvga32.flash.bin (real HW), dosvga32.novideo-qemu.flash.bin (QEMU test), hello.flash.bin.
  • QEMU: qemu-system-xtensa -nographic -machine esp32 -m 4M -global driver=ssi_psram,property=is_octal,value=false -drive file=F,if=mtd,format=raw (PSRAM needs these flags).

Extra notes (emulator project)

  • dist/dosdisk.img is the FreeDOS 1.4 boot floppy with FDCONFIG.SYS (menu timeout 1 s) and FDAUTO.BAT (installer step replaced by a banner) patched so the demo reaches A:\> quickly; the untouched floppy is dist/dosdisk.orig.img.
  • vgademo/ (FabGL VGA16 + PS/2 keyboard echo) and echo/ (Serial echo + LED on GPIO2) are the two extra example sketches.
  • Build all sketches with arduino-cli compile -b esp32:esp32:esp32:FlashMode=dio,FlashFreq=40 (core esp32@2.0.17, FabGL@1.0.9), then merge with esptool.py merge_bin --fill-flash-size 4MB ... (see ../tools).