Environnement de programme transitoire
Cette page décrit l'environnement dans lequel les programmes transitoires sont exécutés sous MSX-DOS 2, y compris l'entrée et la sortie du programme et l'utilisation de la mémoire.
Entrée depuis MSX-DOS
Un programme transitoire sera chargé à l'adresse 0100h, le début de la TPA (Transient Program Area), et est appelé par MSX-DOS avec le pointeur de pile défini à la fin de la TPA. Si le pointeur de pile pointe vers cet emplacement, autant de RAM que possible peut être utilisée comme pile. Si cela n'est pas souhaitable, le programme transitoire doit alors configurer sa propre pile dans le TPA.
Le contenu des registres du Z80 lorsqu'un programme transitoire est entré n'est pas défini. Les 256 premiers octets de RAM commençant à l'adresse 0 auront été configurés avec divers paramètres et code.
Les interruptions sont activées lorsqu'un programme transitoire est entré et doivent généralement être laissées activées. Les appels de fonction MSX-DOS réactiveront généralement les interruptions si le programme transitoire les a désactivées.
Retourne au MSX-DOS
Un programme transitoire peut se terminer de l'une des quatre manières suivantes :
- Retour, avec le pointeur de pile d'origine.
- Aller à l'emplacement 0000h
- Appel de la fonction MSX-DOS "Terminer le programme".
- Appel de la fonction MSX-DOS "Terminer avec code d'erreur".
Les deux premières de ces méthodes sont identiques en ce qui concerne MSX-DOS, et sont compatibles avec CP/M et MSX-DOS 1. La troisième méthode est également compatible avec CP/M et MSX-DOS 1 et revient à faire un appel de fonction "Terminer avec code d'erreur" avec un code d'erreur égal à zéro.
La nouvelle fonction "Terminer avec le code d'erreur" permet au programme de renvoyer un code d'erreur à MSX-DOS, les trois premières méthodes de terminaison renvoyant toujours un code d'erreur de zéro (pas d'erreur). Tous les programmes spécialement écrits et les programmes CP/M convertis doivent utiliser cette nouvelle fonction, même pour renvoyer un code d'erreur de zéro.
Divers autres événements indépendants de la volonté d'un programme peuvent provoquer son arrêt. Par exemple, en tapant CTRL+C et CTRL+STOP au clavier, en sélectionnant «Abort» comme réponse à un message d'erreur de disque «Abort/Retry/Ignore» ou par une erreur sur les canaux d'entrée/sortie standard. Dans ces cas, un code d'erreur approprié sera renvoyé à MSX-DOS.
Un programme transitoire peut définir une "routine d'abandon". Celui-ci sera appelé pour traiter l'arrêt anormal du programme de manière appropriée lorsque le programme se termine par une fonction "Terminer le programme" ou "Terminer avec un code d'erreur", ou après une erreur d'abandon. La définition de cette routine et son utilisation sont décrites dans la spécification de la fonction MSX-DOS.
Utilisation de la page zéro
A l'entrée, différentes zones de paramètres sont configurées pour le programme transitoire dans les 256 premiers octets de RAM. La disposition de cette zone est comme ci-dessous et est compatible avec MSX-DOS 1 et avec CP/M à l'exception de la zone utilisée pour les appels de commutation de fente MSX.
A l'adresse 0000h se trouve une instruction de saut pouvant être utilisée pour terminer le programme transitoire. La destination de ce saut peut également être utilisée pour localiser le vecteur de saut du BIOS. L'octet de poids faible de cette adresse de saut sera toujours 03h pour la compatibilité CP/M.
Les deux octets réservés aux adresses 0003h et 0004h sont l'IOBYTE et l'unité de disque/utilisateur actuel dans le CP/M. Bien que MSX-DOS maintienne à jour l'octet de l'unité de disque actuel pour la compatibilité CP/M, il n'est pas recommandé aux nouveaux programmes de l'utiliser, mais plutôt d'utiliser l'appel de fonction MSX-DOS "Demande l'unité de disque actuel". Le numéro d'utilisateur et IOBYTE ne sont pas pris en charge car la redirection d'entrée/sortie n'est pas effectuée de la même manière que CP/M et il n'y a pas de concept de numéros d'utilisateur.
A l'adresse 0005h se trouve une instruction de saut vers le début de la partie résidente de MSX-DOS étant utilisée pour effectuer des appels MSX-DOS. De plus l'adresse de ce saut définit le haut du TPA que le programme peut utiliser. La taille du TPA dépend des cartouches utilisées sur la machine MSX et de leur nombre, mais elle est généralement de 53 Ko. L'octet de poids faible de la destination de ce saut sera toujours 06h pour la compatibilité CP/M, et les six octets le précédant immédiatement contiendront le numéro de version CP/M et un numéro de série.
Quatre octets sont réservés à l'utilisateur à chaque emplacement de redémarrage du Z80 (0008h à 0028h), ce qui est suffisant pour un saut. Les octets entre les emplacements de redémarrage sont cependant utilisés pour les points d'entrée de diverses routines de commutation de fente MSX.
Toute la zone de 0038h à 005Bh est utilisée pour l'interruption MSX et le code de commutation de fente secondaire, et ne doit pas être modifiée. Notez que la plupart des débogueurs CP/M (tels que ZSID et DDT) utilisent l'adresse 38h comme entrée de point d'arrêt, et ces programmes devront être modifiés pour utiliser un redémarrage différent. RST 28h est recommandé.
Les deux FCB configurés aux adresses 005Ch et 006Ch sont des FCB non ouverts valides contenant les deux premiers paramètres de ligne de commande interprétés comme des noms de fichiers. Si les deux noms de fichiers doivent être utilisés, le second doit être copié dans un FCB séparé ailleurs en mémoire car il sera écrasé lors de l'ouverture du premier.
L'intégralité de la ligne de commande, avec la commande initiale réservée, est entreposée dans la zone de transfert de disque par défaut à l'adresse 0080h, avec un octet de longueur en premier et un nul de fin (ni le nul ni l'octet de longueur ne sont inclus dans la longueur). Cette chaîne de caractères aura été en majuscule (lorsque la chaîne d'environnement UPPER est activée) et inclura tous les espaces de début tapés pour assurer la compatibilité CP/M.
Des méthodes améliorées sont également disponibles pour accéder à la ligne de commande. Une chaîne d'environnement appelée "PARAMETERS" est configurée et contient la ligne de commande sans majuscules. Une autre chaîne de caractères d'environnement appelée "PROGRAM" permet aux programmes de trouver l'unité de disque, le répertoire et le nom de fichier à partir desquels ils ont été chargés.
Table de saut du BIOS
Le saut à l'adresse 0000h sautera toujours à une adresse dont l'octet de poids faible est 03h. A cette adresse se trouvera une autre instruction de saut étant la deuxième entrée dans une table de saut à dix-sept entrées. Cela correspond exactement à la table de sauts du BIOS dans CP/M 2.2.
Les huit premières entrées du tableau sont destinées au redémarrage et aux entrée/sortie de caractères. Ces routines sont implémentées avec les mêmes spécifications que CP/M. Les sauts restants sont des fonctions de bas niveau liées au disque dans CP/M et n'ont pas d'équivalent dans MSX-DOS puisque son système de fichiers est totalement différent. Ces routines reviennent simplement sans rien faire à part corrompre les registres principaux et renvoyer une erreur lorsque cela est possible.
Le MSX-DOS bascule vers une pile interne lors de l'exécution d'un appel du BIOS et donc seule une petite quantité d'espace (8 octets) est requise sur la pile de l'utilisateur.
Notez que bien que la table de saut soit toujours sur une limite de page de 256 octets, ce n'est pas la distance "correcte" au-dessus du haut du TPA (comme défini par le contenu de l'adresse 0006h) pour correspondre à CP/M 2.2. Cela ne devrait pas avoir d'importance pour les programmes CP/M bien comportés, mais il semblerait que certains programmes dépendent de la taille du BDOS dans CP/M 2.2. Ces programmes devront être modifiés.
Les entrées dans le vecteur de saut du BIOS sont les suivantes :
- xx00h - JMP WBOOT ; Démarrage a froid
- xx03h - JMP WBOOT ; Démarrage a froid
- xx06h - JMP CONST ; État de console
- xx09h - JMP CONIN ; Entrée de console
- xx0Ch - JMP CONOUT ; Sortie de console
- xx0Fh - JMP LIST ; Liste de sortie
- xx12h - JMP PUNCH ; Sortie de poinçon (auxiliaire)
- xx15h - JMP READER ; Entrée de lecture (auxiliaire)
- xx18h - JMP RETURN ; Accueil du CP/M
- xx1Bh - JMP RETURN ; Sélectionne le disque dans CP/M
- xx1Eh - JMP RETURN ; Fixe la piste dans CP/M
- xx21h - JMP RETURN ; Fixe le secteur dans CP/M
- xx24h - JMP RETURN ; Fixe l'adresse DMA dans CP/M
- xx27h - JMP RETURN ; Lecture de secteur dans CP/M
- xx2Ah - JMP RETURN ; Écriture de secteur dans CP/M
- xx2Dh - JMP RETURN ; Liste d'état
- xx30h - JMP RETURN ; Traduction de secteur en CP/M
Pagination de la mémoire (RAM)
Lorsqu'un programme transitoire est chargé, l'emplacement de RAM du cartographieur sera activé dans les quatre pages et les quatre segments de RAM composant le 64 Ko de base seront paginés et diverses routines de support de cartographieur disponibles à la page-3.
Un programme peut effectuer n'importe quelle commutation d'emplacement et pagination qu'il souhaite pendant son exécution et n'a pas besoin de restaurer les sélections d'emplacement ou la pagination de la RAM avant qu'il ne se termine, car COMMAND2.COM s'en chargera. Un programme doit bien sûr prendre les précautions d'usage avec les points d'interruption et d'entrée de fente s'il altère la page-0, et ne doit jamais altérer la page-3.
Les pages 0, 1 et 2 peuvent contenir n'importe quel emplacement lors d'un appel de fonction et seront conservées. Tous les paramètres peuvent être passés à partir de l'emplacement sélectionné, sauf que les chaînes d'environnement et les zones de transfert de disque doivent se trouver dans l'emplacement RAM du cartographieur.
Tous les segments de RAM peuvent être sélectionnés dans les pages 0, 1 et 2 lorsqu'un appel de fonction MSX-DOS ou un appel de fonction BIOS MSX-DOS est effectué, et la pile peut également se trouver dans n'importe quelle page. L'état de pagination actuel sera conservé par tous les appels de fonction, même dans des conditions d'erreur. Tous les transferts de disque seront effectués vers les segments de RAM étant paginés lors de l'appel de la fonction, même s'il ne s'agit pas des segments TPA d'origine.
Si un programme transitoire souhaite utiliser plus de RAM que le TPA, il peut utiliser les routines de support du cartographieur pour obtenir plus de RAM. Avant d'utiliser une RAM autre que les quatre segments TPA, le programme doit demander aux routines du cartographieur d'allouer un nouveau segment. Cela garantit qu'il n'y a pas de conflit avec le programme essayant d'utiliser un segment qui est déjà utilisé (par le disque RAM par exemple). Les segments doivent normalement être attribués en tant que "segments utilisateurs" car ceux-ci seront automatiquement libérés à la fin du programme. Les "segments de système" ne doivent être alloués que s'il est nécessaire qu'ils restent en service après la fin du programme transitoire.
Après avoir alloué des segments supplémentaires, le programme peut les paginer et utiliser n'importe laquelle des routines de support du cartographieur pour y accéder. Il sera normalement nécessaire qu'un programme transitoire se souvienne des numéros de segment des segments TPA afin de les paginer lorsqu'ils sont nécessaires. Les numéros de segment seront normalement de 0, 1, 2 et 3 mais cela ne doit pas être supposé par les programmes transitoires, ils doivent utiliser les routines de cartographie "GET_Pn" pour trouver les numéros de segment avant de paginer quoi que ce soit d'autre.