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 - Temporisation
(Article écrit par Denis Obriot et extrait d'Amiga News Tech - mars 1990)
|
|
La rapidité d'exécution d'un programme gêne beaucoup moins les utilisateurs et les programmeurs que ce qu'on imagine.
Par contre, un point important est la temporisation. Depuis des années les programmeurs en BASIC
font leurs temporisations avec des boucles du style :
Si vous voyez un programme qui fonctionne avec un 68000 et ne fonctionne pas avec un 68020, il y a de
fortes chances que ce soit à cause d'une boucle de ce genre. Ceci vient du fait que le 68020 va deux
fois plus vite que le 68000 et que la boucle va s'exécuter elle aussi deux fois plus rapidement.
Cela peut-être extrêmement gênant dans le cas d'un jeu qui devient injouable car trop rapide.
Mais aussi dans beaucoup d'autres applications.
Il existe beaucoup de solutions pour obtenir des délais précis. Je ne parlerai pas de la commande Delay()
d'AmigaDOS qui n'est absolument pas précise pour des temps inférieurs à deux secondes. Les solutions
valables passent soit par le circuit CIA 8520, soit par l'interruption de temps mort vertical.
Ces deux solutions étant accessibles par le biais du timer.device, nous n'aurons pas besoin d'aller
visiter le matériel (Ouf !).
Le chronomètre
Le CIA 8520 est le chronomètre (timer) programmable qui permet d'obtenir des délais inférieurs à
la seconde très précis. Par contre, il s'essouffle facilement sur les grandes distances car il
utilise trop le processeur. Pour avoir une bonne exactitude avec le 8520, il faut utiliser la fonction
du système Disable() suivie de Enable(). En général, il est déconseillé d'utiliser ces fonctions et
recommandé d'utiliser Forbid() et Permit() car Disable() désactive aussi les interruptions et gèle le
système. C'est exactement ce qu'il nous faut si nous voulons avoir une synchronisation précise.
De plus, comme le système n'est arrêté que pour une durée infime, celle de notre mesure, rien de
trop grave ne risque d'arriver.
La synchronisation de l'interruption Vertical Blank est moins précise sur de courtes périodes
mais plus en ce qui concerne les grandes. Si vous voulez attendre plus d'une seconde utilisez-le donc.
Programme d'exemple
Le programme suivant vous montre comment accéder aux chronomètres en GFA Basic. J'ai retrouvé les
décalages de la structure "timerequest" grâce au ROM Kernel Manual Includes & AutoDoc d'Addison-Wesley
qui contient une table des structures du système avec la taille de chaque élément. L'utilisation
de ABSOLUTE est un truc qui permet de simuler une structure en mémoire. ABSOLUTE place une variable
(1n_type par exemple) à l'adresse où l'on a décidé de la mettre. Cela est très pratique pour adresser
les registres du matériel et comme ici pour utiliser facilement une structure.
J'ai également réécrit CreateExtIO et DeleteExtIO car CreatExtIO ne fonctionne pas correctement en
GFA Basic alors que DeleteExtIO n'existe pas. Le reste du code contient la création du port de
messages. L'initialisation de la structure timerequest (ici timereq%), l'ouverture du timer.device
et son utilisation. Comme le timer.device peut aussi renvoyer l'heure, j'en ai profité pour vous
faire une petite horloge.
|