MartyPC – Trình giả lập IBM PC/XT chính xác đến từng chu kỳ CPU
MartyPC là trình giả lập mã nguồn mở cho các dòng máy IBM PC và PC/XT đời đầu, đạt độ chính xác chu kỳ lên tới 99,9997% nhờ kiểm chứng trực tiếp với chip 8088 thật. Dự án do lập trình viên dbalsom phát triển bằng Rust, hỗ trợ Windows, Linux, macOS và cả trình duyệt web, với bộ công cụ gỡ lỗi chuyên sâu dành cho lập trình viên phần mềm retro.

MartyPC – Trình giả lập IBM PC/XT chính xác đến từng chu kỳ CPU
MartyPC là một trình giả lập mã nguồn mở dành cho các dòng máy tính IBM PC và PC tương thích đời đầu, được phát triển bởi lập trình viên dbalsom. Điểm đặc biệt của dự án này không nằm ở giao diện bóng bẩy hay khả năng chạy hàng nghìn tựa game, mà ở độ chính xác đến từng chu kỳ CPU — một tiêu chuẩn cực kỳ khắt khe trong thế giới giả lập phần cứng.
MartyPC hỗ trợ Windows, Linux và macOS, đồng thời có thể chạy trực tiếp trên trình duyệt web. Phiên bản phát hành ổn định gần nhất là 0.4.1, trong khi nhánh phát triển hiện tại đã lên tới 0.5.0.
Giao diện MartyPC với nhiều cửa sổ hiển thị song song
Vì sao lại có thêm một trình giả lập PC nữa?
Theo chính tác giả chia sẻ, MartyPC khởi đầu chỉ là một dự án cá nhân nhằm kiểm tra xem bản thân có thể viết một trình giả lập từ con số không trong lúc học ngôn ngữ lập trình Rust hay không. Mục tiêu ban đầu khá khiêm tốn, nhưng dự án đã phát triển vượt xa mong đợi.
Định hướng của MartyPC không phải cạnh tranh với các trình giả lập thân thiện với người dùng phổ thông, mà là trở thành công cụ hỗ trợ phát triển phần mềm retro. Nó được trang bị dày đặc các công cụ gỡ lỗi và ghi log, cho phép lập trình viên viết phần mềm cho Intel 8088 quan sát và đo lường chính xác từng chu kỳ thực thi của mã lệnh.
Nếu bạn đã quen với việc chỉnh sửa tệp cấu hình, MartyPC sẽ không gây khó khăn gì đáng kể — dù việc thiết lập ban đầu có thể không dễ dàng như các trình giả lập khác.
Độ chính xác được kiểm chứng bằng phần cứng thật
Đây là phần thú vị nhất của dự án. Từ tháng 11 năm 2022, tác giả bắt tay vào việc làm cho phần giả lập CPU 8088 đạt độ chính xác theo chu kỳ. Cách làm rất đáng nể: ông kết nối một chip 8088 thật với vi điều khiển Arduino MEGA, cho phép một câu lệnh được thực thi đồng thời trên trình giả lập và trên CPU thật, sau đó so sánh kết quả từng chu kỳ một.
Đến tháng 6 năm 2024, bộ kiểm thử 8088 được cập nhật để kiểm tra cả hàng đợi nạp trước lệnh (prefetch queue). Nhiều sai lệch về chu kỳ đã được phát hiện và sửa chữa. Kết quả: MartyPC vượt qua bộ kiểm thử 8088 V2 với độ chính xác 99,9997%.
Không chỉ dừng ở CPU, nhóm phát triển còn nghiên cứu phần cứng ngoại vi bằng cách dùng Arduino khảo sát chip định thời 8253, dùng máy hiện sóng đo thời gian DMA, và thậm chí xây dựng một bộ ngửi bus (bus sniffer) bằng máy phân tích logic.
Thành quả của quá trình này rất ấn tượng:
- Tháng 4 năm 2023: MartyPC đủ chính xác để chạy bản demo nổi tiếng 8088 MPH.
- Tháng 5 năm 2023: MartyPC trở thành trình giả lập PC đầu tiên có thể tái hiện mọi hiệu ứng trong bản demo Area 5150.
MartyPC tái hiện đầy đủ hiệu ứng của bản demo Area 5150
Với những ai từng biết đến 8088 MPH và Area 5150, đây là minh chứng rõ ràng nhất cho độ chính xác của trình giả lập. Hai bản demo này khai thác phần cứng CGA đến giới hạn tuyệt đối, và việc tái hiện thành công chúng đòi hỏi mô phỏng chính xác đến từng xung nhịp của bộ điều khiển Motorola MC6845 CRTC.
Hệ thống và thiết bị được hỗ trợ
MartyPC hiện có thể giả lập các dòng máy sau:
- IBM Model 5150 (PC)
- IBM Model 5160 (XT)
- Turbo XT thông dụng
- IBM PCjr
- Tandy 1000
Về CPU, trình giả lập hỗ trợ Intel 8088 với phần triển khai chính xác theo chu kỳ, bao gồm cả BIU bất đồng bộ và logic nạp trước lệnh. Ngoài ra còn có NEC V20 ở mức sơ bộ — dựa trên chu kỳ nhưng chưa hoàn toàn chính xác về thời gian do chưa tinh chỉnh khỏi nền tảng 8088.
Về chipset ngoại vi, MartyPC mô phỏng 8255 PPI, 8259 PIC, 8253 PIT (chính xác cao, hỗ trợ âm thanh PCM), 8237 DMAC, 8250 UART, cổng game và cổng song song.
Đồ họa và âm thanh
MartyPC hỗ trợ nhiều chuẩn hiển thị kinh điển:
- CGA — triển khai theo xung ký tự, hỗ trợ cả đầu ra composite và mô phỏng màn hình nhờ mã chuyển đổi composite của reenigne (cũng được DOSBox và 86Box sử dụng).
- MDA và Hercules — đều dựa trên bộ điều khiển MC6845.
- EGA — mô phỏng theo cấu trúc từng chip LSI trên phần cứng gốc, hỗ trợ phông chữ định nghĩa lại và cuộn mượt theo từng dòng quét.
- TGA — triển khai cho PCjr và Tandy Graphics.
- VGA — đang phát triển, nhưng các chế độ như Mode 13h và Mode X đã hoạt động.
Về âm thanh, MartyPC giả lập loa PC (cho ra âm thanh PWM chất lượng khá trong các bản demo), Adlib với lõi OPL2 từ nuked-opl3, chip SN76489 ba kênh của Tandy 1000 và PCjr, cùng Disney Sound Source.
Lưu trữ và mở rộng bộ nhớ
Trình giả lập hỗ trợ bộ điều khiển đĩa mềm µPD765 FDC, đủ mạnh để chạy cả DOS lẫn Minix, và có thể xử lý một số tựa game được bảo vệ bản quyền nếu có ảnh đĩa đúng định dạng. MartyPC sử dụng thư viện ảnh đĩa fluxfox của chính tác giả, cho phép đọc nhiều định dạng ảnh đĩa PC khác nhau.
Ngoài ra còn có bộ điều khiển đĩa cứng IBM/Xebec 20MB, XT-IDE Rev 2, jr-IDE cho PCjr, và hỗ trợ băng ROM cartridge của PCjr ở định dạng JrRipCart (.JRC). Về bộ nhớ, MartyPC hỗ trợ thẻ LoTech 2MB EMS và các thẻ mở rộng bộ nhớ chung cho bus ISA hoặc khe SideCar của PCjr.
Công cụ gỡ lỗi dành cho lập trình viên
Đây chính là điểm bán hàng chính của MartyPC. Trình giả lập có giao diện đồ họa gỡ lỗi toàn diện với nhiều chế độ hiển thị: dịch ngược mã lệnh, trạng thái CPU, xem bộ nhớ và trạng thái các thiết bị ngoại vi. Nó hỗ trợ điểm dừng theo mã và theo bộ nhớ, cùng khả năng ghi log theo câu lệnh và theo chu kỳ.
Công cụ gỡ lỗi chuyên sâu của MartyPC
Người dùng cũng có thể tùy chỉnh cấu hình máy thông qua các hồ sơ cấu hình cơ sở kết hợp với các phần mở rộng gọi là "overlay" — tương tự như việc cắm thêm card mở rộng hay nâng cấp phần cứng. MartyPC hỗ trợ cấu hình hai card đồ họa và nhiều màn hình, cho phép chạy một màn hình phụ được điều khiển bởi card MDA hoặc Hercules, thậm chí ngay trong cùng một cửa sổ.
MartyPC hỗ trợ cấu hình nhiều màn hình với shader độc lập
Về hình ảnh hiển thị, MartyPC đi kèm shader CRT cấu hình được, và dự kiến sẽ bổ sung hỗ trợ LibraShader trong tương lai.
Lời cảm ơn và đóng góp cộng đồng
Tác giả dành lời cảm ơn đặc biệt tới reenigne — người đã dịch ngược vi mã của chip 8088, công trình mà không có nó thì trình giả lập này khó lòng ra đời. Ông cũng cảm ơn Ken Shirriff với blog chuyên sâu về logic silicon của 8086 và 8088, cùng JetBrains vì đã cấp phép sử dụng các sản phẩm của họ cho dự án.
Góc nhìn cho người dùng Việt Nam
Với cộng đồng yêu thích máy tính retro và lập trình hệ thống ở Việt Nam, MartyPC là một công cụ học tập đáng giá. Việc nghiên cứu kiến trúc 8088 — nền tảng của toàn bộ dòng máy PC hiện đại — thông qua một trình giả lập chính xác đến từng chu kỳ mang lại trải nghiệm gần như chạm vào phần cứng thật. Sinh viên ngành kỹ thuật máy tính có thể dùng MartyPC để hiểu sâu về hàng đợi nạp trước lệnh, chu kỳ bus, và cách các chip ngoại vi phối hợp với CPU — những khái niệm mà sách vở thường chỉ mô tả ở mức trừu tượng.
Vì là dự án mã nguồn mở viết bằng Rust, MartyPC cũng là một ví dụ tốt để học cách tổ chức một dự án Rust quy mô lớn, kết hợp giữa mô phỏng phần cứng và giao diện người dùng.
Bạn có thể tải MartyPC qua các bản phát hành định kỳ trên GitHub, hoặc tự biên dịch từ mã nguồn nếu muốn dùng phiên bản mới nhất. Dự án cũng có sẵn hướng dẫn xây dựng chi tiết trên wiki của mình.

