Sponsors

FacebookTwitterGoogle Bookmarks

Nous y mettrons tout naturellement l’adresse de notre structure résidente, plaçant ainsi l’amiga devant un fait accompli, et l’obligeant à considérer que cette mémoire nous est reservée (cf. Le listing). Me_Length est simplement la longueur de la mémoire dont nous venons de forcer la réservation. Tout ceci étant fait il suffit d’appeler la routine d’exec.library KickSumData afin de recalculer une somme d’auto-contrôle puis de ranger le résultat en KickCheckSum dans execbase est C’EST PRET. Il suffit de faire un reset (après avoir sauvegardé le programme, c’est tout de même plus prudent) pour admirer le résultat. IMPORTANT deux remarques : - pour ceux qui utilise un RAD: Il faut savoir que celui-ci s’installe comme nous venons de l’expliquer. Ce qui signifie que le lancement de notre programme va impitoyablement détruire le RAD:. Il y a bien sûr un remède. Modifier notre programme comme suit : tester la présence du RAD: (ou d’un équivalent) modifier sa memory list et son tableau de pointeur en y ajoutant notre propre structure. En fait cela revient à se chaîner au RAD: Mais voilà comme là où il y a de la chaîne il n'y a pas de plaisir, j'ai laissé libre cours à ma paresse et préfère laisser les modifications à votre sagacité. - j ai remarqué que mon programme “rate” quelquefois sur un amiga 2000 équipé d’un super fat agnus et donc d’un méga de chip. Comme je travaille habituellement sur amiga 500, je n’ai pas eu le temps d’approfondir la question sur le 2000 d’un collègue. Je soupçonne un bug dans la routine AllocEntryd'exec.library. Si un lecteur tire l’affaire au clair il gagnera.... toute mon estime. LE DOSNODE Il m’a fallu lire entre les lignes (en anglais Groumpff..!) Des amiga rom kernel manual pour trouver la solution du problème. Le moins que l'on puisse dire est que la documentation au niveau du DOS est sybilline. C’est à croire que Commodore préfère qu’on y touche pas à son DOS. Ceci est pour le moins curieux.

Click image to download PDF

AMIGA NEWS TECH numero 15 (09-1990)

Document sans nom TRANSACTOR
AMOS
Image intuition
par D. Obriot, p. 37
par F. Mazué, p. 34
GFA D-Mon
par D. Obriot, p. 37
1-1 C-l Itxt-i5534 0»F-32tt3* Fa»t-237tH lût
LANGAGE C
Le 3D est animé
par D. Amiable, p. 40
68000
Trions dans la bonne
humeur par Max, p. 57
SHORT CIRCUIT
Alimentation externe
par O. Mangon, P. 54
'Amos"
KICK START 1.3 !
BOOTALLOCATOR
Ce mois-ci, je vous propose un petit programme qui vous permettra de booter vos disquettes sur DF1: DF2: ou DF3: à votre guise. Mais attention, ceci est réservé aux possesseurs de kickstat 1.3. Autrement dit : place aux jeunes.
Davez-vous comment se déroule un reset sur votre machine préférée ?
Peut-être pas, sinon vous ne seriez pas en train de dévorer goulûment cet article. Voici donc quelques explications succinctes.
Tout d'abord les circuits électroniques effectuent des tests et s'assurent ainsi eux-mêmes qu'ils sont en état de fonctionner. Si l'un de ces circuits constate qu'il est en panne, alors une couleur apparaît et reste sur votre moniteur. La couleur est destinée à informer les spécialistes de l'origine de la panne.
Ce test s'effectue naturellement très vite, puis l'on rentre dans le processus d'initialisation (ou reset) de l'amiga.
Normalement un microprocesseur 68000 va chercher à l'adresse $ 0 une valeur pour le pointeur de pile superviseur puis il charge son PC avec le contenu de l'adresse $ 4 et c'est parti. Mais, me direz-vous, que contiennent ces addresses à l'allumage ou lors d'un reset ?
A l'allumage, ces addresses contiennent toute les deux 0 et lors d'un reset, la première contient 0 et la deuxième la valeur de execbase qui ne peut évidemment pas être utilisée par le 68000 comme adresse de démarrage.
Mais alors, comment ça marche ? Très simple : juste après le test des circuits le bit de la broche PA 0 du CIA-A est placé et ceci a pour effet de provoquer le recouvrement de la chip-ram par la ROM. Ainsi, sans même s'apercevoir qu'il s'est fait berner le 68000 lit le contenu des addresses $ f80000 et $ f80004. Si vous êtes curieux et que vous allez examiner vous-même ces adresses, vous constaterez que la routine reset démarre à l'adresse $ fc00d2. Très tôt dans cette routine vous rencontrerez l'instruction move.b $ 02,$ bfe0001 qui a pour effet à la fois d'éteindre la led power et d'annuler le recouvrement mémoire ce qui ne pose plus de problème maintenant que le 68000 carracole joyeusement en ROM (maintenant que vous savez tout ça, vous aurez le droit de m'adresser une pensée reconnaissante quand vous verrez votre led s'éteindre. Merci)
Que se passe-t-il ensuite ? Beaucoup de choses que je résume. L'ordinateur teste de combien de mémoire il dispose, il commence à construire exec.library, il saute dans le vecteur ColdCapture le cas échéant (n'est-ce pas messieurs les programmateurs de virus ?), puis et c'est très important, sont installées les structures résidentes suivant un ordre de priorité que voici et que je suis allé moi-même rechercher en ROM.
Structures
exec.library expansion.library
Priorité Commentaires
120
110
l'installation est totalement terminée
et non pas exception.library comme le prétend la bible de i'amiga (m'enfin)
potgo.ressource keymap.ressource cia. Ressource disk.ressource misc.ressource ramllb.library
110
110
80
70
70
70
graphics.llbrary
65
keyboard.device
60
gameport.device
60
timer.device
50
audio.device
40
input.device
40
layers.library
31
console.device
20
trackdisk.device
20
intuition.library
10
alert.hook
5
mathffp. Library
0
workbench.task
0
dos.library
0
romboot.library
- 40
bootstrap
- 60
Une fois ces structures installées, le 68000 saute dans le vecteur Cool Capture le cas échéant (n'est-ce pas messieurs les programmeurs de virus ?).
Attention, contient un sorcier extraordinaire ! Si vous pensez que je délire, allez donc dumper la ROM à l'adresse $ fe09a4 et vous verrez.
ça c'est notre fameux gourou !
Kickstart 1.3 seulement c'est le programme boot
Ensuite les structures précédemment installées et qui sont un programme sont exécutées en tant que tel : c'est le cas du boot. Pour les curieux qui voudraient tracer la routine de boot eux- mêmes, c'est faciles, cette routine commence à l'adresse $ fe8444, mais je vous recommande de sauter les instructions qui trafiquent le DMA sinon gare au plantage.
Que fait la routine boot ? Elle commence par examiner si le reset provient de l'utilisateur ou du gourou (examen des registres D6 et D7) et agit en conséquence. Le cas qui nous intéresse étant un reset utilisateur, je n'entrerais pas dans de profondes méditations. La routine continue en ouvrant le trackdisk.device pour lire les secteurs 0 et 1 de la disquette contenue dans DFO: (s'il y a une disquette). Si à ce moment des "secteurs amorce" (c-à-d si la disquette est autoboot) sont trouvés, l'amiga démarre imparablement sur DFO:
Mais s'il n'y a pas de disquette ou si celle-ci n'est pas autoboot, alors la routine ouvre la romboot.library qui elle regarde s'il existe en mémoire des structures DosNode avec priorité au boot, si oui elle boote selon cette structure, si non la romboot.library recherche d'éventuels périphériques "autoboot1 tel qu'un disque dur A590 par exemple.
Maintenant c'est du sérieux, j'ai dit au début de cet article qu'il est possible de booter sur n'importe quel drive externe (dûment connecté de préférence) et voilà que je vous révèle comment.
Il faudrai simplement pouvoir entrer en mémoire une de ces fameuses structures DosNode. Si seulement il était possible d'avoir la main pendant le reset ! Casse la tienne !, on va s'offrir le luxe d'installer nous-même une structure résidente du type de celles vues précédemment, mais d'une priorité supérieure au bootstrap et qui nous proposera le choix d'ajouter ou non un DosNode au système et voilà !
PROGRAMMATION DU RESET
D'après les Amiga Rom Kernel Manual, qui ne sont pas très bavards sur le sujet (toujours la peur des programmeurs de virus apparemment) voici comment doit être constituée une structure résidente :
struct résident
0
UWORD rt_Mafch Word; 13
BYTE rt_Pri;
2
struct Résident *rt MatchTag; 14
chart*rt_name;
6
APTR rt EndSkip; 18
char*rt_ldString
10
UBYTE rt_Flags; 22
APTR rtjnit;
11
UBYTE rt_Version; );
12
UBYTE rtjype
Les plus observateurs d'entre-vous auront remarqué que cette structure est donnée en langage C, mais la transposition en assembleur ne pose aucun problème comme vous le verrez dans le listing.
Quelques explications.
Rt_MatchWord est un mot de passe et DOIT avoir la valeur $ 4AFC
rt_MatchTag est un pointeur sur la structure elle-même
rt_Endskip est un pointeur sur la fin de ce que l'on veut maintenir en ram
rtjags doit contenir $ 01 pour que la structure soit initialisée en tant que
PROGRAMME
rt_Version numéro de version avec 0 comme valeur de préférence rtjype doit contenir $ 01 -> type process rtJName pointeur sur le nom de la structure rtJdString pointeur sur un commentaire parfaitement inutile rtjnit dans notre cas: pointeur sur le programme qui devra être exécuté. Bien maintenant que nous avons cette structure qu’en faisons- nous ? Réponse : rien. Ce qu'il faut faire maintenant c’est informer l’amiga qu’il aura des structures résidentes à initialiser et pour ce faire il faut (ce que les livres ne disent pas ou alors c’est des bêtises) lui fournir un tableau de pointeur dont chaque élément est un pointeur sur une structure à initialiser. Dans le listing ce tableau est appelé pour_KickTagPtr, comporte un seul élément puisqu’on ne veut installer qu'une structure et un long mot nul de fin de tableau (très important, les programmeurs en C me comprendront).
KickTagPtr qui c'est celui-là ? C’est un pointeur dans execbase qui doit pointer sur le tableau de structures à initialiser. Vous trouverez dans le listing la valeur d’offset de KickTagPtr et vous verrez qu’on le fait bien pointer sur le tableau pour_KickTagPtr.
Mais ce n’est pas tout !
LA MEMORY LIST
En effet dans execbase se trouve un pointeur nommé KickMemPtr et qui doit pointer sur une memory list correspondant à la structure que l’on veut installer. Voyons ça de plus près.
Struct MemList (
0 struct Node ml_Node;
14 UWORD ml_NumEntries;
16 struct memEntry ml_ME[1];
On a donc d'abord une structure de nœud c’est banal puis le nombre d’entrées dans la memory list puis la première entrée.
Ceux qui sont à l’aise en C comprendront que les entrées de la memory list sont rangées dans un tableau de structures. En fait la structure memory list est quelque peu hybride car extensible à l'infini (ou presque), il suffit d'augmenter le nombre d’entrées et le nombre d’éléments du tableau. Voyons enfin la structure MemEntry. Struct MemEntry union
ULONG meu_Reqs;
APTR meu_Addr;
} me_Un;
ULONG me_Length;
Les connaisseurs en C que vous êtes savent que lorsqu’on a affaire à une union c’est soit l’un soit l’autre : meu_Reqs serait la condition de réservation de mémoire, nous ne l’utiliserons pas.
Meu_Addr est l’adresse de la mémoire réservé.
Nous y mettrons tout naturellement l’adresse de notre structure résidente, plaçant ainsi l’amiga devant un fait accompli, et l’obligeant à considérer que cette mémoire nous est reservée (cf. Le listing).
Me_Length est simplement la longueur de la mémoire dont nous venons de forcer la réservation.
Tout ceci étant fait il suffit d’appeler la routine d’exec.library KickSumData afin de recalculer une somme d’auto-contrôle puis de ranger le résultat en KickCheckSum dans execbase est C’EST PRET.
Il suffit de faire un reset (après avoir sauvegardé le programme, c’est tout de même plus prudent) pour admirer le résultat.
IMPORTANT
deux remarques :
- pour ceux qui utilise un RAD: Il faut savoir que celui-ci s’installe comme nous venons de l’expliquer. Ce qui signifie que le lancement de notre programme va impitoyablement détruire le RAD:.
Il y a bien sûr un remède. Modifier notre programme comme suit : tester la présence du RAD: (ou d’un équivalent) modifier sa memory list et son tableau de pointeur en y ajoutant notre propre structure. En fait cela revient à se chaîner au RAD: Mais voilà comme là où il y a de la chaîne il n'y a pas de plaisir, j'ai laissé libre cours à ma paresse et préfère laisser les modifications à votre sagacité.
- j ai remarqué que mon programme “rate” quelquefois sur un amiga 2000 équipé d’un super fat agnus et donc d’un méga de chip. Comme je travaille habituellement sur amiga 500, je n’ai pas eu le temps d’approfondir la question sur le 2000 d’un collègue. Je soupçonne un bug dans la routine AllocEntryd'exec.library. Si un lecteur tire l’affaire au clair il gagnera.... toute mon estime.
LE DOSNODE
Il m’a fallu lire entre les lignes (en anglais Groumpff..!) Des amiga rom kernel manual pour trouver la solution du problème. Le moins que l'on puisse dire est que la documentation au niveau du DOS est sybilline. C’est à croire que Commodore préfère qu’on y touche pas à son DOS. Ceci est pour le moins curieux.
On finit par comprendre qu’il faut appeler la routine MakeDosNode de l'expansion.library. A cette routine, il faut passer un paquet de paramètres (registre A0) définis (!) Comme suit :
paramètres commentaires
APTR dosName exemple 'DF1 ’ c'est le nom du device à “mounter”
APTR execName le nom de celui qui devra s’occuper du boulot
ici 'trackdisk.device'
ULONG unit numéro d’unité concernée 1 pour DF1 : etc.
ULONG flags 0 le flag utilisé lors de l’ouverture du
trackdisk.device (il suffisait d’y penser !)
Vient ensuite une série de longs mots définissant la géométrie du disque réel ou virtuel qui doit être “mounté”
ULONG de JableSize le nombre de longs mots composant la table ici présente. Dans notre cas 17 ULONG de_SizeBlock le nombre de longs mots dans un bloc ici 128
ULONG de_SecOrg secteur origine ici 0
ULONG de.Surfaces le nombre de têtes ici 2
ULONG de.SectorPerBlock 1 évidemment !!
ULONG de_BlocksPerTrack nombre de bloc par piste Ici 11
ULONG de.Reserved le nombre de blocs réservés au boot donc 2
encore fallait-il le deviner.
ULONG de_PreAlloc concerne les disques durs ici 0
ULONG dejnterleave je sais pas ce que c'est 0 convient très bien
ULONG de_LowCyl piste de départ donc 0
ULONG de_HighCyl dernière piste donc 79
ULONG deJMumBuffers tout marche très bien avec 5 n'insistez pas
ULONG de_BufMemType type de mémoire ici 3 soit CHIPIPUBLIC
ULONG de.MaxTransfer c'est tout simplement le nombre d’octets dans un
bloc soit 512. C’était si facile de le dire, (regroumfff..!) ULONG de_Mask masque de mémoire maxi je ne m'embête pas et
met $ 00ffffff
ULONG de_BootPri priorité au boot ici 5 c’est suffisant
ULONG de_DosType ici old filesystem soit $ 444F5300
pyiHElB BHHB
A cela j’ajoute un long mot nul car j’ai remarqué qu'à la suite d'un calcul parfaitement hermétique, le système d’exploitation remplace le dit mot nul par gourou seul sait quoi !
Ce paquet de paramètres étant traité par MakeDosNode on obtient un pointeur sur un DosNode qu’on insérera dans le système avec la routine AddDosNode de expansion.library et c’est terminé.
Donc après avoir assemblé ce programme (qui peut être placé dans une startup-sequence) lancez-le. Il rend la main immédiatement. Retirez votre disquette Workbench de DFO: et placez-la en DF1 : et faites un reset. Lorsque la requête apparaît cliquez le bouton droit de la souris et l’amiga bootera en DF1 :
Si vous avez tout bien compris, il vous sera enfantin de modifier ce programme pour booter en DF2: ou DF3: si le cœur vous en dit et moi je vous dit à bientôt.
F. MAZUE
a enfin trouvé des boots à son pied
* ** BOOT ALLOCATOR par F. MAZUE ***
; ce programme a été écrit sur devpac 2 mais ne posera ; pas de problème aux acharnés de l'ignoble k-seka ; remplacez seulement dcb.b 8,0 parblk 8,0
KickSumData =-612
OldOpenLibrary = -408
CloseLibrary = -414
DisplayAlert = - 90
KicldVlemPtr = 546
KickTagPtr = 550
KickCheckSum = 554
MakeDosNode = -144
AddDosNode = -150
move.l $ 4,a6 : pointeur sur execbase
lea mem_list,a0 move.l a0,KickMemPtr(a6) lea pour_KickTagPtr,a0 move.l a0,KickTagPtr(a6) jsr KickSumData(a6) move.l dO,KickCheckSum(a6) rts début
dc. w $ 4afc
mot de passe de reconnaissance
; d’une structure résidente
debut_offset
dc. l début
pointeur sur la structure elle-même
fin_offset
dc. l fin
pointeur sur fin du programme entier
dc. b %00000001
flag pour exécution immédiate
dc. b 0
numéro de version
0 est indispensable pour une
initialisation immédiate
dc. b 1
type de résident 1 =process
dc. b -59
numéro de priorité
- 59 = juste avant le bootstrap
dc. l name_res
pointeur sur le nom
dc. l com_name_res
pointeur sur le commentaire
start_offset
dc. l start
point d'entrée du programme qui sera
; exécuté lors du reset
* ici commence la mem-list nécéssaire à KickMemPtr
memjist
dcb.b 8,0
huit octets nuls (suce et pred)
dc. b 16
BOOT_NODE
dc. bO
priorité 0 (rien à voir avec la
priorité d'initialisation de
la structure résidente)
dc. l name_node
pointeur sur nom de noeud
dc. w $ 01
une seule entrée
dc. l début
considérant ainsi que la mem-list est
déjà activée et la mémoire déjà réservée
dc. l lin-debut
longueur de la mémoire utilisée
dc. 10
fin de tableau
com_name_res
dc. b 'Vive moi',0
even
name_res
dc. b ’boot_alloc',0
even
name_node
dc. b 'ici est une tete de noeud',0
even
start ; ici commence le programme
; qui sera exécuté lors du reset
movem.l d0-d7 a0-a6,-(sp) ; sauvegarde des registres obligatoire
move.l $ 4,a6
lea int_name(pc),a1
jsr 01dOpenLibrary(a6)
tst.l dO
beq stop
lea IntuitionBase(pc),a2
move.l d0,(a2)
move.l 0,d0
move.l IntuitionBase(pc),a6
lea text_alert(pc),a0
move.l 130, d1
jsr DisplayAlert(a6)
bne stop
move.l $ 04,a6
lea exp_name(pc),a1
jsr 01dOpenLibrary(a6)
beq stop
move.l d0,exp_base
move.l d0,a6
lea paramétrés,aO
jsr MakeDosNode(a6)
move.l d0,a0
move.l 5,d0 ; priorité au boot
move.l 00,d1 ; 0 pour départ immédiat
jsr AddDosNode(a6)
move.l $ 04, a6
move.l expjoase, a 1
jsr CloseLibrary(a6)
stop
move.l $ 04,a6
move.l IntuitionBase(pc),a1
jsr CloseLibrary(a6)
movem.l (sp)+,d0-d7 a0-a6
rts
int_name
dc. b 'intuition.library',0
even
exp_name
dc. b 'expansion.library',0
even
IntuitionBase
dc. l 0
exp base
dc. l 0
text alert
dc. b 0,30,15,'F. MAZUE et Commodore Revue’,0,1
dc. b 2,10,15,présentent',0,1
dc. b 0,250,70,'BOOT ALLOCATOR',0,1
dc. b 0,30,120,'Left = DFO:', 0,1
dc. b 1,245,120,'Right = DF1 :',0,0
even
pourJCickTagPtr
dc. l début ; tableau de pointeur sur les structures
; à initialiser
dc. 10 ; fin de tableau
paramètres
dc. l dosName
dc. l execName
dc. l 1
dc. l 0
dc. l 17 ; sizeof
dc. l 128
dc. 10
dc. l 2
dc. l 1
dc. l 11
dc. l 2
àà dc.l 512
dc. l $ 00ffffff de.! 5
dc. l S444F5300
dc. 10 dosName
dc. b 'DF1 ',0
dc. 10
dc. 10
even
execName
dc. 10
dc. l 79
dc. b 'trackdisk.device',0
dc. l 5 , .
Dc.l 3 H
even
fin
Wi][n}©cl]©G®[F
IDHEIB BHBI3
IMU,
IMAGE INTUITION
ON MENU GOSUB mess REPEAT SLEEP UNTL MOUSEK=3
'tin de programme
'efface le menu
~ClearMenuStrip(fenêtre%)
'restitue la mémoire au système
libèremémoire
END
MENU 2 - I I
OPTION
I
I
MENU 1 I
OPTION 1 I
SOUS-OPT.1 I
I SOUS-OPT.2 I I
OPTION 21 OPTION 2 OPTION 2 I
I I
I
OPTION 3 -> SOUS-OPT. 1 OPTION 3
I
SOUS-OPT.2
La mise en place de telles structures ne devrait plus vous poser de difficultés. Le programme suivant montre comment mettre en œuvre une telle organisation. Le rôle des différentes zones des structures est expliqué en commentaire. Seules deux zones nécessitent des précisions.
Pour la structure menu :
si (Flag and &H001) = &h1 le menu est sélectionnable
sinon le menu apparaît en grisé
Pour la structure item :
&H0001 : l'item est sélectionné
&H0002 : les champs render et select pointent sur une structure intui- text, sinon sur une structure image (voir les articles précédents)
&H0004 : possède un raccourci clavier (le code ascii de la touche est dans le champ (touche)
&H0008 : item a deux états (sélectionne ou désélectionne)
&H00C0 : bits définissant le rendu de sélection
&H0000 : utilise select image
&H0040 : inversion vidéo
&H0080 : encadrement
&H00C0: pas de rendu
Et enfin pour rendre plus facile la libération de la mémoire en fin de programme, on initialise une structure Remember dans un tableau d'entier long et au fur et à mesure de la réservation par la FUNCTION mémoire cette structure Remember est mise à jour. La procédure mess montre comment récupérer le numéro du menu sélectionné ainsi que celui du sous-menu et sous-sous-menu,
La prochaine fois nous verrons comment mettre en place un requester, en attendant salut les AMI GARS.
D. OBRIOT
Intuition utilise des structures chaînées pour décrire les menus, la structure menu pour les en-têtes, la structure menuitem pour les entrées de menu.
Le schéma suivant représente une organisation typique de menu INTUITION, trois menus principaux, le premier avec trois options dont deux possèdent des sous-options. Les chaînages sont figurés par les traits :
Après avoir étudié les différents types de gadgets, nous allons apprendre à utiliser la dernière méthode de rentrée de données dans notre ordinateur favori : les menus. Gfa possède bien quelques ordres spécifiques aux menus mais il ne permet pas d'utiliser les images ou les raccourcis clavier.
PROGRAMME DE DEMONSTRATION MENU
INTUITION AU MENU
- > MENU 3 I
I
OPTION 1
1 intuition
DIM item%(8,3)
DIM gltem%(2)
DM image%(2),imagebis%(2)
DM imagedata%(2),imagedcrtabis%(2)
sous-programmes
PROCEDURE ouverture 'ouvre écran fenêtre OPENS 1,0,0,640,250,4&H80000 TITLES 1,"TEST DES GADGETS INTUITION" flag%= 1 +2+8+4+4096+65536
idcmp%=&H8+&H 100+&H200 !... ou INACTIVEWINDOW
' mess%=2+8+16+32+64+512+262144+524288 OPENW 1,10,10,500,200,idcmp: r, flag% fenêtre%=mWINDOW( 1 )
TITLE 1,"FENETRE DES GADGETS"
'autorise les menus
LONG(fenêtre%+24)=LONG|fenêtre%+24))AND&HFFFEFFFF
initimages
inititem
Initmenu
LOCATE 10 12
PRINT "BOUTON GAUCHE & DROIT”
RETURN
PROCEDURE inititem 'met en place le chaînage des item FOR]=IT0 3 itemsui%=0 FOR i= 1TO 8 READ x&,y&, 1 &,h&,f&,c$ intuitext(2,9,0,3,2,c*,0,c%)
menuitem(itemsui%,x&,y&,i&,h&,f&,0,c%,0,0,0,item%)
item%(9-i,j)=item%
ltemsui%=item%)
NEXTi
NEXTi
FOR i= 1 T08 LONG ! Item%(i,2)+281=item%( 1,1) itemsui%=0 NEXTi FOR j= 1 T02 READ x&,y&,l&,h&,f&,c$ cl=ASC(c$ )
menuitem(itemsui%,x&,y&,l&,h&,f&,0,image%(j),imagebis%(j),cl,0,
item%)
itemsui%=item%
gitem%(j)=item%
NEXT]
RETURN
PROCEDURE
'structure remember
DM mem%3 FOR i=l TO 3 mem%(i)=0 NECT î
'corps du programme ouverture
- ClearMenuStrip(fenêtre)
'rend actif le menu ~SetMenuStrip(fenêtre%,menu%)
'boucle d'attente
initimages
LOCATE 1,1
'définition des images
PRINT "un menu vient d'être sélectionné" PRINT "menu ";(MENU(2) AND 31)+1;3
'du troisième menu
PRINT "option ";((SHR(MENU(2),5)j AND63)+1;"
FOR i= 1 T02
IF «SHR(MENU(2),11)) AND 31) >31 THEN
initdataimage(16,16, l,imagedata%)
PRINT "sous option" ;((SHR(MENU(2 ), 11,)) AND 31)+1
initdataimagel 16,16,1 ,imagedatabis%)
ELSE
imagedata%(i)=imagedata%
PRINT"
imagedatabis%(i)=imagedatabis%
11
initimage(3,-2,16,16,1,4,1 ,imagedata%(i),0,image%)
ENDIF
initimage(3,-2,16,16,1,4,1,îmagedatabis%(i),0,imagebis%)
ELSE
image%(i)=image%
LOCATE 1,1
imagebis%(î)=imagebis%
PRINT SPACE$ (32)
NEXTi
PRINT SPACE$ (32)
RETURN
PRINT SPACE$ (32)
PROCEDURE initmenu
PRINT SPACE$ (32) ENDIF
'met en place le menu
RETURN
c%=@pointext("GRAPHIQUE")
@menu(0,240,10,120,10, l,c%,gitem%(2),menu3%)
PROCEDUFîE intuitex(fp,bp,dm,x&,y&,t$ ,next%,VAR texte%)
c%=@pointext("menu 2")
'met en place une structure intuitext
@menu(menu3%, 120,10,120,10,1 ,c%,item%(l ,2),menu2%)
texte%=@mémolre(20,&Hl)
c%=@pointext("meu 1")
IF texte%=0 THEN
@menu(menu2%, 10,10,100,10,1 ,c%,item%( 1,3),menu%)
PRINT "plus de mémoire"
RETURN
END
PROCEDURE menu(next%,x&,y&, 1 &,h&,flag&,titre%,item%,VAR menu%)
ENDIF
t%=@pointex(t$ )
'initialise la structure menu
BYTE(texte%|=fp ! Couleur d'écriture
menu%=@mémoire(30,&Hl)
BYTE texte%+1 l=bp ! Couleur du fond
IF menu%=0 THEN
BYTE(texte%+2)=dm 1 type du dessin
PRINT "plus de mémoire"
BYTE(texte%+3)=0 ! Inutilisé
END
INTftexte%+4)=x& ! Position en x
ENDIF
INT(texte%+6)=y& ! Position en y
LONG(menu%+0)=next% 1 pointeur sur menu suivant
LONG(texte%+8)=0 1 pointeur sur struc. Attribut
INT menu%+4)=x& ! X
LONG)texte%+12)=t% ! Pointeur sur chaîne texte
INT|menu%+6)=y& !y
LONG texte% +161=0 ! Pointeur sur suivant
INT(menu%+8)=l& ! Largeur
'longueur intuitext 20
INI|menu%+10)=h& ! Hauteur
RETURN
INT(menu%+12)=l !flag& ! Flags LONG|menu%+14)=titre% ! Nom
PROCEDURE initdataimage(largeur%,hauteur%,deep%,VAR imageda-
LONG(menu%+18)=item% 1 subitem
ta%)
INT(menu%+221=0 !
1% =DIV(largeur%, 16)
INT(menu%+24)=0 ! Réservés à intuition
1F MOD(largeur%,16)>l THEN
INT(menu%+26)=0 !
1 %=!%+!
INT(menu%+28)=0 !
ENDIF
'longueur menu 30
nombre&=MUL(MUL(MUL 1 %,hauteur),deep%),2)
RETURN
imagedata%=@mémoire(nombre&*2,&H2)
PROCEDURE
IF imagedata%=0 THEN PRINT "impossible"
menuitem(next%„x,y,l,h,flag,exclude%,render%,select%,touche,sousme-
END
nu%,VARitem%)
ENDIF
'initialise la structure item
FOR loop%=Û TO DIV(nombre&,2)-l
item%=@mémolre(36,&Hl)
READ info%
IF item%=0THEN
hi%=TRUNC(DIV(info%,256)
PRINT "plus de mémoire"
1 o%=MOD(info% ,256)
END
BYTE(imagedata%+2*loop%)=BYTE(hi%)
ENDIF
BYTE(imagedata%+2*loop%+ll=BYTE(lo%)
LONG(item%+0)=next% ! Pointeur sur item suivant
NEXT loop%
INT(item%+4)=x ! X
RETURN
INT(item%+6)=y I y lNT(item%+8)=100 ! Largeur
PROCEDURE initimage(x&,y&,l&,h&,prof&,planepick&,planeonoff&,ima-
ENT item%+10}=h 1 hauteur
gedata%nextimage%,VARimage%)
INT(item%+12)=flag ! Flags
image%=@mémoire(20,&H4)
LONG(item%+14)=0 !exclude%
INT(image%+0)=x& ! Leftedge
LONG(item%+18)=render% 1 render
INT(image%+2]=y& ! Topedge
LONG(item%+22)=select% ! Select
INT(image%+4)=l& ! Width
BYTE(item%+26)=touche ! Code ascii touche de commande
INTjimage%+6)=h& ! Hauteur
LONGlitem%+28)=sousmenu% ! Pointeur sur le souc-menu
INT!image%+81=prof& ! Deep
LONG(item%+32)=0 Inextselect
LONG(image%+10)=imagedata% 1 imagedata
'longueur menuitem 36
BYTE(image%+14)=planepick% ! Planepick
RETURN
BYTE(image° o+15)=planeonoff% ! Planeonoff
PROCEDURE mess
LONG|image%+161=nextimage% ! Nextimage RETURN
'récupère la sélection du menu et l'affiche IF (MENU® AND 31) >31 THEN
PROCEDURE libèremémoire
pjHBBB HHHH
'libère la mémoire
~FreeRemember(VARPTR(mem%)(l)),TRUE
RETURN
FUNCTIONmémoire(longueur%,llag%)
'réserve un emplacement mémoire de longueur% byte 'caractéristiques données par flag voir manuel 'du gfa FONCTION MALLOC pour les valeurs de flag%
'et met à jour la structure remember LOCAL adresse%
adresse%=AllocRemember(VARPTR(mem%(l)Uongueur%,flag%) F adresse%=0 THEN PR1NT "impossible"
ENDIF
RETURN
adresse
ENDFUNC
FUNCTION pointext(t$ )
'transforme une chaîne en une chaîne C 'et renvoie son adresse mémoire LOCALi
1 &=MUL(ADD(DIV(LEN(t$ ),4), 1 )4) ci%=@mémoire(l&,&Hl) cc%=MUL(DIV(ci%,4),4)
FOR i=0 TO LEN(t$ )-l BYTE(cc%+i}=ASC(MID$ (t$ ,i+l, 1))
NEXTi
BYTE(cc%+i)=0
3615 COMREV
TRIBUNES - FORUMS - P.A. - JEUX - EDITORIAL ENVIRONNEMENT - HIT PARADE TELECHARGEMENT - EN DIRECT
RETURN
cc%
ENDFUNC
'Données graphiques
menu 3
'image normale 1er item
'image normale 2e item
DATA &X0000000000000000
DATA &X0000000000000000
DATA &X0000000000000000
DATA &X0000000000000000
DATA&X0000000000000000
DATA &X0000000000000000
DATA &X0000000000000000
DATA&X00000001
0000000
DATA &X0000000000000000
DATA&X00000001
0000000
DATA&X00000; i 11
000000
DATA&X00000001
0000000
DATA&X000111111
100000
DATA &X00000001
0000000
DATA&X001111111
i11000
DATA&X00000001
0000000
DATA&X0010011:1
001000
DATA&X00000001
0000000
DATA&X001110000
0111000
DATA&X00000001
0000000
DATA&X0011 ! I 1 ! 1
111000
DATA&X00000011
1000000
DATA&X001111111
! 11000
DATA&X0000011 !
1100000
DATA&X001! 11111
111000
DATA&X00001001
0010000
DATA&X000011111
100000
DATA&X00011001
0011000
DATA &X0000000000000000
DATA&X00001111
1110000
DATA &X0000000000000000
DATA &X00000110
31100000
!
'image sélection 1er item 1
'image sélection 2e item
DATA &X0000000000000011
DATA &X0000000000000000
DATA&X000000000000011 0
DATA &X0000000000000000
DATA&X0000000000001100
DATA &X0000000000000000
DATA&X0000000000011000
DATA &X0000000000000000
DATA&X0000000000110000
DATA&x0100000000000010
DATA&X0000011111100000
DATA&X011000000000011 0
DATA&X0001100110110000
DATA &X0011000000001100
DATA&X0010011110001000
DATA&X0001100000011000
DATA&X0010111100001 000
DATA&X000011000011 0000
DATA&X0011000000001 000
DATA&X0000011001100000
DATA&X0011110000011000
DATA&X0000001111 000000
DATA&X0011111111111000
DATA&X0000000110000000
DATA&X0011111111111000
DATA&X0000001001000000
DATA&X0000111111100000
DATA&X0111 010000101110
DATA &X0000000000000000
DATA&xl 000100000010001
DATA &X0000000000000000
données du sous-menu
DATA 82,84 , 200,12, &H15a,"
sous OPTION 8"
DATA 82,72,200,12, &H15A,"
sous OPTION 7"
DATA 82,60,200,12, &H15A,"
sous OPTION 6"
DATA 82,48,200,12, &H15A,"
sous OPTION 5"
DATA 82,36,200,12, &H15A,"
sous OPTION 4"
DATA 82 , 24 , 200,12, &H15A,"
sous OPTION 3”
DATA 82,12,200,12, &H15A,"
sous OPTION 2”
DATA 82,00,200,12, &H15A,"
sous OPTION 1"
'données du deuxième menu
DATA 10,84,100,12, &HlDa,"
option 8”
DATA 10 , 72,100,12, &HlDa,"
option 7"
DATA 10,60,100,12, &H1DA,"
option 6"
DATA 10,48,100,12, &HlDa,"
option 5"
DATA 10,36,100,12, &HlDa,"
option 4"
DATA 10,24,100,12, &H1DA,”
option 3"
DATA 10,12,100,12, &HlDa,"
option 2"
DATA 10,00,100,12, &HlDa,"
option 1"
'données du premier menu
DATA 12,88,100,12, &h9b,"
OPTION 8”
DATA 12,76,100,12, &h9b,"
OPTION 7”
DATA 12,64,100,12, &h9b,"
OPTION 6"
DATA 12,52,100,12, &h9b,"
OPTION 5"
DATA 12,40,100,12, &h9b,”
OPTION 4"
DATA 12,28,100,12, &h9b,"
OPTION 3"
DATA 12,16,100,12, &h9b,"
OPTION 2"
DATA 12,00,100,12, &h9b,"
OPTION 1"
'données du menu graphique DATA 10,10,16,16, &hlc, "L"
DATA 10,26,16,16, &hlc, "C"
LE 3D EST ANIME
INITIATION
Ce mois-ci, je vous propose du 3D animé. En effet, maintenant que nous avons tous les outils nécessaires à l’affichage d'un objet 3D sur l’écran de notre AMIGA, nous allons étudier les moyens efficaces nous permettant de l’animer. Vous vous êtes sans doute rendu compte que l’animation proposée le mois dernier était lente et peu satisfaisante du point de vue visuel, li y a deux raisons a cela. Le recalcul systématique de la matrice de projection en double précision est inutile et très coûteux en temps de calcul. Le tracé et l'effacement sur un écran standard Intuition est visible. Nous allons essayer de résoudre ces deux problèmes,
AFFICHAGE SUR ECRAN “DOUBLE BUFFER”
Au niveau de l’affichage, nous devons créer un écran accessible rapidement aux routines de tracé et où l’on puisse afficher et effacer un objet non pas ligne par ligne (ce qui crée un phénomène de scintillement disgracieux) mais en une seule fois.La solution est simple. On crée un écran avec deux zones de tracé, et l’on écrit dans une des zones pendant que l’on affiche l’autre. On permute ensuite les deux zones et le tour est joué !!. C’est ce que l’on appelle un écran “double buffer”.
Pour créer un écran “double buffer’’ plus question d’utiliser Intuition dont la structure ralentit notablement les routines de tracé. Nous allons créer notre écran directement à l'aide des fonctions de la bibliothèque “Graphie.library”.
L’AMIGA crée un écran à partir des instructions que vous lui donnez. Ces instructions doivent être organisées sous la forme d’une structure dénommée “View". A un “View” on associe une ou plusieurs zones d’affichage dénommées “ViewPort". Il est à noter que plusieurs ViewPort de résolutions et de types différents peuvent cohabiter sur le même View. Chaque ViewPort est défini par sa taille, sa position sur le View, son mode de visualisation, sa table de couleurs et un pointeur sur une première structure “Raslnfo”. Chaque structure Raslnfo contient des informations concernant une des “BitMaps” (zone de traçage) liée au ViewPort. (Position par rapport au View et pointeur sur la BitMap). Une BitMap est quant à elle définie par sa taille (horizontale et verticale) et le nombre de “bitplanes” qu'elle contient. Les structures Raslnfos étant comme les ViewPorts chaînées entre elles.
A partir de cette brève description de principe, comment allons- nous définir notre écran “double buffer”. Nous allons commencer par déclarer un View et ViewPort soit : struct View view ; struct ViewPort viewport ;
Comme nous avons besoin de deux zones de traçage (2 buffers) il faut déclarer deux structures Raslnfos et deux BitMaps : struct Raslnfo rasinfos[2] ; struct BitMap bitmaps[2] ;
Maintenant il ne nous reste plus qu’à initialiser tout cela (voir la fonction void ouvrecran ()). Donc on initialise le View grâce à lnitView(&view) et le ViewPort avec lnitVPort(&viewport).On associe le ViewPort au View : view.viewport = &viewport et on sélectionne le mode associé au View : view. Modes = MODE.
On initialise les deux BitMaps à l’aide de la fonction lnitBitMap(&bitmap[i],profondeur,largeur,hauteur). On initialise les deux structures Raslnfos (cf listing) et on remplit la structure ViewPort (c’est très simple). Pour la table des couleurs on commence par réserver une zone pour cette table. Viewport.ColorMap = (struct ColorMap*)GetColorMap(COLOR);
et ensuite on charge cette table dans le ViewPort grâce à Load RGB4(&viewport,&colortable[0],COLOR);
Il nous reste à réserver les zones mémoires nécessaires aux deux bitMaps et à remplir ces zones avec zéro. On alloue chaque plan de la BitMap à l'aide de la fonction AllocRaster(lar- geur,hauteur) et on les met à zéro à l’aide du Blitter avec :
BltC lear((U B YTE*)bitmap [i]. Planes[i], RASSIZE(largeur, hauteur) ,0) ; Bien, maintenant que nous manque-t-il pour créer notre écran ? Déjà nous n’avons pas de crayons pour écrire dans nos bitmaps. Pour combler ce manque il nous faut définir 2 structures "RastPort” (une par BitMap) qui servent à écrire dans la mémoire. Pour chaque RastPort on appelle lnitRastPort(&rastport) et on associe au RastPort une BitMap : rastport[i]BitMap = &bit- map[i].
Ensuite il faut préparer le double buffer pour l'affichage,c'est-à- dire qu’il va falloir créer deux copperlists différentes, une associée à chaque buffer. La séquence est la suivante :
MakeVPort (&view, &viewport) ;
MrgCop (&view) ;
génère la première copperlist dont on va stocker les pointeurs dans L0F[DB1] et SHF[DB1], On change dans le ViewPort le pointeur sur la structure Raslnfo. C’est-à-dire que l’on pointe sur la structure 2.
Viewport. Raslnfo = &rasinfo[DB2];
rasinfo[DB2].Next = &rasinfo[DB1] (on réalise le chaînage).
On remet NULL les 2 morceaux de copperlist afin de les faire
régénérer par l’AMIGA.
View. LofCprList = NULL
view SFCprlist = NULL
MakeVPort (&view, & viewport) ;
MrgCop (&view) ;
génère la deuxième copperlist, dont on stockera également les pointeurs dans L0F[DB2] et SHF[DB2],
C’est presque terminé. Maintenant il ne nous reste plus qu’à regarder le programme principal.
1 - On appelle lnit() qui ouvre la bibliothèque graphique "Graphic.library” et sauvegarde l’écran courant.
2 - On charge l’objet courant à l’aide des fonctions charge- point() et chargeligne().
3 - On stocke dans deux tableaux les valeurs des sinus et cosinus par degré afin d'éviter de les recalculer à chaque passage.
4 - On appelle la fonction ouvrecran() qui initialise notre View ;
5 - On calcule une première fois l’objet (rotationsf) et affiche()).
6 - Dans la boucle principale (que l’on interrompt en appuyant sur le bouton de gauche de la souris).
6a - On définit le RastPort que l'on va utiliser (on écrit dans la zone mémoire qui n’est pas affichée).
6b - On incrémente les deux angles de rotation.
6c - On fait tourner l'objet et on l’affiche.
6d - On affiche l’écran qui vient d’être dessiné, et on recommence en changeant de Rastport.
7 - Une fois sorti de la boucle on recharge l'ancien écran : (LoadView (écran-sauvegardé)) ;
et on libère tout ce que l’on a alloué (libère ()).
Avec cette méthode l’animation devient fluide, il ne nous reste plus qu’à accélérer le calcul de la fonction rotationQ.
NOUVELLE FONCTION rotationQ
jDDElD HBHP
Pour diminuer les temps de calcul l'idée est simple, éviter le recalcul des sinus et cosinus à chaque fois. Pour ce faire on stocke dans deux tables sinus [360] et cosinus [360] les valeurs des sinus et cosinus tous les degrés et on les stocke sous forme de float. Ensuite on multiplie dans la fonction rotationQ les coordonnées par les valeurs associées de ces tables et on gagne du temps.
SOUS LATTICEV 5.00.
Une autre méthode que j’utilise avec le Lattice V 5.00 pour accélérer le calcul est d’utiliser la bibliothèque de fonctions "Mathffp. Library”.
Cette bibliothèque utilise le format de calcul “Fast Floatingpoint" de MOTOROLA qui permet un gain de temps au dépens de la précision (qui n’est nullement importante ici).
On compile donc le programme anim.c avec :
lc. ff.lcf anim.c,
et le tour est joué. Je ne sais si cela se fait automatiquement à la compilation sous les versions antérieures du Lattice ou sous Manx. Il vous reste toutefois la possibilité de les utiliser en appelant directement les fonctions de la bibliothèque.
A noter qu’il est nécessaire d’avoir dans le tiroir Libs: la bibliothèque “Mathffp.Library” pour que le programme fonctionne.
LES FICHIERS OBJET
Les fonctions chargeligne() et chargepoint() ayant été modifiées les tableaux de points et de lignes ont été également modifiés. Un exemple valant mieux qu’un grand discours, voici l’exemple d'une pyramide à base carrée.
“point.dat”
5 8 3 4
0 0 100 0 1 4 1
- 50 50 0 0 2
50 50 0 0 3
50 -50 0 0 4
- 50 -50 0 1 2
“ligne.dat” 2 3
CONCLUSION
Le programme est disponible en source et exécutable sur 3615 Comrev et enfin, si vous voulez en savoir plus sur la programmation des écrans à l’aide de la “Graphie.Library”, je vous conseille deux ouvrages : le “ROM KERNEL MANUAL’’ en anglais qui est la référence de COMMODORE pour le programmeur et l’excellent livre de Micro Application : “Graphisme sur AMIGA”, où vous trouverez dans la partie consacrée au langage C de nombreuses explications avec des exemples très didactiques sur ce sujet.
Herr Doktor Von GlutenStimmellmDorf.
PROGRAMME D’ANIMATION D’UN OBJET DANS L’ESPACE
Utilisation d'un écran double buffers include "stdio.h"
include "math.h" ffinclude "exec types.h" ffinclude "graphics gfx.h"
ffinclude "graphics rastport.h" ffinclude "graphics copper.h" ffinclude "graphics view.h" ffinclude "graphics gels.h" ffinclude "graphics regions.h" ffinclude "graphics clip.h" ffinclude "exec exec.h” ffinclude "graphics text.h" ffinclude "graphics gfxbase.h” ffinclude "hardware draabits.h' ffinclude "hardware custom.h" ffinclude "hardware blit.h" ffinclude "devices keymap.h"
define DB1 0 define DB2 1 de!ine PLAN 1 define COLOR 2 define HOREONT 640 define VERT 512 define MODE HIRESILACE UWORD dbuff[2] = DB1.DB2I; int bascule ; * variable permettant le passage d'un écran à l'autre 7 int i;
1' nombre de bitplanes 7 * nombre de couleurs 7 * largeur de l'écran 7 * hauteur de l'écran 7 * mode de visualidation 7
strud View view; struct ViewPort viewport; struct Raslnfo rasinfo[2]; struct BitMap bitmap[2]; struct RastPort rastport[2J; struct GfxBase *GfxBase;
struct View *écran_sauvegarde ; * View pour la sauvegarde de l'écran courant 7 UWORD colortablefCOLOR] = 10x000,0x77F 1 ; * table des couleurs 7 char *bouton_gauche = (char *) OxbfeOOl; float sinus[360],cosinus[360]; * table des sinus et cosinus 7 struct cprlist *LOF[2]; * table de sauvegarde des CopperList pour 7 struct cprlist *SHF[21; * passage d'un écran à l'autre 7 voidinit(),ouvrecran(),chargepoint(),chargeligne():libere(),cree_ecran(); voidinit__table(),rotationQ,afficheQ;
SHORT pointEt 100121; float point3D[ 10013] ;
SHORT *ligne[ 10012]; int nbrpoint.nbrligne;
SHORT alpha = 0 ,teta = 0; int va,vt;
char nomlignel 1 Oolnompointf 1001;
Programme principal void mainO
I
initO;
printffnom du fichier de point : "); scanf("%s",nompoint); printf("nom du fichier de ligne : "); scanf("%s",nomligne);
printf("valeur de la vitesse V(alpha): "); * vitesse angulaire 7' scanf("%d",&va); * en degrs de alpha 7 prinCvaleur de la vitesse V(teta) : "); * et de teta 7 scanf("%d",&vt); printf("%d %d",va,vt); chargepointQ; chargeligneO; init_table();
ouvrecranO;
SetAPen(&rastport[dbuff[DB 1 ]], 1 );
SetAPen(&rastport[dbuff[DB2]], 1 ); rotationQ; afficheO; bascule = 0;
while(!((‘bouton_gauche & 0x40)-64)) * test le bouton gauche 7 I
SetRast(&rastport[dbufffbascule]],0); alpha += va; if(alpha >= 360)
alpha = 0; teta += vt; if(teta >= 360) teta = 0; rotationO; afficheO;
cree_ecran(&view,bascule); * passage d'un buffer l'autre * bascule A= 1;
1
LoadView(ecran_sauvegarde); * récupération de l'écran sauvegard * libereO;
1
*Init() Ouvre la bibliothèque et sauvegarde l'ancien écran* void init()
(
if( GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0)) == NULL) exit(l);
ecran_sauvegarde = GfxBase->ActiView; * sauvegarde de l'écran en cours 7
)
*chargepoints() charge la table des points sur disque* void chargepointO I
FILE *fich,*fopen(); inti;
fich = fopen(nompoint,"r"); iftfich == NULL)

printff'Problème d'ouverture du fichier Point.datXn"); exit(FALSE);
1
else
I
fscanf(fich,"%d",&nbrpoint);
pnntfC'Chargement de la structure POINT en cours... n"); for (i = 0; i nbrpoint;i++)
I
fscanf(fich,"%f %f %f ",&point3D[i][0],&point3D[iI 1 ],&point3D[i][2]);
printf("IPointP(%d) : X = %f,Y = %f,Z=
%fl n",i,point3D[i][0],point3D[i][ 1 ],point3D[i][2]);
fclose(fich);
1
*chargeligne() charge les lignes sur le disque* void chargeligneO (
FILE *fich,*fopen(); int i,origine,extreme; fich = fopen(nomligne,”r"); iftfich == NULL)
(
printfC'Problème d'ouverture du fichier ligne.datW); exit(FALSE);
!
Else
1
fscanf(fich,"%d",&nbrligne);
printff'Chargement de la structure LIGNE en cours.„ n“); for (i = 0; i nbrligne;i++)
I
fscanf(fich,"%d%d",&origine,&extreme); ligne[i][0] = &pointE[origine][0]; lignefill] = &pointE[extreme][0]; printf ( " I Ligne(%d) : (P%d,P%d)l n",i, origine, extreme);
fclose(fich);
1
*ouvrecran() initialise le double buffer et ouvre un écran* void ouvrecranO
InitView(&viéw); * initialisation de la structure View * InitVPort(&viewport); * initialisation de la structure ViewPort * view.ViewPort = &viewport; * on associe le ViewPort au View * view.Modes = MODE;
InitBitMap(&bitmap[DBl],PLAN,HOREONT, VERT) ; * initialisation des * InitBitMap(&bitmap[DB2],PLAN,HORIZONT,VERT) ; * deux BitMaps* for ( i=0;i 2;i++) * initialisation des deux Raslnfos *
I
rasinfo[i]BitMap = &bitmap[i]; rasinfoîiî.RxOffset = 0; rasinfo[i].RyOffset = 0; rasinfoiij.Next = NULL;
1
viewport.DxOffset = 0; viewport.DyOffset = 0; viewport.DWidth = HORIZONT; viewport.DHeight = VERT; vi ewport.RasInfo = &rasinfo[DB 1 ]; viewportModes = MODE; viewport.Next = NULL;
viewport.ColorMap = (struct ColorMap *)GetColorMap(COLOR); LoadRGB4(&viewport,&colortable[0],CÔLOR); for ( i=0;i PLAN;i++) * Allocation mémoire pour les BitMaps *
(
if ((bitmap[DB 1 ].Planes[i] = (PLANEPTR)AllocRaster(HORIZONT,VERT)) == NULL) exit(2);
BltClear
((UBYTE *)bitmap[DBl].Planes[i],RASSEE(HOREONT,VERT),0);
I
for ( i=0;i PLAN;i++)
(
if ((bitmap[DB2].Planes[i] = (PLANEPTR)AllocRaster(HOREONT,VERT)) == NULL) exit(3);
BltClear
((UBYTE *)bitmap[DB2].Planes[i],RASSEE(HOREONT, VERT),0);
1
for i=0;i 2;i++) * Initialisation des deux RastPorts *
I
InitRastPortf&rastportfi]) ; rastport[i].BitMap = &bitmap[i];
)
MakeVPort(&view,&viewport); * Création du premier écran MrgCop(&view);
LOFtDBl] = view.LOFCprList ; * sauvegarde des CopperList associe * SHFtDBl] = view.SHFCprLîst; * cet écran * viewport.RasInfo = &rasinfo[DB2]; rasinio[DB2].Next = &rasinfo[DB 1 ];
view.LOFCprList = NULL; * remise zéro des CopperList pour cration * view.SHFCprList = NULL; * du deuxième écran * MakeVPort(&view,&viewport); * Création du deuxième écran * MrgCop(&view);
LOF[DB2] = view.LOFCprList; * sauvegarde de la deuxième CopperList *
SHFDDB2] = view.SHFCprList ;
1
*libere() libéré la mémoire utilise* void libereO
f
for(i = 0;i PLAN;i++) * libère les BitMaps *
FreeRaster(bitmap[DB 1 ].Planes[i],HORIZONT,VERT) ; for(i = 0;i PLAN;i++)
FreeRaster(bitmap[DB2].Planes[i],HORIZONT,VERT); FreeColorMap(viewport.ColorMap) * libère la table des couleurs * FreeVPortCopListst&viewport); * libère la CopperList courante *
FreeCprList(LOF[DB 1 ]); * libère les CopperLists sauvegardes *
F reeCprList(SHF[DB 1 ]);
FreeCprList(LOF[DB21);
FreeCprList(SHF[DB2]);
CloseLibrary(GfxBase); ‘referme la bibliothèque graphique 7
p|BBBB BBBD
double rad ; rad = 2*PI 360 ; for (i=0;i 360;i++)
(
sinusti] = (float)sin((double)(rad*i)) ; cosinusti] = (float)cos((double)(rad*i)) ;
view->LOFCprList = LOFlbascule] ; * changement d'écran * view->SHFCprList = SHF[bascule] ;
LoadView(view);
WaitTOFO; * attente de début de trame *
1
‘afflcheO affiche l'objet à l'écran*
void afficheO ‘Routine d'affichage classique *
(
inti;
for(i=0;i nbrligne;i++)
1
Move(&rastport[dbuff[bascule]],ligne[iI0][0],ligne[i][0][ 1 ]) ; Draw(&rastport[dbuff[bascule]],ligne[i][ 1 ][0],ligne[i][ 111]);
1
1
‘initjable initialise la table des sinus et cosinus* void initJableO (
inti;
*rotation() applique une rotation suivant y et z* void rotationO (
inti;
short Offx = HOREONT 2;
short Offy = VERT 2;
for(i=0;i nbrpomt;i++)
(
pointE[i][ 1 ] = Offy-(SHORT)(point3D[iIO]*sinus[teta]*cosinus[alpha] +point3D[i][ 1 ]*sinus[teta]*sinus[alpha]+point3D[iI2]*cosinus[teta]) ;
pointE[i][0] = Offx-(SHORT)
(-point3D[i][0] sinus[alpha]+point3D[i][ 1 ]*cosinus[alpha]) ;
COURRIER : C UNE REPONSE
En examinant l’important courrier suscité par les articles sur le 3D en C et d’autres publications de mes confrères, les questions qui reviennent le plus souvent concernent l’utilité de passer par les bibliothèques de fonctions (library) disponibles dans l’environnement AMIGA pour accéder aux routines systèmes. Je vais donc faire le point sur ce sujet.
Une bibliothèque de fonction (library) est un ensemble de routines, que votre application peut utiliser et qui vous déchargent d’un certain travail, en général la programmation de fonctions de bas niveau, (par exemple la gestion des ressources). Ces bibliothèques résident soit en ROM (ex : graphics.library, Intuition, library), soit sur disque (mathtrans.library, icon.library). (A ce sujet rien ne vous empêche de créer les vôtres).
Etudions maintenant l’accès à ces routines et plus particulièrement, celles intégrées en ROM. Les différentes routines systèmes sont positionnées de manière séquentielle dans la ROM. On peut donc accéder directement à une fonction, quelle qu’elle soit, pour peu que l’on connaisse l’adresse de début de la routine (instruction JSR en assembleur ou par un pointeur de fonction en C). Mais cette méthode, utilisée (malheureusement) par certains programmeurs peu scrupuleux, est très dangereuse. En effet, l’adresse physique de cette routine peut évoluer d’une révision de système à l’autre (même si les concepteurs de l’AMIGA font tout pour éviter cela, c’est parfois obligatoire) et votre programme qui fonctionnait très bien va aller rendre visite au GURU parce qu’il pointe désormais n’importe où dans la ROM et non plus sur la routine prévue.
Pour éviter cela, on va utiliser un adressage indirect et c’est là que la notion de bibliothèque va servir. Chaque série de routines est organisée en bibliothèque suivant un thème précis (exemple graphics.library contient les routines graphiques). La bibliothèque principale est l’Exec.Library. En tête de cette bibliothèque, positionnée à une adresse absolue immuable, on trouve une table de pointeur. Il s’agit de pointeurs sur les fonctions d’Exec et sur les autres bibliothèques de la ROM. L’accès aux fonctions d’Exec se fait via cette table.
Par contre, l’accès aux fonctions des autres bibliothèques nécessite une étape supplémentaire, le chargement de la table de pointeurs lié à cette bibliothèque. Pour ce faire on utilise la fonction OpenLibraryO en lui passant comme paramètres le nom de la bibliothèque et son numéro de version. Une fois cette table chargée on accède aux fonctions, comme pour Exec. Dès lors, il n’y a plus de problème de compatibilité car à chaque révision de système la table des pointeurs est aussi remise à jour.
Une fois votre application terminée, il ne faut pas oublier de refermer les bibliothèques ouvertes à l’aide de CloseLibraryO avec comme paramètre l’adresse de la table des pointeurs de la bibliothèque.
Dans les différents programmes de la série le "3D C facile" des exemples d’ouverture et de fermeture des bibliothèques sont fournis. J’espère que cela répond à vos questions.
Le temps qui m’était imparti étant écoulé je vous donne rendez- vous dans un prochain numéro pour une étude des bibliothèques résidentes sur disque et la manière de créer les vôtres.
Herr Doktor von GlutenStimmellmDorf.
Pour aller encore un peu plus loin, plus vite, plus haut et plus fort avec ce superbe basic qu'est le GfA 3, nous allons de ce pas et sans plus tarder nous concocter un petit moniteur de disquette, type PCTools pour les ceusses qui connaissent.
GfA D-Mon
Bon, évidemment, il est hors de question d’atteindre la qualité ni la puissance de ce soft, sinon on en a pour jusqu’à la Saint- Glinglin, qui si je ne m’abuse, Docteur, doit tomber à peu près le jour ou elle arrivera. Mais on peut toujours profiter de l'occasion pour approfondir nos connaissances en GfA d’une part, et en AmigaDOS d’autre part.
Malgré son nom ridicule et d'une banalité consternante, GfA D- Mon permet la manipulation plus ou moins aisée des fichiers et répertoires, ainsi que des secteurs de la disquette. Le nombre de fonctions est somme toute assez réduit, mais il tient qu’à vous et à votre courage de l’augmenter substantiellement. Il va de soi qu’un tel utilitaire étant tout de même plutôt conséquent, nous ne pourrons nous contenter d’un seul numéro de Commodore Revue pour tout voir d’un seul coup. C’est pourquoi je vous demande l’impossible effort de nous suivre durant quatre mois (cinq, si l’on compte les vacances), au terme desquels on passera à autre chose, chose qu’il serait intelligent de me préciser si vous avez des idées ou envies particulières. Pour cela, une seule adresse : la nôtre.
PREMIERE PARTIE
Dans ce premier volet de GfA D-Mon, nous allons nous occuper de ce qui est finalement le plus difficile à réaliser, à savoir l’interface utilisateur (menus et tout le bastringue). Le listing fourni ci- après fonctionne tel quel, et permet déjà, car l’on connaît votre impatience légendaire, de faire mumuse avec une partie de la mémoire choisie arbitrairement (c’est une fonction d’édition, quoi). Seule l’édition en mode hexadécimal est - pour l’instant - implémentée, et les modifications ne sont pas prises en compte. Encore une fois, c’est juste pour calmer votre impatience qui, je crois l’avoir déjà dit quelques lignes plus haut, est légendaire. Aucune difficulté majeure n'est à signaler dans cette première partie, mais quelques remarques judicieuses sont à formuler :
- des modifications seront par la suite apportées à certaines procédures données ici. De même, toutes les procédures utiles du programme ne sont pas listées. Chaque chose en son temps ;
- des modifications seront également apportées aux libellés des menus, qui ne seront pas ce qu’on appelle très "parlant” ;
- toute suggestion en cours de route est la bienvenue, et franchement, je serais très déçu que vous n’en profitassiez point ;
- il est presque minuit, et je vais rater mon dernier métro.
RAPIDE APERÇU DE CE QUI A DEJA ETE FAIT
Les routines et procédures utilisées ici n’ont rien d’extraordinaire en soi ni même en satin. Simplement, vous serez peut-être content de trouver celle d’édition hexa, qui est toujours problématique pour qui ne veut pas trop s’embêter. Allez donc jeter un œil sur la procédure “edithex()” (qui elle, soit dit en passant, porte bien son nom).
Le programme ouvre son propre écran en 640 x 256 avec 4 cou
leurs, ainsi que sa propre fenêtre de type BACKDROP, BORDER- LESS et ACTIVATE, le tout au moyen des commandes standard du GfA Basic, OPENS et OPENW. Le menu est lui aussi standard puisqu’il résulte de la commande MENU M$ (). Attention dans la procédure “mmenu”, la ligne qui commence par “ON m% GOSUB” est imprimée sur plusieurs lignes pour des besoins de mise en page, mais doit bien entendu être tapée comme une seule. La fonction d’édition s’obtient par le menu Fichier, option Editer (ou Amiga droite+M (ben oui, quoi, M comme “ Modifier” (le E est réservé pour autre chose (zut, je ferme combien de parenthèses, là ? Tant pis, je me lance))))
ATCHAO BONSOIR
Je ne vous retiens pas plus longtemps, vous pouvez derechef commencer à tapez ces quelques lignes. Comment, ce n’est pas encore fini ?
Etienne Mouratila
'GfA D-Mon Vl.l 'init
REPEAT ON MENU UNTIL fini!
MENUKILL CLOSE W 1 CLOSES 1 EDIT
PROCEDURE mmenu LOCAL m%
m%=MENU(0)
MENUKILL
Onm% GOSUBfileview,fileediUilerename,fileerasexciao,r,r,dirread,dirfmd,r,dir- sort,r,r,diskedit,diskfind setmenu RETURN
PROCEDUREr 'Procédure vide !!
RETURN
PROCEDURE ciao ALERT 0,"Etes-vous sûr ?",L”OuilNon",r%
Ifr%=l
fini!=TRUE
ENDIF
RETURN
* Les procédures suivantes seront * 'complétées au fur et à mesure! '
PROCEDURE fileview selectfileC'Fichier à visionner ?") IF LEN(fichier$ )
CLEARW 1 ENDIF RETURN
PROCEDURE fileedit selectfileC'Fichier à éditer ?")
IF LEN(fichier$ )
CLEARW 1 ENDIF RETURN
PROCEDURE filerename
selecifile("Ancien nom ?")
ELSE F page&
IF LEN(fichier$ )
CLRpage&
ENDF
SUBpos&,16
RETURN
showmem(block%,page&)
PROCEDURE fileerase
lig&=15
selecffileC'Fichier à supprimer ?")
ENDF
F LEN(nchier$ ) .
CASE 66 ! Rêche bas
fichier$ =path$
Flig& 15
ENDF
ADDpos&,16
RETURN
INC lig&
¦
ELSE F page&=0
PROCEDURE dirread
ADDpos&,I6
RETURN
INC page&
PROCEDURE dinina
showmem(block%,page&)
RETURN
lig&=0
PROCEDURE dirsort
ENDF
RETURN
CASE 67 ! Rêche droite
F col& 45
PROCEDURE diskedit
INCpos&
RETURN
ADDcol&,3
PROCEDURE disknnd
ELSEFlig& 15
RETURN
INC lig&
'
col&=0
PROCEDURE ediimem(biock%)
INCpos&
' Edition hexa asdi d'un block (512 octets)
ELSEFpage&=0
LOCAL f!,hex!,pos&,col&,lig&,page&,a$ ,h$
INC page& TWCI rVD Â
f!=FALSE ! Rag fini
ILVN- JVJoCX.
Showmem(block%,page&)
hex!=FALSE ! Rag édition hexa asdi
col&=0
CLRpage& ! Page affichée (0 1)
lig&=0
ENDF
CLRpos& ! Adresse sous le curseur
CASE 68 ! Rêche gauche
CLRcol&,iig& ! Position du curseur a l'écran
Fcoi&
showmem(block%,page&) ! Affiche l'écran
DECpos&
«
SUB col&,3
REPEAT
ELSE F lig&
COLOR1
DECpos&
TEXT112,161,"$ "+HEX$ (pos&,4)
col&=45
TEXT 242,161 ,HEX$ (PEEK(block%+pos&),2)
DEC lig&
TEXT 266,161,CHR®PEEK(block%+pos&))
ELSEFpage&
COLOR 2
CIRpage&
'
showmem(block%,page&)
' Simule un curseur
DECpos&
GRAPHMODE 3
lig&=15
Fhex!
Col&=45
PBOX504+((col8t 3)’8),23+(lig&‘8),512+((col& 3)*8),31+Ûig&*8)
ENDF
ELSE
CASE 83 ! Shiftbas
PBOX95+(col&*8),23+(lig&'8),112+(col&*8),31+(iig&*8)
F page&=0
ENDF
INCpage&

ADDpos&,256
'Attend une touche
showmem(biock%,page&)
a$ =@getkey$
ENDF
'
CASE 84 ! Shift haut
'Eiîace le curseur
Fpage&
Fhex!
DECpage&
PBOX504+((col& 3)*8),23+0ig&*8),512+((col& 3)*8),31+0ig&*8)
SUBpos&,256
ELSE
showmem(block,page&)
PBOX 95+(coi&*8),23+(lig&*8),l 12+(col&*8),31+(lig&*8)
ENDF
ENDF
CASE 126 Iheip
GRAPHMODE 1
' Fait clignoter l'écran. On peut trouver autre chose!

~DisplayBeep(SCREEN(l))
SELECT ASC(a$ )
ENDSELECT
CASE 9 !Tab
'
hex!=NOThex!
DEFAULT
GRAPHMODE 3
Fhex!
TEXT 504,19,"ASCn"
TEXT 504+((col& 3)’8),30+(lig&*8),a$
TEXT 96,19,"Hexadécimal''
TEXT 95+(coi&*8),30+(lig&*8),HEX$ (ASC(ci$ ),2)
GRAPHMODE 1
' POKE block%+pos& ASC(a$ )
CASE 27 lESCape
ADDcol&,3
f!=TRUE
INCpos&
CASE &H9B ! Touche spédale
ELSEF@ishex(a$ )
SELECT ASC(RIGHT$ (a$ ,l))
b$ =a$
CASE 65 ! Rêche haut
TEXT 95+(col&*8),30+(lig&*8),UPPER$ (h$ )
Flig&
'
SUBpos&,16
GRAPHMODE 3
DEC lig&
PBOX103+(coi&"8),23+(iig&’8),112+(col&*8),3î+(lig&*8)
REPEAT
a$ =@getkey$
UNTE@ishex(a$ }
PBOX 103+(col&*8),23+(Hg&*8), 1I2+(col&*8),31+(lia&*8) GRAPHMODE !
H$ =h$ +cs$
TEXT 95+(col&*8),30+Gig&'8),UPPER$ (hS) TEXT504+((col& 3)*8),30+(Kg&*8),CHR$ (VAL("&H"j-h$ )) ' POKE block%+pos&,VAL("&h"+h$ )
¦ ADDco!&,3 !NCpos&
ENDF IF col&>45 Flia& 15 ÏNClig& ¦ coI&=Ô ELSE F page&=0 INC page&
showmem(block%,page&)
col&=0
lig&=0
ENDF
ENDF
ENDSELECT
UNTELf!
CLEARW !
RETURN
PROCEDURE showmem(d%,p&)
LOCAL i&,j&,a&,l&,aS,b$
COLOR2 60X0,11,639,164 TEXT 8,19,"Offset"
TEXT 96,19,"Hexadécimal"
¦ÏEXT 504,19,"ASCII"
LINE 0,21,639,21 LINE 0,153,639,153 TEXT 8,161,"Curseur en TEXT 170,161,"Octet :SO"
TEXT 320,161,"Fichier : "+LEFIS(fichier$ ,29)
1&=30
MULp&,256 ADD d%,p&
FOR i&=0 TO 240 STEP16 b$ ='"'
a$ =HEX$ (p&+i&,8)+" " ! 2 espaces
FORj&=i&TOi&+15 a&=PEEK(d%+j&)
a$ =a$ LHEX$ (a&,2)+" " ! 1 espace
b$ =b$ +CHR$ (a&)
NEXTj&
TEXT8,l&,a$ +" "j-b$ ! 3 espaces
ADD1&.8 NEXTi&
GRAPHMODE 3 TEXT 96,19,"Hexadécimal"
GRAPHMODE I RETURN
PROCEDURE setmenu LOCAL i&
ERASEmSO
DIMm$ (50)
RESTORE m_data FORi&=0TO50 READm$ (i&)
EXTTFm$ (i&)="***"
NEXTi&
m$ (i&+l}=""
MENUmSO
'Menu Fichier MENU KEY 1,86 IVOsucdiser)
MENU KEY 2,77 ! Mtodifier)
MENU KEY 3,82 ! Renommer)
MENU KEY 4,68 Idfeleter)
MENU KEY 6,81 !Q(quitter)
'MenuDirectory MENU KEY 9,76 !L(ire)
MENU KEY 10,70 !F(ind)
MENU KEY 12,84 !S(ort)
'MenuDisauette MENU KEY15,69 ! E(diter)
MENU KEY 16,67 !C(hercher)
m_data:
DATA Fichier, Visualiser, Editer, Renommer, Effacer,-
DATA Directory, Lire, Rechercher,-, Trier,
DATA Disquette, Editer, Rechercher DATA***
RETURN
PROCEDURE selecffilefl®
FILESELECT t$ ,"Ok chef" ,path$ , fichier®
F LEN(fichier$ )
FrlNSTR(fichiei$ ,T)
path$ =LEFB(fichier$ ,RINSTR(fichieiS,T))
ELSE F RINSTRtSchieiS,":") path$ =LEFT$ (fichier$ ,RINSTR(fichier$ ,":"))
ENDF
ENDF
RETURN
PROCEDURE init ' Ouvre l'écran et la fenêtre OPENS1,0,0,640,256,2,&H8000 OPENW 1,0,0,640,256,0.&H1900 TTILES l,"GfA D-Mon VU"
'Initialise la palette SETCOLORO.&HO SETCOLOR 1.&HEEE SETCOLOR 3,&HF SETCOLOR 2,&H789 COLORI
' Variables globales
path$ ='"'
fichiei$ =""
fini!=FALSE
tril=EALSE
'Initialise le menu
setmenu
ON MENU GOSUB mmenu ' Recherche les devices connectés cherche_devices RETURN
PROCEDURE cherche_devices RETURN
FUNCTION aetkeyS LOCAL k$
REPEAT
k$ =MEY$
UNTLLENW)
WHEUELENÜNKEY©
WEND RETURN k$
ENDFUNC
FUNCTION ishex(c$ )
F INSTR("0123456789ABCDEF",UPPERS(c$ ))=0 RETURN FALSE ELSE RETURN TRUE ENDF ENDFUNC
]_[
APPLICATION
TRIONS DANS LA JOIE ET LA BONNE HUMEUR
M. Sorant, de Vernouillet dans l'Eure-et-Loire, pose cette angoissante question : “je suis intéressé par une routine de tri faisant suite à l’article en assembleur sur la lecture du directory d’une disquette. Merci d’avance”.
Mais comment donc, il suffit de demander.
Il existe plusieurs algorythmes de tri, parmi lesquels on peut citer les plus connus : le Bubble-Sort, le Quick-Sort ou encore le Heap-Sort. Chacun présente des avantages et des inconvénients, qui ne seront pas discutés ici, on n’a pas que ça à faire. Dans notre cas, nous allons nous contenter du Bubble-Sort, car c'est de loin le plus simple à programmer (la preuve : la routine ne fait que 13 lignes I).
La marche à suivre est simple : tous les éléments du tableau à trier sont traités à l’intérieur de deux boucles. La première détermine le plus petit élément figurant entre un élément N et la fin du tableau, en le comparant successivement à tous ceux qui sont derrière lui. Si l’un des éléments comparés s’avère être plus petit que N, on échange les deux et il devient le nouvel N jusqu'à la fin de la boucle, La seconde boucle fait en sorte que la première soit exécutée pour chaque élément du tableau. Ce tri n’est certes pas le plus optimisé, et malgré la vitesse du 68000, il faut plus de 20 secondes pour trier un tableau de 10.000 éléments ! Cela dit, pour de petits tableaux (jusqu’à 1,000 éléments), ie temps nécessaire reste inférieur à la seconde.
Mais trêve de bavardages, voici la routine. Elle attend dans aO, l’adresse du tableau à trier et dans dO, le nombre d’éléments que contient le tableau.
Tri d’un tableau de nombres En entrée :
aO = adresse du tableau dû = nombre d’éléments En sortie : le tableau est trié ! A0,a1 ,d0,d1 et d2 sont modifiés Tri:
subq.w 2,d0 ;dO=Nb éléments-1
;-1 encore pour dbra
Tri1: lea 2(a0),a1 move.w d0,d1 Tn2:
move.w (a0),d2 cmp.w (a1 ),d2 ble.s Tri3 move.w (a1),(a0) move.w d2,(a1 ) Tn3: addq.l 2,a1 dbra d1 ,Tri2 addq.l 2,a0 dbra dO,Tri1 rts
; aO pointe l’élément N ; a1 pointe l’élément N+1
; compare les 2 éléments
; si inférieur,
; échange les deux ; éléments
; prochain élément ; jusqu’à la fin ; prochain N : jusqu'à la fin ; c'est tout !
Telle quelle, la routine trie un tableau de words (16 bits) dans l’ordre croissant, en tenant compte du signe des éléments. Pour trier par ordre décroissant, il faut remplacer l’instruction de saut ble par bge. Pour ne plus tenir compte du signe, il faut la remplacer par bcs pour l’ordre croissant ou par bcc pour l’ordre décroissant. L’adaptation à des tableaux de bytes (8 bits) et de longs (32 bits) est laissée à votre sagacité...
TRAVAIL A LA CHAINE
Pour trier des chaînes de caractères, il faut procéder autrement. Le Bubble-Sort sera également utilisé, mais ce ne seront pas les chaînes elles-mêmes qui seront triées, mais plutôt un tableau de pointeurs sur ces chaînes. En effet, trier directement un tableau de chaînes ASCII relèverait plus de la folie furieuse que de l’initiation à l’assembleur. Avec des pointeurs, tout devient plus facile.
La routine utilisée ne présente pas énormément de différences avec la première. Simplement, elle fait appel à une seconde routine chargée de comparer deux chaînes de caractères entre elles pour déterminer s’il faut ou non échanger les deux pointeurs. Le reste est identique. Le petit programme suivant trie le tableau puis affiche le résultat.
; Exemple de tri alphanumérique ; Par Max ; Même que ouais !
; Fonctions diverses
; (eh, Frédéric, on va pas utiliser les includes pour si peu ?)
OpenLibrary=-552
CloseLibraiy=-414
Wnte=-48
Output=-60
Start:
move.l 4.w,a6 ; Ouvre la dos.library
lea DosName(pc),a1
moveq 0,d0
jsr OpenLibrary(a6)
move.l d0,a6
jsr Output(a6) ; Recherche le canal de sortie
move.l d0,d7
lea TabStr(pc),a0 ; Trie le tableau
moveq 10,d0 bsr.s TriStr
bsr.s PrtTab ; Affiche son contenu
move.l a6,a1
move.l 4.w,a6 ; Ferme la dos.library
jsr CloseLibrary(a6)
rts ; That's ail folks
, ************************************
; Tri d’un tableau de pointeurs sur des ; chaînes de caractères
TriStr: subq.w 2,d0
; Nombre de chaînes-1 ; -1 encore pour dbra
TriS1 : lea 4(a0),a1 move.w d0,d1 TriS2: bsr.s strcmp bpl.s IriS3 move.l (a0),d2 move.l (a1 ),(a0) move.l d2,(a1 )
; a0 pointe l'élément N ; a1 pointe l'élément N+1
; compare les 2 chaînes ; bmî.s pour ordre décroissant ; échange les pointeurs
TriS3: addq.l 4,a1 dbra d1 ,TriS2 addq.l 4,a0 dbra d0,TriS1 rts
; prochain élément ; jusqu'à la fin ; prochain N ; jusqu'à la fin
; Compare deux chaînes de caractères ; Fixe les flags du 68000 en conséquence
strcmp:
move.l (a0),a2 : a2 pointe s1
move.l (a1 ),a3
; a3 pointe s2
cmp1:
move.b (a2)+,d2
beq.s cmpfl
; fin de s1 ?
Move.b (a3)+,d3
beq.s cmpf2
; fin de s2 ?
Cmp.b d2,d3
; caractères identiques ?
Beq.s cmp1
; oui => boucle
bra.s cmpret
; non => chaînes différentes
cmpfl :
;ccr est fixé par la comparaison
tst.b (a3)
; f in de s2 ?
Beq.s cmpret
; oui => chaînes identiques
moveq 1 ,d2
; non => s1 > s2
bra.s cmpret
cmpf2:
moveq -1 ,d2
;s1 s2
cmpret:
rts
, ************************************
; Affiche le contenu du tableau
PrtTab: lea TabStr(pc),a2 moveq 9,d6 lea LF(pc),a3 prt1: move.l (a2)+,a0 bsr.s strlen move.ld7,d1 move.l a0,d2 jsr Write(a6) move.ld7,d1 move.l a3,d2 moveq 1 ,d3 jsr Write(a6) dbra d6,prt1 rts
; Calcule la longueur d'une chaîne dans d3 ; Pourquoi d3 ? Parce que Write()
strlen:
moveq 0,d3
strll:
tst.b (a0,d3.w) ; 0=fin de chaîne
beq.s strl2
addq.w 1 ,d3 ; pas encore atteint
bra.s strll
DosBase:
dc. l 0
; C'est ce tableau qui sera trié ; pas les chaînes elles-mêmes !
TabStr:
dc. l Str5,Str1 ,Str7,Str3,Str8
dc. l Str2,Str4,Str9,Str6,Str 10 DosName:
dc. b"dos.library",0 even
; Et enfin les chaînes en question ; terminées par un 0 comme en C
Str1:
dc. b “Azerty“,0 Str2:
dc. b "AZERTY",0 Str3:
dc. b "Qwerty",0 Str4:
dc. b "Yves Huitric valent mieux qu'une",0 Str5:
dc. b "Meilleurs vœux aux Primas !",0 Str6:
dc. b "Christine aime le cinéma.”,0 Str7:
dc. b "Si j'a Mazue, j'aura pas venu.“,0 Str8:
dc. b "Conducteur Stéphane, Garde à vous !",0 Str9:
dc. b "Nulles, les mangon-démos...”,0 Str10:
dc. b "Gutenmorgen, Herr Doktor“,0 LF:
dc. b $ a,$ a
Et voilà, c’est pas plus difficile que ça. L’adaptation à la routine de lecture de catalogue ne devrait pas poser de problème particulier - enfin, j'espère.
Continuez à envoyer vos demandes de routines à la rédaction, je me ferai un plaisir (si je peux, hein, je suis pas Superman non plus) d’y répondre dans ces colonnes. A plus.
Max
AMIGA500
AMIGA500
H«) K)
+souris
+peritel
3390
PHASE
GALERIE"LESQUARE 93, Avenue du G1 Leclerc 75014PARIS 45 45 73 00
M"AIésia- lOhà 19h Lundi-Samedi
AMIGA2000
H-ecran 1084
- i-carte XT +disqueGVP46Mo
15990
Extension512K
AMIGA500
+
- Pécran 1084
HORLOGE
HROMD
690
AMIGA500
LECTEUR3"1 2
EXTH3TC
890
DIVERS
disquedur20MopourA500
3990 ...510
Nordic Power ...
..850
CREDrr-DÉTAXE
aveccompattoilité
PC
nousconsulter
REPRISE POSSIBLE DE VOTRE ANCIEN MICRO
A500+péritel+ext512K+horloge 3890
A500+péritel+lect ext 3" 1 2 .3890
A500+ 1084S+ext512K+horloge .5990
A500+1084S+ext512K+lect 3" 1 2 ..6590
AMIGA500
AMIGA2000
+écran 1084
+écran 1084
+Deluxe Paint III
- PcaiteXT
+Star LC-10 Couleurs
+Star LC-10
8290
11990
LjCIO ...1890
LclOcoul ....2490
LC24-10 .....2990
SWIFT24 ...3790
AMIGA2000
Carie extension
- Pécran 1084
2 Mo
+carteAT
+Star LC-10 couleur
extensible à 8
15990
3400
VENTE PAR CORRESPONDANCE -PRIX T.T.C.
PACKPHASE
InBEJB HHHP
!m!C,R
i r
PREMIERE !
Roulement de tambours... Voici le premier article de la toute nouvelle rubrique AMOS ! C’est beaucoup d’honneur pour moi de vous faire découvrir le résultat de 16 mois de travail acharné. Une seule page pour commencer, ça n’est pas beaucoup, mais si vous le désirez, la rubrique grandira : écrivez au journal pour réclamer des pages pour l'AMOS (j’ai moi-même envoyé une quinzaine de lettres !). Nous allons commencer doucement, en voyant comment installer et configurer votre AMOS, après bien sûr, quelques news et trucs !
Renvoyez la carte de garantie ! Les utilisateurs français ont le gros défaut de ne jamais renvoyer le coupon de garantie des produits. Pour l'AMOS, forcez-vous à répondre : par retour de courrier, Mandarin vous fera parvenir la troisième disquette AMOS, contenant - entre autres - la version RUN-ONLY (RAMOS) que vous pouvez distribuer, l'éditeur AMAL, l’éditeur de menus, les convertisseurs SONIX et SOUND-TRACKER, SPRITES 600, etc. A partir de la version 1.2, la boîte AMOS contiendra 3 disquettes.
Le contenu du dossier AMOS_SYSTEM. L'AMOS a besoin pour fonctionner de plusieurs fichiers contenus dans le dossier AMOS_SYSTEM. Ce dossier doit impérativement se trouver sur le même disque que AMOS lui-même, dans la racine du répertoire.
Il contient :
- AMOS.Env, le fichier de configuration, sauvegardé par le programme CONFIG.AMOS (voir plus loin !)
- Default.Font, le jeu de caractères texte, utilisé par l’AMOS. Vous pouvez le modifier avec l’utilitaire Font_Convert. AMOS se trouvant sur la disquette PROGRAMME.
- Default.Key, la définition du clavier. Attention, si vous avez hérité d'une version anglaise, votre clavier sera QWERTY ! Pour y remédier, voyez plus loin.
- Mouse.Abk, la banque contenant la définition de la souris et les motifs de remplissage par défaut.
- Defjcon.lcon, l’icône d’un programme AMOS, lorsque vous utilisez le workbench.
- Compact, le compacteur d’images,
- Request, le requester AMOS,
- Music, les routines musicales. Ces trois derniers fichiers sont des EXTENSIONS au basic. Leur code est domaine public. Vous pourrez les modifier. Nous verrons comment dans les prochains articles. Vous pourrez même ajouter vos propres fonctions au basic.
Utilisation du programme CONFIG. AMOS. Ce programme permet de modifier un grand nombre de paramètres de l’AMOS, et ainsi configurer l’interpréteur selon votre désir. Il est entièrement écrit en AMOS (bien sûr), et piloté par menus.
1. Première chose à faire, charger le fichier de configuration : choisir l’option LOAD DEFAULT CONFIGURATION F dans le menu DISC.
2. Changer le clavier ! Si vous avez une version anglaise, votre clavier sera QWERTY. Choisissez l’option New Keyboard dans le menu SET, ouvrez le dossier Keyboards avec le sélecteur de fichiers, puis cliquez sur le fichier Français.Key. Un autre sélecteur
de fichier apparaît alors, cliquez sur Default.Key. Le programme sauve alors votre nouveau clavier. Au prochain chargement, AMOS aura un clavier français.
3. Principaux paramètres de l’éditeur. Dans le menu SET, choisissez l’option “Editor setup". Voici le panneau de contrôle principal de l’éditeur. Voyons quelques options intéressantes : -Save icons with programs ? (sauve une icône avec chaque programme). Si vous choisissez YES, AMOS sauvera l’icône contenue dans le dossier AMOS_System Defjcon.lcon avec chaque programme AMOS.
Attention, n’utilisez pas cette option si vous n’avez pas beaucoup de mémoire, car elle consomme 4K de précieuse RAM ! -Try to close workbench on loading ? (Essaie de fermer le workbench au chargement). Cette option, par défaut sélectionne, économise 40K de mémoire. Vous devez l’inhiber si vous avez un extension mémoire ! -File selector maximum number of files (nombre de fichiers maximum dans le sélecteur de fichier). Si le nombre de fichiers dans un directory est supérieur au nombre choisi, les derniers fichiers ne seront pas affichés ! Les utilisateurs de disque dur devront augmenter cette valeur. - Editor scrolling speed (vitesse de scrolling de l’éditeur). Cette option fixe la vitesse d’ouverture de l'éditeur pour passer au mode direct. Bien que très joli (et très frime ! NDLR) ce scrolling peut sembler pénible à la longue. En choisissant une valeur égale à 256, l’ouverture est instantanée. Ouf ! - Les deux options suivantes règlent la vitesse d'ouverture du sélecteur de fichier (sous l’éditeur, et en mode programme). De la même manière, une grande valeur le fera apparaître plus rapidement.
4. Choisir le nombre de lignes de l’éditeur. Sélectionnez l’option “Screen display setup” dans le menu Set. L’option “Number of lines in edit window” permet d’agrandir ou de rétrécir l’affichage du programme. Vous pouvez monter jusqu’à 26 lignes, si votre moniteur le permet. Vous devrez cependant remonter la position des crans avec les options "Position of function keys” et “Position of editor" le plus haut possible, en fonction de votre moniteur. Notez bien que l’éditeur doit se trouver au moins 56 pixels en- dessous des touches de fonctions ! Inversement, vous pouvez réduire la taille de l’éditeur (principalement pour économiser de la mémoire) jusqu’à 8 lignes.
5. Changer les couleurs, en sélectionnant dans le menu Set les options “Screen palettes". Les couleurs sont réparties de la manière suivante: -Couleur 0 : bords de l’écran - Couleur 1: fond du texte - Couleur 2 : caractères - Couleur 3 : curseur (ou couleur text 2 pour les touches de fonction)
6. Une fois les modifications effectuées, N’OUBLIEZ PAS DE SAUVER votre travail : option “Save configuration” dans le menu DISC!
Mon traitement de texte m'indique déjà plus de 6000 caractères, limite fatidique pour une seule page de rubrique !
Arghhh, j’ai tellement de choses à dire. Et bien nous continuerons l'exploration de CONFIG.AMOS le mois prochain (sur DEUX pages j’espère). En attendant, AMOSsez bien (et retrouvez-moi sur ComRev, Bal Liono.)
F. Lionet
ALIMENTATION DE LABORATOIRE
Ah les vacances... Epoque bénie où loin de tout, vous ne pouviez imaginer que votre humble serviteur travaillait très dur pour vous et cela pour vous concoctez Valimentation qui sert à nos chers montages (montages et non pas montagnes).
Short aucun
Cette alimentation délivre du 12 V et 5 V réguliers, le montage est fort simple regardons tout cela plus en détail. Nous avons besoin d’un transformateur 220 V 2*15 V, qui pourra délivrer 3 A.
Puis d’un pont de diode 3 A (pour redresser la tension sinusoïdale du transformateur en un signal bialternance).
Le condensateur Cl permettra de faire un découplage de l’ensemble, quant au condensateur C2, lui, il filtrera la tension provenant du pont.
Le 78T05 ou 78T12 délivre une tension
régulière à 5V pour le premier et 12V pour le second. La diode D1 permet de protéger contre les court-circuits, le régulateur C3 permet d’avoir un réservoir temporaire de tension, et de filtrer encore le signal de sortie, C4 lui a le même rôle que Cl.
REALISATION PRATIQUE
Donc après avoir fait votre cuivre, vous devrez souder les composants, les brancher, prenez garde de bien isoler la partie 220V de l’électronique.
Vous aurez besoin d’un interrupteur pour couper votre alimentation, de deux fusibles F de 2 à 3A environ, et aussi pour être à la norme, d’un connecteur d’alimentation (celui que vous trouvez dans votre Amiga pour le disque dur), branche le tout et testez avec votre voltmètre.
Olivier Mangon
Liste des composants
interrupteur 220V fusible 2A
B
F
TR
transformateur 220V 2*15V (2 secondaire) 60VA P : pont de diode 3A
Cl : 330nF condensateur
C2 : 2200|iF 25V condensateur
C3 :10 pF 25V condensateur
C4 :10 nF condensateur
D1 : diode 1N5401
U1 : 78T05CT (régulateur 5V 3A)
U2 : 78T12CT (régulateur 12V 3A)
2 radiateurs sk 95-25 SA à mettre au dos des régulateurs.
Coût de revient de ce montage : environ 180 F.
AVIS AUX AMATEURS : Tous ceux d’entre vous qui seraient heureux d’acquérir les futurs montages de short-circuit, pourraient nous écrire afin de se faire connaître et pourquoi pas apporter également des remarques concernant la rubrique.
COMMODORE REVUE SHORT-CIRCUIT 1 bis, rue de paradis 75010 PARIS
Schéma de principe
VUE DE FACE
CüSP
SCHEMA DE PRINCIPE
ALIMENTATION
0. M SCCR11 01.87.98
PRISE
• •••
Ü
jnDEin BHHB
1 I
REQUESTER
Question : Récent lecteur de votre très intéressante revue, je tenais par la présente lettre à vous faire quelques remarques et à vous demander certains renseignements. En premier lieu, les remarques : je me suis penché sur votre série d’articles initiatiques à l’amigaDOS et les ai mis en application, ce qui m’a permis de commencer à bien le comprendre (du moins dans ses commandes essentielles de base) et à le maîtriser quelque peu ; la méthode employée dans vos articles, très pédagogique et progressive, s’est donc avérée tout à fait efficace (du moins en ce qui me concerne, mais je suis sûr de ne pas être le seul). J’ai cependant rencontré certains problèmes, certes résolus pour ce qui est du n° 21 (grâce à l’emploi de la PAO), mais inexpliqués dans le n° 22 et je m’explique : l’emploi des commandes “Make- dirRAM:devs” & suivant (article du n° 22),'après avoir obtenu le clavier français, se soldait systématiquement par un “unknowncommand Makedir”, rendant la poursuite du remplissage de Monboot impossible ; je ne pensais vraiment pas avoir commis d’erreur (j’ai recommencé plusieurs fois le remplissage de Monboot depuis le n° 21), et j’ai donc essayé de contourner la difficulté en rajoutant ou corrigeant par moi-même les instructions nécessaires :
- d’abord, considérant que le système était orienté sur l’unité logique “C: RAM:”, et que le répertoire c de la RAM ne contenait que la commande Assign, l’ordinateur ne pouvait trouver à ce moment-là la commande Makedir ; j’ai donc pensé qu’il fallait le réorienter vers le répertoire c de la disquette à cet instant dans le lecteur, c’est-à-dire le Workbench, par la commande “Assign C: DF0:c” (ce avant d’entrer Makedir RAM:devs).
- ensuite, une fois la série d’instructions de copie (de devs, keymaps, et Setmap) tapée ainsi que Assign C: RAM:, j’ai rentré à la place de “Assign C: SYS:”, qui ne marchait pas non plus, l’instruction “Assign C: DF0:c” encore une fois, ce qui m’a permis de taper sans problème le reste des commandes données dans l’article.
Est-ce que ma correction est valable ? Ou ces problèmes viennent-ils d’une erreur de ma part ? Si ma modification personnelle a en tout cas pu marcher, c’est grâce à vos articles d’initiation qui m’ont fait comprendre l’AmigaDOS... Je tenais par la suite à vous poser deux questions : d’abord, et au sujet toujours de l’initiation au DOS, j’aurai voulu savoir à propos de l’article du n° 23, comment on peut lancer le programme de Preferences d’une autre disquette à partir de Monboot sur laquelle on vient de booter. Ensuite, et dans un tout autre domaine, j’aimerai connaître votre avis sur la qualité et la fiabilité des extensions mémoires proposées par des fabricants autres que Commodore pour l’Amiga
500.
Phillipe BARALI (Marseille)
Réponse : D’abord merci pour les compliments. Ensuite, je vous félicite à mon tour d’avoir su vous débrouiller seul. Mais voilà, si vos modifications sont valables, ce qui est très bien, vous vous êtes heurté à un problème qui n’a pas lieu d’être car l’article de D. Lorre était impeccable (comme toujours). Après réjlexions, je pense que peut être vous avez fait l’erreur suivante :
Au lieu de Copy C:Assign Copy Makedir Echo to RAM:c qui assure immanquablement la présence de Makedir dans RAM:c peut-être avez-vous tapé Copy C:Assign Copy Makedir Echo to RAM:. Ceci peut expliquer le fait que vous n’aviez que Assign dans RAM:c car dans ce cas la commande Copy serait allé chercher les autres fichiers comme étant des sous-répertoires de répertoire, ce qui n ’est évidemment pas le cas, et la commande Copy aurait alors avorté SANS envoyer de message d’erreur. La barre verticale I se fait avec la touche juste en-dessous de la touche E10 et avec la touche shift. Pour les Preferences, c’est très simple : dans la disquette dont vous voulez utiliser les prefs vous trouverez dans le répertoire devs un fichier nommé system-configura- tion. Il vous suffit de copier ce fichier dans le répertoire devs de votre disquette Monboot et le tour est joué. Enfin pour les extensions RAM: il existe évidemment du bon et du mauvais. Je donne seulement mon avis personnel. Si l’on a pas de connaissance particulière en électronique afin d’être capable de juger par soi-même et de visu, alors mieux vaut acheter les extensions de Commodore.
O
Question : Comment faire fonctionner la souris Amiga du côté PC ? (11 paraît que chez A-News ils y arrivent, mais comment ?). Est-ce que vous vérifiez les listings que vous imprimez dans l’ANT ? J’en ai marre de voir au moment d’assembler certaines erreurs (parfois introuvables !) (NDER j'ai coupé le reste de la lettre qui ne concerne pas l’ANT).
Ludovic S (Nanterre)
Réponse : Je ne sais pas ce qu’il paraît chez A- News, mais voilà comment nous faisons nous à Commodore Revue.
- lancer le PC
- cliquer l’icône Amouse
- passer côté PC
- taper Amouse (avec un system-disk dans le drive évidemment) et ça marche dans la mesure où vous utilisez ensuite un logiciel PC qui reconnaît la souris.
Comment ?? Des erreurs dans l’ANT ??
NON ! Ceci est terminé. Il est vrai que pendant un certain temps, nous avons eu pas mal de problèmes de ce côté, mais depuis le n° 22, nous utilisons systématiquement la PAO et en plus je vérifie moi- même personnellement tout VANT avant la mise sous presse. Il n’y a donc plus d’erreurs ou alors celles-ci (et c’est bien pour vous faire plaisir) doivent être rarissimes. A ce propos, je viens de lire une lettre d’un lecteur grincheux qui prétend qu’un de nos listing contient 73 erreurs. Pas de chances, ledit listing ne contient aucune erreur et guand je l’assemble tout fonctionne à merveille. Moralité : s’il vous plaît, arrêtez de vous plaindre et pensez d’abord que c’est probablement vous qui avez fait une faute de frappe (NDLR : voire 73 comme certains ! Je le répète encore une fois, j’essaie tout avant publication). Enfin il semble, vu les problèmes que certains rencontrent avec leurs assembleurs, que les geignards en question ne possèdent pas les notices d’utilisation. Ce qui pourrait laisser à penser que.... mais enfin.
0
Question : (NDLR voilà une lettre énorme dont j’ai seulement extrait les passages concernant TANT. Ne m’en veuillez pas, la place dont je dispose n’est pas illimitée)
[...] Je voudrais savoir si le Workbench marque quelque part, pour prévenir le système lors d’une écriture sur le disque, qu’il y a des secteurs nases et où ils se trouvent ? Car j’ai récemment vu mon Amiga dire qu’il y avait des “read write error” sur le disque et depuis, ce message apparaît très souvent même lorsque je lance des programmes n’ayant pas été enregistrés sur des secteurs mauvais. Sinon que faire ?
F. ..| L’autre partie de ma lettre concerne le langage et plus particulièrement l’assembleur sur Amiga. Je tiens à dire que je trouve fantastique le fait de mettre des listings de bonne qualité dans la revue : en 2 mots comme en 100, j’aime la partie ANT ! A propos de la tube Intro de Little Zeus, j’ai un gros problème (NDLR moi aussi !) : je n’arrive pas à la faire marcher, en revanche, j’ai droit à la visite (très courtoise, d’ailleurs...) du cher GURU ou bien du SOFTWARE ERROR. Comment cela se fait-il ? J’ai pourtant revérifié le listing tapé et rien ne change. Est-ce que ça peut venir de mes images (fonte et logo) ? Je précise que mes fontes sont décompressées et avec les “+$ 98” en 4 couleurs et que mon logo est en 32 couleurs mais avec une taille assez importante. Faut-il faire autre chose que le décompacter et lui rajouter également les $ 98 ? Sinon le guru annonce une erreur à l’adresse A8C8 et une erreur au niveau de l’ouverture des libraries (Guide de la méditation). Est-ce lié au fait que j’ai FAT AGNUS ? (j’ai remarqué beaucoup de plantages de démos et de logiciels du fait de mon méga de chip...) Eclairez-moi s’il vous plaît !
Je n’ai (hélas) pas plus de chance avec le Sinus Scroll. Tout d’abord il y a une ligne que je n’arrive pas à déchiffrer où il est question de “... ? La ?
64. ..”.
Les fontes doivent-elles être en noir et blanc ou bien en 4 couleurs ?
Diego FERNANDO BRAVO (Paris)
Réponse : L’amigaDos, bien qu’assez compliqué il faut le dire, fonctionne à merveille. Les erreurs que vous signalez peuvent bien sûr arriver mais c’est vraiment extrêmement rare. Si vous obtenez des read write errors à la pelle, pour moi il n’y a aucun doute, vous avez contracté le virus “Lamer Extermi- nator” qui est de loin le plus méchant de tous les virus : bonjour les dégâts. Il faut que vous utilisiez un utilitaire capable de supprimer le virus de vos disquettes. Je recommande Virusx 4.0 (domaine public) qui est à mon avis le meilleur compromis entre facilité d’utilisation et efficacité. Aïe, la tube intro. Lorsque celle-ci est parue, je ne faisais pas encore partie de l’équipe de Commodore Revue et je la connais donc très mal sinon par le fait que je n’ai jamais entendu dire qu’un lecteur ait réussit à la faire fonctionner... Je ne peux donc répondre que par quelques généralités.
Normalement le fait de posséder un méga de chip ne doit pas poser de problème si l’Amiga est programmé correctement en respectant la conception du système d’exploitation. A ce sujet voyez l’excellent article de Max “Apprenez-lui le caniveau” (n°
23) . Le moins que l’on puisse dire est que les programmeurs de démos programment en général comme des cochons, même si le résultat (quand ça marche...) fait quelquefois bonne impression. En général, les possesseurs d’Amiga 2000 bien rempli de cartes en tous genres ont les plus grand ennuis avec ce genre de démos. En clair, tout peut arriver....
A propos de la ligne que vous ne pouvez déchiffrer, il y a 2 coquilles. Il faut lire move.w [la*64]+l,blt- size car le programme a été fait sur k-seka. N'importe qui normalement constitué aurait mis des parenthèses à la place des crochets mais voilà k-seka est le pire (le mot est faible) assembleur que je connaisse. Pour ceux qui utilisent un assembleur digne de ce nom (je recommande Devpac 2), il faut évidemment mettre des parenthèses à la place des crochets. En ce qui concerne les fontes, essayez d’abord le plus simple : noir et blanc.
O
Bien souvent, certaines potentialités de l’Amiga ne sont pas exploitées par les programmeurs.
Fort heureusement, certains passionnés, sans qui le domaine public n’existerait pas, proposent de petits programmes fonctionnant en multi-tâches et qui comblent les manques des logiciels du commerce.
TRANSFEREZ VOS DONNEES
DOMAINE
L’exemple le plus frappant de possibilités non exploitées est celui du Clipboard. Alors que cet accessoire fut en partie la raison du succès du Macintosh d’Apple, celui-ci est complètement négligé par les Amigaïstes. Le Clipboard est censé permettre l’échange de données entre différentes applications par le biais du couper-copier-col- ler. Si tous les programmes l’utilisaient, il serait possible de découper une image dans un programme de dessin ou encore un tableau de chiffres issu d’un tableur pour le copier dans un traitement de texte voire dans un programme de
P. A.O. Hélas, jusqu’à présent, seuls les logiciels de Commodore utilisent ce “de- vice” d’échange de données. Ainsi, si vous possédez une carte passerelle XT ou AT, vous pouvez découper du texte dans la fenêtre où tourne le PC pour le coller dans le NotePad et inversement. Snap est un utilitaire inspiré pas les recherches de Rank Xerox en matière d’interface utilisateur (vous savez, c’est à cette société que l’on doit déjà la souris, les fenêtres et les menus déroulants) qui tourne en tache de fond, c’est-à- dire, qu’il ne possède pas de fenêtre propre et qui permet à tout instant de découper du texte ou des graphismes dans n’importe quelle autre application.
LES GRAPHISMES
Pour copier des graphismes à l’aide de Snap, il suffit d’appuyer sur la touche Amiga de droite, de la maintenir enfoncée et à l’aide de la souris d’encadrer la zone à découper. La zone est forcément rectangulaire mais cela ne constitue pas vraiment un handicap car il suffit de coller ladite zone dans Deluxe Paint ou dans tout autre logiciel de dessin pour pouvoir alors détourer la partie qui vous intéresse. Bien sûr, cela est relati- "SNAP"
vement long mais c’est le seul moyen permettant de découper un graphisme dans une application qui ne le permet pas. Certes, il existe un autre logiciel qui permet à tout instant de sauvegarder un écran en une image au format IFF : Grabbit. Seulement ce logiciel ne fait pas partie du domaine public et de plus il sauve l’écran en entier. Cela n’est pas très grave lorsqu’il s’agit d’un écran disposant d’un faible nombre de couleurs mais s’il est, par exemple, en haute-résolution entrelacée et en seize couleurs cela nécessite un peu plus de cent cinquante kilo-octets. Si Ton est intéressé que par un carré de trente pixels de large il est vraiment dommage de gaspiller toute cette mémoire et ce pour arriver finalement au même résultat. Contrairement au mode texte, Snap n’utilise pas le clipboard pour y stocker les images. A mon avis, c’est un choix fort judicieux car il n’existe à ma connaissance aucun logiciel utilisant ce device pour les graphismes. La solution adoptée est la suivante : l’image découpée apparaît dans une fenêtre du work- bench (il suffit de cliquer à l’intérieur pour obtenir les bonnes couleurs). En haut à droite de cette fenêtre se trouve un petit “gadget” qui, lorsque vous l’activez, ouvre un “requester” qui vous permet de changer le nom sous lequel l’image sera sauvegardée, de sauver l’image mais aussi de changer la couleur transparente (par défaut la couleur
0) . Comme beaucoup de logiciels du domaine public, Snap n’est pas très “fini” et si par malheur vous lui communiquez un nom de volume où l’écriture est impossible (une disquette protégée par exemple), le détour par le Guru est assuré.
Les images sont sauvées par Snap au format IFF et peuvent donc ainsi être récupérées par tous les logiciels de dessin. Il faut souligner que Snap fonctionne absolument dans tous les modes d’affichage de l’Amiga y compx-is le
H. A.M. et le Extra Half Brite.
A noter enfin qu’il existe aussi un programme dérive de Snap qui sauve les images dans le clipboard : Vsnap.
LE MODE TEXTE
Si Snap est très pratique en ce qui concerne la manipulation des graphismes il Test encore plus en ce qui concerne le texte. Avant d’aller plus loin, je souligne ici l’exploit du programme Snap qui arrive à reconnaître le texte. En effet, l’Amiga ne dispose pas d’un mode texte comme les IBM PC et par conséquent, les lettres ne sont pas codées spécialement et il faut donc les distinguer des autres graphismes. C’est entre autres pour cela que Snap ne peut pas reconnaître toutes les polices de caractères. En effet, seuls les textes écrits avec une fonte de corps 16 non proportionnelle seront reconnus. Ne vous inquiétez pas, quasiment toutes les po lices de Tamiga sont non proportionnelles et disposent toutes de corps inférieurs à seize. En particulier, la fonte “système” c’est-à-dire Topaz est parfaitement reconnue. Autrement dit, tous ce qui est affiché par le Workbench ou le Shell sera copiable. De plus Snap reconnaît également tous les types d’affichage : gras, italique, souligné ou n’importe quelle combinaison des trois. La copie de texte se déroule exactement de la même manière que la copie de
- C.C.M.-
37, rue des Mathurins 75008 PARIS
* -111* -11*
«(1) 40 16 04 02
Vente par Correspondance uniquement Tous nos Prix sont TTC. Nous assurons la Garantie et le SAV SI VOUS NE TROUVEZ PAS CE QUE VOUS CHERCHEZ DANS CETTE PUBLICITE TELEPHONEZ NOUS
STOP
AMIGA 500 3290 FRS
DU NOUVEAU SUR LES FINANCEMENTS
VOTRE ACHAT A PARTIR DE 250 FRS MOIS VOTRE CREDIT EST ACCEPTE OU NON DANS L’HEURE QUI SUIT VOTRE DEMANDE. TELEPHONEZ SANS ATTENDRE.
STOP
AMIGA 2000 6990 FRS
PACK 1 AMIGA 500 512 ko + MONITEUR STEREO
STOP
AFFAIRES
(A1084SIP)
+ 10 disquettes de DOM PUB**
5190 Frs
PACK 500 AUDIO
AMIGA 500 1 MEGA
PRISE PERITEL PRISE MIDI + MASTER SOUND + STUDIO 24
4950 FRS
OU + MUSIC X :
6450 FRS
LECTEUR 3’1 2
AVEC SWITCH
845. 00 Frs
* -111 . * ni*. * ni * H*
LECTEUR 5’l 4
1405. 00 FRS
CCM S’ENGAGE
A ne vous Livrer que les dernières Versions des Logiciels et des Micros disponibles en France. (Même dans le cas de nos offres) Pas d’offres alléchantes mais des Promos Utiles et Fiables NOTRE SAV NE GARDE JAMAIS UN MICRO PLUS DE 5 JOURS NOTRE PREMIER SOUCIS EST VOTRE SATISFACTION
_ 630 FRS
.....
¦¦¦¦¦¦¦¦¦¦
Programmes du domaine public ( jeux démos et utilitaires) Fred Fish à partir du N° 300 et au dessus, copiés sur disquettes 2DD.
PACK A590
Disque Dur 20 Mégas pour A5O0 Notre offre comprend 2 Mégas de Mémoire Vive en plus.
5890 FRS
EXTENSION MEMOIRE POUR A2000 (MicroBotics) Carte Peuplée 2 MO 3290.00 Frs
Carte Peuplée 4 MO 4690.00 Frs
Carte Peuplée 6 MO 6090.00 Frs
Carte Peuplée 8 MO 7490.00 Frs
EXCELLENCE
Le Traitement des Pros sur Amiga
1690 Frs WORKS PLATINUM
Un intégré complet avec Traitement de texte, Tableur, Base de Donnée, et Communication (Par les créateurs d’Excellence)
1890 Frs MASTER SOUND
Digitaliseur de Son Le meilleur Rapport Qualité Prix
350 Frs
PACK 2
AMIGA 500 1 MEGA
+ MONITEUR STEREO
(A1084SIP)
+ 10 disquettes de DOM PUB**
5780 Frs
PACK VIDEO
UN PRIX DE RETOUR DE VACANCES AMIGA 500 +HOME VIDEO KIT
+ prise péritel
7500 FRS
PROMO A2000
VOTRE AMIGA 2000
1MO RAM VIDEO DELUXE PAINT III (PAL) 40 DISQUETTES 2DD 10 DISQUETTES DOM PUB** 1 JOYSTICK
7790 FRS
A2000 ETUDIANT
A2000 + KIT XT + Moniteur Stéréo + Imprimante 80 col + WORKS PLATINUM
(Intégré avec Traitement texte, Tableur, Base donnée et Logiciel de Communication)
+ 40 Disquettes vierges 2DD + 10 disquettes DOM PUB**
13500 FRS
DISQUETTES
Douhle Face Double Densité avec Etiquettes
990 Frs les 200 550 les 100
(frais de port 55 frs pour cause de poids)
CONDITIONS GENERALES DE VENTES
[ui feroru d’eux des clients au montant
Garantie lors de la
Vente privilégiés, de votre
GARANTIE : les micros et périhériques sont garantis 1 an pi __________
livraison. VOS REGLEMENTS NE SONT ENCAISSES QU’APRES EXPEDITION DE
anges s.-------------------------------------r -
MARCHANDISE.. Sauf rupture la majorité des commandes sont traitées le jour de réception.
CETTE ANNONCE EST VALABLE LE MOIS DE SA PARUTION ET REMPLACE LES PRECEDENTES(J Septembre 90
En échange de votre carte accélératrice 68020 ou 68030 Commodore, Hurricane, CSA... CIS vous permet d’acquérir le
système A3001 28 à 9990 Frs TTC.
CHANGEZ VOTRE A2500 EN A3001.
La reprise que nous vous proposons comprend l’A3001 28 de GVP : 68030 et 68882 à 28 Mhz, 4 Mo de Ram 32 bits (extensible à 8 Mo) et contrôleur de disques durs intégré. Des reprises exceptionnelles de votre ancien disque dur sont également prévues pour faciliter l’achat d’un A3001 complet avec disque 40,80 ou 200 Mo.Renseignez vous auprès de votre revendeur pour connaître toutes les options disponibles.
Les technologies de pointe employées (Ram Nibble mode 60-80 ns), parfaitement adaptées aux fréquences utilisées: 28,33 ou 50 Mhz apportent les meilleures performances :
Si votre AMIGA 2000 est équipé d’une carte accélératrice autre qu’une GVP, il est certain que :
? Vous n’avez pas accès aux meilleures performances.
? Votre Amiga est bridé, soit par une technologie dépassée : 68020, soit par des cartes figées ou abandonnées.
? Votre configuration est très probablement hétéroclite, mélangeant processeurs 32 bits, disques durs 8 bits, RAM 16 bits...
? Division des temps de calcul par 15, 18 ou 22 (coefficients calculés sous SA4D)
? Affichage des pages quasi-instantané sous les principaux logiciels de PA.O.
? Accélération du calcul et de l’exécution des animations Bitmap (Deluxe Paint III, Elan Performer...)
Conçu de façon homogène, l’A3001, équipé d’un disque dur directement connecté au bus 32 bits du 68030, offre des taux de transfert de 700 Ko s à plus de 1 Mo s, c’est un nouveau confort d’utilisation et une nouvelle dynamique dans vos présentations.
Votre carte 68030 GVP est un outil de production, nous vous la garantissons 2 ans. De plus, à tout moment, votre A3001 peut évoluer vers la version supérieure, avantage intéressant de la part du premier constructeur mondial à maîtriser la technologie 68030 à 50 Mhz !
CIS.
571, cours de la libération 3 3400 Talence Tel : 56-374-378 Fax : 56-040-895
CONDITIONS D’ECHANGE:
- CIS reprend pour l’achat d’un système A3001 28, toute carte accélératrice 68020 ou 68030, équipée de ses processeurs, co-processeurs et composants installés d’origine. Ces cartes doivent s'enficher dans le port CPU de l’A2000 et être en parfait état de fonctionnement.
- Ce programme de reprise est valable jusqu’au 30 Novembre 1990.
- Les échanges s’effectuent auprès des Points Démo A3001 et des revendeurs agrées CIS GVP. Pour connaître le revendeur le plus proche ou pour tout renseignement, contactez CIS au ( 16) 56 374 378.
- CIS se réserve le droit de modifier sans préavis les conditions de reprise, d’accepter ou de refuser ponctuellement la reprise d’une carte.
- family:Times New Roman, serif;">Votre carte 68030 GVP est un outil de production, nous vous la garantissons 2 ans. De plus, à tout moment, votre A3001 peut évoluer vers la version supérieure, avantage intéressant de la part du premier constructeur mondial à maîtriser la technologie 68030 à 50 Mhz ! CIS.
571, cours de la libération 3 3400 Talence Tel : 56-374-378 Fax : 56-040-895
CONDITIONS D’ECHANGE:
- CIS reprend pour l’achat d’un système A3001 28, toute carte accélératrice 68020 ou 68030, équipée de ses processeurs, co-processeurs et composants installés d’origine. Ces cartes doivent s'enficher dans le port CPU de l’A2000 et être en parfait état de fonctionnement.
- Ce programme de reprise est valable jusqu’au 30 Novembre 1990.
- Les échanges s’effectuent auprès des Points Démo A3001 et des revendeurs agrées CIS GVP. Pour connaître le revendeur le plus proche ou pour tout renseignement, contactez CIS au ( 16) 56 374 378.
- CIS se réserve le droit de modifier sans préavis les conditions de reprise, d’accepter ou de refuser ponctuellement la reprise d’une carte.

Click image to download PDF

AMIGA NEWS TECH numero 15 (09-1990)

Merci pour votre aide à l'agrandissement d'Amigaland.com !


Thanks for you help to extend Amigaland.com !
frdanlenfideelhuitjanoplptroruessvtr

Connexion

Pub+

31.7% 
18.6% 
5.6% 
5.3% 
4.8% 
4.2% 
2.9% 
2% 
1.8% 
1.3% 

Today: 1
Yesterday: 75
This Week: 699
Last Week: 669
This Month: 2493
Last Month: 2931
Total: 63561

Information cookies

Cookies are short reports that are sent and stored on the hard drive of the user's computer through your browser when it connects to a web. Cookies can be used to collect and store user data while connected to provide you the requested services and sometimes tend not to keep. Cookies can be themselves or others.

There are several types of cookies:

  • Technical cookies that facilitate user navigation and use of the various options or services offered by the web as identify the session, allow access to certain areas, facilitate orders, purchases, filling out forms, registration, security, facilitating functionalities (videos, social networks, etc..).
  • Customization cookies that allow users to access services according to their preferences (language, browser, configuration, etc..).
  • Analytical cookies which allow anonymous analysis of the behavior of web users and allow to measure user activity and develop navigation profiles in order to improve the websites.

So when you access our website, in compliance with Article 22 of Law 34/2002 of the Information Society Services, in the analytical cookies treatment, we have requested your consent to their use. All of this is to improve our services. We use Google Analytics to collect anonymous statistical information such as the number of visitors to our site. Cookies added by Google Analytics are governed by the privacy policies of Google Analytics. If you want you can disable cookies from Google Analytics.

However, please note that you can enable or disable cookies by following the instructions of your browser.

Visitors

Visite depuis
03-10-2004
Visite depuis
23-02-2014