كنت دائمًا منزعجًا من أنني لا أستطيع تشغيل لعبة 64 بت في C # ضمن MS-DOS. اليوم أنا إصلاحه.

تتكون الملفات التنفيذية لـ Windows من جزأين:
- برنامج لـ DOS يعرض "لا يمكن بدء تشغيل هذا البرنامج في وضع DOS"
- رأس قابل للتنفيذ ويندوز
بمعنى ما ، جميع ملفات exe هي برامج DOS ، لكن لا تفعل شيئًا مفيدًا. في أحد الأيام وجدت مشروعًا على جيثب يستحق نجومًا أكثر بكثير مما لديه:
github.com/Baron-von-Riedesel/Dos64-stubDos64-stub هو برنامج صغير يستبدل الرسالة عديمة الفائدة "لا يمكن بدء تشغيلها تحت DOS" عن طريق تحميل قسم Windows من الملف القابل للتنفيذ ونقل العملية إلى القرن الحادي والعشرين. يعني "النقل عن بُعد" إعداد ذاكرة الصفحة ووضع المعالج في وضع 64 بت ("طويل").
للبدء ، أخذت لعبتي "Snake" ضمن Windows ، والتي وصلت إلى 8 كيلوبايت مؤخرًا دون تبعية:
بالطبع ، لا تتوفر طرق Windows API المعتادة في DOS ، لذلك اضطررت إلى إعادة كتابة طبقة اتصال اللعبة مع العالم الخارجي. هذا هو ما يبدو عليه
Environment.TickCount
الآن:
public static unsafe long TickCount64 { [MethodImpl(MethodImplOptions.NoInlining)] get {
عندما يكون لدينا عدد من علامات التجزئة ، يمكنك القيام
Thread.Sleep
:
public static unsafe void Sleep(int delayMs) {
ثم
Console.WriteLine
:
public static unsafe void Write(char c) { byte* biosDataArea = (byte*)0x400;
حسنًا ، كل شيء بسيط: C # compiler -> CoreRT AOT compiler -> linker. نقول للرابط استخدام Dos64-stub بدلاً من إنشاء رأس افتراضي عديم الفائدة.
وهنا هو مصدر شفرة كاملة في شكل طلب سحب .