Logicielsmoto.com

Nous sommes le 28 Mar 2024, 09:29

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 8 messages ] 
Auteur Message
MessagePosté: 07 Sep 2022, 16:10 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Pour ne pas polluer le fil de TEO je vous propose de poursuivre ici sur les changements de palette en fin de ligne ...

Voici un programme qui affiche une ligne blanche sur la ligne n°100 au moment du boot.

Fichier(s) joint(s):
debug-timer.zip


Ci dessous le code de test.
Il y a peut être mieux pour se caler en bordure d'écran, on peut en discuter dans un autre fil de la rubrique programmation si vous avez trouvé d'autres techniques.
Pour le test ça suffit amplement pour vérifier qu'il n'y a pas de dérive du timer.

Code:
        org   $6200

irq_routine       equ $6027
irq_timer_ctrl    equ $E7C5
irq_timer         equ $E7C6
irq_one_frame     equ 312*64-1         ; one frame timer (lines*cycles_per_lines-1), timer launch at -1

Boot
        lda   #$E7                     ; at boot time, DP is $60, change to $E7
        tfr   a,dp
        ldd   #PaletteEffect
        std   irq_routine
        lda   #100                     ; screen line to sync
        ldx   #irq_one_frame           ; on every frame

IrqSync
        ldb   #$42
        stb   irq_timer_ctrl
        ldb   #64/8                    ; 64 (cycles per line) / 8 (cycles of the wait loop)
        mul
        tfr   d,y
        leay  -21,y                    ; manual adjustment

        lda   #32
!       tst   <$E7
        bmi   <                        ; while spot is in a visible screen line       
!       tst   <$E7
        bpl   <                        ; while spot is not in a visible screen line
!       bita  <$E7
        beq   <                        ; while spot is not in a visible screen col
!       bita  <$E7
        bne   <                        ; while spot is in a visible screen col
!       leay  -1,y                     ; loop that wait until spot is at the desired place in steps of 8 cycles
        bne   <
       
        stx   irq_timer                ; spot is at the end of desired line, set the timer to one frame

IrqOn         
        lda   $6019                           
        ora   #$20
        sta   $6019                    ; STATUS register
        andcc #$EF                     ; tell 6809 to activate irq
        bra   *                        ; infinite loop

PaletteEffect
        ; from here --->
        lda   #8*2                    ; set color index
        sta   <$DB
        ldd   #$0FFF                   ; set color value
        stb   <$DA
        sta   <$DA
        mul                            ; tempo
        mul                            ; tempo
        mul                            ; tempo
        mul                            ; tempo
        brn   *                        ; tempo
        ; ---> to here : 64 cycles = one line on screen
        lda   #8*2                    ; set color index
        sta   <$DB
        ldd   #$0777                   ; set color value
        stb   <$DA
        sta   <$DA
        jmp   $E830                    ; return to caller

        align $6278                    ; boot tag
        fcb   $42                      ; B
        fcb   $41                      ; A
        fcb   $53                      ; S
        fcb   $49                      ; I
        fcb   $43                      ; C
        fcb   $32                      ; 2
        fcb   $00                      ;
        fcb   $00                      ;


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Sep 2022, 16:11 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Comme l'a fait remarqué Gilles, on est contraint par une fluctuation (boucle d'attente), je ne sais pas si on peut faire autrement (je ne vois pas comment).

En ce qui concerne le positionnement, il y a un ajustement avec le :
Code:
leay -21,y

qui a une granularité de 8 cycles car il influe sur le nombre de boucles ici :
Code:
!  leay -1,y
   bne <


Dans le test ce pas de 8 cycles représente 64 pixels il me semble, si on veut se "caler" plus précisément il faut ajouter des nop ou brn * après cette boucle de tempo.
et là on peut se positionner par pas de 8 pixels (toujours avec cette fluctuation de 0 à 6 cycles donc 48px dans ce mode graphique)

Pour faire un changement de palette sans artefact il faut se positionner dans la bordure qui fait 192 px soit 24 cycles.
Code:
[2] lda   #8*2 
[4] sta   <$DB
[3] ldd   #$0FFF
[4] stb   <$DA
[4] sta   <$DA


Dans le code ci dessus l'artefact commence à se voir quand l'écriture est appliquée donc un cycle après le début du stb.
Il faut donc que ces 5 cycles (40 pixels) soient dans les 192px.
On a donc de la place, mais par contre pour faire un second changement de couleur, c'est plus difficile ...
Il me semble avoir lu quelque part que Préhisto avait une technique pour ça.
Pour le moment avec ce code il me manque 4 cycles pour pouvoir faire un second changement de couleur dans la bordure.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Sep 2022, 16:42 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Je tenterais perso le "coup du std" pour changer deux entrées de palettes dans 24 cycles:
Code:
[3] LDD #index1*512+redgreen1
[4] STA <$DB 
[4] STB <$DA ; <===  l’artefact débute ici
[3] LDD #blue1*256+index2*2
[5] STD <$DA ; /!\ écrit blue1 en <$DA puis l’index 2 dans <$DB.
[3] LDD #redgreenblue2
[4] STB <$DB
[4] STA <$DB

Si je compte 4+3+5+3+4+4=23 cycles :good:

Si je me suis trompé et que STD prend 6 ou 7 cycles, ca marche encore car l’artefact ne se poduit pas lors du 1er cycle du STB. On a donc 2 cycles de marge. :sol:

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Sep 2022, 17:03 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
merci bcp sam !

Je m'en veux de ne pas y avoir pensé plus tôt, l'index étant après la valeur en mémoire le STD est notre sauveur !

ps : c'est bien 5 cycles le STD en direct.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Sep 2022, 17:13 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Le circuit palette est étrange. Il est little-endian dans un monde big-endian: on pose le poids faible de la palette avant le fort. Ça complique un peu. Il serait aussi super pratique que l’index soit l’adresse la plus basse. Ainsi std poserait l’index et le poids fort en un coup.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Sep 2022, 18:19 
Hors ligne

Inscription: 21 Avr 2010, 10:59
Messages: 253
Pour se caler au cycle d'horloge près, je pense que c'est possible mais un peu complexe.
En fait on peut refaire le meme test en s'assurant être 1 cycle avant jusqu'à 7 fois et lorsque le test devient négatif alors on a identifié le cycle.

Bien entendu le tout doit être maitrisé au cycle près.
Une fois que c'est fait le timer du 6846 peut vivre sa vie en restant synchro (tant que la synchro externe du TO8 ou l'incrustation) n'est pas activée.

_________________
http://www.alternative-system.com


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Sep 2022, 19:44 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Comme l’irq se déclenche a la fin de l’instruction en cours on pourrait se retrouver a devoir attendre un mul ou pire un pshs d,x,y,u,dp on aurait 10 ou 13 cycles de retard dans le pire des cas.
Pour contrer ça il faut peut-être lire le timer en debut d’irq et temporiser en fonction ? Des choses a tester en perspective…


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 08 Sep 2022, 08:38 
Hors ligne

Inscription: 21 Avr 2010, 10:59
Messages: 253
Effectivement il y a non seulement l'instruction en cours et ensuite le temps de traitement du vecteur d'interruption avant d'aller jusqu'à l'adresse d'interruption utilisateur.
Si la boucle principale est en attente on doit pouvoir accèlerer un peu en se positionnant en attente d'interruption avec CWAI mais toutes les structures de code ne s'y pretent pas.

_________________
http://www.alternative-system.com


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 8 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 34 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com