Le fait d'avoir dû ressortir le matériel pour programmer le SX de Fred G5 m'a encouragé à replonger dans le logiciel du générateur pour y incorporer une nouvelle mire.
Pour ce nouvel exercice, j'ai choisi arbitrairement la mire clignotante plutôt que la mire quadrillée (cross-hatch) parmi celles que j'avais prévues à l'origine. J'ai préféré implanter celle de droite en premier car elle sollicite un peu moins le bloc THT avec ses trois bandes alternées.
De plus la 4ème mire, celle affichant un écran uniformément blanc, n'est pas d'une très grande utilité. Il serait préférable de la remplacer par une mire alternant images ou larges bandes noires et blanches pour vérifier la stabilité de la THT :
En effet, une image noire demande aucun courant au bloc THT alors qu'une image uniformément blanche lui en soutire un maximum. Si le bloc THT est sous dimensionné ou mal en point, la tension s'affaissera avec le courant délivré, les électrons seront alors moins accélérés et seront donc plus facilement déviés par les bobinages du yoke, l'image affichée augmentera de taille et les zones blanches seront moins lumineuses.
Quand on analyse la constitution de ces mires clignotantes, on se rend compte qu'elles sont obtenues par la juxtaposition de 3 types de lignes élémentaires :
- Des lignes complètement blanches pour les traits inférieur et supérieur du cadre.
- Des lignes blanches délimitées par les montants verticaux du cadre, elles sont juxtaposées pour former les bandes blanches de la mire.
Chaque ligne blanche comporte ainsi :- Les pixels blancs du montant gauche du cadre.
- Les pixels noirs de la marge verticale gauche.
- La ligne blanche en question.
- Les pixels noirs de la marge droite.
- Les pixels blancs du montant droit.
- Des lignes noires délimitées par les montants verticaux du cadre. Leur juxtaposition permet de former les bandes noires de la mire.
Les pixels des marges verticales étant confondus avec les lignes noires, chaque ligne noire comporte donc :- Les pixels blancs du montant gauche du cadre.
- La ligne noire en question, marges confondues.
- Les pixels blancs du montant droit.
Et ces lignes noires sont aussi employées pour réaliser les marges horizontales entre les bandes blanches et les traits blancs du cadre, ces marges se confondant alors avec les deux bandes noires quand c'est à leur tour d'être affichées.
Le compteur qui va piloter le clignotement toutes les 30 trames soit ≈
½ seconde a déjà été incorporé préventivement dans le programme existant :
;---------------------------- PROGRAMME PRINCIPAL ----------------------------- | | | Main | setb | SyncH | | setb | SyncV | | clr | FlipFlop | ; Initialisation du flip flop | | jmp | PresetFrCnt |
|
| ; Compteur de trames pour clignotement, absorbe 7 µCycles |
MainLoop | djnz | FrameCounter,NoPreset | ; 2/4 µC | | not | FlipFlop | ; 1 µC, inversion du flip flop | PresetFrCnt | mov | FrameCounter,#30 | ; 2 µC, clignotement toutes les 30 trames (½ seconde) | | skip | | ; 2 µC, ajustement à 7 µC si rechargement FrameCount | NoPreset | jmp | $+1 | ; 3 µC, ajustement à 7 µCycles pour décomptage normal | | | |
|
Le meilleur endroit pour insérer le code de cette nouvelle mire se situe assurément au niveau de la génération du motif de la mire à barres colorées. Une interception au tout début du palier de suppression arrière (
back-porch ) permet de récupérer bien plus d'une centaine de µCycles inactifs avant d'afficher les lignes de cette nouvelle mire clignotante, la reprise s'effectuant juste devant le palier de suppression avant (
front-porch ).
Exemple pour le programme de la mire à 15 kHz en page 1 (0200H), les modifications du code existant sont
surlignées couleur fuchsia . Le principe est identique pour le code 24 et 31 kHz :
- Le switch concerné sur rb.6 (patte 16 du SX28 ) est testé.
- Le code de la mire clignotante est exécuté si le switch est à ON.
- Après affichage d'une ligne de cette nouvelle mire, la reprise du cours normal du programme doit s'effectuer juste devant le palier de suppression avant, sur la nouvelle étiquette "Pattern15k:FrontPorch".
- La durée du palier de suppression arrière est minorée de 2 cycles pour tenir compte du test.
;****************************** Affichage du motif de la mire ****************************** | | | Pattern15k | SET | $ | :SetUp | PresetCount | 224 | ; 224 Nombre de lignes allouées pour afficher la mire | | jmp | Pattern15k:Start |
|
| ; Palier de suppression arrière (Back Porch), suite |
Pattern15k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | | |
| ; Lecture en tout début de palier du dip-switch affecté au choix de la mire |
| jnb | rb.6,Twinkle15k | ; Absorbe 2 µC, 4 µC si dérivation vers mire clignotante |
| | Wait | 323-2 | ; Durée du palier arrière - 2 µCycles | | | |
| ; Affichage des 8 barres colorées de la mire |
| ColorBars | 307 | ; Chaque barre occupe 307 µcycles | | | |
| ; Palier de suppression avant (Front Porch) |
Pattern15k | SET | $ | :FrontPorch | SetColor | Black,161-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) |
| NextLine | Pattern15k,Leading15k | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale |
Pattern15k | SET | $ | :Start | jmp | $+1 | ; Absorption de 3 µcycles | | clrb | SyncH | ; Emission de l'impulsion SyncH | | Wait | 238 | ; Durée de l'impulsion | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | Pattern15k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
;************** Champ précédant l'impulsion de synchronisation trame (blanking avant) ************** |
La nouvelle mire étant constituée des 3 types de ligne précédemment évoqués, il va falloir comparer le numéro de celle qui va être affichée à ceux de chaque bande horizontale pour savoir à laquelle elle appartient et ainsi connaître son type afin de sélectionner le sous-programme concerné.
Le compteur de lignes "LineCounter" étant sur 16 bits, la création d'une nouvelle macro s'avère nécessaire pour effectuer cette comparaison sur deux octets.
;-------------------------- DEVICE DIRECTIVES -------------------------- | | | | IFDEF | __SASM | ;SASM Directives | | | DEVICE | SX28AC, OSCHS3, TURBO, BOROFF, SYNC, OPTIONX, CARRYX | | | IRC_CAL | IRC_SLOW | | ELSE | | ; Parallax Assembler Directives | | | DEVICE | SX28AC, OSCXT2, TURBO, BOROFF, SYNC | | ENDIF | | | ID | "PATGEN" | | | RESET | Initialize | ; Reset vector |
|
|
La comparaison s'effectuant à l'aide de deux soustractions, il a fallu effacer la déclaration du fusible
CARRYX qui avait été déclaré à tord, l'algorithme employé étant perturbé par la propagation de la retenue issue d'une opération précédente.
La nouvelle macro qui compare le compteur de ligne LineCount à la valeur passée comme paramètre (
la dernière ligne d'une bande horizontale ) :
CheckCount | | MACRO | | LastLine | | ; Test sur le comteur ligne, absorbe 6 µcycles |
| | MOV | | W,#LastLine/256 | | ; +1 µC |
| | MOV | | W,LineCounter+1-W | | ; +1 µC, soustraction entre octets de poids fort |
| | JNZ | | $+3 | | ; +2/4 µC |
| | MOV | | W,#LastLine//256 | | ; +1 µC |
| | MOV | | W,LineCounter-W | | ; +1 µC, soustraction entre octets de poids faible |
| | ENDM | | | | ; C=1 si LineCounter >= LastLine |
En 15kHz le nombre de lignes affichées est de 224, avec un trait de cadre d'une épaisseur d'un pixel (
1 ligne ) et une marge horizontale de 2 pixels d'épaisseur (
2 lignes ), il reste 224-6 soit 218 lignes pour les 3 bandes clignotantes soit 72,67 lignes pour chaque bande. Les lignes n'étant pas fractionnables, les 3 bandes ne pourront pas toutes être d'une même épaisseur :
- la 1ère bande : 73 lignes,
- la 2ème : 72 lignes,
- et la 3ème : 73 lignes.
Soit un total de 218 lignes, le compte est bon.
Le palier de suppression arrière comporte, quelque soit la fréquence ligne, un bon nombre de µCycles inactifs dont les premiers vont pouvoir être réaffectés au test sur le numéro de ligne courant. De ce test va être déterminé le type de ligne à afficher et par conséquent la portion de code adéquate à exécuter .
;********************** Affichage de la mire clignotante noir/blanc (fréquence 15 kHz) *********************
| | | | | |
Twinkle15k | | EQU | | $ |
|
LastStripeLine | | SET | | 224 | | ; Une seule ligne blanche pour le cadre |
|
Stripes15k | | SET | | $ | | ; 4 µCycles déjà absorbés sur les 323 du back porch |
:Stripe1 | | CheckCount | | LastStripeLine | | ; +6 µC pour la macro |
| | jnc | | Stripes15k:Stripe2 | | ; +2/4 µC |
| | Wait | | 323-15 | | ; Ici 12 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:FrameLine | | ; +3 µC, le trait est entièrement blanc |
|
LastStripeLine | | SET | | LastStripeLine-2 | | ; Marge en dessous du cadre : 2 lignes/pixels |
|
Stripes15k | | SET | | $ | | ; Ici 14 µC d'absorbés |
:Stripe2 | | CheckCount | | LastStripeLine | | ; +6 µC pour la macro |
| | jnc | | Stripes15k:Stripe3 | | ; +2/4 µC |
| | Wait | | 323-25 | | ; Ici 22 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:BlackLine | | ; +3 µC, la marge supérieure est noire |
|
LastStripeLine | | SET | | LastStripeLine-73 | | ; 1ère bande : 73 lignes/pixels |
|
Stripes15k | | SET | | $ | | ; Ici 24 µC d'absorbés |
:Stripe3 | | CheckCount | | LastStripeLine | | ; +6 µC pour la macro |
| | jnc | | Stripes15k:Stripe4 | | ; +2/4 µC |
| | jb | | FlipFlop.0,Stripes15k:Toggle3 | | ; +2/4 µC |
| | Wait | | 323-37 | | ; Ici 34 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:WhiteLine | | ; +3 µC, la 1ère bande est blanche |
Stripes15k | | SET | | $ |
:Toggle3 | | Wait | | 323-39 | | ; Ici 36 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:BlackLine | | ; +3 µC, la 1ère bande est noire |
|
LastStripeLine | | SET | | LastStripeLine-72 | | ; 2ème bande : 72 lignes/pixels |
|
Stripes15k | | SET | | $ | | ; Ici 34 µC d'absorbés |
:Stripe4 | | CheckCount | | LastStripeLine | | ; +6 µC pour la macro |
| | jnc | | Stripes15k:Stripe5 | | ; +2/4 µC |
| | jnb | | FlipFlop.0,Stripes15k:Toggle4 | | ; +2/4 µC |
| | Wait | | 323-47 | | ; Ici 44 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:WhiteLine | | ; +3 µC, la 2ème bande est blanche |
Stripes15k | | SET | | $ |
:Toggle4 | | Wait | | 323-49 | | ; Ici 46 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:BlackLine | | ; +3 µC, la 2ème bande est noire |
|
LastStripeLine | | SET | | LastStripeLine-73 | | ; 3ème et dernière bande : 73 lignes/pixels |
|
Stripes15k | | SET | | $ | | ; Ici 44 µC d'absorbés |
:Stripe5 | | CheckCount | | LastStripeLine | | ; +6 µC pour la macro |
| | jnc | | Stripes15k:Stripe6 | | ; +2/4 µC |
| | jb | | FlipFlop.0,Stripes15k:Toggle5 | | ; +2/4 µC |
| | Wait | | 323-57 | | ; Ici 54 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:WhiteLine | | ; +3 µC, la 3ème bande est blanche |
Stripes15k | | SET | | $ |
:Toggle5 | | Wait | | 323-59 | | ; Ici 56 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:BlackLine | | ; +3 µC, la 3ème bande est noire |
|
LastStripeLine | | SET | | LastStripeLine-2 | | ; Marge au dessus du cadre : 2 lignes/pixels |
|
Stripes15k | | SET | | $ | | ; Ici 54 µC d'absorbés |
:Stripe6 | | CheckCount | | LastStripeLine | | ; +6 µC pour la macro |
| | jnc | | Stripes15k:Stripe7 | | ; +2/4 µC, trait inférieur du cadre |
| | Wait | | 323-65 | | ; Ici 62 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:BlackLine | | ; +3 µC, la marge inférieure est noire |
|
Stripes15k | | SET | | $ | | ; Reste une ligne pour le cadre |
:Stripe7 | | Wait | | 323-64 | | ; Ici 64 µC d'absorbés |
|
;***********************************************************************************************************
On peut considérer le code ci-dessus composé de 7 blocs distincts, autant que d'éléments horizontaux (
traits de cadre, marges et bandes clignotantes ) à afficher.
A l'intérieur de chaque bloc :
- Le numéro de la ligne courante est comparé à la dernière ligne d'un élément horizontal de la mire. Si non concordance, elle est comparée à celle de l'élément suivant.
- S'il y a concordance :
- Avec un trait de cadre : une ligne complètement blanche doit être affichée.
- Avec une marge horizontale : une ligne noire doit être affichée
- Avec une bande clignotante : le choix de la couleur de la ligne à afficher est déterminé par le compteur de clignotement (variable FlipFlop).
Ce choix est inverse pour la bande centrale sinon un seul pavé clignotant serait affiché et on obtiendrait alors la mire de gauche présentée en début du message.
- Les comparaisons successives absorbant un nombre de µCycles proportionnel au nombre de celles effectuées, un délai approprié à chacune est appelé pour compléter le palier de suppression arrière.
- Le code correspondant au type de ligne à afficher est enfin exécuté.
Le principe est le même pour les fréquences 24 et 31 kHz à condition de prendre en compte un palier de suppression arrière plus court (
respectivement 222 et 161 µCycles au lieu de 323 ) ainsi qu'un nombre de lignes accru attribué à chaque élément horizontal de la mire.