Systèmes libres
Debian
FreeDOS
ReactOS : Système de type Windows NT
KolibriOS : Écrit en assembleur
Émulateurs / Couches de compatibilité
DOSBox
DOSBox-X
DOSBox Staging
PCem
Wine
Sur le Web
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.
Version : https://github.com/caiiiycuk/js-dos/releases/tag/6.22.60
Télécharger et décompresser 6.22.60.zip :
cd Téléchargements wget https://github.com/caiiiycuk/js-dos/releases/download/6.22.60/6.22.60.zip unzip 6.22.60.zip -d 6.22.60
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 de l’archive en remplaçant :
setWindowTitle!=="undefined"
par :
setWindowTitle=="undefined"
Pour lister les fichiers concernés par le problème, on va écrire un script Bash dans un fichier nommé liste-jsdos.sh (utilisation : ./liste-jsdos.sh 6.22.60):
#!/bin/bash
# ============================================================
# Recherche de fichiers contenant :
#
# setWindowTitle!=="undefined"
#
# Utilisation :
#
# ./liste-jsdos.sh /chemin/vers/le/repertoire
#
# Exemple :
#
# ./liste-jsdos.sh /var/www/html/js-dos
# ============================================================
# ------------------------------------------------------------
# Vérifie qu'un répertoire a été fourni en argument
# ------------------------------------------------------------
if [ -z "$1" ]; then
echo "Usage : $0 /chemin/vers/le/repertoire"
exit 1
fi
# ------------------------------------------------------------
# Stocke le répertoire fourni dans une variable
# ------------------------------------------------------------
DIR="$1"
# ------------------------------------------------------------
# Vérifie que le répertoire existe
# ------------------------------------------------------------
if [ ! -d "$DIR" ]; then
echo "Erreur : le répertoire '$DIR' n'existe pas."
exit 1
fi
# ------------------------------------------------------------
# Texte que l'on recherche
# ------------------------------------------------------------
PATTERN='setWindowTitle!=="undefined"'
# ------------------------------------------------------------
# Recherche récursive avec grep
#
# -r : recherche récursivement dans les sous-répertoires
# -l : affiche uniquement le nom des fichiers contenant
# le texte recherché
# -F : recherche le texte exactement, sans expression
# régulière
# -I : ignore les fichiers binaires
#
# "$DIR" : répertoire dans lequel commencer la recherche
# ------------------------------------------------------------
grep -rIlF "$PATTERN" "$DIR"
Résultat obtenu (5 fichiers contiennent l’erreur mentionnée) :
6.22.60/wdosbox.js 6.22.60/wdosbox-emterp.js 6.22.60/dosbox.js 6.22.60/dosbox-emterp.js 6.22.60/wdosbox-nosync.js
On va écrire un nouveau fichier Bash qui va corriger l’erreur (utilisation : ./reparer-jsdos.sh 6.22.60) :
#!/bin/bash
# ============================================================
# CORRECTION GÉNÉRIQUE DE JS-DOS
# ============================================================
#
# Le script recherche automatiquement dans un répertoire
# tous les fichiers contenant :
#
# setWindowTitle!=="undefined"
#
# et remplace cette chaîne par :
#
# setWindowTitle=="undefined"
#
# Il n'est donc pas nécessaire de connaître à l'avance
# les fichiers problématiques.
#
# Une copie de chaque fichier est créée avant modification :
#
# fichier.js
# fichier.js.bak
#
# Utilisation :
#
# ./reparer-jsdos.sh /chemin/vers/js-dos
#
# Exemple :
#
# ./reparer-jsdos.sh 6.22.60
#
# ============================================================
# ------------------------------------------------------------
# Vérification de l'argument
# ------------------------------------------------------------
if [ -z "$1" ]; then
echo "Usage : $0 /chemin/vers/js-dos"
exit 1
fi
# ------------------------------------------------------------
# Répertoire à analyser
# ------------------------------------------------------------
DIR="$1"
# ------------------------------------------------------------
# Vérification du répertoire
# ------------------------------------------------------------
if [ ! -d "$DIR" ]; then
echo "Erreur : le répertoire '$DIR' n'existe pas."
exit 1
fi
# ------------------------------------------------------------
# Texte recherché
# ------------------------------------------------------------
OLD='setWindowTitle!=="undefined"'
# ------------------------------------------------------------
# Texte de remplacement
# ------------------------------------------------------------
NEW='setWindowTitle=="undefined"'
# ------------------------------------------------------------
# Recherche des fichiers problématiques
# ------------------------------------------------------------
#
# grep :
#
# -r recherche récursivement
# -l affiche uniquement les noms des fichiers
# -I ignore les fichiers binaires
# -F recherche le texte exactement
#
# "|| true" empêche le script de s'arrêter si grep ne
# trouve aucun fichier.
# ------------------------------------------------------------
mapfile -t FILES < <(
grep -rIlF "$OLD" "$DIR" 2>/dev/null || true
)
# ------------------------------------------------------------
# Vérification du résultat de la recherche
# ------------------------------------------------------------
if [ "${#FILES[@]}" -eq 0 ]; then
echo "Aucun fichier contenant :"
echo
echo " $OLD"
echo
echo "n'a été trouvé dans :"
echo
echo " $DIR"
exit 0
fi
# ------------------------------------------------------------
# Affichage du nombre de fichiers trouvés
# ------------------------------------------------------------
echo "=========================================="
echo " Fichiers problématiques trouvés"
echo "=========================================="
echo
echo "Nombre de fichiers : ${#FILES[@]}"
echo
# ------------------------------------------------------------
# Affichage de la liste
# ------------------------------------------------------------
for FILE in "${FILES[@]}"; do
echo " $FILE"
done
echo
echo "=========================================="
echo " Correction"
echo "=========================================="
echo
# ------------------------------------------------------------
# Traitement de chaque fichier
# ------------------------------------------------------------
for FILE in "${FILES[@]}"; do
echo "Traitement : $FILE"
# --------------------------------------------------------
# Création d'une sauvegarde
# --------------------------------------------------------
#
# Le fichier original est conservé avec l'extension .bak.
#
# Exemple :
#
# dosbox.js
#
# devient :
#
# dosbox.js
# dosbox.js.bak
#
# --------------------------------------------------------
BACKUP="$FILE.bak"
# --------------------------------------------------------
# Évite d'écraser une sauvegarde existante
# --------------------------------------------------------
#
# Si .bak existe déjà, on ne le remplace pas.
#
# Cela évite de perdre la version originale si le script
# est exécuté plusieurs fois.
#
# --------------------------------------------------------
if [ ! -f "$BACKUP" ]; then
cp -p "$FILE" "$BACKUP"
echo " Sauvegarde : $BACKUP"
else
echo " Sauvegarde déjà présente : $BACKUP"
fi
# --------------------------------------------------------
# Compte le nombre d'occurrences avant modification
# --------------------------------------------------------
COUNT=$(grep -oF "$OLD" "$FILE" | wc -l)
echo " Occurrences trouvées : $COUNT"
# --------------------------------------------------------
# Effectue le remplacement
# --------------------------------------------------------
#
# sed -i modifie directement le fichier.
#
# "g" signifie que toutes les occurrences de la chaîne
# sont remplacées.
#
# --------------------------------------------------------
sed -i \
's/setWindowTitle!=="undefined"/setWindowTitle=="undefined"/g' \
"$FILE"
# --------------------------------------------------------
# Vérification après modification
# --------------------------------------------------------
if grep -Fq "$OLD" "$FILE"; then
echo " ERREUR : certaines occurrences sont encore présentes."
# Restauration automatique
cp -p "$BACKUP" "$FILE"
echo " Fichier restauré depuis la sauvegarde."
else
echo " OK : $COUNT occurrence(s) corrigée(s)."
fi
echo
done
# ------------------------------------------------------------
# Résumé final
# ------------------------------------------------------------
echo "=========================================="
echo " Terminé"
echo "=========================================="
echo
echo "Fichiers traités : ${#FILES[@]}"
echo
echo "Les fichiers originaux sont conservés avec l'extension .bak."
J’en ai informé l’auteur.
*** DOS / Système ***
Gladir.com
Programming MS-DOS with Power
Ralf Brown’s Interrupt List
Graphical programming in Assembly
*** C ***
256-Color VGA programming in C
PC Game Programmer’s Encyclopedia
The Atrevida PC Game Programming Tutorials
*** Pascal ***
SWAG : SourceWare Archive Group => allswags.zip (29/11/1997)
https://turbo-pascal.developpez.com
MS-DOS games and utilities
DOS-VGA-Game
*** Divers ***
X2 Support Group Game Development Archives (miroir)
flipcode Archives
VGA programming lessons
Afficher une image en VGA mode 13h
Michael Abrash’s Graphics Programming Black Book => Michael Abrash’s Graphics Programming Black Book
INT 10h
Article mis à jour le 15/07/2026
Machine cible : Samsung NC210 / DD 250 Go / RAM 2 Go.
Système à installer : FreeDOS 1.4 (05/04/2025).
Initialement, il y avait sur cette machine une version de Debian. Pour installer FreeDOS, il faut donc préparer le disque dur.
J’ai utilisé pour cela une version live de Debian :
Dans la console :
sudo fdisk /dev/sda Supprimer les partitions existantes (touche d). Ajouter une partition (touche n). Définir le format de partition (touche t) avec le code Hexa c : W95 FAT32 (LBA). Activer l'unique et nouvelle partition (touche a). Contrôler les modifications avant écriture (touche p). Écrire la nouvelle table de partitions (touche w).
Pour décompresser le fichier FD14-FullUSB.zip et récupérer FD14FULL.img :
unzip FD14-FullUSB.zip
J’ai ensuite gravé l’image de FreeDOS sur une clé USB avec Accessoires > Disques (gnome-disk-utility – Restaurer l’image disque…)
Une fois le système installé, pour pouvoir accéder à une clé USB, il faut, au niveau du BIOS mettre les priorités suivantes concernant le boot :
1 – SATA HDD (disque dur)
2 – USB HDD (clé USB)
Le disque dur sera accessible en tapant C: et la clé USB en tapant D: à condition d’avoir installé la clé avant le démarrage du système. Il n’est pas possible d’utiliser la clé USB de manière souple (l’enlever, la remettre).
Pour résoudre le problème lié à la touche Alt Gr, remplacer dans fdauto.bat (edit fdauto.bat) :
mkeyb FR par keyb FR
Official FreeDOS™ repositories at ibiblio
Pour installer des logiciels : FDIMPLES (très peu réactif sur mon NetBook)
ou plus directement :
d: cd packages\devel fdinst install watcomc.zip fdinst install nasm.zip cd ..\edit fdinst install fed.zip fdinst install uhex.zip
Outils de développement que j’installe :
Open Watcom C/C++ 1.9 => Lien intéressant pour l’installation
NASM 2.15.05 => Manuel en ligne
Turbo Pascal 7.0
Pour copier mon répertoire PERSO et ses sous-répertoires de D: vers C: :
xcopy d:\perso c:\perso /E
Rajouts personnels à la fin du fichier fdauto.bat (= autoexec.bat) :
REM *** OPEN WATCOM 1.9 *** PATH C:\DEVEL\WATCOMC\BINW;%PATH% SET INCLUDE=C:\DEVEL\WATCOMC\H SET WATCOM=C:\DEVEL\WATCOMC SET EDPATH=CC:\DEVEL\WATCOMC\EDDAT SET WIPFC=C:\DEVEL\WATCOMC\WIPFC REM *** TURBO PASCAL 7.0 *** PATH C:\TP7\BIN;%PATH% REM *** NASM 2.15.05 *** PATH C:\NASM;%PATH%
Pour compiler et créer un exécutable avec Watcom :
wcl hello.c
Liens :
DOS commands
Index of FreeDOS 1.2 on ibiblio.org
Chaine officiel YouTube de FreeDOS
BTTR Software
Dans le cadre du démarrage d’un nouveau projet scientifique et technique lié aux fusées, voici une page de liens intéressants sur le sujet :
Planète Sciences => Note technique Version 2.3
Les fusées à eau avec Papyjo
Go Mars
Lycée Naval : TPE fusées à eau
DUT Mesures Physiques Clermont-Ferrand : Rapport sur la fusée à eau
Forum Fuzeao
Air Command Water Rocket
U.S. Water Rockets
Matériel acheté :
Raccord pour fusée à eau