Index du forum




Un petit coup de main... Vous pouvez nous aider à mettre ce site à jour: n'hésitez pas à me contacter !!!

* Connexion   * Inscription

* FAQ
Nous sommes actuellement le 21 Déc 2025, 16:06

Index du forum » Z80 Coding

Le fuseau horaire est UTC+1 heure


Problème de syncro

Modérateur: poulette73



Publier un nouveau sujet Répondre au sujet  Page 1 sur 2
 [ 16 message(s) ]  Aller vers la page 1, 2  Suivant
  Aperçu avant impression Sujet précédent | Sujet suivant 
Auteur Message
dentifiant
 Sujet du message : Problème de syncro
Message Publié : 10 Mars 2011, 03:59 
Hors-ligne
Rulez
Rulez

Inscription : 25 Fév 2011, 19:35
Message(s) : 33
Hello !

J'ai un ptit soucis avec une synchronisation. J'essaye, pour l'exercice, de reproduire la palette complète du CPC à l'écran, en tableau (le même que dans la fenêtre d'édition de ce forum pour le choix de la couleur de texte).
A force de NOPs en pagaille et de F7 acharnés, j'y parviens. Mais quand je veux ajouter les numeros d'encres par dessus, histoire de me faire un memo rigolo, je me rend compte que le tableau n'est jamais vraiment à la même position horizontale, avec de gros décalages d'un lancement à l'autre.

Le seul parametre aléatoire que je vois dans ma boucle est le moment à laquelle la VBL est testée comme vraie, qui peut varier suivant "l'heure" de lancement de la routine. C'est possible que cela créè un decalage de 10-20 pixels environ ?
Si oui, le seul moyen que je vois de contourner le problème est de boucler dans la VBL et de tester une sortie vraie pour continuer (pas encore testé). Vous connaissez peut-être un moyen plus élégant (et peut_être plus précis) ? :sweatingbullets:


Haut
 Profil  
 
Megachur
 Sujet du message : Re: Problème de syncro
Message Publié : 10 Mars 2011, 06:04 
Hors-ligne
VIP
VIP
Avatar de l’utilisateur

Inscription : 12 Juin 2008, 20:29
Message(s) : 1726
je ne sais pas ce que tu utilises comme code pour tester la vbl.

en voici un qui ne devrait pas te donner de décalage :

Code :
; ---------------------------
.wait_vbl
; ---------------------------
   ld b,&f5
   in a,(c)
   rra
   jr c,wait_vbl
wait_synchro_vbl
   in a,(c)
   rra
   jr nc,wait_synchro_vbl
   ret


sinon poste, ton code, on verra rapidement ce qui ne va pas !


Haut
 Profil  
 
dentifiant
 Sujet du message : Re: Problème de syncro
Message Publié : 10 Mars 2011, 06:42 
Hors-ligne
Rulez
Rulez

Inscription : 25 Fév 2011, 19:35
Message(s) : 33
Oui presque ça, sauf que celle que j'ai pense pas à attendre le début avant d'attendre la fin. Je teste ça merci bien.

Non ça résout pas le soucis. Je dois toujours mettre des Nops à la fin de la boucle pour retomber syncro (mais ça je m'en fout), mais le tableau est toujours décalé à chaque lançement. Voilà le code, si jamais...
Testé sur winape, pc-cpc et caprice32.

Code :
                org &4000           
           
                di

                ld BC, &7F10
                out (C), C
                ld A, 64 + 20
                out (C), A


               
_startAgain
                ld B, &F5
                in A, (C)
                rra
                jr C, _startAgain
_waitSync      in A, (C)
                rra
                jr NC, _waitSync
               

               
                ld BC, &7F00
                out (C), C
                ld A, 64 + 20
                out (C), A                   
               

                ld HL, palTab               
               
                ld A, &4
_wait1          push AF
                ld A, &DC
_wait1_1        dec A
                jr NZ, _wait1_1
                pop AF
                dec A
                jr NZ, _wait1
                ld A, &F9
_wait2          dec A
                jr NZ, _wait2
               
                defs 2
         

         
                ld E, 9
_pal            push DE
                               
                               
                ld A, (HL)
                inc HL
                ld C, (HL)
                inc HL
                ld D, (HL)
                inc HL
         
                ld E, 22
         
                defs 6
         
_r1             push DE
                ld E, 64 + 20
                defs 2
               
                out (C), A
                out (C), C
                out (C), D
                out (C), E                   

                defs 2
               
                pop DE
                dec E
                jr Z, _endRaw
               
                defs 29
               
                jr _r1

_endRaw         pop DE
                dec E
                jr NZ, _pal

                defs 4
               
                jp _startAgain
               
palTab         
db 64 + 20, 64 + 22, 64 + 18
db 64 + 04, 64 + 06, 64 + 02
db 64 + 21, 64 + 23, 64 + 19
db 64 + 28, 64 + 30, 64 + 26
db 64 + 24, 64 + 00, 64 + 25
db 64 + 29, 64 + 31, 64 + 27
db 64 + 12, 64 + 14, 64 + 10
db 64 + 05, 64 + 07, 64 + 03
db 64 + 13, 64 + 15, 64 + 11


Merci à qui voudra bien m'aider :biere:


Haut
 Profil  
 
Demoniak
 Sujet du message : Re: Problème de syncro
Message Publié : 10 Mars 2011, 08:14 
Hors-ligne
VIP
VIP

Inscription : 15 Oct 2009, 18:07
Message(s) : 236
Localisation : Dunkerque
Le mieux pour être synchro au nop près, c'est d'utiliser les interruptions.
Je me suis permis d'adapter un peu ton code :

Code :
                org &4000           
                run $         

                DI
                LD   HL,#C9FB
                LD   (#38),HL ; EI + RET en #38
                EI

                ld BC, &7F10
                out (C), C
                ld A, 64 + 20
                out (C), A
               
_startAgain
                EI
                HALT    ; Attendre une interruption
                DI
                ld B, &F5
                in A, (C)
                rra
                jr NC, _startAgain  ; Vérifier que cette interruption correspond à la VBL
                     

               
                ld BC, &7F00
                out (C), C
                ld A, 64 + 20
                out (C), A                   
               

                ld HL, palTab               
               
                ld A, &4
_wait1          push AF
                ld A, 0
_wait1_1        dec A
                jr NZ, _wait1_1
                pop AF
                dec A
                jr NZ, _wait1
                ld A, #43
_wait2          dec A
                jr NZ, _wait2
               
                defs 2
         

         
                ld E, 9
_pal            push DE
                               
                               
                ld A, (HL)
                inc HL
                ld C, (HL)
                inc HL
                ld D, (HL)
                inc HL
         
                ld E, 22
         
                defs 6
         
_r1             push DE
                ld E, 64 + 20
                defs 2
               
                out (C), A
                out (C), C
                out (C), D
                out (C), E                   

                defs 2
               
                pop DE
                dec E
                jr Z, _endRaw
               
                defs 29
               
                jr _r1

_endRaw         pop DE
                dec E
                jr NZ, _pal

                defs 4
               
                jp _startAgain
               
palTab         
db 64 + 20, 64 + 22, 64 + 18
db 64 + 04, 64 + 06, 64 + 02
db 64 + 21, 64 + 23, 64 + 19
db 64 + 28, 64 + 30, 64 + 26
db 64 + 24, 64 + 00, 64 + 25
db 64 + 29, 64 + 31, 64 + 27
db 64 + 12, 64 + 14, 64 + 10
db 64 + 05, 64 + 07, 64 + 03
db 64 + 13, 64 + 15, 64 + 11

_________________
http://demoniak-contrib.forumactif.com/


Haut
 Profil  
 
Longshot
 Sujet du message : Re: Problème de syncro
Message Publié : 10 Mars 2011, 10:51 
Hors-ligne
VIP
VIP
Avatar de l’utilisateur

Inscription : 28 Août 2008, 23:41
Message(s) : 270
C'est cochon ce que tu as fait, démo :pig:

EI
HALT ; Attendre une interruption
DI
_startAgain
ld B, &F5
_startagain1
in A, (C)
rra
jr NC, _startAgain1


Pour la petite explication...

Comme tu l'avais pigé, le signal VBL peut survenir pendant 1 usec sur les 6/7 us des instructions de test de la vbl (in a,(c) / rra / jr nc)
n1 n2 n3 n4 n5 n6 (n7)
( in a,(c) rra jr nc )
Et donc la sortie de boucle ne se produit pas toujours au même moment selon que la VBL survient entre n1 et n7.

Ensuite, si ton code utilise du temps fixe entre chaque VBL, cela ne pose plus de problème.
(ce qui est le cas dans ton exemple)

Pour rentrer dans la boucle d'attente toujours au même moment, la solution la plus simple consiste à utiliser l'instruction HALT, qui attend au NOP près qu'une interruption se produise avant de rendre la main. Il suffit donc de synchroniser ton code sur une interruption grâce à cette instruction.

Maintenant, si le code exécuté entre 2 VBL doit varier (par exemple tu gères des touches ou des compteurs), il faudra que tu alignes les parties variables en ajustant leur temps par rapport à un multiple de la période prise par la boucle d'attente de la VBL (à savoir 7 nop)

Si cela est trop contraignant, il est toujours possible d'utiliser HALT dans le programme (à la condition que les interruptions soient autorisées bien sûr). Il est même possible d'envisager de supprimer complètement la boucle d'attente de la VBL en la remplaçant par un simple HALT, dès lors que tu sais que la prochaine interruption attendue est bien celle de la VBL.
(la "sortie" d'un long DI devant juste respecter quelques conditions particulières...)


Haut
 Profil  
 
Demoniak
 Sujet du message : Re: Problème de syncro
Message Publié : 10 Mars 2011, 10:59 
Hors-ligne
VIP
VIP

Inscription : 15 Oct 2009, 18:07
Message(s) : 236
Localisation : Dunkerque
Longshot a écrit :
C'est cochon ce que tu as fait, démo :pig:

EI
HALT ; Attendre une interruption
DI
_startAgain
ld B, &F5
_startagain1
in A, (C)
rra
jr NC, _startAgain1


Hum, oui, j'avoue :D

_________________
http://demoniak-contrib.forumactif.com/


Haut
 Profil  
 
Ghost
 Sujet du message : Re: Problème de syncro
Message Publié : 10 Mars 2011, 12:50 
Perso, après avoir rendu les interrputions régulières (Ei:ret en #38), je faisais cela:
Code :
       LD B,#F5
frm  IN A,(C)
       RRA
       JR NC,FRM

       LD B,32:DJNZ $
       HALT


Cela me permet sur tout CRTC d'être sur le même HALT ;) Juste une petite tempo en fait :)


Haut
  
 
dentifiant
 Sujet du message : Re: Problème de syncro
Message Publié : 10 Mars 2011, 16:37 
Hors-ligne
Rulez
Rulez

Inscription : 25 Fév 2011, 19:35
Message(s) : 33
Effectivement, si je connaissais le truc des halts, j'imaginais pas que ça serais plus précis que de virer simplement les interrupts. Je vais jouer avec un moment pour voir. Je cherchais desespérement un moyen de savoir où j'en étais dans la VBL mais pas moyen. Et avec ce Winape qui bouffe les premières lignes, difficile de savoir ce qui se passe vraiment là-haut :bomb:
Merci à tous pour vos astuces.

PS : toujours sur le thème du timing, quelqu'un sait si 1 M cycle est égal à 1 T state ? Ou le rapport de durée qu'il y a entre eux ? Je trouve peu d'article la dessus et rien sur leur longueurs relatives. Merci d'avance.


Haut
 Profil  
 
dentifiant
 Sujet du message : Re: Problème de syncro
Message Publié : 11 Mars 2011, 04:40 
Hors-ligne
Rulez
Rulez

Inscription : 25 Fév 2011, 19:35
Message(s) : 33
*erreur désolé*


Haut
 Profil  
 
Longshot
 Sujet du message : Re: Problème de syncro
Message Publié : 11 Mars 2011, 11:18 
Hors-ligne
VIP
VIP
Avatar de l’utilisateur

Inscription : 28 Août 2008, 23:41
Message(s) : 270
Citer :
Effectivement, si je connaissais le truc des halts, j'imaginais pas que ça serais plus précis que de virer simplement les interrupts.

Si tu inhibes les interruptions, tu es obligé de tester la VBL. Un programme qui pourrait synchroniser du code pile poil sur le NOP de la VBL serait je pense assez complexe et dépendant des registres du CRTC.

Une interruption reste le moyen le plus simple pour se synchroniser au NOP.
HALT étant la façon la plus simple, même si il est possible de faire autrement.


Haut
 Profil  
 
dentifiant
 Sujet du message : Re: Problème de syncro
Message Publié : 12 Mars 2011, 03:43 
Hors-ligne
Rulez
Rulez

Inscription : 25 Fév 2011, 19:35
Message(s) : 33
Merci à tous ça marche nickel, je donne le code final si ça interesse quelqu'un de lire ou/et faire des remarques.

Code :
                org &4000           

           
                di
                ld   HL, &C9FB
                ld   (&38), HL
                ei

                ld BC, &7F10
                out (C), C
                ld A, 64 + 20
                out (C), A

                ld BC, &7F01
                out (C), C
                ld A, 64 + 11
                out (C), A
               

                halt
                di               
_startAgain
                ld B, &F5
_waitSync       in A, (C)
                rra
                jr NC, _waitSync
                             

                ld BC, &7F00
                out (C), C
                ld A, 64 + 20
                out(C), A

               
                ld HL, palTab               

                ld A, &4
_coarse         push AF
                ld A, &E1
_wt             dec A
                jr NZ, _wt
                pop AF
                dec A
                jr NZ, _coarse
               
                ld A, &F6
_fine           dec A
                jr NZ, _fine               

                defs 2
         
         
                ld E, 9
_pal            push DE
                               
                               
                ld A, (HL)
                inc HL
                ld C, (HL)
                inc HL
                ld D, (HL)
                inc HL
         
                ld E, 22
         
                defs 6
         
_r1             push DE
                ld E, 64 + 20
                defs 2
               
                out (C), A
                out (C), C
                out (C), D
                out (C), E                   

                defs 2
               
                pop DE
                dec E
                jr Z, _endRaw
               
                defs 29
               
                jr _r1

_endRaw         
               
               
                pop DE
                dec E
                jp NZ, _pal

                defs 6
               
                jp _startAgain
               
palTab         
db 64 + 20, 64 + 22, 64 + 18
db 64 + 04, 64 + 06, 64 + 02
db 64 + 21, 64 + 23, 64 + 19
db 64 + 28, 64 + 30, 64 + 26
db 64 + 24, 64 + 00, 64 + 25
db 64 + 29, 64 + 31, 64 + 27
db 64 + 12, 64 + 14, 64 + 10
db 64 + 05, 64 + 07, 64 + 03
db 64 + 13, 64 + 15, 64 + 11


Merci encore, j'ai pas mal appris en faisant ce bout de machin.


Haut
 Profil  
 
norecess
 Sujet du message : Re: Problème de syncro
Message Publié : 12 Mars 2011, 04:07 
Une petite remarque, je vois souvent ce pattern :

Code :
ld a, 4
push af
ld a, 8
..
pop af
dec a


Tu gagnerais en efficacité / lisibilité en utilisant d'autres registres disponibles.
De plus, n'oublis pas le second set de registres dispo (EXX).


Haut
  
 
dentifiant
 Sujet du message : Re: Problème de syncro
Message Publié : 12 Mars 2011, 05:04 
Hors-ligne
Rulez
Rulez

Inscription : 25 Fév 2011, 19:35
Message(s) : 33
Tu as raison, j'aime pas trop écrire ça non plus, c'est juste que je voulais faire des changement de l'encre 1 aussi pour pouvoir écrire les numeros d'encre dans les cases en mode 2, et que ca reste lisible. Donc besoin de conserver certaines données sans deranger la tempo avec des test sur "Où on est là ?".
J'ai abandonné l'idée, faute de largeur d'écran suffisante (y a pas eu de version 16/9 du CTM non ? :sweatingbullets: :sweatingbullets: ). Du coup j'ai plus besoin de garder certains registre tout le long de la routine, donc je pourrais optimiser par endroit c'est vrai.

Quant à l'autre jeu de registre, effetivement je n'y pense jamais. :(

Merci bien.


Haut
 Profil  
 
norecess
 Sujet du message : Re: Problème de syncro
Message Publié : 12 Mars 2011, 21:47 
Par contre, laisse-moi te rassurer sur un point : tu dis etre de retour sur CPC depuis peu, ce que je vois c'est que tu es très capable de faire déjà des choses très bien avec tes connaissances actuelles ! Très encourageant.


Haut
  
 
dentifiant
 Sujet du message : Re: Problème de syncro
Message Publié : 13 Mars 2011, 01:44 
Hors-ligne
Rulez
Rulez

Inscription : 25 Fév 2011, 19:35
Message(s) : 33
Ca me rassure oui, je n'ai pas passé la nuit dernière à étudier le dessassemblage maison de SubHunt pour rien (c'est tout con, un scroll paralaxe avec la pile, en fait :kissed: ) :) (pardon aux courageux auteurs, toussa toussa)

Bien que je débute en z80, je suis un vrai passioné du CPC, comme vous. Et j'ai grand hâte d'apprendre *rapidement* à marcher, pour venir ensuite courir avec vous.

Merci encore (une dernière fois, promis :p ), pour votre aide et vos critiques.


Haut
 Profil  
 
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  Page 1 sur 2
 [ 16 message(s) ]  Aller vers la page 1, 2  Suivant

Index du forum » Z80 Coding

Le fuseau horaire est UTC+1 heure


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 24 invité(s)


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas insérer de pièces jointes dans ce forum

Aller vers :  
Powered by phpBB® Forum Software © phpBB Group
Traduit en français par Maël Soucaze.