¡El código fuente de MS-DOS 4.0 fue liberado en su cuenta de GitHub! Ya había liberado anteriormente la versión 1.25 y la versión 2.0 y ahora le tocó a la versión 4.0.

Preparando el Código

Antes de escribir este artículo me encontré con algunos problemas. Todo el proceso de compilación lo quise hacer con la versión MSDOS 3.31, la más inmediatamente cercana a la 4.0, con la idea de tratar de hacerlo lo más fiel posible a lo "que hubiera sido en esa época" pero con la última version de DOS antes de la que fue liberada, simplemente no es posible compilarlo. El problema que estuvo sucediendo hasta que me di cuenta es que las variables de entorno y los "paths" tienen un espacio limitado, y algunas rutas son demasiado largas para que el compilador pueda procesarlas a través del sistema operativo. Por esto mismo, en la mitad de la compilación con la versión MSDOS 3.31 del código fuente, nmake y cc no encuentran los INCludes en el path. Por esto mismo, vamos a compilar MSDOS 4 con la version MSDOS 5 pelada.

También encontré problemas de formato. Si agarramos cualquier archivo, nos vamos a dar cuenta que hay caracteres UTF-8 y LF cuando en verdad deberían ser archivos ASCII CRLF Lo primero que tenemos que hacer con el código es hacer estas conversiones de formato.

crlf

Como se puede ver en la imagen arriba, no hay un 0x0d seguido de un 0x0a (CRLF). También hay caracteres en varios archivos que parecerian ser UTF-8 como la siguiente secuencia de bytes: ef bf bd

Vamos a reemplazar estos caracteres con el caracter *. Sin las siguientes conversiones que se pueden ver en los dos comandos de abajo no es posible compilar el código fuente, ya que el compilador provisto por Microsoft en este release, no pueden interpretar estos caracteres.

$ find -iname '*.bat' -o -iname '*.asm' -o -iname '*.skl' 
  -o -iname 'zero.dat' -o -iname 'locscr' | xargs unix2dos -f

$ find . -type f \( -name "GETMSG.ASM" -o -name "SELECT2.ASM" 
  -o -name "USA.INF" \) -exec sed -i -re 's/\xef\xbf\xbd|\xc4\xbf|\xc4\xb4/\*/g' {} \;

crlf-sed

Opcionalmente, podemos modificar en el archivo BIOS/MSLOAD.ASM, la variable Mystacks de 64 words a 128 words:

[...]
start:
        jmp Save_Input_Values
SYS_Version     dw      EXPECTED_VERSION ;AN001; From VERSIONA.INC file
Mystacks        dw      128 dup (0)      ;AN000; local stack
MyStack_ptr     label   word
[...]

De esta manera, vamos a permitir ejecutar MS-DOS en discos rígidos manejados por QEMU o similares.

Finalmente solo porque podemos, vamos a cambiar el mensaje de copyright del command.com en el archivo MESSAGES/USA-MS.MSG:175:

[...]
0463 U 0000 "Out of environment space",CR,LF
0464 U 0001 CR,LF,CR,LF,"Toshisoft(R) MS-DOS(R) Version 6.66",CR,LF
        "             (C)Copyleft 0x705h.com 2024",CR,LF
0465 U 0000 "Specified COMMAND search directory bad",CR,LF
0466 U 0000 "Specified COMMAND search directory bad access denied",CR,LF
[...]

Metamos todo en una 486 (con PCem)

La máquina en PCem que configuré para compilar MSDOS 4.0 tiene las siguientes características:

   
Machine 486 Award SiS 496/497
CPU Intel i486DX2/66
Dynamic Recompiler On
Memory 16 MB
Video S3 ViRGE/DX
Storage 250 MB
Floppy Drives 3.5" 1.44M

Recordar configurar el disco rígido y el floppy en el BIOS así como también la secuencia de booteo a A,C – primero el floppy, luego el HDD.

Luego de preparar la máquina, instalamos desde un floppy con el instalador de MSDOS 5 al disco C. Adicionalmente también preparamos un floppy vacío:

 $ dd if=/dev/zero of=f144.img count=1440 bs=1k
1440+0 records in
1440+0 records out
1474560 bytes (1,5 MB, 1,4 MiB) copied, 0,0028958 s, 509 MB/s

Ya con nuestro MSDOS 5 instalado, insertamos el floppy y hacemos que este floppy sea booteable. Después vamos a sobreescribir los archivos de sistema IO.SYS y MSDOS.SYS, pero hacemos esto porque necesitamos tener un Master Boot Record (MBR) disponible en ese floppy, para hacerlo booteable.

C:\> format a: /s

Ahora que tenemos todo listo, lo que hacemos es APAGAR la máquina en PCem completamente. Esto es importante porque montar una imagen de disco mientras una VM en PCem está corriendo, tiene comportamiento indefinido.

Una vez la máquina está apagada, montamos el disco y copiamos todo el source de MSDOS 4.0 a nuestra imagen:

$ mount -o loop,offset=$(echo "63*512" |bc) -t msdos 486-compiling-msdos.img /mnt
$ cd /mnt/src
$ cp -r /home/toshi/dev/MS-DOS/v4.0/src/ .
$ umount /mnt

Compilando!

Arrancamos nuestra máquina en PCem de nuevo y editamos con el EDIT el archivo c:\src\setenv.bat modificando BAKROOT, LIB y INCLUDE de la siguiente manera:

setenv

Una vez que hicimos esta modificación, ejecutamos los siguientes comandos y esperamos que el sistema operativo termine de compilar.

c:\SRC> setenv
c:\SRC> nmake

Al terminar de compilar, hay un archivo .BAT que copia todos los ejecutables de la compilación a un directorio, procedemos a ejecutarlo y dar por finalizada esta parte del proceso:

C:\SRC> mkdir bin
C:\SRC> cpy.bat bin

Booteando la Versión Compilada

Una vez que terminó de compilar, insertamos el floppy que habíamos preparado anteriormente y eliminamos los archivos MSDOS.SYS e IO.SYS y copiamos el sistema operativo compilado de la siguiente manera:

A:\> attrib -S -H -R IO.SYS
A:\> attrib -S -H -R MSDOS.SYS
A:\> del IO.SYS
A:\> del MSDOS.SYS
A:\> C:
C:\> CD SRC\BIN
C:\SRC\BIN> copy *.* A:

Y finalmente, rebooteamos desde nuestro floppy:

msdos-4.0-booted

Ahora, que me es posible compilar el sistema operativo, y potencialmente debuggearlo, quisá pueda avanzar más aún en un proyecto que vengo laburando hace bastante, Jakiar el Truco Arbiser. :D

Referencias