Obligement - L'Amiga au maximum

Mercredi 19 décembre 2018 - 07:31  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles en d'autres langues


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Programmation : AMOS - Programmation d'une extension
(Article écrit par François Lionet et extrait d'Amiga News Tech - mars 1991)


AMOS est un langage extensible : on peut facilement ajouter de nouvelles instructions aux 600 déjà présentes. Il suffit de respecter quelques règles simples dans la construction du programme.

Pour assembler une extension, vous devez récupérer le fichier "EQC.S" se trouvant sur la disquette "Extras", dans le dossier "Extensions". Ce fichier contient la définition de toutes les variables système de l'AMOS. Vous devez l'inclure dans votre programme.

Bien que ce ne soit pas indispensable, je vous conseille d'écrire du code relogeable, pour deux raisons :
  • Vous n'aurez pas à modifier les routines pour le compilateur AMOS qui, lui, n'acceptera que du relatif pc.
  • Vous ressentirez l'immense satisfaction de produire un tel code !
Chargement de l'extension

Au démarrage, AMOS explore la liste des extensions contenue dans le fichier AMOS1_2.Env, et charge tous les fichiers cités à l'aide de la fonction AmigaDOS LoadSeg(). Une extension est donc un programme normal, pouvant contenir plusieurs hunks. Immédiatement après le chargement, AMOS effectue un JSR à la première adresse du premier hunk. Une extension doit débuter impérativement par la routine d'initialisation à froid (ou "Cold Start").

AMOS transmet plusieurs paramètres à l'extension :
  • A0 pointe sur la table d'adresse des routines AMOS.
  • A1 contient l'adresse de base de l'intuition.library.
  • A2 contient l'adresse de base de la graphics.library.
  • A3 contient l'adresse de base de la diskfont.library.
  • D0 contient l'adresse du rastport de l'écran courant.
  • A5 pointe sur la zone de données du BASIC.
  • A6 pointe sur la liste des tables d'instructions de toutes les extensions.
De son côté, l'extension doit impérativement retourner plusieurs adresses :
  • Dans A0, la table des instructions de l'extension.
  • Dans A1, le message de bienvenue.
  • Dans A2, l'adresse de la routine "Warm Start".
  • Dans A3, l'adresse de la routine "Quit".
  • Dans D0, "0" si tout va bien, "-1" si une erreur quelconque est survenue (provoque le retour au CLI).
  • Dans D1, le numéro de l'extension dans la liste.
  • Dans D2, "0" en temps normal, ou l'adresse de la routine "Bank Check".
L'extension peut réserver de la mémoire, charger des fichiers, procéder à des affichages, faire du bruit, etc. Veillez cependant à ne pas trop ralentir le chargement de l'AMOS. L'extension rend la main à l'AMOS par un simple RTS.

Initialisation à chaud (Warm Start)

Cette routine est appelée au cours de l'initialisation de l'écran, lors d'un RUN ou d'un DEFAULT. L'extension peut ici remettre a zéro toutes ses variables internes (si nécessaire).

Routine de fin (Quit)

Cette routine est appelée lors d'un retour au système. Elle doit faire un ménage complet, et ne laisser en mémoire aucune trace du passage de l'extension.

La table des instructions

Dans cette table sont codées toutes les nouvelles instructions et fonctions qu'ajoute l'extension. Cette table confient aussi les pointeurs sur les routines de traitement.

La table doit débuter par :

dc.w 1,1
dc.b $80,-1

Suivent ensuite les instructions et fonctions. En premier, un pointeur relatif sur la routine de traitement, par rapport au début de la table (généralement baptisée Tk).

Si c'est une instruction :

dc.w Routine-Tk,1

Si c'est une fonction :

dc.w 1,Routine-Tk

Suit le nom de l'instruction en lettres minuscules, la dernière lettre étant signalée par l'addition de 128 (bit 7 à 1) :

dc.b "no","m"+$80

Un point d'exclamation au début du nom sert de marqueur sur ce nom. Un nom vide ($80 seul) indique a l'AMOS de rechercher le marqueur précédent. Voir plus loin pour comprendre l'utilisation de ce système.

Il faut maintenant donner a l'AMOS toutes les indications nécessaires pour le test de la syntaxe :

Le type de l'instruction :
  • Instruction : "I"
  • Fonction retournant :
    • Un entier "0"
    • Un réel "1"
    • Une chaîne "2"
La liste de paramètres, terminée par -1 :
  • Aucun : -1 seul
  • Un paramètre :
    • Entier : "0"
    • Réel : "1"
    • Chaîne : "2"
  • Un séparateur, seuls sont autorisés :
    • La virgule, codée par ","
    • TO, codé par "t"
Quelques exemples vont rendre tout cela plus clair :

AMOS

Certaines instructions ou fonctions peuvent accepter différents nombres de paramètres, par exemple SCREEN COPY. Il faut alors donner chaque syntaxe à la suite l'une de l'autre, en terminant la liste des paramètres par -2. La dernière liste se terminera par -1. Pour éviter de taper à chaque fois le nom de l'instruction, on peut utiliser les marqueurs vus plus haut. Voici la définition de SCREEN COPY dans AMOS :

AMOS

Notez bien que vous devez avoir une entrée de routine pour chaque jeu de paramètres.

Traitement d'une instruction

Lors de l'interprétation, AMOS appelle votre routine. Les paramètres sont poussés dans la pile (A3), en ordre inverse. Votre routine doit dépiler tous les paramètres demandés (sous peine de plantage !).

Vous ne devez pas modifier les registres A4, A5 et A6. A5 pointe sur la zone de données du BASIC, l'extension a donc un accès direct à tout l'AMOS (voir à ce sujet le fichier EQU.S).

Traitement d'une fonction

Le déroulement est pratiquement identique à celui d'une instruction. La valeur retournée doit être poussée en -(a3).

La table d'adresses

Lors du démarrage de l'extension, AMOS fournit une donnée importante en A0 : la table d'adresses du BASIC. Cette table contient des sauts à d'importantes routines d'AMOS.

Pour y accéder, il suffit de faire :

Move.l  Table(pc),a0
Jsr  Fonction(a0)

Voici une rapide vue d'ensemble des fonctions les plus intéressantes.

Table + $04

C'est une routine de traitement des erreurs normales. Cette routine provoque une erreur. Vous devez lui transmettre en D0 le numéro de l'erreur souhaitée. Tous les numéros se trouvent dans le "Handy Index" de l'AMOS. Cette fonction ne revient jamais, inutile de faire un JSR.

Paramètres d'entrée :
  • D0.l = numéro de l'erreur
Exemple d'appel, pour provoquer un "Illegal Fonction Call" :

Move.l Table(pc),a0
Moveq #23,d0
Jmp (a0)

Les valeurs contenues dans les registres A4-A5-A6 doivent être identiques à celles fournies lors de l'appel de l'instruction.

La pile A3 est restaurée par le système lors d'un appel d'erreur : vous pouvez donc tester les erreurs lors du dépilement des paramètres (très utile lorsqu'il y en a beaucoup !) sans avoir à vous en préoccuper.

Table + $08

C'est une routine de traitement des erreurs spécifiques. Cette routine vous permet d'avoir vos propres messages d'erreurs.

Paramètres d'entrée :
  • D0.l = numéro de l'erreur dans la nouvelle liste.
  • D1.l = numéro de l'erreur à partir duquel ON ERROR fonctionnera. Vous pouvez ainsi avoir des erreurs non détournables par le BASIC (par exemple, en cas de plantage imminent !). Dans l'exemple, toutes les erreurs de l'extension sont détournables.
  • A0.l = adresse de début des messages. Chaque message se termine par un octet à zéro.
Exemple de liste :

ErrList:
 dc.b "Attention clavier trop chaud!",0
 dc.b "Moniteur sur le point d'imploser",0
 dc.b "Coca-Cola détecté entre les touches",0
: etc.

Exemple d'appel :

Moveq #Erreur,d0
Moveq #0,d1
Lea ErrList(pc),a0
Move.l Table(pc),a1
Jmp 8(a1)

Table + $0C

C'est une routine qui trouve l'adresse d'une banque. Petite routine utile si vous désirez récupérer des données dans une banque de mémoire.

Paramètres d'appel :
  • D3.l = numéro de la banque
Paramètres de sortie :
  • A0.l = adresse de la banque si réservée
  • D0.l = longueur de la banque.
La routine provoquera une erreur "Bank not reserved" si elle ne peut trouver la banque demandée.

Table + 10

C'est une routine de "tests". AMOS appelle cette routine avant tous les branchements et boucles. C'est elle qui provoque le rafraîchissement des BOB, sprites et écrans, qui teste le Control-C, appelle les menus, etc. Vous devez appeller cette routine régulièrement si votre extension garde la main pendant plus de 1/50e de seconde. Elle ne modifie aucun registre à part D0 et A0 et ne nécessite aucun paramètre d'appel.

Table + $14

C'est une routine "Wait". Attend un certain nombre de balayages écran tout en appelant la routine de tests.

Paramètres d'appel :
  • D3.l = nombre de balayages à attendre
Table + $18

Adresse d'un écran. Trouve les adresses d'une structure écran AMOS. Cette structure contient toute la définition interne de l'écran : position, adresses des bitmaps, etc.

Paramètres d'appel :
  • D1.l = numéro de l'écran ou bien fonction spéciale (=LOGIC(n), =PHYSIC(n)) représentant l'écran logique ou physique.
Paramètres de sortie :
  • A0.l = adresse de la structure écran
  • D0.l = adresse dans cette structure des adresses des bitmaps. Si un simple numéro d'écran ou la fonction =LOGIC est envoyé à la routine, D0 pointe les bitmaps logiques. Si vous demandez =PHYSIC, vous pointerez l'écran physique.
Exemple d'appel :

 Move.l (a3)+,d1
 Move.l Table(pc),a0
 Jsr $18(a0)
 Move.w NbPlan(a0),d1 * Défini dans le fichier EQU.S
 Subq.w #1,d1
 Move.l d0,a1 * Adresse des adresses
Loop:
 Move.l (a1)+,a2
 Move.l #-1,(a2) * Pour s'amuser !
 dbra d1,Loop

Table + $1C

Adresse ou banque mémoire ? Un certain nombre de fonctions AMOS vous permettent de représenter l'adresse de début d'une banque mémoire par le simple numéro de cette banque.

Exemple : Bload "Essai.Bin",10 et Bload "Essai.Bin",Start(10) sont deux instructions équivalentes.

La routine numéro $1C fait cette opération pour vous. Elle dépile automatiquement le paramètre de la pile (a3).

Paramètre d'entrée :
  • (A3).l paramètre P à vérifier
Paramètre de sortie :
  • D3.l adresse de la banque si P<16, ou même valeur si P>16
Table + $20

Effacement de banque mémoire.

Paramètre d'entrée :
  • D3.l numéro de la banque à effacer. Vous pouvez ainsi créer dans une extention un instruction effaçant toutes les banques d'un seul coup (bien pratique ça, pourquoi que je ne l'ai pas mis dans le BASIC dès le départ, hein ?). Cette routine ne provoque pas de message d'erreur si la banque n'est pas réservée.
Table + $24

Routine pour demander un espace de chaîne. Cette routine n'est accessible qu'à partir de la version 1.23 (disponible maintenant !). Son but est de réserver un espace dans la zone des variables pour retourner une chaîne de caractères. Elle gère automatiquement la "garbage collection" (ou ramassage des miettes).

Paramètre d'entrée :
  • D3.l taille de la chaîne demandée
Paramètres de sortie :
  • A0.l et A1.l adresse de stockage autorisée
Exemple d'appel : une routine inversant majuscules et minuscules :

AMOS

Voilà, on s'arrête là pour ce mois-ci. Mais on ne se quittera pas comme ça, puisque je vous livre le listing d'une extension AMOS qui ajoute l'instruction ODD LOKE et la fonction ODD LEEK. Ça n'est pas grand-chose, mais ça vous montrera comment il faut faire.

AMOS


[Retour en haut] / [Retour aux articles] [Article précédent]