Saya selalu kesal karena saya tidak bisa menjalankan game 64-bit di C # di bawah MS-DOS. Hari ini saya memperbaikinya.

Eksekusi Windows terdiri dari dua bagian:
- Program untuk DOS yang menampilkan "Program ini tidak dapat dimulai dalam mode DOS"
- Header yang dapat dieksekusi Windows
Dalam arti, semua file .exe adalah program DOS, tetapi tidak melakukan apa pun yang berguna. Jadi suatu hari saya menemukan proyek di Github yang layak mendapatkan lebih banyak bintang daripada yang dimiliki:
github.com/Baron-von-Riedesel/Dos64-stubDos64-stub adalah program kecil yang menggantikan pesan yang tidak berguna βtidak dapat dimulai di bawah DOSβ dengan memuat bagian Windows dari file yang dapat dieksekusi dan memindahkan proses ke abad ke-21. Dengan "teleportasi" yang saya maksud adalah mengatur memori halaman dan menempatkan prosesor dalam mode 64-bit ("panjang").
Untuk memulai, saya mengambil game "Snake" di Windows, yang baru-baru ini menyengat hingga 8 kb tanpa ketergantungan:
Tentu saja, metode Windows API yang biasa tidak tersedia di DOS, jadi saya harus menulis ulang lapisan komunikasi game dengan dunia luar. Beginilah tampilan
Environment.TickCount
sekarang:
public static unsafe long TickCount64 { [MethodImpl(MethodImplOptions.NoInlining)] get {
Ketika kami memiliki jumlah kutu, Anda dapat melakukan
Thread.Sleep
:
public static unsafe void Sleep(int delayMs) {
Dan kemudian
Console.WriteLine
:
public static unsafe void Write(char c) { byte* biosDataArea = (byte*)0x400;
Nah, semuanya sederhana: Kompiler C # -> Kompiler CoreRT AOT -> Linker. Kami memberi tahu linker untuk menggunakan Dos64-stub alih-alih menghasilkan header default yang tidak berguna.
Dan di sini adalah seluruh kode sumber dalam bentuk permintaan tarik .