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) ?
Inscription : 12 Juin 2008, 20:29 Message(s) : 1711
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 !
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
Inscription : 28 Août 2008, 23:41 Message(s) : 261
C'est cochon ce que tu as fait, démo
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...)
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 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.
Inscription : 28 Août 2008, 23:41 Message(s) : 261
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.
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 ? ). 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.
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.
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 ) (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.
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 9 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