Langage

(uses Dos;)

Constantes:
    const nomConstante = valeur; 

Types:
    Boolean
    Registers [registre virtuel]
          AH, AL, Flags

Variables:
    var nomVariable: typeVariable;    

Valeurs:
    Hexadécimal : $HH;    
    
Affectation:
    nomVariable := valeur;

Boucle avec with:
    begin with nomVariable do begin
         instructions;
    end     

Condition:
    Opérateur:
        and, =, 

Fonctions:
    function nomFonction : typeRetour;
        nomFonction := valeurRetour;
    end;

    procedure nomProcedure (nomParam: typeParam) : typeRetour;
    
    end;
Fonctions de conversions:   
    Char(entier) : converti un entier en caractère (retour Char) 
    
Fonctions définies (dos)
    Intr(interruption [integer], registre [Registers])

Exemple

(uses Dos;)
const MasqueFlagsCF = 1; { Masque pour isoler le bit CF des flags } (1)

function TouchPresse : Boolean;
var Regs: Registers; (2)
begin with Regs do begin
 AH := $01; { Fonction 01h: Vérification de la présence d'une touche }
 Intr ($16,Regs); (3)
 TouchPresse := (Flags and MasqueFlagsCF = MasqueFlagsCF); (1)
end end;

function LitTouche : Char;
var Regs: Registers; 
begin with Regs do begin
 AH := $00; { Fonction 00h : Lecture d'une touche }
 Intr ($16,Regs);
 if AL=0 then (4)
  LitTouche := Char(AH or 128) (5)
 else
  LitTouche := Char(AL);
end end;

Analyse :

  1. Le type Registre (2) nous met à disposition les Flags, met dans un mot d'ensemble (Word). Pour isoler le flag CF (bit #0), on utilisera le truc : "if Flags and MASQUE = MASQUE" où MASQUE est une puissance de 2, la puissance est la position du bit (en partant de zéro). CF étant à la position 0 (bit #0), le MASQUE est donc 1 (2^0).
  2. Pour appeler une interruption, Turbo Pascal nous met à disposition (par l'unité DOS) le type "Registers" qui permet d'accéder de façon virtuelle aux registres. Virtuelle car celà ne modifie par directement les registres, les registres sont tous envoyés comme "paramètre", puis sont lus après l'appelle de "Intr" (3) (appelle d'une l'interruption).
  3. Enfin pour appeler une interruption, on utilise la fonction "Intr" avec comme paramètre le numéro de l'interruption et les registres. Ici on utilise la fonction 00h de l'interruption 16h. Celle-ci retourne dans AL le code ASCII de la touche et AH contient le code étendu de la touche (si AL=0).
  4. Pour savoir si une touche est étendue, on vérifie que AL = #0.
  5. Pour ajouter 128 à la valeur de la touche étendue, on peut également faire "OR 128", celà pose dans tous les cas le bit #7 de AH. Ca ne fonctionne que pour les puissances de 2 (1, 2, 4, 8, 16, 32, 64, 128, 256, ...).