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).
;=================================================================================================== ; ; File...... PatGen10.SRC ; Purpose... Video Pattern Generator V10.0 ; Updated... 16/10/2015 ; ;=================================================================================================== ;------------------------------ DEVICE DIRECTIVES ----------------------------------------------------------------------------------
| | ;SASM Directives | | DEVICE | SX48BD, BOROFF, SYNC | | DEVICE | OSCHS3, XTLBUFD, IFBD | | IRC_CAL | IRC_SLOW |
| | ID | "PatGen10" |
| | RESET | Initialize | ; Reset vector at $07FF | | | |
;------------------------------ SETTINGS -------------------------------------------------------------------------------------
| | FREQ | 50_000_000 | ; Information pour la SX-Key |
| | LIST | F=INHX8M | ; Format de sortie | | | |
;------------------------------ EQUATES --------------------------------------------------------------------------------------------
| No | EQU | 0 | Yes | EQU | ~No |
| Padding | | | ; Bourrage par des nop's autorisé |
| SyncH | EQU | rb.0 | ; Synchro Horizontale sur RB0 | SyncV | EQU | rb.1 | ; Synchro Verticale sur RB1 |
| Black | EQU | %0000 | Blue | EQU | %0001 | ; Bit 2° | Red | EQU | %0010 | ; Bit 2¹ | Green | EQU | %0100 | ; Bit 2² | Cyan | EQU | Green + Blue | Magenta | EQU | Red + Blue | Yellow | EQU | Red + Green | White | EQU | Red + Green + Blue |
| Aqua | EQU | Cyan | Fuchsia | EQU | Magenta | | | |
| ; MODE Register Settings to write to the SX48/52 port control registers |
DDIR | EQU | $1F | ; Data Direction Register | PLP | EQU | $1E | ; Pull-Up Resistor Enable Register | LVL | EQU | $1D | ; TTL/CMOS Select Register | ST | EQU | $1C | ; Schmitt Trigger Enable Register | | | |
;------------------------------ VARIABLES ------------------------------------------------------------------------------------------
| | ORG | 10 | ; Start of SX48/52 data memory |
| LoopCounter | DS | 1 | ; Step Counter | LineCounter | DS | 2 | ; Line Conter | FrameCounter | DS | 1 | ; Frame Counter | FlipFlop | DS | 1 | ; 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).
;################################################################################################### ; Section commune à toutes les mires ;################################################################################################### ;------------------------------ SIGNALS TIMING CHART -------------------------------------------------------------------------------
| ; | Line | Front | Horiz. | Back | Display | ; | Frequ. | Porch | Synch. | Porch | ; | (kHz) | (µcycles) | (µcycles) | (µcycles) | (µcycles) | ; | 15 | 161 | 238 | 323 | 2456 | ; | 24 | 142 | 150 | 222 | 1536 | | ; | 31 | 81 | 152 | 161 | 1184 |
| ; | Line | Leading | Vert. | Trailing | Displayed | ; | Frequ. | Blank | Synch. | Blank | Lines | ; | (kHz) | (lines) | (lines) | (lines) | ; | 15 | 13 | 3 | 23 | 224 | ; | 24 | 11 | 4 | 25 | 384 | ; | 31 | 14 | 3 | 33 | 480 | | | | | | |
;------------------------------ INTERRUPT ROUTINE ---------------------------------------------------------------------------------- ;-----------------------------------------------------------------------------------------------------------------------------------
| | NOEXPAND | | Fill | $0007 | ; Bourrage zone réservée avec des NOP's | | EXPAND | | | |
;---------------------------- INITIALIZATION ROUTINE -------------------------------------------------------------------------------
| | ORG | 8 | Initialize | mov | ra,#%0000 | ; Set port A low | | mov | rb,#%11111111 | ; Set port B high | | mov | rc,#%11111111 | ; Set port C high | | mov | rd,#%11111111 | ; Set port D high | | mov | re,#%11111111 | ; Set port E high | | | |
| ; Pull-Up Resistor Configuration |
| mov | w,#PLP | ; Allow Pull-Up Resistor configuration | | mov | m,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 |
| mov | w,#DDIR | ; Allow Direction configuration | | mov | m,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 ---------------------------------------------------------------------------------------
| 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 | | | |
| ; Lecture de la fréquence ligne sur les 2 premiers microswitches. | | ; Absorbe 11 µcycles quelque soit la boucle à exécuter. |
| jnb | rb.5,Jmp31k | ; 2/4 µC, lecture de la fréquence programmée sur les dip-switches | | jnb | rb.4,Jmp24k | ; 2/4 µC | Jmp15k | jmp | $+1 | ; 3 µC pour ajustage absorpsion à 11 µC | | jmp | @Start15k | ; 1+3 µC, instruction de page incluse avec "@" | Jmp24k | nop | | ; 1 µC pour ajustage absorpsion à 11 µC | | | jmp | @Start24k | ; 1+3 µC, instruction de page incluse avec "@" | Jmp31k | jmp | $+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.
;################################################################################################### ; Sous-section pour l'affichage CGA : mire en 15 kHz;###################################################################################################
| | ; Timings ligne (en µcycles du SX48) |
FP15k | EQU | 161 | ; Front Porch | HSync15k | EQU | 238 | ; Horizontal Synchronisation | BP15k | EQU | 323 | ; Back Porch | HDisp15k | EQU | 2456 | ; Duration of the visible pixels inside any line | | | |
| ; Timings trame (en nombre de lignes) |
LBI15k | EQU | 13 | ; Leading Blank Interval | VSync15k | EQU | 3 | ; Vertical Synchronisation | TBI15k | EQU | 23 | ; Trailing Blank Interval | VDisp15k | EQU | 224 | ; Visible Lines Per Frame | | | |
;-----------------------------------------------------------------------------------------------------------------------------------
| ColorBars15k | EQU | $ | | ColorBars | HDisp15k/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) |
FP24k | EQU | 142 | ; Front Porch | HSync24k | EQU | 150 | ; Horizontal Synchronisation | BP24k | EQU | 222 | ; Back Porch | HDisp24k | EQU | 1536 | ; Duration of the visible pixels inside any line | | | |
| ; Timings Trame (en nombre de lignes) |
| LBI24k | EQU | 11 | ; Leading Blank Interval | VSync24k | EQU | 4 | ; Vertical Synchronisation | TBI24k | EQU | 25 | ; Trailing Blank Interval | VDisp24k | EQU | 384 | ; Visible Lines Per Frame | | | |
;-----------------------------------------------------------------------------------------------------------------------------------
| ColorBars24k | EQU | $ | | ColorBars | HDisp24k/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) |
FP31k | EQU | 81 | ; Front Porch | HSync31k | EQU | 152 | ; Horizontal Synchronisation | BP31k | EQU | 161 | ; Back Porch | HDisp31k | EQU | 1184 | ; Duration of the visible pixels inside any line | | | |
| ; Timings Trame (en nombre de lignes) |
LBI31k | EQU | 14 | ; Leading Blank Interval | VSync31k | EQU | 3 | ; Vertical Synchronisation | TBI31k | EQU | 33 | ; Trailing Blank Interval | VDisp31k | EQU | 480 | ; Visible Lines Per Frame | | | |
;-----------------------------------------------------------------------------------------------------------------------------------
| ColorBars31k | EQU | $ | | ColorBars | HDisp31k/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.
;################################################################################################### ; Section principale pour l'affichage CGA : mires en 15 kHz ;###################################################################################################
| | ; Pages 1 et 2 allouées aux mires CGA en 15 kHz ($0200 ... $05FF) |
;****************************** Impulsion de synchronisation trame *****************************************************************
| SyncVer15k | SET | $ | :SetUp | PresetCount | VSync15k | ; Nombre de lignes allouées à l'impulsion de synchronisation verticale | | jmp | SyncVer15k:Loop | ; 7 µcycles d'absorbés par le rechargement du compteur de lignes | | | |
| ; Impulsion de synchronisation horizontale |
SyncVer15k | SET | $ | :Loop | mov | w,rb | ; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG | | clrb | wreg.0 | ; 1 µC, positionnement du bit affecté à la synchronisation horizontale | | clrb | wreg.1 | ; 1 µC, positionnement du bit affecté à la synchronisation verticale | | mov | rb,w | ; 1 µC, émission de cette nouvel état | | Wait | HSync15k | ; Durée de l'impulsion ligne | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | $+1 | ; Absorption de 3 µcycles | | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | BP15k | ; 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 |
| SetColor | Black,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) |
| NextLine | SyncVer15k,Trailing15k | ; Décomptage lignes et test si zéro | | | |
;****************************** Champ à la suite de l'impulsion de synchronisation trame (blanking arrière) ************************
| Trailing15k | SET | $ | :SetUp | PresetCount | TBI15k | ; Nombre de lignes allouées au blanking arrière | | jmp | Trailing15k:Loop | ; 7 µcycles d'absorbés par le rechargement du compteur de lignes | | | |
| ; Impulsion de synchronisation horizontale |
Trailing15k | SET | $ | :Loop | mov | w,rb | ; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG | | clrb | wreg.0 | ; 1 µC, positionnement du bit affecté à la synchronisation horizontale | | setb | wreg.1 | ; 1 µC, effacement du bit affecté à la synchronisation verticale | | mov | rb,w | ; 1 µC, émission de cet nouvel état | | Wait | HSync15k | ; Durée de l'impulsion ligne | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | $+1 | ; Absorption de 3 µcycles | | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | BP15k | ; 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 |
| SetColor | Black,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) |
| NextLine | Trailing15k,Pattern15k | ; Décomptage lignes et test si zéro | | | |
;****************************** Affichage du motif de la mire **********************************************************************
| Pattern15k | SET | $ | :SetUp | PresetCount | VDisp15k | ; Nombre de lignes allouées pour afficher la mire | | jmp | Pattern15k:Loop | ; 7 µcycles d'absorbés par le rechargement du compteur de lignes | | | |
| ; Impulsion de synchronisation horizontale |
Pattern15k | SET | $ | :Loop | jmp | $+1 | ; Absorption de 3 µcycles | | clrb | SyncH | ; Emission de l'impulsion SyncH | | Wait | HSync15k | ; Durée de l'impulsion | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | $+1 | ; Absorption de 3 µcycles | | setb | SyncH | ; 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 |
| jb | rb.7,Pattern15k:NextSwitch | ; +2/4 µC | | jmp | @CrossHatch15k | ; +6 µcycles si dérivation vers mire quadrillée | | | |
Pattern15k | SET | $ | :NextSwitch | jb | rb.6,Pattern15k:BackPorch | ; +2/4 µC | | jmp | @Twinkle15k | ; +10 µcycles si dérivation vers mire clignotante | | | |
| ; Complétion du palier de suppression arrière |
Pattern15k | SET | $ | :BackPorch | Wait | BP15k-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) |
Pattern15k | SET | $ | :FrontPorch | SetColor | Black,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) |
| NextLine | Pattern15k,Leading15k | ; Décomptage lignes et test si zéro | | | |
;****************************** Champ précédant l'impulsion de synchronisation trame (blanking avant) ******************************
| Leading15k | SET | $ | :SetUp | PresetCount | LBI15k | ; Nombre de lignes allouées au blanking avant | | jmp | Leading15k: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 |
Leading15k | SET | $ | :Loop | Delay | 20,0 | ; Délai avec offset nul | | | |
| ; Impulsion de synchronisation horizontale |
Leading15k | SET | $ | :Start | jmp | $+1 | ; Absorption de 3 µcycles | | clrb | SyncH | ; Emission de l'impulsion SyncH | | Wait | HSync15k | ; Durée de l'impulsion | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | $+1 | ; Absorption de 3 µcycles | | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | BP15k | ; 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) |
| SetColor | Black,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) |
| NextLine | Leading15k,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 | d | r e | | | M a | r | g 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 n | t | a n | t | | | | | | I n t e | r | v a l l e | | | | | | N o | r | m a l | | | C e | n | t r a l | | | C a | d | r 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 | | |
|
|
|
;****************************** Descripteurs des différents modèles de lignes **********************
| Blank24k | EQU | $ | ; Pas d'affichage, la ligne est complètement noire | | SetColor | Black,HDisp24k-3 | ; -3 µC pour le jmp suivant | | jmp | Pattern24k:FrontPorch | | | |
Black24k | EQU | $ | ; Marges confondues avec la ligne noire affichée | | SetColor | White,9 | ; Equivaut à 3 pixels blancs | | SetColor | Black,HDisp24k-(2*9 ) | ; Moins 2 × 3 pixels en largeur pour le cadre | | SetColor | White,9-3 | ; Equivaut à 3 pixels blancs, -3 µC pour le jmp suivant | | jmp | Pattern24k:FrontPorch | | | |
Frame24k | EQU | $ | ; Affichage d'une ligne blanche sans marge (cadre) | | SetColor | White,HDisp24k-3 | ; -3 µC pour le jmp suivant | | jmp | Pattern24k:FrontPorch | | | |
White24k | EQU | $ | ; Affichage d'une ligne blanche avec marge | | SetColor | White,9 | ; Egal à 3 pixels blancs pour 384 lignes au format 4/3 | | SetColor | Black,18 | ; Marge gauche, équivaut à 6 pixels noirs | | SetColor | White,HDisp24k-(2*27) | ; Moins 2 × 9 pixels en largeur pour le cadre et les marges | | SetColor | Black,16 | ; Marge droite, équivaut à 6 pixels noirs | | SetColor | White,9-3 | ; Equivaut à 3 pixels blancs, -3 µC pour le jmp suivant | | jmp | Pattern24k:FrontPorch | | | |
;-----------------------------------------------------------------------------------------------------------------------------------
| Points24k | EQU | $ | ; Affichage d'une ligne comportant 11 points blancs | | | |
| ; Moitié gauche de la ligne |
| REPT | 5 | ; 5 ensembles point + intervalle | | IF | %=1 | ; Test sur compteur de répétitions | Length | SET | 18 | ; 6 pixels pour le montant vertical gauche du cadre | | ELSE | Length | SET | 9 | ; 3 pixels pour les autres traits verticaux | | ENDIF | | SetColor | White,Length | ; Point blanc | | SetColor | Black,141 | ; Intervalle noir de 47 pixels | | ENDR | | | |
| ; Moitié droite de la ligne |
| REPT | 5 | ; 5 ensembles point + intervalle | | IF | %=1 | ; Test sur compteur de répétitions | Length | SET | 18 | ; 6 pixels pour le trait vertical central du quadrillage | | ELSE | Length | SET | 9 | ; 3 pixels pour les autres traits verticaux | | ENDIF | | SetColor | White,Length | ; Point blanc | | SetColor | Black,141 | ; Intervalle noir de 47 pixels | | ENDR | | | |
| ; Montant vertical droit du cadre |
Length | SET | 18 | ; 6 pixels pour le montant vertical droit du cadre | | SetColor | Black,Length-3 | ; -3 µC pour le jmp suivant | | jmp | Pattern24k: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 | | LOCAL | FirstChoice | | jnb | rb.6,FirstChoice | ; +2/4 µC, FirstLabel si bit à 0, SecondLabel si bit à 1 | | skip | | ; +2 µcycles pour égaliser les deux branches à 4 µcycles | FirstChoice | jmp | FirstLabel | ; +3 µcycles, 2ème paramètre = FirstLabel
| | jmp | SecondLabel | ; +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 :
;-----------------------------------------------------------------------------------------------------------------------------------
| | ; Affichage d'une des lignes d'un duo en fonction de l'état sur rb.6 |
| DashOrDots24k | EQU | $ | | Select | Points24k,Frame24k | ; Affichage point blanc ou trait horizontal du quadrillage | | | |
DotsOrNix24k | EQU | $ | | Select | Blank24k,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 |
OFF | OFF | Mire à barres colorées |
OFF | ON | Mire à bandes clignotantes |
ON | OFF | Mire à quadrillage |
ON | ON | Mire à points |
A suivre...