Proyek ini adalah emulator DOS yang memanfaatkan API Windows Hypervisor Platform (WHP) untuk membuat CPU virtual, memungkinkan pelaksanaan program DOS dalam lingkungan mode nyata 16-bit yang tervirtualisasi pada sistem Windows modern.
Dalam emulator Windows 3.1 saya sebelumnya, CPU 80286 sepenuhnya ditiru dalam perangkat lunak. Namun, untuk proyek ini, saya memutuskan untuk mengambil pendekatan yang berbeda dengan menggunakan virtualisasi perangkat keras untuk CPU sambil meniru hanya lapisan DOS dalam perangkat lunak.
Emulator ini terutama berfungsi sebagai demonstrasi WHP API dan tidak dimaksudkan untuk berfungsi sebagai emulator DOS lengkap. Fungsi DOS minimal telah diimplementasikan, cukup hanya untuk menjalankan beberapa program sampel, meskipun kerangka kerja telah dirancang agar mudah diperpanjang.
Emulator menginisialisasi CPU virtual menggunakan API WHP, mengkonfigurasinya untuk berjalan dalam mode nyata dengan memastikan bahwa bit PE (Mode Dilindungi yang diaktifkan) dan PG (paging) dinonaktifkan dalam register CR0.
DOS yang dapat dieksekusi dipetakan ke host emulator dan dibagikan dengan tamu di alamat fisik yang sesuai, mensimulasikan tata letak memori dari sistem DOS nyata.
Sebagian besar fungsi DOS terjadi melalui interupsi, seperti 0x21 untuk layanan sistem dan 0x10 untuk operasi video, yang harus ditiru secara manual dalam perangkat lunak. Interupsi tidak secara inheren memicu keluar VM, dan membutuhkan trik tambahan untuk menangkapnya. Ini mudah ditangani dengan menerapkan tabel vektor interupsi khusus (IVT) di mana setiap interupsi menunjuk ke instruksi CPUID. Konfigurasi ini memastikan bahwa keluarnya VM dipicu ketika interupsi terjadi, memungkinkan emulator untuk mencegat dan menangani interupsi.
Program DOS sering memanfaatkan port I/O, seperti untuk speaker PC, CMOS, dan timer perangkat keras. Permintaan I/O mudah ditangkap karena instruksi in
dan out
memicu keluar VM, memungkinkan fungsionalitas ditiru. Saat ini, hanya serangkaian permintaan I/O umum yang sangat kecil yang didukung.
Program DOS menggunakan berbagai metode untuk mempertahankan waktu. Emulator ini mencakup dukungan untuk beberapa mekanisme tertentu:
0000:046C
, alternatif untuk mengakses memori secara langsung.8253 PIT Timer tidak sepenuhnya diimplementasikan saat ini.
Emulator memantau status keyboard dan mempertahankan buffer kunci sederhana, meneruskan informasi ke program DOS melalui interupsi keyboard (0x16) seperlunya.
Perintah terminal dasar didukung, memungkinkan emulator untuk menjalankan game berbasis teks sederhana dan program dasar lainnya.
Emulator saat ini mengalokasikan ruang untuk bidang sistem, seperti area data BIOS dan Program Segment Prefix (PSP). Namun, bidang -bidang ini saat ini tidak dihuni, kecuali untuk nilai penghitung BIOS. Bidang tambahan dapat diisi seperlunya.
Pengujian telah dilakukan dengan menggunakan game DOS sederhana dari Flareon 2023 (Flaresay.exe, Challenge #6), terutama karena itu adalah satu -satunya DOS yang dapat dieksekusi pada hard disk saya saat itu.
Selain emulator DOS ini, saya telah sukses dengan konsep serupa yang bertujuan meniru program mode pengguna Windows 64-bit/32-bit. Dengan membangun lingkungan CPL3 yang disimulasikan dan mengaitkan register MSR_LSTAR, dimungkinkan untuk meniru yang dapat dieksekusi dan memaksa keluar VM pada panggilan sistem. Ini memungkinkan emulator untuk menangkap dan meneruskan permintaan panggilan sistem ke OS host atau mencegatnya. Teknik ini memang datang dengan banyak komplikasi, tetapi mungkin ada kasus penggunaan yang valid di mana emulator ringan bisa berguna.