¡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.
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' {} \;
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:
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:
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