![]() ![]() ![]() |
Je vous rappel que la bibliothèque Kernel utilise aussi les handles pour exécuter des programmes Fargo.
![]() ![]() ![]() |
Comme nous venons de le voir, un pointeur (adresse) est associé à chaque handle. Malheureusement ce pointeur est succeptible de changer quand d'autres blocs sont détruit ou redimensionnés, ce qui peut être fatal lors de l'exécution d'un programme Fargo car le retour d'un saut pourrais ne pas se faire au bon endroit.
David Ellsworth va résoudre ce problème dans la prochaine version de Fargo en chargeant les programmes Fargo en mémoire statique (à priori au sommet de la RAM avant les adresse de tios.h et le kernel), par conséquent que des blocs mémoire soient supprimés ou redimmensionnés ne changera en rien la position de notre programme.
Les pointeurs dont nous venons de parler sont contenu dans une table pointée par la variable tios::Heap de la bibliothèque TIOS.
Pour trouver l'adresse (type double mot ) d'un bloc il faut utiliser la formule suivante :
adresse = tios::Heap + handle * 4
![]() ![]()
|
Un bloc mémoire commençant tout le temps par sa taille (type mot), l'adresse du prochain bloc mémoire (et non du prochain handle comme ils sont disposés anarchiquement) est connue par la formule :
prochaine_adresse = adresse + (adresse).w * 2
La liste est terminée quand prochaine_adresse vaut 0.
![]() ![]() ![]() |
Ces handles sont toujours présent et ne sont jamais détruits, David Ellsworth conseille fortement de ne pas utiliser les handles systèmes !
A priori il n'y a pas de problème si vous utilisez les blocs mémoire de la table d'allocation de variable ou des écrans GRAPH et PrgmIO mais étant donné que leur contenu est modifié, pensez à les initialiser (effacer l'écran) de sorte à ne pas avoir un affichage bizarroïde par la suite ;o)
Voici les fonctions relatives à chaque handle système :
$0000 | $000B | : table d'allocation des dossiers | |
$0001 | $000C | : table d'allocation des variables de MAIN | |
$0002 | $000D | ||
$0003 | $000E | : entrée courante dans l'écran HOM | |
$0004 | $000F | : écran PrgmIO (239x103) | |
$0005 | $0010 | ||
$0006 | $0011 | ||
$0007 | $0012 | ||
$0008 | $0013 | : écran Graph (239x103) | |
$0009 | $0014 | ||
$000A | : contenu du presse-papier |
![]() ![]() |
@0002 | HeapFree détruit un handle |
@000B | HeapFreeIndir détruit et efface un handle |
@0022 | HeapAllocThrow crée un handle |
@0003 | HeapAlloc crée un handle |
@000E | HeapRealloc redimensionne un handle |
Zguide © 1998 - 1999 par Florian DREVET. Tous droits réservés