Sempre fiquei irritado por não conseguir executar um jogo de 64 bits em C # no MS-DOS. Hoje eu consertei.

Os executáveis do Windows consistem em duas partes:
- Um programa para DOS que exibe "Este programa não pode ser iniciado no modo DOS"
- Cabeçalho executável do Windows
De certa forma, todos os arquivos .exe são programas DOS, mas não fazem nada útil. Então, um dia, encontrei um projeto no Github que merece muito mais estrelas do que tem:
github.com/Baron-von-Riedesel/Dos64-stubO Dos64-stub é um pequeno programa que substitui a mensagem inútil "não pode ser iniciada no DOS" carregando a seção Windows do arquivo executável e teleportando o processo para o século XXI. Por "teletransporte", quero dizer configurar a memória da página e colocar o processador no modo de 64 bits ("longo").
Para começar, peguei meu jogo "Snake" no Windows, que doeu até 8 kb sem dependências:
Obviamente, os métodos usuais da API do Windows não estão disponíveis no DOS, então tive que reescrever a camada de comunicação do jogo com o mundo exterior. Agora é assim que o
Environment.TickCount
se parece:
public static unsafe long TickCount64 { [MethodImpl(MethodImplOptions.NoInlining)] get {
Quando temos o número de ticks, você pode fazer
Thread.Sleep
:
public static unsafe void Sleep(int delayMs) {
E então
Console.WriteLine
:
public static unsafe void Write(char c) { byte* biosDataArea = (byte*)0x400;
Bem, então tudo é simples: compilador C # -> compilador CoreRT AOT -> vinculador. Dizemos ao vinculador para usar o Dos64-stub em vez de gerar um cabeçalho padrão inútil.
E aqui está o código fonte inteiro na forma de uma solicitação pull .