Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Rétro Poke
19 juin 2019

Un symbole symbolique !

Coucou les coco,
Souvent j'utilise le MODE 2 pour ajouter de l'aide ou pour expliquer le fonctionnement des RSX que je programme. Seulement le MODE 2 n'est pas adapté pour agrémenter le texte de fioriture ou de jolie majuscule.
Alors j'ai pensé à créer un RSX qui permettrait d'afficher un symbole directement sur l'écran et qui fonctionnerait un peu comme pour les paramètres de la commande 'SYMBOL' mais avec des valeurs sur 16Bits (16 Pixels).
Ce RSX fait 90 Octets TTC, de quoi l'incorporer facilement dans vos programmes.
symbole


Voici le listing et quelques explications sur la fabrication du RSX et la gestion des paramètres transmis par le RSX.

IMPLANTATION DU RSX: ; Programmation> Philippe Moulin Le 19/06/2019
ORG #A000                                    ; RSX 'SYMBOLE' POUR LE 'MODE 2' DE L'AMSTRAD SEULEMENT
FIXER_LE_RSX
       LD A, #C9                             ; Des le premier appel, on inscrit un 'RET' en debut
       LD (FIXER_LE_RSX), A                  ; Pour eviter de rappeler la routine qui fixe le RSX
       LD BC, AdrNomRSX                      ; 'BC' pointe sur l'adresse des noms des RSX
       LD HL, BuffetRSX                      ; 'HL' pointe sur un buffet de 4 octets reserve par la routine
       JP #BCD1                              ; Fabuleuse routine qui fixe les RSX

AdrNomRSX DW NOMduRSX                        ; 2 octets qui stocks l'adresse des noms
       JP RSXSYMBOLE                         ; Suivis du saut en direction de la routine 'SYMBOLE'
BuffetRSX DS 4                               ; Zone de 4 Octets reserves par le vecteur RSX #BCD1
NOMduRSX                                     ; Adresse des noms des RSX
       STR "SYMBOLE"                         ; Nom du RSX qui servira pour les appeles depuis le BASIC

Le programme démarre à partir de #A000, mais vous pouvez choisir n'importe quel point de départ.
Au premier appel par un 'CALL &A000', la routine inscrira la valeur '#C9' à l'emplacement #A000 pour ne pas exécuter 2 fois le programme. '#C9' est l'équivalent du code 'RET'.
Le registre 'BC' pointe sur l'adresse ou est situé le nom du RSX et le registre 'HL' pointe sur 4 octets réservés par le vecteur #BCD1 qui fixe les RSX.
Il ne reste plus qu'à appeler le vecteur et le RSX sera utilisable.

ROUTINE SYMBOLE: ; EXEMPLE >>> |SYMBOLE, Col, Lig, OctetGetD-01, OctetGetD-02, OctetGetD-03, Etc etc...

RSXSYMBOLE                                  ; ########## Debut de la routine 
       CP A, 3                              ; Il faut 3 parametre au minimum
       RET C                                ; Sinon il n'y a rien a afficher
       SUB A, 3                             ; On va remonter les parametres jusqu'a ce que 'IX' pointes
       LD C, A                              ; Sur le parametre 'OctetGetD-01'
       SLA C                                ; 'IX' contient deux octets pour chaque parametre
       LD B, 0                              ; 'BC'=(Nombre de parametre - 3) * 2
       ADD IX, BC                           ; 'IX' pointe sur le parametre 'OctetGetD-01'
       INC A                                ; 'A' contient le nombre de parametre - 2 (Col, Lig)
   PUSH AF                                  ; Que l'on sauvegarde pour l'utiliser en boucle
       LD H, (IX + 3)
       LD L, (IX + 2)                       ; 'HL'=Ligne de 0 a 399
       SRL H                                ; 'HL' Doit etre adapte pour le vecteur
       RR L                                 ; Et doit etre divise par deux car il n'y a que 200 lignes reellement
       LD D, (IX + 5)
       LD E, (IX + 4)                       ; 'DE'=Colonne de 0 a 639
       CALL #BC1D                           ; Vecteur systeme ('HL'=Adresse d'ecran)
   POP BC                                   ; 'HL'=positionEcran 'IX'=OctetGetD-01 'B'=NbParametre

RSXSYMBOLE_NbParametre                      ; Debut de la boucle
       LD A, (IX + 1)                       ; 'A' contient l'octet a afficher a gauche
       LD (HL), A
       INC HL                               ; On passe a l'octet sur la droite
       LD A, (IX + 0)                       ; 'A' contient l'octet a afficher a droite 
       LD (HL), A
       DEC IX                               ; On passe au parametre suivant
       DEC IX                               ; 2 octets par parametre
       LD DE, #800-1                        ; Il faut aussi descendre d'une ligne de l'ecran
       ADD HL, DE                           ; La formule est (HL=HL+#800-nb octets)
       JR NC, RSXSYMBOLE_LigneDeDessous     ; Mais il faut reajuster si on sort de l'ecran
       LD DE,#C000+80                       ; Pour ne pas ecraser les donnees et ne pas faire planter
       ADD HL, DE                           ; l'Amstrad CPC... 

RSXSYMBOLE_LigneDeDessous
       DJNZ, RSXSYMBOLE_NbParametre          ; Et on fait autant de ligne qu'il y a de parametre
       RET

La routine est très simple, puisque qu'elle effectue plusieurs fois la même action.
Il faut au minimum 3 paramètres ( les Colonnes, les Lignes et la valeur de 2 octets qui doit être affichée).

Au départ, il faut positionner 'HL' sur l'emplacement qui correspond sur l'écran.
Le vecteur #BC1D, sera utilisé pour ça, mais il faut remonter les paramètres pour pouvoir lire la valeur des deux coordonnées (Colonne et Ligne).

On va remonter au paramètre qui est situé à droite du paramètre (Ligne), donc on enlève 3 au nombres de paramètres transmis dans 'A' .

Chaque paramètre contient 2 octets, l'octets du poids faible et l'octet du poids fort, il faut donc multiplier par deux le nombre.

Le code 'SLA C' multiplie le registre 'C' par deux en effectuant un déplacement vers la gauche. 
Puis le registre 'BC' contient le nombre qu'il faut additionner au registre 'IX' pour que celui ci pointe sur le bon paramètre.
Voici un petit résumé des actions que l'on a effectué:

nb parametre
On peut maintenant charger les coordonnées dans les registres 'DE' pour les colonnes et dans 'HL' pour les lignes et même si le nombre de paramètres est différent.


Le vecteur #BC1D qui calcul l'adresse de l'écran, travaille avec 200 lignes et non pas 400, mais pour garder la facilité des coordonnées graphiques de l'Amstrad, j'ai opté pour les 400 lignes que l'on divisera par deux avant l'appel du vecteur.

Le code 'SRL H' décale tous les bits du registre 'H' vers la droite, et place le bit '1' dans le 'CARRY'
Puis le code RR L décale aussi tous les bits vers la droite et place le 'CARRY' dans le 8ème bit, se qui revient à diviser par deux le registre 'HL' 

Une fois que le registre 'IX' pointe sur la première valeur à inscrire et que le registre 'HL' pointe sur l'écran, il suffit de passer en revue, tous les paramètres restant, en prenant le soin de descendre d'une ligne entre chaque paramètre et de recommencer.
Voila le programme fait 90 octets une fois assemblé et on dispose d'un RSX pour embellir le MODE obscure de l'Amstrad!
J'ai aussi mis sur la disquette un éditeur de symbole, il est très limité mais suffisant pour commencer

editeur symbole


 Si vous avez des astuces, questions, conseils... Je suis là !
A plus

Télé-chargement du  ZIP (Disquette et ASM): Symbole.ZIP

Publicité
Publicité
Commentaires
Favoris

cheshirecats logo

amsnews logo

amsnews logo

amstradeu logo

cpcpower logo

crazi

acme logo

amstradfunlogo

amstradfunlogo

amstradMuseum

amstrad

 

 

 

me contacter

votre banniere ici

 


Publicité
Rétro Poke
Derniers commentaires
Archives
Visiteurs
Depuis la création 16 065
Publicité