MSX Village forum

L'école [RESOLU] New Vision Technology Tentative d'affichage d'images en relief N.I.T

Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1486

Le 13/11/2013 à 20h17

Reprise du message précédent

Ah !!!! Donc ça marche sur un vrai MSX (contrairement à ce que disait GDX ce matin) !
C'est donc l'émulation qui pose un problème.

Le clignotement en SCREEN0 est normal, c'est l'action sur le registre 9 qui le met en route. La commande pour l'arrêter est : VDP(10)=VDP(10)AND251
La valeur du registre 13 spécifie la durée d'affichage de chaque page : VDP(14)= Temps page 0 x 16 + Temps page 1

Sauf erreur de ma part, il n'y a que 2 pages disponibles en VRAM pour le SCREEN12.
Ton schéma d'alternance va donc être difficile à réaliser.

EDIT : essaie un peu en enlevant carrément la commande VDP(10) du programme. Car je ne suis pas sur qu'elle soit nécessaire. Edité par Metalion Le 14/11/2013 à 09h21


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)
   
GDX Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 14/11/2013 à 00h26
igal :
@Métalion: Afin d'afficher alternativement avec un temps identique pour chaque image, j'ai remplacé:

40 VDP(2)=VDP(2)OR32:VDP(14)=255:VDP(10)=VDP(10)OR4

40 VDP(2)=VDP(2)OR32:VDP(14)=17:VDP(10)=VDP(10)OR4



Je viens d'essayer mais ça n'affiche pas alternativement avec un temps identique pour chaque image.

J'ai un clignotement de pages paire/impaire très rapide, une très brève pause et ainsi de suite...



EDIT :



Sur OpenMSX, ça semble faire comme décrit dans la doc mais très désynchronisé.

Sur CocoaMSX, même clignotement de page très rapide mais sans la brève pause cyclique.



Metalion :
essaie un peu en enlevant carrément la commande VDP(10) du programme. Car je ne suis pas sur qu'elle soit nécessaire.


VDP(10)=VDP(10)OR4 est indispensable. C'est le VDP(2) qui n'est pas nécessaire. Un SETPAGE1 suffit.



igal :
Le retour au SCREEN 0 a des airs de noël. Pour éteindre les guirlandes, j'ai fixé avec:

40 VDP(2)=VDP(2)OR32:VDP(14)=15:VDP(10)=VDP(10)OR4


C'est VDP(14)=0 qu'il faut.



Code TEXT :
10 COLOR15,0,0
20 SCREEN 12
30 BLOAD"001.scc",S
40 SET PAGE,1
50 BLOAD"002.scc",S
55 SET PAGE1
60 VDP(14)=17:VDP(10)=VDP(10)OR4
90 IF INKEY$="" THEN 90
110 VDP(14)=0
Edité par GDX Le 14/11/2013 à 00h56
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 14/11/2013 à 02h04
Voici un exemple qui ressemble assez pas mal à ce que je voudrais obtenir.


Le point positif:
L'enchainement des images semble etre un peu plus rapide par tranche de 3.

Les points négatifs:
Il semble que la durée d'affichage à l"écran n'est pas identique pour chacune des 3 images.
L'apparition des chaque image n'est pas instantanée mais se déroule à l'écran ce qui n'est pas très agréable à voir.En fait il semble que ce soit une image sur trois qui ne s'affiche pas instantanément, mais progressivement.


http://youtu.be/l6HvLa5kKps

Voici la source:

http://www.youtube.com/watch?v=YaYTbD_1m7M

Ca peut être une piste :moue Edité par igal Le 14/11/2013 à 07h55


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
GDX Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 14/11/2013 à 08h19
Pour en avoir le coeur net, j'ai approfondi mes tests sur un VRAI MSX :



Pas besoin du VDP(2). Le registre 2 est modifié avec SETPAGE X.



Le bit 2 du registre 9 sert à activer l'affichage de 2 pages en alternance pendant un laps de temps cyclique. Mettre ce bit à 1 pour activer. En basic : "VDP(10)=VDP(10)OR4" pour activer et "VDP(10)=VDP(10)and251" pour désactiver.



Le registre 13, en mode graphique, permet de régler le temps d'affichage 2 pages en alternance et de non alternance.



Le quartet de poids faible correspond au temps d'affichage de 2 pages en alternance.

Le quartet de poids fort correspond au temps d'affichage d'une page sans alternance. Cette page doit-être impaire et visible pour que l'alternance se fasse.



Chaque quartet contiennent donc une valeur de 0 à 15 (0H à FH en hexa). Ces valeurs correspondent aux temps compris entre 0 et 3 secondes (en augmentant de 0,2s) en 50 Hz.



Voici un exemple en screen 5 :



Code TEXT :
10 COLOR,0,0
20 SCREEN 5
30 COLOR,1,0:CLS ' Page 0 noire
40 SET PAGE,1
50 COLOR,15,0:CLS' Page 1 blanche
60 SET PAGE,2
70 COLOR,4,0:CLS ' Page 2 bleue
80 SET PAGE1,3 'Mettre une page visible impaire. 1 pour clignotement des pages 0 et 1.
90 COLOR,6,0:CLS ' Page 3 rouge
100 VDP(14)=&H25:VDP(10)=VDP(10)OR4
110 IF INKEY$=""THEN110
120 COLOR15,4,4:VDP(14)=0:VDP(10)=VDP(10)AND251 ' rétabli les couleurs par défaut et stoppe le clignotement




Pour simplifier, j'ai mis la valeur du registre 13 en hexadécimale.



VDP(14)=&H25 défini un clignotement de la page impaire affichée avec la page paire en dessous pendant 0,4 seconde (ici page 0 puisque la page affichée est la page 1, voir ligne 80) puis, plus de clignotement pendant 1 seconde (page 0 affichée) puis reclignotement pendant 0,4s et ainsi de suite.



Ce programme basic affiche les pages noires et blanche une frame sur deux pendant 1s (5x0,2s) puis la page noire pendant 0,4s (2x0,2s) et recommence ainsi de suite sans fin.



Si il y a SET PAGE3,3 en ligne 80, le clignotement se fera avec les pages 2 et 3.



Conclusion : Ça ne fonctionne pas comme indiqué dans les doc. Sur la vidéo d'Igal, on pourrait croire que ça marche parce que le temps de clignotement est réglé sur 0,2s. Ça passe inaperçu sur la vidéo sans doute à cause d'un nombre de frame réduit et un effet de transition.



gdx :
igal :
Le retour au SCREEN 0 a des airs de noël. Pour éteindre les guirlandes, j'ai fixé avec:

40 VDP(2)=VDP(2)OR32:VDP(14)=15:VDP(10)=VDP(10)OR4


C'est VDP(14)=0 qu'il faut.


C'est mieux : VDP(14)=0:VDP(10)=VDP(10)AND251



gdx :
Sur OpenMSX, ça semble faire comme décrit dans la doc mais très désynchronisé.

Sur CocoaMSX, même clignotement de page très rapide mais sans la brève pause cyclique.


En Fait, ça marche aussi sur openMSX mais comme c'est désynchronisé, c'est difficile de voir ce qui ce passe. Ça ne marche pas sur CocoaMSX (clignotement une page sur 2 continuellement).
   
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1486

Le 14/11/2013 à 09h16
GDX :
C'est mieux : VDP(14)=0:VDP(10)=VDP(10)AND251


La commande VDP(14)=0 est inutile, elle ne met que la temporisation à zéro.

Le véritable interrupteur de l'alternance est la commande VDP(10).



Mon interrogation sur la nécessité de modifier le R#9 vient de la lecture approfondie de la doc du VDP V9938.



Ils distinguent une activation de l'alternance avec une temporisation définie par le R#13 (chapitre 6.1) et une alternance brute à 60Hz (chapitre 6.2). Il n'y a que dans le 2e cas que le registre R#9 est utilisé.



Yamaha :
6.1. Alternate display of two graphic screen pages

Two graphics screen pages may be alternatively displayed in G4 to G7 modes automatically. In G4 and G5 modes, the following pages can be displayed alternatively: page 0 and page 1, and page 2 and page3. In G6 and G7 modes, pages 0 and 1 will be alternatively displayed.



Display time period of between 166 ms and 2053 ms may be specified for each page. See section 3.2.6 for information about available time periods.

- Specify the odd page address in the pattern layout table register R#2

- Specify ON (even page) and OFF (odd page display) intervals in register R#13



6.2. Displaying two graphics screens at 60Hz

Bit 2 "EO" of register R#9 can be used for displaying two graphics screens alternately at 60Hz. Set the odd page pattern layout table in register R#2. Then set bit 2 of register R#9 to 1
Edité par Metalion Le 14/11/2013 à 09h19


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)
   
GDX Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 14/11/2013 à 10h05
Les temps que j'ai indiqués proviennent du livre "Pratique du MSX 2". Le livre sous entend que les temps dépendent du mode d'affichage 50 ou 60Hz. Je n'ai pas chronométré pour vérifier. Ils sont peut-être faux vue que l'explication est fausse.



Metalion :
GDX :
C'est mieux : VDP(14)=0:VDP(10)=VDP(10)AND251


La commande VDP(14)=0 est inutile, elle ne met que la temporisation à zéro.

Le véritable interrupteur de l'alternance est la commande VDP(10).


Que ce soit l'un ou l'autre, ça stoppe le clignotement donc peu importe mais je trouve que c'est préférable de remettre les 2 à leur valeur initiale pour éviter les surprises. Si on avait à choisir entre les deux, VDP(14)=0 est plus simple et VDP(10)=VDP(10)AND251 est plus logique en effet. Edité par GDX Le 14/11/2013 à 10h07
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 15/11/2013 à 19h28
Merci à tous pour vos explications.

J'ai testé les commande proposées par Métalion et voici ce que j'en ai tiré.

Il est possible d'indiquer le temps d'affichage d'une page avec [VDP(14)=XX]
VDP(14)=&B00010001 spécifie le temps d'affichage d'une image Paire et Impaire
Nb: Pour incrémenter le temps d'affichage, il suffit d'augmenter la valeur (à crescendo) des Bits 4Bits de Droite pour l'image Paire ainsi que des 4 Bits de Gauche pour l'image Impaire.
Si VDP(14) Permet d'indiquer le temps entre l'alternance sur 2 images, ce dernier ne permute pas les pages.

Métalion propose la méthode suivante pour 2 images.
10 COLOR 15,0,0 (fond d'écran noir)
20 SCREEN 12 (Mode écran 12)
30 SET PAGE 0,0 (Page cible 0,0)
40 BLOAD"IMAGE000.SCC",S (Charge l'image dans la page cible 0,0)
50 SET PAGE 0,1 (Page cible 0,1)
60 BLOAD"IMAGE001.SCC",S (Charge l'image dans la page cible 0,1)
70 VDP(2)=VDP(2)OR32 (Provoque l'alternance entre deux pages)
80 VDP(14)=&B00010001 (indique le temps d'affichage "minimum" des pages Paire ET Impaires)
90 VDP(10)=VDP(10)OR4 (Empêche l'affichage d'une ligne sur deux seulement)
100 GOTO100 (permet le maintient en mode graphique 12 en empêchant le retour en SCREEN0)

Dans la pratique, afin d'atteindre une vitesse d'alternance la plus rapide possible, on peut procéder comme suit:
10 VDP(14)=&B00000001 (valorisé à 1 en lisant les 4 bits de Droite)
20 VDP(2)=VDP(2)OR32
30 VDP(14)=&B00010000 (valorisé à 1 en lisant les 4 bits de Gauche)
40 GOTO 10
Nb: VDP(2)=VDP(2)OR32 provoque l'alternance entre les pages.

Je pense qu'en substance j'ai tout ce dont j'ai besoin :top

Il me reste à assembler le lecteur avec lequel j'arrive à enfin lire en continu un "fondu d'image sur image".
Il suffit d'appuyer sur une touche pour basculer vers un sous programme qui affichera en alternance l'image déjà visible avec une image identique mais sous un autre angle de sorte à obtenir le rendu [New Vision Technology] avec un effet identique au dinosaure :top Edité par igal Le 15/11/2013 à 19h36


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Maggoo Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 25/06/2013 à 17h49

Messages: 192

Le 15/11/2013 à 22h19
Dans la pratique seul le Registre VDP(14) est utilise. VDP(10) n'a apparement pas vraiment d'influence sur les resultats: Voir exemple dino2.bas sur:

dino.dsk

Ca fonctionne sur OPENMSX, mais pas sur BlueMSX (qui apparement n'emule le clignotement qu'en mode texte). Je me demande bien a quoi peut servir le bit E0 car a 0 ou a 1 le resultat est exactement pareil.

Le Registre vdp(2) doit etre en modifier, mais SETPAGE 1,1 se charge de faire ces changements donc inutile de le faire soit meme. Edité par Maggoo Le 15/11/2013 à 22h20
Site web    
GDX Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 16/11/2013 à 09h20
igal :
VDP(14)=&B00010001 spécifie le temps d'affichage d'une image Paire et Impaire


C'est ce qui est dit depuis le début mais je persiste : C'est faux. :heink



VDP(14)=&Hxx (écriture au registre 13)



Le quartet de poids fort défini le temps d'affichage de la page impaire en cours (sans clignotement avec la page paire).

Le quartet de poids faible défini le temps de d'affichage alterné de la page impaire avec la page paire inférieure.



J'espère d'être assez clair cette fois. J'ai même vérifié dans le "MSX-Datapack vol.1" d'ASCII qui lui explique la même chose. Il n'y a plus donc plus de doute.



J'ai mis une petite explication sur MRC :



www.msx.org/forum/msx-talk/general-discussion/incorrect-alternate-display-pages-using-r13



Les timings indiqués dans le Datapack sont différents de ceux du livre "Pratique du MSX2" (parce que 50hz)



EDIT : J'ai ajouté 2 programmes Basic d'explication sur MRC.



Magoo :
Ca fonctionne sur OPENMSX,


Oui mais je n'arrive pas à obtenir quelque chose d'aussi propre que sur mon Turbo R. Peut-être à cause de la fréquence du moniteur. :hum

Magoo :
mais pas sur BlueMSX (qui apparemment n'émule le clignotement qu'en mode texte).


Oui. CocoaMSX est basé sur BlueMSX donc ce n'est pas étonnant. J'ai remarqué quelques fois que BlueMSX n'émule pas comme il le faudrait tous les bits des registres des VDP. Edité par GDX Le 17/11/2013 à 23h34
   
GDX Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 18/01/2014 à 09h34
Salut iGal,

Le registre 13 était plus élaboré que ce qu'on pensait. Essaie le petit programme suivant et tu comprendras.
Code TEXT :
10 COLOR 10,0,0:SCREEN 5
20 ON STOP GOSUB 190:STOP ON
30 PI=3.141592654#
40 CIRCLE(100,100),50,7,PI/2,2*PI
50 LINE(50,100)-(150,100),7:LINE(100,50)-(100,150),7:PAINT(98,98),10,7:PAINT(102,102),6,7:PAINT(98,102),12,7
60 SET PAGE 1,1:CLS
70 CIRCLE(100,100),50,7,PI/4,2*PI-PI/4:LINE(65,65)-(135,135),7:LINE(65,135)-(135,65),7:PAINT (100,98),10,7:PAINT(100,102),6,7:PAINT(98,100),12,7
80 'VDP(2)=&H3F
90 A$=INKEY$
100 IF A$="1" THEN VDP(14)=&H33:VDP(10)=VDP(10) OR 4
110 IF A$="2" THEN VDP(14)=&H3:VDP(10)=VDP(10) OR 4
120 IF A$="3" THEN VDP(14)=&H30:VDP(10)=VDP(10) OR 4
130 IF A$="4" THEN VDP(14)=&H0:VDP(10)=VDP(10) OR 4
140 IF A$="5" THEN VDP(14)=&H33:VDP(10)=VDP(10) AND 251
150 IF A$="6" THEN VDP(14)=&H3:VDP(10)=VDP(10) AND 251
160 IF A$="7" THEN VDP(14)=&H30:VDP(10)=VDP(10) AND 251
170 IF A$="8" THEN VDP(14)=&H0:VDP(10)=VDP(10) AND 251
180 GOTO 90
190 STOP OFF:VDP(14)=0:VDP(10)=VDP(10) AND 251:END

Le programme teste les touches suivantes :
"1" = Affiche page 0 pendant une courte période puis alterne page 1 et 0 pendant une courte période et recommence ainsi de suite.
"2" = Alterne page 1 et 0 et ainsi de suite.
"3" = Affiche la page 0.
"4" = Alterne page 1 et 0 et ainsi de suite.

"5" = Affiche page 0 pendant une courte période puis affiche page 1 pendant une courte période et recommence ainsi de suite.
"6" = Affiche la page 1.
"7" = Affiche la page 0.
"8" = Affiche la page 1. (paramètres par défaut)

Finalement, tu peux faire aussi ce que tu voulais avec les mêmes paramètres de la ligne 140 (tu peux le voir en pressant la touche "5".) :top
Mon explication plus haut est trop partielle car il faut tenir compte des 2 quartets du registre 23 et de l'état du bit 2 du registre 9.

Le VDP de ligne 80 est équivalent à SET PAGE 1. je l'ai mis en remarque parce que c'est déjà la page 1 qui est affichée.

PS : Programme à essayer sur un vrai MSX si on ne veut avoir une mauvaise surprise. Edité par GDX Le 18/01/2014 à 14h38
   
BibiZen Membre non connecté

Maire-adjoint

Rang

Avatar

Inscrit le : 03/10/2009 à 18h34

Messages: 1455

Le 19/01/2014 à 00h13
Très intéressant tout ça :top

à votre avis c'est possible de concaténer les 2 images screen12 en un fichier .NVT
et d'utiliser un exécutable msxdos configuré avec multimente pour visionner

passer par le chargeur basic à chaque image 3D c'est laborieux :s
E-mail    
BibiZen Membre non connecté

Maire-adjoint

Rang

Avatar

Inscrit le : 03/10/2009 à 18h34

Messages: 1455

Le 26/01/2014 à 16h16
le code basic se compile très bien en .COM avec Vbasic, tout de suite c'est plus convivial ^^
http://www.msx.org/downloads/solid-vbasic

reste à lui passer le nom de fichier en argument pour le transformer en lecteur autonome
oeil gauche fichier.NVT, oeil droit fichier.SCC plus besoin de concaténer ;)

multimente > touche entrée sur le .NVT > on lance le rendu
au lieu de figer les fichiers directement dans le code, une solution :hum à mon avis non ^^

on doit pouvoir remplacer le .SCC par du .MIF moins gourmand en espace disque,
mais ça risque d'être long à charger avec un Z80 (bien 5s par image) :moue
E-mail    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 16/01/2016 à 17h55
BibiZen :
Très intéressant tout ça :top



à votre avis c'est possible de concaténer les 2 images screen12 en un fichier .NVT

et d'utiliser un exécutable msxdos configuré avec multimente pour visionner



passer par le chargeur basic à chaque image 3D c'est laborieux :s






Hello Bibizen: Logiquement, pour faire cela il suffirait de charger les deux sur la page 0 et 1 puis de basculer l'affichage en mode "Entrelacé" et enfin sauvegarder tel que [BSAVE"3D-DYNO.SCC",0,&h????,S pour obtenir une image entrelacée qui donnerait l'illusion d'une image en relief.



J'ai pas testé mais ca devrait le faire je pense ^^


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie