Obligement - L'Amiga au maximum

Vendredi 24 mai 2019 - 06:03  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles en d'autres langues


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


Jeux Amiga

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


Trucs et astuces

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


Glossaire

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


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


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 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
'


[Retour en haut] / [Retour aux articles]