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

Assembleur: (Les minis caractères en folie)

banderole-minis-caracteres

Bonjour les décodeurs et les codeurs du Z80 Amstrad.

Je repense à un programme que j'avais envoyé en 88/89 dans un magasine en espérant qu'il soit publié. A cette époque, je cherchais les moyens de me faire un peu d'argent de poche pour m'aider dans mes études.
Il s'agissait d'un programme de RSX qui affichait des minis caractères en MODE 0 dans plusieurs couleurs.
Comme les idées sont toujours présentes, j'ai retapé le programme à l'aide de WINAPE. Et c'est encore plus de plaisir que le codage binaire de l'époque !

Pour faire simple, ce programme en assembleur ne dépasse pas les 1KO et on peut éditer et sauvegarder les minis caractères avec les RSX pour les incorporer plus facilement dans nos programmes. 

Pour tout ceux à qui ça intéresserait de savoir comment traiter le RSX avec différents paramètres, différentes variables, ou optionnels, je vais vous détailler les étapes de mon programme, pour que vous puissiez mieux le modifier selon vos besoins.
Avant de commencer, voici quelques précisions:

- Seul le MODE 0 de l'Amstrad est compatible
- Les minis caractères ont une largeur de 4 points et une hauteur de 6 points
- Le positionnement des minis caractères démarre du haut et à gauche de l'écran
- Ont peut utiliser 3 couleurs d'encre et 3 couleurs de papier par caractère
- Comme la hauteur est fixée à 6 points, les couleurs changeront tous les deux points de hauteur (Voir plus bas)
- Chaque minis caractères occupent 3 octets pour un total de 54 caractères soit (54*3)=162 octets

Les RSX utilisés et leurs équivalents BASIC:
- RSX CURSEUR sert à positionner les minis caractères (LOCATE)
- RSX ENCRE sert à définir les 3 couleurs des encres (PEN)
- RSX PAPIER sert à définir les 3 couleurs pour le papier (PAPER)
- RSX FONTE sert à afficher les caractères (PRINT)
- RSX DEFCAR sert à redéfinir un caractère (SYMBOL)

Comment n'utiliser que 3 octets seulement par mini caractère:
Un octet est constitué de 8 points (BIT) et les minis caractères font 4 points de largeur.
Donc j'utilise un octet pour afficher deux lignes de caractère. . . # . <------ 0010 Pour La première rangée de 4 points
# . # . <------ 1010 Pour la deuxième rangée de 4 points

En exemple, voici la représentation du mini caractère '1' sur 3 octets
. . # . <------ 0010 0110      1ere octet = &X0010 0110
. # # . <------------'
. . # . <------ 0010 0010      2eme octet = &X0010 0010
. . # . <------------'
. # # # <------ 0111 0000      3eme octet = &X0111 0000
. . . . <-------------'

Pour le roulement des couleurs toutes les deux lignes, voici une image qui vous en dira plus:
roulement de couleur

Comme vous pouvez le voir, les couleurs changent toutes les deux lignes.
Le programme se chargera automatiquement de les faire tourner.

1320, C'est le nombre total de minis caractères affichables sur l'écran.
En MODE 0 de l'Amstrad CPC, chaque ligne de l'écran peut afficher 160 pixels\points.
Donc si je sors ma calculette... 160 points de l'écran /4 points par mini caractère: 160/4= 40
40, c'est le nombre maximum de minis caractères par ligne que l'on peux afficher

Et si on continu avec ma calculatrice, l'Amstrad affiche 200 lignes de haut (400/2) c'est de l'Amstrad :)
Donc comme les minis caractères font 6 points de haut: on en déduit que 200/6= 33... reste de la poussière que l'on enlèvera pas.
On aura donc 40 minis caractères X 33 = 1320 caractères sur l'écran.

Pour le bon fonctionnement des RSX, il nous faut donc réserver:
2 octets pour le positionnement (CURSEUR, col, lig)
3 octets pour les encres (ENCRE, encre1, encre2, encre3)
3 octets pour les papiers (PAPIER, papier1, papier2, papier3)
2 octets provisoires pour une pile (On en reparlera plus tard)
162 octets pour les 54 minis caractères (43*3)
Il ne faut pas oublier que les couleurs de l'amstrad sont codées... Ce n'est pas un ><(((°> d'Avril, mais pour décoder les 16 couleurs du mode 0, il faut une table de 16 octets.
Soit un total de 2+3+3+2+162+16= 188 octets. Je ne voulais pas dépasser les 1KO avec les RSX, ça va la jouer serrer!

Les RSX en détailles:

|CURSEUR, col, ligRSX qui sert à positionner le curseur pour les minis caractères.
Col (0 à 39) indique la position verticale du curseur en partant de la gauche.
Lig (0 à 32) Indique la position horizontale du curseur en partant par le haut.

|ENCRE, Encre1, [Encre2], [Encre3]Cet RSX sert à fixer les 3 couleurs des encres
Encre1, Encre2, Encre3 (0 à 15) représentent les 3 couleurs pour deux lignes de caractères chacune.
[Encre2] et [Encre3] ne sont pas obligatoires, et dans ce cas,  ils garderont leurs anciennes valeurs.

EXEMPLE pour le caractère '1'
. . # . <------ 0010 0110      - Encre 1
. # # . <------------'         - Encre 1
. . # . <------ 0010 0010      -   Encre 2 
. . # . <------------'         -   Encre 2  
. # # # <------ 0111 0000      -     Encre 3
. . . . <-------------'        -     Encre 3

|PAPIER, Papier1, [Papier2], [Papier3]RSX qui permet de fixer les 3 couleurs des papiers.
Il fonctionne comme pour le RSX 'ENCRE' ci-dessus, donc on n'y revient pas.

|FONTE, Chaine$ Cet RSX affiche la chaîne de caractère à l'emplacement courant du curseur.
La position du curseur sera mis automatiquement à jour à la suite du dernier caractère affiché.
Il n'y a pas de différences entre les majuscules et les minuscules. Un 'A' sera identifié comme un 'a'
Les caractères qui ne sont pas compris dans la table de 4*6 seront remplacés par un ESPACE.

|DEFCAR, A$, Ligne1, Ligne2, Ligne3, Ligne4, Ligne5, Ligne6 Redéfini le caractère contenu dans la chaîne 'A$' avec les valeurs contenues dans les lignes
De Ligne1...à...Ligne6 (0 à 15), indique les valeurs représentées sur 4 points.
Exemple pour redéfinir le caractère '1':
|DEFCAR, "1", &X0010, &X0110, &X0010, &X0010, &X0111, &X0000

Mais on peut aussi utiliser la méthode ci dessous:
|DEFCAR, "1", &X00100110, &X00100010, &X01110000

Ou plus simplement en décimal:
|DEFCAR, 2, 6, 2, 2, 7, 0 ou |DEFCAR, "1", 38, 34, 112
Bref, à vous de faire au plus simple :) 

Pour bien mettre en avant les minis caractères, j'ai aussi créé un autre RSX
|ROULE, A$ Permet de faire rouler la chaîne A$ de la droite vers la gauche.
Exemple: A$="0123456789": |ROULE, A$: PRINT A$
Résultat: "1234567890"
Cette routine à l'avantage d'être très rapide et courte, c'est pourquoi je l'ai intégré.

Les explications sont terminées, on attaquera la programmation dans un prochain article.

Banderoles-de-toutes-les-couleurs-300x26



 

 

Publicité
Publicité
Commentaires
Favoris

 

ùcpm le fanzine
ùCPM le fanzine

 

 

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 242
Publicité