Revenir au plan du site
Écrire du texte avec sa propre fonte
J'avais brièvement écrit un "writer" ou programme d'affichage de texte dans l'introduction des cours, sans passer par les explications car
l'objet était uniquement de justifier l'intérêt de la programmation hardware pure rapport à la programmation système : À la fois la
vitesse d'exécution mais aussi la simplicité et la maîtrise de tout.
On est rapidement prisionnier de la fonte système. Modifier les caractères contraint encore plus l'usage (les caractères redéfinis ne
doivent pas se trouver dans la plage #0000-#3FFF par exemple) et surtout on reste contraint par le format 8x8 pixels.
Avec votre propre fonte, vous faites bien ce que vous voulez et votre fonte n'est plus obligatoirement monochrome! Dans l'exemple
de ce cours, je vais utiliser une fonte fixe de 12x16 pixels (plutôt conçue pour un usage en mode 1).

Comme vous pouvez le remarquer, je n'ai pas utilisé l'ordre ASCII et je n'utilise que 81 caractères. Est-ce un problème? Que nenni!
On va d'abord convertir notre fichier et ensuite "déclarer" notre fonte dans RASM.
La conversion des graphismes, classique :)
convgeneric.exe simpleFonte.png -m 1 -size 12x16 -c 81 -flat -g
|
L'intégration de la fonte pour RASM set fait avec la directive
[ CHARSET ]
charset ' ABCDEFGHIJKLMNOPQRSTUVWXYZ!()*+,-./0123456789:;<=>?@_abcdefghijklmnopqrstuvwxyz#',0
|
La directive CHARSET, héritée de Winape permet d'attribuer une autre valeur que celle par défaut pour les caractères.
Dans notre cas, nous n'avons pas de caractère de contrôle ni tous les caractères, on se contente alors de
faire la liste des caractères dans l'ordre de notre fonte et de lui dire de démarrer le compte à zéro.
D'autres écritures de la directive sont possibles, voir la
[ documentation de RASM ].
Vous aurez besoin du
[ binaire de la fonte ] pour assembler ce source
BUILDSNA : BANKSET 0
ORG #100 : RUN #100 : LD SP,#100
ld bc,#7F00 : out (c),c : ld a,#58 : out (c),a : ld c,#10 : out (c),c : out (c),a
ld bc,#7F01 : out (c),c : ld a,#49 : out (c),a
ld bc,#7F80+%1101 : out (c),c ; MODE 1
ld hl,message : call affiche_chaine
jr $
affiche_chaine
ld a,(hl) : inc hl ; récupérer la valeur dans le tableau et incrémenter le pointeur
cp #FF : ret z ; terminateur?
push hl : call affiche_caractere : pop hl ; on a besoin de conserver notre pointeur HL
jr affiche_chaine
affiche_caractere
; nos caractères font 48 octets
add a : ld h,0 : ld l,a : add hl,hl : add hl,hl : add hl,hl ; x 16
ld bc,hl : add hl,hl : add hl,bc ; x 48
ld bc,fonte : add hl,bc ; HL=adresse des données du caractère dans le tableau fonte
ld de,(position_char) ; on récupère la position du curseur
ld xl,16 ; nombre de lignes
ld bc,#10FF ; le LDI décrémente BC donc on charge C au maximum pour que B puisse servir de compteur
affiche_ligne_caractere
push de : ldi 3 : pop de
ld a,d : add 8 : ld d,a : and #38 : jr nz,.noOVF
ld a,80 : add e : ld e,a : ld a,#C0 : adc d : ld d,a : res 3,d
.noOVF
djnz affiche_ligne_caractere
; avancer le curseur
ld hl,(position_char) : inc hl : inc hl : inc hl : ld (position_char),hl
ret
charset ' ABCDEFGHIJKLMNOPQRSTUVWXYZ!()*+,-./0123456789:;<=>?@_abcdefghijklmnopqrstuvwxyz#',0
message defb 'Oh la belle fonte!',#FF
charset
position_char defw #C000
fonte incbin 'simpleFonte.bin'
|

Maintenant, on peut passer à
[ l'article suivant ] pour voir comment stocker plusieurs fontes et libérer de la mémoire.