MSX Village forum

La Place des Développeurs Questions divers sur le VDP

aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 02/12/2020 à 01h22
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ù :moue) 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.
Github    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5484

Le 02/12/2020 à 09h06
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 :lol


Le Screen 9 ? ... Non ! mais qui s'en soucis ?


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 02/12/2020 à 10h07
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 ?


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: 2698

Le 02/12/2020 à 11h11
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.
Github    
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 553

Le 02/12/2020 à 12h19
pinces, ciseaux, bistouri, ... dissèque le bios et sa sub-rom :)


Toute matrice carrée sur un corps K, dont le polynôme caractéristique est scindé, est semblable à une matrice de Jordan. Cette réduction est unique à l'ordre des blocs près. De plus, toute matrice carrée nilpotente sur un corps K est semblable à une matrice de Jordan dont chaque bloc est associé à la valeur 0. Évidement, cette réduction est encore unique à l'ordre des blocs près...
:)
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 02/12/2020 à 12h42
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. :oups

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

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 02/12/2020 à 21h35
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 :oups) 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.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 03/12/2020 à 14h39
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 ?


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10331

Le 03/12/2020 à 16h29
le seul VDP que je connais qui permet des pages " paramétrables " en largeur et hauteur est le V9990


:noel
Site web    
TurboSEB Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 08/08/2010 à 20h57

Messages: 5792

Le 03/12/2020 à 17h31
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 :tea

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 :tea Edité par TurboSEB Le 03/12/2020 à 17h38



MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
   
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 553

Le 03/12/2020 à 18h12
On peut utiliser les interruptions pour changer de page en cours d'affichage, c'est faisable.
Beaucoup de jeux msx2 utilisent cette technique.


Toute matrice carrée sur un corps K, dont le polynôme caractéristique est scindé, est semblable à une matrice de Jordan. Cette réduction est unique à l'ordre des blocs près. De plus, toute matrice carrée nilpotente sur un corps K est semblable à une matrice de Jordan dont chaque bloc est associé à la valeur 0. Évidement, cette réduction est encore unique à l'ordre des blocs près...
:)
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 03/12/2020 à 20h58
OK, nickel :top

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 ? :hum


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

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 553

Le 03/12/2020 à 21h39
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


Toute matrice carrée sur un corps K, dont le polynôme caractéristique est scindé, est semblable à une matrice de Jordan. Cette réduction est unique à l'ordre des blocs près. De plus, toute matrice carrée nilpotente sur un corps K est semblable à une matrice de Jordan dont chaque bloc est associé à la valeur 0. Évidement, cette réduction est encore unique à l'ordre des blocs près...
:)
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 04/12/2020 à 23h29
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.

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

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 06/12/2020 à 19h02
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 ! :oups
- 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 :moue
- 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 :sick
- 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) :tchin


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