S3-MSX-PC โปรเจกต์โอเพนซอร์สของ Ivan Svarkovsky เป็นโปรแกรมจำลอง (Emulator) สำหรับเกมย้อนยุค MSX2+ แบบ Bare-Metal ที่ทำงานบนไมโครคอนโทรลเลอร์ ESP32-S3 และสามารถแสดงผล VGA แบบ 64 สี ผ่านวงจรตัวต้านทาน R-2R Ladder อย่างง่าย โดยพัฒนาต่อยอดจากอีมูเลเตอร์ Retro-Go ที่ใช้กับ ODROID-GO และอุปกรณ์ ESP32 รุ่นอื่น พร้อมเพิ่มการปรับแต่งประสิทธิภาพหลายจุด
ระบบได้รับการทดสอบบนบอร์ด ESP32-S3 ทั่วไป โดยใช้คอร์หนึ่งสำหรับประมวลผลเกม และอีกคอร์หนึ่งสำหรับจัดการภาพและเสียง การแสดงผล VGA ใช้วงจรตัวต้านทานที่แปลงสัญญาณดิจิทัลเป็นสัญญาณแอนะล็อกเพื่อให้สามารถใช้งานกับจอ VGA รุ่นเก่าได้ ส่วนระบบเสียงใช้เทคนิค Sigma-Delta Modulation ร่วมกับตัวกรอง PDM หลายขั้นตอน ขณะที่พอร์ต USB Host บนบอร์ดรองรับการเชื่อมต่อคีย์บอร์ดโดยตรง
คุณสมบัติเด่นของเฟิร์มแวร์ S3-MSX-PC:
- ระบบอีมูเลชัน – fMSX 6.0 — รองรับเครื่อง MSX1, MSX2 และ MSX2+ อย่างสมบูรณ์
- การแสดงผลภาพ
- Color Depth – 64 colors (2 bits per channel: R, G, B)
- VGA ความละเอียด 640×480 @ 60Hz} ส่งสัญญาณ RGB แบบขนาน 16 บิตผ่านวงจร LCD_CAM
- แสดงผลได้ 64 สี (2 บิตต่อช่องสี RGB)
- ระบบเสียง – เสียงสเตอริโอแบบ PDM มีระบบป้องกัน Audio Buffer Underrun ในฮาร์ดแวร์
- USB Host
- รองรับคีย์บอร์ดแบบ Plug-and-Play
- ความหน่วงอินพุตเพียงประมาณ 2–4 มิลลิวินาที (ใช้การจัดการ USB Interrupt โดยตรงและข้ามขั้นตอน Software Debounce)
- การปรับแต่ง ESP32-S3 เพื่อเพิ่มประสิทธิภาพ
- MSX palettes are pre-shifted during init to map directly to the GPIO pins of the R-2R ladder. The ESP32’s LCD_CAM peripheral is used to DMA-blast pixels to the monitor, utilizing the hardware lcd_byte_order=1 flag for zero-CPU-cost byte swapping.
- การปรับแต่งแกนประมวลผล Z80 – ตัวถอดรหัสคำสั่ง (Opcode Dispatcher) แบบ switch/case วไปทำให้ระบบทำนายการกระโดดคำสั่ง (Branch Predictor) ของสถาปัตยกรรม Xtensa ทำงานได้ไม่ดี Ivan จึงเปลี่ยนมาใช้เทคนิค Computed Goto (Threaded Code) ซึ่งช่วยให้ตัวแปรสำคัญอย่าง Program Counter (PC) และ Instruction Count (ICount) ถูกเก็บไว้ในรีจิสเตอร์ 32 บิตจริงของซีพียู ส่งผลให้ประสิทธิภาพการจำลอง Z80 ดีขึ้นอย่างมาก
- การเพิ่มประสิทธิภาพด้านกราฟิก – แปลงพาเลตสี MSX ให้ตรงกับขา GPIO ของวงจร R-2R ตั้งแต่ขั้นตอนเริ่มต้น ใช้ฮาร์ดแวร์ LCD_CAM ของ ESP32-S3 ส่งข้อมูลภาพผ่าน DMA ไปยังจอโดยตรง, ใช้ฟังก์ชัน lcd_byte_order=1 เพื่อสลับลำดับไบต์โดยไม่ใช้พลังประมวลผลของซีพียู
- ลดผลกระทบจากความหน่วงของ PSRAM – แม้จะเพิ่มการจำลองชิปเสียงแบบ Cycle-Accurate ได้แก่ PSG, SCC และ OPLL แต่ Ivan ได้ตัดตาราง Lookup Table ขนาด 400KB ที่เก็บอยู่ใน PSRAM ออกทั้งหมด แล้วแทนที่ด้วยการคำนวณแบบ Integer Bit Shift ที่ใช้เวลาเพียง 1 Clock Cycle ส่วนตารางข้อมูลสำคัญขนาด 11KB ถูกย้ายไปเก็บไว้ในหน่วยความจำ DRAM (DRAM_ATTR) เพื่อให้เข้าถึงได้รวดเร็วขึ้น
- Zero-Heap State Compression – Standard zlib crashes the ESP32-S3 when saving 4.4MB machine states, so Ivan wrote a custom streaming LZ77 compressor (“Delta-Stride LZ”) that understands the MSX VRAM geometry (128/256-byte strides). It performs a vertical rep-match XOR-delta pass and streams directly to the SD card, using exactly 0 bytes of heap RAM.
- การบีบอัด Save State โดยไม่ใช้ Heap RAM – การใช้ zlib สำหรับบันทึกสถานะเครื่อง MSX ขนาด 4.4MB ทำให้ ESP32-S3 เกิดปัญหาล่ม, Ivan จึงพัฒนาอัลกอริทึมบีบอัดข้อมูลของตัวเองชื่อ Delta-Stride LZ ซึ่งเป็น LZ77 แบบสตรีมมิงที่ออกแบบมาให้เข้าใจโครงสร้าง VRAM ของ MSX โดยเฉพาะ คุณสมบัติของระบบนี้ ได้แก่ รองรับ VRAM แบบ Stride 128 และ 256 ไบต์, ใช้เทคนิค Vertical Repeat Match และ XOR Delta, เขียนข้อมูลลง SD Card โดยตรง และใช้ Heap RAM 0 ไบต์
โปรเจกต์นี้พัฒนาด้วยเฟรมเวิร์ก ESP-IDF v5.4.4 ผู้พัฒนาได้ทดสอบบนบอร์ด DIYables ESP32-S3 Development Board ที่ใช้โมดูล ESP32-S3-WROOM-1-N16R8 ($4 หรือ ~130฿ บน AliExpress, $12 หรือ ~400฿ บน Amazon) แต่สามารถทำงานกับบอร์ด ESP32-S3 รุ่นอื่นที่มี Flash และ PSRAM ใกล้เคียงกันได้ นอกจากตัวบอร์ดแล้ว ผู้ใช้งานจะต้องเพิ่มอุปกรณ์ดังนี้ ตัวต้านทานสำหรับวงจร VGA แบบ R-2R, ตัวเก็บประจุและตัวต้านทานสำหรับตัวกรองเสียง PDM, คอนเนกเตอร์ VGA, พอร์ต USB โดยต่อสายตามแผนผังวงจร (Schematic) ที่แสดงด้านล่าง
แม้ว่าวงจรต้นแบบจะดูค่อนข้างรก แต่สามารถจัดระเบียบให้เรียบร้อยขึ้นได้ด้วยแผ่นปริ้นท์อเนกประสงค์ (Perfboard) ในตอนแรกคิดว่าบอร์ด Olimex ESP32-SBC-FabGL ที่มีพอร์ต VGA ในตัวน่าจะเป็นตัวเลือกที่ดีกว่า แต่บอร์ดดังกล่าวใช้แกนประมวลผล Xtensa LX6 ขณะที่โปรเจกต์นี้พัฒนาสำหรับ ESP32-S3 ที่ใช้แกน LX7 Ivan ระบุว่าการทำให้อีมูเลเตอร์ fMSX ทำงานได้ลื่นบน ESP32-S3 จำเป็นต้องปรับแต่งสถาปัตยกรรมอย่างมาก เพื่อแก้ปัญหาความหน่วงของ PSRAM และ Pipeline Stall ของ Xtensa LX7 ดังนั้นโค้ดที่ปรับแต่งเฉพาะสำหรับ LX7 อาจไม่สามารถใช้งานกับ LX6 ได้โดยตรง
สามารถดูซอร์สโค้ด, ไฟล์ Binary สำหรับติดตั้ง, คู่มือการใช้งาน และบทความ Technical Deep Dive ที่เจาะลึกการทำงานภายใน พร้อมตัวอย่างโค้ดและสถิติการคอมไพล์ ได้บน GitHub นอกจากนี้ภายในหน้าโปรเจกต์ยังมีวิดีโอสั้น ๆ หลายคลิปที่สาธิตการทำงานจริงของเฟิร์มแวร์ S3-MSX-PC
แปลจากบทความ : Bare-metal MSX2+ Emulator for ESP32-S3 offers custom LCD_CAM VGA implementation & Z80 optimizations

บรรณาธิการข่าวและบทความภาษาไทย CNX Software ได้มีความสนใจในด้านเทคโนโลยี โดยเฉพาะ Smart Home และ IoT



