Accueil > QBasic > QBasic – La mémoire

QBasic – La mémoire

This entry is part 27 of 30 in the series QBasic - Tutoriel

Bien que le langage Basic fut créé pour faciliter la vie du programmeur en occultant une partie
des opérations fastidieuses, comme la gestion des adresses mémoire, QBasic posséde néanmoins quelques
fonctions permettant un accès plus ou moins direct au coté obscur de l’ordinateur.

Par exemple, on peut copier une partie de la mémoire dans un fichier, dans le but de réutiliser
ces données utlérieurement. Où est l’utilité ? On peut par exemple stocker une image dans un fichier.
Pour illustrer tout ça, nous allons reprendre le petit monstre de la dernière fois. Mais nous allons
nous arrêter à son stockage en mémoire avec GET.

Sans rentrer dans la chasse gardée de l’assembleur, il faut savoir qu’un emplacement de la mémoire
est défini par un segement et un offset. Il y a en tout 65 535 segments dans la
mémoire.

Vous savez qu’une variable est en fait un emplacement de la mémoire. Pour trouver le segment d’une
variable, on utilise la fonction VARSEG qui retourne le segment correspondant à la variable.
Ainsi, pour trouver le segment au quel appartient le tableau Monstre, on écrira :


SegMonstre = VARSEG(Monstre(0)) ‘ Renvoi le segment du tableau Monstre

Comme c’est un tableau, il ne faut pas oublier de spécifier le 0 entre parenthèses. Sinon, QBasic
va croire que c’est une autre variable.

Ensuite, pour connaître l’offset d’une variable, on utilise la fonction VARPTR. Ce qui
donne :

SegMonstre = VARSEG(Monstre(0)) ‘ Renvoi le segment du tableau Monstre
OffMonstre = VARPTR(Monstre(0)) ‘ Renvoi l’offset du tableau Monstre

Maintenant, on va pouvoir enregistre notre monstre, qui est pour l’instant en mémoire, dans un fichier.
Mais avant, il faut définir le segment de travail. Sinon, QBasic risque d’enregistrer une partie
de la mémoire d’un segment qui n’a rien à voir avec le monstre.

Pour définir le segment, on utilise bétement et simplement l’instruction DEF SEG, suivi
du segment à utiliser. Notre segment, on l’a définit avant, dans la variable SegMonstre.
Donc :

SegMonstre = VARSEG(Monstre(0)) ‘ Renvoi le segment du tableau Monstre
OffMonstre = VARPTR(Monstre(0)) ‘ Renvoi l’offset du tableau Monstre
DEF SEG = SegMonstre ‘ On définit le segment de travail

Ça y est, cette fois le monstre est près a etre enregistrer au chaud dans un fichier.
Pour enregistrer une partie de la mémoire, on utilise l’instruction BSAVE. La syntaxe de
cette instruction est :

BSAVE Fichier$, Offset, Taille

On l’a vu, l’offset est stockée dans la variable OffMonstre. Ensuite, pour la taille,
c’est le nombre d’octets occupés par l’image, c’est à dire 400 :

SegMonstre = VARSEG(Monstre(0)) ‘ Renvoi le segment du tableau Monstre
OffMonstre = VARPTR(Monstre(0)) ‘ Renvoi l’offset du tableau Monstre
DEF SEG = SegMonstre ‘ On définit le segment de travail
BSAVE « C:\Monstre.img », OffMonstre, 200 ‘ On enregistre le monstre dans un fichier
DEF SEG ‘ On revient au segment précedent

L’image est donc stockée dans le fichier C:\Monstre.img. Vous remarquez qu’après
avoir fait appel à BSAVE, on a utilisé de nouveau DEF SEG. Comme on ne
lui a pas attribué de valeur, QBasic retourne au segment précedent, avant nos petites interventions.
Le programme complet, c’est à dire avec le dessin du monstre et son enregistrement, donne :

SCREEN 7 ‘ 320 x 200
CLS
FOR i = 1 TO 20
FOR j = 1 TO 20
READ Couleur ‘ On lit la couleur du pixel…
PSET(j, i), Couleur ‘ …puis on l’affiche
NEXT j
NEXT i

DIM Monstre(200) AS INTEGER
GET(1, 1)-(20, 20), Monstre ‘ Capture du monstre

SegMonstre = VARSEG(Monstre(0)) ‘ Renvoi le segment du tableau Monstre
OffMonstre = VARPTR(Monstre(0)) ‘ Renvoi l’offset du tableau Monstre
DEF SEG = SegMonstre ‘ On définit le segment de travail
BSAVE « C:\Monstre.img », OffMonstre, 200 ‘ On enregistre le monstre dans un fichier
DEF SEG ‘ On revient au segment précedent

‘ Ci dessous, c’est mon monstre
DATA 00, 00, 00, 00, 00, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 04, 04, 04, 00, 04, 04, 00, 04, 04, 04, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 04, 04, 00, 00, 02, 02, 00, 00, 04, 04, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 04, 00, 00, 02, 02, 02, 02, 00, 00, 04, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 00, 00, 02, 02, 02, 02, 02, 02, 00, 00, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 00, 02, 02, 14, 02, 02, 14, 02, 02, 00, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 00, 02, 02, 14, 02, 02, 14, 02, 02, 00, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 00, 02, 02, 02, 02, 02, 02, 02, 02, 00, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 00, 00, 02, 02, 06, 06, 02, 02, 00, 00, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 00, 00, 00, 02, 02, 02, 02, 00, 00, 00, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 00, 00, 00, 00, 02, 02, 00, 00, 00, 00, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 00, 00, 00, 02, 02, 02, 02, 00, 00, 00, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 00, 00, 02, 02, 01, 01, 02, 02, 00, 00, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 00, 02, 02, 01, 01, 01, 01, 02, 02, 00, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 00, 02, 02, 01, 01, 01, 01, 01, 01, 02, 02, 00, 00, 00, 00, 00
DATA 00, 00, 00, 00, 02, 02, 01, 01, 01, 01, 01, 01, 01, 01, 02, 02, 00, 00, 00, 00
DATA 00, 00, 00, 02, 02, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 02, 02, 00, 00, 00
DATA 00, 00, 02, 02, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 02, 02, 00, 00
DATA 00, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 00
DATA 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02


Maintenant, nous allons voir comment utiliser ce fichier. Pour cela, nous allons carrement créer
un nouveau programme.

Nous allons tout d’abord définir un tableau, de la même taille que le tableau monstre, c’est à
dire de 200 :

DIM Image(200) AS INTEGER ‘ Tableau utilisé pour stocker l’image

Ensuite, il faut connaitre le segment de ce tableau, ainsi que son offset :

DIM Image(200) AS INTEGER ‘ Tableau utilisé pour stocker l’image
SegImage = VARSEG(Image(0)) ‘ Segment du tableau
OffImage = VARPTR(Image(0)) ‘ Offset du tableau

Puis, on charge l’image avec BLOAD. La syntaxe de cette instruction est :

BLOAD Fichier$, Offset

Il ne faut pas non plus oublier de préciser le segment à utiliser. Cela donne :

DIM Image(200) AS INTEGER ‘ Tableau utilisé pour stocker l’image
SegImage = VARSEG(Image(0)) ‘ Segment du tableau
OffImage = VARPTR(Image(0)) ‘ Offset du tableau
DEF SEG = SegImage ‘ On définit le segment
BLOAD « C:\Monstre.img », OffImage ‘ On charge l’image du fichier en mémoire
DEF SEG ‘ On revient au segment précedent

Maintenant, il faut afficher l’image avec PUT. Mais pour cela, vous êtes maintenant
des experts… Le programme complet donne :

DIM Image(200) AS INTEGER ‘ Tableau utilisé pour stocker l’image
SegImage = VARSEG(Image(0)) ‘ Segment du tableau
OffImage = VARPTR(Image(0)) ‘ Offset du tableau
DEF SEG = SegImage ‘ On définit le segment
BLOAD « C:\Monstre.img », OffImage ‘ On charge l’image du fichier en mémoire
DEF SEG ‘ On revient au segment précedent

SCREEN 7
CLS
PUT (1, 1), Image

Series Navigation«QBasic – Encore plus loin dans le graphismeQBasic – Le langage machine et la souris»
Categories: QBasic Tags:
  1. Dewil
    14/11/2010 à 15:55 | #1

    Bonjour,
    Je n’ai rien compris. Je voudrais faire afficher une image bmp, jpg, jped ou autre dans un executable.
    Qui pourrait m’aider ?
    Merci d’avance

  1. Pas encore de trackbacks