La Place des Développeurs Changer le slot d'une page en assembleur
Reprise du message précédent
Sincèrement, pourquoi se prendre la tête alors que le BIOS fait ça très bien ?Je sais que tu cherches à tout pouvoir faire sans le BIOS, mais il y a des choses pour lesquelles c'est plus compliqué sans.
Et pour lesquelles on ne gagne rien à ne pas utiliser le BIOS (en terme de performances je veux dire).
Après on peut voir ça comme un exercice intellectuel, mais ...
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
aoineko
Membre non connecté
Conseiller Municipal
J'aime bien comprendre comment marche les choses.
Mais ça veux pas dire que je m'interdit d'utiliser le BIOS.
Tout dépend de mes besoins.
Par ex., je me suis fait un programme d'exemple pour ma lib ou je n'utilise que les fonctions du BIOS.
A coté de ça, je suis en train de faire un programme d'exemple de cartouche 48K (pour Ricco notamment) ou je cherche un moyen simple pour l'utilisateur de la lib d'accéder à sa cartouche en page 0.
Et le plus simple (pour l'utilisateur) me semble être d'avoir des fonctions manipulations des slots dans la lib (dans les pages 1 ou 2) pour qu'elles soient toujours accessibles.
Je suis pragmatique. S'il a une meilleure solution plus simple, je la prendrais.
Mais pour le savoir, encore faut-il bien comprendre comment fonctionnent les slots.
Mais ça veux pas dire que je m'interdit d'utiliser le BIOS.
Tout dépend de mes besoins.
Par ex., je me suis fait un programme d'exemple pour ma lib ou je n'utilise que les fonctions du BIOS.
A coté de ça, je suis en train de faire un programme d'exemple de cartouche 48K (pour Ricco notamment) ou je cherche un moyen simple pour l'utilisateur de la lib d'accéder à sa cartouche en page 0.
Et le plus simple (pour l'utilisateur) me semble être d'avoir des fonctions manipulations des slots dans la lib (dans les pages 1 ou 2) pour qu'elles soient toujours accessibles.
Je suis pragmatique. S'il a une meilleure solution plus simple, je la prendrais.
Mais pour le savoir, encore faut-il bien comprendre comment fonctionnent les slots.
On est toujours ignorant avant de savoir.
Je te l'ai déjà dit, mais il me semble que toute cette gymnastique pour faire fonctionner une cartouche 48K est vraiment compliquée, alors qu'il existe des mappers megarom (très) simples d'utilisation qui permettent de travailler avec autant de pages que tu veux, et à n'importe quel endroit.
Théoriquement, le jeu qu'on a développé pour MSXdev21 aurait pu tenir sur une cartouche de 48K linéaires. Mais je ne me suis pas posé de questions, et j'ai directement visé l'utilisation d'une structure de megarom 64K.
Pour rappel, avec un mapper megarom, changer de page sur un slot donné se fait en écrivant une valeur à une adresse.
Rien d'autre à faire.
Théoriquement, le jeu qu'on a développé pour MSXdev21 aurait pu tenir sur une cartouche de 48K linéaires. Mais je ne me suis pas posé de questions, et j'ai directement visé l'utilisation d'une structure de megarom 64K.
Pour rappel, avec un mapper megarom, changer de page sur un slot donné se fait en écrivant une valeur à une adresse.
Rien d'autre à faire.
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
aoineko
Membre non connecté
Conseiller Municipal
Yep, les mapper megarom c'est ma prochaine étape.
Mais j'aime bien finir proprement ce que j'ai commencé.
D'ailleurs, cette fois je pense avoir bien compris comment ça marche.
Pour détecter qu'un slot est étendu, il faut bien :
- Sélectionner le slot primaire dans la page 3
- Lire la valeur de FFFFh
- L'incrémenter (pour gérer le cas d'une ROM sur un slot non-étendu)
- Ecrire la valeur en FFFFh
- Relire la valeur de FFFFh
Le slot est étendu si on récupère bien l'inverse de la valeur incrémentée.
(Il faut évidemment rétablir tout ce qu'on à modifier pour le test)
Après, vu que le BIOS fait déjà ce travail au démarrage et que ces valeurs ne vont pas changer au cours de l'exécution du programme, LA meilleure méthode c'est effectivement de lire la variable EXPTBL (FCC1h ~FCC4h) qui a déjà ces infos. Et même si on veux récupérer la zone mémoire alloué aux variables du BIOS pour augmenter la mémoire dispo, il suffit de sauvegarder ces valeurs quelques part au début de son programme.
Mais j'aime bien finir proprement ce que j'ai commencé.
D'ailleurs, cette fois je pense avoir bien compris comment ça marche.
Pour détecter qu'un slot est étendu, il faut bien :
- Sélectionner le slot primaire dans la page 3
- Lire la valeur de FFFFh
- L'incrémenter (pour gérer le cas d'une ROM sur un slot non-étendu)
- Ecrire la valeur en FFFFh
- Relire la valeur de FFFFh
Le slot est étendu si on récupère bien l'inverse de la valeur incrémentée.
(Il faut évidemment rétablir tout ce qu'on à modifier pour le test)
Après, vu que le BIOS fait déjà ce travail au démarrage et que ces valeurs ne vont pas changer au cours de l'exécution du programme, LA meilleure méthode c'est effectivement de lire la variable EXPTBL (FCC1h ~FCC4h) qui a déjà ces infos. Et même si on veux récupérer la zone mémoire alloué aux variables du BIOS pour augmenter la mémoire dispo, il suffit de sauvegarder ces valeurs quelques part au début de son programme.
On est toujours ignorant avant de savoir.
En effet, on utilise le terme Page à la place de Bank.
A ce propos, je ne sais pas si on utilise Page à bon escient ? Surtout, qu'il y a risque de quiproquo avec les pages d'un memory-mapper...
Par contre, FFFFh fonctionne plutôt comme le Port A8h en écriture. Le port A8h sélectionne les slots pour chaque Bank. Tandis que FFFFh permet de sélectionner les sous-slot pour chaque Bank (à condition que le Sloten question en page 3 soit étendu). Du coup, en lecture, les bits seront inversés seulement pour les Banks où tu auras sélectionné un Slot étendu. Enfin, je vois ça comme ça. Sinon, lorsque tu aurais un Slot étendu, comment savoir qu'un autre Slot est étendu ou pas ?
0xA8h :
b7 b6 - b5 b4 - b3 b2 - b1 b0
Bank3 - Bank2- Bank1 - Bank0
0xFFFFh (en écriture) :
b7 b6 - b5 b4 - b3 b2 - b1 b0
Bank3 - Bank2- Bank1 - Bank0
- Edit -
J'ai essayé de rectifier les erreurs... Edité par KN2000 Le 15/12/2021 à 18h32
A ce propos, je ne sais pas si on utilise Page à bon escient ? Surtout, qu'il y a risque de quiproquo avec les pages d'un memory-mapper...
Par contre, FFFFh fonctionne plutôt comme le Port A8h en écriture. Le port A8h sélectionne les slots pour chaque Bank. Tandis que FFFFh permet de sélectionner les sous-slot pour chaque Bank (à condition que le Slot
0xA8h :
b7 b6 - b5 b4 - b3 b2 - b1 b0
Bank3 - Bank2- Bank1 - Bank0
0xFFFFh (en écriture) :
b7 b6 - b5 b4 - b3 b2 - b1 b0
Bank3 - Bank2- Bank1 - Bank0
- Edit -
J'ai essayé de rectifier les erreurs... Edité par KN2000 Le 15/12/2021 à 18h32
Nous sommes en 2010 aps JC, toute la Gaule est envahie. Ah ben non, apparement, un village résiste encore aux envahisseurs Personalcomputerum et autres Consoledessalum. Bienvenue dans l'antre du emessix !
aoineko
Membre non connecté
Conseiller Municipal
KN2000 :
Du coup, en lecture, les bits seront inversés seulement pour les Banks où tu auras sélectionné un Slot étendu. Enfin, je vois ça comme ça. Sinon, lorsque tu aurais un Slot étendu, comment savoir qu'un autre Slot est étendu ou pas ?
Dans le Bios, j'ai vu que qu'il écrit 0xF0 en 0xFFFF et regarde s'il obtient 0x0F (l'inverse).
Le problème avec cette méthode, c'est que si tu as pas de chance et qu'une ROM se trouve dans un slot non-étendu et qu'elle contient la donnée 0x0F à son adresse 0xFFFF le code va croire à tord que le slot est étendu.
- Il va écrire 0xF0 (ce qui ne va rien faire puisque la ROM est en lecture seul),
- Puis il va lire 0x0F, non par parce que le slot est étendu mais parce que c'est la valeur de la ROM à l'adresse 0xFFFF.
Y a que 1 chance sur 256 que ça arrive, mais j'imagine que la suite du Bios (qui est incompréhensible avec mon niveau d'assembleur) gère ces cas.
Avec ma solution, comme tu lis d'abord la valeur en 0xFFFF et que tu l'incrémentes, tu peux savoir à coup sûr si le slot est étendu et éviter le faux positif avec une ROM en slot non étendu.
On est toujours ignorant avant de savoir.
Attention, si tu lis la valeur "00 00 00 11" b en FFFFh, quand tu incrémentes de 1, ta valeur passe à "00 00 01 00" b.
=> Pour le bank 3, c'est ce que tu voulais.
=> Par contre, pour le bank 2, tu sélectionnes un autre sous-slot.Si le Slot sélectionné au bank2 n'est pas étendu, ça passe, si il est étendu ça casse... Si le même slot est sélectionné en Bank 2 et qu'il est étendu, tu viens de changer le contenu présent en Bank 2...
C'est pour ça, que le Bios teste la présence de RAM ailleurs qu'en 0xFFFFh. Comme l'a souligné Jipé, dès le MSX1, il est déconseillé d'utiliser l'adresse mémoire 0xFFFFh car la possibilité d'étendre un slot existe déjà dans la norme (Cf le Philips 8020).
Le Bios fait un peu ce qu'il veut. Les interruptions, les variables... ne sont pas encore placées. Je dirais même la pile car il faut qu'il trouve d'abord la Ram avant de pouvoir la placer. Un MSX doit avoir au moins 16ko de Ram et dans ce cas, elle doit être située en Bank3. Edité par KN2000 Le 15/12/2021 à 18h35
=> Pour le bank 3, c'est ce que tu voulais.
=> Par contre, pour le bank 2, tu sélectionnes un autre sous-slot.
C'est pour ça, que le Bios teste la présence de RAM ailleurs qu'en 0xFFFFh. Comme l'a souligné Jipé, dès le MSX1, il est déconseillé d'utiliser l'adresse mémoire 0xFFFFh car la possibilité d'étendre un slot existe déjà dans la norme (Cf le Philips 8020).
Le Bios fait un peu ce qu'il veut. Les interruptions, les variables... ne sont pas encore placées. Je dirais même la pile car il faut qu'il trouve d'abord la Ram avant de pouvoir la placer. Un MSX doit avoir au moins 16ko de Ram et dans ce cas, elle doit être située en Bank3. Edité par KN2000 Le 15/12/2021 à 18h35
Nous sommes en 2010 aps JC, toute la Gaule est envahie. Ah ben non, apparement, un village résiste encore aux envahisseurs Personalcomputerum et autres Consoledessalum. Bienvenue dans l'antre du emessix !
aoineko
Membre non connecté
Conseiller Municipal
Un fois que mon slot principal est set dans la page 3 du port I/O 0xA8, quelque soit la valeur écrite en 0xFFFF je devrais récupérer l'inverse si le slot est étendu, non ?
De ce que j'ai lu, j'ai pas l'impression que la valeur qu'on écrit en 0xFFFF n'ai d'impact sur la détection du fait que le slot principal est étendu ou non.
Me trompe-je !?
EDIT : Je précise que je ne parle ici que de la détection d'un slot étendu et non pas de sélection d'un slot en particulier.
De ce que j'ai lu, j'ai pas l'impression que la valeur qu'on écrit en 0xFFFF n'ai d'impact sur la détection du fait que le slot principal est étendu ou non.
Me trompe-je !?
EDIT : Je précise que je ne parle ici que de la détection d'un slot étendu et non pas de sélection d'un slot en particulier.
On est toujours ignorant avant de savoir.
Tu as raison.
Pour tester si un slot est étendu :
- il faut le sélectionner en bank 3 grâce au port 0xA8h,
- à ce moment là, si le slot est étendu, tu as accès à son adresse de commutation de sous-slot en 0xFFFFh,
- la valeur que tu envoies va concerner que les sous-slots du slot sélectionné en Bank3.
- si le slot que tu as sélectionné est étendu, la valeur que tu vas lire sera bien inversée.
Je me suis planté dans mon raisonnement.
Dans mon cas, je vais choisir la solution préconisée par Metalion. Cette solution est élégante (il y a moyen d'avoir un code clair et facile à maintenir) et ça m'évitera les maux de tête que me procure le listing Bios. Edité par KN2000 Le 15/12/2021 à 18h41
Pour tester si un slot est étendu :
- il faut le sélectionner en bank 3 grâce au port 0xA8h,
- à ce moment là, si le slot est étendu, tu as accès à son adresse de commutation de sous-slot en 0xFFFFh,
- la valeur que tu envoies va concerner que les sous-slots du slot sélectionné en Bank3.
- si le slot que tu as sélectionné est étendu, la valeur que tu vas lire sera bien inversée.
Je me suis planté dans mon raisonnement.
Dans mon cas, je vais choisir la solution préconisée par Metalion. Cette solution est élégante (il y a moyen d'avoir un code clair et facile à maintenir) et ça m'évitera les maux de tête que me procure le listing Bios. Edité par KN2000 Le 15/12/2021 à 18h41
Nous sommes en 2010 aps JC, toute la Gaule est envahie. Ah ben non, apparement, un village résiste encore aux envahisseurs Personalcomputerum et autres Consoledessalum. Bienvenue dans l'antre du emessix !
aoineko
Membre non connecté
Conseiller Municipal
KN2000 :
Dans mon cas, je vais choisir la solution préconisée par Metalion. Cette solution est élégante (il y a moyen d'avoir un code clair et facile à maintenir) et ça m'évitera les maux de tête que me procure le listing Bios.
Moi aussi.
Mon seul soucis avec les ROM Mapper, c'est que je ne suis pas sûr que toutes les cartouche flash ROM les supportent.
Dès que j'en ai fini avec mes slots, je vais me pencher sur la question.
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
J'ai eu le fin mot de l'histoire avec le BIOS sur MRC.
Je le note ici au cas ou ça intéresse quelqu'un.
Donc, le BIOS fait bien un double test (pour éviter le problème des ROM en slot non-étendu discuté plus haut).
Les étapes de la détection du BIOS sont :
- Sélectionner le slot qu'on veut tester dans la page 3 du registre I/O 0xA8
- Ecrire 0xF0 à l'adresse 0xFFFF
- Lire 0xFFFF et vérifier qu'on récupère l'inverse (0x0F)
- Sinon, le slot n'est pas étendu (ici on détecte une RAM ou une ROM dans un slot non-étendu, sauf le cas d'une ROM qui aurait la valeur 0x0F en 0xFFFF)
- Ecrire 0x00 à l'adresse 0xFFFF
- Lire 0xFFFF et vérifier qu'on récupère l'inverse (0xFF)
- Sinon, le slot n'est pas étendu (cas d'une ROM qui aurait la valeur 0x0F en 0xFFFF)
- Si oui, cette fois on peut certifier qu'il s'agit bien d'un slot étendu !
Pfff... y a des choix de design du système qui complexifie pas mal les choses, mais au moins, cette fois c'est clair.
Je vais pouvoir passer à autre chose.
Je le note ici au cas ou ça intéresse quelqu'un.
Donc, le BIOS fait bien un double test (pour éviter le problème des ROM en slot non-étendu discuté plus haut).
Code ASM :
... ld hl,0FFFFH ld (hl),0F0H ld a,(hl) sub 00FH ; is slot expanded (writen value readback inverted) ? jr nz,NonExpandedSlot ; nope, ld (hl),a ld a,(hl) inc a ; is slot expanded (writen value readback inverted) ? jr nz,NonExpandedSlot ; nope, ExpandedSlot: ... NonExpandedSlot: ...
Les étapes de la détection du BIOS sont :
- Sélectionner le slot qu'on veut tester dans la page 3 du registre I/O 0xA8
- Ecrire 0xF0 à l'adresse 0xFFFF
- Lire 0xFFFF et vérifier qu'on récupère l'inverse (0x0F)
- Sinon, le slot n'est pas étendu (ici on détecte une RAM ou une ROM dans un slot non-étendu, sauf le cas d'une ROM qui aurait la valeur 0x0F en 0xFFFF)
- Ecrire 0x00 à l'adresse 0xFFFF
- Lire 0xFFFF et vérifier qu'on récupère l'inverse (0xFF)
- Sinon, le slot n'est pas étendu (cas d'une ROM qui aurait la valeur 0x0F en 0xFFFF)
- Si oui, cette fois on peut certifier qu'il s'agit bien d'un slot étendu !
Pfff... y a des choix de design du système qui complexifie pas mal les choses, mais au moins, cette fois c'est clair.
Je vais pouvoir passer à autre chose.
On est toujours ignorant avant de savoir.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie