Commande CPC BASIC "CALL"
Récemment, j'ai joué avec un émulateur Amstrad CPC. Je n'ai pas écrit de code BASIC depuis des années, mais à l'époque, j'utilisais réellement un CPC pour de vrai.
Quoi qu'il en soit, en regardant la documentation en ligne, je vois que le CPC a une CALLcommande, pour exécuter des sous-programmes arbitraires de code machine Z80. Cependant, j'ai du mal à trouver beaucoup de documentation à ce sujet; la plupart des listes de commandes disent simplement "si vous ne savez pas ce que c'est, n'y touchez pas!"
CALLest suivi de l'adresse du code machine à exécuter. Vraisemblablement, une simple instruction de retour du sous-programme vous ramènera au BASIC lorsque vous aurez terminé.
Cela laisse le problème de la transmission des données entre BASIC et le code machine. En particulier, la CALLcommande semble accepter des paramètres supplémentaires après l'adresse de départ, mais il ne semble pas être documenté ce qu'ils font réellement. (Malheureusement, il ne semble pas y avoir de moyen de renvoyer les résultats à BASIC.)
Réponses
L'appel n'accepte que des entiers et des pointeurs comme paramètres; les deux sont des valeurs de 16 bits. Les paramètres sont placés sur la pile BASIC. IX pointe vers le haut de cette pile. Le nombre de paramètres est mis dans A. L'opération de code machine doit le prendre à partir de là, y compris déterminer (ou simplement supposer) le type de données des paramètres.
Pour un exemple, voir par exemple http://www.cpcwiki.eu/index.php/Technical_information_about_Locomotive_BASIC; mais attention, la description est un peu déroutante.
Notez que lorsque vous passez un pointeur, vous passez effectivement par référence, de sorte qu'une valeur peut être renvoyée à la variable vers laquelle pointe.
Quelques conseils:
Un bon livre pour faire l'assemblage du Z80 à partir de certains POV HLL a toujours été les sous-routines de langage d'assemblage Z80 d'Osborne .
Pour les adresses spécifiques au CPC, vous pouvez consulter les sites liés au CPC comme le CPCWIKI
Et l'instruction de retour générique 8080 est RET(C9h)
Le retour conditionnel est
RET xxavec xx comme condition.