Programmer sous FreeDOS 1.4

FreeDOS 1.4 est sorti en avril 2025.

Quelques notes, pour mémoire.

Site officiel
Dépôts officiels FreeDOS
Site YouTube FreeDOS

Après avoir installé la version minimale de FreeDOS 1.4 dans VirtualBox, je monte l’image du BonusCD (téléchargée depuis le site officiel sous le nom FD14BNS.iso) dans le lecteur optique virtuel de la machine.

FDIMPLES est un outil visuel et interactif de FreeDOS qui permet de parcourir, installer et supprimer des paquets inclus sur les supports de distribution de FreeDOS (comme les CD Live, BonusCD, etc.). Il s’agit d’un gestionnaire de paquets qui lit les médias d’installation pour identifier les logiciels disponibles à l’installation ou à la suppression. Pour l’utiliser, il suffit de lancer la commande FDIMPLES depuis l’invite de commandes de FreeDOS.

Pour programmer, j’ai choisi le compilateur Open Watcom C/C++et l’ éditeur de texte FED car il permet de plier / déplier le code. J’ai également installé l’assembleur NASM et l’éditeur hexadécimal uHex.

Dans C:\>FDAUTO.BAT, rajouter à la fin :

REM *** FED 2.24c ***
alias fed=C:\APPS\FED\FED.EXE

REM *** OPEN WATCOM C/C++ 1.9 ***      => à mettre en dernier
C:\DEVEL\WATCOMC\OWSETENV.BAT

Mémo FED :
Alt pour accéder au menu
CTRL-C pour fermer
CTRL-F pour plier / déplier le code

https://allthingsopen.org/articles/how-to-write-your-first-freedos-program
https://www.both.org/?p=12007
https://opensource.com/article/21/9/programming-dos-conio

Installation de DOSBox sous Debian 11

DOSBox est un émulateur simulant un environnement compatible MS-DOS dans le but d’exécuter des programmes développés autrefois pour ce système.

Dans la console :
sudo apt-get install dosbox
mkdir ~/DOSBox (ou un autre chemin)
nano ~/.dosbox/dosbox-0.74-3.conf

Modifier le fichier dosbox-0.74-3.conf :
[cpu]
cycles=max
(à la place de cycles=auto)
[dos]
keyboardlayout=fr
(à la place de keyboardlayout=auto)
[autoexec]
mount c ~/DOSBox
(pour un chemin qui contient des espaces, mettre le chemin entre guillements : " ")

Lancer DOSBox depuis la console :
dosbox

Dans DOSBox :
c:
dir

Pour basculer entre le mode fenêtré et le mode plein écran, presser Alt-Entrée. Pour libérer le curseur de la souris, presser Ctrl-F10.


Complément personnel à mettre dans le fichier dosbox-0.74-3.conf dont il est question ci-dessus :

[autoexec]
# Lines in this section will be run at startup.
# You can put your MOUNT lines here.
mount c "/media/eric/Fichiers Eric/Programmation/DOSBox/"
c:

### OPEN WATCOM 1.9 ###
path=%path%;c:\watcom\binw       
set include=c:\watcom\h
set watcom=c:\watcom
set edpath=c:\watcom\eddat
set wipfc=c:\watcom\wipfc

### TURBO PASCAL 7.0 ###
path=%path%;c:\tp7\bin

### NASM 2.15.05 ###
path=%path%;c:\nasm

Outils de développement que j’installe :
Open Watcom C/C++ 1.9 => Lien intéressant pour l’installation
Turbo Pascal 7.0
NASM 2.15.05 => Manuel en ligne

Installation de Open Watcom C/C++ dans FreeDOS

=> http://www.openwatcom.org
=> ftp://ftp.openwatcom.org/install/open-watcom-c-dos-1.9.exe



Garder les sélections par défaut (DOS, 16 bits, 32 bits notamment) :




On supprimera après les fichiers config.sys et autoexec.bat (ceux-ci sont vides).

Rajouts personnels à la fin du fichier fdauto.bat (= autoexec.bat) :

edit fdauto.bat
REM *** OPEN WATCOM 1.9 ***
PATH C:\WATCOM\BINW;%PATH%
SET INCLUDE=C:\WATCOM\H
SET WATCOM=C:\WATCOM
SET EDPATH=C:\WATCOM\EDDAT
SET WIPFC=C:\WATCOM\WIPFC

CTRL+S : Save
ALT+X : Exit

Pour compiler et créer un exécutable avec Watcom :

wcl hello.c
wcl hello.cpp

hello.c :

#include <stdio.h>

void main()
{
  printf( "Hello world\n" );
}

hello.cpp :

#include <iostream.h>

int main()
{
  cout << "Hello world" << endl;
}

Installation et utilisation de FreeDOS dans VirtualBox sous Debian 13

Mise à jour : 10/04/2026
Versions : FreeDOS 1.4 / VirtualBox 7.2.6

=> https://freedos.org

Attention, on va créer un disque dur virtuel (VHD) et non pas une VDI.

Pour pouvoir avoir accès au disque dur virtuel FreeDOS 1.4.vhd depuis l’ordinateur hôte, il faut au préalable préparer le terrain. Dans la console :

sudo apt-get install libguestfs-tools
cd ~
mkdir VHD

Pour monter le disque dur virtuel (la machine virtuelle FreeDOS 1.4 doit être éteinte) :

cd "/media/$USER/Fichiers Eric/VirtualBox/FreeDOS 1.4" (à adapter)
guestmount -a "FreeDOS 1.4.vhd" -m /dev/sda1 /home/$USER/VHD (à adapter)

On peut maintenant accéder aux fichiers de l’image disque FreeDOS directement depuis l’ordinateur hôte en allant ici : /home/$USER/VHD (à adapter). L’image est accessible en écriture mais tous les fichiers appartiennent à root. Pour transférer les fichiers du disque dur de l’ordinateur au disque dur virtuel, passer par la console :

Pour copier un répertoire et ses sous-répertoires :
cp -R répertoire ~/VHD
Pour supprimer un répertoire et ses sous-répertoires :
rm -rf ~/VHD/répertoire

Ne pas oublier de démonter le fichier VHD avant de démarrer FreeDOS dans VirtualBox :

guestunmount /home/$USER/VHD

Résolution d’un problème lié au clavier français avec FreeDOS dans VirtualBox sous Debian 10

Version de VirtualBox : 6.1.26
Version de FreeDOS : 1.3 RC4
Malgré le choix du clavier français à l’installation, celui-ci reste en Qwerty. Pour résoudre le problème, dans fdauto.bat (edit fdauto.bat), remplacer la ligne :

mkeyb FR

par

keyb FR

Mesures de vitesse sur PutPixel en mode 13h

Test de 3 façons différentes d’afficher un pixel (avec Turbo Pascal 7.0) :

(***************************************************************)

procedure PutPixel1(x,y: word; color: byte);
begin
  Mem[VGA_SEGMENT: y*320+x]:=color;
end; { PutPixel1 }

(***************************************************************)

procedure PutPixel2(x,y: word; color: byte); assembler;
asm
  mov  ax,VGA_SEGMENT  { es <-- $A000 }
  mov  es,ax
  mov  ax,VGA_WIDTH    { ax <-- 320 }
  mul  y               { ax <-- y*320 }
  add  ax,x            { ax <-- y*320+x }
  mov  bx,ax           { bx <-- y*320+x }
  mov  al,color
  mov  es:[bx],al
end; { PutPixel2 }

(***************************************************************)

procedure PutPixel3(x,y: word; color: byte); assembler;
asm
  mov  ax,VGA_SEGMENT  { es <-- $A000 }
  mov  es,ax
  mov  ax, y   { ax <-- y }
  mov  di, ax  { di <-- y }
  shl  ax, 8   { ax <-- y*256 }
  shl  di, 6   { di <-- y*64 }
  add  di, ax  { di <-- y*320 }
  add  di, x   { di <-- y*320+x }
  mov  al, color
  mov  [es:di],al
end; { PutPixel3 }

(***************************************************************)

Sous DOSBox, la procédure la plus rapide semble être la première (test réalisé plusieurs fois) :

Extrait du programme de test :

for c:=0 to 15 do
begin
  for y:=0 to 199 do
  begin
    for x:=0 to 319 do
    begin
      PutPixel1(x,y,c);
    end;
  end;
end;

En approfondissant, et pour une raison que je ne m'explique pas, on se rend compte que la position des PutPixels dans le programme a une influence : le premier est avantagé. J'ai donc changé la méthodologie et arrive à ceci :



PutPixel2 semble être la procédure plus rapide. Je suis autour de 25,4 ms par écran, soit 39,4 FPS.

Si vous pensez avoir mieux au niveau du code, je suis preneur...

Quelques ouvrages où il est question d’assembleur

Ces ouvrages ne sont plus très actuels, mais ils permettent de se (re)plonger dans l’assembleur de l’époque du DOS.
En haut à gauche : 1994. En haut à droite : 1989.
En bas à gauche : 1993. En bas à droite : 1997.


Et quelques liens :
Introduction au langage assembleur (vue d’ensemble)
Structure interne des ordinateurs (voir la partie 2)
Apprendre l’assembleur
Programmation Assembleur 32 et 64 bits sous Linux Ubuntu

Comparatif DOSBox / JS-DOS

Pour accéder aux valeurs mesurées sur C282, il faut utiliser la combinaison de touches SHIFT R.

Sur mon ordinateur (hors ligne), C282 donne les résultats suivants dans la machine virtuelle DOSBox :

Sur le même ordinateur (en ligne), C282 donne les résultats ci-dessous avec JS-DOS (cycles: 20000). NvDelay passant de 347 à 54, on constate que le passage sur le Web de C282 divise par 6 environ la vitesse de calcul. Le régulateur permet d’obtenir un visuel quasi identique en ligne et hors ligne pour une machine suffisamment puissante. Étonnamment, avec JS-DOS, le même test sur un Netbook (peu puissant) indique une régulation satisfaisante alors que le visuel ne correspond pas du tout à ce qui est attendu (trop lent).

Pour accéder aux valeurs mesurées sur Opus 1, il faut utiliser la combinaison de touches SHIFT R.

Sur mon ordinateur (hors ligne), Opus 1 donne les résultats suivants dans la machine virtuelle DOSBox :

Sur le même ordinateur (en ligne), Opus 1 donne les résultats ci-dessous avec JS-DOS (cycles: 40000). NvDelay passe de 320 à 171.

JS-DOS

JS-DOS permet d’exécuter un programme DOS dans un navigateur Web de manière très simple. => Site officiel : https://js-dos.com.

Dans la console de Debian, télécharger la version 6.22 :

cd Téléchargements

wget https://js-dos.com/6.22/current/js-dos.js

wget https://js-dos.com/6.22/current/wdosbox.js
wget https://js-dos.com/6.22/current/wdosbox-emterp.js
wget https://js-dos.com/6.22/current/wdosbox-nosync.js
wget https://js-dos.com/6.22/current/dosbox.js
wget https://js-dos.com/6.22/current/dosbox-emterp.js
wget https://js-dos.com/6.22/current/dosbox-nosync.js
wget https://js-dos.com/6.22/current/wdosbox-profiling.js
wget https://js-dos.com/6.22/current/wdosbox-emterp-profiling.js
wget https://js-dos.com/6.22/current/wdosbox-nosync-profiling.js

wget https://js-dos.com/6.22/current/wdosbox.wasm.js
wget https://js-dos.com/6.22/current/wdosbox-emterp.wasm.js
wget https://js-dos.com/6.22/current/wdosbox-nosync.wasm.js
wget https://js-dos.com/6.22/current/wdosbox-profiling.wasm.js
wget https://js-dos.com/6.22/current/wdosbox-emterp-profiling.wasm.js
wget https://js-dos.com/6.22/current/wdosbox-nosync-profiling.wasm.js

Exemples : https://js-dos.com/6.22/examples/

Problème rencontré : Le titre que je donne à mes pages html est écrasé par JS-DOS et indique DOSBox. Pour résoudre ce problème, j’ai modifié certains fichiers ci-dessus en remplaçant :

setWindowTitle!=="undefined"

par :

setWindowTitle=="undefined"

Les fichiers concernés sont :
wdosbox.js
wdosbox-emterp.js
wdosbox-nosync.js
dosbox.js
dosbox-emterp.js
dosbox-nosync.js
wdosbox-profiling.js
wdosbox-emterp-profiling.js
wdosbox-nosync-profiling.js

J’en ai informé l’auteur.