CARACTÈRES PERSONNALISÉS
LISTE DES MOTS CLÉS SPÉCIFIQUES.
Mots clés du BBC BASIC.
PRINT : affiche une liste d'impression dans la fenêtre de sortie.
VDU : configure certains paramètres de la fenêtre de sortie et/ou de ses composants.
Modules de la bibliothèque du BBC BASIC.
mode7lib.bbc : propose des procédures pour utiliser des jeux de caractères alternatifs dans le MODE 7.
script.bbc : propose des procédures permettant de prendre en charges certains alphabets non latin.
GÉNÉRALITÉS.
La forme de la commande VDU 23 , code , o1 , o2 , o3 , o4 , o5 , o6 , o7 , o8 permet de créer ses propres caractères en modifiant la matrice des caractères ASCII ayant un code compris entre 32 et 255.
- code est le code ASCII du caractère dont on va modifier l'aspect.
- o1 est la nouvelle valeur du premier octet, le plus haut, de la matrice du caractère modifié ;
- o2 est la nouvelle valeur du deuxième octet de la matrice du caractère modifié ;
- o3 est la nouvelle valeur du troisième octet de la matrice du caractère modifié ;
- o4 est la nouvelle valeur du quatrième octet de la matrice du caractère modifié ;
- o5 est la nouvelle valeur du cinquième octet de la matrice du caractère modifié ;
- o6 est la nouvelle valeur du sixième octet de la matrice du caractère modifié ;
- o7 est la nouvelle valeur du septième octet de la matrice du caractère modifié ;
- o8 est la nouvelle valeur du huitième octet, le plus bas, de la matrice du caractère modifié.
code doit être un nombre entier compris entre 32 et 255, à l'exception de la valeur 127. Cette valeur indique quel caractère ASCII sera modifié par la commande VDU 23 , code.
o1, o2, o3, o4, o5, o6, o7 et o8 doivent être des nombres entiers compris entre 0 et 255.
Les caractères ASCII sont représentés dans une matrice de 8x8 pixels, c'est-à-dire 8 lignes ayant chacune 8 cases. La valeur de chaque ligne correspond donc 1 octet et ses 8 cases, pixels, correspondent aux bits de 0, bit le plus à droite, à 7, le bit le plus à gauche.
Après avoir réalisé le nouvel aspect du caractère que l'on souhaite modifier, soit sur du papier quadrillé ou à l'aide du logiciel de dessin, on pourra calculer le poids, la valeur, de chaqu'un des 8 octets. Si un bit doit être affiché dans la couleur de premier-plan, en lui affectera la valeur TRUE, soit 1, s'il doit resté dans la couleur d'arrière-plan, on lui affectera la valeur FALSE, soit 0. Par exemple, pour OCTET 6 de la figure ci-dessous : 01011010
On convertira ensuite la valeur binaire de l'octet en valeur décimal, ou on additionnera le poids des bit de la couleur d'avant-plan. Par exemple, pour OCTET 6 de la figure ci-dessous : 0 + 64 + 0 + 16 + 8 + 0 + 2 + 0 = 90
Après avoir obtenu le poids des 8 octets du caractère personnalisé, il suffira de les indiquer dans la commande VDU 23 , code , suivi des 8 valeurs calculées. Par exemple, pour modifier l'aspect de la lettre A, ayant pour code ASCII la valeur 65, on notera dans le script du programme : VDU 23 , 65 , 0 , 24 , 24 , 60 , 24 , 90 , 126 , 90.
MODE 2
VDU 23 , 65 , 0 , 24 , 24 , 60 , 24 , 90 , 126 , 90
PRINT TAB( 10 , 15 ) ; "A"
En général, on modifiera des caractères dont le code ASCII est compris entre 128 et 255, et on évitera le plus possible de remplacer les principaux symboles du standard ASCII, tel que les lettres, les chiffres, signes mathématiques et la ponctuation par des caractères personnalisés, sauf si on pour leur donner un nouveau design. On utilisera alors l'instruction CHR$( code ) pour afficher un caractère personnalisé.
Par convention, on indiquera les valeur des 8 octets en hexadécimal, et
MODE 2
VDU 23 , 128 , &00 , &18 , &18 , &3C , &18 , &5A , &7E , &5A
PRINT TAB( 10 , 15 ) ; CHR$( 128 )
REMARQUES.
Si la fenêtre de sortie est réinitialisée, avec une instruction MODE, une commande VDU 23 , 22 ou une commande VDU 22, toutes les définitions des caractères personnalisés sont perdues. elles devront être recommencées, si elles sont toujours nécessaire à la poursuite du programme. Dans ce cas, il sera pratique de regrouper les définitions des caractères personnalisés dans une procédure qui pourra être exécutée à chaque réinitialisation.
REM --- Initialisation generale ---
MODE 6
kabscisse = 10
kordonnee = 15
kobjet = 128
PROC_Portail
REM --- BOUCLE PRINCIPALE ---
REPEAT
kchoix$ = GET$
PRINT TAB( kabscisse , kordonnee ) ; " "
CASE ASC( kchoix$ ) OF
WHEN 137 : kabscisse += 1 : kobjet = 130 :
WHEN 136 : kabscisse -= 1 : kobjet = 129
WHEN 139 : kordonnee -= 1 : kobjet = 128
WHEN 138 : kordonnee += 1 : kobjet = 131
WHEN 77 , 109 : PROC_Portail
WHEN 81 , 113 : EXIT REPEAT
ENDCASE
IF kabscisse < 0 THEN kabscisse = kcolonnes
IF kabscisse > kcolonnes THEN kabscisse = 0
IF kordonnee > klignes THEN kordonnee = 0
IF kordonnee < 0 THEN kordonnee = klignes
PRINT TAB( kabscisse , kordonnee ) ; CHR$( kobjet )
UNTIL FALSE
PRINT "Mission d'entrainement terminee."
VDU 23 , 1 , 1 ; 0 ; 0 ; 0 ;
END
REM --- Changement de MODE pour la fenetre de sortie ---
DEF PROC_Portail
IF MODE <> 8 THEN
MODE 8
kcolonnes = 79
klignes = 30
ELSE
MODE 6
kcolonnes = 39
klignes = 23
ENDIF
VDU 23 , 1 , 0 ; 0 ; 0 ; 0 ;
PRINT "Appuyez surs les fleches pour vous deplacer"
PRINT "M pour changer de monde ou Q pour Quitter"
PROC_Caracteres
PRINT TAB( kabscisse , kordonnee ) ; CHR$( kobjet )
ENDPROC
REM --- Definitions des caracteres personnalises ---
DEF PROC_Caracteres
VDU 23 , 128 , &00 , &18 , &18 , &3C , &18 , &5A , &7E , &5A
VDU 23 , 129 , &00 , &07 , &12 , &7F , &7F , &12 , &07 , &00
VDU 23 , 130 , &00 , &E0 , &48 , &FE , &FE , &48 , &E0 , &00
VDU 23 , 131 , &00 , &5A , &7E , &5A , &18 , &3C , &18 , &18
ENDPROC
CONNAITRE LE MOTIF D'UN CARACTÈRE ASCII.
Il peut être interressant de connaitre comment sont composée les matrices formant les motifs des caractères ASCII disponibles dans le BBC BASIC for SDL 2.0.
L'appel de la fonction SYS @fn%( 19 ) TO kfonte%% retournera la première l'adresse du bloc mémoire où se trouve la police de caractères, et placera cette valeur dans la variable kfonte%%. kfonte%% correspond donc à l'adresse mémoire du premier octet du motif du caractère ayant le code ASCII 0.
Pour connaitre les valeurs des 8 octets constituant le motif d'un caractère ASCII quelconque, il faudra donc calculer, et mémoriser, l'adresse du premier octet de son motif en ajoutant 8 fois la valeur de son code ASCII. Par exemple, l'adresse mémoire du premier octet du motif de la lettre A majuscule, ayant le code ASCII 65, se trouve donc à l'adresse mémoire kmotif%% = kfonte%% + ( 8 * 65 ) ou kfonte%% + ( 8 * ASC ( "A" ) ) si on ne connait pas le code ASCII de la lettre A.
L'opérateur ?, retourne la valeur de l'octet présent à une certaine adresse mémoire. La forme adresse?d retourne la valeur de l'adresse mémoire adresse + d. Par exemple :
- 1224?0 retourne la valeur de l'octet à l'adresse mémoire 1234 ;
- 1224?1 retourne la valeur de l'octet à l'adresse mémoire 1235, c'est-à-dire 1234 + 1 ;
- 1224?2 retourne la valeur de l'octet à l'adresse mémoire 1236, c'est-à-dire 1234 + 2 ;
- 1224?3 retourne la valeur de l'octet à l'adresse mémoire 1237, c'est-à-dire 1234 + 3 ;
- ... ;
- 1224?n retourne la valeur de l'octet à l'adresse mémoire 1234 + n.
Attention à ne pas confondre l'identification d'une l'adresse, affecté dans ( kmotif%% ou kfonte%% ), avec la valeur qu'elle contient, retournée par adresse?d ( kvaleur = kmotif%%?n ).
MODE 8
SYS @fn%( 19 ) TO kfonte%% : REM - retourne l"adresse memoire du 1er octet du motif du 1er code ASCII
REPEAT
CLS
PRINT "Adresse du premier octet du motif du code ASCII 0 : " ; kfonte%%
INPUT "Quelle lettre " , klettre$
klettre = ASC( klettre$ ) : REM - retourne le code ASCII du symbole saisi
kmotif%% = kfonte%% + ( 8 * klettre ) : REM - retourne l"adresse du 1er octet du motif du symbole saisi
PRINT "Adresse du premier octet du motif du symbole " ; klettre$ ; " : " ; kmotif%%
FOR kligne = 0 TO 7
CASE kligne OF
WHEN 0 : kvaleur = kmotif%%?0 : REM - retourne la valeur du 1er octet du motif
WHEN 1 : kvaleur = kmotif%%?1 : REM - retourne la valeur du 2è octet du motif
WHEN 2 : kvaleur = kmotif%%?2 : REM - retourne la valeur du 3è octet du motif
WHEN 3 : kvaleur = kmotif%%?3 : REM - retourne la valeur du 4è octet du motif
WHEN 4 : kvaleur = kmotif%%?4 : REM - retourne la valeur du 5è octet du motif
WHEN 5 : kvaleur = kmotif%%?5 : REM - retourne la valeur du 6è octet du motif
WHEN 6 : kvaleur = kmotif%%?6 : REM - retourne la valeur du 7è octet du motif
WHEN 7 : kvaleur = kmotif%%?7 : REM - retourne la valeur du 8è octet du motif
ENDCASE
COLOUR 15 : COLOUR 128 : PRINT kvaleur ; " " ; : REM - affiche la valeur de l'octet
koctet$ = ""
WHILE kvaleur > 0 : REM - pour donner une representation de l'octet
kbit = kvaleur MOD 2
IF kbit = 0 THEN kbit$ = " " ELSE kbit$ = CHR$( 129 )
koctet$ = kbit$ + koctet$
kvaleur = kvaleur DIV 2
ENDWHILE
IF LEN( koctet$ ) < 8 THEN koctet$ = RIGHT$( STRING$( 8 , " " ) + koctet$ , 8 )
COLOUR 0 : COLOUR 143 : PRINT koctet$ : REM - affiche une representation de l'octet
NEXT kligne
COLOUR 15 : COLOUR 128 : PRINT "Une autre lettre ( O ou N) ?"
kchoix$ = GET$
UNTIL kchoix$ = "N" OR kchoix$ = "n"
PRINT "Presentation terminee. Au revoir"
END
RUBRIQUES.
Voir l'instruction MODE pour plus de détails sur les types de fenêtres disponibles.
Voir la star commande *FONT pour plus de détails sur les types de fenêtres disponibles.
Voir l'affichage des textes pour plus de détails sur la gestion de l'affichage des caractères.
Voir la gestion des couleurs pour plus de détails sur l'utilisation des couleurs.
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de
Dans la RETROGICIEL vous trouvez des suggestions simples et classiques pour
TESTER - DÉCOUVRIR - PRATIQUER - APPROFONDIR - EXPLORER
avec un exemple de résolution à télécharger pour vous inspirer.