home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
graph
/
font.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-10-06
|
5KB
|
129 lines
Unit Font;
Interface
Procedure Print_Char(Chr:Char);
{affiche un caractère en mode X }
Procedure Print_String(Str:String);
{affiche une chaîne de caractères en mode X }
Procedure Scrl_Move;
{déplace la partie visible du Scrolly vers la gauche }
Procedure Scrl_Append;
{ajoute des données nouvelles au bord droit du Scrolly}
Var Scrl_Y:Word; {position verticale du Scrolly}
Const
Scrl_Nombre=4;
{nombre de chaînes disponibles dans Scrl_Txt }
Scrl_Txt:Array [1..Scrl_Nombre] of String =
{Ceci n'est qu'un texte de démonstration que vous pouvez modifier ou compléter librement.!}
('Bonjour, ceci est un defileur de demonstration tire du livre P C I N T E R D I T'
+' de Micro Application. Bon d accord ce n est pas le grand luxe , ',
'mais il se programme avec un minimum d effort et sa vitesse est '
+'bonne. Meme sur les ordinateurs lents, il est possible d adjoindre ',
'des effets supplementaires. Notez bien que ce programme ne consomme '
+'que 10 pour 100 des ressources de calcul disponibles sur un 486-40 avec Turbo desactive ',
'. Attention Scrolly va demarrer '
+' --------------------------- ');
Implementation
Uses ModeXLib;
Const
CharPos:Array[' '..'Z', 0..1] of Word=
{positions et largeurs des différents caractères,
décomptés en mots-CPU }
((71,4),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(1906,3),(1909,3),(1912,3),(1915,4), {,-./}
(3600,5),(3605,3),(3608,5),(3613,5), {0..3}
(3618,5),(3623,5),(3628,5),(3633,5), {4..7}
(3638,5),(3643,5),(3648,3),(3651,3), {8..;}
(3654,5),(3659,5),(3664,5),(3669,4), {<..?}
(0,0),(0,5),(5,5),(10,5),(15,6),(21,5), {@..E}
(26,4),(30,7),(37,5),(42,3),(45,4),(49,5),{F..K}
(54,4),(58,8),(66,5),(1840,7),(1847,5), {L..P}
(1852,7),(1859,5),(1864,4),(1868,4), {Q..T}
(1872,5),(1877,6),(1883,8),(1891,5), {U..X}
(1896,5),(1901,5)); {YZ}
Var Cur_X, {coordonnées courantes }
Cur_Y:Integer; {du curseur }
Scrl_Number, {numéro de la chaîne de défilement présentement active }
Scrl_Pos, {position à l'intérieur de cette chaîne }
Scrl_ChrPos:Word; {position à l'intérieur du caractère }
Procedure Print_Char(Chr:Char);
{affiche un caractère en mode X et avance le curseur }
Begin
Chr:=UpCase(Chr); {ne prend que des majuscules }
If Chr in [' '..'Z'] Then Begin {le caractère est-il dans la table ?, oui :}
If 80- Cur_X < {reste-t-il assez de place ?}
CharPos[Chr,1] Then Begin
Cur_X:=0; {non, ligne suivante, x à 0}
Inc(Cur_Y,25); {y augmenté de la hauteur d'un caractère}
End;
Copy_Block(Cur_Y*80+Cur_X, 48000+Charpos[Chr,0], CharPos[Chr,1], 22);
{copie le caractère de la position de fonte (lue dans la table CharPos)
à la position du curseur (Cur_Y * 80 byte par ligne + Cur_X)
(hauteur = 22 lignes) }
Inc(Cur_X,CharPos[Chr,1]); {avance le curseur de la largeur du caractère }
End;
End;
Procedure Print_String(Str:String);
{affiche une chaîne en mode X,
utilise Print_Char}
Var i:Word;
Begin
For i:=1 to Length(Str) do {parcourt l'ensemble de la chaîne }
Print_Char(Str[i]); {et l'envoie caractère par caractère à Print_Char}
End;
Procedure Scrl_Move;
{déplace simplement le contenu de l'image à l'emplacement du Scrolly
d'une position vers la gauche c'est-à-dire copie 79 bytes de l'abscisse
1 à l'abscisse 0}
Begin
Copy_Block(Scrl_y*80, Scrl_Y*80 +1, 79,22);
End;
Procedure Scrl_Append;
Var Chr:Char; {caractère courant }
Begin
Chr:=UpCase(Scrl_txt[Scrl_Number,Scrl_pos]);
{lit le caractère, le convertir en majuscule }
If Chr in [' '..'Z'] Then Begin {le caractère est-il dans le jeu ?, oui :}
If CharPos[Chr,1] > 0 Then {n'affiche que les caractères disponibles }
Copy_Block(Scrl_y*80+79, 48000+CharPos[Chr,0]+Scrl_ChrPos, 1, 22);
{puis copie 1 colonne du jeu de caractères au bord droit de l'écran }
Inc(Scrl_ChrPos); {colonne suivante à l'intérieur du caractère }
If Scrl_ChrPos >= CharPos[Chr,1] Then Begin
Inc(Scrl_Pos); {caractère traité, au suivant }
Scrl_ChrPos:=0; {réinitialise la colonne à 0}
If Scrl_Pos > Length(Scrl_Txt[Scrl_Number]) Then Begin
Inc(Scrl_Number); {chaîne traitée, à la suivante }
Scrl_Pos:=1; {remet la position à 0}
If Scrl_Number > Scrl_Nombre Then Begin
Scrl_Number:=1; {texte traité, on recommence }
Scrl_Pos:=1;
Scrl_ChrPos:=0;
End;
End;
End;
End;
End;
Begin
Cur_X:=0; {curseur au coin supérieur gauche }
Cur_Y:=0;
Scrl_Y:=50; {Valeur par défaut de l'ordonnée }
Scrl_Number:=1; {on commence par la chaîne 1,}
Scrl_Pos:=1; {le caractère 1, la colonne 0 }
Scrl_ChrPos:=0;
End.