[ EXELVISION ] synchronisation ecran / timer

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

kibifred
Messages : 30
Inscription : 27 févr. 2022 10:55

[ EXELVISION ] synchronisation ecran / timer

Message par kibifred »

Bonjour,

Je continue mon initiation à l'assembleur et l'exl100 et aujourd'hui je fais face à un problème de synchronisation.
L'exelvision déclenche t'il une interruption lors de la fin du balayage écran comme cela peut se faire sur certains ordinateurs 16 bits ou consoles ?
si oui comment je peux faire cela ?
ou dois je initialiser un timer pour une synchronisation 50 (ou 25 ) fois par secondes ?

Merci

Fred
jester
Messages : 2328
Inscription : 01 janv. 2009 23:16
Localisation : Grenoble

Re: [ EXELVISION ] synchronisation ecran / timer

Message par jester »

Non, il faut surveiller un des registres du VDP pour identifier un changement de valeur... et encore je ne suis même pas sur que le fonctionnement soit celui attendu. J'ai expérimenté et le résultat était étrange.
L'émulateur de Daniel suit la logique qu'on a cru comprendre dans le bouquin sur 3556, mais pas vraiment sur que la réalité soit celle-ci!

Mieux vaut considérer qu'il n'y a pas de synchro possible !
romu
Messages : 82
Inscription : 29 oct. 2018 19:13

Re: [ EXELVISION ] synchronisation ecran / timer

Message par romu »

Ou sur pas mal de machine 8bit tu as un registre ou un état quelque part qui te permet de voir si la sync a été effectuée pour te caler dessus. Mais pas sur toutes les machines, par exemple sur l'oric ya pas.
jester
Messages : 2328
Inscription : 01 janv. 2009 23:16
Localisation : Grenoble

Re: [ EXELVISION ] synchronisation ecran / timer

Message par jester »

Pour être plus précis, voici un bout de code qui interroge le VDP et surveille le résultat: tantque pas de VSYNC on boucle.

Code : Tout sélectionner

_sync
	movp %$03,P45			; ask VDP status
	btjop %$20,P37,_sync	; 
ça ralentit un peu le code car on attend la fin du VSYNC pour par exemple swapper de page avec un double buffer.
J'avais l'impression que ça marchait. Mais en utilisant cela sur une vraie machine avec un POC de l’Abbaye des morts les résultats étaient trop aléatoire avec des soucis d'affichage.
J'en suis venu à la conclusion que VSYNC + swap d'écran + swap de générateur caractère provoque des incohérences d'affichage pour le VDP 3556 qui ne suit pas.

Mais ça devrait déjà dépanner pour un affichage propre avec des routines simples. Au moins sur dcexel ça marche, mais sur exel100 je te laisse vérifier.

Comme il y a plusieurs générateurs de caractères tu peux déjà avoir 384 blocs de 8x10 pour les sprites et/ou décors (en gardant le 4eme pour le texte). En double buffering tu swappes la page écran et aussi les pages de générateurs, tu peux alors simuler des animations complexes (presque plus de limite de caractères). L'idée était de reprogrammer ces générateurs entre chaque swap selon les sprites utilisés. Avec cette méthode et beaucoup d'astuce on peut simuler des mouvements au pixel près.
Mais ça merdait grave en pratique et le résultat peu convaincant ! Avec 6502man on a jamais vraiment compris le problème (mais un bug dans le code de l'API d'animation n'est pas à écarter).

Avec des générateurs fixes pas de soucis. Le VDP doit avoir une contrainte (timing ou autre) lors de la définition d'un générateur de caractère. D'ailleurs tous les programmes officiels ont toujours utilisé des générateurs fixes sans VSYNC... ce qui est louche. Le résultat entre un exl100 et dcexel était très différent: presque correct sur dcexel, totalement à l'ouest sur exl100.

Autre soucis assez dramatique: le timing de gestion du TMS7040 qui gère les I/O. Si tu veux contrôler un ego au clavier, sur exl100 tout se passe assez bien. Mais sur dcexel la non émulation réelle du 7040 entraîne des timing un peu "étrange": la routine du clavier accélère, ralentit en fonction du vent... ce qui rend impossible de régler le moindre gameplay, et la moindre séquence d'action devient erratique. Il faudrait trouver une astuce avec une gestion sous interruption via le 7020 pour compenser (normalement c'est déjà le cas avec le 7040, mais comme les fonctions d'I/O du 7040 sont émulées mais pas ce dernier, retour à la case départ).
Il suffit de faire un essai avec une séquence de caractère sur exlbasic en laissant son doigt appuyé pour voir la différence entre dcexel et exl100. Idem avec Wizord par exemple en déplaçant le sprite du vaisseau en laissant le doigt.
Le problème de timing conduit aussi à des crashs sur dcexel lors d'utilisation du synthe vocal avec une utilisation intensive du clavier (en jeu par exemple).
On a la ROM du 7040, donc il serait possible de réaliser une émulation complète de ce dernier. Mais Daniel n'a pas souhaité aller jusque la. Au vue de la célébrité de l'exl100 on peut facilement le comprendre. Et dcexel fait tourner le parc logiciel exelvision dans un but de découverte de la machine. C'est déjà plus que beaucoup.

Donc voila à quoi tu vas être confronté en t'écartant de l'exlbasic et des routines standards. Sans parler qu'exelvision, tout le monde s'en fout. Tu vas te sentir seul mais grandi.
kibifred
Messages : 30
Inscription : 27 févr. 2022 10:55

Re: [ EXELVISION ] synchronisation ecran / timer

Message par kibifred »

Bonjour Jester

Merci beaucoup pour toutes ces précisions
J'ai fait mes essais et cela semble fonctionner correctement sur dcexel en effet.

Encore merci
kibifred
Messages : 30
Inscription : 27 févr. 2022 10:55

Re: [ EXELVISION ] synchronisation ecran / timer

Message par kibifred »

J'ai continué mes tests et en effet je confirme que c'est probablement pas la bonne méthode

Mon programme de tests fait déplacer un "sprite 24x8" de 1 pixel vers la droite jusqu'à la fin de la zone (environs 200 pixels) puis revient au debut une boucle infinie.
1/ en activant la synchro, un sprite met environ 4 secondes pour traverser la zone (4s x 50fps = 200f) cela semble le faire
2/ sans activer la synchro le même sprite met environ 0,5 secondes pour parcourir la zone

du coup je me dis qu'avec 2 sprites ils devraient mettre 1s sans synchro et toujours 4 secondes avec synchro.

or il mettent :
1 seconde sans synchro ; comme attendu.
8 secondes avec synchro. Là y'a un truc...

Avec 4 sprites
2 seconde sans synchro ; comme attendu.
8 secondes avec synchro. Y'a toujours un truc

Avec 8 sprites
4 seconde sans synchro ; comme attendu.
8 secondes avec synchro. là c'est peut être pas totalement déconnant

Avec 16 sprites
8 seconde sans synchro ; comme attendu.
8 secondes avec synchro. là j'ai l'impression de retomber sur mes pattes

Avec 20 sprites
10 seconde sans synchro ; comme attendu.
16 secondes avec synchro. Là c'est peut être normal
jester
Messages : 2328
Inscription : 01 janv. 2009 23:16
Localisation : Grenoble

Re: [ EXELVISION ] synchronisation ecran / timer

Message par jester »

As-tu réalisé tes mesures sur dcexel ou sur exl100 ?
Il serait très intéressant d'avoir les résultats un un exl100 pour être sur des timings!
Comme je le disais, quand tu commences à descendre sur des routines hardware, donc très bas niveau et jamais utilisé hors de nos bidouilles, dcexel n'a pas forcement le comportement 100% attendu.

Il faut vraiment prendre l'exl100 comme référentiel.


Par contre je vois que tu vises le mode graphique :?
Tu vas rencontrer 2 problèmes: la lenteur d'échange avec le VDP qui n'est pas compatible avec ce mode (hors des choses très simples), et surtout le manque de mémoire (impossible de faire du swap d'écran et les sprites/fonds sont trop gourmands)
Mais c'est un beau challenge.
kibifred
Messages : 30
Inscription : 27 févr. 2022 10:55

Re: [ EXELVISION ] synchronisation ecran / timer

Message par kibifred »

J'ai réalisé ces mesures approximatives sur dcexel. Mon exl100 est malheureusement parti à la poubelle il y a quelques années...
Je comprends les limitations de l'émulateur. Cependant c'est l'existence même de cet émulateur qui m'a encouragé à me lancer dans la programmation assembleur.
Si j'arrive au bout de mon truc, alors peut être que je partirai à la recherche d'un exl100...

En effet je vise le mode graphique. J'avais adoré kong et pingo quand j'étais tout gamin. Du coup je veux "faire pareil".
Pour la lenteur d'échange avec le VDP, j'espère que dcexel n'est pas trop rapide par rapport à un exl100. Pour l'instant, ma démo démontre la faisabilité du jeu visé.
Je ne suis pas dérangé par la mémoire pour l'instant. Je crée une ROM à partir de tes outils ca permet d'avoir pas mal de mémoire disponible pour les sprites et tuiles. Le swap d'écran, j'ai laissé de coté (tout comme c'etait le cas sur kong et pingo)

En tout cas les outils que tu as développé sont TERRIBLES et sont d'une grande aide. Je suis admiratif et je te félicite pour ce que tu as apporté à la communauté des retroprogrammeurs. Je te remercie aussi pour ton aide et pour partager tes connaissances et tes conseils.

Merci
jester
Messages : 2328
Inscription : 01 janv. 2009 23:16
Localisation : Grenoble

Re: [ EXELVISION ] synchronisation ecran / timer

Message par jester »

Si tu vises un truc dans le genre Pingo et Kong, pas de soucis, il y avait peu de choses à bouger, et sur un fond noir (pas de fond graphique à gérer), avec des animations minimalistes.
Par contre je VEUX de jolis sprites car ceux de PIngo étaient horribles ! Je te mets la pression :mrgreen:

Pour dcexel c'est un outil formidable, mais pour régler animation et contrôle il vaut mieux un exl100... ou bien passer à quelqu'un qui puisse faire une video du résultat sur exel100.

Et un conseil pour éviter les clignotements désagréable en mode graphique: n'efface pas la totalité du sprite avec un fond noir avant de le réafficher à une nouvelle position (ce que je faisais et c'est dégueulasse si pas de double buffer). Et si j'ai bien lu tu fais un déplacement au pixel près horizontalement, donc tu as déjà surement une jolie routine (jamais fait jusqu'à maintenant). Je suis curieux du résultat.
Répondre