QBasic – La mémoire
- QBasic – Introduction au QBasic
- QBasic – Ecrire sur l’écran
- QBasic – Mathématiques élémentaires
- QBasic – La ponctuation (syntaxe)
- QBasic – Les variables
- QBasic – Les commentaires
- QBasic – Les constantes
- QBasic – Entrée de données
- QBasic – Les boucles inconditionnelles
- QBasic – Les boucles conditionnelles
- QBasic – Structure conditionnelle
- QBasic – Les cas
- QBasic – Maths, logique et divers
- QBasic – Le texte
- QBasic – Le son
- QBasic – Dessiner
- QBasic – Sous-programmes, fonctions et procedures
- QBasic – Les types de variables
- QBasic – Les tableaux
- QBasic – Les types personalisés
- QBasic – L’organisation des données
- QBasic – QBasic et le système d’exploitation
- QBasic – L’accès aux fichiers
- QBasic – Le traitement des erreurs
- QBasic – La manette de jeu
- QBasic – Encore plus loin dans le graphisme
- QBasic – La mémoire
- QBasic – Le langage machine et la souris
- QBasic – L’heure, la date, le temps
- QBasic – Le clavier
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èsavoir fait appel à
BSAVE, on a utilisé de nouveau DEF SEG. Comme on nelui 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 iDIM Monstre(200) AS INTEGER
GET(1, 1)-(20, 20), Monstre ‘ Capture du monstreSegMonstre = 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 maintenantdes 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écedentSCREEN 7
CLS
PUT (1, 1), Image