Gamoover

Si vous êtes nouveau, n'hésitez pas à vous présenter ici et à poser toutes vos questions, meme si elles vous paraissent ridicules... Gamoover regroupe une communauté de passionnés prêts à vous aider ! Bienvenue à vous ;)

Etude/Réalisation d'un générateur de mires 15/24/31 kHz

Démarré par gc339, Dimanche 27 Janvier 2013, 15:34:59 PM

gc339

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





Fred G5

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" - Bally "Black Pyramid"
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: 53 PCB Jamma, 7 cartouches MVS, slot Neo-Geo MV-1T, MV-2F, MV-4F, MV-6F
Console: Nintendo SNES 2CHIP, SNES 1CHIP-02 + 43 jeux

gc339

#66
Citation de: Fred G5 le Lundi 21 Septembre 2015, 16:57:31 PMDommage 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.
Le repos, c'est fait pour les jeunes. Ils ont toute la vie devant eux. J. Gabin/M. Audiard





Fred G5

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" - Bally "Black Pyramid"
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: 53 PCB Jamma, 7 cartouches MVS, slot Neo-Geo MV-1T, MV-2F, MV-4F, MV-6F
Console: Nintendo SNES 2CHIP, SNES 1CHIP-02 + 43 jeux

gc339

#68
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.

Citation de: gc339 le Vendredi 07 Juin 2013, 15:53:36 PMRappel 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 :

Citation de: gc339 le Mardi 15 Septembre 2015, 00:15:11 AM
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.

Citation


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 :

Citation de: gc339 le Lundi 21 Septembre 2015, 16:04:32 PM
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.

Citation de: gc339 le Lundi 21 Septembre 2015, 16:04:32 PM
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.

Citation de: gc339 le Lundi 21 Septembre 2015, 16:04:32 PM




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|

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





gc339

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

Citation





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

Citation





;###################################################################################################
;                        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.

Citation





;###################################################################################################
;                        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.

Citation





;###################################################################################################
;                        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|


Citation





;****************************** 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 :

Citation





;-----------------------------------------------------------------------------------------------------------------------------------


                        ; 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...
Le repos, c'est fait pour les jeunes. Ils ont toute la vie devant eux. J. Gabin/M. Audiard





nc333

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

gc339

#71


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|


Citation





;***********************************************************************************************************************************


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

Citation





;***********************************************************************************************************************************

                              
; 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
Le repos, c'est fait pour les jeunes. Ils ont toute la vie devant eux. J. Gabin/M. Audiard





oOSphaXOo

Tout bonnement impression, code clair et carré, je suis admiratif !
Super boulot !

funkycochise


gc339

#74
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...
Le repos, c'est fait pour les jeunes. Ils ont toute la vie devant eux. J. Gabin/M. Audiard





Fred G5

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" - Bally "Black Pyramid"
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: 53 PCB Jamma, 7 cartouches MVS, slot Neo-Geo MV-1T, MV-2F, MV-4F, MV-6F
Console: Nintendo SNES 2CHIP, SNES 1CHIP-02 + 43 jeux

maldoror68


gc339

#77
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.
Le repos, c'est fait pour les jeunes. Ils ont toute la vie devant eux. J. Gabin/M. Audiard





Stek

Citation de: gc339 le Jeudi 18 Août 2016, 13:42:28 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:

SDF

Salut, je trouve tout ca fascinant, j'ai besoin d'un appareil comme celui ci, mais je serai incapable de tout mettre en oeuvre, la seule chose que je suis en mesure de faire c'est souder les composants.
Quelqu'un pourrait me « macher le travail », je suis pret a rémunérer bien entendu.