La Place des Développeurs Questions divers sur le VDP
aoineko
Membre non connecté
Conseiller Municipal
Salut,
Je suis en train de refaire ma lib pour m'affranchir complètement du Bios et là je suis en pleine refonte de ma gestion du VDP.
Je vais avoir quelques questions donc j'ouvre un post pour les rassembler.
La première fournée :
1) J'ai lu quelques part (je retrouve plus où ) que le VDP du MSX1 ne supporte pas l'écriture séquentiel (celle ou le registre du VDP est incrémenté). Hors, la doc du TMS9918 n'est pas très clair, mais j'ai l'impression qu'elle suggère que c'est censé fonctionner. Qu'en est-il ?
2) Vous auriez des infos sur les registres VDP du MSX2+ (V9958) ? Grace au debuggeur d'OpenMSX, j'ai vu que ça concernait les paramètres de couleur YJK et le scrolling, mais j'ai pas trouvé de doc précise sur le sujet.
3) Est-ce que vous auriez des infos sur le Screen9 des MSX Coréen ? J'ai vu qu'il correspond au Screen5 et 6 en fonction du Width <= 40 ou > 40 mais j'ai pas plus de détail.
Voilà, ça sera tout pour le moment.
Je suis en train de refaire ma lib pour m'affranchir complètement du Bios et là je suis en pleine refonte de ma gestion du VDP.
Je vais avoir quelques questions donc j'ouvre un post pour les rassembler.
La première fournée :
1) J'ai lu quelques part (je retrouve plus où ) que le VDP du MSX1 ne supporte pas l'écriture séquentiel (celle ou le registre du VDP est incrémenté). Hors, la doc du TMS9918 n'est pas très clair, mais j'ai l'impression qu'elle suggère que c'est censé fonctionner. Qu'en est-il ?
2) Vous auriez des infos sur les registres VDP du MSX2+ (V9958) ? Grace au debuggeur d'OpenMSX, j'ai vu que ça concernait les paramètres de couleur YJK et le scrolling, mais j'ai pas trouvé de doc précise sur le sujet.
3) Est-ce que vous auriez des infos sur le Screen9 des MSX Coréen ? J'ai vu qu'il correspond au Screen5 et 6 en fonction du Width <= 40 ou > 40 mais j'ai pas plus de détail.
Voilà, ça sera tout pour le moment.
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
Hula hup ...
Pour le VDP du MSX2, tu as la doc du Yamaha 9958 ici : http://map.grauw.nl/resources/video/yamaha_v9958_ocr.pdf
Mais y a pas grand chose en plus.
Si tu regardes dans Fusion-c, j'ai des fonctions spécifiques MSX2+ pour les scrolling, le scroll sur une double page 512x212, et divers bidules spécifiques, sans grand intérêt pratique en fait.
Ma lib dédiée au VDP MSX2, V9938, est entièrement en ASM et fait appel uniquement aux instructions du VDP. J'ai beaucoup travaillé cette partie, et je pense qu'elle est très bien optimisée.
Pour le VDP du MSX1, le problème c'est la vitesse d'accès qui pose problème, pas les instructions en elles mêmes.
Si tu lui balance des choses trop rapidement, tu vas avoir des données corompues. NOP est ton amis
Le Screen 9 ? ... Non ! mais qui s'en soucis ?
Pour le VDP du MSX2, tu as la doc du Yamaha 9958 ici : http://map.grauw.nl/resources/video/yamaha_v9958_ocr.pdf
Mais y a pas grand chose en plus.
Si tu regardes dans Fusion-c, j'ai des fonctions spécifiques MSX2+ pour les scrolling, le scroll sur une double page 512x212, et divers bidules spécifiques, sans grand intérêt pratique en fait.
Ma lib dédiée au VDP MSX2, V9938, est entièrement en ASM et fait appel uniquement aux instructions du VDP. J'ai beaucoup travaillé cette partie, et je pense qu'elle est très bien optimisée.
Pour le VDP du MSX1, le problème c'est la vitesse d'accès qui pose problème, pas les instructions en elles mêmes.
Si tu lui balance des choses trop rapidement, tu vas avoir des données corompues. NOP est ton amis
Le Screen 9 ? ... Non ! mais qui s'en soucis ?
aoineko
Membre non connecté
Conseiller Municipal
Je maitrise bien tout ce qui est MSX2. C'est plus sur le MSX1 que j'ai du mal (surtout que j'ai pas de hardware pour tester).
Pour les accès au VDP, que ce soit MSX1 ou MSX2, il faut toujours s'assurer qu'il est dispo (via le bit CE sur registre S2) avant de lui envoyer des commandes, non ?
Pour les accès au VDP, que ce soit MSX1 ou MSX2, il faut toujours s'assurer qu'il est dispo (via le bit CE sur registre S2) avant de lui envoyer des commandes, non ?
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
En fait, le port 9Bh (Indirect VDP register access port) n'existe tout simplement pas sur le TMS9918 (VDP du MSX1) donc ça règle le problème : On ne peut effectivement pas utiliser l'écriture incrémentale (« indirect ») sur MSX1.
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Sector28 :
pinces, ciseaux, bistouri, ... dissèque le bios et sa sub-rom
Oui, je me doute que c'est le meilleur moyen de voir comment le système MSX fait de base, mais déjà que j'ai du mal avec de l'asm de base, mais alors une version désassemblée (donc sans labels textuels et sans commentaires), ça me semble au dessus de mes moyens.
Bon, de toute façon ça avance bien. A part pour le Screen 9 coréen (qui "oui", n'a pas beaucoup d'importance), j'ai mes réponses sur l'écriture séquentiel sur MSX1 (impossible) et sur le sens des registres spécifiques au v9958 (merci MSX.org : https://www.msx.org/wiki/VDP_Specific_MSX2%2B_Registers ... je sais pas comment j'avais fait pour passer à coté).
J'ai même retrouvé la raison pour laquelle j'utilisais des brouettes de outi plutôt que d'utiliser le otri : parce que c'est bien plus rapide (cf. http://map.grauw.nl/articles/fast_loops.php)
Je laisse ce fil ouvert... il est probable que j'ai d'autres questions.
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Pour l'initialisation de ma lib, j'avais besoin de connaitre les réglages par défaut des registres du VDP quand on change le Screen via la Bios.
J'me suis donc fait un p'tit programme Basic (je souffre avec ce langage ) et j'ai exporté ces résultats dans un tableau.
Je les mets ici au cas ou ça serve à quelqu'un d'autres un jour.
La version PDF : DefaultModeReg.pdf (pour pouvoir faires des copier-coller)
PS : Je sais que ces paramètres sont dépendants en partie de la machine (ne serait-ce que le réglage 50/60Hz) ; je cherchais surtout les organisations de VRAM "standard" en fonction des modes.
J'me suis donc fait un p'tit programme Basic (je souffre avec ce langage ) et j'ai exporté ces résultats dans un tableau.
Je les mets ici au cas ou ça serve à quelqu'un d'autres un jour.
La version PDF : DefaultModeReg.pdf (pour pouvoir faires des copier-coller)
PS : Je sais que ces paramètres sont dépendants en partie de la machine (ne serait-ce que le réglage 50/60Hz) ; je cherchais surtout les organisations de VRAM "standard" en fonction des modes.
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Une question concernant le registre R#23 du V9938 qui permet de faire du scrolling vertical.
Est-ce qu'on peut afficher le contenu de la VRAM au delà de la Page courante ?
Prenons un exemple.
En Screen 5 (mode G4), une page définie un espace virtuel de 256x256 pixels (4-bits/px donc 32 KB).
A priori on peut scroller verticalement sans soucis dans cette espace mais quand on affiche une ligne dont la coordonnée Y absolue est supérieur à 256, ça boucle sur le début de la page.
N'y a-t-il pas moyen d'afficher plutôt la suite de la VRAM ?
L'idée serait de pouvoir scroller dans un espace de 256x512 pixels.
J'ai l'impression que le concept de Page n'est pas paramétrable (si on pouvait faire une page de 64 KB en G4 comme c'est le cas en G7 ça réglerait le problème).
Du coup, j'ai l'impression que la seule solution serait de changer la Page courante durant le HBLANK de la ligne 255 de la première page.
C'est faisable ou y a des restrictions qui font que ça marchera pas ?
Est-ce qu'on peut afficher le contenu de la VRAM au delà de la Page courante ?
Prenons un exemple.
En Screen 5 (mode G4), une page définie un espace virtuel de 256x256 pixels (4-bits/px donc 32 KB).
A priori on peut scroller verticalement sans soucis dans cette espace mais quand on affiche une ligne dont la coordonnée Y absolue est supérieur à 256, ça boucle sur le début de la page.
N'y a-t-il pas moyen d'afficher plutôt la suite de la VRAM ?
L'idée serait de pouvoir scroller dans un espace de 256x512 pixels.
J'ai l'impression que le concept de Page n'est pas paramétrable (si on pouvait faire une page de 64 KB en G4 comme c'est le cas en G7 ça réglerait le problème).
Du coup, j'ai l'impression que la seule solution serait de changer la Page courante durant le HBLANK de la ligne 255 de la première page.
C'est faisable ou y a des restrictions qui font que ça marchera pas ?
On est toujours ignorant avant de savoir.
TurboSEB
Membre non connecté
Conseiller Municipal
Dans certains numéro de mon mag Mega MSX News vers les numéros 30, il y a un programme Basic qui permet de scroller des pages (en screen 7 de mémoire, peut être screen 6) avec la souris.
C'est avec les fichiers de Dynamic Publisher que ca fonctionne.
Malheureusement, les versions de mon Mag en téléchargement, ne contiennent pas tous ce programme car les pré-versions envoyées à FlashFred étaient amputées des fichiers Dynamic Publisher.
Peut être qu'il y en a un complet, je cherche
Edit, peut être le numéro 21 car il y a un programme qui utilise des graphiques de Dynamic Publisher.
Le principe étant de scroller toutes les pages verticalement comme une longue feuille Edité par TurboSEB Le 03/12/2020 à 17h38
C'est avec les fichiers de Dynamic Publisher que ca fonctionne.
Malheureusement, les versions de mon Mag en téléchargement, ne contiennent pas tous ce programme car les pré-versions envoyées à FlashFred étaient amputées des fichiers Dynamic Publisher.
Peut être qu'il y en a un complet, je cherche
Edit, peut être le numéro 21 car il y a un programme qui utilise des graphiques de Dynamic Publisher.
Le principe étant de scroller toutes les pages verticalement comme une longue feuille Edité par TurboSEB Le 03/12/2020 à 17h38
MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
Sector28
Membre non connecté
Villageois
aoineko
Membre non connecté
Conseiller Municipal
OK, nickel
Alors, si j'ai bien compris :
- Je set le bit 4 "IE1" de R#0 à 1
- Je set R#19 avec la valeur de la ligne que je veux check (à priori, la dernière de ma 1re page)
- Je check le flag FH de S#1 dans mon code d'interruption (qui remplacera celui du Bios) et je lève un flag
- Je check le flag HR de S#2 dans mon code d'interruption SI mon flag est levé
- Si tout va bien, je suis dans le HBlank de la dernière ligne et je peux faire mon changement de page avant que la prochaine ligne soit affichée.
C'est bien ça ?
Alors, si j'ai bien compris :
- Je set le bit 4 "IE1" de R#0 à 1
- Je set R#19 avec la valeur de la ligne que je veux check (à priori, la dernière de ma 1re page)
- Je check le flag FH de S#1 dans mon code d'interruption (qui remplacera celui du Bios) et je lève un flag
- Je check le flag HR de S#2 dans mon code d'interruption SI mon flag est levé
- Si tout va bien, je suis dans le HBlank de la dernière ligne et je peux faire mon changement de page avant que la prochaine ligne soit affichée.
C'est bien ça ?
On est toujours ignorant avant de savoir.
Sector28
Membre non connecté
Villageois
Si tu scroll d'un pixel vers le haut, la dernière ligne devient l'avant dernière ligne, etc...
Je n'ai jamais essayé sur msx2, je l'ai fait sur amiga, mais avec le copper, c'est plus simple. Edité par Sector28 Le 03/12/2020 à 21h41
Je n'ai jamais essayé sur msx2, je l'ai fait sur amiga, mais avec le copper, c'est plus simple. Edité par Sector28 Le 03/12/2020 à 21h41
DONALD TRUMP IS FAST APPROACHING
NEMESIS ! RETURN IMMEDIATELY !
aoineko
Membre non connecté
Conseiller Municipal
Bon, ça va pas changer la face du monde, mais quelqu'un aurait-il des infos sur le bit #1 (BW) du registre #8 du V9938 ?
Il est décrit comme permettant de passer en mode "niveau de gris".
Pourtant, sur les émulateurs il semble n'avoir aucun effet.
Il est décrit comme permettant de passer en mode "niveau de gris".
Pourtant, sur les émulateurs il semble n'avoir aucun effet.
Code C :
// R#8 Mode Register 8 //----------------------------------------------------------------------------- // 7 6 5 4 3 2 1 0 WRITE ONLY // MS LP TP CB VR 0 SPD BW // │ │ │ │ │ │ └── BW defines the display to grayscale in 32 tones (1) or in colour. (0 by default)
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Bon, c'est pas une question puisse que j'ai trouvé la réponse, mais j'ai bien galéré à trouver comment utiliser les interruptions du HBlank !
Du coup, je mets les infos ici au cas ou ça puisse servir à quelqu'un.
Donc, pour que ça fonctionne :
- Il faut set le bit IE1 (10h) dans le registre R#0 du VDP
- Si on fait rien de plus, le système va entrer dans une boucle infinie !
- Une fois IE1 set, il faut absolument lire le registre de status S#1 pour que le flag soit reset (sinon ça bloque les autres interruptions du VDP)
- Pour se faire, il faut se brancher sur le hook H.KEYI et lire la valeur de S#1
- Attention dans ce hook, on ne peut pas utiliser les instructions di/ei sinon ça casse le système d'interruption
- Ne pas oublier de remettre S#0 dans le registre R#15 si on utilise le Bios car la routine principale d'interruption détecte le VBlank en checkant la valeur de S#0 sans initialiser R#15
- Et voilà, une fois tous ces pièges évités, on peut maintenant utiliser le registre R#19 pour choisir une ligne qui déclenchera l'interruption (horizontal scan interrupt)
Du coup, je mets les infos ici au cas ou ça puisse servir à quelqu'un.
Donc, pour que ça fonctionne :
- Il faut set le bit IE1 (10h) dans le registre R#0 du VDP
- Si on fait rien de plus, le système va entrer dans une boucle infinie !
- Une fois IE1 set, il faut absolument lire le registre de status S#1 pour que le flag soit reset (sinon ça bloque les autres interruptions du VDP)
- Pour se faire, il faut se brancher sur le hook H.KEYI et lire la valeur de S#1
- Attention dans ce hook, on ne peut pas utiliser les instructions di/ei sinon ça casse le système d'interruption
- Ne pas oublier de remettre S#0 dans le registre R#15 si on utilise le Bios car la routine principale d'interruption détecte le VBlank en checkant la valeur de S#0 sans initialiser R#15
- Et voilà, une fois tous ces pièges évités, on peut maintenant utiliser le registre R#19 pour choisir une ligne qui déclenchera l'interruption (horizontal scan interrupt)
On est toujours ignorant avant de savoir.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie