Section courante

A propos

Section administrative du site

ALLOCATE_LDT_DESCRIPTORS

Alloue un descripteurs LDT
Free Pascal go32

Syntaxe

Function allocate_ldt_descriptors(count:Word):Word;

Paramètres

Nom Description
count Ce paramètre permet d'indiquer le nombre de descripteurs uniques demandés.

Retour

Valeur Description
entier Ces valeurs permettent d'indiquer un sélecteur de base.

Description

Cette fonction permet d'allouer un certain nombre de descripteurs.

Remarques

Exemple

  1. { Cet exemple démontre l'utilisation des descripteurs et les effets
  2. du changement de leur limite et de leur adresse de base.
  3. Plus en détail, le programme remplit la région décrite par un
  4. descripteur alloué dans la mémoire écran en mode texte avec divers
  5. caractères. Avant de faire cela, il sauvegarde l'intégralité du contenu
  6. de l'écran dans le tas et le restaure ensuite.
  7. Quelques informations supplémentaires :
  8. L'écran texte d'une carte VGA a son espace mémoire à l'adresse $B800:0 ;
  9. la mémoire écran est organisée de manière linéaire, c'est-à-dire que la
  10. deuxième ligne vient directement après la première, où chaque cellule
  11. occupe 2 octets de mémoire (1 octet pour le caractère, 1 octet pour
  12. les attributs). Elle a une taille de 32 Ko.
  13. Ainsi, le décalage d'une seule cellule mémoire par rapport à son origine est :
  14. Y * colonnes * 2 + X * 2
  15. où X et Y désignent le point, et colonnes est le nombre de cellules
  16. caractères par ligne.
  17. }
  18.  
  19. {$mode delphi}
  20.  
  21. Uses
  22.  Crt,go32;
  23.  
  24. Const
  25.   { Dimensions de l'écran en X et Y }
  26.  maxx = 80;
  27.  maxy = 25;
  28.   { Nombre d'octets utilisés pour chaque cellule de caractères }
  29.  bytespercell = 2;
  30.   { Taille de l'écran en octets }
  31.  screensize = maxx * maxy * bytespercell;
  32.  
  33.   { Adresse linéaire de $B800:0 }
  34.  linB8000 = $B800 * 16;
  35.  
  36. Type
  37.  string80 = string[80];
  38.  
  39. Var
  40.   { Contient l'ancien contenu de l'écran }
  41.  Text_Save:Array[0..screensize-1] of Byte;
  42.   { Anciennes coordonnées du curseur X et Y }
  43.  Text_oldx,Text_oldy:Word;
  44.  
  45.   { Sélecteur vers l'écran en mode texte }
  46.  Text_sel:Word;
  47.  
  48.  { Affiche un message d'état sur la première ligne de l'écran puis attend une pression de touche }
  49. Procedure status(s : string80);Begin
  50.  GotoXY(1, 1);
  51.  ClrEol;
  52.  Write(s);
  53.  ReadKey;
  54. End;
  55.  
  56.  { Affiche des informations sur le descripteur sur les 2 dernières lignes }
  57. Procedure selinfo(sel:Word);Begin
  58.  GotoXY(1, 24);
  59.  ClrEol;
  60.  WriteLn('Adresse de base du descripteur : $',hexstr(get_segment_base_address(sel), 8));
  61.  ClrEol;
  62.  Write('Limite du descripteur : ',get_segment_limit(sel));
  63. End;
  64.  
  65.  { Retourne une cellule de caractère de 2 octets, incluant les données du caractère et ses attributs de couleur }
  66. Function makechar(ch:char;color:byte):Word;Begin
  67.  makechar:=byte(ch) or (color shl 8);
  68. End;
  69.  
  70. BEGIN
  71.   { Sauvegarde le contenu original de l'écran dans une variable, cette fois en utilisant seg_move() et la variable dosmemselector }
  72.  seg_move(dosmemselector, linB8000, get_ds, longint(@text_save),screensize);
  73.   { Nous devons également sauvegarder les anciennes coordonnées du curseur sur l'écran }
  74.  text_oldx := WhereX; 
  75.  text_oldy := WhereY;
  76.   { Efface entièrement l'écran }
  77.  seg_fillword(dosmemselector, linB8000, screensize div 2,
  78.  makechar(' ', Black or (Black shl 4)));
  79.   { Affiche un message }
  80.  status('Création du sélecteur ''text_sel'' pour une partie de la mémoire écran en mode texte');
  81.   { Alloue un descripteur }
  82.  text_sel := allocate_ldt_descriptors(1);
  83.   { Définit son adresse de base à l'adresse linéaire de l'écran texte la taille en octets d'une ligne (=maxx * bytespercell * 1) }
  84.  set_segment_base_address(text_sel,linB8000 + bytespercell * maxx * 1);
  85.   { Définit la limite à la taille de l'écran réduite d'un octet (obligatoire) et du nombre de lignes à ne pas modifier (première ligne + les 2 dernières lignes) }
  86.  set_segment_limit(text_sel, screensize - 1 - bytespercell *  maxx * 3);
  87.   { Affiche les informations du descripteur }
  88.  selinfo(text_sel);
  89.  status('et effacement de toute la mémoire sélectionnée par le descripteur ''text_sel''');
  90.   { Remplit toute la mémoire sélectionnée avec des caractères uniques }
  91.  seg_fillword(text_sel, 0, (get_segment_limit(text_sel)+1) div 2,makechar(' ', LightBlue shl 4));
  92.  status('Remarquez que seule la mémoire décrite par le descripteur a changé, rien d''autre');
  93.  status('Réduction maintenant de sa limite et de sa base, et définition de sa mémoire décrite');
  94.   { Modifie l'adresse de base du descripteur (l'augmente de la taille en octets d'une ligne) }
  95.  set_segment_base_address(text_sel,get_segment_base_address(text_sel) + bytespercell * maxx);
  96.   { Réduit la limite de la taille en octets de 2 lignes (1 ligne car l'adresse de base a changé, une autre ligne en bas) }
  97.   set_segment_limit(text_sel,get_segment_limit(text_sel) - bytespercell * maxx * 2);
  98.   { Affiche les informations du descripteur }
  99.  selinfo(text_sel);
  100.  status('Remarquez que l''adresse de base a augmenté d''une ligne mais que la limite a diminué de 2 lignes');
  101.  status('Cela devrait vous donner un indice sur le fait que la limite est relative à la base');
  102.  { Remplit la zone du descripteur }
  103.  seg_fillword(text_sel, 0, (get_segment_limit(text_sel)+1) div 2,makechar(#176, LightMagenta or Brown shl 4));
  104.  status('Maintenant, faisons quelque chose de plus fou : ' +
  105.         'copier 10 lignes de données de l''écran précédemment sauvegardé');
  106.   { Copie la mémoire du segment de données vers l'écran }
  107.  seg_move(get_ds, longint(@text_save), text_sel,maxx * bytespercell * 2, maxx * bytespercell * 10);
  108.  status('Enfin, libération du descripteur et restauration du contenu de l''écran...');
  109.  status('J''espère que ce petit programme vous donnera des ' +
  110.          'indices sur la manipulation des descripteurs');
  111.   { Libère le descripteur pour qu'il puisse être utilisé pour autre chose }
  112.  free_ldt_descriptor(text_sel);
  113.   { Restaure l'état précédent }
  114.  seg_move(get_ds, longint(@text_save), dosmemselector,linB8000, screensize);
  115.  GotoXY(text_oldx, text_oldy);
  116. END.
  117.  


Dernière mise à jour : Dimanche, le 23 Août 2020