JS-DOS 6.22

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 retro coding

*** 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

Installation de FreeDOS sur un Netbook

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

Fusées à eau

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