Siempre me molestó que no pueda ejecutar un juego de 64 bits en C # bajo MS-DOS. Hoy lo arreglé.

Los ejecutables de Windows constan de dos partes:
- Un programa para DOS que muestra "Este programa no se puede iniciar en modo DOS"
- Encabezado ejecutable de Windows
En cierto sentido, todos los archivos .exe son programas de DOS, pero no hacen nada útil. Entonces, un día encontré un proyecto en Github que merece muchas más estrellas de las que tiene:
github.com/Baron-von-Riedesel/Dos64-stubDos64-stub es un pequeño programa que reemplaza el mensaje inútil "no se puede iniciar en DOS" al cargar la sección de Windows del archivo ejecutable y teletransportar el proceso al siglo XXI. Por "teletransportación" me refiero a configurar la memoria de página y poner el procesador en modo de 64 bits ("largo").
Para comenzar, tomé mi juego "Snake" en Windows, que recientemente picó hasta 8 kb sin dependencias:
Por supuesto, los métodos habituales de la API de Windows no están disponibles en DOS, así que tuve que reescribir la capa de comunicación del juego con el mundo exterior. Así es como se ve ahora
Environment.TickCount
:
public static unsafe long TickCount64 { [MethodImpl(MethodImplOptions.NoInlining)] get {
Cuando tenemos el número de ticks, puedes hacer
Thread.Sleep
:
public static unsafe void Sleep(int delayMs) {
Y luego
Console.WriteLine
:
public static unsafe void Write(char c) { byte* biosDataArea = (byte*)0x400;
Bueno, entonces todo es simple: compilador C # -> compilador CoreRT AOT -> enlazador. Le decimos al enlazador que use Dos64-stub en lugar de generar un encabezado predeterminado inútil.
Y aquí está todo el código fuente en forma de una solicitud de extracción .