Auteur Sujet: Etude/Réalisation d'un générateur de mires 15/24/31 kHz  (Lu 27306 fois)

Hors ligne gc339

  • Beta Testeur
  • *
  • Messages: 2247
  • Localisation: Lyon
    • Voir le profil
Etude/Réalisation d'un générateur de mires 15/24/31 kHz
« Réponse #64 le: Lundi 21 Septembre 2015, 16:04:32 pm »
  • Préambule à l'adjonction de la mire à quadrillage, définition des paramètres

    Le modèle de mire quadrillée à reproduire est celui du tout premier message de ce fil de discussion, celui du générateur vidéo décrit par Marcello Maggi : http://www.gamoover.net/gc339/VidPatGen.pdf


    Une petite touche personnelle consiste à entourer le quadrillage par un cadre pour améliorer la présentation de la mire, conséquemment le nombre de traits aussi bien horizontaux que verticaux sera porté à 11 (9 + 2).
    Le nombres d'intervalles noirs entre les traits restant égal à 10, la somme des lignes dévolues à ces intervalles doit être divisible par 10.

    Ainsi en 15 kHz, le nombre total de lignes affichées est de 224.
    • En réservant 14 lignes pour l'affichage des traits horizontaux, il reste 210 lignes pour les intervalles noirs, chacun ayant alors une épaisseur de 21 lignes.
      Avec des traits d'une ligne d'épaisseur, il reste 14 - 9 = 5 lignes pour le cadre. Ce chiffre impair pose problème : avec 2 lignes par trait de cadre, il reste 1 ligne excédentaire.
      Une solution élégante serait de doubler l'épaisseur du 5ème trait, celui en plein milieu de l'écran et par conséquent le compte de viendrait bon.
    • En réservant 24 lignes, il en reste 200 pour les intervalles noirs, donc 10 pour chacun.
      Avec des traits de 2 lignes d'épaisseur, il reste 24 - (9 × 2) = 6 lignes, soit 3 lignes par trait de cadre, le compte est bon.

    En 24 kHz, le nombre total de lignes affichées est de 384.
    Il convient de tenir compte des exigences rencontrées pour l'élaboration de la mire clignotante, l'épaisseur d'un trait horizontal ne devrait pas être inférieure à 3 lignes.
    • En réservant 34 lignes  pour l'affichage des traits horizontaux, il reste 350 lignes pour les intervalles noirs, donc 35 pour chacun.
      Avec des traits de 3 lignes d'épaisseur, il reste 34 - (9 × 3) = 7 lignes pour le cadre. Ce chiffre est impair, donc avec 3 lignes par trait de cadre, il reste 1 ligne excédentaire que l'on pourra utiliser pour épaissir le trait horizontal central, le compte est alors bon.
    • En réservant 44 lignes, il reste 340 lignes pour les intervalles noirs, chacun ayant 34 lignes d'épaisseur.
      Avec des traits de 3 lignes d'épaisseur, il reste 44 - (9 × 3) = 17 lignes pour le cadre. Ce chiffre est impair, donc avec 7 lignes par trait de cadre, un peu plus que le double d'un trait normal, il reste 3 lignes que l'on pourra utiliser pour doubler l'épaisseur du trait horizontal central, le compte est alors bon.

    En 31 kHz, le nombre total de lignes affichées est de 480. La remarque est la même au sujet de l'épaisseur du trait, elle ne devrait pas être inférieure à 4 lignes.
    En réservant 50 lignes pour l'affichage des traits horizontaux, il en reste 430 pour les intervalles noirs, donc 43 pour chacun.
    Avec des traits d'une épaisseur de 4 lignes, il reste 50 - (9 × 4) = 14 lignes. Donc plusieurs solutions dont deux des plus harmonieuses :
    • 8 lignes (4+4) pour le trait horizontal central, épaisseur donc doublée, il reste 5 lignes pour chaque trait de cadre.
    • 6 lignes d'épaisseur pour le trait horizontal de cadre ainsi que le trait central, soit 1,5 fois plus que l'épaisseur d'un trait normal.



    En définitive, l'attribution la plus élégante de certaines épaisseurs de traits horizontaux ne réside pas uniquement dans l'épaississement des traits de cadre mais aussi dans celle du trait médian par rapport à ses voisins. Autant en profiter pour élargir aussi le trait médian vertical, ainsi on pourra distinguer une croix superposée à ces deux traits au centre du quadrillage.

    La largeur en pixels des différents montants verticaux de la mire devront refléter l'épaisseur de ses traits horizontaux comme si on leur avait fait subir une rotation de 90°.
    Ici encore il va falloir procéder à des arbitrages sur la largeur des montants verticaux pour arriver à obtenir un nombre µcycles multiple de 10 pour la somme des pixels dévolus aux intervalles noirs entre ces montants.

    Ainsi en 15 kHz, la largeur d'un pixel équivaut à 8,22 µCycles, arrondi à 8, comme cela a été précédemment déterminé avec la mire clignotante.
    D'entrée, c'est l'option "a" qui a été retenue car elle définit une épaisseur double pour les traits du cadre ainsi que pour le trait central. On a donc :
    • 8 montants normaux, épaisseur 1 pixel donc 8 µCycles.
    • 1 montants central élargi, épaisseur 2 pixels donc 16 µCycles.
    • 2 montants de cadre élargis, épaisseur 2 pixels donc 16 µCycles.
    Il reste donc 2456 - (8×8)- 16 - (2×16) = 2344 µC soit 234 µC par intervalle vertical avec 4 µC en excès.
    Ce ne sont pas les combinaisons qui manquent quand à la manière de répartir ces 4 µCycles excédentaires pour élargir les montants du cadre ainsi que le montant central, respectivement :
    • 1 + 2 + 1
    • 2 + 0 + 2, privilégie l'épaisseur des montants.
    • 0 + 4 + 0, le trait central serait ainsi 2,5 fois plus large que ses voisins.
    • 2+0+0+0+2 en créant une marge extérieure noire de 2 µCycles à gauche et à droite du cadre.
    Puisqu'il faut arbitrer, c'est la toute première (1+2+1) qui sera retenue car c'est celle dont les moitiés gauche et droite de la mire sont symétriques par rapport à leur propre axe vertical.

    En 24 kHz, la largeur d'un pixel équivaut à 2,61 µCycles, ce qui inversement représente 3,066 pixels pour 8 µCycles, autant dire 3 comme cela a été précédemment déterminé pour la mire clignotante.
    Après calcul préliminaire, c'est l'option "b" qui l'emporte car c'est la seule des deux dont la répartition des pixels blancs ne génère pas de µCycles excédentaires.
    • Cette option "b" a défini une épaisseur double pour le trait central et une ligne de plus que ce double pour les traits du cadre. On a donc :
      • 8 montants normaux, épaisseur 3 pixels donc 8 µCycles.
      • 1 montant central double épaisseur, donc 16 µCycles.
      • 2 montants de cadre élargis à 7 pixels, donc 18,27 µCycles, arrondi à 18.
      Il reste donc 1336 - (8×8) - 16 - (2×18) = 1220 µC soit 122 µCycles pile poil par intervalle vertical.

    En 31 kHz, la largeur d'un pixel équivaut à 1,85 µCycles, ce qui inversement représente 4,324 pixels pour 8 µCycles, ramené à 4 comme cela a été précédemment déterminé pour la mire clignotante.
    Après calcul préliminaire, c'est aussi l'option "b" qui l'emporte sur l'option "a" car elle ne génère que 4 µCycles excédentaires au lieu de 6.
    • Cette option "b" a défini pour le trait central et les traits du cadre une épaisseur de 1,5 fois celle du trait normal. On a donc :
      • 8 montants normaux, épaisseur 4 pixels donc 8 µCycles.
      • 1 montant central élargi à 6 pixels, donc 12 µCycles.
      • 2 montants de cadre élargis à 6 pixels, donc 12 µCycles.
      Il reste donc 1184 - (8×8) - 12 - (2×12) = 1084 µC soit 108 µC par intervalle vertical et 4 µC en excès.
      Les combinaisons déjà évoquées pour le 15 kHz sont envisageables pour répartir ces 4 µCycles en excès.
      Puisque là aussi il faut arbitrer, c'est la toute première (1+2+1) qui sera retenue pour la raison déjà évoquée.



    Récapitulatif :

    |T  r  a   it|Intervalle|
    |Fréquence|Normal|Central|  Cadre|                |
    |   15 kHz|1 ligne|2 lignes|2 lignes|   21 lignes|
    |   24 kHz|3 lignes|6 lignes|7 lignes|   34 lignes|
    |   31 kHz|4 lignes|6 lignes|6 lignes|   43 lignes|

    |M o  nt  a   nt|
    I n t e
    rv a l l e|
    |
    N o
    rm a l|
    C e
    nt r a l|
    C a
    dr e||
    |Fréquence|Pixels|µCycles|Pixels|µCycles|Pixels|µCycles|Pixels|µCycles|
    |   15 kHz|0,973|     8|2,189|    18|2,068|    17|28,46|   234|
    |   24 kHz|3,066|     8|6,132|    16|6,899|    18|46,76|   122|
    |   31 kHz|4,324|     8|7,567|    14|7,027|    13|58,37|   108|

    Le repos, c'est fait pour les jeunes. Ils ont toute la vie devant eux. J. Gabin/M. Audiard



    Hors ligne Fred G5

    • ✌ Donateur depuis 2018
    • VIP
    • *
    • Messages: 1567
    • Localisation: 67 - Bas-Rhin
    • Leaf switch are Forever
      • Voir le profil
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #65 le: Lundi 21 Septembre 2015, 16:57:31 pm »
  • gc quand il est lancé c'est une MACHINE  ;D  ^-

    Dommage que les boitiers sx28 sx48 ne soient pas facilement compatible, la mire quadrillé c'est un vrai plus pour le réglage des écrans.
    Flipper: DE "Laser War"- WMS "F14-Tomcat"- GTB " Hollywood Heat"
    Borne: Konami "Lethal Enforcers" - New Game "N'Styl"- René Pierre 1982 - Jeutel Neo Geo 16/9 - Simulateur Twin Konami "Midnight Run Road Fighter 2"
    Jeu/Système de jeu: 45 PCB Jamma, 7 cartouches MVS, slot Neo-Geo MV-1T, MV-2F, MV-6F
    Console: Nintendo SNES 2CHIP, SNES 1CHIP-02 + 23 jeux

    Hors ligne gc339

    • Beta Testeur
    • *
    • Messages: 2247
    • Localisation: Lyon
      • Voir le profil
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #66 le: Mercredi 23 Septembre 2015, 16:31:12 pm »
  • Dommage que les boitiers sx28 sx48 ne soient pas facilement compatible.

    Il y a toujours moyen de fabriquer soi-même un adaptateur PQFP48 vers DIL28 pour les circuits imprimés déjà réalisés avec un SX28. Nul besoin de câbler toute les pattes du SX28 car le générateur de mire n'utile que la moitié des E/S du SX28.



    Cet adaptateur peut facilement se bricoler à partir d'une plaquette adaptatrice et une plateforme DIL28 espacement 0,300" du commerce.



    Comme on trouve plus facilement des plateformes DIL28 avec un espacement de 0,600" qu'avec un espacement de 0,300". Le plus simple est d'en fabriquer une avec un bout de circuit imprimé pastillé pré-percé au pas de 2,54 et des queues de résistances en guise de broches.
    « Modifié: Mercredi 23 Septembre 2015, 17:41:17 pm par gc339 »
    Le repos, c'est fait pour les jeunes. Ils ont toute la vie devant eux. J. Gabin/M. Audiard



    Hors ligne Fred G5

    • ✌ Donateur depuis 2018
    • VIP
    • *
    • Messages: 1567
    • Localisation: 67 - Bas-Rhin
    • Leaf switch are Forever
      • Voir le profil
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #67 le: Jeudi 24 Septembre 2015, 11:13:32 am »
  • Effectivement vu comme cela sa parait plus simple  ^-

    Je me garde cette possibilité d'évolution pour plus tard, dans un premier temps, je vais déjà faire fonctionner mon géné avec le SX28 8)
    Flipper: DE "Laser War"- WMS "F14-Tomcat"- GTB " Hollywood Heat"
    Borne: Konami "Lethal Enforcers" - New Game "N'Styl"- René Pierre 1982 - Jeutel Neo Geo 16/9 - Simulateur Twin Konami "Midnight Run Road Fighter 2"
    Jeu/Système de jeu: 45 PCB Jamma, 7 cartouches MVS, slot Neo-Geo MV-1T, MV-2F, MV-6F
    Console: Nintendo SNES 2CHIP, SNES 1CHIP-02 + 23 jeux

    Hors ligne gc339

    • Beta Testeur
    • *
    • Messages: 2247
    • Localisation: Lyon
      • Voir le profil
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #68 le: Samedi 26 Septembre 2015, 18:09:14 pm »
  • Errata : suite à une erreur de frappe dans ce tableau récapitulatif établi en Juin 2013, la bonne valeur pour le temps imparti à l'affichage des pixels d'une ligne en 24 kHz n'est pas de 1336 mais bien de 1536 µCycles.
    Cette erreur n'a aucune incidence pour la mire à barres colorées car c'est bien la valeur 1536 qui avait été utilisée pour la version originale du programme de la mire.
    Il n'en est pas de même pour les valeurs récemment calculées en 24kHz pour les deux nouvelles mires, car ce sont les valeurs de ce tableau récapitulatif qui ont servi de référence.

    Rappel des timings choisis :

    Line
    Frequ.

    (kHz)
       |
    |
    |
       Front
    Porch

    (µcycles)
       Horiz.
    Synch.

    (µcycles)
       Back
    Porch

    (cycles)
       Display

    (µcycles)
       |
    |
    |
       Leading
    Blank

    (lines)
       Vert.
    Synch.

    (lines)
       Lagging
    Blank

    (lines)
       Pattern

    (lines)
    15 | 161 238 323 2456   | 13 3 23 224
    24 | 142 150 222 13361536   | 11 4 25 384
    31 | 81 152 161 1184   | 14 3 33 480



    Correctif pour la mire clignotante :

    Maintenant au tour du code pour l'affichage des lignes des mires clignotantes. [couic...]

    En 24 kHz, le nombre de µCycles/pixel est de 1336 1536 ÷ ((384 ÷ 3) × 4) = 2,61 3,00 µC/pixel et encore moins en 31 kHz, ce nombre est alors de 1184 ÷ ((480 ÷ 3) × 4) = 1,85 µC/pixel.

    Le problème est que la macro "SetColor" absorbe déjà 4 µCycles avec une temporisation nulle et que 3 autres µCycles sont nécessaires (jmp) pour reprendre le cours du programme en Pattern24k:FrontPorch ou Pattern31k:FrontPorch. L'épaisseur du montant vertical de cadre ou de sa marge ne peut donc être inférieur à 7 µCycles.

    En se basant sur une épaisseur minimale de 8 µCycles pour le montant vertical, le double pour sa marge et en respectant les règles édictées plus en avant pour le 15 kHz, on peut en déduire toutes les autres caractéristiques :
    • En 24 kHz :
      • épaisseur du trait horizontal : 8 ÷ 2,61 3 = 3,065 2,67 lignes soit 3 lignes, donc 6 pour la marge horizontale.
        Le 24 kHz est un cas bien particulier car avec 3 µCycles pile poil par pixel, il suffit d'épaissir le trait d'un µCycle, soit 9 µCycles, pour obtenir un nombre de pixels/lignes entier égal à 3. Une marge verticale d'une largeur de 18 pixels correspond exactement à 6 lignes de marge horizontale.
      • par conséquent il reste 384-18 lignes pour les 3 bandes, soit 122 lignes pour chacune.
    • En 31 kHz :
      • épaisseur du trait horizontal : 8 ÷ 1,85 = 4,32 arrondi à 4 lignes et par conséquent 8 lignes pour la marge horizontale.
        Dans ces conditions la marge verticale pourrait être ramenée à 8 × 1,85 = 14,8 soit 15 µCycles au lieu des 16 prévus.
      • par conséquent il reste 480-24 lignes pour les 3 bandes, soit 152 lignes pour chacune.

    Cette valeur de 1536 µCycles n'affecte les choix précédemment établis que d'un pixel pour le cadre et de deux pour les marges, par contre elle allonge de 200 µCycles le temps dévolu à l'affichage des trois types de ligne de la mire clignotante.

    Citer
    Stripes24kSET$; Affichage d'une ligne blanche sans marge (cadre)
    :FrameLineSetColorWhite,1336 1536 -3; -3 µC pour le jmp suivant
    jmpPattern24k:FrontPorch
                                        
    Stripes24kSET$; Affichage d'une ligne blanche avec marge
    :WhiteLineSetColorWhite,8 9; Egale à 3 pixels blancs pour 384 lignes au format 4/3
    SetColorBlack,1618 ; Marge gauche, égale à 6 pixels noirs
    SetColorWhite,1336-(2*24) 1536-(2*27); Moins 2×9 pixels en largeur pour le cadre et les marges
    SetColorBlack,16 18; Marge droite, égale à 6 pixels noirs
    SetColorWhite,8 9-3; Egale à 3 pixels blancs, -3 µC pour le jmp suivant
    jmpPattern24k:FrontPorch
    Stripes24kSET$; Marges confondues avec la ligne noire affichée
    :BlackLineSetColorWhite,8 9; Egale à 3 pixels blancs
    SetColorBlack,1336-(2*8 ) 1536-(2×9)
    ; Moins 2×3 pixels en largeur pour le cadre
    SetColorWhite,8 9-3; Egale à 3 pixels blancs, -3 µC pour le jmp suivant
    jmpPattern24k:FrontPorch

    Le signal de la mire clignotante en 24kHz n'était donc pas conforme avant cette retouche.

    Récapitulatif après corrections :

    |e n  H o riz o n t a l|
    |Fréquence|Cadre|Marge|   Ligne|
    |   15 kHz|1 ligne|2 lignes|2456 µCycles|
    |   24 kHz|3 lignes|6 lignes|1536 µCycles|
    |   31 kHz|4 lignes|8 lignes|1184 µCycles|

    |
    en
    V  e  r  t  ic  a  l|
    |
    C a
    dr e|
    M a
    rg e|
    |Fréquence|Pixel(s)|µCycles|Pixel(s)|µCycles|
    |   15 kHz|   0,973|     8|   1,946|    16|
    |   24 kHz|   3,000|     9|   6,000|    18|
    |   31 kHz|   4,324|     8|   8,107|    15|




    Correctif pour la mire quadrillée :

    En 24 kHz, le nombre total de lignes affichées est de 384.
    Il convient de tenir compte des exigences rencontrées pour l'élaboration de la mire clignotante, l'épaisseur d'un trait horizontal ne devrait pas être inférieure à 3 lignes.
    • En réservant 34 lignes  pour l'affichage des traits horizontaux, il reste 350 lignes pour les intervalles noirs, donc 35 pour chacun.
      Avec des traits de 3 lignes d'épaisseur, il reste 34 - (9 × 3) = 7 lignes pour le cadre. Ce chiffre est impair, donc avec 3 lignes par trait de cadre, il reste 1 ligne excédentaire que l'on pourra utiliser pour épaissir le trait horizontal central, le compte est alors bon.
    • En réservant 44 lignes, il reste 340 lignes pour les intervalles noirs, chacun ayant 34 lignes d'épaisseur.
      Avec des traits de 3 lignes d'épaisseur, il reste 44 - (9 × 3) = 17 lignes pour le cadre. Ce chiffre est impair, donc avec 7 lignes par trait de cadre, un peu plus que le double d'un trait normal, il reste 3 lignes que l'on pourra utiliser pour doubler l'épaisseur du trait horizontal central, le compte est alors bon.

    En 24 kHz, la largeur d'un pixel équivaut à 2,61 exactement 3 µCycles, ce qui inversement représente 3,066 3 pixels entiers pour 8 9 µCycles, autant dire 3 comme cela a été précédemment déterminé pour la mire clignotante.
    Après calcul préliminaire, c'est l'option "b" qui l'emporte car c'est la seule des deux dont la répartition des pixels blancs ne génère pas de µCycles excédentaires l'épaisseur du montant vertical central est le double d'un montant normal.
    • Cette option "b" a défini une épaisseur double pour le trait central et une ligne de plus que ce double pour les traits du cadre. On a donc :
      • 8 montants normaux, épaisseur 3 pixels donc 8 9 µCycles.
      • 1 montant central double épaisseur, donc 16 18 µCycles.
      • 2 montants de cadre élargis à 7 pixels, donc 18,27 21 µCycles, arrondi à 18.
      Il reste donc 1336 1536 - (8×8 9) - 16 18 - (2×18 21) = 1220 1404 µC, soit un excédent de 4 µCycles, soit un déficit de 6 pour obtenir un nombre multiple de 10.
      Le plus logique est de désépaissir d'un pixel les montants verticaux du cadre pour récupérer les 6 µCycles manquants. Il restera alors 1410 µCycles
      soit 122 141 µCycles pile poil par intervalle vertical.

    Récapitulatif après corrections :

    |Tr  a   it|Intervalle|
    |Fréquence|Normal|Central|  Cadre|                |
    |   15 kHz|1 ligne|2 lignes|2 lignes|   21 lignes|
    |   24 kHz|3 lignes|6 lignes|7 lignes|   34 lignes|
    |   31 kHz|4 lignes|6 lignes|6 lignes|   43 lignes|

    |M o  nt  a   nt|
    I n t e
    rv a l l e|
    |
    N o
    rm a l|
    C e
    nt r a l|
    C a
    dr e||
    |Fréquence|Pixels|µCycles|Pixels|µCycles|Pixels|µCycles|Pixels|µCycles|
    |   15 kHz|0,973|     8|2,189|    18|2,068|    17|28,46|   234|
    |   24 kHz|3,000|     9|6,000|    18|6,000|    18|47,00|   141|
    |   31 kHz|4,324|     8|7,567|    14|7,027|    13|58,37|   108|

    « Modifié: Samedi 26 Septembre 2015, 18:12:49 pm par gc339 »
    Le repos, c'est fait pour les jeunes. Ils ont toute la vie devant eux. J. Gabin/M. Audiard



    Hors ligne gc339

    • Beta Testeur
    • *
    • Messages: 2247
    • Localisation: Lyon
      • Voir le profil
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #69 le: Jeudi 22 Octobre 2015, 12:31:09 pm »
  • La migration du SX28 vers le SX48 nécessite quelques adaptations décrites dans la note d'application Parallax/Ubicom n°15.
    Dans le cas du générateur de mire, ces différences concernent surtout :
    • Les fusibles FUSE et FUSEX qui sont organisés différement.
    • La mémoire utilisateur qui débute à l'adresse 10 au lieu de 8, les ports RD et RE occupant respectivement les adresses 8 et 9.
    • Le MODE REGISTER qui nécessite deux instructions au lieu d'une pour accéder à tous ses nouveaux registres.
    Les déclarations en tête de programme sont de fait impactées par les deux premières exigences (en bleu dans le listing).

    Citer
    ;===================================================================================================
    ;
    ;                        File...... PatGen10.SRC
    ;                        Purpose... Video Pattern Generator V10.0
    ;                        Updated... 16/10/2015
    ;
    ;===================================================================================================


    ;------------------------------ DEVICE DIRECTIVES ----------------------------------------------------------------------------------

    ;SASM Directives
    DEVICESX48BD, BOROFF, SYNC
    DEVICEOSCHS3, XTLBUFD, IFBD
    IRC_CALIRC_SLOW

    ID"PatGen10"

    RESETInitialize; Reset vector at $07FF
                                                                                                    
    ;------------------------------ SETTINGS -------------------------------------------------------------------------------------

    FREQ50_000_000; Information pour la SX-Key

    LISTF=INHX8M; Format de sortie
                                                                                                    
    ;------------------------------ EQUATES --------------------------------------------------------------------------------------------

    NoEQU0
    YesEQU~No

    Padding; Bourrage par des nop's autorisé


    SyncHEQUrb.0; Synchro Horizontale sur RB0
    SyncVEQUrb.1; Synchro Verticale sur RB1

    BlackEQU%0000
    BlueEQU%0001; Bit 2°
    RedEQU%0010; Bit 2¹
    GreenEQU%0100; Bit 2²
    CyanEQUGreen + Blue
    MagentaEQURed + Blue
    YellowEQURed + Green
    WhiteEQURed + Green + Blue

    AquaEQUCyan
    FuchsiaEQUMagenta
                                                                                                    
                            ; MODE Register Settings to write to the SX48/52 port control registers
    DDIREQU$1F; Data Direction Register
    PLPEQU$1E; Pull-Up Resistor Enable Register
    LVLEQU$1D; TTL/CMOS Select Register
    STEQU$1C; Schmitt Trigger Enable Register
                                                                                                    
    ;------------------------------ VARIABLES ------------------------------------------------------------------------------------------

    ORG10; Start of SX48/52 data memory

    LoopCounterDS1; Step Counter
    LineCounterDS2; Line Conter
    FrameCounterDS1; Frame Counter
    FlipFlopDS1; Used to blink pattern
                                                                                                    

    La page 0 ($0000 à $01FF) du SX48 reste dédiée aux initialisations à la mise sous tension ainsi qu'au tronc commun à tous les standards (CGA / 15 kHz, EGA / 24 kHz et VGA / 31 kHz) pendant lequel s'effectue le test des dip-switches déterminant justement ce standard.
    Les adjonctions concernent les initialisations des deux nouveaux ports RD et RE ainsi que l'accès modifié au MODE REGISTER (en bleu dans le listing).

    Citer
    ;###################################################################################################
    ;                        Section commune à toutes les mires
    ;###################################################################################################

    ;------------------------------ SIGNALS TIMING CHART -------------------------------------------------------------------------------

    ;LineFrontHoriz.BackDisplay
    ;Frequ.PorchSynch.Porch
    ;(kHz)(µcycles)(µcycles)(µcycles)(µcycles)
    ;151612383232456
    ;241421502221536
    ;31811521611184

    ;LineLeadingVert.TrailingDisplayed
    ;Frequ.BlankSynch.BlankLines
    ;(kHz)(lines)(lines)(lines)
    ;1513323224
    ;2411425384
    ;3114333480
                                                                                                                
    ;------------------------------ INTERRUPT ROUTINE ----------------------------------------------------------------------------------

    ORG0
    Interruptreti
                                                                                                    
    ;-----------------------------------------------------------------------------------------------------------------------------------

    NOEXPAND
    Fill$0007; Bourrage zone réservée avec des NOP's
    EXPAND
                                                                                                    
    ;---------------------------- INITIALIZATION ROUTINE -------------------------------------------------------------------------------

    ORG8
    Initializemovra,#%0000; Set port A low
    movrb,#%11111111; Set port B high
    movrc,#%11111111; Set port C high
    movrd,#%11111111; Set port D high
    movre,#%11111111; Set port E high
                                                                                                    
                            ; Pull-Up Resistor Configuration
    movw,#PLP; Allow Pull-Up Resistor configuration
    movm,w
    mov!ra,#%1111; Set port A, bit 0-3 to normal
    mov!rb,#%00001111; Set port B bits 4-7 with pull-up resistors
    mov!rc,#%00000000; Set port C bits 0-7 with pull-up resistors
    mov!rd,#%00000000; Set port D bits 0-7 with pull-up resistors
    mov!re,#%00000000; Set port E bits 0-7 with pull-up resistors
                                                                                                    
                            ; Port Direction Configuration
    movw,#DDIR; Allow Direction configuration
    movm,w
    mov!ra,#%0000; Set port A bits 0-3 to output
    mov!rb,#%11110000; Set port B bits 0-3 to output, 4-7 to input
    mov!rc,#%11111111; Set port C bits 0-7 to input
    mov!rd,#%11111111; Set port D bits 0-7 to input
    mov!re,#%11111111; Set port E bits 0-7 to input
                                                                                                    
                            ; Device Configuration Options
    mov!option,#%01111111; Raz bit RTW, RTCC inhibé, WREG accessible à la place
                                                                                                    
    ;------------------------------ MAIN PROGRAM ---------------------------------------------------------------------------------------

    MainsetbSyncH
    setbSyncV
    clrFlipFlop; Initialisation du flip flop
    jmpPresetFrCnt
                                                                                                    
                            ; Compteur de trames pour clignotement, absorbe 7 µcycles
    MainLoopdjnzFrameCounter,NoPreset; 2/4 µC
    notFlipFlop; 1 µC, inversion du flip flop
    PresetFrCntmovFrameCounter,#30; 2 µC, clignotement toutes les 30 trames (½ seconde)
    skip; 2 µC, ajustement à 7 µC si rechargement FrameCount
    NoPresetjmp$+1; 3 µC, ajustement à 7 µcycles pour décomptage normal
                                                                                                    
                            ; Lecture de la fréquence ligne sur les 2 premiers microswitches.
    ; Absorbe 11 µcycles quelque soit la boucle à exécuter.
    jnbrb.5,Jmp31k; 2/4 µC, lecture de la fréquence programmée sur les dip-switches
    jnbrb.4,Jmp24k; 2/4 µC
    Jmp15kjmp$+1; 3 µC pour ajustage absorpsion à 11 µC
    jmp@Start15k; 1+3 µC, instruction de page incluse avec "@"
    Jmp24knop; 1 µC pour ajustage absorpsion à 11 µC
    jmp@Start24k; 1+3 µC, instruction de page incluse avec "@"
    Jmp31kjmp$+1; 3 µC pour ajustage absorpsion à 11 µC
    jmp@Start31k; 1+3 µC, instruction de page incluse avec "@"
                                                                                                    

    Ces instructions n'occupant que partiellement la page 0, les octets restants ont été mis à profit pour l'affichage des mires à bares colorées, autrement dit pour le développement de la macro "ColorBars" pour chacun des 3 standards. Opération salutaire qui a permis de libérer de précieux octets dans les pages où elles résidaient précédemment.
    La macro "ColorBars" a été modifiée en conséquence. La durée de la dernière barre, la noire, inclut dorénavant les 4 µcycles du saut inter-pages de retour dans la page d'origine.

    Pour éviter les erreurs répertoriées dans le précédent message, les valeurs littérales des différents timings ont été nommées symboliquement.

    A noter l'emploi maintenant systématique de la macro "Fill" pour remplir les octets inutilisés en fin de page par la valeur $00 qui correspond à l'instruction NOP au lieu de les laisser non programmés à la valeur $FF.

    Citer
    ;###################################################################################################
    ;                        Sous-section pour l'affichage CGA : mire en 15 kHz
    ;###################################################################################################

                            ; Timings ligne (en µcycles du SX48)
    FP15kEQU161; Front Porch
    HSync15kEQU238; Horizontal Synchronisation
    BP15kEQU323; Back Porch
    HDisp15kEQU2456; Duration of the visible pixels inside any line
                                                                                                    
                            ; Timings trame (en nombre de lignes)
    LBI15kEQU13; Leading Blank Interval
    VSync15kEQU3; Vertical Synchronisation
    TBI15kEQU23; Trailing Blank Interval
    VDisp15kEQU224; Visible Lines Per Frame
                                                                                                    
    ;-----------------------------------------------------------------------------------------------------------------------------------

    ColorBars15kEQU$
    ColorBarsHDisp15k/8; Chaque bande verticale consomme 307 µcycles
    jmp@Pattern15k:FrontPorch; Absorbe 4 µC, pris en compte dans la macro ColorBars
                                                                                                    
    ;###################################################################################################
    ;                        Sous-section pour l'affichage EGA : mires en 24 kHz
    ;###################################################################################################

                            ; Timings ligne (en µcycles du SX48)
    FP24kEQU142; Front Porch
    HSync24kEQU150; Horizontal Synchronisation
    BP24kEQU222; Back Porch
    HDisp24kEQU1536; Duration of the visible pixels inside any line
                                                                                                    
                            ; Timings Trame (en nombre de lignes)
    LBI24kEQU11; Leading Blank Interval
    VSync24kEQU4; Vertical Synchronisation
    TBI24kEQU25; Trailing Blank Interval
    VDisp24kEQU384; Visible Lines Per Frame
                                                                                                    
    ;-----------------------------------------------------------------------------------------------------------------------------------

    ColorBars24kEQU$
    ColorBarsHDisp24k/8; Chaque bande verticale consomme 192 µcycles
    jmp@Pattern24k:FrontPorch; Absorbe 4 µC, pris en compte dans la macro ColorBars
                                                                                                    
    ;###################################################################################################
    ;                        Sous-section affichage VGA : mires en 31 kHz
    ;###################################################################################################

                            ; Timings ligne (en µcycles du SX48)
    FP31kEQU81; Front Porch
    HSync31kEQU152; Horizontal Synchronisation
    BP31kEQU161; Back Porch
    HDisp31kEQU1184; Duration of the visible pixels inside any line
                                                                                                    
                            ; Timings Trame (en nombre de lignes)
    LBI31kEQU14; Leading Blank Interval
    VSync31kEQU3; Vertical Synchronisation
    TBI31kEQU33; Trailing Blank Interval
    VDisp31kEQU480; Visible Lines Per Frame
                                                                                                    
    ;-----------------------------------------------------------------------------------------------------------------------------------

    ColorBars31kEQU$
    ColorBarsHDisp31k/8; Chaque bande verticale consomme 148 µcycles
    jmp@Pattern31k:FrontPorch; Absorbe 4 µC, pris en compte dans la macro ColorBars
                                                                                                    
    ;***********************************************************************************************************************************

    NOEXPAND
    Fill$01FF; Bourrage de la page 0 avec des NOP's
    EXPAND
                                                                                                    

    Les sections principales, quelque soit le standard, restent identiques dans leur conception et chacune occupe un jeu de pages dédiées :
    • La page 1 ($0200..$03FF) pour le CGA/15 kHz. La page 2 ($0400..$05FF) lui servant d'extension.
    • La page 3 ($0600..$07FF) pour l'EGA/24 kHz. La page 4 ($0800..$09FF) lui servant d'extension.
    • La page 5 ($0A00..$0BFF) pour le VGA/31 Khz. La page 6 ($0C00..$0DFF) lui servant d'extension.
    Chacune de ces sections principales est constituée de 4 blocs, chacun correspondant aux lignes d'une portion de la trame :
    • Les lignes correspondant à la génération de l'impulsion de synchronisation trame.
    • Les lignes du blanking arrière à la suite de cette impulsion
    • Les lignes visibles, celles qui seront effectivement affichées sur un écran.
    • Les lignes du blanking avant qui précède l'impulsion de synchronisation trame
    C'est pendant le déroulement de la dernière ligne du quatrième bloc, celui du blanking avant, que seront testés les dip-switches du standard avant de reboucler sur le premier bloc du standard programmé.


    Tous les blocs sont calqués sur le même modèle bien qu'ils aient été remaniés pour débuter par l'impulsion de synchronisation ligne avec cette version du logiciel.
    Chaque bloc comporte donc le détail des lignes qui le caractérise :
    • La période correspondant à l'impulsion de synchronisation ligne.
    • Le palier de suppression arrière (Back Porch).
    • L'affichage du contenu visible de la ligne
    • Le palier de suppresion avant (Front Porch).
    C'est en fin de ce dernier palier que sera décrémenté le compteur de lignes du bloc, le contrôle passera au bloc suivant dés qu'il atteindra zéro.

    Le palier arrière du bloc gérant l'affichage du contenu visible est le seul qui comporte une spécificité puisque c'est la période opportune pour décider du contenu visible à afficher en fonction de la mire programmée. Ainsi les dip-switches impactés seront testés afin d'exécuter le sous-programme approprié.

    Ci-dessous la section principale pour le standard CGA/15 kHz (en bleu les insertions) par rapport aux versions SX28 précédentes. A noter que les instructions de chaque bloc ont été réordonnées, il débute maintenant par l'élaboration de la synchronisation ligne.
    La section principale de chacun des deux autres standards est strictement identique à condition de faire abstraction des paramêtres de ligne et de trame qui lui est propre.

    Citer
    ;###################################################################################################
    ;                        Section principale pour l'affichage CGA : mires en 15 kHz
    ;###################################################################################################

                            ; Pages 1 et 2 allouées aux mires CGA en 15 kHz ($0200 ... $05FF)

    ORG$0200
    Start15kEQU$
                                                                                                    
    ;****************************** Impulsion de synchronisation trame *****************************************************************

    SyncVer15kSET$
    :SetUpPresetCountVSync15k; Nombre de lignes allouées à l'impulsion de synchronisation verticale
    jmpSyncVer15k:Loop; 7 µcycles d'absorbés par le rechargement du compteur de lignes
                                                                                                    
                            ; Impulsion de synchronisation horizontale
    SyncVer15kSET$
    :Loopmovw,rb; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
    clrbwreg.0; 1 µC, positionnement du bit affecté à la synchronisation horizontale
    clrbwreg.1; 1 µC, positionnement du bit affecté à la synchronisation verticale
    movrb,w; 1 µC, émission de cette nouvel état
    WaitHSync15k; Durée de l'impulsion ligne
                                                                                                    
                            ; Palier de suppression arrière (Back Porch)
    jmp$+1; Absorption de 3 µcycles
    setbSyncH; Effacement de l'impulsion de synchronisation horizontale
    WaitBP15k; Durée du palier arrière
                                                                                                    
                            ; Blanking des lignes tout pendant la durée de l'impulsion de synchronisation trame
    ; Le contenu des lignes et le palier avant sont ici confondus puisqu'ils sont tous les 2 au niveau du noir
    SetColorBlack,HDisp15k+FP15k-14; Contenu = niveau du noir + palier avant, minoré de 14 µcycles
                                                                                                    
                            ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
    NextLineSyncVer15k,Trailing15k; Décomptage lignes et test si zéro
                                                                                                    
    ;****************************** Champ à la suite de l'impulsion de synchronisation trame (blanking arrière) ************************

    Trailing15kSET$
    :SetUpPresetCountTBI15k; Nombre de lignes allouées au blanking arrière
    jmpTrailing15k:Loop; 7 µcycles d'absorbés par le rechargement du compteur de lignes
                                                                                                    
                            ; Impulsion de synchronisation horizontale
    Trailing15kSET$
    :Loopmovw,rb; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
    clrbwreg.0; 1 µC, positionnement du bit affecté à la synchronisation horizontale
    setbwreg.1; 1 µC, effacement du bit affecté à la synchronisation verticale
    movrb,w; 1 µC, émission de cet nouvel état
    WaitHSync15k; Durée de l'impulsion ligne
                                                                                                    
                            ; Palier de suppression arrière (Back Porch)
    jmp$+1; Absorption de 3 µcycles
    setbSyncH; Effacement de l'impulsion de synchronisation horizontale
    WaitBP15k; Durée du palier arrière
                                                                                                    
                            ; Blanking des lignes à la suite de l'impulsion de synchronisation trame
    ; Le contenu des lignes et le palier avant sont ici confondus puisqu'ils sont tous les 2 au niveau du noir
    SetColorBlack,HDisp15k+FP15k-14; Contenu = niveau du noir + palier avant, minoré de 14 µcycles
                                                                                                    
                            ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
    NextLineTrailing15k,Pattern15k; Décomptage lignes et test si zéro
                                                                                                    
    ;****************************** Affichage du motif de la mire **********************************************************************

    Pattern15kSET$
    :SetUpPresetCountVDisp15k; Nombre de lignes allouées pour afficher la mire
    jmpPattern15k:Loop; 7 µcycles d'absorbés par le rechargement du compteur de lignes
                                                                                                    
                            ; Impulsion de synchronisation horizontale
    Pattern15kSET$
    :Loopjmp$+1; Absorption de 3 µcycles
    clrbSyncH; Emission de l'impulsion SyncH
    WaitHSync15k; Durée de l'impulsion
                                                                                                    
                            ; Palier de suppression arrière (Back Porch)
    jmp$+1; Absorption de 3 µcycles
    setbSyncH; Effacement de l'impulsion de synchronisation horizontale
                                                                                                    
                            ; Test en tout début de palier sur les dip-switches affectés au choix de la mire
    jbrb.7,Pattern15k:NextSwitch; +2/4 µC
    jmp@CrossHatch15k; +6 µcycles si dérivation vers mire quadrillée
                                                                                                    
    Pattern15kSET$
    :NextSwitchjbrb.6,Pattern15k:BackPorch; +2/4 µC
    jmp@Twinkle15k; +10 µcycles si dérivation vers mire clignotante
                                                                                                    
                            ; Complétion du palier de suppression arrière
    Pattern15kSET$
    :BackPorchWaitBP15k-8-4; -8 µC du test sur les switches et -4 µC du saut interpages
                                                                                                    
                            ; Affichage des 8 barres colorées de la mire
    ; Déplacé en page 0 pour récupérer de la place en page 1
    jmp@ColorBars15k; Absorbe 4 µcycles
                                                                                                    
                            ; Palier de suppression avant (Front Porch)
    Pattern15kSET$
    :FrontPorchSetColorBlack,FP15k-14; Contenu = niveau du noir + palier avant, minoré de 14 µcycles
                                                                                                    
                            ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
    NextLinePattern15k,Leading15k; Décomptage lignes et test si zéro
                                                                                                    
    ;****************************** Champ précédant l'impulsion de synchronisation trame (blanking avant) ******************************

    Leading15kSET$
    :SetUpPresetCountLBI15k; Nombre de lignes allouées au blanking avant
    jmpLeading15k:Start; 7 µcycles d'absorbés par le rechargement du compteur de lignes
                                                                                                    
                            ; Un délai supplémentaire de 20 µcycles (34-14) doit être inséré car le test du compteur n'en a consommé que 14
    Leading15kSET$
    :LoopDelay20,0; Délai avec offset nul
                                                                                                    
                            ; Impulsion de synchronisation horizontale
    Leading15kSET$
    :Startjmp$+1; Absorption de 3 µcycles
    clrbSyncH; Emission de l'impulsion SyncH
    WaitHSync15k; Durée de l'impulsion
                                                                                                    
                            ; Palier de suppression arrière (Back Porch)
    jmp$+1; Absorption de 3 µcycles
    setbSyncH; Effacement de l'impulsion de synchronisation horizontale
    WaitBP15k; Durée du palier arrière
                                                                                                    
                            ; Blanking des lignes précédant l'impulsion de synchronisation trame
    ; Le contenu des lignes et le palier avant sont ici confondus puisqu'ils sont tous les 2 au niveau du noir
    ; Le nombre de µcycles doit être minoré de 34 pour lire les micro-switches lors du rebouclage par MainLoop
    ; 34 µcycles = 9 (NextLine) + 18 (MainLoop) + 7 (SyncHor15k:SetUp)
    SetColorBlack,HDisp15k+FP15k-34; Contenu = niveau du noir + palier avant, minoré de 34 µcycles
                                                                                                    
                            ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
    NextLineLeading15k,MainLoop; Décomptage lignes et test si zéro
                                                                                                    

    A la suite des instructions de la section principale, en page 1, 3 ou 5 selon le standard, sont implantés les descripteurs des différents modèles de ligne utilisés par les 3 mires noir et blanc
    • Ligne complètement noire (Blank) : mire à points.
    • Ligne noire + cadre (Black) : mire clignotante.
    • Ligne complètement blanche (Frame) : cadre mire clignotante, mire quadrillée.
    • Ligne blanche + cadre (White) : mire clignotante.
    • Ligne à points blancs (Points) : mire à points, mire quadrillée.
    Chaque descripteur énumère les différents segments qui constituent la ligne associée. Il n'y a que la description de la ligne à points qui est singulière puisqu'elle fractionne virtuellement la ligne en deux pour pouvoir utiliser la directive de répétition d'instructions.

    Le retour dans la section principale doit s'effectuer avec un saut intra-page (3 µcycles) pour une question de timing, c'est pour cette raison que les descripteurs sont implantés à sa suite.

    Ci-dessous, pour l'exemple, les descripteurs pour le standard EGA/24 kHz.
    Les descripteurs pour les deux autres standards ne diffèrent que par la longueur (en µcycles) des segments noir/blanc tels qu'ils ont été déterminés dans le message précédent.

    Récapitulatif pour la mire clignotante :


    |
    C a
    dr e|
    M a
    rg e|
    |Fréquence|Pixel(s)|µCycles|Pixel(s)|µCycles|
    |   15 kHz|   0,973|     8|   1,946|    16|
    |   24 kHz|   3,000|     9|   6,000|    18|
    |   31 kHz|   4,324|     8|   8,107|    15|

          
    Récapitulatif pour la mire à quadrillage :

    |M o  nt  a   nt|
    I n t e
    rv a l l e|
    |
    N o
    rm a l|
    C e
    nt r a l|
    C a
    dr e||
    |Fréquence|Pixels|µCycles|Pixels|µCycles|Pixels|µCycles|Pixels|µCycles|
    |   15 kHz|0,973|     8|2,189|    18|2,068|    17|28,46|   234|
    |   24 kHz|3,000|     9|6,000|    18|6,000|    18|47,00|   141|
    |   31 kHz|4,324|     8|7,567|    14|7,027|    13|58,37|   108|


    Citer
    ;****************************** Descripteurs des différents modèles de lignes **********************

    Blank24kEQU$; Pas d'affichage, la ligne est complètement noire
    SetColorBlack,HDisp24k-3; -3 µC pour le jmp suivant
    jmpPattern24k:FrontPorch
                                                                                                    
    Black24kEQU$; Marges confondues avec la ligne noire affichée
    SetColorWhite,9; Equivaut à 3 pixels blancs
    SetColorBlack,HDisp24k-(2*9 ); Moins 2 × 3 pixels en largeur pour le cadre
    SetColorWhite,9-3; Equivaut à 3 pixels blancs, -3 µC pour le jmp suivant
    jmpPattern24k:FrontPorch
                                                                                                    
    Frame24kEQU$; Affichage d'une ligne blanche sans marge (cadre)
    SetColorWhite,HDisp24k-3; -3 µC pour le jmp suivant
    jmpPattern24k:FrontPorch
                                                                                                    
    White24kEQU$; Affichage d'une ligne blanche avec marge
    SetColorWhite,9; Egal à 3 pixels blancs pour 384 lignes au format 4/3
    SetColorBlack,18; Marge gauche, équivaut à 6 pixels noirs
    SetColorWhite,HDisp24k-(2*27); Moins 2 × 9 pixels en largeur pour le cadre et les marges
    SetColorBlack,16; Marge droite, équivaut à 6 pixels noirs
    SetColorWhite,9-3; Equivaut à 3 pixels blancs, -3 µC pour le jmp suivant
    jmpPattern24k:FrontPorch
                                                                                                    
    ;-----------------------------------------------------------------------------------------------------------------------------------

    Points24kEQU$; Affichage d'une ligne comportant 11 points blancs
                                                                                                    
                            ; Moitié gauche de la ligne
    REPT5; 5 ensembles point + intervalle
     IF%=1; Test sur compteur de répétitions
    Length    SET18; 6 pixels pour le montant vertical gauche du cadre
     ELSE
    Length    SET9; 3 pixels pour les autres traits verticaux
     ENDIF
    SetColorWhite,Length; Point blanc
    SetColorBlack,141; Intervalle noir de 47 pixels
    ENDR
                                                                                                    
                            ; Moitié droite de la ligne
    REPT5; 5 ensembles point + intervalle
     IF%=1; Test sur compteur de répétitions
    Length    SET18; 6 pixels pour le trait vertical central du quadrillage
     ELSE
    Length    SET9; 3 pixels pour les autres traits verticaux
     ENDIF
    SetColorWhite,Length; Point blanc
    SetColorBlack,141; Intervalle noir de 47 pixels
    ENDR
                                                                                                    
                            ; Montant vertical droit du cadre
    LengthSET18; 6 pixels pour le montant vertical droit du cadre
    SetColorBlack,Length-3; -3 µC pour le jmp suivant
    jmpPattern24k:FrontPorch
                                                                                                    

    Si on applique la hauteur du trait horizontal de la mire quadrillée au point de la mire à points et que l'on conserve des intervalles identiques, le même algorythme par comparaison du n° de ligne peut être utilisé, il suffit juste de remplacer :
    • la ligne blanche horizontale de la première par la ligne de points pour la seconde.
    • la même ligne de points qui constituait les montants verticaux de la première par une ligne complètement noire pour remplir les intervalles de la seconde.

    Une nouvelle macro "Select" a donc été crée pour choisir le type de ligne à afficher en fonction du dip-switch rb.6 quand rb.7 est sur ON

    La macro "Select" :

                         ; Choix d'une ligne parmis celles du duo passé comme paramètre selon le dip-switch sur rb.6
    Select            MACRO         FirstLabel, SecondLabel         ; Le test sur rb.6 consomme 7 µcycles supplémentaires
    LOCALFirstChoice
     jnbrb.6,FirstChoice; +2/4 µC, FirstLabel si bit à 0, SecondLabel si bit à 1
     skip; +2 µcycles pour égaliser les deux branches à 4 µcycles
    FirstChoice  jmpFirstLabel; +3 µcycles, 2ème paramètre = FirstLabel
     jmpSecondLabel; +3 µcycles, 3ème paramètre = SecondLabel
    ENDM


    Seule précaution avec cette macro, elle doit être déroulée en fin ultime du palier de suppression arrière, juste pile poil avant la période d'affichage.

    Le choix du type de ligne par test sur rb.6 immédiatement à la suite des descripteurs :

    Citer
    ;-----------------------------------------------------------------------------------------------------------------------------------

                            ; Affichage d'une des lignes d'un duo en fonction de l'état sur rb.6

    DashOrDots24kEQU$
    SelectPoints24k,Frame24k; Affichage point blanc ou trait horizontal du quadrillage
                                                                                                    
    DotsOrNix24kEQU$
    SelectBlank24k,Points24k; Affichage intervalle noir ou montant vertical du quadrillage
                                                                                                    
    ;***************************************************************************************************

    NOEXPAND
    Fill$03FF; Bourrage de la page 3 avec des NOP's
    EXPAND
                                                                                                    

    Au tour maintenant des 3 autres mires, leur choix s'effectue à l'aide des dip-switches sur les ports rb.7 et rb.6 :
    • Ils sont lus une première fois au début du palier de suppression arrière du bloc affichage du contenu visible pour déterminer la routine à exécuter.
    • Le switch sur le port rb.6 est éventuellement relu une deuxième fois en fin du même palier (macro "Select") pour déterminer la ligne d'un duo qui doit être affichée.

    Rb.7            Rb.6            
    OFFOFFMire à barres colorées
    OFFONMire à bandes clignotantes
    ONOFFMire à quadrillage
    ONONMire à points

    A suivre...
    « Modifié: Jeudi 23 Juin 2016, 00:30:38 am par gc339 »
    Le repos, c'est fait pour les jeunes. Ils ont toute la vie devant eux. J. Gabin/M. Audiard



    Hors ligne nc333

    • VIP
    • *
    • Messages: 1653
    • Localisation: Savoie - 73610
    • Jeune padawan de l'arcade
      • Voir le profil
      • Nc333 - Bordel diverse et avarié
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #70 le: Mardi 27 Octobre 2015, 23:30:55 pm »
  • Bien que j'ai pas le temps de lire et analyser tout ce que tu nous propose, j'admire cette réalisation qui n'utilise pas de solution clef en main pour être mené a bien (pas de bibliothèque d'affichage magique, utilisation d'un chips a la programmation en bas niveau etc) .. Chapeaux bas :)
    "Bon, j'ai pas mal réfléchi. Quand la vie vous fait trébucher, ça ne suffit pas de se relever. Il faut lui péter les rotules, à cette grognasse ! Œil pour œil, dent pour dent ! « Essaie un peu de te relever, maintenant, traînée ! »" Caves Johnson, 1980

    La présentation c'est ICI :)

    Hors ligne gc339

    • Beta Testeur
    • *
    • Messages: 2247
    • Localisation: Lyon
      • Voir le profil
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #71 le: Jeudi 23 Juin 2016, 00:24:41 am »


  • Suite migration du SX28 vers le SX48.

    L'affichage de la mire clignotante a déjà été évoqué quelques messages plus haut et avait nécessité la création d'une macro "CheckCount" pour comparer le n° de ligne courant avec ceux qui délimitent la base des différentes bandes horizontales à afficher.
    Cette mire est basé principalement sur l'affichage de 3 bandes horizontales à l'intérieur d'un cadre fixe, la bande centrale clignotant à l'inverse des deux autres. Elle était donc constituée de 7 bandes successives de hauteur différente, ce qui avait nécessité l'écriture de 7 blocs juxtaposés de lignes de code ainsi que de calculer manuellement pour chacun le nombre de µcycles restant à absorber pour compléter le palier arrière.

    Afin d'en simplifier l'écriture une nouvelle macro "DisplayStripe" a été créée pour reprendre les lignes de code communes à tous les blocs et surtout comptabiliser le nombre de µcycles consommé par les comparaisons successives.

    La macro "DisplayStripe" :

                                                                                              
    DisplayStripeMACRO; StripeHeight, FirstLabel, SecondLabel
    LOCALLocLab1, LocEnd
    LastStripeLineSETLastStripeLine-\1; 1er paramètre = StripeHeight (en nombre de lignes)
    CheckCountLastStripeLine; +6 µC pour la macro
    jncLocEnd; +2/4 µC, total 8/10 µC
    IF\0>2; Test si présence d'un troisième paramètre
      WaitRemainingCycles-16; 8 µC écoulés, +8 µC pour le bloc d'instructions suivantes
      jbFlipFlop.0,LocLab1; +2/4 µC, test sur inverseur clignotement
      nop; 2 NOP's pour égaliser les deux branches à 4 µcycles
      nop
      jmp@\2; + 4 µcycles, 2ème paramètre = FirstLabel
    LocLab1  jmp@\3; + 4 µcycles, 3ème paramètre = SecondLabel
    ELSE
                                 IF(\2=DashOrDots15k) OR (\2=DotsOrNix15k) OR (\2=DashOrDots24k) OR (\2=DotsOrNix24k) OR (\2=DashOrDots31k) OR (\2=DotsOrNix31k)
        WaitRemainingCycles-19; 8 µC écoulés, +4 µC du saut interpages, +7 µC sélection par rb.6
      ELSE
        WaitRemainingCycles-12; 8 µC écoulés, +4 µC pour le saut interpages
      ENDIF
      jmp@\2; + 4 µcycles, 2ème paramètre = FirstLabel
    ENDIF
    LocEndEQU$
    RemainingCyclesSETRemainingCycles-10; Décompte des µcycles consommés par la comparaison
    ENDM
                                                                      


    Cette macro compare le numéro de ligne courant avec le numéro de ligne passé comme premier paramètre, ce dernier numéro doit être celui de la dernière ligne d'une bande horizontale.
    • Si la ligne courante n'appartient pas à cette bande, on cumule le nombre de µcycles consommés avec le cumul de ceux déjà absorbés par les comparaisons précédentes.
    • Si elle appartient à cette bande :
      • Si un troisième paramètre est présent, on teste le Flip-Flop de clignotement pour savoir lequel du deuxième ou du troisième paramètre il faut sélectionner, ces deux paramètres correspondent au nom des lignes à afficher pour la mire clignotante.
      • Si le troisième paramètre est absent, on compare le deuxième paramêtre avec le nom des duos car le nombre de µcycles nécessaire pour compléter le palier de suppression arrière doit tenir compte du temps d'exécution de la macro "select". Le contrôle est ensuite passé par un saut inter-pages à l'affichage du contenu de la ligne ou du duo dont le nom a été passé comme deuxième paramètre.


    Les développements successifs de cette macro pour les 3 mires occupent tellement de lignes mémoire programme qu'ils nécessitent l'allocation d'une page d'extension pour chaque standard.

    Ci-dessous, pour l'exemple, le code de la mire clignotante suivi de celui de la mire à quadrillage/à points pour le standard VGA/31 kHz.
    Le code de ces mires pour les deux autres standards ne diffèrent que par la la hauteur des bandes horizontales telles qu'elles ont été déterminées dans le message précédent.

    Récapitulatif pour la mire clignotante :


    |Fréquence|Cadre|Marge|   Ligne|
    |   15 kHz|1 ligne|2 lignes|2456 µCycles|
    |   24 kHz|3 lignes|6 lignes|1536 µCycles|
    |   31 kHz|4 lignes|8 lignes|1184 µCycles|

                
    Récapitulatif pour la mire à quadrillage :

    |T  r  a   it|Intervalle|
    |Fréquence|Normal|Central|  Cadre|                |
    |   15 kHz|1 ligne|2 lignes|2 lignes|   21 lignes|
    |   24 kHz|3 lignes|6 lignes|7 lignes|   34 lignes|
    |   31 kHz|4 lignes|6 lignes|6 lignes|   43 lignes|


    Citer
    ;***********************************************************************************************************************************

    ORG$0C00; Extension de la section VGA en page 6
                                                                                                          
    ;****************************** Affichage de la mire clignotante noir/blanc ********************************************************
                                                                                                          
    Twinkle31kEQU$
    RemainingCyclesSETBP31k-10; 10 µcycles déjà absorbés sur les 222 du back porch
    LastStripeLineSETVDisp31k+1
    DisplayStripe4,Frame31k; Quatre lignes blanches pour le cadre (hauteur 4 pixels)
    DisplayStripe8,Black31k; Marge en-dessous du trait du cadre : 8 lignes
    DisplayStripe152,White31k,Black31k; 1ère bande clignotante : 152 lignes
    DisplayStripe152,Black31k,White31k; 2ème bande clignotante : 152 lignes
    DisplayStripe152,White31k,Black31k; 3ème et dernière bande clignotante : 152 lignes
    DisplayStripe8,Black31k; Marge au-dessus du trait du cadre : 8 lignes
    WaitRemainingCycles-4; Complétion du back porch avant affichage du cadre
    jmp@Frame31k; 4 µcycles pour ce saut interpages
    ElapsedSETRemainingCycles

    ;****************************** Tronc commun à l'affichage de la mire quadrillée et de la mire à points ****************************
                                                                                                          
    CrossHatch31kEQU$
                                  
    ; L'ensemble des traitements est fractionné en deux
    ; Ainsi la durée du traitement de chaque moitié n'excède pas celle du palier arrière
                                                                                                          
    HalfScreenLimitSET(VDisp31k+1)-6-(4*4)-(5*43); Moitié supérieure limitée au 5ème intervalle
    CheckCountHalfScreenLimit; Déjà 6 µcycles d'écoulés +6 µC pour la macro
    jncLowerHalf31k; +2/4 µC, donc comparaison = 8/10 µcycles
                                  
    ; Traitement de la moitié supérieure de la trame
                                                                                                          
    UpperHalf31kEQU$
    RemainingCyclesSETBP31k-6-8; Déjà 6 µcycles écoulés + 8 pour la comparaison
    LastStripeLineSETVDisp31k+1
                                  
    ; 5 ensembles ruban + intervalle pour cette moitié supérieure
    ; Un ruban est constitué soit de traits horizontaux soit de points
                                                                                                          
    REPT5
     IF%=1; Test sur compteur de répétitions
    Height    SET6; 6 lignes pour le ruban supérieur
     ELSE
    Height    SET4; 4 lignes pour les autres rubans
     ENDIF
     DisplayStripeHeight,DashOrDots31k; Affichage des traits horizontaux ou des points du ruban
     DisplayStripe43,DotsOrNix31k; Intervalle de 43 lignes, montants verticaux ou rien du tout
    ENDR
    ElapsedSETRemainingCycles
    WaitRemainingCycles-4; Complétion du back porch
    jmp@Blank31k; Echappatoire sur erreur de limite
                                  
    ; Traitement de la moitié inférieure de la trame
                                                                                                          
    LowerHalf31kEQU$
    RemainingCyclesSETBP31k-6-10; Déjà 6 µcycles écoulés + 10 pour la comparaison
    LastStripeLineSETHalfScreenLimit
                                  
    ; 5 ensembles ruban + intervalle pour cette moitié inférieure
    ; Un ruban est constitué soit de traits horizontaux soit de points
                                                                                                          
    REPT5
     IF%=1; Test sur compteur de répétitions
    Height    SET6; 6 lignes pour le ruban central
     ELSE
    Height    SET4; 4 lignes blanches pour les autres rubans
     ENDIF
     DisplayStripeHeight,DashOrDots31k; Affichage des traits horizontaux ou des points du ruban
     DisplayStripe43,DotsOrNix31k; Intervalle de 43 lignes, montants verticaux ou rien du tout
    ENDR
    ElapsedSETRemainingCycles
                                  
    ; Traitement du dernier ruban (trait inférieur du cadre ou dernière ligne de points)
                                                                                                          
    WaitRemainingCycles-4; Complétion du back porch avant affichage du dernier ruban
    jmp@Frame31k; 4 µcycles pour ce saut interpages
    CurrentLineSETLastStripeLine

    ;***********************************************************************************************************************************
                                                                                                          
    NOEXPAND
    Fill$0DFF; Bourrage de la page 6 avec des NOP's
    EXPAND


    Et pour finir, le bourrage de la dernière page ($0E00..$0FFE) avec des NOP's. Ces 511 octets resteront en réserve pour une adjonction éventuelle...

    Citer
    ;***********************************************************************************************************************************
                                  
    ; Page 7 inutilisée, en réserve ($0E00 ... $0FFE)
                                                          
    ORG$0E00
    UnusedEQU$

    ;***********************************************************************************************************************************
                                                                                                          
    NOEXPAND
    Fill$0FFE; Bourrage de la page 7 avec des NOP's (vecteur reset en $07FF)
    EXPAND

    ;***********************************************************************************************************************************
                                  
    END
    « Modifié: Vendredi 24 Juin 2016, 21:21:51 pm par gc339 »
    Le repos, c'est fait pour les jeunes. Ils ont toute la vie devant eux. J. Gabin/M. Audiard



    Hors ligne oOSphaXOo

    • Confirmé
    • *
    • Messages: 148
      • Voir le profil
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #72 le: Jeudi 23 Juin 2016, 07:09:50 am »
  • Tout bonnement impression, code clair et carré, je suis admiratif !
    Super boulot !

    En ligne funkycochise

    • Team
    • Dieu de l' Arcade
    • *****
    • Messages: 6605
    • Localisation: Nancy
    • 8 bits generation
      • Voir le profil
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #73 le: Jeudi 23 Juin 2016, 10:13:09 am »
  • Très intéressant et instructif.  ^-

    Hors ligne gc339

    • Beta Testeur
    • *
    • Messages: 2247
    • Localisation: Lyon
      • Voir le profil
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #74 le: Jeudi 23 Juin 2016, 18:00:27 pm »
  • Maintenant il s'agit de pouvoir programmer le SX48 :
    • Le circuit imprimé du programmateur Fluffy-2 n'a été dessiné que pour pouvoir y flasher des SX18 et des SX28, il ne dispose pas des emplacements pour les SX48 et SX52.
      Heureusement son concepteur l'a doté d'un connecteur ISP à 4 broches, ce qui va amplement faciliter l'ajout de l'extension pour le SX48.



    • Le SX48 étant packagé dans un boîtier 48 pin PQFP au pas de 0,5 mm, il devra être soudé sur une plaquette adaptatrice pour que ses pattes soient espacées au pas de 2,54 bien plus pratique pour une réalisation amateur.
      L'extension SX48 pour le Fluffy-2 devra par conséquent comporter un support 48 pin compatible avec cette plaquette adaptatrice.



    • Le logiciel universel de programmation IC-PROG version 1.06C qui servait jusqu'à maintenant pour programmer les SX28AC des versions précédente de la mire comporte bien le SX48 non suffixé ainsi que le SX52 dans sa liste déroulante. Reste à savoir s'il est bien compatible avec les SX48BD et SX52BD même s'il n'est pas optimisé pour ces deux derniers.



    Au niveau du câblage, rien de bien compliqué, il suffit de connecter les pattes concernées du SX48 aux broches du connecteur ISP, en gris sur le nouveau schéma :
      


    Plus concrètement, le connecteur pour le SX48 soudé sur son adaptateur a été réalisé avec 8 connecteurs gigognes (6 pin stackable female header) pour Arduino enfichés dans un bout de plaquette d'essais, les interconnections étant mini-wrappées par en dessous :



    L'extension SX48 installée dans le coin en haut à gauche sur le support en plexiglas, elle est raccordée au circuit-imprimé du programmateur par l'intermédiaire du connecteur femelle bleu embroché sur celui de l'ISP :



    Un adaptateur équipé d'un SX48 enfiché dans le connecteur de l'expansion prêt à être programmé :




    Le logiciel IC-PROG, configuré pour le SX48, buffer chargé avec la version 10 de la mire qui reste à déboguer :



    La programmation des 4K lignes de la mémoire programme du SX42 dure 1'32" plus 25" pour la vérification, ça semble un peu long par rapport à celle du SX28, à l'occasion faudra vérifier si elle équivaut bien au double de ce dernier.
    Bon maintenant reste plus qu'à câbler le même support constitué des 8 connecteurs gigognes sur la plaque à trous de la mire, juste à coté du support vide du SX48 et en // sur les ports qui leur sont communs. Et ensuite à déboguer la version 10 du logiciel de la mire...
    « Modifié: Jeudi 23 Juin 2016, 20:54:33 pm par gc339 »
    Le repos, c'est fait pour les jeunes. Ils ont toute la vie devant eux. J. Gabin/M. Audiard



    Hors ligne Fred G5

    • ✌ Donateur depuis 2018
    • VIP
    • *
    • Messages: 1567
    • Localisation: 67 - Bas-Rhin
    • Leaf switch are Forever
      • Voir le profil
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #75 le: Mercredi 17 Août 2016, 19:31:35 pm »
  • Je poste enfin les photos de mon générateur mires tri-fréquences

    J'ai tout intégré dans une boite que j'avais en stock, montage du circuit sur véroboard.
    Une sortie VGA et une molex pour les signaux vidéos, alimentation externe 12V. fonction On/OFF sur la boite

    Vu d'ensemble


    Détail du véroboard


    La connectique


    La mire de barre sur un Hantarex Polo Star en 31KHz


    J'ai pas de bonnes photos de la mire clignotante, mais elle marche bien aussi

    Un grand merci à GC339 pour le partage et la programmation de mon circuit  ^-^
    Flipper: DE "Laser War"- WMS "F14-Tomcat"- GTB " Hollywood Heat"
    Borne: Konami "Lethal Enforcers" - New Game "N'Styl"- René Pierre 1982 - Jeutel Neo Geo 16/9 - Simulateur Twin Konami "Midnight Run Road Fighter 2"
    Jeu/Système de jeu: 45 PCB Jamma, 7 cartouches MVS, slot Neo-Geo MV-1T, MV-2F, MV-6F
    Console: Nintendo SNES 2CHIP, SNES 1CHIP-02 + 23 jeux

    Hors ligne maldoror68

    • Dieu de l' Arcade
    • *
    • Messages: 8072
    • Localisation: Mulhouse
    • voui, c'est moi ki lai fait^^allez voir mon string
      • Voir le profil
      • pixels points morts
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #76 le: Mercredi 17 Août 2016, 19:38:28 pm »
  •  :-* c'est magnifique  ^-^

    Hors ligne gc339

    • Beta Testeur
    • *
    • Messages: 2247
    • Localisation: Lyon
      • Voir le profil
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #77 le: Jeudi 18 Août 2016, 13:42:28 pm »
  • Juste un aparté au sujet du schéma publié par Spectro quelques pages plus en avant.
    Cet remarque concerne la manière dont le signal de synchronisation trame interfère avec celui de la synchronisation ligne pour produire la synchronisation composite nécessaire à certains moniteurs.
    • Le OU exclusif (ou XOR) U2-A assure la superposition des impulsions de synchronisation trame par dessus celles de synchronisation ligne quand le switch 8 de SW1 est fermé.
    • Le XOR suivant, U2-C, permet de choisir la polarité de la synchronisation ligne/composite :
      • Synchronisation positive quand le switch 7 de SW1 est fermé.
      • Synchronisation négative quand ce même switch est ouvert.
    • La polarité de la synchronisation trame est de pair affectée par l'intermédiaire de U2-B



    L'apparition ou la disparition de l'impulsion de synchronisation trame doit être synchrone avec l'impulsion de synchronisation ligne.
    • Avec le front montant de l'impulsion ligne quand la polarité du signal est positive.
    • Avec le front descendant de l'impulsion ligne quand la polarité du signal est négative.
    Sur les chronogrammes ci-dessous, la durée de l'impulsion de synchronisation équivaut à celle de 4 lignes.

       ┌┐        ┌┐        ┌┐        ┌┐        ┌┐        ┌┐        ┌┐        ┌┐        ┌┐        ┌┐
       ││        ││        ││        ││        ││        ││        ││        ││        ││        ││
    ──█┘└────────┘└────────┘└────────┘└────────┘└────────┘└────────┘└────────┘└────────┘└────────┘└───── Synchro Ligne  Positive 
                                     ┌───────────────────────────────────────┐
                                     │         ↓         ↓         ↓         │
    ──█──────────────────────────────┘         ↓         ↓         ↓         └────────────────────────── Synchro Trame Positive 
       ┌┐        ┌┐        ┌┐        ↓┌────────┐┌────────┐┌────────┐┌─────────┐        ┌┐        ┌┐
       ││        ││        ││        ↓│        ││        ││        ││        ↓│        ││        ││
    ──█┘└────────┘└────────┘└─────────┘        └┘        └┘        └┘        ↓└────────┘└────────┘└───── Synchro Composite  Positive 
                                     ↓         ↓         ↓         ↓         ↓
                                     ↓         ↓         ↓         ↓         ↓
    ──█┐┌────────┐┌────────┐┌─────────┐        ┌┐        ┌┐        ┌┐        ↓┌────────┐┌────────┐┌───── Synchro Composite  Négative 
       ││        ││        ││        ↓│        ││        ││        ││        ↓│        ││        ││
       └┘        └┘        └┘        ↓└────────┘└────────┘└────────┘└─────────┘        └┘        └┘

    Hors, quelque soit la polarité de la synchronisation composite, les impulsions de synchronisation lignes attendues pendant la durée de la synchronisation trame se retrouvent inversées par le XOR U2-A. Le front montant de ces impulsions lignes incluses se retrouve alors remplacé par un front descendant et vis versa.
    Et c'est là que le bât blesse car la base de temps ligne des moniteurs est plutôt conçue pour se synchroniser sur un front que sur le niveau du signal synchronisant.
    En l'occurrence sur le front descendant des impulsions lignes avec un signal de polarité négative pour les moniteurs arcade usuels. La base de temps ligne du moniteur tend à rattraper le léger retard des fronts descendants pendant la synchronisation trame puis à reprendre son rythme normal quand elle disparaît. Cela peut se traduire par un déchirement des lignes tout en haut de l'image.

       ↓         ↓         ↓         ↓         ↓         ↓         ↓         ↓         ↓         ↓
    ──█┐┌────────┐┌────────┐┌─────────┐        ┌┐        ┌┐        ┌┐        ↓┌────────┐┌────────┐┌───── Synchro Composite  Négative 
       ││        ││        ││        ↓│        ││        ││        ││        ↓│        ││        ││           Avant Correction 
       └┘        └┘        └┘        ↓└────────┘└────────┘└────────┘└─────────┘        └┘        └┘
       ↓         ↓         ↓         ↓         ↓         ↓         ↓         ↓         ↓         ↓
    ──█┐┌────────┐┌────────┐┌────────┐        ┌┐        ┌┐        ┌┐        ┌┐┌────────┐┌────────┐┌───── Synchro Composite  Négative 
       ││        ││        ││        │        ││        ││        ││        │││        ││        ││           Après Correction 
       └┘        └┘        └┘        └────────┘└────────┘└────────┘└────────┘└┘        └┘        └┘

       ↓         ↓         ↓         ↓         ↓         ↓         ↓         ↓         ↓         ↓
    ──█┐┌────────┐┌────────┐┌────────┐┌────────┐┌────────┐┌────────┐┌────────┐┌────────┐┌────────┐┌───── Synchro Ligne  Négative 
       ││        ││        ││        ││        ││        ││        ││        ││        ││        ││
       └┘        └┘        └┘        └┘        └┘        └┘        └┘        └┘        └┘        └┘
       ↓         ↓         ↓         ↓         ↓         ↓         ↓         ↓         ↓         ↓
    ──█──────────────────────────────┐                                       ┌────────────────────────── Synchro Trame Négative 
                                     │                                       │
                                     └───────────────────────────────────────┘

    La réelle solution à ce petit problème posé pendant la synchronisation trame serait de générer l'impulsion de synchronisation ligne à ce moment là en avance d'un temps égal à sa propre durée pour que les fronts synchronisants coïncident ( fronts montants pour la synchronisation positive, descendants pour la négative) ainsi que représenté par le chronogramme rouge au dessus.
    Ce signal composite revu et corrigé est plus complexe à générer par hardware, le plus judicieux serait de le générer par logiciel sur un port actuellement libre du SX28. Son inversion de polarité pourra avantageusement être réalisée par le XOR U2-A que cette modification aura rendu disponible.
    « Modifié: Jeudi 18 Août 2016, 14:32:05 pm par gc339 »
    Le repos, c'est fait pour les jeunes. Ils ont toute la vie devant eux. J. Gabin/M. Audiard



    Hors ligne Stek

    • ✌(◕‿◕)✌ Donateur 2019
    • Arcade Killer
    • *
    • Messages: 2974
    • Localisation: Metz
      • Voir le profil
    Etude/Réalisation d'un générateur de mires 15/24/31 kHz
    « Réponse #78 le: Jeudi 18 Août 2016, 14:06:53 pm »

  • ....La réelle solution à ce petit problème posé pendant la synchronisation trame serait de générer l'impulsion de synchronisation ligne à ce moment là en avance d'un temps égal à sa propre durée pour que les fronts synchronisants coïncident....

    C'est la première chose que je me suis dite en lisant le post de spectro   8)

     :fleche:


    "Fun and nostalgia through gaming and beer is what we’re all about."