CPC Rulez
https://cpcrulez.fr/forum/

Problème de syncro
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=4486
Page 1 sur 2

Auteur :  dentifiant [ 10 Mars 2011, 03:59 ]
Sujet du message :  Problème de syncro

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:

Auteur :  Megachur [ 10 Mars 2011, 06:04 ]
Sujet du message :  Re: Problème de syncro

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 !

Auteur :  dentifiant [ 10 Mars 2011, 06:42 ]
Sujet du message :  Re: Problème de syncro

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:

Auteur :  Demoniak [ 10 Mars 2011, 08:14 ]
Sujet du message :  Re: Problème de syncro

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

Auteur :  Longshot [ 10 Mars 2011, 10:51 ]
Sujet du message :  Re: Problème de syncro

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...)

Auteur :  Demoniak [ 10 Mars 2011, 10:59 ]
Sujet du message :  Re: Problème de syncro

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

Auteur :  Ghost [ 10 Mars 2011, 12:50 ]
Sujet du message :  Re: Problème de syncro

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

Auteur :  dentifiant [ 10 Mars 2011, 16:37 ]
Sujet du message :  Re: Problème de syncro

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.

Auteur :  dentifiant [ 11 Mars 2011, 04:40 ]
Sujet du message :  Re: Problème de syncro

*erreur désolé*

Auteur :  Longshot [ 11 Mars 2011, 11:18 ]
Sujet du message :  Re: Problème de syncro

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.

Auteur :  dentifiant [ 12 Mars 2011, 03:43 ]
Sujet du message :  Re: Problème de syncro

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.

Auteur :  norecess [ 12 Mars 2011, 04:07 ]
Sujet du message :  Re: Problème de syncro

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).

Auteur :  dentifiant [ 12 Mars 2011, 05:04 ]
Sujet du message :  Re: Problème de syncro

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.

Auteur :  norecess [ 12 Mars 2011, 21:47 ]
Sujet du message :  Re: Problème de syncro

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.

Auteur :  dentifiant [ 13 Mars 2011, 01:44 ]
Sujet du message :  Re: Problème de syncro

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.

Page 1 sur 2 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/