Ajouter ce site au Favoris Imprimer cette page  
 
 
     
     
     
   
 
         
  Portions de programmes utiles  
         
 

@100: JMP 10B                              ;pour sauter la zone de données
@102: DB 'bardosoft',A,D,'$' ;on va écrire bardosoft et sauter une ligne (A=010 D=013)
@10B: MOV DX, 102                     ;met l'adresse de la chaîne de caractères dans DX
MOV AH, 9                                       ;sélection de la fonction 9
INT 21                                              ;appel de la fonction 9 de l'interruption DOS 21

 
Ecrire une chaîne de caractère
     

MOV AX, 0600h
MOV BH, 23h ;couleur
XOR CX, CX
MOV DX, 184Fh
INT 10h         ;fait un CLS

Effacer l'ecran
     

MOV AX, 0B800h ; segment du buffer vidéo
MOV ES, AX          ; ES := B800
MOV DI, 80          ; va en haut et milieu (2*40)
MOV AH, 02h       ; écrit avec l'attribut couleur vert
MOV AL, 'I'       ; écrit la lettre I
MOV ES:[DI], AX

Ecrire en utilisant la mémoire vidéo
     

MOV BX, 80                ;car les paramètres commencent à l'adresse 81 du PSP
INC BX                         ;on incrémente BX (cette ligne est à l'adresse 103)
MOV DL, BYTE[BX] ;on met dans DL l'octet présent à l'adresse BX
MOV AH, 2                 ;sélection de la fonction 2
INT 21                       ;appel de la fonction 2 de l'interruption DOS 21: affichage à l'écran
CMP DL, D                ;on compare DL à Dh donc à 013 en ASCII, code de entrée
JNE 103         ;si on n'est pas en fin de ligne, on continue à incrémenter BX

Voir les paramètres passés au programme
     

MOV AL, D4 ;retourne l'erreur D4h = errorlevel 212
MOV AH, 4C
INT 21 ;on retourne sous DOS

Retourner un code d'erreur à DOS
     

MOV BX, 40
MOV DS, BX ;DS reçoit 40
MOV BX, 1234
MOV [72], BX ;0040:0072 := 1234 (on n'effectue pas de test de mémoire; 0 = on l'effectue)
JMP FFFF:0000 ;on exécute un boot

Rebooter l'ordinateur à chaud: ne marche pas dans une fenêtre DO S
     

JMP FFFF:0000 ;on exécute un boot

Rebooter l'ordinateur à froid: ne marche pas dans une fenêtre DOS
     
JMP 100 ;on fait une boucle infinie (code 0235 0254)
Planter l'ordinateur
     

MOV DL, 7 ;le code ASCII du carac est 7 (donc, un bip sonore)
MOV AH, 2 ;sélection de la fonction 2
INT 21 ;appel de la fonction 2 de l'interruption DOS 21

Emettre un bip
     

MOV BX, 0202 ;BX reçoit la fréquence en Hz
MOV AX, 34DD ;prépare pour la division
MOV DX, 0012 ;prépare pour la division
DIV BX              ;AX reçoit DX:AX / BX
MOV BX, AX ;BX reçoit la fréquence compréhensible par l'ordinateur
IN AL, 61 ;on désactive la vérification de parité de la RAM (gagne en vitesse)...
OR AL, 03 ;..., on active le buzzer et...
OUT 61, AL ;...on associe le compteur 2 au buzzer
MOV AL, B6 ;on sélectionne le compteur 2, en binaire, pour générer un signal carré...
OUT 43, AL ;...et on va envoyer le LSB puis le MSB (tout ça est contenu dans B6 !)
MOV AL, BL ;on envoie ...
OUT 42, AL ;...le LSB de BX au compteur 2 (port 42)...
MOV AL, BH ;...puis ...
OUT 42, AL ;...le MSB de BX au compteur 2 (port 42)
MOV AH, 0 ;on attend...
INT 16 ;...l'appui sur une touche
IN AL ,61 ;on...
AND AL, FC ;...déactive (FC <==> /03)...
OUT 61, AL ;...le buzzer, réactive le contrôle de parité,...

Emettre une fréquence
     

MOV AX, 0C00 ;sélection de la fonction C, sous fonction 0
INT 21 ;appel de la fonction C-0 de l'interruption DOS 21

Vider le buffer
     

MOV AH, 0 ;sélection de la fonction 0
INT 16 ;appel de l'interruption BIOS 16: dans AH, retourne le code de pression de la touche et dans AL, retourne le code ASCII correspondant
MOV AH, 8 ;sélection de la fonction 8: pas d'affichage à l'écran (fonction 1: affichage)
INT 21 ;appel de la fonction 8 de l'interruption 21: dans AL, renvoie le code ASCII
CMP AL, ;55 on attend l'appui sur le u (code ascii de 55)
JNE 100 ;tant que l'on n'a pas pressé, on boucle

Attendre l'appui sur une touche
     

MOV AH, B ;sélection de la fonction B
INT 21 ;appel de la fonction B de l'interruption DOS 21 (AL renvoie 0 ou FF)
MOV AH, 6 ;sélection de la fonction 6
MOV DL, FF ;obligatoire pour faire fonctionner cette fonction
INT 21 ;appel de la fonction 6: ZF = 1 et AL = 0 si pas de caractère sinon: ZF = 0 et AL caractère lu

Voir si une touche a été appuyée
     

MOV AH, 2A ;sélection de la fonction 2A
INT 21 ;appel de la fonction 2A de l'interruption DOS 21 (AH renvoie le jour de la semaine, DL la date, DH le mois et CX l'année)

Connaître la date
     

MOV AH, 2C ;sélection de la fonction 2C
INT 21 ;appel de la fonction 2C de l'interruption DOS 21 (CH reçoit l'heure, CL les minutes, DH les secondes et DL les centièmes)

Connaître l'heure
     

@100: JMP 103
@102: DB 0 ;on réserve un octet
@103: MOV AH, 2C ;sélection de la fonction 2C
@105: INT 21 ;appel de la fonction 2C de l'int21 (DH reçoit les secondes)
@107: ADD DH, A ;on ajoute 10 aux secondes
@10A:CMP DH, 3C ;on compare le résultat à 60
@10D:JL 112 ;s'il est inférieur, on saute
@10F: SUB DH, 3C ;sinon, on enlève 60
@112: MOV [102], DH ;on met ce résultat à l'adresse 102
@116: INT 21 ;appel de la fonction 2C de l'int21 (DH reçoit les secondes)
@118: CMP DH, [102] ;on compare l'heure courante à la valeur de l'adresse 102
@11C: JNE 116 ;si on n'a pas atteind les 10 secondes, on continue

Attendre 10 secondes
     

MOV AX, 0
INT 1A ;dans CX:XD: la valeur du compteur incrémenté chaque 1/18,2 sec
ADD BX, DX ;BX reçoit la valeur à atteindre
@I: INT 1A
CMP BX, DX
JNE @I

Attendre BX/18,2 secondes
     

@100: MOV AX, 2524 ;on redirige l'interruption 24 (erreurs critiques)...
@103: MOV DX, 113 ;... à l'adresse 113
@106: INT 21
@108: MOV AH, 1C ;on va lire les infos du lecteur...
@10A:MOV DL, 1 ;... 1 (cad A:) (0 = défaut ; 2 = B: ; ...)
@10C: INT 21
@10E: MOV AX,4C00 ;si fin normale
@111: INT 21
@113: MOV AX,4C01 ;si on a eu une erreur critique (dans notre cas: on ...
@116: INT 21 ;... n'a pas pu lire sur le disque)

Voir si un lecteur est prêt
     

MOV AX, 3305 ;sélection de la fonction 33, sous fonction 5
INT 21 ;appel de la fonction 33-05 de l'interruption 21 (DL renvoie 1= a:, 3 = c:)

Savoir sur quel disque on a booté
     

MOV AH, 1B ;sélection de la fonction 1B
INT 21 ;appel de la fonction 1B de l'interruption DOS21
MOV AL, [BX] ;AL reçoit F0=1M44 F8=disque_dur F9=720kou1M2 FC=180k FD=360k

Connaître le type du disque par défaut
     

JMP installe
; ... ici le coeur du programme restant en mémoire (exemple: ancien23 et nouvo23)
installe:
; ... ici, on prépare (exemple: redirection de l'interruption 23)
MOV DX, OFFSET installe ; DX := taille en octets du programme résident
MOV CL, 4
SHR DX, CL ; DX := le nombre de paragraphes du prog. résident
INC DX ; on prend une marge de sécurité
MOV AX, 3100h ; fonction de TSR
INT 21h ; on est résident

Programme qui reste résident en mémoire (TSR: Terminate and Stay Resident )
     

PRINT PROC NEAR
MOV SI, debut_ou_imprimer
MOV CX, nombre_de_caractères_à_imprimer
MOV AH, 2
XOR DX, DX ; sélection de l'imprimante 0
INT 17h ; renvoie l'état de l'imprimante dans AH
TEST AH, 10000000B ; si busy
JZ PRINT_DONE
TEST AH, 00100000B ; si out of paper
JNZ PRINT_DONE
PRINT_LOOP:
LODSB ; AL := carac
XOR AH,AH ; AH := 0
INT 17h ; imprime
ROR AH, 1 ; vérifie le bit de time out
JC PRINT_DONE ; s'il est mis, on arrête
LOOP PRINT_LOOP
PRINT_DONE:
RET
PRINT ENDP

Imprimer
     

masection SEGMENT PUBLIC
ASSUME CS:masection, DS:masection
ORG 100H ; origine du programme
pgm:
JMP debut
segbuf DW 0
longfic DW 0
erreur DB "Erreur en ouvrant `ANSI.TXT'$"
fichier DB "ANSI.TXT", 0
debut:
MOV BX, SS ; réserve suffisament de place dans la pile ...
ADD BX, 300h ; ... pour ne pas écraser le programme courant
MOV [segbuf], BX
CALL affiche
MOV AX, 4C00h
INT 21h

affiche PROC NEAR
MOV AX, 3D00h ; fonction ouvre fichier
MOV DX, OFFSET fichier ; nom du fichier
INT 21h
JC err ; erreur d'ouverture
MOV BX, AX ; BX := handle du fichier
MOV DS, [segbuf]
MOV DX, 0 ; le buffer est en [segbuf]:0000
MOV AH, 3Fh ; fonction lire
MOV CX, 0FFFFh ; on va essayer de tout lire
INT 21h ; on lit et on met dans le buffer
MOV CS:[longfic], AX ; nombre d'octets lus
MOV AH, 3EH ; fonction fermer fichier
INT 21h ; on ferme le fichier
CLD ; direction du LODSB
MOV SI, 0
MOV CX, CS:[longfic]
boucle: MOV AH, 2 ; fonction écrire
LODSB ; AL := saisiecarac dans buffer
MOV DL, AL
INT 21h ; affiche un caractère
DEC CX
JNE boucle
RET
err:
MOV AH, 9
MOV DX, OFFSET erreur
INT 21h
RET
affiche ENDP
masection ENDS ; fin de la section
END pgm

Afficher le contenu d'un fichier
     

@100 JMP 103
@102 DB 0 ;réserve 1 octet
MOV [103], DL ;on sauve DL

sauver une variable en mémoire
     

MOV AX, 0013h ; 0003h pour retourner en mode texte
INT 10h

Passer en mode VG A
     

MOV AH, 0Ch
MOV AL, [adrcouleur]
MOV CX, [adrx]
MOV DX, [adry]
MOV BX, 1
INT 10h

Ecrire un pixel
     

PUSH ES
MOV CX, 32000
MOV ES, [A000]
XOR DI, DI
MOV AL, [acouleur]
MOV AH, AL
REP STOSW
POP ES

Effacer l'écran
     

MOV AX, 13 ;passe en mode graphique
INT 10
MOV AL, 4 ;couleur du point
MOV CX, 100 ;colonne 100
MOV DX, 200 ;ligne 200
MOV AH, 0Ch ;sélection de la fonction C
INT 10 ;appel de la fonction C de l'interruption BIOS 10
XOR AX, AX ;pour attendre une touche pressée
INT 16 ;attend la touche
MOV AX, 3 ;repasse en mode texte
INT 10

Afficher un point
       
 
[ home ] [ <- précédant ] [ suivant -> ]