Search this site
Embedded Files
Mon BBC SDL pas à pas
  • Accueil
  • BBC BASIC
  • BBC OS
  • BBC MODULES
  • RUBRIQUES
  • LIENS
Mon BBC SDL pas à pas
  • Accueil
  • BBC BASIC
  • BBC OS
  • BBC MODULES
  • RUBRIQUES
  • LIENS
  • More
    • Accueil
    • BBC BASIC
    • BBC OS
    • BBC MODULES
    • RUBRIQUES
    • LIENS

⇨ MENU ⇨ BBC BASIC

CALL

DESCRIPTION.


L'instruction CALL suspend l'application en cours, charge et exécute un script BBC BASIC et reprends la cours normal de l'application, ou appelle une routine en code machine.




SYNTAXE.


CALL fichier$

CALL routine , variablea , variablea , ... , variablen




REMARQUES.


fichiers$ doit être un nom de fichier valide et existant, avec l’extension .bbc.


routine doit être une adresse mémoire, un script en langage machine, une commande de l'OS, ...


variablea , variablea , ... , variablen, doit être ...



1. Charger un script BBC BASIC.


La forme CALL fichier$ va : 

- suspendre l’exécution de l'application principale ; 

- charger et mémoriser le script secondaire présent dans fichier$ :

- exécuter le script secondaire ;

- effacer de la mémoire le script secondaire ;

- reprendre l'exécution de l'application principale.


Le script secondaire, contenu dans  fichier$ rend la main à l'application principale s'il : 

- est terminé ; 

- rencontre une instruction RETURN ; 

- est interrompu.


Si une erreur non gérée est levée durant l'exécution d'un script secondaire, l'application principale sera, elle aussi arrêtée.


Le script secondaire, contenu dans fichier$, peut contenir une ou plusieurs instructions CALL, mais elle ne doit pas contenir : 

- de définition de procédures personnalisée, c'est-à-dire d'instruction DEF PROC / ENDPROC ;

- de définition de fonction personnalisée, c'est-à-dire d'instruction DEF FN ;

- d'instruction INSTALL.


Note : pour charger et utiliser, dans l'application principale, des procédures et/ou des fonctions personnalisées, on utilisera l'instruction INSTALL fichier$, où fichier$ ne doit contenir que des définitions de procédures et/ou des fonctions personnalisées.


Si le script contenu dans fichier$ contient des numéros de ligne et/ou les libellés, ils seront ignorés.


fichier$ doit être exprimé de façon absolue, c'est-à-dire qu'il doit contenir le chemin complet, répertoire et extension. Cependant, on pourra avoir recours aux variables système :  

CALL @lib$ + fichier$, si fichier$ se trouve dans le répertoire des bibliothèques BBC BASIC.

CALL @dir$ + fichier$, si fichier$ se trouve dans le même répertoire que votre application.


On placera fichier$ dans le répertoire lib du BBC BASIC, retournée par la valeur de @lib$, si on souhaite utiliser son script pour plusieurs applications différentes sur sa machine, et dans le répertoire de l'application elle-même, retournée par la valeur de @dir$, si on désire pouvoir le partager et l'utiliser sur d'autres machines.


Les instructions CALL et INSTALL permettent de créer des fichiers de ressources qui pourront être utilisés ou partagés entre plusieurs programmes, plutôt que de les intégrer dans chacun de ces scripts. Cette pratique réduit la taille des scripts et de leur maintenance. On pourra, ainsi, constituer une bibliothèque de ressources personnalisée. 




2. Charger une routine.


La forme CALL routine , variablea , variablea , ... , variablen va : 


Pour reprendre le déroulement de l'application principale, la routine en code machine doit se terminer par une instruction RET.


Lors de l'utilisation de l'instruction CALL, les six premiers paramètres du processeur, tels que spécifiés par l'ABI (Application Binary Interface) recevront, respectivement les valeurs des variables statiques A%, B%, C%, D%, E% et F%. Sauf sur les machines ayant un processeur x86 32 bits, dans ce cas le registre : 

- EAX, sera initialisé avec la valeur de la variable statique A% ;

- EBX, sera initialisé avec la valeur de la variable statique B% ;

- ECX, sera initialisé avec la valeur de la variable statique C% ;

- EDX, sera initialisé avec la valeur de la variable statique D% ;

- des indicateurs du processeur sera initialisé avec la valeur de la variable statique F%.


Note : sur les machines ayant un processeur x86 32 bits,  il n'est pas possible de désactiver les interruptions, ni de passer en mode pas à pas, en modifiant la valeur de la variable statique F%, car cela perturberait gravement le bon fonctionnement du système d'exploitation de la machine.


Les instructions CALL et USR() font des comportements différemment avec l'utilisation d'adresses comprises entre &FF00 et &FFFF.



A l'appel d'une instruction CALL, une table contenant les détails des paramètres est créée en RAM. Le pointeur de base, registre EBP, sera défini sur l'adresse mémoire de cette table de paramètres pour les machines ayant un processeur x86 32 bits. Pour les autres types de processeurs, le septième paramètre, spécifié par l'ABI correspondante, sera défini sur l'adresse mémoire de la table de paramètres.


Note : les variables incluses dans la liste de paramètres n'ont pas besoin d'être déclarées avant l'appel de l'instruction CALL. 

A l'entrée de la sous-routine, la table des paramètres contient les valeurs suivantes :

- nombre de paramètres : 1 octet ;

- type de paramètre : 1 octet ;

- adresse du paramètre : 4 ou 8 octets ;

- type de paramètre : répété aussi souvent ;

- adresse du paramètre : si nécessaire.


L'adresse du paramètre donnée est l'adresse absolue à laquelle l'élément est stocké, dans les formats suivants :

- les variables d'octets sont sous la forme d'un seul octet non signé ;

- les entiers sont au format complément à deux, l'octet le moins significatif est en premier ;

- les réels sont au format binaire à virgule flottante de 5, 8 ou 10 octets, l'octet le moins significatif est en premier ;

- les chaînes fixes sont sous forme de caractères de la chaîne suivis d'un RC (&0D) ou NUL (&00) ;

- pour les chaînes mobiles (chaîne normale), l'adresse du paramètre pointe vers le descripteur de chaîne ;

- pour les tableaux, l'adresse du paramètre pointe vers un pointeur indirect vers le descripteur de tableau ; 

- pour les structures, l'adresse du paramètre pointe vers le descripteur de structure.




EXEMPLE.


REM --- A sauvegarder sous proga.bbc ---

PRINT "Processus 1"

PRINT "Depart a : " ; kdepart

kvitesse = 90

PRINT




REM --- A sauvegarder sous progb.bbc ---

PRINT "Processus 2"

kdistance = 264

PRINT

RETURN

PRINT "Ceci ne sera pas afficher"

PRINT "aucune ligne n'est execute"

PRINT "apres une instruction RETURN"




REM --- A sauvegarder sous progc.bbc ---

PRINT "Processus 3"

kduree = kdistance / kvitesse

PRINT "arrivee a : " ; kdepart ; " + " ; kduree ; " = " ; kdepart + kduree

PRINT

RETURN




REM --- Application principale ---

PRINT "Debut du programme"

kdepart = 12

CALL @dir$ + "proga.bbc"

CALL @dir$ + "progb.bbc"

CALL @dir$ + "progc.bbc"

PRINT "Distance : " , kdistance

PRINT "Vitesse : " , kvitesse

PRINT "Duree : " , kduree

PRINT

PRINT "Controle : " , kdepart + kduree

PRINT "Fin du programme"

END


retourne :

Debut du programme

Processus 1

Depart a : 12


Processus 2


Processus 3

Arrivee a : 12 + 2.93333333 = 14.93333333


Distance : 264

Vitesse : 90

Duree : 2.93333333


Controle : 14.93333333

Fin du programme


On constate bien que les variables, et leur valeur, sont bien conservées d'un module à l'autre, une fois qu'elles ont été déclarée.

Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de

vos remarques, vos commentaires et de vos suggestions.

Dans la RETROGICIEL vous trouvez des suggestions simples et classiques pour

TESTER - DÉCOUVRIR - PRATIQUER - APPROFONDIR - EXPLORER

avec un exemple de résolution à télécharger pour vous inspirer.

Google Sites
Report abuse
Page details
Page updated
Google Sites
Report abuse