Sponsors

FacebookTwitterGoogle Bookmarks

APPLICATION AMIGADOS LES FICHIERS BATCH Le mois dernier, je vous ai montré beaucoup d’exemples de l’option LFOR- MAT de la commande List. Mais celui qui va suivre est de loin mon préféré. C’est peut-être aussi celui qui va vous étonner le plus car il permet de créer des fichiers batch. Un fichier batch est l’équivalent sur PC des fichiers scripts de l’AmigaDOS. Or, les utilisateurs de PC n’ayant pas à leur disposition la fabuleuse commande List de l’AmigaDOS, ils ont souvent des problèmes énormes de manipulation de leurs fichiers. Cela est également vrai pour ceux qui ont un Amiga avec la carte passerelle. Il m’est arrivé un jour d’avoir à transférer une cinquantaine de fichiers de mon Amiga vers la carte passerelle. Comme je suis relativement organisé, ils se trouvaient tous dans un répertoire que j’avais nommé Transfert. La commande avec la carte PC pour récupérer un fichier venant de F Amiga est : AREAD nom du fichier Amiga> nom du fichier PC> L’idée d’avoir à taper cinquante fois cette ligne ne me passionnait pas énormément. C’est la commande List qui m’a encore une fois sauvé la vie : List > SYS:trans.bat SYS:Transfert LFORMAT "AREAD %S%S A: %S" Cela m’a créé un fichier trans.bat qui contenait la commande AREAD pour chacun des fichiers que j’avais à transférer. Je n’ai plus eu qu’à ouvrir la fenêtre PC et faire : AREAD SYS:trans.bat trans Après cela, je me suis rendu compte que l’AmigaDOS et tous les utilitaires de l’Amiga pouvaient être très utiles pour les fichiers de la partie PC. L’exemple des fontes que l’on copie sur plusieurs disquettes peut facilement être reproduit pour des fichiers PC que l’on voudrait passer d’un disque dur vers plusieurs disquettes. On peut vouloir éditer les fichiers PC avec un éditeur de texte Amiga, les modifier avec NewZap, le seul souci que nous cause ces manipulations est qu’il vaut mieux posséder pas mal de place en réserve dans la partie Amiga. La méthode à suivre est simple : Transfert des fichiers PC vers 1'Amiga Bidouilles en tous genres sur 1'Amiga Retour des fichiers PC au bercail A partir de là les possibilités sont nombreuses. Jamais je n’édite un texte de plus de 5 lignes sur PC. Ce n’est pas par préjugé mais parce que je ne connais pas les éditeurs de texte PC (c’est donc par ignorance...), et que leur manque entre autres le Couper-Coller, les raccourcis claviers, et la possibilité de manipuler plusieurs fichiers à la fois (...et aussi par exigence). Mais cela vous e saviez. En allant un peu plus loin, on apprend rapidement à éviter la lourdeur légendaire des PC en faisant un détour par l’Amiga. Imaginez que vous possédez des documents provenant d’un traitement de textes sur PC (disons qu’ils possèdent tous l’extension .TX1) que vous vouliez convertir au format d’un autre traitement de textes (avec l’extension .TX2). Pour cela, on vous donne un utilitaire qui fonctionne de la manière suivante : UTIL fichier source> fichier destination La solution PC Amiga s'écrira : sous PC

Click image to download PDF

AMIGA NEWS TECH numero 11 (04-1990)

Document sans nom Initiation : boot toujours4 Application : les fichiersMatch
D. Lorre v
V Blitter
VN K S
dèuxïème partie,:
m!asques
set testséfâfiques
Vvv.CK Mazué
Le 3D C facile
HDVG
sur les traces'diï
Initiation GfaBasic (DL) image intuitïo:n;.
D. Obriot SV
¦ *
Application ; manipuler les
fichiers. INFO

REQUESTER
L'ANT SE MET A LA PAO
Nous avons reçu quelques protestations concernant TANT après la parution du numéro 21. Le moins que l’on puisse dire est que ces protestations sont justifiées: plein de fautes, encore plus d’erreurs et même des morceaux d’articles portés disparus comme le programme de l’article sur le blitter. Tout cela est dû à un système de composition en saisie manuelle... Nous en fûmes nous-mêmes atterrés à tel point que nous nous sommes demandé s’il ne valait pas mieux changer de nom et nous appeler COMMODORE VERRUE !? Mais trêve de plaisanterie, nous avons pris nos dispositions afin que ceci ne se reproduise plus.
En effet, à partir de ce numéro, tous les Amiga News Tech seront conçus en PAO. Vous trouverez le morceau d’article manquant en erratum au sein de l’ANT de ce mois-ci.
O
Question : J’ai récemment acheté un Amiga 500 et j’ai décidé de me mettre à l’assembleur. Sans rien y comprendre, j’ai tapé le programme Scrolltext Vertical de votre numéro 20 (je possède Devpac 2). J’ai tout scrupuleusement tapé sauf les lignes de commentaires qui commençaient par un point virgule. Lorsqu’ensuite j’assemble le tout en mémoire, 3 erreurs apparaissent pour
OPT o+,w-
section ComRev,CODE_C
EQU*
C’est surtout le dernier qui me gêne, n’avez-vous pas fait une erreur ? Je vous serai gré de me répondre ou de passer un rectificatif car cela me gêne vraiment. Renaud Agrignac, St Geniez d’Olt
Réponse : Et là où il y a de la gêne il ri y a pas de plaisir c'est bien connu. Eh bien pas beaucoup d'erreurs de notre part cette fois. Si vous avez tout scrupuleusement tapé, ce dont je ne doute pas, votre problème doit être le suivant : OPT o+,w- et section ComRev,CODE_C signifient respectivement : assemblage optimisé, pas de messages warning le cas échéant et programme assemblé exécutable en chip ram. Ce ne sont pas des instructions 68000 mais des pseudo-instructions propres a Devpac 2. Sur un assembleur 68000 qui respecte la norme Motorola (ce qui est le cas de devpac) toute instruction ou pseudo-instruction doit débuter par un espace. Je vous suggère de vérifier si vous avez bien mis cet espace. En ce qui concerne le EQU * comment est-il arrivé là? La ligne correcte serait Mess End: EQU * sur la même ligne. Je n'ai pas tapé ce listing à cause de ma paresse légendaire et je ne sais pas où les copains ont planqué l'original envoyé par Bernard Saratt. Nez en moins mon pif me suggère, après un bref examen du listing sur la revue, une solution absolument bestiale : supprimez purement et simplement ce satané EQU * (mais pas le even qui suit) et tout devrait très bien marcher. Un dernier mot : le fichier Hardware.Inc n'existe pas dans un devpac original. Suivez donc le conseil de l'auteur et voyez la bible de l'amiga (page 90 à 97) pour les registres hardware.
O
Question : Cher Little Zeus j’ose m’adresser à toi pour te demander de faire plus de commentaires dans tes listings. Je suis un grand débutant dans le monde du langage machine car je ne travaillais jusqu’à présent qu’en basic ! Ainsi serais-je très satisfait si tu pouvais expliquer pourquoi tu fais cela, pourquoi tu ouvres telle librarie etc. Tout cela peut te paraître superflu mais pour nous les débutants, tous ces renseignements peuvent être de véritables mines d’or. Je suis tellement nouveau que je viens juste d’apprendre que l’écran sur lequel nous travaillons n’est en fait qu’une infime partie de ce que nous réserve notre ROM. Ce serait d’ailleurs très bien si tu pouvais nous donner les « points de branchement » les plus utilisés, leurs addresses donc, et comment s’en servir....
Laurent Denoue, Saint Ismier
Réponse : Vous faites sans doute allusion à l'adresse de saut en ROM pour la fonction DoIO, afin de faire fonctionner le Virus-Killer sur KickStart 1.3. Cette addresse est $ FC0718. Vous êtes débutant? Alors patience et courage car l'Amiga est une machine très complexe et il faut apprendre petit à petit. D'une manière générale, il est impossible de donner des explications complètes dans un article. A titre d'exemple, expliquer exhaustivement seulement le fonctionnement des librairies et des devices nécessiterait environ 2 000 pages ! C'est la taille des livres Amiga Rom Kernel Manual Librarie s and Devices et Includes and Autodocs. Vous êtes débutant ? Alors prenez de bonnes habitudes dès le départ: il ne FAUT PAS programmer de saut direct en ROM, surtout pas sur un Amiga qui est une machine multi-tâches sinon le gourou viendra tôt ou tard vous châtier sévèrement. A la place il faut utiliser les librairies qui sont les «interfaces» conçues à cet effet. Un programme qui utilise les librairies fonctionnera parfaitement sur tout KickStart. Maintenant, si vous voulez modifier une fonction d'une librairie quelconque, vous DEVEZ appeler dans exec.library la routine SetFunction afin que la somme d'auto-contrôle de la librarie ainsi modifiée soit recalculée et que le GOUROU n'y trouve rien à redire.
H
BUTTER (suite 2)
Vous avez pu avaler toute la théorie du mois dernier ? Vous l'avez digérée ? BRAVO, bientôt le blitter n’aura plus de secret pour vous. Ce mois-ci moins de théorie et plus de pratique. Nous commençons sans plus attendre avec les Tests Logiques. Ceci concerne les Minterms. Savoir bien les utiliser c’est aussi savoir bien utiliser le Blitter. Il est ainsi possible par exemple d’éviter que deux images se superposent. Voyons donc le 1er PROGRAMME.
Comme le mois dernier, les librairies nécéssaires sont ouvertes, un écran à deux bitplanes est ouvert et le programme se réserve l'usage du blitter. Un écran intuition à deux bitplanes est ainsi fait qu’un bit mis dans le premier bitplane allumera un point de couleur blanche et un bit mis dans le deuxième bitplane allumera un point de couleur noire.
TESTS LOGIQUES
Ceci à la condition bien sûr d’utiliser les préférences du workbench sans modification. Sinon vous verrez apparaître les couleurs 2 et 3 de vos propres préférences.
La première image est copiée dans le premier bitplane exactement de la même façon que dans l’exemple du mois dernier. C’est-à-dire que le blitter tient seulement compte du contenu de la source A. L’image apparaît en blanc.
La deuxième image est elle aussi copiée dans le deuxième bitplane de la même façon qu'à l’endroit où la deuxième image chevauche la première la couleur change et devient orange. L’explication est que lorsque un bit est mis en même temps et au même endroit dans les deux bitplanes on obtient la couleur numéro 4.
Comment éviter cet effet désagréable ?
Il faut tester si des points sont allumés dans le 1er bitplane dans la zone correspondante sur l’écran à l'endroit où l’on veut allumer des points dans le 2e bitplane. Pour cela on fait pointer BLTDPTH à l’endroit où l’on veut transférer l’image. Pour l’instant c’est comme d'habitude. On fait pointer BLTAPTH sur les données de l’image, c’est toujours comme d’habitude. Enfin on fait pointer BLTBPTH dans le 1er bitplane à l’endroit correspondant sur l’écran à la position “écran” de la 2e image. (Attention à la valeur modulo). Voir dans le listing les lignes toutes prêtes à être ajoutées.
Il suffit maintenant de choisir les Minterms afin que le blitter ne transfère les bits de la source A dans le 2e bitplane uniquement quand les bits de la source B ( 1er bitplane et donc image blanche ) ne sont pas mis.
Détermination des Minterms :
On veut la source A. Les bits LF0-LF3 correspondant aux combinaisons abc abC aBc aBC sont donc éliminés et il reste avec les bits LF4-LF7 les combinaisons suivantes: Abc AbC Abc ABC Maintenant on ne veut pas la source B. Il faut donc éliminer les combinaisons Abc et ABC et il ne reste plus que les combinaisons Abc et AbC correspondant aux bits LF4 et LF5 II faut conserver ces 2 bits afin d’annuler les effets de la source C. Il ne faut pas oublier d’activer le DMA B.
Ainsi l’instruction
move.w %0000100111110000,BLTCON0(a0) doit donc être remplacée par move.w %0000110100110000, BLTCON0(a0) comme expliqué dans le programme.
R
LES MASQUES
Le blitter peut, mais SEULEMENT pour la SOURCE A modifier le début et la fin de chaque ligne d’une image.
Le registre BLTAFWM doit contenir la valeur du masque pour le mot de début de ligne.
Le registre BLTALWM doit contenir la valeur du masque pour le mot de fin de ligne.
Le blitter fera un ET logique entre le contenu de ces registres et les mots de début et de fin de ligne.
ATTENTION. Si vous ne mettez rien dans ces registres, il contiendront quand même quelque chose et le blitter fera son ET logique quoi qu’il en soit. Donc gare aux mauvaises surprises dans le cas où ces registres ne seraient pas initialisés correctement.
2» PROGRAMME
Pour la première image les masques sont $ ffff ceci s’écrit en binaire %1111111111111111. Tous les bits y sont donc, le ET logique ne modifiera rien et l’image apparaît en entier.
Pour la deuxième image les masques sont $ 5555 ceci s’écrit en binaire $ 0101010101010101. Un bit sur deux va disparaître à l’issue du ET logique. L’image perd donc un point sur deux au début et à la fin de chaque ligne.
Pour la troisième image les masques sont $ 0000. Tous les bits disparaissent. L’image est carrément amputée à chaque extrémité.
Il ne faut pas négliger cette possibilité de masque qui peut s’avérer très utile. Nous en verrons une application lors de la programmation de scrolling.
2e possibilité de masque :
Si on bloque un canal DMA, par exemple le DMA C, le registre BLTCDAT qui correspond à ce canal contient de toute façon quelque chose. Plus encore, il est possible de charger soi-même ce registre afin qu’il contienne ce que l’on désire. Quand le blitter commencera son travail, le contenu du registre BLTCDAT ne sera pas modifié puisque le canal DMA C est bloqué. Le blitter fera alors à chaque mot traité une opération logique entre le mot de donnée et le contenu de BLTCDAT. Cette opération logique étant définie par les Minterms.
C’est ce qui se passe pour la mise en place de la quatrième image par le 2e programme :
Le canal DMA C est bloqué et BLTCDAT est chargé avec la valeur $ 5555
Les Minterms choisis correspondent aux combinaisons ABC et AbC. On voit que la source B n’intervient pas et qu’il faut à la fois 1 bit de la source A et 1 bit de la source C pour que le blitter mette un bit dans la cible. Comme BLTCDAT contient $ 5555 chaque ligne de l’image perd un point sur deux. Soit dit en passant, c’est exactement de cette façon que le système d'exploitation de l’Amiga décode les données lues sur disquette.
Théoriquement chaque source peut masquer ou peut être masquée par n’importe qu’elle autre. Toutefois si on essaie de masquer la source A par la source B on risque de se heurter à un ...
... PETIT BUG
IMIGRI
Dans le 2e programme se trouve une ligne marquée *1* et une ligne marquée *2*
A la place de l’instruction en *1* mettez : move.w %0000100111000000,BLTCON0(a0) et à la place de l’instruction de *2* mettez : move.w $ 5555,BLTBDAT
Ainsi la source A devra être masquée par le contenu de BLTBDAT ($ 5555) et c’est bien ce qui se passe lorsqu’on essaie le programme. Et alors ce bug où est-il ? Me direz-vous.
Et bien ce bug ne se manifeste pas de manière régulière. Il semble (je dis bien : il semble) apparaître selon le type de la dernière opération traitée par le blitter.
3e PROGRAMME
Ce n’est rien d’autre que le deuxième programme duquel on a extrait la partie concernant le masque par une source. Mais ici la source A est masquée par le contenu de BLTBDAT. Si vous essayez ce programme vous pourrez constater que cette fois rien n’apparaît dans notre écran : le blitter a refusé de travailler et pourtant le programme est THEORIQUEMENT correct!
Les remèdes ? Il y en a deux possibles :
Le premier consiste à rajouter à la ligne (1) l’instruction move.w $ 5555,BLTBDAT(a0)
Ce qui revient à charger 2 FOIS DE SUITE le registre BLTBDAT avec la même valeur. Assemblez le programme : ça marche.
Mais cette solution n’est pas très esthétique dans un listing.
Le deuxième remède consiste à charger BLTBDAT après avoir chargé BLTCON1.
Essayez en supprimant les deux instructions move.w $ 5555,BLTBDAT(a0) en (1) et en mettant une seule instruction move.w $ 5555,BLTBDAT(a0) en (2), c’est à dire après l’initialisation de BLTCON1..
Assemblez le programme : ça marche également. Curieux non ?
J’ai découvert ce petit bug après avoir cherché des heures durant pourquoi un de mes programmes ne tournait pas convenablement. Ce fut très dur... Aussi je me permet de vous recommander dans tous les cas d’initialiser BLTBDAT après avoir initialisé BLTCON1 pour éviter les mauvaises surprises et autres caprices blitteresques...
Mais attention : Je viens de vous décrire un bug de mon blitter à moi (Amiga 500). Je ne sais pour le moment absolument pas ce qu’il en est avec le nouveau FAT AGNUS.
C’est tout pour cette fois. Le mois prochain nous verrons comment programmer le blitter pour les Scrollings. Et avec tests de collisions s’il vous plaît !
F. MAZUE
1er PROGRAMME
C’est un exemple d’utilisation des Minterms qui montre la possibilité de faire un test logique avant la recopie d’une image
; graphies.library ouverte
OldOpenLibrary
CloseLibrary
AllocMem
FreeMem
intuition.library ouverte
; CHIP RAM réservée
OwnBlitter
DisownBlitter
mise en place des données de l'image en CHIP_RAM
CloseScreen
penScreen
BLTSIZE
BLTCPTH
BLTBPTH
BLTAPTH
BLTDPTH
BLTCMOD
BLIBMOD
BLTAMOD
BLTDMOD
BLTCON0
BLTCON1
BLTAFWM
BLTALWM
DMACON
DMACONR
début
move.l $ 04,al
écran a 2 bitplanes ouvert
on se réserve le blitter
move.l $ c0(al),al adda.l (100*40),al
; execbase
* ** intuition.library ***
¦660
- 198
= $ 58
= $ 48 = $ 4C = $ 50 = $ 54
= $ 60 = $ 62 = $ 64 = $ 66
= $ 40 = $ 42
= $ 44 = $ 46
= $ 96 = $ 02
graphies.library ***
* **exec.libraryJ
CHIPS ***
¦456
¦462
- 408
- 414
- 198
- 210
lea graf_name,al jsr OldOpenLibrary(a6) move.l d0,graf_base
lea int_name,al jsr OldOpenLibrary(a6) move.l d0,int_base
move.1 (fin_data-data),d0 move.l $ 10002,dl jsr AllocMem(a6) move.l d0,image
move.1 (fin_data-data) 2,d0 subq $ 01,d0 move.l image,a0 lea data,al loop
move.w (al)+,(a0)+ dbra d0 loop
move.l int_base,a6 lea écran,a0 jsr OpenScreen(a6) move.l d0,canal_ecran
move.l graf_base,a6 jsr OwnBlitter(a6)
lea $ dff000,a0 bsr Blitter_Busy
* ** TRANSFERT DE L'IMAGE DANS LE PREMIER BITPLANE ***
move.1 image,BLTAPTH(a0) move.l canal écran,al
; début bitplane n°0 dans ; al
; nombre de ligne par ; nombre d'octets par ; lignes
; est-il prêt ?
Adda.l 10,al
move.l al,BLTDPTH(a0)
move.w %0000100111110000,BLTCON0(a0)
move.w %0000000000000000,BLTCONl(a0)
move.w %1000000001000000,DMACON(a0)
move.w $ 00,BLTAMOD(a0)
move.w (20-9)*2,BLTDM0D(a0)
move.w $ ffff,BLTAFWM(a0)
move.w $ ffff,BLTALWM(a0)
move.w (20*64+9),BLTSIZE(a0)
bsr Blitter Busy
* ** TRANSFERT DE L'IMAGE DANS LE DEUXIEME BITPLANE ***
move.1 image,BLTAPTH(a0)
; move.l canal_ecran,al ; move.l $ c0(al),al ; adda.l (110*40),al
; adda.l 10,al ; move.l al,BLTDPTH(a0)
move.l canal_ecran,al move.l $ c4(al),al
adda.l (110*40),al
adda.l 10,al
move.l al,BLTDPTH(a0)
move.w 9o0000100111110000,BLTCON0 (a0) move.w %0000110100110000,BLTCON0(a0)
move.w oo0000000000000000,BLTCONl(a0) move.w %1000000001000000,DMACON(a0) move.w $ 00,BLTAMOD(a0) move.w (20-9)*2,BLIBMOD(a0) move.w (20-9)*2,BLTDMOD(a0) move.w $ ffff,BLTAFWM(a0) move.w $ ffff,BLTALWM(a0) move.w (20*64+9),BLTSIZE(a0)
bsr Blitter_Busy jsr DisownBlitter(a6) souris
lea $ bfe001,a5 btst 6,(a5) bne souris
move.l int_base,a6 move.l canal_ecran,a0 jsr CloseScreen(a6)
move.l $ 04,a6
move.l image,al
move.1 (fin_data-data), d0
jsr FreeMem(a6)
move.l int_base,al
jsr CloseLibrary(a6)
; pour placer l'image ; approximativement au ; milieu de l'écran
début de la cible
aucun bit masqué aucun bit masqué le blitter démarre attente indispensable
1er bitplane ancienne image, mais depuis la ligne a partir de laquelle on va transférer la nouvelle image dans le 2e bitplane il faut ajouter ces 5 lignes pour le test de recouvrement
al pointe cette fois sur le 2e bitplane
emplacement de la nouvelle image dans le 2e bitplane
utiliser cette ligne à la ; place de la précédente ; pour que la deuxième ; image ne recouvre pas la ; première
aucun bit masqué aucun bit masqué
; on libère le blitter
fermeture de l'écran
mémoire libérée on ferme tout
Blitter_Busy
btst 14,DMACONR(a0) bne Blitter_Busy rts
image
dc. l 0
canal_ecran
dc. l 0
int_base
dc. l 0
graf_base
dc. l 0
int_name
dc. b ’intuition.library',0
even
graf_name
dc. b 'graphies.library',0
even
écran
dc. w
0
dc. w
0
dc. w
320
dc. w
200
dc. w
2
dc. b
0
dc. b
1
dc. w
2
dc. w
15
dc. l
0
dc. l
titre
dc. l
0
dc. l
0
titre écran
dc. b
even
'blit1
* ** données de l'image a copier ***
data
dc. w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff de.w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff, $ ffff de.w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff, $ ffff, $ ffff, $ ffff, fff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff ff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff fff de.w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff fff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff»$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff $ ff f f
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff $ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff f ff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ fff :f ff f f
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff*$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff $ ffff de.w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff'$ ffff de.w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff fff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff $ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff fff
dc. w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff $ ffff
dc. w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff $ ffff
dc. w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff $ ffff
fin data
move.l graf_base,al ; et
jsr CloseLibrary(a6) ;
rts ; on s'en va
H
iMIGfll
2* PROGRAMME
C’est une démonstration des possibilités de masquage offertes par le Blitter
OldOpenLibrary
CloseLibrary
AllocMem
FreeMem
adresse du bitplane dans al
nombre de lignes par nombre d'octets par lignes pour positionner l'image
= -456 = -462
= -66 = -198
aucun bit masqué aucun bit masque
= $ 58
= $ 48 = $ 4C = $ 50 = $ 54
= $ 60 = $ 62 = $ 64 = $ 66
= $ 70 = $ 72 = $ 74
= $ 40 = $ 42
= $ 44 = $ 46 = $ 96 = $ 02
position de la 2e image
bit
bit
est masque est masqué
sur
sur
position de la 3e image
; execbase
;tous les bits sont masqués ;tous les bits sont masqués
; graphies.library ouverte
; intuition.library ouverte
; position de la 4e image
réservation de CHIP_RAM pour les données de l'image
transfert des données de l'image dans la CHIP_RAM qui vient d'être réservée
aucun bit masqué aucun bit masqué
; ouverture d'un écran à ; 1 bitplane
; on se réserve le blitter
début
move.l $ 04,a6
lea graf_name,al jsr OldOpenLibrary(a6) move.l d0,graf_base
lea int_name,al jsr OldOpenLibrary(a6) move.l d0,int_base
move.1 (fin_data-data),d0 move.l $ 10002,dl jsr AllocMem(a6) move.l d0,image
move.1 (fin_data-data) 2,d0 subq $ 01,d0 move.l image,a0 lea data,al loop
move.w (al) +, (a0) + dbra d0,loop
move.l int_base,a6 lea écran,a0 jsr OpenScreen(a6) move.l d0,canal_ecran
move.l graf_base,a6 jsr OwnBlitter(a6)
bsr tempo
BLTSIZE
BLTCPTH
BLTBPTH
BLTAPTH
BLTDPTH
BLTCMOD
BLIBMOD
BLTAMOD
BLTDMOD
BLTCDAT
BLTBDAT
BLTADAT
BLTCON0
BLTCON1
BLTAFWM
BLTALWM
DMACON
DMACONR
CloseScreen
OpenScreen
* ** CHIPS ***
* ** intuition.library
graphies.library ***
OwnBlitter
DisownBlitter
* **exec.library
¦408
¦414
¦198
- 210
move.l al,BLTDPTH(a0) move.w %0000100111110000,BLTCON0(a0) move.w %0000000000000000,BLTCONl(a0) move.w %1000000001000000,DMACON(a0) move.w $ 00,BLTAMOD(a0) move.w (20-9)*2,BLTDMOD(a0) move.w $ ffff,BLTAFWM(a0) move.w $ ffff,BLTALWM(a0) ;
move.w (20*64+9),BLTSIZE(a0)
bsr tempo
move.1 image,BLTAPTH(a0) move.l a2,al
adda.l (160*20),al ;
move.l al,BLTDPTH(a0) move.w 10000100111110000,BLTCON0(a0) move.w %0000000000000000,BLTCONl(a0) move.w °ol000000001000000, DMACON (a0) move.w $ 00,BLTAMOD(a0) move.w (20-9)*2,BLTDMOD(a0) move.w $ 5555,BLTAFWM(a0) ;
move.w $ 5555,BLTALWM(a0) ;
move.w (20*64+9),BLTSIZE(a0)
bsr tempo
move.1 image,BLTAPTH(a0) move.l a2,al adda.l (300*20),al move.l al,BLTDPTH(a0) move.w %0000100111110000,BLTCON0(a0) move.w %0000000000000000,BLTCONl(a0) move.w %1000000001000000,DMACON(a0) move.w $ 00,BLTAMOD(a0) move.w (20-9)*2,BLTDMOD(a0) move.w $ 0000,BLTAFWM(a0) move.w $ 0000,BLTALWM(a0) move.w (20*64+9),BLTSIZE(a0)
bsr tempo
move.1 image,BLTAPTH(a0) move.l a2,al adda.l (40*20),al adda.l 20,al move.l al,BLTDPTH(a0)
move.w (20*64+9),BLTSIZE(a0) bsr Blitter_Busy jsr DisownBlitter(a6)
souris
lea $ bfe001,a5 btst 6,(a5)
move.w %0000000000000000,BLTC0N1(a0) move.w %1000000001000000,DMACON(a0) move.w $ 00,BLTAMOD(a0) move.w (20-9)*2,BLTDMOD(a0) move.w $ ffff,BLTAFWM(a0) ;
move.w $ ffff,BLTALWM(a0) ;
lea $ dff000,a0 move.1 image,BLTAPTH(a0) move.l canal_ecran,al move.l $ c0(al),al
move.l al,a2 adda.l (20*40),al
move.w %0000100110100000,BLTCON0(a0) *1* ;DMA C bloqué
initialisation du registre avec la valeur du masque
move.w $ 5555,BLTCDAT(a0) *2*
PI
graf_name
dc. b 'graphies.library',0
bne souris
move.l int_base,a6 move.l canal_ecran,a0 jsr CloseScreen(a6)
even
écran
dc. w
dc. w
move.l $ 04,a6
move.l image,al
move.1 (fin_data-data),d0
jsr FreeMem(a6)
on ferne tout
dc. w 320
dc. w 200
; un seul bitplane
1
0
1
2
15
et
on s'en va
data
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
dc. w
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,$ ffff
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff;
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
$ ffff,$ ffff,
fin data
move.l int_base,al jsr CloseLibrary(a6)
move.l graf_base,al jsr CloseLibrary(a6)
rts
Blitter_Busy
btst 14,DMACONR(a0) bne Blitter_Busy rts
tempo
movem.l d0-dl,-(sp) move.w $ ffff,d0 moveq $ 05,dl
tempo_loop
dbra d0,tempo_loop dbra dl,tempo_loop movem.l (sp)+,d0-dl rts
image
dc. l 0
canal_ecran
dc. l 0
int_base
dc. l 0
graf_base
dc. l 0
int_name
dc. b 'intuition.library',0
even
$ ffff,$ ffff,$ ffff,$ ffff, $ ffff,$ ffff,$ ffff,$ ffff, $ ffff,$ ffff,$ ffff,$ ffff, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ 0000,$ 0000,$ 0000, $ ffff,$ ffff,$ ffff,$ ffff, $ ffff,$ ffff,$ ffff,$ ffff, $ ffff,$ ffff,$ ffff,$ ffff,
dc. l 0
dc. l titre_ecran
dc. l 0
dc. l 0
titre_ecran
dc. b 'blitter demo',0 even
dc. w
dc. b
dc. b
dc. w
dc. w
3e PROGRAMME
Ce programme met en évidence un petit bug du Blitter
BLTCPTH
= $ 48
BLTBPTH
= $ 4C
BLTAPTH
= $ 50
BLTDPTH
= $ 54
BLTCMOD
= $ 60
BLIBMOD
= $ 62
BLTAMOD
= $ 64
BLTDMOD
= $ 66
BLTCON0
= $ 40
BLTCON1
= $ 42
BLTAFWM
= $ 44
BLTALWM
= $ 46
BLTDDAT
= $ 00
BLTCDAT
= $ 70
BLTBDAT
= $ 72
BLTADAT
= $ 74
DMACON
= $ 96
DMACONR
= $ 02
OldOpenLibrary
CloseLibrary
AllocMem
FreeMem
OwnBlitter
DisownBlitter
CloseScreen
OpenScreen
BLTSIZE
PHEIB HHHB
début
move.l $ 04,a6
execbase
lea graf_name,al jsr OldOpenLibrary(a6) move.l d0,graf base
graphies.library ouverte
lea int name,al jsr OldOpenLibrary(a6) move.l d0,int base
intuition.library ouverte
move.1 (fin_data-data),d0 move.l $ 10002,dl
jsr AllocMem(a6) move.l d0,image
réservation de CHIP RAM pour les données de l'image
move.l (fin data-data) 2,d0
subq $ 01,d0 move.l image,a0 lea data,al loop
move.w (al)+, (a0) + dbra d0,loop move.l int base,a6 lea écran,a0 jsr OpenScreen(a6) move.l d0,canal écran
transfert des données de l'image
dans la CHIP RAM réservée écran à 1 bitplane ouvert
move.l graf base,a6
jsr OwnBlitter(a6)
lea $ dff000,a0 bsr Blitter Busy
move.1 image,BLTAPTH(a0)
Blitter réservé attendre que le blitter soit disponible
move.l canal écran,al move.l $ c0(al),al
al pointe sur le bitplane
adda.l (100*40+10),al
positionnement de l'image
move.l al,BLTDPTH(a0) move.w %0000100111000000,BLTCON0(a0) move.w $ 5555,BLTBDAT(a0)
DMA B (et C) bloqué initialisation du registre avec la valeur du masque
; (1)
move.w s0000000000000000,BLTCON1(a0)
; (2)
move.w %1000000001000000,DMACON(a0) move.w $ 00,BLTAMOD(a0) move.w (20-9)*2,BLTDMOD(a0) move.w $ ffff,BLTAFWM(a0) move.w $ ffff,BLTALWM(a0) move.w (20*64+9),BLTSIZE(a0) bsr Blitter_Busy
aucun bit masqué aucun bit masqué
jsr DisownBlitter(a6)
souris lea $ bfe001,a5 btst 6,(a5) bne souris
move.l int base,a6 move.l canal_ecran,a0 jsr CloseScreen(a6)
move.l $ 04,a6 move.l image,al move.l (fin data-data),d0 jsr FreeMem(a6)
move.l int base,al jsr CloseLibrary(a6)
move.l graf base,al jsr CloseLibrary(a6)
rts
Blitter_Busy btst 14,DMACONR(a0) bne Blitter_Busy rts
image
dc. l 0
canal_ecran
dc. l 0
int_base
dc. l 0
graf_base
dc. l 0
int_name
dc. b 'intuition.library',0 even
graf_name
dc. b 'graphies.library',0 even
écran
dc. w 0
dc. w 0
dc. w 320
dc. w 200
dc. w 1 ; un seul bitplane
dc. b 0
dc. b 1
dc. w 2
dc. w 15
dc. l 0
dc. l titre_ecran
dc. l 0
dc. l 0
titre_ecran
dc. b 'blitter demo',0 even
data
dc. w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff de.w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff, $ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ f ff f
dc. w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ f f f f,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ ffff, $ ffff,$ ffff,$ ffff,$ ffff,$ ffff
fin data
ERRATUM 1 fi
move.1 (fin_data-data),d0
; pas de parenthèse
PROGRAMME DE COPIE D’UNE IMAGE DANS
; avec K-SEKA
UN RITPLANE A L’AIDE DU BUTTER
move.l $ 10002,dl
jsr AllocMem(a6)
; CHIP RAM réservée
move.l d0,image
* ** exec.library ***
move.l (fin data-data) 2,d0;
mise en place des
; données de l'image
OldOpenLibrary
- 408
subq $ 01,d0
; dans la CHIP_RAM
CloseLibrary
- 414
; précédemment réservée,
AllocMem
- 198
; car il faut que le
FreeMem
- 210
move.l image,a0
; blitter puisse y accéder
lea data,al
* **
graphies.library ***
loop
r
move.w (al)+,(a0)+

OwnBlitter
- 456
dbra d0,loop
r
DisownBlitter
- 462
move.l int base,a6
"kick
intuition.library ***
lea écran,a0
jsr OpenScreen(a6)
; ouverture d'un écran
CloseScreen
- 66
; intuition
OpenScreen
- 198
move.l d0,canal_ecran
kkk
CHIPS ***
move.l graf base,a6
jsr OwnBlitter(a6)
; notre programme se
BLTSIZE
$ 58
; réserve l'usage du blitter
bsr tempo
BLTCPTH
$ 48
BLTBPTH
$ 4C
BLTAPTH
$ 50
ICI COMMENCE LA
PROGRAMMATION
BLTDPTH
$ 54
DU BLITTER
BLTCMOD
$ 60
lea $ dff000,a0
; adresse de base des
BLIBMOD
$ 62
; circuits spécialisés
BLTAMOD
$ 64
BLTDMOD
$ 66
bsr Blitter_Busy
; le blitter est-il
; vraiment disponible
BLTCON0
$ 40
BLTCON1
$ 42
move.1 image,BLTAPTH(a0)
; début des données image
; dans le registre
BLTAFWM
$ 44
; pointeur de la source A
BLTALWM
$ 46
move.l canal écran,al
DMACON
$ 96
move.l $ c0(al),al
; début bitplane dans 1
DMACONR
$ 02
adda.l (80*40),al
; nombre de ligne par nombre
début
'
; d'octets par lignes pour
; positionner l'image sur
move.l $ 04,a6
; execbase
; la ligne 80
lea graf name,al
adda.l 10,al
; pour placer l'image
jsr OldOpenLibrary(a6)
; ouverture de
; approximativement au
; graphies.library
; milieu de l'écran
move.l d0,graf_base
move.l al,BLTDPTH(a0)
; début de la cible
lea int name,al
move.w %0000100111110000,BLTCON0(a0)
jsr OldOpenLibrary(a6)
; ouverture
move.w %0000000000000000,BLTCONl(a0)
; d'intuition.library
move.w %1000000001000000,DMACON(a0)
move.l d0,int base
move.w $ 00,BLTAMOD(a0)
H
iBEüB PHBB
MIGfl
move.w (20-9)*2,BLTDM0D(a0)
move.w $ ffff,BLTAFWM(a0) ; aucun bit masqué
move.w $ ffff,BLTALWM(a0) ; aucun bit masque
move.w (20*64+9),BLTSIZE(a0)
bsr Blitter_Busy
; rendre le blitter au ; système souris
jsr DisownBlitter(a6)
lea $ bfe001,a5 btst 6,(a5) bne souris
move.l int_base,a6 move.l canal_ecran,a0 jsr CloseScreen(a6)
; fermer l'écran
move.l $ 04,a6
move.l image,al move.l (fin_data-data),d0 ; libérer la mémoire
jsr FreeMem(a6)
move.l int_base,al jsr CloseLibrary(a6) ; on ferme tout
move.l graf_base,al jsr CloseLibrary(a6)
rts ; et c'est fini
Blitter_Busy btst 14,DMACONR(a0) bne Blitter_Busy
rts
tempo
move.w $ 10,dl tempo1
move.w $ ffff,d0 tempo2 dbra d0,tempo2 dbra dl,tempol rts
image
dc. i 0
canal_ecran
dc. l 0
int_base
dc. l 0
graf_base
dc. l 0
int_name
dc. b 'intuition.library',0 even graf_name
dc. b 'graphies.library',0
even
écran
dc. w
0
dc. w
0
dc. w
320
dc. w
200
dc. w
1
écran
de :
dc. b
0
dc. b
1
dc. w
2
dc. w
15
dc. J
L (
0
dc. l titre_ecran
dc. l 0
dc. l 0
titre_ecran
dc. b 'blitter demo',0
even
; ça c’est l’image à copier ; c’est une image d’une hauteur de 20 lignes ; et d’une largeur de 9 mots
data
de .w $ f ff f, $ fff f, $ f ff f, $ fff f, $ f ff f, $ ff ff, $ f f ff, $ f ff f, $ £f f f
dc. w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff, $ ffff,$ ffff,$ ffff,$ ffff de.w $ ffff,$ ffff,Sffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff
dc. w $ f ff f, $ f ff f, $ ffff, $ 0000, $ 0000, $ 0000, $ ffff, $ f fff, $ f fff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ 0000,$ 0000,$ 0000,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff,$ ffff
dc. w $ ffff,$ ffff,$ ffff,$ ffff,Sffff,Sffff,$ ffff,$ ffff,$ ffff de.w $ ffff,$ ffff, $ ffff,$ ffff, $ ffff, $ ffff, $ ffff,$ ffff,Sffff
fin data
BOOT TOUJOURS
INITIATION AMIGADOS
Le mois dernier, nous avons vu comment réaliser une disquette de boot, c’est-à-dire une disquette qui permet de faire démarrer le système. Celle que nous avons pour le moment est très intéressante mais ne sert absolument à rien car elle est vide. Si vous avez déjà essayé de démarrer votre Amiga avec cette disquette à l’intérieur (et j’espère que vous l’avez fait), vous avez vu un écran bleu, la fenêtre CLI habituelle et le prompt :1> sans rien de plus. Au passage vous aurez peut-être remarqué que les caractères affichés sont plus gros que d’habitude. Cela vient du fait que l’écran s’est initialisé en 60 colonnes. Comme vous l’avez sans doute deviné, le système n’utilise que les paramètres par défauts puisqu'aucun fichier de configuration n’est présent sur la disquette (c’est normal elle est vide !).
Pour continuer sans encombre, il nous faut utiliser des commandes du DOS. Malheureusement celles-ci ne sont pas encore accessibles de notre disquette. Comment faire alors ? La première solution est de redémarrer le système avec la disquette Workbench 1.3 et de continuer l’installation. Une autre solution moins connue consiste à transférer le contrôle à la disquette Workbench 1.3 sans redémarrer. C’est une méthode similaire qui est utiliséeavec les disques durs qui ne possèdent pas l’AUTOBOOT, c’est-à-dire qui ne démarrent pas tout seul. Il suffit donc mettre la disquette Workbench dans le lecteur interne et taper les deux lignes suivantes :
DF0:C Assign C: DF0:c Assign L: DF0:1
Et oui, cela n’est pas si facile ... En général la première ligne s’affiche :
DF)>C>Qssign C> DF)>c
parce que vous n’êtes pas en clavier AZERTY français mais en QWERTY. Il faudra donc entrer les lignes suivantes :
DF0:C Assign C: DF0:c Assign DEVS: DF0:devs DF0:System SetMap F Assign L: DF0:1
soit, si vous regardez votre clavier :
DFàMC=Qssign CM DFàMcQssign DEVSM DFàMdevs DFàMSyste,=Set?qp F Assign L: DF0:1
C’est sans aucun doute le plus gros défaut de l’AmigaDOS. Certains ont même cru qu'il s’agissait d’un virus. Dans un clavier QWERTY le a et le q sont inversés, le se trouve à la place du =, le : à la place du Shift-M et le m à la place de Les chiffres sont au même endroit mais ne doivent pas être Shiftés.
Une fois oubliés les démêlés de notre clavier autochtone avec un système parlant anglais à l’allumage, les lignes précédentes s’expliquent de façon assez simple (quoique ...). Les deux endroits sûrs où le système va chercher ses commandes sont le répertoire courant et le répertoire C:. Cela ne veut pas dire qu’il ne peut pas en rechercher ailleurs mais qu’il ira toujours chercher ses commandes dans ces deux répertoires. Le répertoire courant est toujours recherché en premier et le répertoire C: a toujours le dernier
mot. C’est à mon avis le point essentiel qu’il faut retenir quand on utilise l’AmigaDOS. Lorsque le système démarre, que ce soit à partir d’une disquette ou d’un disque dur, il donne un certain nombre de noms génériques à des répertoires à la seule condition qu’ils soient présents. Ces noms sont :
S: L: C: FONTS: DEVS: LIBS: SYS:
Vous connaissez déjà SYS: qui est la racine de la disquette de lancement et C: qui correspond au répertoire c de la même disquette. Les unités logiques S:, L:, FONTS:, DEVS: et LIBS: correspondent aux répertoires s, I, fonts, devs et libs de la disquette boot. Tous ces répertoires sont importants, le système et la plupart des programmes que vous utilisez y font appel. Mais le plus important d’entre eux est le répertoire I qui contient un fichier appelé Disk- Validator sans lequel de très graves problèmes peuvent apparaîtrent sur vos disquettes. C’est pourquoi TOUTES les disquettes de démarrage doivent contenir un répertoire I muni du fichier Disk- Validator. Un autre fichier très important du répertoire I est le Ram- Flandler qui vous permet d’utiliser le disque RAM:. A part le Disk- Validator, AUCUN fichier ni répertoire n’est indispensable a priori. Beaucoup d’entre eux sont très importants en raison des programmes qui y font appel ou parce qu’ils vous simplifient la vie mais uniquement à ce titre. Je vous en ai déjà donné la preuve car vous avez pu booter sur une disquette ne contenant absolument rien.
LA COMMANDE ASSIGN
La commande Assign a pour fonction, entre autres, de créer des unités logiques. Comme le répertoire C: contient les commandes de l’AmigaDOS et que le répertoire L: est indispensable nous indiquons au système qu’il doit aller les chercher sur la disquette Workbench
1. 3. Quant à DEVS:, il nous a permis de rétablir le clavier français, ce qui est quand même très utile. Ce dont nous avons besoin maintenant, c’est d’avoir le système minimal sur la disquette MonBoot:. Les commandes suivantes vont nous y aider :
Copy L:Disk-Validator|Ram-Handler TO RAM:1
Copy C:Assign|CopyIMakeDir|Echo TO RAM:c
Assign C: RAM:c
Copy RAM:1 TO MonBoot:1
Copy C: TO MonBoot:c
Assign C: MonBoot:c
Assign L: MonBoot:1
Comme je suppose que vous n’avez qu’un seul lecteur de disquette sans disque dur connecté (ça tombe bien moi aussi I) je vous ai préparé un petit détour par la RAM:. La commande Copy est utilisée comme vous en avez pris l'habitude depuis le mois dernier. A la quatrième ligne le système va se manifester en vous demandant d’insérer la disquette MonBoot: dans n'importe quel lecteur. Si j’avais eu un lecteur de disquette supplémentaire, mes lignes auraient été plus courtes :
Copy L:Disk-Validator|Ram-Handler to MonBoot:1 Copy C:Assign|CopyIMakeDir|Echo TO MonBoot:c Assign C: MonBoot.:c Assign L: MonBoot:1
Ces lignes fonctionnent également avec un seul lecteur mais demanderaient beaucoup trop d’échanges de disquettes. Notez aussi que j'aurais pu écrire SYS: à la place de MonBoot: ou même : tout simplement. Mais je refuse d’entrer dans des détails trop techniques, il existe au moins cinq excellents livres de référence en fran-
H
BHC3B HHHH
çais de l’AmigaDOS qui sont là pour ça. Mon but est, je le rappelle, de vous expliquer l’AmlgaDOS en vous montrant comment il fonctionne. La grande difficulté réside dans la manière d’utiliser les commandes le mieux possible. Il est tout à fait inutile d’étudier les commandes une à une. La commande Copy est tellement puissante qu’il me faudrait deux ou trois articles rien que pour vous la décrire en détails. Et cela est vrai pour la plupart des commandes de l’AmigaDOS.
Nous allons maintenant nous occuper de créer une Startup- Sequence. Tout le monde connait la Startup-Sequence. C’est le fichier de commandes qui s’exécute automatiquement quand une disquette démarre. Tout ce qui a été écrit au sujet de la Startup- Sequence représente environ la moitié de ce qui a été écrit a propos de l'AmigaDOS, c’est dire son importance. Quand vous installez un logiciel sur votre disque dur, la plupart du temps il sera important de modifier votre Startup-Sequence pourqu’il fonctionne correctement. Cela est tout aussi vrai pour l'installation sur disquette. Mais pour l’instant nous allons nous contenter d’en créer une. En utilisant le meilleur des éditeurs de texte, la commande Copy :
MakeDir s
Assign S: SYS:s
Copy * TO S :Startup-Sequence
Echo "Workbench 1.3 - Disquette de Boot"
CTRL>-
A la place de Ctrl>-ç il faut appuyer simultanément Sur les touches Ctrl et ç qui servent à sauver un fichier avec l’éditeur de texte Copy. Je suis très sérieux car * ne représente pas un fichier sur disque mais plutôt le texte que l’on rentre au clavier, ce qui permet de créer des fichiers très facilement avec Copy. Le Ctrl>-ç signifie que le fichier doit être refermé. La commande MakeDir permet de créer le répertoire s et Assign le transforme en S:. Vous pouvez rebooter sur cette disquette et vous verrez le message
Workbench 1.3 - Disquette de Boot
Entrez maintenant la commande :
Assign
Ou Qssign si vous préférez, car vous êtes de nouveau en clavier anglais. La liste de toutes les unités (logiques et physiques) va s’afficher. Parmi ces unités, vous allez voir que plusieurs répertoires de la disquette MonBoot: seront devenus des unités.
Vous devriez avoir cette liste :
S MonBoot: s
L MonBoot: 1
C MonBoot:c
FONTS
DEVS
LIBS
SYS MonBoot:
Ce qui nous importe maintenant c’est d’obtenir le clavier français. Pour cela entrez les lignes :
Copy C:Assign TO RAM:
Assign C: RAM:
mettez la disquette Workbench dans le lecteur et continuez avec :
Assign DEVS: DF0:devs DF0:system SetMap F
la traduction vue de votre clavier est :
Copy CMQssign TO RA?M Qssign CM RA?M
Qssign DEVSM DFàMdevs DFàMsyste,=set,qp F
Maintenant que vous avez le clavier français entrez :
MakeDir RAM:devs Makedir RAM:devs keymaps MakeDir RAM:System
Copy DEVS:keymaps f TO RAM:devs keymaps Copy System SetMap TO RAM:System SetMap Assign C: RAM:
Remettez la disquette MonBoot à la place du Workbench et tapez maintenant :
Assign C: SYS:
Copy RAM:devs TO MonBoot:devs ALL
Copy RAM:System TO MonBoot: System ALL
Copy * TO S:Startup-Sequence
Echo "Workbench 1.3F - Disquette de Boot"
System SetMap F
Ctrl>-
Votre disquette va maintenant booter avec un clavier français.
Il était nécessaire d’avoir le fichier DEVS:keymaps f, donc de créer les répertoires devs et keymaps. Le programme SetMap est rangé dans le tiroir System. On aurait tout aussi bien le placer dans SYS: ou bien dans C: mais il vaut mieux le mettre à l’endroit où tout le monde s’attend qu’il soit. Nous voici maintenant arrivé à la deuxième étape : la disquette Boot minimale. En ajoutant une seule ligne à la Startup-Sequence vous pourrez essayer de démarrer avec le programme de votre choix.
Par exemple, si vous copiez l’AmigaBASIC sur cette disquette vous pourrez tenter votre chance en essayant de lancer le BASIC au démarrage avec laStartup-Sequence suivante :
Echo "Workbench 1.3F - Disque de Boot sur
AmigaBASIC"
System SetMap F AmigaBASIC
Nous continuerons le mois prochain la fabrication de notre disquette.
FI
???? BHHB
IMIGRÏ
APPLICATION AMIGADOS
LES FICHIERS BATCH
Le mois dernier, je vous ai montré beaucoup d’exemples de l’option LFOR- MAT de la commande List. Mais celui qui va suivre est de loin mon préféré. C’est peut-être aussi celui qui va vous étonner le plus car il permet de créer des fichiers batch. Un fichier batch est l’équivalent sur PC des fichiers scripts de l’AmigaDOS. Or, les utilisateurs de PC n’ayant pas à leur disposition la fabuleuse commande List de l’AmigaDOS, ils ont souvent des problèmes énormes de manipulation de leurs fichiers. Cela est également vrai pour ceux qui ont un Amiga avec la carte passerelle.
Il m’est arrivé un jour d’avoir à transférer une cinquantaine de fichiers de mon Amiga vers la carte passerelle. Comme je suis relativement organisé, ils se trouvaient tous dans un répertoire que j’avais nommé Transfert. La commande avec la carte PC pour récupérer un fichier venant de F Amiga est :
AREAD nom du fichier Amiga> nom du fichier PC>
L’idée d’avoir à taper cinquante fois cette ligne ne me passionnait pas énormément. C’est la commande List qui m’a encore une fois sauvé la vie :
List > SYS:trans.bat SYS:Transfert LFORMAT "AREAD %S%S A: %S"
Cela m’a créé un fichier trans.bat qui contenait la commande AREAD pour chacun des fichiers que j’avais à transférer. Je n’ai plus eu qu’à ouvrir la fenêtre PC et faire :
AREAD SYS:trans.bat trans
Après cela, je me suis rendu compte que l’AmigaDOS et tous les utilitaires de l’Amiga pouvaient être très utiles pour les fichiers de la partie PC. L’exemple des fontes que l’on copie sur plusieurs disquettes peut facilement être reproduit pour des fichiers PC que l’on voudrait passer d’un disque dur vers plusieurs disquettes. On peut vouloir éditer les fichiers PC avec un éditeur de texte Amiga, les modifier avec NewZap, le seul souci que nous cause ces manipulations est qu’il vaut mieux posséder pas mal de place en réserve dans la partie Amiga. La méthode à suivre est simple :
Transfert des fichiers PC vers 1'Amiga Bidouilles en tous genres sur 1'Amiga Retour des fichiers PC au bercail
A partir de là les possibilités sont nombreuses. Jamais je n’édite un texte de plus de 5 lignes sur PC. Ce n’est pas par préjugé mais parce que je ne connais pas les éditeurs de texte PC (c’est donc par ignorance...), et que leur manque entre autres le Couper-Coller, les raccourcis claviers, et la possibilité de manipuler plusieurs fichiers à la fois (...et aussi par exigence). Mais cela vous e saviez. En allant un peu plus loin, on apprend rapidement à éviter la lourdeur légendaire des PC en faisant un détour par l’Amiga. Imaginez que vous possédez des documents provenant d’un traitement de textes sur PC (disons qu’ils possèdent tous l’extension .TX1) que vous vouliez convertir au format d’un autre traitement de textes (avec l’extension .TX2). Pour cela, on vous donne un utilitaire qui fonctionne de la manière suivante :
UTIL fichier source> fichier destination La solution PC Amiga s'écrira : sous PC
AWRITE *.TX1 SYS .-Transfert
sous CLI
SYS:Transfert ?.TX1 LFORMAT "UTIL %S
List > SYS:util.bat %S2"Delete ?.TX1
sous PC
AREAD SYS:util.bat util
Une fois encore la commande List vous a tiré d’affaire. Comme vous allez finir par penser que je ne connais qu’elle, je vais vous donner un exemple de ce que l’on peut faire avec Copy ou Rename (en 1.3 et sous Shell uniquement). Quand vous entrez la commande :
Rename ?
Le Shell renvoit la réponse :
FROM A,TO=AS A:
qui indique les paramètres de la commande. La commande attend ensuite que vous entriez les paramètres. C’était surtout utile en 1.2 pour ceux qui n’avaient qu’un seul lecteur de disquette car ils pouvaient entrer une autre disquette que le Workbench et renommer le fichier qu’ils voulaient. Mais ces paramètres ne servent pas uniquement à vous indiquer comment utiliser la commande. Vous pouvez entrer au choix :
Rename ancien_nom nouveau_nom Rename FROM ancien_nom AS nouveau_nom
Vous me direz que la deuxième forme est seulement là pour faire joli et qu’elle ne sert à rien. Ce qui est parfaitement faux. La commande Rename vous sert notamment quand vous voulez modifier votre Startup-Sequence. Dans ce cas vous allez vouloir conserver un exemplaire de l’ancienne :
Rename FROM S :Startup-Sequence AS S :Startup-Sequence.anc Copy FROM S:Startup-Sequence.old TO S :Startup-Sequence
Ensuite, vous aller éditer votre nouvelle Startup-Sequence. Au bout d’un certain temps vous aurez envie de revenir à la Startup-Sequence originale car la première aura été trop modifiée. Les deux lignes à entrer sont :
Rename FROM S :Startup-Sequence AS S:Startup-Sequence.old Rename AS S :Startup-Sequence FROM S:Startup-Sequence.anc
Sous CLI, cela n’a aucun intérêt. Mais sous Shell, en utilisant l’historique des commandes et le déplacement avec les touches fléchées, vous allez y agner énormément car vous n’aurez qu’à intervertir les mots-clé FROM et
S. Ce qui est valable avec Rename, l’est aussi avec Copy et Type.
Nous sommes encore bien loin d’avoir exploré toutes les ressources du Shell. En mode direct, il existe trois manières de valider une commande: la touche Return (ou Enter), et les séquences de touches Ctrl>- et Ctrl>-J. Le return est le procédé normal utilisé pour valider ses commandes. Le Ctrl>- est utilisé par les fichiers scripts et est très mal géré par l’AmigaDOS. Il désigne en principe la fin de fichier mais souvent un caractère ÿ (y tréma) se trouve inséré ce qui entraîne des erreurs par exemple quand un fichier de commande se termine abruptement. Le Ctrl>-J est lui, particulièrement utile. Les commandes séparées par un Ctrl>-J ne sont pas exécutées immédiatement. Ainsi on peut lancer des commandes telles que celle-ci :
Date Ctrl>-J
List Ctrl>-J
Date Return>
Les commandes ne seront exécutées qu’après le Return> : c’est une manière simple de chronométrer un programme sans créer un fichier script pour cela. Une possibilité amusante des fichiers scripts est leur utilisation en mode direct. Essayez la commande suivante :
Exécuté *
IF Exists S:Startup-Sequence Echo "Ce fichier existe"
Else
Echo "Ce fichier n'existe pas"
Endif
Ctrl>-
C’est la seule manière d’utiliser la commande If en mode direct.
Cela peut-être utile si l’on veut vérifier qu’une commande que l’on ne connaît pas ou que l’on a créé gère bien les codes de retour :
Exécuté *
Ask "Oui ou Non (Y N)"
Y
IF WARN Echo "ok"
Else Echo "non"
Endif
Ctrl>-
Ici nous obtiendrons “ok” comme réponse. Le mois prochain nous allons nous attaquer aux fichiers scripts.
LE 3D C FACILE
LANGAGE C
Chers lecteurs et lectrices, bonjour ! Je me présente Herr Doktor Von GlutenStimmellmDorf. Pendant les mois qui vont suivre je vais vous parler Infographie (terme barbare né de la fusion des mots "informatique” et “graphique”) et plus particulièrement de la manipulation et de l’affichage d’objets graphiques en trois dimensions sur l’écran de votre AMIGA.
Contrairement à ce que certains pourraient vous dire, ce domaine est accessible à tous (sinon je ne serais pas là pour vous en parler). Il ne nécessite que l’apprentissage de quelques notions de base.
Avant de me lancer à corps perdu dans cet espace inconnu (roulement de tambours), je vais vous présenter le plan de cette série d’articles.
1 - Notions de base : les différents systèmes de coordonnées. Les objets élémentaires le point et le segment de droite. Comment créer à partir de ces éléments des objets complexes.
2 - Programmation de base : comment ouvrir un écran sur AMIGA. La création de fichiers objets sur disque. Comment afficher un objet à l’écran.
3 - Les transformations : les différentes transformations géométriques et projections. Comment les combiner pour voir la vie sous un angle différent.
4 - Notions avancées : la caméra virtuelle et les premiers principes d’animation.
5 - Animation Suite & Fin : Création de scripts et astuces de programmation.
6 - C’est la surprise.
Le langage de programmation qui servira de support à cette série d’articles est le langage C. Pourquoi le C me direz-vous? Je vous répondrai en deux mots PARCE QUE ! Sur ce commençons sans plusattendre.
PREMIERE PARTIE : NOTIONS DE BASE
Avant de parler des objets graphiques, il est nécessaire d’expliquer la notion de système de coordonnées. En effet tout objet graphique est représenté dans un système de coordonnées. Par exemple un point sur l’écran est créé par deux coordonnées (X,Y) représentant sa position à l’écran. C’est ce que nous appelerons le système de coordonnées écran. (Fig 1)
Ce système va nous permettre d’afficher sur l’écran de la machine un objet. Pour représenter un objet dans l’espace nous avons besoin de trois coordonnées (X,Y,Z). Ce sont les coordonnées cartésiennes. (Fig 2)
Ce système de coordonnées suffit normalement à représenter n’importe quel objet dans l’espace. Il existe toutefois un troisième système (artificiel), le système de coordonnées homogènes qui consiste à introduire une quatrième coordonnée dénommée W que nous fixerons dans un premier temps à la valeur 1. Cette quatrième coordonnée facilitera la composition des transformations ce qui vous le verrez nous sera bien utile.
Maintenant que nous avons étudié les différents systèmes de coordonnées nous allons pouvoir nous attaquer aux objets graphiques de base. Nous nous bornerons à deux types d’objets simples, le point et le segment de droite, qui nous permettront de définir, plus tard, des objets complexes.
Le point est toujours représenté par ses coordonnées, différentes, selon le système dans lequel on se trouve. Ainsi dans l’espace écran un point est représenté par deux entiers positifs que l’on nommera XE et YE. Dans l’espace cartésien 3D nous avons besoin de trois nombres réels X3D, Y3D, Z3D. Enfin en coordonnées homogènes quatre réels sont nécessaires XH3D, YH3D, ZH3D, WH3D.
Si l’on veut codifier cela sous forme compréhensible par notre chère machine on déclarera un point sous la forme d’un tableau de 2, 3 ou 4
éléments.
- Pour un point écran: unsigned short PointE[2];
- Pour un point dans l’espace cartésien 3D: float Point3D[3];
- Pour un point en coordonnées homogènes 3D: float PointH3D[4];
A partir de ces points qui sont les plus petites entités graphiques nous allons définir le deuxième objet de base : le segment de droite.
Un segment de droite est représenté par deux points, le point origine et le point extrémité (Fig 3).
Selon le système de coordonnées utilisé, ces deux points seront des points écran, des points 3D ou 3D homogènes.
En C on déclarera un segment de droite comme un tableau de deux pointeurs se positionnant sur les points origine et extrémité.
- Pour un segment écran: unsigned short *ligne[2];
- Pour un segment 3D ou 3D homogène: float *ligne3D[2],ligneH3D[2];
Ensuite on initialise ligne[0] et ligne[1] avec l’adresse des points extrémité et origine soit par exemple en coordonnées 3D.
Float Point_oriqine[3], Point_extremite[31 ; float *Ligne[2];
0] = Point_origine;
Ligne
Ligne
1] = Point_extremite;
A partir de ces deux entités graphiques il est désormais très facile de représenter un objet graphique complexe. Prenons l’exemple d’une pyramide à base carrée (Ha 4).
Cet objet est créé à partir de 5 points: (P0, P1, P2, P3, P4) et 8 lignes (L0(P0,P1), L1(P0,P2), L2(P0,P3),
(L0(P0,P1), L1(P0,P2), L2(P0,P3), L3(P0,P4), L4(P1,P2), L5(P2,P3),
L6(P3,P4), L7(P4,P1))
On peut représenter nos points par un tableau à deux dimensions: ex: unsigned short PointE[100][2]; * cent points écran 7 ou
float PointH3D[100l[4l * cent points en coordonnées homogènes 3D
7
et nos segments de droite par un tableau à deux dimensions de pointeurs..
ex: float *LigneH3D[100][2] * cent lignes en coordonnées homogènes
Il ne reste plus qu’à initialiser le tout dans le programme, par exemple lors de la déclaration des variables (l’objet est alors créé).
Si on reprend l’exemple de la pyramide en coordonnées homogènes 3D on aura:
float point[5][4] = 5,5,20,1}, 0,0,0,1}, 0,10,0,1},
10,10,0,1}, 10,0,0,1} };
float *ligne[8][2] = point[0],point[l]},
point[0],point [2]}, point [0],point[3]}, point [0],point [4]},
point[1],point 2}}, point[2],point[3]}, point[3],point[4]},
point[4],point[1]}};
Comme vous pouvez le voir c’est très simple.
On fera bien entendu de même avec les autres systèmes de coordonnées.
Ainsi se termine ce premier article sur le 3D. Le mois prochain nous entamerons une phase importante du programme puis nous verrons comment ouvrir un éfcran, comment tracer des points et des segments de droite et pour terminer nous afficherons un objet 3D à l’écran grâce à une transformation simple : La projection dimétrique.
Bonne digestion et à dans un mois.
Herr Doktor Von GlutenStimmellmDorfest un objet complexe !
H
????????
IMIGH!
APPLICATION GFA
MANIPULER LES FICHIERS .INFO EN GFABASIC
Les fichiers .info ont toujours fasciné les utilisateurs d’Amiga. Cela est dû au fait qu’ils combinent des éléments graphiques (des icônes et des fenêtres), des paramètres, des informations utiles comme la taille de la pile pour les programmes et aussi la position de l'icône sur l’écran. Malheureusement les fichiers.info sont très difficilement exploitables en GFABasic, car celui-ci ignore leur contenu au lancement du programme et n’offre pas de moyen simple pour récupérer leur paramètres. Par contre lire leur contenu et le modifier reste toujours possible. C'est ce que le programme ci-dessous fait en utilisant principalement la fonction GetDiskObject qui nous renvoie toutes les informations nécessaires dans une structure appelée DiskObject.
PutDiskObject permet de sauver (éventuellement en le créant) une structure DiskObject dans un fichier .info. La fonction FreeDiskObject rend au système la mémoire utilisée par la structure DiskObject et les structures qui en dépendent (plusieurs structures sont chargées en mémoire). Je vous renvoie encore une fois au ROM KERNEL MANUAL : Includes and Autodocs si vous voulez avoir le contenu entier de la structure DiskObject. Celle-ci offre la particularité de contenir une structure Gadget qui contient en fait la position et l’image de l’icône et de pointer sur une structure New- Window qui contient les paramètres de la fenêtre à ouvrir si le fichier .info est celui d’un tiroir ou un disque. Vous ne devez pas charger le fichier .info directement avec ce programme mais charger le fichier lui-même. Pour un disque il faut entrer ‘Disk’ comme DF0:Disk pour l'icône de la disquette en DF0: et pour un répertoire il faut entrer le nom du répertoire sans derrière. Si le fichier .info est introuvable, le programme s’arrête automatiquement. Sinon, l’icône sera affichée dans une fenêtre ainsi que quelques informations dans une autre fenêtre. Pour sortir du programme, il faut appuyer sur les deux boutons de la souris à la fois.
Du côté de la programmation il n’y a pas beaucoup de difficultés. Les fonctions GetDiskObject, PutDiskObject et FreeDiskObject ont été réécrites car il semble que l’icon.library n’est pas accessible directement du GFABasic. Cela demande donc sa réouverture avec OpenLibrary et l’utilisation de RCALL. La fonction GetDiskObject demande un nom de fichier sans .info, ce qui est économique. La partie de la structure DiskObject dont nous avons besoin est définie dans la procédure diskobjstruct. Ensuite le type du fichier .info est testé et affiché en clair. La partie suivante affiche l’icône du fichier .info dans une fenêtre et attend le clic souris. La fin du programme vous permet de sauver l’icône sous un autre nom et de changer les couleurs de la fenêtre si l'icône représentait un disque, un tiroir ou la trash- can.
Les différents types d’icônes sont :
DISK DRAWER TOOL PROJECT GARBAGE DEVICE KICK
DISK représente l’icône d'un disque (disquette, disque dur ou RAM-Disque).
DRAWER représente un tiroir.
TOOL représente un programme (outil).
PROJECT représente un fichier (texte, dessin, son, etc.) non exécutable.
GARBAGE représente la Trashcan.
DEVICE représente un device (je ne peux pas en dire plus, désolé!)
KICK représente le KickStart (les anciens comprendront... les autres aussi j’espère I)
LE FICHIER.INFO
J’ai pensé que vous saviez certainement ce qu’était un fichier.info et à quoi il servait. Si vous ne les connaissez pas bien, étudiez-les en sélectionnant une icône au hasard et en choisissant Info dans le menu Workbench. Vous pourrez découvrir ce que sont la StackSize, les TOOL TYPES et DEFAULT TOOL dont il est question dans ce programme. Ce programme a été volontairement bridé pour qu'il ne puisse pas causer d’ennuis dans vos icônes.
Certains champs sont délicats à manipuler c’est pourquoi je ne les ai pas inclus ici. Un fichier info corrompu peut dans certains cas entraîner un plantage du système, c’est pourquoi il vaut mieux être très très très méfiant si vous désirez modifier ou étendre ce programme.
' Utilisation des fonctions GetDiskObject ' et PutDiskObject
r
DIM regs%(15)
iconname$ ="icon.library"+CHR$ (0) iconbase%=OpenLibrary(V:iconname$ ,0)
IF iconbase%
FILESELECT "Nom du fichier : ","0k","RAM:",nomfic$ icone$ =nomfic$ +CHR$ (0) diskobj%=@getdiskobject(V:icone$ ) diskobjstruct(diskobj%)
IF diskobj%
OPENW 0 OPENW 5
type|=SHR&(types,8)
SELECT type|
CASE 1 PRINT "Type : DISK" tool$ =CHAR defaulttool%}
PRINT "Default tool : ";tool$
CASE 2 PRINT "Type : DRAWER"
PRINT "Position de l'icône
1currentx%,currenty%
CASE 3 PRINT PRINT CASE 4 PRINT
'Type : TOOL" 'Ancienne stacksize
';stacksize%
Type : PROJECT"
PRINT "Ancienne stacksize : stacksize!
CASE 5 PRINT "Type : GARBAGE"
PRINT "Position de l'icône : ";currentx%,currenty%
R
IQEIDE DQBB
CASE 6
PRINT "Type : DEVICE"
CASE 7 PRINT "Type : KICK"
ENDSELECT "AddGadget(WINDOW(0),gadget%,0)
"RefreshGadgets(gadget%,WINDOW(0),0)
REPEAT
UNTIL MOUSEK=3
"RemoveGadget(WINDOW(0),gadget%) demande("Sauver 1'icône")
IF rep$ ="0"
IF typeù 3
demande("Modifier les couleurs de la fenêtre")
IF rep$ ="0"
INPUT "DetailPen (255 par défaut) : ";detailpen|
INPUT "BlockPen (255 par défaut) :
";blockpen|
ENDIF
ENDIF
INPUT "Nom de sauvegarde : ";nom$ snom$ =nom$ +CHR$ (0)
(V:snom$ ,diskobj%)
ENDIF
frjeediskobject(diskobj%)
ENDIF
"CloseLibrary(iconbase%)
ENDIF
PROCEDURE demande(a$ )
PRINT a$ ;" (O N) :
REPEAT rep$ =UPPER$ (INKEY$ )
UNTIL rep$ ="0" OR rep$ ="N"
PRINT rep$
RETURN
PROCEDURE diskobjstruct(diskobj%) gadget%=diskobj%+4 ABSOLUTE type&,diskobj%+48 ABSOLUTE defaulttool%,diskobj%+50 ABSOLUTE currentx%,diskobj%+58 ABSOLUTE currenty%,diskobj%+62 ABSOLUTE drawerdata%,diskobj%+66 ABSOLUTE stacksize%,diskobj%+74 newwindow%=drawerdata%
ABSOLUTE detailpen|,newwindow%+8 ABSOLUTE blockpen|,newwindow%+9 RETURN
PROCEDURE freediskobject(diskobj%) regs%(14)=iconbase% regs%(8)=diskobj%
RCALL iconbase%-&H5A,regs%()
RETURN
PROCEDURE putdiskobject(name%,diskobj%) regs%(14)=iconbase% regs%(8)=name% regs%(9)=diskobj%
RCALL iconbase%-&H54,regs%()
RETURN
FUNCTION getdiskobject(nom%) regs%(14)=iconbase% regs%(8)=nom%
RCALL iconbase%-&H4E,regs%()
RETURN regs%(0)
ENDFUNC
INITIATION GFA
SUR LES TRACES DU GFA BASIC
Sur les traces du GFABasic.Parmi les facteurs qui permettent de juger de l’efficacité d’un langage, la rapidité d’exécution est la plus souvent citée ainsi que la taille du code généré. Même si ces deux facteurs sont réellement importants je crois que c’est une erreur de leur accorder la priorité. Si votre programme est fait pour être utilisé une seule fois, à quoi cela vous servira-t-il qu’il s’exécute en dix secondes plutôt qu’en cinq minutes ? Vous me répondrez que c’est toujours cinq minutes de gagnées.
Ceci reste encore à prouver car tout dépend du temps que vous avez passé à mettre au point le programme, qui DOIT être comptabilisé dans la comparaison, surtout pour les programmes ne devant pas servir beaucoup. A ce moment là, on se rend compte qu’un programme développé en deux heures va plus vite qu’un programme développé en deux jours. Même si les tests montrent que le deuxième jorogramme est celui qui s’exécute en dix secondes. Il ne faut donc jamais oublier les temps de mise au point quand on veut avoir une bonne idée d’un langage.
R
Le débogage en GFABasic est relativement simple, c’est ce que nous allons voir. Le programme numéro 1 est un très bon exemple de programme faux. Tapez-le sous l’éditeur et lancez-le. Vous verrez qu’il ne s’arrête jamais. C’est exactement le genre d’erreur agaçante car on se sait pas où le programme cloche.
La méthode la plus connue pour déboguer un programme tel que celui-ci consiste à mettre ce que l’on appelle des traces (ou des mouchards) dans le programme.
Le programme numéro 2 montre cette méthode, utilisée selon le principe dichotomique. Il s’agit de séparer le programme en petits bouts afin de savoir où le problème se pose. Il permet de deviner en trois secondes que la boucle WFHILE ne se finit pas. C’est alors qu’on modifie le programme numéro 2 en enlevant le commentaire devant l’instruction PRINT. Cela suffit pour se rendre compte qu’il passe à 0 aussitôt après avoir valu 255. Ce qui est tout à fait logique puisque il est un octet, c’est-à-dire un nombre entre 0 et
255. Il ne nous reste plus qu’à réparer l’erreur en modifiant le test faut donc modifier à nouveau notre programme pour réparer l’erreur (programme 3).
Après cela, on se rend compte que la boucle DO...LOOP ne fonctionne pas correctement. Si on avait enlevé les traces, on aurait plutôt pensé que la boucle WHILE...WEND n’avait pas été correctement réparée, méfiez-vous de cela. Je suppose que vous avez compris que la boucle ne marche pas parceque il ne pourra jamais être négatif (il fallait mettre LOOP UNTIL il = 0). Laissons maintenant de côté ce petit programme.
Cette manière de tracer un programme est une sorte de standard puisqu’elle fonctionne dans pratiquement tous les langages, y compris l’assembleur. C’est une bonne méthode puisqu’elle nous a permis de trouver ce qui n’allait pas. Par contre, quand l'erreur produit un plantage du système, on se rend compte qu’il est très important de trouver l’erreur du premier coup pour éviter des manipulations excessives. Sinon, il faudra placer quelques mouchards suivis d'instructions DELAY ou PAUSE, sauver le programme, le lancer, bien observer à chaque fois entre quels mouchards a eu lieu le plantage, regarder un magnifique plantage du système (le fameux mode Fire- works), rebooter l’Amiga, etc. Je vais peut être vous décevoir mais mon programme numéro 4 ne cause pas de plantage du système, il se contente de vous faire une petite erreur division par zéro.
D’ailleurs quand vous appuyez sur Return le curseur est sur la ligne contenant l’erreur, ce qui n’arrive pas quand un Guru se produit. Comment auriez vous fait si ce programme avait réellement produit un Guru ? Ce qui est réellement important maintenant c’est de savoir sur quelle instruction le programme plante et aussi avec quelles valeurs. Le programme 5 permet de s’en faire une idée très précise. L’instruction utilisée ici est TRON. Cette instruction permet d’afficher la prochaine instruction qui va être exécutée. J’ai utilisé une forme un peu compliquée de cette instruction qui utilise une procédure pour afficher la trace. Je crois qu’il est très utile d’avoir des procédures de ce genre, celle-ci est intéressante car on peut faire défiler le programme rapidement en appuyant sur un bouton de la souris et même tout arrêter en le lâchant. Pour finir, je vais vous donner mes procédures préférées en matière de traces (programme 6). Celles-ci sont générales, c’est à vous d’afficher vos variables à l’intérieur de ces procédures si vous en avez besoin.
Programme 3
Programme 1
' Programme numéro 1 :
' Un programme faux - Cherchez l'erreur ...
r
FOR i|=0 TO 255 total=i|+1 NEXT i| i | =0
WHILE NOT i|>255 ADD total,i|
INC i|
WEND DO DEC i|
INC total LOOP UNTIL i| 0 PRINT "total = " total
Programme 2
' Programme numéro 2 :
' Un programme faux Vous devriez trouver l'erreur ...
PRINT "boucle for ..."
FOR i|=0 TO 255 total=i|+l ' PRINT i|
NEXT i|
PRINT "ok" i 1=0
PRINT "while WHILE NOT i|>255 ADD total,i|
INC i|
' PRINT i|
WEND
PRINT "ok !"
PRINT "do DO DEC i|
INC total ' PRINT i|
LOOP UNTIL i| 0 PRINT "ok ! !"
PRINT "total = " total
' Programme numéro 3 :
' Un programme faux - Vous devriez trouver l'erreur ...
'PRINT "boucle for ..."
FOR i|=0 TO 255 total=i|+l ' PRINT i|
NEXT i|
PRINT "ok" i | =0
PRINT "while ..."
WHILE NOT i|=255 ADD total,i|
INC i|
' PRINT i|
WEND
ADD total,i|
PRINT "ok !"
PRINT "do ..."
DO DEC i|
INC total ' PRINT i|
LOOP UNTIL i| 0 PRINT "ok ! !"
PRINT "total = " total
Programme 4
' Programme numéro 4 :
' Un faux programme faux -
' a=24
b=30
FOR i=0 TO 10 a=a+i
PRINT (i+2*a) (a*b)
PRINT (i+2) (a+b)
PRINT (2*i+l) (a b)
PRINT (3*i+l) (a-b)
PRINT (5-i) (a-2*b)
PRINT (i+4) (a-4*b)
NEXT i
FI
' Programme numéro 5 :
' Une trace interactive -
t
TRON traceur
a=24
b=30
FOR i=0 TO“ 10 a=a+i
PRINT (i+2*a) (a*b)
PRINT (i+2) (a+b)
PRINT (2*i+l) (a b)
PRINT (3*i+l) (a-b)
PRINT (5 i) (a 2*b)
PRINT (i+4) (a-4*b)
NEXT i
PROCEDURE traceur PRINT "************"•TRACE $ PRINT "************";a,b,i REPEAT
UNTIL MOUSEK RETURN
Programme 6
' Programme numéro 6 : ' - Plusieurs traces -
r
OPENW 5 OPENW 0 TRON tracel
FOR i=l TO 100 PRINT i NEXT i TRON trace2 FOR i=l TO 100 PRINT i NEXT i FRONTW 5 TRON trace3 FOR i=l TO 100 PRINT i NEXT i TROFF
' Attend une touche ou un bouton de la souris pour continuer PROCEDURE tracel'
PRINT "************";TRACE$
REPEAT
UNTIL MOUSEK RETURN
' celle-ci attend une touche ou la souris pour afficher la ligne en cours ' le programme continue de toute façon PROCEDURE trace2 IF INKEY$ >"" OR MOUSEK PRINT "***********";TRACE$
ENDIF
RETURN
' La dernière permet de visualiser le déroulement du programme sans ' modifier l'affichage de celui-ci PROCEDURE trace3 OPENW 5 PRINT TRACE$
OPENW 0 RETURN
N° 23 de MAI 24 PAGES SUPPLEMENTAIRES
LE GUIDE DE L'ENVIRONNEMENT
AMIGA
DECOUVREZ TOUS LES LOGICIELS, ET PERIPHERIQUES DANS LES DOMAINES DE : LA VIDEO, LA PAO, LE GRAPHISME, LE SON, LA 3D, LA BUREAUTIQUE, LE JEU, L'EDUCATIF, LA MUSIQUE ...
R
InterComputing 34, Avenue des Champs Elysées 75008 PARIS
(D (1) 42 82 16 03
Notre experience, nos tests et nos clients nous ont permis de vous proposer une sélection de produits
haut de gamme et FIABLES TOUS NOS PRIX SONT TTC. NOUS ASSURONS NOUS MEME LE SAV.
SPECIAL OFFER FOR FRANCE EXCLUSIVEMENT EN AVRIL 1990 MOIS D’OUVERTURE
VOTRE DISQUE DUR QUANTUM 40 MEGAS AVEC CONTROLEUR SCSI AUTO BOOT
5500. 00 FRS TTC
NOUS AVONS 5 ANS
D’experience sur AMIGA*
Nous sommes la plus ancienne société de VPC distribuant Softs et périphériques AUX USA Pour nous Un client passe avant tout, et nous désirons en faire un Ami.
Nous espérons avoir beaucoup d’amis FRANCOPHONES
CARTES ACCELERATRICES
PACKAGE GVP® COMPLET
Comprenant :
28MHz
23290
29690
33MHz
29690
35960
Carte 6830 + 4 Megs 32Bits Carte 6830 + 4 megs 32 bits + HD 80MB
EXTENSIONS MEMOIRES**
M501 (Extension 512K Microbotics pour A500® avec Horloge) 790
2 MB (Extension Microbotics 2 Megs extensible 8 pour a2000) 4190
4 MB (Extension Microbotics 2 Megs extensible 8 pour a2000) 5690
6 MB (Extension Microbotics 2 Megs extensible 8 pour a2000) 7190
8 MB (Carte livrée complète) 8690
RAM (Pour Carte ci-dessus ou Commodore A2058® ) PAR 2Mo 1790
RAM (Pour Commodore A590® uniquement) PAR 512K 390
DISQUES DURS
A2000
105 MEGS QUANTUM SCSI avec Contrôleur 80 MEGS QUANTUM SCSI avec Contrôleur
9990. 00
8590. 00
40 MEGS QUANTUM VOIR OFFRE
A500
SUPRA DRIVE® 30 MEGS 5990.00 SUPRA DRIVE® 40 MEGAS 7690.00
LECTEURS ET DISQUETTES
Lecteur Interne 3F2 A2000 995.00 Lecteur Exteme3P2 Plat 995.00 Lecteur Externe 5 F4 1550.00 DISQUETTES 135TPI DOUBLE FACE ETIQUETTES
360. 00 FRS PAR 50
590. 00 FRS PAR 100
La remontée rapide et sauvage du prix des RAMS, lors de la conception de cette annonce, nous oblige à vous informer que les prix des mémoires risquent de varier. MAIS NOUS FERONS NOTRE POSSIBLE POUR MAINTENIR LES PRIX ANNONCES.
Commandes Par courrier , joindre règlement +40 Frs. De frais de port Micros ordinateurs livrés en port du Commandes par Téléphone, CB, Visa ou Contre Remboursement.
Tous Crédits disponibles Nous consulter.
Prix soumis aux variations du marché
3615
COMREV
lu 11111111111111 m
BAVA
il 11111 ii 1111111111111 rm ri 111111111111111111
ACTUALITÉ
Trois lieux différents pour l’expression directe :
- la tribune de l’info : c’est vous qui faites l’actualité.
- les forums : pour les réunions en petit comité.
- les boîtes aux lettres : pour être là même lorsque vous êtes ailleurs.
- les amphis : pour tout savoir et tirer encore mieux parti de votre AMIGA, les amphis à thèmes, organisés en direct.
PA
Les petites annonces pour échanger, vendre et acheter, classées sous cinq rubriques : unités centrales, périphériques, logiciels, contacts et divers.
JEUX
Comme vous êtes très forts, nous avons décidé de corser un peu l'affaire ! Il y a toujours du nouveau et plein de cadeaux à gagner pour tous.
CR
Pour en savoir plus sur l’actualité de Commodore Revue, pour retrouver les sommaires de tous les numéros parus. Bientôt la rubrique Shopping, pour vous procurer vos disquettes personnalisées et leurs boites de rangement, le tapis souris, le kit de téléchargement et beaucoup d'autres articles Commodore, à commander directement par minitel.
ENVI
La plus grande et la plus complète banque de données, avec tous les softs disponibles sur AMIGA, classés par rubriques.
LAS VEGAS ON LINE
COMREV, c'est mieux que le Ceasar's Palace : on peut jouer et gagner sans quitter ses charentaises. Et puis c'est plus près, et nettement plus intellectuel. Entre le Quiz, qui fait appel à votre culture et le Soft Caché, qui s'offre à votre sagacité, il y en a pour tous les goûts. A propos d'intellectuel, nous devons saluer la performance mentale de Rémi PONSOT, qui remporte le premier Grand Prix du Soft Caché de février. La lutte s'annonce rude pour le Grand Prix de Mars : l'enjeu est un Tuner TV pour le vainqueur, et pour les suivants, toujours des softs et des bandes dessinées.
Depuis plusieurs semaines, le tirage du Quiz est hebdomadaire. Chaque semaine, il y a plusieurs heures d'accès en 3614 à gagner.
NOUVEAU !
JEU : Le SOFT CACHE c'est un mot à trouver, en utilisant votre immense culture et votre sens bien connu de l'à- propos. Une véritable caverne d'Ali Baba s ouvre devant vous : des cadeaux en pagaille et en prime, le tirage mensuel du Grand Prix COMREV. Enjeu : une extension mémoire ou un lecteur externe, au choix du gagnant. On ne le dira jamais assez : vous gâter, nous, on aime çà.
Le mois prochain, nous aurons un an ! Vous êtes cordialement invités à venir fêter cela avec nous. Rendez-vous dans le prochain numéro de Commodore Revue et sur 3615 COMREV : vous n'êtes pas au bout de vos (bonnes) surprises !
N'oubliez pas : nous aimons aussi recevoir et tenir compte de vos idées et suggestions.
Les softs les plus téléchargés au mois de mars :
1
SCENERY
2
VIRUS X 3.0
3
SOUND DEMO
4
TURBO
5
PCOPY
6
NEWTON
7
VIRUS X 4.0
8
CLICON
9
TUNEL
10
STEAL MEMBOOT
TÉLÉ
Les nouveaux softs disponibles pour vos téléchargements : HAMPICS, CON- MAN, ARP 1.3, COMREV GFA, POWER PACKER, SHOW FONT, SUPERVIEW, WARP 2.0 et toujours : SCHEME, SI- LENTS & NORTHSTAR DEMO, VOICE SORTER, EFJ, FLIGHT OF DREAM, SCOOPEX SIN DEMO, BALLRUN, SONIX PEEK, ANIMALS SOUNDS, INS- TALLBEEP.
TRIBUNES
TRIB, pour échanger des informations et des tuyaux. Voici quelques dialogues et questions relevés récemment.
Question de CRACKEUR : Comment créer un fichier info pour un fichier qui n'en possède pas avec le WB 1.3 ?
SEB :: Dans Bomber Cheat Mode, vous voulez accéder à toutes les missions ? Pas de problème ! Tapez comme nom de pilote BUCKARDOO, et Hop ! Pour le temps accéléré, c'est ALT-T, mais seulement en mode vol libre.
Question de LE PAT : Je possède un A2000 (b) et j'ai aussi une file card Western Digital qui dort dans un vieux PC. Je voudrais l'utiliser dans le 2000, sachant que j'ai la carte Passerelle XT. Quelqu'un peut-il me dire comment partitionner ma file card ?
Pour leur répondre : 3615 COMREV.
Ont style="font-size:small;font-family:Arial, sans-serif;font-weight:bold;">TRIBUNES TRIB, pour échanger des informations et des tuyaux. Voici quelques dialogues et questions relevés récemment.
Question de CRACKEUR : Comment créer un fichier info pour un fichier qui n'en possède pas avec le WB 1.3 ?
SEB :: Dans Bomber Cheat Mode, vous voulez accéder à toutes les missions ? Pas de problème ! Tapez comme nom de pilote BUCKARDOO, et Hop ! Pour le temps accéléré, c'est ALT-T, mais seulement en mode vol libre.
Question de LE PAT : Je possède un A2000 (b) et j'ai aussi une file card Western Digital qui dort dans un vieux PC. Je voudrais l'utiliser dans le 2000, sachant que j'ai la carte Passerelle XT. Quelqu'un peut-il me dire comment partitionner ma file card ?
Pour leur répondre : 3615 COMREV.

Click image to download PDF

AMIGA NEWS TECH numero 11 (04-1990)

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


Thanks for you help to extend Amigaland.com !
frdanlenfideelhuitjanoplptroruessvtr

Connexion

Pub+

55.3% 
9.7% 
3.8% 
3.5% 
3.1% 
2.2% 
2.1% 
1.3% 
1% 
0.9% 

Today: 2
Yesterday: 90
This Week: 92
Last Week: 732
This Month: 2018
Last Month: 2867
Total: 77406

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