Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : GFA Basic - Un PRINT à 16 700 caractères par seconde
(Article écrit par Pierre-Philippe Launay et extrait d'Amiga News Tech - mars 1992)
|
|
Aujourd'hui, nous allons revisiter le célèbre PRINT "Hello" de nos débuts. Mais à la vitesse grand V,
soit 16 700 caractères par seconde !
Afficher un million de caractères à la minute est irréalisable avec la plupart des compilateurs. GFA est cependant
si optimisé qu'il prend ici une incroyable avance sur la plupart des compilateurs C. Mais il est possible
d'aller encore plus vite. Comment se définit une fonction PRINT ? On prend une chaîne de caractères, on lui colle
une police de caractères, puis on affiche chaque symbole de la chaîne. Éventuellement, on définira certains codes
spéciaux tels que la tabulation, le style ou la couleur de la lettre. Puis vient la gestion de l'affichage.
Pour simplifier, je n'utilise ici que la police Topaz 8, sinon gare au Gourou (non, ce n'est pas vrai... Ou alors,
mettez votre version 3.03 à jour), et l'affichage se fera sur un seul plan de bits (mode deux couleurs).
Nous nous retrouvons donc avec un affichage ligne à ligne de 79 caractères. Le petit test de chronométrage
montre alors l'intérêt de la frappe au kilomètre (pas de touche "Entrée") : dans ces conditions, on obtiendra
des temps de 50 à 51 microsecondes pour l'impression de chaque lettre sur un A3000. Sinon, avec un PRINT
toutes les 40 lignes, cela deviendra 190 sur A500. Ces temps s'entendent bien sûr avec l'utilitaire FF
activé dans la startup-sequence.
Et on peut encore accélérer, mais il faudra alors utiliser un assembleur (Devpac s'il fallait le nommer).
En effet, est-ce la malice de Franck Ostrowski ou tout simplement une subtilité qui m'aurait échappé, mais
la plupart des fonctions C du GFA donnent quelque chose qui ressemble (en source compilé avec l'option table
des symboles) à un code comme :
MACHIN move $c498a0(a5),d0
move $c496a2(a5),d1
bsr Machin_G
....
Machin G exg d1,d0
ext.1 d0
ext.1 d1
move.l a6,d7
movea.l $65e(a6),a6
jsr _LVOMACHIN(a6)
move.l d7,a6
rts
|
Ainsi, on porrait se demander à quoi sert la ligne "exg". Et malgré tout, cela va vite. Très, très vite.
' ****************************************
' * P R I N T A S C I I *
' * Gestion fin de ligne et bas d' écran *
' * *
' * CODAGE Pierre Philippe Launay *
' * RECHERCHE Cathy Lardy *
' * COPYRIGHT © Décembre 1991 *
' ****************************************
'
vite
PROCEDURE vite ! Plan du codage
met.ecran ! Il est possible d' aller
met.variable ! Beaucoup plus vite
affichage ! En optimisant d' avantage
resultat ! Ce code
salut ! A vos crayon...
RETURN
PROCEDURE met.variable ! Précalcul pour aller plus vite
IF fichier$=""
nom$=_dosCmd$
DIM ecran$(1)
ELSE
nom$=""
ENDIF
return%=0
essais&=0
ligne%=8
longueur%=79 ! Nombre de lettres par ligne
vide$=SPACE$(80)
vide%=V:vide$
REPEAT
REPEAT
IF nom$=""
FRONTS 1
FILESELECT "SELECTIONNEZ LE FICHIER ASCII A LIRE"," LIRE ","DF0:",nom$
IF nom$=""
fins
ENDIF
ELSE
commentaire%=INSTR(nom$,";")
IF commentaire%
nom$=LEFT$(nom$,commentaire%-1)
ENDIF
nom$=TRIM$(nom$) ! Ote les espaces
guillemet$=CHR$(34)
guil1%=INSTR(nom$,guillemet$)
guil2%=INSTR(guil1%+1,nom$,guillemet$)
IF guil1% ! Si y en a un
IF guil2%=0 OR LEN(nom$)<2
ALERT 0,"Gasp ! Il faudrait deux "+CHR$(34)+" bien placés|
pour encadrer le nom du fichier :|
C ' est foutu.",1," Clinorhombique ! ",bof%
nom$=""
ELSE ! Sinon c' est bon
long%=guil2%-guil1%-1
nom$=MID$(nom$,guil1%+1,long%)
ENDIF
ENDIF
nom$=TRIM$(nom$) ! Ote les espaces
ENDIF
IF NOT EXIST(nom$)
nom$=""
ENDIF
INC essais&
UNTIL nom$<>"" OR essais&=3
IF essais&=3 OR INSTR(nom$,":")=LEN(nom$)
IF nom$="" OR (NOT EXIST(nom$)) OR INSTR(nom$,":")=LEN(nom$)
ALERT 0,"Ce type d' objets ne convient pas",1,"Eustatique, n' est-il pas ?",bof%
nom$=""
ENDIF
ENDIF
IF nom$<>""
OPEN "i",#0,nom$
IF LOF(#0)>32767
CLOSE #0
ALERT 0,"Fichier trop long|Maximum 32767 caractères",1,"Cholïambe ?",bof%
nom$=""
ENDIF
ENDIF
UNTIL nom$<>""
fichier$=INPUT$(LOF(#0),#0)
fichier%=V:fichier$
CLOSE #0
long%=LEN(fichier$)
debut%=fichier%
CLS
TEXT 12,25,"Attention : ça va déménager"
TEXT 12,45,"BOUTON GAUCHE BOUTON DROIT"
TEXT 12,55,"Ecran visible Invisibilité"
clic ! Clac
pos%=1
seconde%=0 ! Les secondes systèmes
tick%=0 ! Les µsecondes système
compteur%=0 ! Quelques autres variables
departsec%=0
departtick%=0
vdepartsec%=V:departsec%
vdeparttick%=V:departtick%
chronosec%=0
chronotick%=0
vchronosec%=V:chronosec%
vchronotick%=V:chronotick%
RETURN
PROCEDURE affichage ! Le test
IF sourisk%=2 ! Invisible ?
DISPLAY OFF ! Alors on cache
ENDIF
~CurrentTime(V:seconde%,V:tick%) ! Retourne l' heure locale
INC seconde% ! Meilleure synchronisation
REPEAT ! Départ synchro à la seconde suivante
~CurrentTime(vdepartsec%,vdeparttick%)! car une seconde c' est énorme
UNTIL departsec%=seconde% ! quand on veut mesurer au "tick" (impulsion) près
FOR x%=1 TO long%
SELECT BYTE{fichier%+x%}
CASE 10
DEC pos%
@return
~Text(rastport%,vide%,78-pos%)
pos%=1
DEFAULT ! On peut ajoutter ici des symboles spéciaux
SELECT pos%
CASE 78
@return
pos%=1
DEFAULT
INC pos%
ENDSELECT
ENDSELECT
NEXT x%
~CurrentTime(vchronosec%,vchronotick%) ! Attente du délais imparti
DISPLAY ON ! Affichage visible
RETURN
PROCEDURE return
INC return%
SELECT ligne%
CASE 0 TO 177
ADD ligne%,8
DEFAULT
' ~OwnBlitter()
~WaitBlit()
DPOKE &HDFF096,&HC010 ! DMACONR : disque blitterseul set
LPOKE &HDFF044,&HFFFFFFFF ! Masque : tout prendre
DPOKE &HDFF040,&H9F0 ! BLTCON0 : canal A et D
LPOKE &HDFF050,source%
LPOKE &HDFF054,cible%
LPOKE &HDFF064,0 ! BLTxMOD : pas de décalage
DPOKE &HDFF058,taille%
' ~DisOwnBlitter()
~WaitBlit()
ENDSELECT
~Move(rastport%,2,ligne%) ! Positionnement du curseur
~Text(rastport%,debut%,pos%) ! Affichage
debut%=x%+fichier%+1
RETURN
PROCEDURE resultat ! Go Garry, Go
compteur%=long%
durÉe%=chronosec%-departsec%
delais%=ADD(MUL(durÉe%,1000000),SUB(chronotick%,departtick%)) ! Résultat en µs
$%0 ! Compilation. Division farfadet EXPO#
ici=delais%/compteur% ! En nombre réel
$%3 ! Compilation. Division farfadet LONG%
clic
SGET ecran$()
~RectFill(rastport%,5,12,400,145) ! Met un beau rectangle
~SetDrMd(rastport%,2) ! Mode de tracé spécial GRAPHMODE 2
PBOX 10,70,360,85 ! Plus rapide
~SetOPen(rastport%,0) ! Change la couleur du crayon
GRAPHMODE 1
TEXT 10,20,"Seconde Système"
TEXT 10,30,"Tick Système "
TEXT 10,50,"Durée totale "
TEXT 10,60,"Pagination "
TEXT 10,80,"IMPRESSION "
~SetOPen(rastport%,1)
TEXT 137,20,STR$(chronosec%,10)+" S -"+STR$(departsec%,11)+" S "
TEXT 137,30,STR$(chronotick%,10)+" µ -"+STR$(departtick%,11)+" µ "
TEXT 137,50,STR$(delais%/1000000,18,6)+" Secondes "
TEXT 137,60,STR$(return%,6)+" Lignes de"+STR$(longueur%,3)+" lettres "
TEXT 137,80,STR$(compteur%,19)+" lettres "
~SetDrMd(rastport%,2)
TEXT 10,110,"L' affichage d' une lettre GFA prend ici "
TEXT 10,120,STR$(ici)+" microsecondes. "
TEXT 10,140," Veuillez utiliser le bouton de la souris "
~SetDrMd(rastport%,1)
RETURN
PROCEDURE salut ! Respect de l' utilisateur
clic ! Laché de souris
SPUT ecran$()
ALERT 0," SOUHAITEZ VOUS | LIRE UN AUTRE | FICHIER ASCII ?|",2," Oui | Non ",bof%
SELECT bof%
CASE 2
PBOX 5,12,400,145
TITLEW #0,"PASSEZ UNE BONNE ET AGREABLE JOURNEE",SPACE$(70)
FOR x%=0 TO 99
COLOR x% MOD 2
PBOX 5,12,400,145
NEXT x%
TEXT 10,20,"GFA 3.52F Pierre Philippe Launay"
DELAY 2.5 ! A bientôt
fins ! snif
DEFAULT
ferme.ecran
vite
ENDSELECT
RETURN
PROCEDURE clic ! Clac
WHILE MOUSEK
WEND
REPEAT
sourisk%=MOUSEK
UNTIL sourisk% OR STRIG(1) OR INKEY$<>""
RETURN
PROCEDURE met.ecran ! Oh Voui
OPENS 1,0,0,640,200,1,&H8000
TITLES #1,"Code PPL (Ant 1992)"
titres$="GFA 3.52F est vraiment très rapide : qui en doute encore ?"
SETCOLOR 0,&H378 ! bleuâtre
SETCOLOR 1,&HFD8 ! jaune
planbit%=LONG{SCREEN(1)+&HC0} ! Adresse plan de bits 0
source%=planbit%+0+28*640/8
cible%=planbit%+0+20*640/8
taille%=168*64+640/16
'
OPENW #0,0,10,640,189,0,&H1000
titrew$="Bonjour et bienvenue dans notre monde, le monde fantastique du développement"
TITLEW #0,titrew$,titres$
rastport%=LONG{ADD(WINDOW(0),50)}
RETURN
PROCEDURE ferme.ecran ! Déjà
CLOSEW #0
CLOSES 1
RETURN
PROCEDURE fins ! Rester bon ami avec le système
ferme.ecran
SYSTEM
RETURN
'
|
|