Section courante

A propos

Section administrative du site

Routines de prise en charge de cartographie

Le MSX-DOS 2 contient des routines permettant de prendre en charge la cartographie de la mémoire. Cela permet aux programmes d'application MSX ou aux programmes transitoires MSX-DOS d'utiliser plus que les 64 Ko de mémoire de base, sans entrer en conflit avec le disque RAM ou tout autre logiciel système.

Initialisation de la cartographie

Lorsque le noyau DOS est initialisé, il vérifie qu'il y a la cartographie de la mémoire dans le système et qu'il y a au moins 128 Ko de RAM disponible. Si le noyau a trouvé au moins une fente contenant 128 Ko de la RAM de la cartographie, il sélectionne la fente contenant la plus grande quantité de RAM (ou la fente avec le plus petit numéro de fente, s'il y a deux ou plusieurs fentes de la cartographie ayant le même quantité de RAM) et rend cet emplacement utilisable comme RAM système. Lorsqu'il n'y a pas assez de mémoire sur la cartographie de mémoire, MSX-DOS 2 ne démarre pas.

Ensuite, le noyau construit une table de tous les segments de RAM de 16 Ko disponibles pour cet emplacement (emplacement de la cartographie principal). Les quatre premiers segments (64 Ko) pour l'utilisateur et les deux segments numérotés les plus élevés sont alloués au système, un pour le code du noyau DOS et un pour l'espace de travail du noyau DOS. Tous les autres segments (au moins deux) sont initialement marqués comme libres. Ensuite, le noyau construit les tables similaires pour les autres emplacements de RAM, le cas échéant. Tous ces segments sont initialement marqués comme libres.

Variables et routines de cartographie

Les routines de support de cartographie utilisent certaines variables dans la zone système DOS. Ces tables peuvent être référencées et utilisées par les programmes utilisateur à diverses fins, mais ne doivent pas être modifiées. Le contenu des tableaux est le suivant :

Adresse Fonction
+0 Adresse de la fente de la fente de la cartographie.
+1 Nombre total de segments de RAM de 16 Ko. 1..255 (8..255 pour le primaire).
+2 Nombre de segments de RAM de 16 Ko de libre.
+3 Nombre de segments de RAM de 16 Ko alloués au système (au moins 6 pour le primaire)
+4 Nombre de segments de RAM de 16 Ko alloués à l'utilisateur.
+5..+7 Non utilisé. Toujours 0.
+8... Entrées pour d'autres emplacements de cartographie. S'il n'y en a pas, +8 sera égal à zéro.

Un programme utilise le code de support de cartographie en appelant divers sous-programmes. Ceux-ci sont accessibles via une table de saut située dans la zone système MSX-DOS. Le contenu de la table de saut est le suivant :

Adresse Nom d'entrée Fonction
+0H ALL_SEG Attribuez un segment de 16 Ko.
+3H FRE_SEG Libérez un segment de 16 Ko.
+6H RD_SEG Lit l'octet de l'adresse A:HL à A.
+9H WR_SEG Écrit l'octet de E à l'adresse A:HL.
+CH CAL_SEG Appel inter-segments. Adresse en IYh:IX.
+FH CALLS Appel inter-segments. Adresse en ligne après l'instruction d'appel.
+12H PUT_PH Mettre le segment dans la page (HL).
+15H GET_PH Obtenir le segment actuel pour la page (HL).
+18H PUT_PO Met le segment dans la page 0.
+1BH GET_PO Obtenir le segment actuel pour la page 0.
+1EH PUT_P1 Mettez le segment dans la page 1.
+21H GET_P1 Obtenir le segment actuel pour la page 1.
+24H PUT_P2 Mettez le segment dans la page 2.
+27H GET_P2 Obtenir le segment actuel pour la page 2.
+2AH PUT_P3 Non pris en charge car la page-3 ne doit jamais être modifiée. Agit comme un NOP s'il est appelé.
+2DH GET_P3 Obtenir le segment actuel pour la page 3.

Un programme peut utiliser les appels étendus du BIOS pour la prise en charge de cartographie afin d'obtenir ces adresses. Les appels sont fournis car ces adresses peuvent être modifiées dans la future version ou pour utiliser des routines de cartographie autres que les routines de prise en charge de la cartographie MSX-DOS.

Pour utiliser le BIOS étendu, le programme doit tester le drapeau "HOKVLD" sur FB20h à la page-3. Si le bit-0 (LSB) est 0, il n'y a pas de BIOS étendu ni de prise en charge de la cartographie. Sinon, l'entrée "EXTBIO" a été configurée et peut être appelée avec différents paramètres. Notez que ce test n'est pas nécessaire pour les applications basées sur MSX-DOS (comme le programme étant chargé à partir du disque), et le programme peut passer à l'étape suivante.

Ensuite, le programme définit le numéro de périphérique du BIOS étendu dans le registre D, le numéro de fonction dans le registre E et les paramètres requis dans d'autres registres, puis appelle "EXTBIO" à FFCAh à la page-3. Dans ce cas, le pointeur de pile doit être dans la page-3. S'il existe le BIOS étendu pour le numéro d'appareil spécifié, le contenu des registres AF, BC et HL est modifié en fonction de la fonction ; sinon, ils sont conservés. Le registre DE est toujours conservé. Notez que dans tous les cas, le contenu des registres alternatifs (AF', BC', DE' et HL') et des registres d'index (IX et IY) est corrompu.

Les fonctions disponibles dans le BIOS étendu de la cartographie supporté sont :

Dans ces cartographies prenant en charge le BIOS étendu, il n'est pas nécessaire que le registre A soit égal à zéro. Notez que, cependant, s'il n'y a pas de routine de support de cartographie, le contenu des registres ne sera pas modifié, et la valeur n'étant pas zéro sera retournée dans le registre A sinon. Ainsi, l'existence de la routine de prise en charge de la cartographie peut être déterminée en définissant zéro dans le registre A lors de l'appel et en examinant la valeur renvoyée de A.

L'adresse d'emplacement de la cartographie principal renvoyée par le BIOS étendu est la même que l'adresse d'emplacement RAM actuelle à la page 3 et, dans l'environnement ordinaire (DISK-BASIC et MSX-DOS), le même emplacement RAM est également sélectionné dans page 2. Dans MSX-DOS, cela est également vrai dans la page 0 et la page 1.

Utilisation des routines de cartographie

Un programme peut demander un segment de RAM de 16 Ko à tout moment en appelant la routine "ALL_SEG". Cela renvoie soit une erreur s'il n'y a pas de segments libres, soit le numéro de segment d'un nouveau segment que le programme peut utiliser. Un programme ne doit utiliser aucun segment qu'il n'a pas explicitement alloué, à l'exception des quatre segments composant les 64 Ko de base de RAM.

Un segment peut être affecté soit en tant que segment utilisateur, soit en tant que segment système. Les segments utilisateur seront automatiquement libérés lorsque le programme se terminera, tandis que les segments système ne seront jamais libérés à moins que le programme ne les libère explicitement. Normalement, les programmes doivent allouer des segments d'utilisateurs.

Les segments de RAM sont accessibles par les routines "RD_SETG" et "WR_SEG" lisant et écrivent des octets dans des segments spécifiés. Les routines "CALL_SEG" et "CALLS" permettent d'effectuer des appels inter-segments de la même manière que les appels inter-fentes dans le système MSX actuel.

Des routines sont fournies pour paginer explicitement un segment ou pour découvrir quel segment se trouve dans une page particulière. Il existe des routines dans lesquelles la page (0 à 3) est spécifiée par les deux premiers bits d'une adresse dans HL ("PUT_PH" et "GET_PH"). Et il existe aussi des routines spécifiques pour accéder à chaque page ("GET_Pn" et "PUT_Pn"). Ces routines sont très rapides, donc un programme ne devrait pas souffrir de performances en les utilisant.

Notez que la page 3 ne doit jamais être modifiée car elle contient les routines de support de cartographie et toutes les autres variables système. De plus, il faut faire très attention si la page-0 est modifiée car elle contient l'interruption et les points d'entrée de commutation de fente. Les pages 1 et 2 peuvent être modifiées de quelque manière que ce soit.

La note des routines de support de cartographie perturbera tout le machinisme de sélection des fentes. Par exemple, lorsque "PUT_P1" est appelé, le segment de RAM spécifié n'apparaîtra qu'à l'adresse 4000h...7FFFh si l'emplacement de cartographie est sélectionné dans la page 1. Les routines "RD_SEG" et "WR_SEG" accéderont toujours au segment de RAM quel que soit la sélection d'emplacement actuelle dans la page spécifiée, mais l'emplacement RAM de la cartographie doit être sélectionné dans la page 2.

Allocation et libération de segments

Les deux routines suivantes peuvent être appelées pour allouer ou libérer des segments. Tous les registres sauf AF et BC sont conservés. Une erreur est indiquée par le drapeau de retenue défini au retour. La sélection d'emplacement et la pagination de la RAM peuvent être dans n'importe quel état lorsque ces routines sont appelées et les deux seront pressées. La pile ne doit pas être dans la page-0 ou la page-2 lorsque l'une de ces routines est appelée.

Un programme ne doit utiliser aucun segment (hormis les quatre composant le 64 Ko de base) à moins qu'il ne l'ait spécifiquement alloué, et ne doit pas continuer à utiliser un segment après qu'il a été libéré.

Un segment peut être attribué soit en tant qu'utilisateur, soit en tant que segment système. La seule différence est que les segments utilisateur seront automatiquement libérés lorsque le programme se terminera alors que les segments système ne le seront pas. En général, un programme doit allouer un segment d'utilisateur à moins qu'il ait besoin que les données du segment survivent au programme lui-même. Les segments utilisateur sont toujours attribués à partir du segment libre numéroté le plus bas et les segments système à partir du numéro le plus élevé.

Une erreur de "segment alloué" indique généralement qu'il n'y a pas de segments libres, bien que cela puisse également signifier qu'un paramètre invalide a été passé dans les registres A et B. Une erreur de "segment libre" indique que le numéro de segment spécifié n'existe pas ou n'existe pas ou est déjà libéré.

ALL_SEG

Tous les segments

Paramètres

Valeur Description
A=0 Allocation de segment utilisateur
A=1 Allocation de segment système
B=0 Allocation de cartographie primaire
B!=0 Allocation de fente d'adresse FxxxSSPP (cartographie primaire, si 0) :
xxx=000 Allocation de fente spécifié seulement
xxx=001 Allocation d'autres fentes étant spécifié
xxx=010 Essaie d'allouer une fente spécifié et, s'il échoue, essaie un autre fente (seulement si) xxx=011 Essaie d'allouer une autre fente étant spécifié, s'il échoue, essaie une fente spécifié

Résultats

Valeur Description
CARRY fixé Pas de segments de libre
CARRY effacé Segment alloué :
A Nouveau numéro de segment
B Adresse de fente d'une fente de cartographie (0 si appeler avec B=0)

FRE_SEG

Libère le segment

Paramètres

Valeur Description
A Nombre de segment à libérer
B=0 Cartographie primaire
B!=0 Cartographie d'autres que primaire

Résultats

Valeur Description
CARRY fixé Erreur
CARRY effacé Segment libérer correctement

Lecture et écriture inter-segment

Les deux routines suivantes peuvent être appelées pour lire ou écrire un seul octet à partir de n'importe quel segment de RAM de cartographie. La séquence d'appel est très similaire aux routines de lecture et d'écriture inter fente fournies par la ROM système MSX. Tous les registres sauf AF sont conservés et aucune vérification n'est effectuée pour s'assurer que le segment est valide.

Les deux premiers bits de l'adresse sont ignorés et les données seront toujours lues ou écrites via la page-2, puisque le numéro de segment spécifie un segment de 16 Ko pouvant apparaître dans n'importe laquelle des quatre pages. Les données seront lues ou écrites à partir du segment correct, quelle que soit la pagination ou la sélection d'emplacement actuelle dans la page-0 ou la page-1, mais pas que la fente de la RAM de la cartographie doive être sélectionné dans la page-2 lorsque l'une de ces routines est appelée. C'est ainsi que les routines n'ont pas besoin de changer de créneau et peuvent donc être rapides. De plus, la pile ne doit pas être en page-2. Ces routines renverront des interruptions de désactivation.

RD_SEG

Lire le segment

Paramètres

Valeur Description
A Nombre de segment à lire
HL Adresse dans ce segment

Résultats

Valeur Description
A Valeur d'un octet dans l'adresse

Tous les autres registres sont préservés.

WR_SEG

Écrire le segment

Paramètres

Valeur Description
A Nombre de segment à écrire
HL Adresse dans ce segment
E Valeur à écrire

Résultats

Valeur Description
A Valeur modifié

Tous les autres registres sont préservés.

Appels inter-segments

Deux sous-programmes sont fournis pour effectuer des appels inter-segments. Ceux-ci sont très étroitement modélisés sur les deux routines d'appel inter-slot fournies par la ROM système MSX, et la spécification de leur utilisation est très similaire.

Aucune vérification n'est effectuée sur l'existence réelle du segment appelé, il est donc de la responsabilité de l'utilisateur de s'en assurer. Le segment appelé sera paginé dans la page d'adresse spécifiée, mais il est de la responsabilité de l'utilisateur de s'assurer que l'emplacement de la cartographie est activé dans cette page, car aucune de ces routines ne modifiera la sélection de l'emplacement. C'est pour s'assurer qu'ils peuvent être rapides.

La routine ne peut pas être utilisée pour faire un appel inter-segment dans la page-3. Si cela est tenté, l'adresse spécifiée dans la page-3 sera simplement appelée sans aucune pagination, puisque la page-3 ne doit jamais être modifiée. L'appel à la page-0 doit être fait avec précaution en raison de l'interruption et des autres points d'entrée. Il faut également veiller à ce que la pile ne soit pas paginée par ces appels.

Ces routines, contrairement aux appels inter-fentes, ne désactivent pas les interruptions avant de passer le contrôle à la routine appelée. Ils reviennent donc à l'appelant dans le même état qu'auparavant, sauf si le drapeau d'interruption a été modifié par la routine appelée.

Les paramètres ne peuvent pas être passés dans les registres IX, IY, AF', BC', DE' ou HL' car ceux-ci sont utilisés en interne dans la routine. Ces registres seront corrompus par l'appel inter-segment et peuvent également être corrompus par la routine appelée. Tous les autres registres (AF, BC, DE et HL) seront transmis intacts à la routine appelée et renvoyés de celle-ci à l'appelant.

CAL_SEG

Appel de segment

Paramètres

Valeur Description
IY Numéro de segment à appeler
IX Adresse à appeler

AF, BC, DE, HL sont passés à la routine appelée. Les autres registres peuvent être modifiés.

Résultats

AF, BC, DE, HL, IX et IY sont revenus de la routine appelée. Tous les autres peuvent avoir été modifiés.

CALLS

Appels

Paramètres

AF, BC, DE, HL sont passés à la routine appelée. Les autres registres peuvent être modifiés. Séquence d'appel :

  1. CALL CALLS
  2. DB SEGMENT
  3. DW ADDRESS

Résultats

AF, BC, DE, HL, IX et IY sont revenus de la routine appelée. Tous les autres registres peuvent avoir été modifiés.

Routines de pagination directe

Les routines suivantes sont fournies pour permettre aux programmes de manipuler directement l'état de pagination actuel sans avoir à accéder au matériel. L'utilisation de ces routines garantit la compatibilité avec toute modification des détails du matériel. Les routines sont très rapides et leur utilisation ne compromettra donc pas les performances des programmes.

Des routines sont fournies pour lire ou écrire directement dans l'un des quatre registres de page. Aucune vérification de la validité du numéro de segment n'est effectuée, c'est donc la responsabilité de l'utilisateur. A noter que la valeur écrite dans le registre est également écrite en mémoire et, si la valeur du registre est demandée, la valeur entreposée en mémoire sera retournée et celle du registre ne sera jamais lue directement. Ceci est fait pour éviter les erreurs de conflits matériels lorsqu'il y a deux ou plusieurs registres de cartographie dans le système. L'utilisateur doit toujours manipuler la cartographie de mémoire via ces routines.

Les routines "GET" renvoient des valeurs à partir d'images internes des registres sans réellement lire les registres eux-mêmes. Cela garantit que si un segment est activé par, par exemple, "PUT_P1", un appel "GET_P1" ultérieur renverra la valeur réelle. La lecture du registre de la cartographie peut produire une valeur différente car les bits supérieurs des numéros de segment ne sont généralement pas enregistrés.

Bien qu'un sous-programme "PUT_P3" soit fourni, il s'agit en fait d'un sous-programme factice et ne modifiera pas le registre de page-3. En effet, le contenu du registre de la page 3 ne doit jamais être modifié. La routine "GET_P3" se comporte comme prévu pour permettre à l'utilisateur de déterminer quel segment se trouve dans la page-3.

Une autre paire de routines ("GET_PH" et "PUT_PH") est fournie, dont la fonction est identique sauf que la page est spécifiée par les deux premiers bits du registre H. Ceci est utile lorsque le registre HL contient une adresse, et ces routines ne modifie pas le registre HL. "PUT_PH" ne modifiera jamais le registre de la page-3.

PUT_Pn

Mettre Pn

Paramètres

Valeur Description
n 0, 1, 2 ou 3 pour sélectionner la page
A Numéro de segment

Résultats

Aucun. Tous les registres sont conservés.

GET_Pn

Demande Pn

Paramètres

Valeur Description
n 0, 1, 2 ou 3 pour sélectionner la page

Résultats

Valeur Description
A Numéro de segment

Tous les registres sont conservés.

PUT_PH

Mettre PH

Paramètres

Valeur Description
H Octet fort de l'adresse
A Numéro de segment

Résultats

Aucun. Tous les registres sont conservés.

GET_PH

Demande PH

Paramètres

Valeur Description
H Octet fort de l'adresse

Résultats

Valeur Description
A Numéro de segment

Tous les registres sont conservés.


Avant d'utiliser ces routines de pagination directe pour modifier l'état de pagination, un programme doit d'abord utiliser les routines «GET_Pn» pour déterminer les quatre segments initiaux lorsqu'il doit les restaurer. Aucun programme ne devrait supposer des valeurs fixes pour ces segments initiaux puisqu'ils sont susceptibles de changer dans les futures versions du système.



Dernière mise à jour : Lundi, le 16 janvier 2023