Sponsors

FacebookTwitterGoogle Bookmarks

Il s'agit maintenant d'utiliser ces valeurs; rappelez-vous que pour utiliser les devices, il faut absolument faire appel à Dolo. Cependant, l'utilisation de Dolo nécessite une structure I O. N'oublions pas que notre Virus-Killer ruse à mort pour ne pas s'ennuyer à créer une telle structure : il utilise celle déjà conçue par le programme principal. Comme vous pouvez le remarquer dans la routine , on transfère le contenu de A1 au label diskio pour sauvegarder l'adresse de base de la structure I O. Ensuite, il suffit de savoir que l'offset 28 doit contenir le numéro de la commande à effectuer. En l'occurence, nous devons y poker la valeur 3 qui correspond à l'écriture. La zone mémoire que nous désirons sauver étant notre programme lui-même, son adresse de base est Deb; on poke donc cette valeur à l'offset 40 de la structure I O. Ensuite on veut transférer un Ko, valeur qu'on communique (en octets) à l'offset 36. Enfin, l'offset 44 contient le numéro de l'octet à partir duquel les données doivent être sauvées. Nous allons profiter d'une partie de la routine de ce mois-ci faisant appel à Intuition pour examiner cette librarie. Expliquons tout d'abord mais succintement, ce cher Max l'ayant déjà fait plus d'une fois, ce qu'est une librarie. Que ce soit en ROM ou sur disquette (cela dépend de la version de l'Amiga) existent des ensembles de routines classées par genre sous forme de libraries. Ainsi, l'ensemble des routines travaillant avec les drives seront présentes en dos.library, celles animant les objets graphiques en g ra p h i es. I i b ra ry, ect. L'intuition.library concerne le traitement des fenêtres. Bien que nous ayions toujours évité au maximum l'utilisation des libraries à cause de la lenteur d'exécution de leurs routines, nous faisons exception cette fois-ci dans la mesure où le temps n'est pas un facteur important. Effectivement, nous utilisons Intuition pour afficher un message d'alerte avec une alternative à la clef : tuer ou non le virus résident. Comme le programme s'interrompt dans l'attente d'une réponse, le temps d'exécution n'intervient plus! Il est donc inutile de faire compliquer en programmant directement les processeurs, alors qu'intuition le fait directement modulo quelques données. Première chose à laquelle il faut procéder afin d'utiliser une quelconque routine d'une libra- rie, l'ouvrir. Ouvrir une library signifie qu'elle doit être chargée en RAM. C'est à dire que si vous possédez un Amiga 500 ou 2000, l'ouverture consistera à recopier depuis la ROM vers la RAM la librarie qui vous intéresse. Ceci se fait au moyen de OpenLibraryO, routine de l'exec.library. Vous savez déjà certainement que l'exec.library est toujours ouverte.

Click image to download PDF

AMIGA NEWS TECH numero 08 (01-1990)

Document sans nom R
Le dernière
Little Zeus
Le courrier technique
Ok et Cancel
REQUESTER
Question : Bonjour. Je suis un fan de la programmation sur A miga, mais je ne touche malheureusement pas encore à Vassembleur. Tant pis, ça viendra, chaque chose en son temps. Pour le moment, je me contente du GfA-Basic, qui me satisfait amplement. Ce que je voudrais savoir, c'est si le GfA sera suffisamment rapide pour un jeu d'arcade à scrolling horizontal type R-type ou vertical type Xénon et s'il est possible ou pas de faire du dual-playfield? Au fait, votre A miga News Tech est super, mais je pense que vous devriez y mettre plus de programmation du hardware de TA miga.
Alain Massoumipour, Domont
Réponse : Tiens, commençons par la fin, pour une fois. Mais bien sûr, voyons, il est tout-à-fait possible de faire du dual-playfield en GfA. Je passerai sous silence le moyen classique (Intuition) pour en arriver à la programmation directe des processeurs spécialisés. Je ne peux malheureusement pas t’en dire beaucoup sur le sujet TANT tout entier n’y suffirait pas mais sache simplement que pour créer un écran en mode dual-playfield, il suffit de mettre à 1 le bit 10 du registre BPLCONO (les autres bits devant être initialisés correctement. Tu trouveras plus de détails sur ce sujet dans la Bible de l’Amiga, page 153). Pour te donner un exemple, l’instruction ci-dessous passe en mode dual-playfield avec six bitplanes (trois par playfield) :
custombase % = &HDFF000 ! Adresse de bases des coprocesseurs ABSOLUTE
bplcon0& = custombase % + &H 100 ! Adresse de BPLCONO
WORDbplconO& = &X0101010000000000 ! Dual-playfield, 6 bitplanes
L’inconvénient est qu’il te faudra également initialiser correctement les registres DIWSTRT, DIWSTOP, DDFSTRT, DDFSTOP, BPLCON1, BPLCON2, BPLxPTH et BPLxPTL.
Quant à savoir si le GfA sera assez rapide, c’est possible, mais... Ne t’attends tout de même pas à des miracles. Peut-être lorsque le compilateur sera sorti (ce qui ne saurait plus tarder maintenant), et encore...
Question : Bonjour à tous. Je voudrais tout d'abord remercier Little Zeus de nous apprendre à programmer l'Amiga et ses fabuleux processeurs, ainsi que Max de nous apprendre l'assembleur 68000 tout court (j'ai appris grâce à lui, rien qu'en lisant ses programmes, à optimiser un peu les miens (au fait, à ce sujet, l'article de John Toebes sur l'optimisation était très intéressant !)). Bon, le cirage de pompes étant terminé, je désirerais en savoir un peu plus sur le Blit- ter et le moyen de créer et d'animer des bobs grâce à lui, les différents ouvrages que j'ai lu à ce sujet n 'étant pas, disons, heu... très clairs. Merci d'avance et bonne continuation. Denis Jarril, Draveil
Réponse: Ahhhh, le Blitter... Hé bien figure-toi que Little
Zeus a prévu, comme il le dit dans son article de ce mois- ci, d’y revenir très bientôt. De plus, nous avons en préparation une série d’articles sur ce sujet, qui traitera de TOUT ce qui concerne le blitter : scrolling, copie déplacement de blocs mémoire (incluant donc les bobs), remplissage de surfaces et tracé de droites ! Cette série devrait normalement commencer dès le le numéro 21 de Commodore Revue, alors un peu de patience... Et merci pour les compliments, ça fait toujours plaisir.
Question : Si je me permets de vous écrire aujourd'hui, ce n 'est pas pour vous poser une question, mais vous faire quelques remarques personnelles sur l'Amiga News Tech. En effet, cette rubrique est très intéressante (malgré le rapprochement certain avec le titre de l'un de vos concurrents...) mais je la trouve également trops sérieuse. Je ne suis pas sûr que tout le monde s'intéresse à Intuition, AmigaDOS, Exec et tout le bazar. Pour ne citer que mon propre cas, j'aimerais beaucoup y trouver des trucs et astuces sur la programmation des co-processeurs, comment créer un jeu d'arcade, etc. Qu'en pensez-vous?
Lilian Margerie, Rueil-Malmaison
Réponse: Ben tu vois, ton appel a été entendu. Je suppose que la rubrique de Little Zeus est ta préférée? Hé bien réjouis-toi, il va y en avoir de plus en plus, des comme ça.
Tiens, tant qu’on y est, j’insiste encore une fois : écrivez- nous pour nous dire de quoi vous voulez qu’on parle dans l’ANT, on ne peut pas le deviner tout seul. Chaque rédacteur essaye de faire au mieux, mais s’il sait à l’avance quel sera le sujet de son prochain article, il pourra alors faire au meilleur. Logique, non?
Retry et Cancel
EDITO
Vous ne programmez pas en C? Qu’a cela ne tienne, on va faire de l’assembleur, toujours de l’assembleur.
Vous voulez programmer directement le hardware de l’Amiga (donc, sans passer par le système d’exploitation) pour être capables de faire vos propres démos et jeux? Pas de problème, on va y venir. Il suffisait de demander. Vous l’avez fait dans votre courrier.
Ah, au fait, histoire d’essayer de satisfaire tout le monde: que les programmeurs débutant en Basic se rassurent, nous avons trouvé un remplaçant à Michel Descoins. Vous pourrez lire sa prose dès le mois prochain. D’ici là : Joyeuses Pâques.
Stéphane Schreiber
Après avoir vu comment définir un gadget et comment l'utiliser, nous allons définir une image Intuition. Mais au préalable, nous devons apprendre à faire le ménage dans la mémoire de l'Amiga. En effet, le GFA ne libère pas la mémoire réservée par la fonction MALLOC, ce qui peut causer quelques surprises en cas d'utilisation répétée du pro- gramme test du mois dernier.
INTUITION ET GFA
I faut donc libérer cette mémoire avant de quitter le programme, ce qui s'effectue par la fonction MFREE (voir page 46 du manuel Gfa). Pour nos gadgets, cela donne
MFREE (gadget%,44)
où gadget% représente l'adresse de la structure gadget et 44 est le nombre d'octets occupés par cette structure. Rajoutez donc les lignes nécessaires dans le programme du mois dernier. Il ne faut pas oublier non plus d'enlever le gadget de la liste des gadgets de la fenêtre, grâce à la fonction
RemoveGadget (fenêtre%,gadget%)
où fenêtre% est l'adresse de la fenêtre du gadget et gadget%, l'adresse de la structure gadget.
L'IMAGE A LA PAROLE
Une image Intuition est un élément graphique qui peut être attaché à un ou plusieurs autres objets d'intuition, comme les fenêtres ou, dans le cas qui nous intéresse, les gadgets. La mise en place d'une image s'effectue en deux parties : on définit dans un premier temps les différents paramètres de l'image et dans un deuxième temps, ses données graphiques. Voyons d'abord la première partie, qui est bien sûr une structure C.
STRUCT Image
( SHORT LeftEdge; * Coordonnées du point supérieur SHORT TopEdge; * gauche de l'image en pixels
SHORT Uidth; * Largeur en pixels
SHORT Heigth; * Hauteur en pixels
SHORT Depth; * Nombre de bitplanes
USHORT *ImageOata; * Pointeur sur les données graphiques
UBYTE PlanePick; * Masque des bitplanes utilisés par l'image
UBYTE PlaneOnOff; * Masque des bitplanes forcés à 1
STRUCT Image *NextImage * Pointeur sur l'image suivante
La procédure initimage commence par la réservation de 20 octets dans la mémoire publique. Ces données peuvent se trouver
aussi bien dans la mémoire FAST que dans la mémoire CHIP - ce qui n'est pas le cas pour les données graphiques, comme nous le verrons un peu plus loin. Ensuite, il faut remplir la structure avec les différents paramètres.
- x&, l& et h& n'appellent pas de commentaires particuliers;
- prof& indique le nombre de bitplanes de l'image. Par exemple, une image en deux couleurs nécessite un bitplane, tandis qu'une image en huit couleurs en nécessite trois (20 = 8);
- lmageData% désigne l'adresse des données graphiques;
- PlanePick% permet d'indiquer quels seront les plans utilisés pour tracer l'image. Exemple : pour une image de profondeur 1 dans un écran à 1 6 couleurs (profondeur 4), en mettant à 1 le bit n, l'image sera placée dans le bitplane n :
PlanePick& = &x0010 l'image en couleur 2 (bitplane 1)
PlanePick& = &x 1 OOO l'image en couleur 8 (biplane 3)
- PlaneOnOff& permet de forcer à 1 tous les points d'un biplane. Dans l'exemple précédent, avec PlanePick& = &x0010 et PlaneOnOff&t = &x1000, les points allumés seront de la couleur 2 -F 8 soit 1 0 et les points éteints seront de la couleur 8. Dans le cas d'une image de profondeur supérieure à 1, le principe est identique mais PlanePick& doit avoir autant de bits mis que la profondeur de l'image et PlaneOnOff & ne doit pas avoir plus de (profondeur de l'écran - profondeur de l'image) bits mis. Et bien sûr, les bits ne doivent pas être communs, sinon on obtient des effets imprévus. Exemple : pour une profondeur d'image de 2 et une profondeur d'écran de 4, on peut déclarer PlanePick& = &x 1 00 1 et PlaneOnOff& = &x01 10:
- finalement, nous plaçons dans Nextlmage% l'adresse de la prochaine image à dessiner ou zéro s'il n'y en a pas d'autre, ce qui permet de chaîner plusieurs images entre elles.
Voyons maitenant l'organisation mémoire des données graphiques. Pour une fois, nous n'avons pas à faire à une structure C, mais à un tableau de WORDs (mots de 1 6 bits dont le signe est sans importance), celui-ci étant OBLIGATOIREMENT situé en CHIP-RAM afin d'être accessible aux coprocesseurs. Les points sont rangés ligne par ligne et bitplane par bitplane, alignés sur seize bits. Prenons pour exemple un petit damier avec quatre couleurs :
1
2
pixels
¦......1
m i
i
i lrlAHH Utf Hi'ùiulltteui1 6.
Ià i 1 " i l I'm ( 1
m I 1
i
i
i
i
i
2
îÂrgeur 6 et riAUvéÜi* 6. ¦
M
» 1 1 » ( i
i
i
i C i-aqiië üÂx'i’é l*êFi'éSênîê
« i i
i
i uii Fixei, iea uiuiires * n
. i i “i l i i
0
«f
i
i
i
A
¦*
1 V ifitéi'iéui* î Oui qUÀTi t Sâ «
M 1 i
M | |
!
1
i üüttieui'i ¦ i ¦
y !
!
¦
L. . . , _____ . . ¦
Drawlmage(RasPort%,lmage%,LeftOffset&,TopOffset&)
Le RasPort est une structure C dont l'étude n'entre pas dans le cadre de cet article. Notons quand même qu'il existe pour une fenêtre, un écran ou une boîte de dialogue, et que son adresse est trouvée par
rasport%= WINDOW(Numéro Fenêtre) + 50 pour une fenêtre rasport% = SCREEN (Numéro Ecran) 4- 84 pour un écran
Le programme 1 montre la définition de deux images Intuition chaînée toutes deux et utilisant les mêmes données graphiques, et d'une image sans données graphiques, qui est en fait un rectangle coloré, grâce à une utilisation astucieuse de PlaneOnOff.
F
Une ligne doit obligatoirement être un nombre entier de WORDs. Notre image occupera donc 2 WORDs pour un bitplane (un par ligne); la profondeur étant de 2, elle nécessite deux bitplanes, ce qui fait un total de quatre WORDs.
La couleur de chaque pixel est obtenue par la formule suivante :
couleur = (20 * point plan O) -f- (2 1 * point plan 1 )
- f ... + (2profondeur * point plan profondeur)
où "point plan n" vaut soit O, soit 1 .
Pour le point de couleur 1, il faut mettre à 1 le bit dans le plan 1 et à O dans le plan 2.
Ce qui donne pour notre exemple :
&x000000000000001O,&X000000000000001o 81X00000000000000 1 o &000000000000001 o
Afin de permettre un dessin relativement aisé de notre image, nous allons la stocker sous forme de DATAs en utilisant les nombres binaires et en incorporant à notre routine une boucle de lecture. Dans notre exemple, les data seront donc :
DATA &b0000000000000010 ! Ligne 1 plan-bit 1
DATA &b0000000000000010 ! Ligne 2 plan-bit 1
DATA &b0000000000000001 ! Ligne 1 plan-bit 2
DATA &b0000000000000010 ! Ligne 2 plan-bit 2
Si tout ne vous semble pas encore très clair, analyser la définition des images dans le listing
Il ne reste plus qu'à donner l'ordre à Intuition de tracer l'image pour nous, ce qui est effectué par la fonction
Programme 1
programme de démonstration des images
D. OBRIOT NOV 89 pour commodore revue
1 ouverture écran et fenêtre
i
OPENS 1,0,0,640,250,4,41(8000 TITLES 1,"TEST DES IMAGES INTUITION" flag%=1+2+8+4+4096+65536
idcmp%=&H10+&H8+&K20+&H40+&H200+&H40000+&H80000 ! Ou INACTIVEUINDOW 0PENW 1,10,10,600,200,idcmp%,flagX TITLEW 1,"FENETRE DES IMAGES" rasport%= WINDOW(1)+50}
I
1 définition des images
i
i nitdataimage(16,16,3,imagedata%)
initimage(100,100,16,16,3,&X1110 1,imagedata%,0,image%)
ini timage(300,100,16,16,3,&X111,&X1000,imagedata%,image*,imagebi s%)
~DrawImage(rasport%,imagebi s%,0,0)
' drawlmage(rasport%,imagebis%,0,0)
i
' boucle pour définir les couleurs
i
FOR loop%=1 T0 15 SETCOLOR loop%,loop%,0,0 NEXT loop%
i
' demande traitement des événements Intuition
I
ON MESSAGE GOSUB mess
I
' attente d'un événement
i
D0 SLEEP LOOP UNTIL M0USEK=2
i
' fin du programme
l
liberedataimage(16,16,3,imagedata%)
~MFREE(image%,20)
~MFREE(imagebi s%)
i
PROCEDURE mess
IF MENU(1)=32 THEN PRINT "Un gadget vient d'étre cliqué !"
PRINT "Numéro du gadget :";CARD MENU(4)+38}
ENDIF
RETURN
PROCEDURE initdataimage(largeur%,hauteur*,deepX,VAR imagedataX) l%=DIV(largeur*,16)
IF M0D(largeur*,16>>1 THEN INC 1%
ENDIF
nombre&=MUL(MUL(MUL(IX,hauteur*),deepX),2)
i magedat aX=MALLOC(nombre4*2,&H2)
IF imagedataX=0 THEN PRINT "Impossible !"
END
ENDIF
FOR loopX=0 TO DIV(nombre&,2)-1 READ infoX
hiX=TRUNC(DIV(infoX,256)) loX=MOD(infoX,256)
BYTEC i magedataX+2*loopX}=BYTE(h i X) - BYTEOmagedataX+2*loopX+1}=BYTE(loX)
NEXT loopX RETURN
i
PROCEDURE initimage (x&, y&, l&, h&, prof4, planepick4, planeonoffS, imagedataX, nextimageX, VAR imageX) i mageX=HAlLOC(20,4H4)
INT imageX+0)=x4 ! LeftEdge
INT image%+2)=y4 ! TopEdge
INTCimageX+4>=l& ! Width
INT imageX+6)=h4 ! Height
INT(imageX+8}=prof4 ! Depth
LONG imageX+10}=imagedataX ! ImageData
BYTE imageX+14}=planepick4 ! PlanePick
BYTE imageX+15}=planeonoff4 ! PlaneOnOff
LONGCimageX+16>=nextimageX ! Nextlmage
RETURN ¦
PROCEDURE liberedataimege(largeurX,hauteurX,deepX,imagedataX)
IX=DIV(largeurX,16)
IF MOD(largeurX,16)>1 THEN INC IX ENDIF
nombre&=MUL(MUL(HUL(IX,hauteurX),deepX),2)
“MFREE(imagedataX,nombreS)
RETURN
i
1 bitplane numéro 1 DATA Sx1111111111111111 DATA Sx1000000000000001 DATA &x1011111111111101 DATA Sx1010000000000101 DATA Sx1010111111110101 DATA Sx1010100000010101 DATA Sx1010101111010101 DATA Sx1010101001010101 DATA Sx1010101001010101 DATA Sx1010101111010101 DATA Sx1010100000010101 DATA Sx1010111111110101 DATA Sx1010000000000101 DATA Sx1011111111111101 DATA Sx1000000000000001 DATA Sxl111111111111111 1 bitplane numéro 2 DATA SxOOOOOOOOOOOOOOOO DATA Sx0111111111111110 DATA Sx0111111111111110 DATA Sx0110000000000110 DATA Sx0110000000000110 DATA Sx0110011111100110 DATA SxOI10011111100110 DATA &x0110011001100110 DATA &x0110011111100110 DATA 4x0110011111100110 DATA 4x0110000000000110 DATA 4x0110000000000110 DATA 4x0111111111111110 DATA 4x0111111111111110 DATA 4x0000000000000000 DATA 4x0000000000000000 ‘ bitplane numéro 3 DATA 4x0000000000000000 DATA 4x0000000000000000 DATA 4x0000000000000000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0000000000000000 DATA 4x0000000000000000 DATA 4x0000000000000000
Voyons maintenant comment utiliser nos images dans les gadgets. C'est ce qui montre le listing 2. Il reprend le programme de démo du mois dernier, et ajoute des images à nos gadgets.
Nous avons vu la dernière fois les zones image% et imageselect%. C'est à cet endroit que nous plaçons les addresses des structures Image correspondant au gadget au repos et au gadget sélectionné. Une petite précision : Flags prend ici la valeur 6, soit &XO 1 O 1 O (le bit 2 indique que les champs GadgetRender et SelectRender pointent sur des structures Image; si ce bit 4 est mis à O, ils pointent sur des structures Border - que nous verrons une prochaine fois).
Enfin, la fonction Intuition RemoveGlist que nous utilisons ici pour enlever les gadgets, permet d'enlever une liste de gadgets en une seule instruction, en précisant le premier ainsi que le nombre de gadgets à retirer.
Notre prochain rendez-vous sera consacré à l'étude de deux nouveaux types de gadgets : les gadgets de chaîne et les gadgets proportionnels. En attendant, je vous souhaite à tous une bonne et chouette Anigannée. Salut les Amis Gars. •
Denis Obriot
Programme 2
Programme de démonstration des gadgets
D. OBRIOT OCT 89
’ ouverture écran et fênetre
i
OPENS 1,0,0,640,250,4,4H8000
TITLES 1,"TEST DES GADGETS INTUITION»
flag%=1+2+8+4+4096+65536
i dcmp%=4H10+4H8+4H20+4H40+4H200+4H40000+4H30000 ! Ou INACTIVEWINDOW
OPENW 1,10,10,600,200,i dcmpX,flagX
TITLEW 1,"FENETRE DES GADGETS»
fenetreX=WINDOW(1)
rasportx4wiND0U( 1 )+50>
DIM gadgetX(16)
i
1 Définition des images
i
i nitdataimage(16,16,3,imagedataX)
initimage(0,0,16,16,3,4X1110,1,imagedataX,0,imageX)
initimage(0,0,16,16,3,4X111,4X1000,imagedataX,0,imageselectX)
i
1 boucle pour définir les couleurs
i
FOR loopX=1 TO 15 SETCOLOR loopX,loopX,0,loopX NEXT loopX
i
• définition des gadgets
i
FOR i=1 TO 16
gadget(50+20*i,100,16,16,6,4H102,1,imageX,imageselectX,i,0,gadgetX) gadgetX(i)=gadgetX NEXT i
"RefreshGadgets(gadget%(1),fenetreX,0)
i
LeftEdge
TopEdge
Width
Height
Depth
i
• demande traitement des événements Intuition
i
ON MESSAGE GOSUB mess
i
1 attente d'un événement
i
DO SLEEP LOOP UNTIL MOUSEK=2
i
1 libère la mémoire ¦
"RemoveGL i st(fenetre%,gadgetXC1),16) liberedataimageCl6, 16,3, imagedataX)
"MFREEC image%,20)
"MFREECimageselectX,20)
FOR î=1 TO 16 "MFREE(gadgetXCi),44)
NEXT i
Fin du programme
END
PROCEDURE gadget(x&, y& imageselectX, gadgetid&, spécialinfoX, VAR gadgetX) gadgetX=MALLOC(44,&H4)
IF gadgetX=0 THEN PRINT "Plus de mémoire !»
END END IF
LONGCgadgetX*0}=0 INT CgadgetX+4)=x&
INTCgadgetX+6>=y&
I NT gadgetX+8)=l&
I NT CgadgetX+10}=h4 I NT CgadgetX+12)=flag&
I NT CgadgetX+14>=act i 4 INT CgadgetX+16}=type4 LONG gadgetX+18>=imageX LONGCgadgetX+22>=imageselectX ! SelectRender LONG gadgetX+26}=0 ! IntuiText
LONG gadgetX+30>=0 ! MutualExclude
LONG gadgetX+34>=specialinfoX ! Spécial Info CARDCgadgetX+38>=gadgetid& ! GadgetID LONG gadgetX+40>=0 ! UserData
fenetreX=WINDOU(1) posX=-1
posX=AddGadget(fenetreX,gadgetX,posX)
1 longueur gadget 44 RETURN ¦
PROCEDURE mess LOCATE 1,1 IF MENUC1)=32 THEN PRINT "Un gadget vient d'être cliqué !"
PRINT "Numéro du gadget :»;CARD ;MENU(4)+38}
END IF RETURN
i
PROCEDURE liberedataimageClargeurX,hauteurX,deepX,imagedataX) IX=DIV(largeurX,16)
IF M00(largeurX,16)>1 THEN IX=IX+1 END IF
nombre&=MUL(MUL(MUL(IX,hauteurX),deepX),2)
"MFREEC imagedataX,nombre&*2)
RETURN
i
PROCEDURE initdataimageClargeurX,hauteurX,deepX,VAR imagedataX) lX=DIV ClargeurX,16)
IF MOOClargeurX,16)>1 THEN IX=IX+1 END IF
nombre&=MULCMULCMULCIX,hauteurX),deepX),2) imagedataX=MALLOCCnombre&*2,&H2)
IF imagedataX=0 THEN PRINT "impossible "
END END IF
FOR loopX=0 TO DIVCnombre&,2)-1 READ infoX
hiX=TRUNCCDIVC infoX,256)) loX=MOOCinfoX,256)
BYTEC i magedatàX+2*loopX}=BYTE Ch iX)
BYTECimagedataX+2*loopX+1>=BYTECloX)
NEXT loopX RETURN ¦
PROCEDURE initimageCx&, y&, l&, h&, profi, planepickfc, planeonoffS, imagedataX,
14, h4, flag4, acti4, type4, imageX,
! NextGadget ! LeftEdge ! TopEdge ! Uidth ! Height ! Flags
! ActivationFlags ! GadgetType
! GadgetRender
nextimageX, VAR imageX) i mageX=MAL LOCC 20,&H4)
INT i mageX+0>=x& INT imageX+2}=y& INT imageX+4>=l& INT imageX+6>=h&
I NT imageX+8}=prof& LONG imageX+10>=imagedataX BYTE imageX+14)=planepick& BYTE imageX+15>=planeonoff& LONG i mageX+16)=next i mageX RETURN ¦
ImageData
PlanePick
PlaneOnOff
Nextlmage
' plan bit numéro 1 DATA 4x1111111111111111 DATA 4x1000000000000001 DATA 4x1011111111111101 DATA 4x1010000000000101 DATA 4x1010111111110101 DATA 4x1010100000010101 DATA 4x1010101111010101 DATA 4x1010101001010101 DATA 4x1010101001010101 DATA 4x1010101111010101 DATA 4x1010100000010101 DATA 4x1010111111110101 DATA 4x1010000000000101 DATA 4x1011111111111101 DATA 4x1000000000000001 DATA 4x1111111111111111 ' plan bit numéro 2 DATA 4x0000000000000000 DATA 4x0111111111111110 DATA 4x0111111111111110 DATA 4x0110000000000110 DATA 4x0110000000000110 DATA 4x0110011111100110 DATA 4x0110011111100110 DATA 4x0110011001100110 DATA 4x0110011111100110 DATA 4x0110011111100110 DATA 4x0110000000000110 DATA 4x0110000000000110 DATA 4x0111111111111110 DATA 4x0111111111111110 DATA 4x0000000000000000 DATA 4x0000000000000000 ' plan bit numéro 3 DATA 4x0000000000000000 DATA 4x0000000000000000 DATA 4x0000000000000000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0001111111111000 DATA 4x0000000000000000 DATA 4x0000000000000000 DATA 4x0000000000000000
Application
LE VIRUS KILLER DE LITTLE ZEUS : DEUXIEME PARTIE
Rappelons brièvement ce que nous avons déjà fait dans les deux numéros précédents : nous avons décidé de créer un Virus-Killer offrant quelques particularités intéressantes. Ainsi, il veille dès son implantation en mémoire il veille; si vous insérez une quelconque disquette infectée, que ce soit après un Reset ou non, le Virus-Killer s'empresse de proposer à l'utilisateur sa destruction. Si celui-ci acquiesce, le Virus-Killer enchaînera trois étapes dont deux simultanées : tout d'abord, le virus est effacé de la mémoire, puis du book-block de la disquette infectée, et le Virus-Killer se reproduit. Ainsi, à chaque nouveau chargement de la disquette anciennement contaminée, le Virus-Killer se mettra en action._
omme convenu le mois dernier, nous vous proposons un organigramme. Celui-ci présente le programme et sa structure d'une manière simplifiée. Il vous permettra (normalement) une plus grande compréhension du fonctionnement du Virus-Killer. Notons qu'on y retrouve les trois modes d'accès à la routine : par un auto-chargement, un Reset, ou par l'insertion d'une disquette alors qu'un programme est en cours. Nous allons profiter de la dernière partie de la routine du Virus-Killer pour étudier le trackdisk.device et la librairie Intuition.
Nous avions étudié les devices d'une manière très générale il y a de cela deux mois. Rappelons seulement que ce sont des routines en ROM (NDLR : ou chargées en RAM depuis le répertoire Devs : de la disquette Workbench) assez puissantes, qui s'occupent de divers tâches. Le trackdisk.device est une sous- partie de ces devices. Comme son nom l'indique, il permet l'accès aux disquettes. C'est-à- dire que grâce à lui, on peut par exemple lire une partie de la disquette. Dans le cadre de notre programme, nous l'utilisons pour recopier le Virus-Killer sur le boot-block. Le trackdisk.device offre dix-huit commandes dont voici les plus importantes :
Nom N ° Fonction
READ
2
Lecture de n secteurs
WRITE
3
Ecriture de n secteurs
UPDATE
4
Report du tampon de piste sur la disquette
CLEAR
5
Annonce l'invalidité du tampon de piste
MOTOR
9
Allumage extinction du moteur du Drive
SEEK
10
Déplacement de la tête de lecture
FORMAT
1 1
Nombre de pistes à initialiser
CHANGENUM
1 3
Indication du nombre de changement de disquettes
CHANGESTATE
14
Vérifie que la disquette est insérée
PROSTATUS
1 5
Vérifie si la disquette est protégée
GETDRIVETYPE
18
Indique le type de lecteur utilisé
GETNUMTRACKS
19
Donne le nombre de pistes que contient la disquette
ADDCHANGEINT
20
Installation d'une routine d'interruption appelée à char que insertion d'une nouvelle disquette
REMCHANGEINT
21
Annulation de cette interruption
LASTCOMM
22
Envoie la dernière commande
Il s'agit maintenant d'utiliser ces valeurs; rappelez-vous que pour utiliser les devices, il faut absolument faire appel à Dolo. Cependant, l'utilisation de Dolo nécessite une structure I O. N'oublions pas que notre Virus-Killer ruse à mort pour ne pas s'ennuyer à créer une telle structure : il utilise celle déjà conçue par le programme principal. Comme vous pouvez le remarquer dans la routine , on transfère le contenu de A1 au label diskio pour sauvegarder l'adresse de base de la structure I O. Ensuite, il suffit de savoir que l'offset 28 doit contenir le numéro de la commande à effectuer. En l'occurence, nous devons y poker la valeur 3 qui correspond à l'écriture. La zone mémoire que nous désirons sauver étant notre programme lui-même, son adresse de base est Deb; on poke donc cette valeur à l'offset 40 de la structure I O. Ensuite on veut transférer un Ko, valeur qu'on communique (en octets) à l'offset 36. Enfin, l'offset 44 contient le numéro de l'octet à partir duquel les données doivent être sauvées.
Nous allons profiter d'une partie de la routine de ce mois-ci faisant appel à Intuition pour examiner cette librarie. Expliquons tout d'abord mais succintement, ce cher Max l'ayant déjà fait plus d'une fois, ce qu'est une librarie. Que
ce soit en ROM ou sur disquette (cela dépend de la version de l'Amiga) existent des ensembles de routines classées par genre sous forme de libraries. Ainsi, l'ensemble des routines travaillant avec les drives seront présentes en dos.library, celles animant les objets graphiques en g ra p h i es. I i b ra ry, ect. L'intuition.library concerne le traitement des fenêtres. Bien que nous ayions toujours évité au maximum l'utilisation des libraries à cause de la lenteur d'exécution de leurs routines, nous faisons exception cette fois-ci dans la mesure où le temps n'est pas un facteur important. Effectivement, nous utilisons Intuition pour afficher un message d'alerte avec une alternative à la clef : tuer ou non le virus résident. Comme le programme s'interrompt dans l'attente d'une réponse, le temps d'exécution n'intervient plus! Il est donc inutile de faire compliquer en programmant directement les processeurs, alors qu'intuition le fait directement modulo quelques données.
Première chose à laquelle il faut procéder afin d'utiliser une quelconque routine d'une libra- rie, l'ouvrir. Ouvrir une library signifie qu'elle doit être chargée en RAM. C'est à dire que si vous possédez un Amiga 500 ou 2000, l'ouverture consistera à recopier depuis la ROM vers la RAM la librarie qui vous intéresse. Ceci se fait au moyen de OpenLibraryO, routine de l'exec.library. Vous savez déjà certainement que l'exec.library est toujours ouverte.
Examinons maintenant le déroulement même des opérations. Notons tout d'abord que l'accès aux routines des différentes libraries se fait grâce à l'instruction.
JSR Offset(a6)
où "Offset"est l'offset négatif de la fonction à appeler, calculé à partir d'une adresse de base correspondant à la fin de la library concernée. Remarquez que nous ne nous ennuyons pas à initialiser a6 en ExecBase car en interceptant Dolo, la routine LTZ conserve la valeur de A6 (Dolo est une routine de l'exec.library). Ensuite, il suffit de savoir qu'OpenLibraryO renvoie en dO la valeur de base de la librarie ouverte. Ainsi, en copiant le contenu de dO dans a6, on pourra faire appel aux routines de la librarie ouverte. DisplayAlert requiert deux paramètres : les dimensions de la fenêtre à afficher, et le pointeur sur le début du message.
Il reste maintenant à comprendre le fonctionnement du Reset. En bref, seuls trois vecteurs nous intéressent. Tout d'abord le vecteur Coldcapture, d'offset 42 par rapport à ExecBase, sert à intercepter Reset "à froid", c'est- à-dire avant toute initialisation. Ceci est source de bug, par conséquent nous le mettons à 0, ce qui signifie qu'aussitôt après un Reset, il n'y aura aucun saut à une routine personnelle. Nous vectorisons ensuite Coolcapture (d'Off- set 46) sur notre routine, car ainsi elle est appelée après les initialisations. Enfin Chksum (d'offset 8 2) doit comporter la somme des octets compris entre les offsets 34 et 7 8.
Avant de nous quitter, il pourrait être intéressant d'insister sur Install. Imaginons le cas suivant : notre Virus-Kil|er est en mémoire, on procède au Reset d'une disquette infectée. Reset étant vectorisée sur la partie de notre Virus-Killer concernant l'initialisation, au premier retour de notre routine, le Virus-Killer n'a pas encore connaissance de la présence du Virus. Ensuite, la première piste qui contient le Virus est lue et chargée en mémoire. On intercepte alors Dolo et on élimine le Virus du boot- block. Cependant, si nous en restions là, après être retourné au système d'exploitation, le Virus-Killer s'exécuterait. Afin d'empêcher ceci, on remplace le programme du Virus par un programme inerte.
Ainsi s'achève notre Virus-Killer. La forme sous laquelle il a été présenté dans ces trois numéros permet à la routine de fonctionner uniquement sous Kickstart 1 .2. En ce qui con-' cerne le 1.3, il faudrait changer l'adresse de Dolo. Il ne tient qu'à vous d'explorer la machine.
La première fois que vous désirez copier le Virus-Killer sur disquette, assemblez-le sous Seka et chargez-le à partir d'un moniteur qui vous permet d'avoir le checksum de boot- blocks. Vous retenez cette valeur que vous placez au label "chesksum" après avoir rechargé le source du Virus-Killer sous K-Seka. Enfin, vous le lancez par un "jsr init" en ayant pris soin au préalable d'avoir insérer une disquette infectée dans l'un des drives.
Sur ce, je vous quitte et vous donne rendez- vous dans le prochain numéro avec un retour au graphisme et donc aux démos - mais cette fois-ci, nous ferons appel au blitter...
Virus-Killer de Little Zeus: dernière partie
partie à mettre à la suite des précédentes
lea
intuitionn,a1 ;
Ouverture d'intuiton
jsr
openlib(a6)
move.1
d0,a6
clr.l
dO
on fait apparaître un message
move.1
«30, d1
dans un cadre de $ 30 pixels de hauteur
lea
virusmes,aO ;
pointe sur le message à afficher
jsr
DisplayAlert(a6)
move.1
ExecBase,a6
cmp.b
1 ,d0
teste le bouton gauche
beq
sortie ;
appuyé, donc on laisse le virus
move.b
101,drive ;
nécressaire au checksun
move.1
diskio,a1 3,2801)
move
écriture du bootblock sur la disquette
move.1
deb,40O1)
move.1
2*512,36(a1)
move.1
0*512,4401)
jsr
$ fc06dc
appel le Dolo
move.I
diskio,a1
move.b
sortie:
nerror,31(a1)
; Svte Warnor ; SCA
; il est possible d'ajouter ; autant de oortraits oue l'on veut vi rustabf: intuitionn:
dc. b 'intuition.lîbrary',0 even
S RETOUR Routine"! Rooes; | Fkito Bootage | | Reset jf
k
*
- orîTTGT proar*nm
• n 57F8e0
inîtcc:
move.l
54,a6
move.1
reseta,46(a6)
clr.l
42(a6>
mam:
lea
34(a6),a0

moveq
«17,d1
clr.w
dO
lio:
add.w
(a0)*,d0
dbra
d1,lio
not .w
dO
move.w
d0,(a0>
rts
vi rustab
de. 1
16,'Vi ru'
. ? ¦
de. 1
S66,S0a0100ff
de. 1
Sdc,54bf900df
; 'portrait* de chaque virus ; Byte Bandit
movem.l (a7>+,a0-a6 d0-d7 clr.w aut clr.w time rts endïo: jmo 5fc06dc
; Initialisation de Coolcapture
vî rusmes
de. W
S10
¦>
dc. b
14,1 lîttle 2eus ANTI VIRUS V 1.0 (C) APRIL 1989 •
dc. w
158
dc. b
0,510,24,* THE DF*
drive:

dc. b
• 0: IS INFECTED BY A VIRUS OID ANTIVIRUS1
dc. w
158
dc. b
0,510,34
dc. b
" PRESS 8UTT0N:"
dc. w
158
dc. b
0,588,38," LEFT:LET IT TRAVEL RIGHT;PLEASE KlIL IT «"
P *
dc. b
0,0
even
install:
; début d'un boct block non infecté
¦
,
¦ :
de. 1
5444f5300,5c0200f19,500000370
V ‘ •• • • • -*
de. 1
543fa0018,54eeeffa0,S4a80670a
de. 1 dosl:
520402068,S00167000,S4e7570ff
¦
de. 1 de. 1
560fa646f,5732e6c69,562726172 579000000
n:
blk.b 5400,0
org
deb-32
load
deb-32
Sli"
diskio:
de. 1 0
aut:
dc. w 0
waic:
de.', 0

nerror:
time:
dc. w 0
dc. w 0
• - .'•'V .t'W ...
£
I
ranr
• s vecteurs Reset
3
1 Chargement saris Ruto-
Booîaqe ni Reset
i
Ijsr 1a Ivraie Doloj
k Pas de Virus
” identification du DRIVE
RCCES:
• .•
'•-a
.
A,
.
" S
sx*
:
¦identif ;cationde 1 zone henoire du Virut
vvtî»
'
oui ... i ininat ion tuTTTÏÏÜ?! Dans la Henoire
• >v3?wKr3
- - .>
INITIATION A L'ASSEMBLEUR 68000
Voici donc une toute nouvelle série qui commence au sein de notre initiation à l'assembleur sur Amiga : Indiana Max et les derniers aventuriers de l'Amigados maudit. On s'accroche aux bastingages, c'est parti.
Eu... Oui, c'est parti... Mais où? Parce quel'AmigaDOS, je dis pas ça pour vous décourager, mais c'est tout de même assez grand. C'est même plutôt vaste. Ah oui, je sais : on va commencer hyper-soft, par quelques généralités... heu... générales.
IL A BON DOS
Tout le monde ne le sait peut-être pas, mais à ses premières heures, alors qu'il n'était encore qu'une lueur lubrique dans les yeux de ses créateurs, le système d'exploitation de l'Amiga n'était pas l'AmigaDOS tel qu'on le connaît maintenant, mais le CAOS (Commodore Amiga Operating System - notez au passage le jeu de mots, ouarf ouarf ouarf, qu'est- ce qu'on s'marre). Il était inspiré du Tripos (un système d'exploitation développé at the Uni- versity of Cambridge Computeur Laboratory par le Tripos Research Group) et fut porté sur l'Amiga par Tim King de Metamomco et sa bande de joyeux programmeurs. Le problème c'est qu'il n'a jamais pu être finalisé, alors on sortit l'AmigaDOS, une version simplifiée et totalement ré-écrite du CAOS.
Histoire de rigoler encore un peu plus, voici quelques lignes - citées telles quelles, sans rajouts ni censure - extraites du cahier des charges du CAOS :
"C'est un système d'exploitation très mignon pour une petite (mais superbe) machine construite pour ie grand public. Son but initial n 'est pas de fournir un environnement de développement sophistiqué, mais plutôt une base suffisante à des programmes d'application aussi fonctionnels qu'utiles. Ce qui ne veut pas dire qu'il néglige les besoins des programmeurs. D'extérieur, il s'adresse aux utilisateurs finaux; mais d'intérieur, il répond aux besoins de la plupart des applications. Il possède des possibilités très étendues pour un système d'exploitation de sa catégorie.
Les buts de CAOS sont :
- fonctionalité;
- facilité d'emploi (tant à l'extérieur qu'à l'intérieur);
- programmabilité (fichiers "batch", grand nombre de fonctions) ;
- extensibilité et modularité ;
- fiabilité;
- performances;
- taille (raisonnablement compact);
- facilité de maintenance".
(Note : cette citation est extraite d'un article de Andy Finkel "In the beginning was CAOS" paru dans le Volume 1, Issue 1 d'avril 1988 de notre confrère canadien Transactor For The Amiga, dont à propos duquel on vous a déjà causé. Soit dit en passant, Andy Finkel a fait partie de l'équipe bossant sur CAOS et par la suite, sur AmigaDOS).

Bref, CAOS, c'est du passé, on a aujourd'hui à faire à AmigaDOS. Reste à savoir quel est son rôle au sein de l'Amiga.
En gros et pour simplifier, c'est grâce et à travers lui que les fichiers et répertoires existent; la fameuse Startup-Sequence et les répertoires systèmes (C :, S Devs :, etc), c'est lui; toutes les commandes CLI et Shell, évidemment, c'est encore lui; sans parler de tout ce qui est transparent à l'utilisateur normal (gestion de mémoire, etc.). Bref, c'est un sacré morceau.
TU FICHIER!
Alors puisqu'il faut bien commencer par quelque chose, et que jusqu'à preuve du contraire, c'est à moi que revient la décision de commencer par ce dont j'ai envie, on va causer un peu des fichiers.
La première chose à faire, on s'en doute (qui ne s'en doute pas? Deux heures de colle pour le petit binoclard au fond de la classe), c'est d'ouvrir la dos.library. Je vous grâce des explications pour le comment du pourquoi.
Ensuite, on procède par ordre. Avant toute écriture ou lecture dans un fichier, il convient, c'est logique, de l'ouvrir. On distingue alors deux possibilités, qui me semblent également très logiques : soit le fichier existe déjà, soit on le crée. Dans les deux cas, on n'utilise qu'une seule et même fonction, baptisée OpenO et d'offset -30. Elle attend deux paramètres : dans d1, l'adresse du nom du fichier, et dans d2, le mode d'ouverture :
Open EQU -30
MODE OLDFILE EQU 1005 ; Le fichier existe déjà
MODE~NEWFI LE EQU 1006 ; Ou on le crée
move.l DosBase,a6 ; la dos.library est
move.l FileName,a1 ; déjà ouverte
move.l M00E_0LDFILE,d2 ; Par exemple
jsr 0pen(a6)
move.l d0fFileHandle
bne OkOpen
OpenError:
OkOpen:
FileHandle: dc.l FileName: dc.b
"Nom du fichier",0 ; Par autre exemple
Comme on peut s'en apercevoir, Open () renvoie un handle de fichier dans dO, handle dont on se servira par la suite pour tout accès à ce fichier. Si ce handle vaut O, c'est que la fonction a échoué, auquel cas il convient de traiter l'erreur de manière appropriée.
Une fois le fichier ouvert, on va essayer de lire son contenu. On utlise pour celà la fonction ReadO, d'offset -42. Les paramètres sont aussi logiques qu'attendus : le handle du fichier ouvert dans d1, l'adresse où les données lues doivent être logées dans d2, et le nombre d'octets à lire dans d3. Ce qui nous donne en gros :
Read EQU -42
; Lecture dans un fichier ouvert avec M00E_0LDFILE OkOpen: move.l FileHandle,d1 ; Renvoyé par OpenO
move.l Buffer,d2 ; Adresse de lecture
move.l 1000,d3 ; Longueur à tire
jsr Read(a6) ; Et hop !
Tst.l dO ; Tout va bien ?
Bpl OkRead
ReadError: ...
OkRead:
Tout comme ReadO, WriteO renvoie dans dO le nombre d'octets réellement écrits, O en cas d'EOF ou -1 en cas d'erreur.
Pour se déplacer dans le fichier, ce qui permet par exemple de relire une information qu'on a écrite quelques instants auparavant, ou au contraire pour aller lire le Xe octet précisém- ment, on dispose de la fonction SeekO, d'offset -66. Elle attend comme paramètre dans d 1, le handle du fichier, dans d2, l'intervalle de déplacement et dans d3, le mode de déplacement.
; Lecture directe du 352ème octet du fichier (par exemple)
Seek EQU -66
OFFSET_BEGINNING EQU -1 ; Depuis le début du fichier
OFFSET_CURRENÎ EQU 0 ; Depuis la position actuelle
OFFSETJEND EQU 1 ; Depuis la fin du fichier
OkOpen: move.l FileHandle,d1
move.l 352,d2
move.l 0FFSET_BEGINNING,d3 jsr Seek(a6)
tst.l dO
bpl.s OkSeek
SeekError:
OkSeek:
Le nombre retourné dans dO indique la position actuelle du pointeur de fichier s'il est positif, un EOF s'il est nul et une erreur s'il est négatif. Les offset indiquent à partir d'où le pointeur devra être déplacé.
Spécifie le début du fichier, la position actuelle du pointeur et la fin du fichier. L'intervalle quant à lui peut-être soit positif (déplacement "vers l'avant") soit négatif (déplacement "vers l'arrière").
Reste à fermer le fichier, ce qui se fait tout naturellement grâce à la fonction CloseO d'offset -36. Le seul paramètre à lui fournir est le handle du fichier, dans d1 toujours :
ReadO retourne dans dO le nombre d'octets réellement lus, O si la fin du fichier a été atteinte (EOF), ou -1 si une erreur (autre que EOF, donc) est survenue.
L'inverse de ReadO est WriteO, qui permet d'écrire des données dans un fichier. Son offset est -48 et les paramètres qu'elle attend sont exactement identiques à ceux de ReadO :
Write EQU -48
; Ecriture dans un fichier ouvert avec MODE_NEUFILE OkOpen: move.l Fi leHandle,d1 ; Renvoyé par OpenO
move.l Buffer,d2 ; Adresse des donnée:
move.l 1000,d3 ; Longueur à écrire
jsr Write(a6) ; Et hop !
Tst.l dO
bpl OkWrite
WriteError:
OkWrite:
Close EQU -36
move.l FileHandle,d1
jsr Close(a6)
Toutes ces fonctions, à l'exception de CloseO, renvoient un éventuel code d'erreur négatif dans le registre dO. Seulement voilà, il existe tellement d'erreurs possibles, qu'il peut souvent être judicieux d'informer l'utilisateur de votre programme qu'erreur il y a. Le meilleur moyen d'y parvenir est encore d'appeler la fonction loErrO, d'offset -1 32. Elle n'attend aucun paramètre mais renvoie dans dO un code similaire à ceux utilisés par les commandes CLI (par exemple, 221 pour Disk Full). A titre d'information, voici un tableau des codes d'erreur AmigaDOS existant et leur signification.
Code Message correspondant
1 03 insufficient free store 1 05 task table full
1 20 argument line invalid or too long 12 1 file is not an object module
1 22 invalid résident library during load
202 object in use
203 object already exists
204 directory not found
205 object not found
206 invalid window description 209 packet request type unknown
211 invalid object lock
212 object not of required type
213 disk not validated
214 disk write-protected
215 rename across devices attempted
216 directory not empty
218 device (or volume) not mounted
219 seek failure
220 comment too big
2 21 disk full
2 22 file is protected form deletion 22 3 file is write protected 2 24 file is read protected
225 not a valid DOS disk
226 no disk in drive
2 32 no more entries in directory
Pour écrire un texte dans cette fenêtre, emploie encore la fonction WriteO :
Texte:
TexteLen
move.1
WinHandle,d1
move.1
Texte,d2
move.1
TexteLen,d3
jsr
Write(a6)
de .b
"Youkaïdi, Youkaïda",0
EQU
* -Texte
Ici, le nombre d'octets à écrire est calculé par l'assembleur par soustraction de l'adresse courante (désignée par l'étoile) à celle du début du texte. Amis fainéants, bonjour.
On
De la même manière, on peut lire dans cette fenêtre, grâce à la fonction ReadO :
10 caractères à lire
ReadUin:
move.1
WinHandle,d1
move.1
Buffer,d2
move.1
10,d3
jsr
Read(a6)
Buffer:
dcb.b
10
Tout ça ne vous rappelle rien? Bien sur que si : la commande Why du CLI.
La plupart de ces erreurs sont signalées par un "system requester" qu'AmigaDOS affiche sur l'écran du Workbench.
Mais voilà qui ne conclut par pour autant les fonctions dédiées à la gestion des fichiers. Vous n'êtes pas sans savoir - sinon, vous ne l'êtes maintenant plus - qu'il est possible d'ouvrir une fenêtre CON RAW ou New- CON : de la même manière qu'on ouvre un fichier standard. Dans l'exemple ci-dessous :
OpenWin: move.l
move.I move.I jsr
move.I
DosBase,a6 WindowName,d1 M0DE_0LDFI LE,d2 0pen(a6) dO,WinHandle
WinHandle: dc.l 0
WindowName: dc.b "NewCON:0 11 640 200 Fenêtre !",0
Output
EQU
- 60
GetCLIout
move.1
jsr
move.1
DosBase,a6 Output(a6) dO,CliOut
WriteCLI:
move.1 move.1 move.1 jsr
d0,d1
Texte,d2
TexteLen,d3
Write(a6)
Cli Out:
de. 1
0
Texte:
dc. b
"Passe-moi l
TexteLen
EQU
* -Texte
on ouvre une fenêtre NewCON : (Workbench
1. 3 uniquement!) Aux coordonnées (0,11), de largeur 640 et de hauteur 200. Notez bien qu on spécifie MODE-OLDFILE comme si la fenêtre existait déjà - alors qu'à l'évidence, ce n'est pas le cas. Moi, j'ai renoncé à comprendre pourquoi.
Cette méthode présente un avantage pour l'utilisateur : même s'il entre cent cinquante, douze mille caractères au clavier, ils seront* effectivement affichés, mais lors de l'appui sur la touche Return, seuls les 1 0 premiers seront transmis au programme.
Enfin, on ferme la fenêtre, encore une fois de la même manière qu'un fichier standard, avec la fonction CloseO :
CloseWin: move.l jsr
WinHandle,d1
Close(a6)
Oui, je sais ce que vous pensez : "et si je veux afficher des données directement dans la fenêtre CLI, sans passer par l'ouverture d'une fenêtre à moi, hein?. Rien de plus simple, reponds-je alors, utilisez la fonction OutputO d'offset -60. Son rôle est de fournir au programme la handle de la fenêtre CLI depuis laquelle il a été lancé, comme s'il l'avait lui- même ouverte :
Même chose dans l'autre sens : pour lire des données depuis la fenêtre CLI, on utilise la fonction Input), d'offset -54 :
Input
EQU
- 54
GetCLIïn:
move.1
jsr
move.1
DosBase,a6 Input(a6) dO,Cliln
ReadCLI:
move.1 move.1
d0,d1
Buffer,d2
move.1 jsr
1 ,d3 Read(a6)
; 1 seul caractère.
Cliln:
de. 1
0
Buffer:
de. 1
0
; Y1a du rab !
Plutôt sympa, non?
Bon, imaginez maintenant que vous ayez besoin de lire des caractères sur l'interface série, parce que par exemple, vous avez un modem branché dessus (ce sont des choses qui arrivent). Rien ne vous permet à priori de vous assurer que le modem est bel et bien branché (à moins que vous ne développiez ce programme pour vous-même et dans un but strictement personnel, auquel cas vous n'avez peut-être pas besoin de telles procédures de test d'erreur). Pourtant, il existe une fonction plutôt sympathique baptisée WaitForCharO d'offset -204, qui permet d'attendre un caractère sur un canal ouvert en entrée pendant un laps de temps déterminé :
Wai tForChar
EQU
- 204
OpenRS:
move.1 move.1 move. 1 jsr
move.1
DosBase,a6 RSName,d1 M0DE_0LD FI LE,d2 0pen(a6) dO,RSHandle
TestRS:
RSError:
move.1 move.1 jsr tst. 1 bne.s
d0,d1 50,d2
Wai tForChar(a6) dO
OkRS
; Attends 1 second
max.
OkRS:
move.1 move.1 move.1 jsr
RSHandle,d1 Buffer,d2 1024,d3 Read(a6)
RSHandle:
RSName:
Buffer:
de. 1
dc. b dcb.b
0
"SER:",0,0
1024
Si, au bout exprimé en 1
du temps spécifié dans 50e de seconde - aucun
d2 - carac-
tère n'est disponible sur le canal, dO contient en retour la valeur O (FALSE). Dans le cas contraire, dO contient la valeur -1 (TRUE) et on peut aller lire le(s) caractère(s) avec ReadO. Pratique, non?
CHANGE DE REPERTOIRE!
Si vous n'êtes pas bêtes - et si vous lisez ces pages, c'est bien que vous ne l'êtes pas... - vous aurez remarqué que les fichiers ne sont
pas les seuls éléments que l'on trouve sur une disquette. Il existe aussi les répertoires, également appelés directories pour les ceusses comme moi qui préfèrent l'anglais, ou drawers pour les autres qui ne parlent que Workbench.
Il me semble logique que l'on n'ouvre pas un répertoire comme on ouvre un fichier normal; il y a certaines règles à respecter.
Commençons par le commencement, si vous voulez bien, et imaginons que nous voulions créer un nouveau directory sur la disquette placée en DFO : (ce que fait la commande CLI MakeDir, soit dit en passant). Nous appelons pour ce faire la fonction CreateDir d'offset - 1 20, qui attend dans d 1 l'adresse du nom du nouveau répertoire :
- 120
DosBase,a6 Di rName,d1 CreateOi r(a6) dO,Di rLock OkD i r
CreateDir EQU
move.I move.I jsr
move.I bne.s
Di rError: OkD i r:
DirLock: dc.l
»DF0:NewOir",0
DirName: dc.b
Précision utile pour les fanas du Workbench : tout comme MakeDir, cette fonction ne crée pas d'icône associée au répertoire; à vous de vous débrouiller!
CreateDirO renvoie dans dO un pointeur sur ce qu'on appelle un structure Lock, ce que l'on pourrait traduire par "clé d'accès au répertoire". De la même manière que le handle des fichiers, le Lock sera utilisé par la suite pour tout accès au répertoire auquel il est associé. Cette structure est longue de 20 octets, et se présente comme suit :
Offset
Nom
Signification
*
NextLock
Prochain Lock ou 0
4
DiskBIock
Numéro du premier block du
répertoire
8
Access Type
Type d'accès
1 2
Proced ID
Numéro d'identification
. 16
VoINode
Pointeur sur les infos disquette
Le "Type d'Accès" peut prendre les valeurs -1 (accès exclusif, c'est-à-dire qu'un seul programme peut avoir accès au répertoire à ce moment donné) ou -2 (accès général, toutes les applications ont accès au répertoire).
Dans le cas où le répertoire existe déjà sur la disquette, il est inutile de le créer avec CreateDirO - qui d'ailleurs échouerait lamentablement. On utilise dans ce cas la fonction LockO d'offset -84, qui attend deux paramètres, à
wl
- 84
EQU
savoir dans d1, l'adresse du nom du répertoire et dans d2, le type d'accès :
ACCESS_READ EQU -2
ACCESS WRITE EQU -1
Lock
taire etc. Son utilisation - sous CLI ou Shell uniquement - est très simple puisqu'il suffit d'entrer
Examine Nom-du-répertoire pour qu'une liste de son contenu soit affichée.
Tant qu'on y est et avant que j'oublie, voici tout de suite le contenu et l'organisation de ce fameux FileinfoBlock :
move.l DosBase,a6 move.l DirName,d1 move.l ACCESS_READ,d2 jsr Lock(a6) move.l dO,DirLock bne.s OkLock
LockError:
OkLock:
DirLock: dc.l 0
DirName: dc.b "Sys:System",0
ACCESS -READ signifie qu'on va accéder au répertoire en lecture uniquement, donc qu'on ne va pas modifier son contenu, donc que les autres applications peuvent également y accéder sans danger.
ACCESS -WRITE signifie au contraire qu'on y accède en écriture, donc qu'on est succepti- ble d'en modifier le contenu, et donc que les autres applications ne peuvent y accéder également (imaginez Deluxe Paint en train de charger une image et vous l'effaçant avant qu'il ait terminé...).
Le contraire de LockO, c'est UnLockO. Son offset est -90 et le seul paramètre qu'elle attend est le Lock à libérer dans d 1 :
UnLock
- 90
EQU
move.I jsr
Di rLock,d1 UnLock(a6)
A partir de là, la mémoire utilisée par la structure Lock est libérée, et le répertoire devient à nouveau accessible à tous.
On peut également examiner le contenu d'un répertoire grâce aux fonctions ExamineO et ExNextQ. Leurs offsets respectifs sont -102 et -108, et elles réclament les mêmes paramètres, c'est-à-dire dans d 1 le pointeur sur la structure Lock et dans d2, le pointeur sur une zone de mémoire de 260 octets qui sera remplie d'informations toutes plus utiles les unes que les autres et qu'on appelle FilelnfoBlock. Ces deux fonctions permettent d'examiner dans le détail le contenu d'un répertoire, en d'autres termes, d'en obtenir la liste (commande LIST du CLI). ExamineO sert à se brancher sur la première entrée du répertoire (en fait, elle renvoie le nom du répertoire lui- même), ExNextO recherhe les suivantes, une à une. Pour illustrer celà, voici une routine semblable à la commande LIST, qui se contente toutefois d'afficher le nom des fichiers qu'elle trouve, donc sans leur taille, attribut, commen-
54
r
Offset
Nom
Signification
O
Diskkey
Numéro de la disquette
§
DirEntryType
Type d'entrée ()0 : (O : fichier)
8
FileName
Nom du fichier ou dir ( 1 08 octets)
1 1 6
Protection
Attributs (A, R, E, W, D)
1 20
EntryType
Type d'entrée
1 24
Size
Taille du fichier
1 28
NumBlocks
Nombre de blocks occupés
1 32
Days
Date de création
1 36
Minutes
Heure de création (minutes)
140
Ticks
Heure de création (secondes)
144
Comment
Commetaire (116 octets)
Comme on le voit, 108 octets sont réservés au nom du fichier, alors qu'AmigaDOS n'en permet que 32, et 1 1 6 au commentaire, alors qu'on n'a droit qu'à 80. Les futures versions du système d'exploitation permettront peut- être d'exploiter tout ces espaces.
; Examine - Par Max
; exec.
Library
ExecBase EQU
4
OpenLîbrary EQU
- 408
CloseLibrary EQU
- 414
; dos.library

Write
EQU
- 48
Output
EQU
- 60
Lock
EQU
- 84
UnLock
EQU
- 90
Examine
EQU
- 102
ExNext
EQU
- 108
IoErr
EQU
- 132
ACCESS _l
READ EQU
-2
Argv
EQU
0
DosBase
EQU
-4
DirLock
EQU
-8
CLIOut
EQU
- 12
VARSIZE
EQU
- 16
Start:
move.b
0,-1(a0,d0.w)
9
move.1
ExecBase,a6
link
a5, VARSIZE
i
move.1
aO,Argv(a5)
i
lea
FileInfo(pc),a4
t
lea
Buffer(pc),a3
t
subq.w
1,d0
9
beq
Exit
OkArgs:
lea
DosName(pc),a1
9
jsr
0penLibrary(a6)
move.1
dO,DosBase(a5)
bne.s
OkDos
moveq
20,d7
bra
Exit
OkDos:
move.1
d0,a6
9
jsr
0utput(a6)
move.1
dO,CLIOut(a5)
; Remplace LF par 0
; Ouvre la dos.library
GetLock:
move.1
Argv(a5),d1
; Lock() sur le répertoire
move.1
ACCESS_READ,d2
jsr
Lock(a6)
move.1
dO,DirLock(a5)
bne.s
OkLock
jsr
IoErr(a6)
; Si ça se plante,
move.1
d0,d7
; on dit pourquoi
bra.s
CloseDos
OkLock:
move.1
d0,d1
; Première entrée
move.1
a4,d2
jsr
Examine(a6)
tst. 1
dO
bne.s
OkExam
jsr
IoErr(aé)
; Foi ré ? (c'est rare !)
Move.1
d0,d7
bra.s
FreeLock
OkExam:
move.1
Di rLock(a5),d1
move.1
a4,d2
jsr
ExNext(a6)
tst. 1
dO
beq.s
FreeLock
Print:
tst. 1
4(a4)
; C'est un répertoire ?
Bmi .s
Print2
; Non
lea
DirText(pc),a2
; Oui -> on affiche le
bra.s
Print3
; mot DIR> avant
Print2:
lea
SpcText(pc),a2
Print3:
move.1
CLI0ut(a5),d1
; On affiche
move.1
a2,d2
; le nom du fichier
move.1
Di rLen,d3
jsr
Urite(a6)
lea
8(a4),a0
; Filelnfo + 8 = FileName
move.1
a3,a1
; Buffer temportaire
moveq
0,d3
; Longueur du nom
moveq
31,dO
; 32 characrtères maximum
TestName:
addq.w
1 ,d3
move.b
e0)+,(a1)+
dbeq
dO,TestName
move.b
$ 0a,-(a1)
move.1
CLI0ut(a5),d1
move.1
a3,d2
jsr
Wri te(a6)
bra.s
OkExam
FreeLock:
move.1
DirLock(a5),d1
jsr
UnLock(a6)
CloseOos:
move.1
ExecBase,a6
move.1
DosBase(a5),a1
jsr
CloseLibrary(a6)
moveq
0,d7
Exit:
uni k
a5
move.1
d7,d0
rts
1
cnop
0,4
Di rText:
dc. b
" DIR> "
Di rLen
EQU
* -DirText
SpcText:
dc. b
n n
DosName:
dc. b
"dos.1ibrary",0
cnop
0,4
Filelnfo:
ds.b
260
Buffer:
ds.b
32
Je ne
pense
pas que ce programme requiert
plus d'explications, sinon peut-être la routine
Print,
chargée de sortir le nom du fichier dans
la fenêtre CLI.
Car l'inconvénient de la fonction WriteO lorsqu'on l'utilise pour écrire du texte, est qu'elle a besoin de connaître le nombre de caractères à sortir. Les noms de fichiers sous AmigaDOS pouvant être de longueur variable, il faut compter un à un tous les caractères jusqu'au O final. On initialise donc le registre d3 - celui qui doit justement indiquer la longueur du texte à WriteO - à O, et on l'incré- mente au fur et à mesure que l'on teste les caractères composant le nom du fichier. A ce test s'ajoute le fait qu'un nom de fichier ne peut, dans la version actuelle d'AmigaDOS, excéder 32 caractères de long. On utilise donc le registre dO comme compteur de boucle dans l'instruction Dbcc. En gros et pour traduire tout ça en français, cela se résume à : "tant que l'on n'a pas testé 32 caractères au maximum ou que l'un des caractères testés n'est pas O, incrémente d3". Puissant, comme instruction, non?
Par la suite, on insère un Line Feed (code ASCII $ 0a) à la suite du nom du fichier, histoire que le prochain aille s'afficher une ligne plus bas et non collé au premier, avant d'appeler WriteO et de boucler sur ExNextO.
Les plus pointilleux d'entre vous trouveront certainement que je me suis embêté pour pas grand-chose en écrivant ce programme (emploi de l'instruction LINK, etc,); c'est vrai, mais ainsi il est entièrement relogeable, c'est- à-dire que vous pouvez, par exemple, l'inclure tel quel dans un programme en Gfa-Basic avec l'instruction INLINE. Et puis après tout, c'est un de ces excercices de style dont je suis assez friand.
Un dernier mot pour en terminer avec ce programme : rien ne vous empêche de l'améliorer en y insérant une routine de tri alphabétique sur les noms, de sortie de la longueur des fichiers (en hexa ou, plus difficile, en décimal) et de leur commentaire, etc. Si ces routines vous intéressent, je vous les proposerai un de ces quatre.
En attendant, on se retrouve le mois prochain pour la suite de nos investigations au sein (oh oui!) D'AmigaDOS.
Joyeuses Pâques.
Max.
AREXX! AUX PIEDS!
TRANSACTOR
Vous avez sans doute tous entendu parler du langage Arexx, mais certainement pas depuis très longtemps. Jusqu'au début de cette année, ce langage était en effet inconnu aussi bien des utilisateurs que de la plupart des développeurs français. Il aura fallu la 2° Conférence Européenne des Développeurs, pour qu'un allemand demande à Commodore d'intégrer Arexx dans la prochaine version du Workbench (le 1.4, bien sûr).
I faut bien avouer que peu de personnes dans l'assistance comprenaient de quoi il parlait. Par contre, ceux qui connaissaient déjà Arexx ont tous approuvé unanimement sa proposition, qui sonnait véritablement comme un cri du cœur.
Maintenant, ce n'est un secret pour personne, il est certain qu'ARexx fera partie du Workbench 1.4. Tous les possesseurs d'Amiga auront donc la possibilité d'utiliser Arexx.
A QUOI ÇA SERT?
Vous en êtes certainement ravis, je n'en doute pas, mais cela ne vous dit pas forcément à quoi Arexx peut bien servir... La définition que l'on en donne en général, ressemble à : "ARexx est un macro-langage permettant à des applications de communiquer entre elles". Ce qui est certes exact, mais un peu léger quand même pour décrire quelque chose qui place les logiciels intégrés au niveau des hochets et HyperCard au niveau des bouliers. Arexx est un standard qui permet d'exploiter réellement les capacités d'un système multitâches en donnant tous les moyens de faire fonctionner les programmes de façon harmonieuse, plutôt que chacun bêtement dans son coin. Evidemment, ce n'est pas toujours facile à mettre en œuvre.
Pour prendre un exemple, imaginons que vous vouliez récupérer une image sur un serveur pour l'utiliser dans un logiciel de dessin. Malheureusement, celle-ci est compressée car le serveur est plein à craquer. Vous allez donc devoir utiliser un logiciel de communication pour charger votre image, un décompacteur pour la mettre au bon format et enfin le logiciel de dessin pour pouvoir la retravailler. Ce genre
de manip va bien quelques temps, mais au bout de la vingtième image, vous en aurez peut-être assez. En supposant que vous possédiez Arexx - et que tous les logiciels cités le supportent - il vous suffira d'écrire un petit programme qui appellera successivement le logiciel de communication, le décompacteur et le logiciel de dessin et vous affichera l'image sans que vous ayez à vous préoccuper de quoi que ce soit. Une fois que vous aurez effectué les modifications, vous pourrez remettre la nouvelle image sur le même serveur avec un autre programme Arexx.
Cet exemple n'était peut-être pas très réaliste, mais quand on sait qu'en plus de logiciels de communication, il existe déjà des compilateurs, des bases de données, des éditeurs et traitement de texte et des tableurs qui supportent Arexx, on se rend compte que les possibilités sont nombreuses.
COMMENT ÇA MARCHE?
Voyons maintenant à quoi ressemble un programme Arexx. Nous allons afficher une chaîne sur l'écran de l'Amiga :
* Mon premier programme Arexx * say 'Hello, World!'
Si le programme s'appelle test.rexx, on l'exécute avec la commande "rx test", qui aura pour résultat :
Hello, World!
D'habitude, on vous dirait de ne pas vous préoccuper de la première ligne car il s'agit d'un commentaire. En fait, si vous la supprimiez, le programme ne marcherait pas, car l'interpréteur Arexx s'attend toujours à ce que la première ligne soit un commentaire. Cela s'explique par le fait qu'ARexx est un dérivé du langage REX utilisé sur les systèmes IBM. Supprimez cette ligne et aussi bien REX qu'ARexx vous affirmeront avec une mauvaise foi frisant l'insolence, qu'ils n'ont rien vu qui ressemble à un programme. D'un autre côté, les sources Arexx sont parfois tellement nébuleux que la présence garantie d'au moins un commentaire est souvent une aide précieuse. Les programmes Arexx offrent cependant l'avantage d'être des fichiers texte (comme les fichiers scripts du Shell) et peuvent être modifiés facilement. Arexx est un langage interprété, sa seule exigence étant que les noms des programmes aient l'extension ".rexx". L'instruction say correspond ici à la commande Echo du Shell, mais elle est beaucoup plus puissante; on devrait plutôt la comparer au PRINT du Basic. Regardez maintenant le programme suivant (inter.rexx) :
* Mon premier programme interactif * I arg ligne interpret ligne
Le mot-clé arg signifie qu'un paramètre est accepté dans la ligne de commande. Le mot- clé interpret ordonne à Arexx d'exécuter la commande contenue dans ligne. Par exemple :
rx inter say 'Hello, World!' Donnera :
HELLO WORLD!
Ce qui est étonnant ici, c'est que la chaîne soit mise en majuscules. Mais Arexx n'étant définitivement pas un langage comme les autres, il tient compte du fait que cette chaîne peut être récupérée par n'importe quel programme qui ne comprendra pas forcément les majuscules ou bien qui ne fera pas la différence minuscules majuscules. Je m'expliquerais là- dessus un peu plus tard.
Arexx est capable d'exécuter des commandes d'autres logiciels sans aucun problème. Pour cela, il existe un mot-clé appelé address. En spécifiant avec address une destination, vous pouvez diriger les programmes à volonté. Pour appeler des commandes de l'AmigaDOS, il faut utiliser "address com- mand", comme dans le programme suivant :
* Appel du DOS sous Arexx * address command List QUICK
A ce moment-là, rx dos (commande)
exécutera la commande demandée. Supposons maintenant (et c'est ici que cela devient vraiment intéressant) que vous avez un éditeur de textes compatible Arexx qui reconnaisse les instructions suivantes :
LOAD : charger un fichier SAVE : sauver le fichier FIND : rechercher une chaîne EXCH : échanger la chaîne recherchée avec une nouvelle chaîne QUIT : quitter
Votre éditeur de texte possède un port de messages Arexx appelé EDITEX qui lui permet de comuniquer avec l'ensemble des programmes Arexx. Voici à quoi ressemblerait un programme Arexx permettant d'effectuer une recherche et remplacement automatique :
* Recherche et remplacement dans l'éditeur de textes * address command
'Editeur de Textes' address 'EDITEX'
LOAD monfichier FIND 'VENDREDI' EXCH 'DIMANCHE' SAVE QUIT
* * à I * * * * *
Lancer l'éditeur de texte* Envoyer les commandes Rexx 'éditeur *
Charger le fichier * Rechercher VENDREDI * Remplacer par DIMANCHE * Sauver le fichier *
Refermer l'Editeur de textes*
Vous voyez maintenant que si le programme avait reçu des instructions telles que LoAd, il aurait pu confondre et se planter. C'est pour cela que les chaînes de commandes sont passées en majuscules.
En plus de la possibilité d'envoyer des commandes à des programmes, il existe tout un tas d'instructions de programmation telles que des boucles, des tests, des structures de choix et même des procédures récursives. Il est aussi possible de définir des variables, comme le montre le programme suivant :
et vous obtiendrez le contenu du répertoire courant.
On peut maintenant s'amuser à appeler la commande de son choix (dos.rexx) :
* Appel du DOS interactif sous Arexx * I arg programme address command programme
* Un peu de calcul avec Arexx *
a = 3 b = 15
* variable numérique * celle-là aussi * variable alphanumérique 'c est' c
c = 'une chaîne say a' + ' b ' = ' a + b c = 2
say 12+c* *2 Résultat :
15= 18c est une chaîne
3 + 16
Si vous connaissez un peu le Basic, vous n'aurez aucun mal à comprendre le déroulement du programme. La seule chose un peu surprenante est la variable c qui passe de l'état de chaîne de caractères à celui de variable numérique. C'est pour cette raison que l'on dit qu'ARexx est un langage sans types. Bien que l'on ait affaire à un langage complet de programmation, il n'est pas question d'écrire des applications entièrement avec Arexx, puisqu'il n'est même pas capable de dessiner une ligne à l'écran. Sa réelle puissance réside dans le maniement des chaînes de caractères, car il a été conçu pour envoyer des commandes à différents programmes. Il est aussi capable d'empiler des commandes qui seront traitées par la suite et d'appeler certaines fonctions de la arp.library grâce à une bibliothèque spéciale appelée rexxarp.library. Sa fonction de trace est phénoménale car on peut visualiser dans la même fenêtre la trace simultanée de tous les programmes s'éxécutant. Voici à titre d'exemple la trace du programme précédent (j'ai ajouté la ligne "trace results" au début du programme).
AmigaTeX
Atalk
C. A.P.E. 68k
CodeProbe
Magellan
Superbase
Pro 3
Superplan
TxEd-Plus
VLT
Wshell
implémentation du langage de mise en page TeX communications assembleur-éditeur débogueur du Lattice C intelligence artificielle
base de données relationnelle tableur
éditeur de textes domaine public, communications
shell supportant Arexx de manière transparente
Dominique Lorre
Notes sur l'auteur: Dominique Lorre n'est pas n'importe qui : responsable des produits Amiga chez Micro-Application depuis bientôt deux ans, on lui doit la bonne traduction et le parfait fonctionnement de la plupart des livres et logiciels M.A sortis sur notre machine.
3 *-* a = 3;
i 3
4 *-* b = 15;
"1 5"
5 *.* c = 'une chaîne';
"une chaîne"
6 *-* say a ' + ' b '= 'a + b 'c est' c;
"3 + 1 5 = 1 8 c est une chaîne" 3 + 15 = 18c est une chaîne
7 *-* c = 2
8 *-* say 1 2+.c* *2;
"16"
16
Les lignes sont affichées, ainsi que le résultat des calculs effectués et ce qui est retourné à l'écran en mode normal. Je pense que vous avez maintenant le sens de "macro-langage permettant à des applications de communiquer entre elles". De manière générale, les logiciels supportant Arexx offrent une bibliothèque de macros écrites dans ce langage qui peuvent autant vous servir d'exemples que vous être utiles. Leur modification n'est généralement pas très difficile à effectuer une fois le principe saisi.
Arexx est donc un très grand standard de l'Amiga, au même titre que le célèbre format IFF et le très prometteur standard xpr de communication dont Commodore Revue aura certainement l'occasion de vous parler prochainement. Voici pour finir une liste (non- exhaustive) des applications supportant déjà Arexx :
Toute l'équipe de l'Amiga News Tech vous souhaite
une bonne et heureuse année
1990
• © O

9 O
% *
‘ 0
i. V-i . ;. ¦ ? * .* y X •
o
y ;
©
« te:
• i • •
0
; 11 : ;V ; J A
CHANGEMENTS APPORTES AU WOKBENCH 1.3
Le Workbench 1.4 est sur le point d’arriver et déjà circule une version améliorée du Workbench 1.3. Celà voudrait-il dire que la premier nommé n’apparaitra que dans plusieurs mois ? En attendant, voici les quelques améliorations apportées au WB 1.3 telles que l’on reçus les développeurs Commodore Amiga officiels, en anglais dans le texte ! Reproduction intégrale du document.
C :
SetPactch
a - Alert code fixed to work with 1 meg chip ram machines.
B - TrackDisk GetUnit patch ad- ded.
C - Dos Exécuté () patched that uses RUN from the résident list. D - UserState patch for 68010.
LoadWB
a - LoadWB now closes icon. Library.
Eval
a - () added also parses strings in a more relaxed manner.
DiskDoctor
a - incorrect error message (out of memory) changed.
B - uses BufMemType so works with large hard drives.
FF : NOTE - NOT AVAILABLE FOR ELECTRONIC DISTRIBUTION
a - incorrect use of font flags fixed.
SetClock
a - reset option now skips clock validity check.
Mounf
a - BAUD and CONTROL mountlist keyboard added for multi- serial use.
B - full option added to startup to create handler entries with full environment support.
L :
Pipe-Handler
a - names are now case-indifferent.
Speak-Handler
a - no longer loses 10K when unk- nown packet received. B - OPTs are now case indiffèrent.
FasfFileSystem
a - File system no longer fails if the boot block of a disk contains a zéro in the first longword.
B - whenever a file not in the root was altered, the datestamp of the root block would be altered. This has been fixed, the last modified date is now altered instead.
C - Due to a calculation error when writing out the bitmap the disk would always validate on restart if it was >308Meg. This has been fixed. New limit is REALLY 2.5 Gig. Tes- ted to 600Mb.
Aux-Handler
a - Sets the flags to 0 on open of the serial.device.
UTILITIES : CMD
a - works with device names that have odd number of caracters.
B - QUERY function added so works with printer drivers that query the printer.
ClockPtr
a - switched over to the European version with the 24 hour option.
LIBS : info.library
a - no longer improperly combine tooltypes.
SYSTEM : Format
a - works with large hard drives (uses bufmemtype). B - inibit logic fixed. C - secondary results are properly set.
D - better error messages, e - only opens icon.library if it needs icon.library.
f- NOFFS keyword removed (was not useful).
Diskcoppy
a - uses fast memoty in a single drive copy if chip ram is unavai- lable.
B - single disk copy on a 1 meg chip ram machine works.
C - verify by default noverify option added.
D - Only opens icon library if it needs icon library.
E - If diskcopy fails, the failure cy- linder is left showing on the screen.
F - secondary results are properly set.
G - better error messages, h - MULTI keyword allows multiple copies of single disk.
FastMemFirst
a - tests for chip memory properly (it worked fine before however, it was incorrect).
NoFastMem
a - changed to also spécifie divert calls on fast memory to public memory.
SetMap
a - kludge added to make sure that, under V34Kickstart and below, a keymap never spans a 64K boun- dry.
Version.library
a - version number change.
DEVS : serial.device
a - no longer crashes on mismat- ched baud rate.
B - Refuses to open unavailable units. C - lower overhead.
Printer.device
a - support for multipass printers fixed.
VIDEO
A lire ce mois-ci dans Hitech (télé, ciné, vidéo) : Dossier 1990-1999, les années prestigieuses ; les News, le Shopping...
PANASONIC: S-VHS ET MINIATURISATION
Panasonic complète sa gamme de matériel S-VHS et sort le NV-FS100, un magnétoscope Pal Secam équipé d'une télécommande avec fonction «Shuttle» pour effectuer un arrêt image stable en vue d’un montage, et dotée bien sûr aussi de
la programmation optique par code à barres.
Etait également présenté le caméscope NV-M10000, qui est S-VHS mais dispose aussi d’un double capteur CCD. Il ne sera pas commercialisé en France avant l'année
1991.
En revanche, l'ensemble magnétoscope portable VHS avec écran LCD incorporé devrait être disponible en France au printemps 1990. ¦
Exclusif, le Combo Sony un scope - TV 8 mm
HITACHI: S-VHS-C ET VIDÉO PORTABLE
A l’instar des autres fabricants japonais, Hitachi exposait un petit ensemble magnétoscope VHS écran LCD portable. Cet appareil, présenté il y a déjà un an (cf. TC HITECH n° 1) à la Photokina de Cologne, sera commercialisé en France au printemps prochain.
Dans un autre domaine, le C42PX1 (annoncé en France pour 1991) est un téléprojecteur
JVC:
S-VHS
OF COURSE
Le GR-S707 est le dernier caméscope S-VHS de JVC. Malgré les apparences (il s'agit bien d'un modèle d épaule). L'appareil est au
format compact. Sa luminosité minimale est de 8 lux. Il est équipé d'un zoom x 8, il enregistre le son en hi- fi stéréo et pèse 2 kg. Test dans un de nos prochains numéros.
Une table de montage, le JX-SV77, et un boîtier de raccordement pour plusieurs Péritel sont également annoncés pour la fin de l'année. I
SILENCE ON TOURNE
Voici quatre mois que nous avons ouvert cette rubrique vidéo. Son démarrage a été chaotique et vous vous en êtes certainement aperçu. Chaque nouvelle année est l'occasion de prendre de bonnes résolutions, la rubrique vidéo de ce numéro en est la concrétisation: la fiche technique est de retour, accompagnée d'un reportage sur une société de production de clips vidéo, d'un papier sur une toute nouvelle table de montage pilotée par ordinateur, de la présentation d'un numériseur vidéo en temps réel et de la constante page dédiée au matériel vidéo grand public. En tout, six pages destinées aux vidéastes. Nous n'attendrons pas une année supplémentaire pour offrir la même chose aux musisiens, c'est promis.
En période de fêtes, les étalages regorgent toujours des mets les plus précieux. Dans le monde de la vidéo il en est de même, du plus petit gadget au monstre à... Les voici!
Couleur géant (107 cm de diagonale), qui utilise un tube asphérique courbe, un système de lentilles hybrides surdimensionnées, un procédé optique hypercontraste et un écran «Black Stripe». L’image est lumineuse et étonnamment bien contrastée.
Le VMS 83 E sortira à la fin de l’année. C’est un caméscope S-VHS-C hi-fi stéréo, doté d’un zoom x 8, d’un titreur intégré, d’un obturateur à cinq vitesses rapides, de l’insertion vidéo et du doublage son. Il filme avec une sensibilité minimale de 5 lux. I
déo de ce numéro en est la concrétisation: la fiche technique est de retour, accompagnée d'un reportage sur une société de production de clips vidéo, d'un papier sur une toute nouvelle table de montage pilotée par ordinateur, de la présentation d'un numériseur vidéo en temps réel et de la constante page dédiée au matériel vidéo grand public. En tout, six pages destinées aux vidéastes. Nous n'attendrons pas une année supplémentaire pour offrir la même chose aux musisiens, c'est promis. En période de fêtes, les étalages regorgent toujours des mets les plus précieux. Dans le monde de la vidéo il en est de même, du plus petit gadget au monstre à... Les voici!
Couleur géant (107 cm de diagonale), qui utilise un tube asphérique courbe, un système de lentilles hybrides surdimensionnées, un procédé optique hypercontraste et un écran «Black Stripe». L’image est lumineuse et étonnamment bien contrastée.
Le VMS 83 E sortira à la fin de l’année. C’est un caméscope S-VHS-C hi-fi stéréo, doté d’un zoom x 8, d’un titreur intégré, d’un obturateur à cinq vitesses rapides, de l’insertion vidéo et du doublage son. Il filme avec une sensibilité minimale de 5 lux. I

Click image to download PDF

AMIGA NEWS TECH numero 08 (01-1990)

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


Thanks for you help to extend Amigaland.com !
frdanlenfideelhuitjanoplptroruessvtr

Connexion

Pub+

37.6% 
16.7% 
5.6% 
4.3% 
3.7% 
3.3% 
3.3% 
2.2% 
1.8% 
1.1% 

Today: 66
Yesterday: 119
This Week: 412
Last Week: 581
This Month: 2276
Last Month: 2550
Total: 68966

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