Section courante

A propos

Section administrative du site

L'éditeur de liaison OS-9 Pascal

Pour exécuter l'utilitaire PASCALE, utilisez le formulaire de commande suivante :

PASCALE <extdeffile :pcodefile

Le paramètre "extdeffile" est le nom du fichier contenant les enregistrements du fichier de définition externe à traiter. Ce fichier est généré automatiquement par PascalT en utilisant le nom de fichier par défaut "PCODEFINFO". Si vous essayez de lier du code natif manuscrit, vous pouvez omettre le nom du chemin et le caractère "<" précédent si vous souhaitez entrer les enregistrements du fichier de définition à partir du chemin d'entrée standard (généralement le terminal). Dans ce cas, il vous suffit de saisir un ou plusieurs enregistrements "use" à partir du terminal pour que les fichiers de définition externes appropriés soient traités. Si l'entrée provient d'un terminal, rappelez-vous que "les enregistrements use commencent par un caractère espace, et qu'après que tous les enregistrements du fichier de définition ont été saisis, vous devez saisir la séquence "fin de fichier" (généralement la touche d'échappement ou ESC étant CLEAR BREAK sur l'ordinateur couleur (CoCo).

Le "pcodefile" est le nom de chemin du fichier P-code à mettre à jour avec les informations du fichier externe. Le nom de fichier doit être immédiatement précédé d'un caractère deux-points - aucun espace de début ni aucun autre caractère n'est autorisé. Il n'y a pas de nom par défaut supposé, de sorte que si vous vouliez, par exemple, faire référence au fichier P-Code par défaut produit par le compilateur OS-9 Pascal, vous saisiriez ":PCODEF".

Si le caractère ":" est omis ou s'il n'est pas immédiatement suivi d'un nom de chemin, le message d'erreur suivant s'affiche :

*ERROR No P-code file name has been found. A P-code file name

doit être fourni immédiatement après un ":" sur la ligne de commande.

Si le fichier P-Code n'existe pas ou si une erreur OS-9 s'est produite lors de la tentative d'ouverture du fichier, le message d'erreur suivant s'affiche. Si le caractère ":" est omis ou s'il n'est pas immédiatement suivi d'un nom de chemin, le message d'erreur suivant s'affiche :

*ERROR OS-9 error x encountered when trying to open file.

où "x" est le numéro d'erreur OS-9. S'il s'avère que le fichier de P-Code a été modifié, ce qui pourrait produire des résultats catastrophiques, ou si le fichier n'est pas un fichier de P-Code après tout, le message d'erreur suivant s'affiche :

*ERROR P-code file has been altered or has invalid format.

S'il y a eu des erreurs de compilation lors de la production du fichier P-Code, le fichier P-Code est inutilisable et le message d'erreur suivant s'affiche :

*ERROR P-code file has x compile time errors, it cannot be processed.

Le "x" est le nombre d'erreurs de compilation ayant été détectées. Si le fichier P-Code ne contient aucune procédure EXTERNAL déclarée, le message d'erreur suivant s'affiche :

*ERROR P-code file has no external routines.

Si un enregistrement est trouvé dans le fichier de définition externe ayant un caractère espace dans la première position de caractère, mais n'est pas immédiatement suivi par les lettres "use", un autre caractère espace, puis un nom de chemin, le message d'erreur suivant s'affiche :

*ERROR Invalid command on line number x at USE file nesting level of y

Où "x" est le numéro de ligne actuel dans le fichier texte en cours de traitement, et "y" est le niveau d'imbrication du fichier d'utilisation comme décrit plus haut dans cette section. Si une commande "use" valide est rencontrée, mais que le fichier référencé ne peut pas être ouvert, le message d'erreur suivant s'affiche :

*WARNING OS-9 error x encountered while trying to open USE file y

Où "x" est le numéro d'erreur OS-9 et "y" est le nom de chemin du fichier à partir de l'enregistrement "use". Si un enregistrement du fichier de définition externe n'est pas un enregistrement de commentaire, d'utilisation ou de définition valide, le message d'erreur suivant s'affiche :

*ERROR Invalid EXTERNAL definition format on line number x at USE file nesting level of y

Où «x» est le numéro de ligne actuel dans le fichier texte en cours de traitement, et «y» est le niveau d'imbrication du fichier d'utilisation comme décrit plus haut dans cette section. Le message d'erreur précédent est également donné si un champ d'un enregistrement de définition n'est pas dans un format valide - tel qu'un nombre étant hors de portée, ou un nom trop long ou composé du mauvais type de caractères. Une fois que PASCALE a complètement traité le fichier de définition externe, il vérifie si toutes les procédures externes déclarées ont été cartographiées. Sinon, une liste est produite de tous les noms de procédure, numéros de procédure et types de modules qui n'ont pas été traités lors de cette exécution. Il est possible que vous ayez traité ces procédures lors d'une exécution précédente ou que vous les traitiez lors d'une exécution future. Vous devez cependant faire une cartographie de chaque procédure externe par PASCALE avant de pouvoir exécuter ou même convertir le fichier P-Code. Enfin, si vous allez exécuter le fichier P-Code via l'un des interpréteurs OS-9 Pascal, vous pouvez utiliser PASCALE entre les exécutions pour recartographier les procédures externes. Si vous traduisez un fichier de P-Code complet en un programme de code natif, cependant, la cartographie existant au moment de convertir est codé en permanence dans le programme de code natif - pour changer cette cartographie, vous devez réexécuter PASCALE pour le P-Code, puis retraduisez le fichier P-Code. Les conversions partielles d'un fichier P-Code ne sont pas affectées de manière permanente de cette manière.

Fichier de définition externe

Si vous souhaitez lier des procédures de langage d'assembleur externe écrites à la main à un programme P-Code, vous devez comprendre le format des «fichiers de définition externes». Il existe trois types d'enregistrements pouvant exister dans le fichier de définition externe.

Enregistrements de commentaires

Les enregistrements de commentaires commencent par un caractère "*" à la première position du caractère suivi de tous les autres caractères imprimables souhaités. La ligne est ignorée par PASCALE et est autorisée simplement pour vous donner un moyen de mettre des informations descriptives dans le fichier. Vous devez toujours insérer des enregistrements de commentaires pour nommer le programme source d'origine à partir duquel les enregistrements de définition externes ont été dérivés, la version de ce programme (si ces informations sont conservées) et un horodatage indiquant l'heure à laquelle le fichier de définition externe a été créé ou lorsque le programme source d'origine a été compilé. Si vous avez l'intention que d'autres puissent utiliser vos routines externes, vous devriez également inclure une sorte de documentation sur l'utilisation des routines - au moins une simple déclaration nommant chaque procédure et son utilisation.

Utiliser les enregistrements

Le deuxième type d'enregistrement est l'enregistrement «use». Il se compose d'un seul caractère d'espace suivi des lettres "USE", suivi d'un autre caractère d'espace, suivi d'un nom de chemin; les lettres majuscules et minuscules sont considérées comme équivalentes. L'utilisation d'enregistrements "use" vous permet de construire des structures imbriquées ou subordonnées de fichiers de définition externes. Le nom de chemin donné se réfère, bien entendu, au nom d'un autre fichier texte contenant d'autres enregistrements de définition externes. Cet autre fichier pourrait même contenir ses propres enregistrements «use». Le niveau d'imbrication n'est limité que par la quantité d'espace de pile étendu disponible lorsque PASCALE est exécuté. Lorsque chaque enregistrement «use» est rencontré, le traitement du fichier de définition externe actuel est temporairement suspendu pendant que le fichier référencé est traité.

Lorsque PASCALE commence l'exécution, le "niveau d'imbrication du fichier USE" est égal à zéro. Lorsque le premier enregistrement "use" est trouvé, le niveau d'imbrication passe à 1. Si le fichier référencé a également un enregistrement "use", le niveau d'imbrication passera à 2 pendant le traitement du fichier nouvellement référencé. Naturellement, le niveau d'imbrication redescend de un après le traitement de chaque fichier référencé. Le niveau d'imbrication n'est important que pour interpréter les messages d'erreur pouvant être produits par PASCALE. Après le traitement du dernier enregistrement d'un fichier "use", le traitement se poursuit avec l'enregistrement après l'enregistrement "use" ayant référencé ce dernier fichier.

Enregistrements de définition

Le troisième type d'enregistrement est l'enregistrement «definition». Chaque enregistrement contient exactement 6 champs d'information et peut contenir jusqu'à 127 caractères. Le premier champ est le nom de la procédure décrite comme elle serait nommée par un programme source. Le nom doit comporter entre 1 et 8 caractères. Le premier caractère doit être une lettre, mais les caractères suivants peuvent être des lettres, des chiffres ou des traits de soulignement. Immédiatement après le nom de la procédure, il doit y avoir une virgule, puis un nom de module. Le nom du module peut comporter jusqu'à 116 caractères et donne le nom de chemin du module contenant la version du code natif de la procédure définie. Normalement, le champ de nom de module contient un nom de chemin complet afin que tous les programmes utilisant la procédure externe puissent être exécutés indépendamment de tout paramètre de données et de répertoires d'exécution. Le nom du module peut être n'importe quel nom de chemin OS-9 valide. Lorsque PascalN ou PascalS traite une entrée de table de procédure externe, il analyse d'abord le nom du module en commençant à la fin et en travaillant vers le début jusqu'à ce que le début du nom du module soit trouvé, ou jusqu'à ce qu'une barre oblique soit trouvée. Le nom récupéré est utilisé pour une tentative d'opération de "link" et, si la liaison échoue, le nom complet du module est utilisé pour une tentative d'opération de "load". Le lien et la charge sont également qualifiés par un champ "module type". Le nom du module doit être immédiatement suivi d'une virgule, puis d'un type de module. Un type de module est un nombre de 1 à 3 chiffres devant être compris entre 0 et 255. Les modules de procédure externes produits par PascalT auront toujours un type de 33 indiquant un module de sous-programme de code natif. Le type de module est utilisé pour qualifier l'opération de liaison ou de chargement sur le module. Après le type de module, il doit y avoir une virgule, puis un numéro de décalage. Le nombre doit être compris entre 0 et 32767, et lorsqu'il est ajouté à l'adresse d'exécution du module lié ou chargé, il donne l'adresse de la première instruction à exécuter pour la procédure. S'il y a plus d'une procédure dans un module, la convention normale est de placer une instruction de trois octets "long branch" pour chaque procédure comme premier code exécutable pour le module. Ainsi, la première procédure dans le module aurait un déplacement de 0, la seconde un déplacement de 3, et ainsi de suite. Après le champ de déplacement se trouvent une virgule, un numéro de taille de pile locale, une autre virgule et un numéro de taille de pile étendue. Ces deux nombres doivent être compris entre 0 et 32767 et doivent être conformes aux véritables exigences de la procédure. Pour récapituler, un enregistrement «definition» ressemble à :

proc-name,module-name,type,offset,local-size,extended-size

Lorsque PASCALE commence l'exécution, l'une des premières choses qu'il fait est de créer un tableau de tous les noms de procédure ayant été déclarés comme EXTERNAL dans le programme source. Lors du traitement du fichier de définition externe, le premier enregistrement de définition externe correspondant à chaque nom de procédure de la table est utilisé, toutes les correspondances en double étant alors ignorées. L'implication est la suivante. Un programme particulier peut avoir, par exemple, 17 procédures déclarées comme externes. Ils doivent être cartographiés sur trois modules différents. Une procédure externe, cependant, a le nom de "CLEARSCR" étant le nom d'une procédure dans deux des trois modules. Il est tout à fait possible qu'un seul des modules ait la procédure CLEARSCR correcte étant nécessaire dans ce cas, le CLEARSCR de l'autre module pourrait effectuer une action totalement indésirable - il se trouve que les deux modules ont fini par avoir une procédure du même nom. Pour vous assurer que PASCALE cartographie vos références CLEARSCR externes au bon module, assurez-vous que l'enregistrement de définition externe correct est traité en premier. De cette façon, le deuxième ou tout autre enregistrement de définition CLEARSCR suivant sera ignoré. Vous pouvez, bien sûr, créer un fichier texte contenant uniquement les enregistrements de définition requis exacts, mais il est plus courant d'avoir un seul fichier de définition pour chaque module et d'utiliser simplement les enregistrements "use" pour les faire traiter dans le bon ordre.

Un problème étant plus ou moins le contraire de celui venant d'être décrit est également possible. Vous souhaiterez peut-être référencer les deux procédures CLEARSCR dans votre programme source. Il est clair que vous ne pouvez pas le faire en déclarant que les deux procédures sont externes avec le même nom. La solution, cependant, est simple. Dans le programme source, déclarez deux procédures différentes comme externes avec des noms différents. Vous pouvez toujours appeler un CLEARSCR si vous le souhaitez, ou peut-être pouvez-vous appeler un CLEARSC1 et l'autre CLEARSC2. Il vous suffit maintenant de créer un fichier de définition externe pour le module contenant la procédure référencée par exemple CLEARSC1. La manière la plus simple de faire ceci est de faire une copie du fichier de définition externe du module d'origine et d'utiliser le programme d'édition de texte OS-9 pour changer le nom de la procédure de CLEARSCR à CLEARSC1. De même, créez un fichier de définition externe pour l'autre module et changez le nom de l'enregistrement de définition approprié de CLEARSCR à, par exemple, CLEARSC2. Utilisez maintenant ces deux nouveaux fichiers de définition externes lorsque vous exécutez PASCALE sur le fichier P-Code de votre programme source.

Il y a une chose à laquelle vous devez faire très attention lorsque vous utilisez des procédures externes. Il n'existe aucun moyen de garantir que le code appelant dans le programme source correspond correctement à la manière dont la procédure externe doit être appelée. Par exemple, une procédure externe peut être une fonction OS-9 Pascal renvoyant un nombre réel et prend un entier et un tableau de caractères comme paramètre. Votre programme source, cependant, pourrait déclarer la procédure externe comme étant une procédure OS-9 Pascal prenant 4 nombres réels et 5 entiers comme paramètres. Le OS-9 Pascal n'a aucun moyen de vérifier qu'un programme fait correctement référence à une procédure externe. Le programme se compilera correctement et PASCALE cartographiera correctement l'appel réel de la procédure externe aux bonnes instructions de code natif. Cependant, lorsque le programme s'exécute réellement, une telle référence non concordante est susceptible de détruire l'intégrité du système en cours d'exécution, ce qui entraînera probablement des résultats catastrophiques ! Un conseil alors - assurez-vous que les appels de votre programme source correspondent vraiment à ce que la routine externe attend. Si le module externe a été produit par PascalT, tant que vous faites référence à ce module uniquement à partir du programme source ayant été utilisé pour créer ce module, et tant que vous ne changez pas le type de procédure externe (c'est-à-dire la fonction ou la procédure Pascal) ou sa liste de paramètres, alors ne vous inquiétez pas.



Dernière mise à jour : Samedi, le 11 juillet 2020