MSX Village forum

La Place des Développeurs Changer le slot d'une page en assembleur

Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1503

Le 14/12/2021 à 18h32

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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 14/12/2021 à 18h57
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. ^^


On est toujours ignorant avant de savoir.
Github    
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1503

Le 15/12/2021 à 09h39
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.


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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 15/12/2021 à 10h34
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.


On est toujours ignorant avant de savoir.
Github    
KN2000 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 08/06/2010 à 09h30

Messages: 209

Le 15/12/2021 à 15h37
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 Slot en 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 ? :sick


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... :oups 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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 15/12/2021 à 16h27
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 ? :sick


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.
Github    
KN2000 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 08/06/2010 à 09h30

Messages: 209

Le 15/12/2021 à 17h16
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


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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 15/12/2021 à 17h48
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 !? :hum

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.
Github    
KN2000 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 08/06/2010 à 09h30

Messages: 209

Le 15/12/2021 à 18h24
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


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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 15/12/2021 à 19h01
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. :D

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.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 15/12/2021 à 23h48
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).
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. :jesors


On est toujours ignorant avant de savoir.
Github    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie