La Place des Développeurs Changer le slot d'une page en assembleur
aoineko
Membre non connecté
Conseiller Municipal
Hello,
J'aime bien comprendre ce que je fais et ça m'amène souvent à réinventer la roue.
Cette fois, j'essaye de faire un changement de slot manuellement (sans passer par le BIOS).
Ce que j'ai trouvé, c'est :
- On peut lire / écrire le slot principale via le port I/O A8h
- On peut lire / écrire le slot secondaire via l'adresse FFFFh (avec le slot principal sélectionné en page 3)
Par contre, je ne trouve pas où est stocké physiquement le fait qu'un slot est étendu ou non.
Le BIOS utilise les adresses mémoires nommé EXPTBL (FCC1h~FCC4h), mais d'où vient cette info ?
Dans le code de démarrage du système y a forcement un mécanisme qui détermine ces valeurs... je devrais donc pouvoir accéder à ces infos via mon programme.
Une idée ?
J'aime bien comprendre ce que je fais et ça m'amène souvent à réinventer la roue.
Cette fois, j'essaye de faire un changement de slot manuellement (sans passer par le BIOS).
Ce que j'ai trouvé, c'est :
- On peut lire / écrire le slot principale via le port I/O A8h
- On peut lire / écrire le slot secondaire via l'adresse FFFFh (avec le slot principal sélectionné en page 3)
Par contre, je ne trouve pas où est stocké physiquement le fait qu'un slot est étendu ou non.
Le BIOS utilise les adresses mémoires nommé EXPTBL (FCC1h~FCC4h), mais d'où vient cette info ?
Dans le code de démarrage du système y a forcement un mécanisme qui détermine ces valeurs... je devrais donc pouvoir accéder à ces infos via mon programme.
Une idée ?
On est toujours ignorant avant de savoir.
Allez avoues que tu es en train d'écrire une nouvelle ROM principale pour remplacer les Bios existants...
Je pensais que c'était dans le livre Pratique du MSX2 d'Ascheberg. Je l'ai visionné mais ce n'est pas le cas.
La détection des Sous Slots se produit très tôt. Elle doit se produire lors du RST0. Il faudrait le source en C du Bios.
Je pensais que c'était dans le livre Pratique du MSX2 d'Ascheberg. Je l'ai visionné mais ce n'est pas le cas.
La détection des Sous Slots se produit très tôt. Elle doit se produire lors du RST0. Il faudrait le source en C du Bios.
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 !
Sector28
Membre non connecté
Villageois
aoineko
Membre non connecté
Conseiller Municipal
On m'a indiqué ce code sur MRC : https://sourceforge.net/p/msxsyssrc/git/ci/master/tree/base100/msxio.mac.
Mais bon, avec mon niveau d'assembleur, je suis pas sûr de tout capté.
J'ai l'impression que le test se limite à écrire une valeur en FFFFh après avoir sélectionné le slot principal via le port I/O A8h et de vérifier qu'on lit l'inverse.
Dans ce cas le slot est étendu ; sinon il ne l'est pas.
Ce que je comprends pas c'est que l'adresse FFFFh semble stocker 1 octet pour chacun des 4 slots principaux.
Cette mémoire est ou ? Pas en RAM apparemment.
C'est dans un composant électronique à part ?
C'est déjà le cas. Mais jusqu'à présent, je laissais toujours la page 0 sur ma ROM (ou j'ai un gestionnaire d'interruption).
Là, ça serait pour pouvoir switch facilement la page 0 depuis les pages de mon programmes (pages 1 et 2 / 4000h~BFFFh).
Mais bon, avec mon niveau d'assembleur, je suis pas sûr de tout capté.
J'ai l'impression que le test se limite à écrire une valeur en FFFFh après avoir sélectionné le slot principal via le port I/O A8h et de vérifier qu'on lit l'inverse.
Dans ce cas le slot est étendu ; sinon il ne l'est pas.
Ce que je comprends pas c'est que l'adresse FFFFh semble stocker 1 octet pour chacun des 4 slots principaux.
Cette mémoire est ou ? Pas en RAM apparemment.
C'est dans un composant électronique à part ?
KN2000 :
Allez avoues que tu es en train d'écrire une nouvelle ROM principale pour remplacer les Bios existants...
C'est déjà le cas. Mais jusqu'à présent, je laissais toujours la page 0 sur ma ROM (ou j'ai un gestionnaire d'interruption).
Là, ça serait pour pouvoir switch facilement la page 0 depuis les pages de mon programmes (pages 1 et 2 / 4000h~BFFFh).
On est toujours ignorant avant de savoir.
Tu peux aussi écrire un programme DOS. Mais il faut que ta cible soit équipée pour pouvoir lancer le DOS (par exemple, avoir un lecteur de disquette fonctionnel).
L'octet en FFFFh est plutôt associé aux pages que voit le Z80. Le résultat va dépendre des slots sélectionnés pour les 4 pages. Par exemple, si j'écris la valeur F0h (11 11 00 00 en binaire) dans FFFFh. Je vais demander le sous-slot 3 pour la page 3, le sous-slot 3 pour la page 2, le sous-slot 0 pour la page 1 et le sous-slot 0 pour la page 0. Et en lisant le contenu de FFFFh, je dois trouver 0Fh si tous les slots sélectionnés dans A8 sont étendus. Le principe doit être à peu près ça (je n'arrive pas à avoir la page que tu indiques).
Il vaut mieux ne pas modifier le sous-slot de la page où s’exécute ton programme et être prudent avec la page 3.
- Edit -
Il suffisait juste de retirer le point après mac. Du coup, c'est exactement ce qu'il te faut (c'est d'ailleurs ce que préconisait de faire Sector28). En plus, il y a déjà des étiquettes plus parlantes. C'est un peu hard à comprendre car c'est imbriqué avec la recherche de la RAM dans les différents Slots/Sous Slots du MSX. Et si mes souvenirs sont bons, il va retenir la combinaison slot/sous-slot où il y a le plus de RAM (le memory mapper n'entre pas en jeu). Edité par KN2000 Le 14/12/2021 à 00h12
L'octet en FFFFh est plutôt associé aux pages que voit le Z80. Le résultat va dépendre des slots sélectionnés pour les 4 pages. Par exemple, si j'écris la valeur F0h (11 11 00 00 en binaire) dans FFFFh. Je vais demander le sous-slot 3 pour la page 3, le sous-slot 3 pour la page 2, le sous-slot 0 pour la page 1 et le sous-slot 0 pour la page 0. Et en lisant le contenu de FFFFh, je dois trouver 0Fh si tous les slots sélectionnés dans A8 sont étendus. Le principe doit être à peu près ça (je n'arrive pas à avoir la page que tu indiques).
Il vaut mieux ne pas modifier le sous-slot de la page où s’exécute ton programme et être prudent avec la page 3.
- Edit -
Il suffisait juste de retirer le point après mac. Du coup, c'est exactement ce qu'il te faut (c'est d'ailleurs ce que préconisait de faire Sector28). En plus, il y a déjà des étiquettes plus parlantes. C'est un peu hard à comprendre car c'est imbriqué avec la recherche de la RAM dans les différents Slots/Sous Slots du MSX. Et si mes souvenirs sont bons, il va retenir la combinaison slot/sous-slot où il y a le plus de RAM (le memory mapper n'entre pas en jeu). Edité par KN2000 Le 14/12/2021 à 00h12
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 !
Euh, je crois qu'il faut voir ça à tête bien reposée.
Si ta routine de test est en page 0,
Tu récupères ta configuration des Slots avec le port A8.
Tu changes le slot de la page 1, par exemple, en sélectionnant 0.
Tu récupères la valeur contenu dans FFFFh.
Tu inverses b7 à b0 de cette valeur.
Tu mets à 1, b5 et b4 de cette valeur et tu l'écris dans FFFFh.
Tu relis FFFFh, si b5 et b4 sont à 0 (et ont donc été inversés), le Slot 0 est étendu.
- Edit -
La page que tu as trouvée est précieuse car commentée en grande partie.
Maintenant, reste à être sûr que la valeur reste inchangée (en binaire b7b6 11 b4b3 b2b1) si le slot 0 n'est pas étendu mais que l'on soit en cours d'utilisation du slot3 pour les pages 2 et 3 et que ce slot3 soit étendu, par exemple. Edité par KN2000 Le 14/12/2021 à 09h01
Si ta routine de test est en page 0,
Tu récupères ta configuration des Slots avec le port A8.
Tu changes le slot de la page 1, par exemple, en sélectionnant 0.
Tu récupères la valeur contenu dans FFFFh.
Tu inverses b7 à b0 de cette valeur.
Tu mets à 1, b5 et b4 de cette valeur et tu l'écris dans FFFFh.
Tu relis FFFFh, si b5 et b4 sont à 0 (et ont donc été inversés), le Slot 0 est étendu.
- Edit -
La page que tu as trouvée est précieuse car commentée en grande partie.
Maintenant, reste à être sûr que la valeur reste inchangée (en binaire b7b6 11 b4b3 b2b1) si le slot 0 n'est pas étendu mais que l'on soit en cours d'utilisation du slot3 pour les pages 2 et 3 et que ce slot3 soit étendu, par exemple. Edité par KN2000 Le 14/12/2021 à 09h01
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
Grauw sur MRC m'a expliqué que l'adresse FFFFh est memory-mapped vers un registre I/O.
Ce registre renvoi l'inverse de ce qu'on y écrit si le slot en page 3 est étendu.
C'est assez simple finalement.
Le dernier point où j'ai un doute, c'est sur le fait que cette adresse soit memory-mapped aussi dans le cas d'un slot non-étendu.
Par ex., si une ROM était dans la page 3 d'un slot non étendu (ce qui n'a pas beaucoup de sens en pratique), est-ce qu'en accédant à FFFFh j'obtiendrai le contenu de la ROM à cette adresse ou est-ce que là aussi j'aurai le résultat du registre I/O ?
Ce registre renvoi l'inverse de ce qu'on y écrit si le slot en page 3 est étendu.
C'est assez simple finalement.
Le dernier point où j'ai un doute, c'est sur le fait que cette adresse soit memory-mapped aussi dans le cas d'un slot non-étendu.
Par ex., si une ROM était dans la page 3 d'un slot non étendu (ce qui n'a pas beaucoup de sens en pratique), est-ce qu'en accédant à FFFFh j'obtiendrai le contenu de la ROM à cette adresse ou est-ce que là aussi j'aurai le résultat du registre I/O ?
On est toujours ignorant avant de savoir.
la mémorisation de la valeur de FFFFh est faite dans le LS273 qui se comporte comme une mémoire
voir l'explication en image ici : http://msxvillage.fr/forum/topic.php?id=3767#m84611
voir l'explication en image ici : http://msxvillage.fr/forum/topic.php?id=3767#m84611
aoineko
Membre non connecté
Conseiller Municipal
Mais du coup, qu'en est-il sur les slots non-étendus ?
Est-ce que FFFFh est accessible normalement comme une autre adresse ?
Ou ce genre de montage existe aussi sur les slots non-étendus... uniquement dans le but de dire qu'ils ne sont pas étendus ?
Est-ce que FFFFh est accessible normalement comme une autre adresse ?
Ou ce genre de montage existe aussi sur les slots non-étendus... uniquement dans le but de dire qu'ils ne sont pas étendus ?
On est toujours ignorant avant de savoir.
si on prend un MSX 1 avec 64k de mémoire pour exemple on voit bien que l'adresse FFFFh n'est pas réservé aux slots étendus
des programmes se servaient même de cette adresse pour mémoriser une valeur de bank et sont devenus incompatibles avec le VG8020 qui avait un slot étendu
https://www.msx.org/wiki/Philips_VG-8020
des programmes se servaient même de cette adresse pour mémoriser une valeur de bank et sont devenus incompatibles avec le VG8020 qui avait un slot étendu
https://www.msx.org/wiki/Philips_VG-8020
aoineko
Membre non connecté
Conseiller Municipal
OK, mais du coup, ça veut dire que écrire une valeur en FFFFh et lire son inverse ne suffit pas à déterminer si un slot est étendu, non ?
Par ex., s'il y a une ROM sur un slot non-étendu avec la valeur 00h à l'adresse FFFFh : si j'essaye d'écris FFh à l'adresse FFFFh et relis cette adresse, je vais récupérer 00h (l'inverse) alors que le slot n'est pas étendu.
Ca ne fait que 1 chance sur 256 d'avoir une ROM avec la valeur inverse qu'on essaye d'écrire en FFFFh mais bon, ça me semble quand même vachement dangereux.
La seule solution qui me semble viable serait (en pseudo code) :
Ou alors, il y a un truc qui m'échappe ?
Par ex., s'il y a une ROM sur un slot non-étendu avec la valeur 00h à l'adresse FFFFh : si j'essaye d'écris FFh à l'adresse FFFFh et relis cette adresse, je vais récupérer 00h (l'inverse) alors que le slot n'est pas étendu.
Ca ne fait que 1 chance sur 256 d'avoir une ROM avec la valeur inverse qu'on essaye d'écrire en FFFFh mais bon, ça me semble quand même vachement dangereux.
La seule solution qui me semble viable serait (en pseudo code) :
Code C :
A = (FFFFh) // récupérer la valeur en FFFFh A++ // l'incrémenter (FFFFh) = A // essayer de l'écrire B = (FFFFh) // relire la valeur si(B == inverse A) : Le slote est étendu si(B == A) : RAM dans un slot non-étendu sinon : ROM dans un slot non-étendu
Ou alors, il y a un truc qui m'échappe ?
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Hum... j'ai l'impression de comprends de moins en moins...
Pour changer le slot secondaire, on est bien censé modifier la valeur en FFFFh, non ?
Pareil pour détecter la présence de slot étendu, le BIOS essaye bien de modifier la valeur à cette adresse pour chaque slot au démarrage, non ?
Du coup, pourquoi ça planterai si c'est moi qui le fait ?
Je n'ai pas précisé, mais dans le cas d'un check de slot étendu, je parle évidement de modification "temporaire".
Dans ce cadre, je remettrai la valeur initial avant de passer au slot suivant.
C'est de ça dont tu parles pour le crash ?
Qu'entends-tu par "Bank" ?
Pour moi C000h à FFFFh c'est la "page" 3, et je vois pas ce qui empêche de la modifier quand elle pointe vers un slot de RAM.
En dehors de la zone réservé aux variables du BIOS.
C'est de ça dont tu parles ?
JIPEMSX :
si tu change la valeur de FFFFh tu risque de planter le MSX
essaye de mettre AAh dans un Sony ou un Panasonic pour voir
essaye de mettre AAh dans un Sony ou un Panasonic pour voir
Pour changer le slot secondaire, on est bien censé modifier la valeur en FFFFh, non ?
Pareil pour détecter la présence de slot étendu, le BIOS essaye bien de modifier la valeur à cette adresse pour chaque slot au démarrage, non ?
Du coup, pourquoi ça planterai si c'est moi qui le fait ?
Je n'ai pas précisé, mais dans le cas d'un check de slot étendu, je parle évidement de modification "temporaire".
Dans ce cadre, je remettrai la valeur initial avant de passer au slot suivant.
C'est de ça dont tu parles pour le crash ?
JIPEMSX :
il ne faut pas toucher a la valeur du Bank C000h à FFFFh
Qu'entends-tu par "Bank" ?
Pour moi C000h à FFFFh c'est la "page" 3, et je vois pas ce qui empêche de la modifier quand elle pointe vers un slot de RAM.
En dehors de la zone réservé aux variables du BIOS.
C'est de ça dont tu parles ?
On est toujours ignorant avant de savoir.
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 ...
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)
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie