Sponsors

FacebookTwitterGoogle Bookmarks

AMIGA 2000 UNE MACHINE CONÇUE POUR EVOLUER : FICHE TECHNIQUE: L'Amiga 2000 comporte une mémoire de un mégaoctet, des connecteurs internes, trois unités de disaues internes. Il offre également la possibilité d'éxécuter des tâches au moyen d'un coprocesseur dans les fenêtres Amiga. Amiga 2000 est un ordinateur de Commodore dont la mémoire standard a été augmentée par rapport à celle de l'Amiga 1000 : Il comporte également des connecteurs internes en vue d'une extension ultérieure et offre la possibilité d'ajouter la compatibilité logiciel IBM PC XT au moyen d'une carte d'extension, la carte A2088. En plus des connecteurs d'extension, propres à Amiga, l'Amiga 2000 comporte un dus IBM PC AT incorporé. Par conséquent, l'Amiga 2000 peut non seulement exécuter les logiciels IBM mais permettre à vos applications IBM B d'avoir accès aux extensions IBM PC, notamment aux cartes 80286 et 80386. ARCHITECTURE D'EXTENSION : la raison d'être du A2000, c'est la présence de connecteurs sur le fond de panier. Ainsi l'Amiga possède des possibilités d'extension interne. De plus, il offre une méthode unique et astucieuse d'exécution du MS DOS. Le connecteur le plus intéressant du fond de panier, c'est celui de la CPU à 86 broches qui a le même accès non tamponné aux bus de données et d'adresses de l'Amiga que le PC 68000.

Click image to download PDF

AMIGA NEWS TECH numero 18 (12-1990)

Document sans nom A
I
G
A
A
N°18 DEC. 90
GfaBasic
TRANSACTOR
Application : Tétris 3D par J. Etienne, P. 4i Dir-Moi et par
Sentinelle
par F. Mazué, P. 34
ASSEMBLEUR
'mov>s
Application : travail à la chaîne par "
Initiation : Les principales instructions d'Amal par F. Lionnet, p. 61
«GAGE C
Application : Le 3D se Cache (part. Il) par HDV Truc..., p. 52
JtTcll Uû ©© ©Ü© F
1_[
UNE SENTINELLE POUR VEILLER SUR VOTRE AMIGA
L'OBJECTIF DE CET ARTICLE
Le mois dernier, nous nous sommes entretenus des exceptions du 68000 pouvant être déclenchées par programmation. Aujourd’hui nous allons aborder un autre type d’exception : les interruptions.
Il n'est pas question de traiter exhaustivement des interruptions dans le cadre d’un petit article comme celui-ci car ce sujet est immense dans le cas de f’Amiga. Nous allons simplement expliquer brièvement ce qu’est une interruption, comment ajouter un serveur d’interruption au système et illustrer ceci par quelques exemples dont un utilitaire... utile.
PUB
Pour vous documenter et ou appronfondir la question, je me permets une fois encore de vous recommander les ouvrages “Amiga Rom Kernet ManuaT et “Mise En Œuvre du 68000”.
QU’EST-CE QU’UNE INTERRUPTION ET A QUOI ÇA SERT ?
Vu de l’extérieur, quand un ordinateur exécute un programme, on a l’impression qu’il se consacre totalement et uniquement à ce programme, mais ceci n’est pas vrai, même dans le cas d’une toute petite calculatrice comme l’Atari ST par exemple.
En effet tout ordinateur a besoin périodiquement de reprendre la main sur te programme qu’il exécute. En ce qui concerne notre Arniga, ceci est nécessaire afin que soient traités convenablement certains événements comme : reconnaissance, d’une touche appuyée au clavier, mise à jour de la copper-tist, déroulement et sélection de points de menu, déplacement du pointeur de la souris, changement de port fenêtre suivant l’endroit où pointe lé souris, envoi et réception de messages et de signaux, commutation des tâches, fin d’accès disque, fin de travail du copper ou du btitter, et plein d’autres choses encore.
Nous avons dit plus haut qu’une interruption est également une exception. Précisons : une exception est déclenchée de manière «interne» par programmation. Une interruption est déclenchée de manière externe par envoi de signaux électriques sur les pins IPL0, IPL1 et IPIL2 du 68000.
Avec trois signaux il est possible de coder tes valeurs de 0 a 7. La valeur 0 (aucun signal) correspond au fonctionnement normal et tes valeurs 1 à 7 correspondent donc aux sept niveaux d’interruption dont dispose le 68000.
Peut-être savez-vous que l’Amiga utilise en fait 15 niveaux d’interruption. De ce fait les signaux issus des différents composants électroniques ne sont pas envoyés directement sur le 68000, mais d’abord regroupés en 7 niveaux par Paula.
Lorsque le 68000 reçoit un signal d’interruption il :
- passe en mode superviseur,
- empile le PC et le registre d’état,
- modifie te registre d’état selon le niveau d’interruption,
- saute dans le vecteur d’interruption correspondant au niveau d’interruption.
Comme pour les vecteurs d’exception, tes vecteurs d’interruption ne dépendent pas du 68000 mais de l’ordinateur. Sur l’Amiga chaque routine commence à lire les registres INTENA et INTREQ de Paula afin de retrouver te niveau “Arniga” de l’interruption déclenchée et de poursuivre en conséquence.
Mes explications pourront peut-être paraître sibyllines, mais je ne peux pas entrer dans tes détails faute de place. Pour tout savoir sur tes interruptions, reportez-vous aux ouvrages recommandés.
PROGRAMMATION D’UNE ROUTINE D’INTERRUPTION
Comme pour les exceptions, il y a ici deux méthodes : la bonne et ta mauvaise.
Voyons d’abord ta mauvaise. Elle consiste à détourner le vecteur en bas de RAM sur une routine personnelle, puis à la fin de celle-ci sauter à l’adresse initialement prévue. Cette méthode n’est pas bonne car si plusieurs programmes tentent de faire de même, le chaînage des routines risque d’apporter quelques surprises désagréables. Par contre cette méthode sauvage conviendra parfaitement aux programmeurs fous qui ne jurent que par tes mégas-démos.
La bonne méthode maintenant : programmer un handler ou un serveur d’interruption. Nous ne verrons que le cas du serveur, utilisé par les interruptions CIAs, copper, blanc vertical, btitter, non masquables. Pas de panique, la programmation d’un handler est identique à celle d’un serveur à quelques détails près. Reportez-vous à la documentation pour en savoir plus.
Une interruption dépend de la structure suivante : struct Interrupt )
struct Node is_Node;
APTR is_Data;
VOID fis_Code)Q;
();}
- is_Node est un nœud de type NT-INTERRUPT. La priorité du nœud doit être définie entre +127 et -128. Les serveurs sont appelés suivant cet ordre de priorité. Il est également recommandé d’initialiser le pointeur de nom du nœud si l’on risque d’avoir besoin de retrouver le nœud plus tard.
- is_Data est un pointeur sur te champ de données que bon vous semblera. Son initialisation n’est pas indispensable.
- is.Code est un pointeur sur ta routine à éxecuter lors de l’interruption. Pour ajouter ou enlever une tette structure à ta liste des serveurs d’interruption, il suffit d’utiliser tes routines AddlntServer et RemlntServer d’exec.library.
Lorsque exec passe la main à notre routine d’interruption, les registres 68000 sont dans l’état suivant :
D0 scratch D1 scratch
AQ scratch sauf dans un cas
A1 pointe sur le champ de données défini dans la structure (scratch)
A5 pointe sur ta routine d’interruption (scratch)
A6 scratch
On voit donc que les registres D2-D7 A2-A4 ne doivent pas etre utilises.
Il est évidemment possible, pour tes forcenés, d’empiler ces registres, de s’en servir puis de les récupérer sur la pile avant de quitter.
On voit également que DO, D1, A6 ne contiennent rien de particulier en entrée et ne doivent, de même que A! Et A5, rien contenir de particulier à ta sortie de ta routine (c’est ça que veut dire scratch). A0 est un cas à part : il contiendra $ dff000 si le serveur est initialisé sur l’interruption blanc vertical avec une priorité supérieure ou égale à 10 et cette valeur (SdffQOQ) devra être conservée en sortie de routine. Pour une priorité inférieure te registre A0 est scratch.
Il faut en outre savoir que si l’on quitte notre routine avec le ftag Z mis, exec passera ensuite ta main aux serveurs de priorité (de nœud) inférieure pour une même interruption. Si Z n’est pas mis, exec considère que te traitement de l’interruption est terminé et retourne au mode normal. Pour placer te ftag Z il suffit de faire un moveq 0,DQ avant de quitter
Une routine d’interruption doit se terminer par RTS et non par RTE car c’est exec qui se chargera de repasser en mode User.
LE PREMIER PROGRAMME
Le principal étant maintenant dit, nous allons passer tout de suite à ta pratique avec le programme Crazy-Led. Le seul intérêt de ce programme est de permettre la visualisation des interruptions.
Déroulement du programme :
¦yjBBEIB HBHC1
Tmn)§Sife[F
- ouverture de intuition.library,
- ouverture d’une fenêtre,
- réservation de mémoire pour la structure interruption,
- initialisation de la structure,
- ajout de la structure à la liste du système.
A partir de ce moment, vous verrez la Led-Power clignoter (sans gourou !). En effet la routine d’interruption bascule l’état de la Led tout les 25 passages, soit toutes les demi-secondes.
- La tâche est mise en état d’attente.
Puis lorsque le gadget de fermeture de la fenêtre est cliqué :
- la structure d’interruption est retirée de la liste,
- l’allumage de la Led est assuré,
- la mémoire est libérée,
- la fenêtre est fermée,
- intuition.library est fermée.
Une petite remarque : le fait de basculer l’état de la Led a également pour effet de basculer l’état du Low-Pass-Filter. Donc Utiliser ce programme conjointement avec un programme musical risque de ne pas être une très bonne idée...
REOUVERTURE DE LA CHASSE AUX VIRUS
Encore un anti-virus pensez-vous ? N’y en a-t-il pas suffisamment dans le domaine public ? Et bien non, car, ici aussi, il est intéressant de repenser le problème et pour éviter que certains ne me lancent le clavier de leur Amiga flambant neuf en pleine figure, je précise tout de suite que finalement ce n’est pas un anti-virus “classique" que je vous propose. Analysons la situation :
LES VIRUS
- Tous les virus que je connais se “reproduisent” par l’intermédiaire du Reset de façon à infecter les disquettes de manière inaperçue. Ces programmes s’implantent soit sur le vecteur ColdCapture, soit sur le vecteur CoolCapture, soit installent un module résident (cf. Article BOOT ALLOCATOR CR n°26) dans exec.library. Je ne connais pas de virus s’installant sur le vecteur WarmCapture de la même exec.library, mais il est tout à fait possible et facile de surveiller également ce vecteur de la même façon que les autres.
- Les premiers virus étaient facilement détectables car présents à un endroit bien précis des disquettes infectées : le boot-block. Malheureusement les nouveaux virus dit virus "coquilles” se greffent sur n’importe quel fichier exécutable, ne sont donc pas limités en taille et ne sont pas détectables tant que le virus est inconnu des programmeurs d’anti-virus. Toutefois les virus coquilles doivent, lorsqu’ils sont chargés, s’installer eux-aussi sur le Reset afin de pouvoir se reproduire ultérieurement. Là est leur point faible.
- Un virus régénérant ses propres vecteurs reset sous interruption deviendra difficile à tuer. Un tel virus existe : le très redoutable et dévastateur “Lamer Revenge Virus” par exemple. Attention, ce virus est capable d’attaquer férocement votre disque dur et de vous en effacer tout un répertoire sans coups férir (à vous les Read Write Errors !).
LES ANTI-VIRUS
- Tout les anti-virus de ma connaissance semble souffrir du même cruel manque d’imagination : ils s’efforcent seulement de détecter les virus déjà connus. Il est certes très intéressant de savoir de quel virus il s’agit, mais évidemment lorsqu’un nouveau virus apparaît il n’est pas détecté. On se rappelle le désespoir de quelques-uns qui ont été infectés par le "Lamer Exterminator” lors de sa sortie.
- Les anti-virus connaissant les caractéristiques des virus qu’ils recherchent, examinent quels vecteurs de sauts de librairies ou quels vecteurs de sauts d’interruption ont bien pu être détournés ou encore examinent le haut de la chip-ram, car beaucoup de virus s’implantent à addresses fixes à cet endroit. Il y a un hic : certains programmeurs de virus savent programmer correctement un serveur d’interruption, donc sans détourner bestialement les vecteurs. C’est ici encore le cas du “Lamer Revenge Virus”.
- Si l’on utilise par exemple les anti-virus : “VirusX" et “Master Virus Killer” qui se veulent pourtant être les meilleurs anti-virus du moment, on verra que VirusX sait reconnaître la présence du “Lamer Revenge Virus” mais est incapable de le tuer et que le “Master Virus Killer” nous annonce “virus inconnu en mémoire”, ne comprend rien à ce qui se passe car il ne fait qu’examiner la table de sauts d’interruption sans détecter un éventuel serveur suspect, boucle (sans possibilité de reprendre la main) sur son test, et est bien sûr totalement incapable de tuer le virus. L’auteur nous dit même dans sa documentation que pour tuer un tel virus le mieux est encore d’éteindre la machine (!?).
Ceci condidéré, je vous propose une :
SENTINELLE
Ce programme a pour vocation de combattre les pires virus avec leurs propres armes, non pas en nettoyant les disques infectés comme un anti virus classique, mais en empêchant le virus de s’installer en mémoire. Pour cela, il installe un serveur d’interruption sur le blanc vertical, dont la mission est de vérifier périodiquement (50 fois par seconde) que les vecteurs Reset sont inoccupés.
En cas d’occupation d’un vecteur Reset, ce serveur nettoie ledit vecteur et envoie un signal afin de réveiller sa tâche mère. Celle-ci enverra alors une alerte destinée à prévenir l’utilisateur.
LA SENTINELLE PEUT TUER
En effet, si l’alerte apparaît, il y a deux possibilités :
- Cliquer sur le bouton de gauche de la souris afin de reprendre la main. Attention ceci est risqué car la sentinelle ne répare pas les libraries éventuellement modifiées par le virus. Un accès disque peut donc permettre encore au virus d’agir et procurer quelques désagréments.
- Deuxième possiblité : cliquer le bouton de droite. Cette alternative devient une obligation si le virus détecté se régénère sous interruption car évidemment l'alerte revient tout le temps vous avertir du danger et ne vous laisse pas reprendre la main.
Ceci dit, le meilleur moyen, à mon avis, pour tuer un virus est encore de faire un Reset. Mais non je ne divague pas et vous avez bien lu : faire un Reset et c’est cela que j’appelle combattre un virus avec ses propres armes. Je m’étonne même que personne (à ma connaissance) n’ait pensé à ce moyen pourtant évident. Il n’est évidemment pas question du Reset avec les touches Ctrl-A-A mais d’un reset programmé comme suit :
- Interdiction des interruptions. A partir de ce moment un virus tel que le “Lamer Revenge Virus” ne peut plus se régénérer.
- Nettoyage des vecteurs Reset. A ce moment le virus est annihilé en ce qui concerne sa reproduction par le Reset.
- Les interruptions sont interdites. Si on les autorise à nouveau, le virus risque de réapparaître. D’autre part, il n’est pas possible d’interdire les interruptions sur l’Amiga pendant plus de 250 microsecondes sans risquer le plantage. C'est pour cela que le Reset devient nécessaire. Bien sûr celui-ci doit être correctement programmé, c’est-à-dire comme expliqué dans l’article “Faisons Reset Avec Le Sourire” du CR 28. Cette façon de faire assure la reconstitution de toutes les tables de sauts et à ce moment n’importe quel virus est impitoyablement massacré.
Veillez tout de même à ne pas rebooter une disquette infectée...
Un virus peut-il déjouer la sentinelle ? Un virus "normal” ne le peut pas. Toutefois un virus spécialement conçu pour attaquer la sentinelle peut- être embêtant sauf si l’on prend quelques précautions.
- Un virus peut rechercher la sentinelle à travers la liste des tâches et la liste des serveurs d’interruptions dans le but inavouable d’effacer la tâche et le serveur.
Le remède est simple. Trouvez-vous un nom personnel pour ce programme et un nom pour son serveur : un virus ne pourra pius rien trouver car il ne saura pas ce qu’il cherche...
- Un virus peut rechercher la sentinelle à travers une recherche d’octets. Pour déjouer ceci, il suffit de modifier l’ordre de quelques instructions dans le programme ou encore de rajouter quelques instructions parfaitement inutiles pour déjouer la recherche d’octets.
D’AUTRES MECHANCETES ?
??ni
l©G©r
Un virus peut-il interdire les interruptions ? Non car cela provoquerait un plantage. C’est d’ailleurs pour cela que la sentinelle s’installe sur le blanc vertical car un programme tentant d’interdire ce niveau d’interruption se fera immédiatement remarquer.
Un virus peut-il éviter de “rendre la main” au serveur de la sentinelle en omettant de positionner le flag Z ? Non car le serveur de la sentinelle est au niveau de priorité maximum et ne pas lui passer la main équivaudrait pratiquement à interdire le blanc vertical ce qui ne passerait pas vraiment inaperçu...
Un virus peut-il détourner un saut d’interruption à son seul profit ? Non car il devra obligatoirement “sauter” tôt ou tard dans le vecteur légal ce qui va alerter immédiatement la sentinelle...
L’UNION FAIT LA FORCE
La sentinelle, protection idéale contre les virus coquilles n’est toutefois pas un anti-virus. Vous pouvez, si le cœur vous en dit la rendre telle en ajoutant les routines que bon vous semblera au programme. Par exemple, vous pouvez activer le flag DISKREMOVE de la fênetre afin d’être prévenu de l’insertion d’une disquette et de pouvoir aller tester son boot-bldck. Etc.
Toutefois donner libre cours à sa paresse n’est pas vraiment désagréable.
Les VirusX de Steve Tibett étant très bien programmés, je me permets de vous recommander d'en utiliser la dernière version CONJOINTEMENT avec la sentinelle. Ces deux programmes sont tous les deux en état d’attente et leur présence ne se remarque même pas du point de vue du ralentissement de l’ordinateur. Par contre cette combinaison est remarquablement efficace car à ce jour pas un virus n’a pu me faire le moindre dégât et pourtant ce n’est pas faute d’avoir essayé.
RIEN NE DOIT PASSER
C’est pour cela que la sentinelle vous tuera impitoyablement le RAD: que vous auriez décidé d’installer. Vous pouvez très facilement modifier la sentinelle si vous voulez qu’elle ne tue pas le RAD: car celui-ci s’installe toujous à la même adresse. Toutefois vous risquez ainsi de laisser passer un virus qui "imiterait" le RAD:...
MISE EN ŒUVRE DE LA SENTINELLE
C'est un programme assembleur qui pourra être lancé à partir du Workbench à condition d’ajouter : include “misc easystart.i" à la suite des autres instructions include. Néanmoins il est plus intéressant de pouvoir le lancer en tâche de fond à partir d’un CLI et donc dans une startup-sequence. Pour cela vous devrez linker les programmes sentinelle.c, sentinelle-asm et le cback du Lattice C ensemble. Je vous expliquerai prochainement comment lancer un programme assembleur en le décrochant du CLI, mais il y a là matière à un article entier.
C’est tout pour cette année.
F. Mazué
vous souhaite une bonne santé.
* ************************************************************* *
* Programme : Crazy Led *
* Auteur : F. Mazué
* Fonction : Faire clignoter la LED POWER sous interruption *
* ************************************************************* *
include "hardware intbits.i" include "hardware cia.i" include "exec nodes.i" include "exec interrupts.i"
include "exec memory.i" include "exec exec_lib.i" include "intuition intuition.i" include "intuition intuition_lib.i" include "misc easystart.i"
début
moveq 0,d0 lea int_name,al CALLEXEC OpenLibrary
; ouvrir intuition library
¦OK
tst.l dO beq end
move.l dO,_IntuitionBase lea new_window,aO CALLINT OpenWindow tst.l dO beq exit
: ouvrir fenêtre :0K ?
Move.l dO,window move.l IS SIZE,dO
; taille d'une structure ;interrupt ;dans DO
move.1 (MEMF_PUBLIC|MEMF_CLEAR),dl CALLEXEC AllocMem mémoire réservée
tst.l dO * OK ?
Beq exitl
move.l dO,al pointeur sur structure dans Al
move.l dO,serveur
* *******************************************
Initialisation de la structure interrupt
* ******************************************* .
type interrupt priorité non du noeud données interrupt programme interrupt
interruption blanc vertical ajouter serveur
move.b NT_INTERRUPT,LN_TYPE(al) move.b -60,LN_PRI(al) move.l name,LN_NAME(al) move.1 tcompteur,IS_DATA(al) move.1 prog,IS_CODE(al)
move.l INTB_VERTB,dO CALLEXEC AddlntServer
move.l window,aO
pointer sur port User de la fenêtre
move.1 wd_UserPort(aO),aO
clr.l dl
move.b MP_SIGBIT(aO),dl moveq l,dO rol.l dl,dO CALLEXEC Wait
construire le masque du signal attendre signal
move.l serveur,al move’. 1 INTB_VERTB,dO CALLEXEC RemlntServer bclr CIAB_LED,$ bfe001 move.l serveur,al move.l IS_SIZE,dO CALLEXEC FreeMem
enlever serveur assurer allumage Led Power
libérer mémoire
exitl move.l window,aO CALLINT CloseWindow
exit
move.l _IntuitionBase,al CALLEXEC CloseLibrary
end
rts
name
dc. b "coucou",0 even
serveur
dc. l 0
compteur
dc. l 0A
prog cmp.w 25,(al)
beq chang addq 1,(al) moveq 0,d0 rts
n
i?©l©§)©ft®F
chang
move.l 0,(al)
bchg CIAB_LED,$ bfe001
moveq 0,d0
rts
int_name INTNAME even
_IntuitionBase
dc. l 0
new window
dc. w 200
dc. w 0
dc. w 200
dc. w 10
dc. b 0
dc. b 1
dc. l CLOSEWINDOW flags IDCMP
de.1 WINDOWDEPTH|WINDOWCLOSE|WINDOWDRAG
dc. l 0
pas de gadgets
dc. l 0
pas d'images
dc. l titre
dc. l 0
écran courant
dc. l 0
pas de bitmap
dc. w 200
dc. w 10
dc. w 200
dc. w 10
dc. w WBENCHSCREEN
titre
dc. b 'Crazy Led',0
even
window
dc. l 0
* Programme : Sentinelle_asm.s
* Auteur : F.MAZUE pour COMMODORE REVUE *
* Fonction : Surveiller les vecteurs Reset *
* en tâche de fond *
* Lancement : linker avec cback.o du Lattice C
* à l'aide du fichier sentinelle.lnk
* ****************************************************************
include "hardware intbits.i" include "hardware cia.i" include "exec execbase.i" include "exec nodes.i" include "exec interrupts.i" include "exec memory.i" include "exec exec_lib.i" include "intuition intuition.i" include "intuition intuition_lib.i"
XDEF sentinelle
_sentinelle sub.l al,al CALLEXEC FindTask move.l d0,task
recherche adresse de tâche
moveq -l,d0 CALLEXEC AllocSignal
allouer le 1er signal disponible y'en a pas?
Cmp.b 1,dO beq end
move.b dO,signal
moveq 0,d0 lea int name,al
CALLEXEC OpenLibrary
ouvrir intuition library
tst.l dO
OK ?
Beq exit
move.l dO,_IntuitionBase
lea new window,aO
CALLINT OpenWindow
ouvrir fenêtre
tst.l dO
OK ?
Beq exitl
move.l dO,window
move.l IS_SIZE,d0
taille d'une structure interrupt
dans D0
move.1 (MEMFJPUBLIC|MEMF_CLEAR),dl
CALLEXEC AllocMem mémoire réservée
tst.l dO ;OK ?
Beq exit2
move;l d0,al pointeur sur structure dans Al
move.l dO,serveur
* ******************************************
Initialisation de la structure interrupt *
* ******************************************
move.b NT INTERRUPT,LN TYPE (al) type de nœud
move.b 127,LN_PRI(al)
priorité
move.l name,LN NAME(al)
nom du nœud
move.1 data,IS_DATA(al)
données interrupt
move.1 prog,IS_CODE(al)
programme interrupt
move.l INTB VERTB,dO
interruption blanc vertical
CALLEXEC AddlntServer
ajouter serveur
boucle
move.w 0,flag
clr flag
move.l window,aO
move.l wd UserPort(aO),a0
pointer sur port User
de la fenêtre
moveq 0,dl
moveq 0,d3
move.b MP_SIGBIT(aO),dl
N° signal du port User
moveq 1,dO
construire le masque
rol.l dl,d0
du signal de la fenêtre
moveq 1,d2
move.b signal,d3
rol.l d3,d2
or.l d2,d0
ajouter signal tâche
CALLEXEC Wait
attendre signal
tst.w flag
signal vient d'interruption ?
Beq continue
move.l RECOVERY_ALERT, dO
lea text_alert(pc),aO
move.l 55,dl
CALLINT DisplayAlert
beq reset ça boucle,on fait reset avec
le bouton de droite
bra boucle
continue
movê.l serveur,al
move.l INTB_VERTB,dO
CALLEXEC RemlntServer
enlever serveur
move.l servéur,al
move.l IS SIZE,d0
CALLEXEC FreeMem libérer mémoire
exit2
move.l window,aO
CALLINT CloseWindow
exitl
move.l IntuitionBase,al
CALLEXEC CloseLibrary
exit
moveq 0,d0
move.b signal,dO
CALLEXEC FreeSignal
IDQQ DQBD
end
moveq 0,d0
;clean exit
rts
name
dc. b "Sentinelle",0
even
serveur
dc. l 0
window
dc. l 0
data
task
dc. l 0
flag
dc. w 0
signal
dc. b 0
even
prog
cmp.w 1,4 (al)
;flag déjà mis?
Beq no_test
move.l $ 4,a6
tst.l ColdCapture(a6)
tester vecteurs reset
bne envoie signal
tst.l CoolCapture(a6)
bne envoie_signal
tst.l KickTagPtr(a6)
bne envoie signal
tst.l KickMemPtr(a6)
bne envoie_signal
no test
moveq 0,dO
rts
envoie signal
move.w 1,4(al)
;set flag
move.l 0,ColdCapture(a6)
clear vecteur
move.l 0,CoolCapture(a6)
r
move.l 0,KickTagPtr(a6)
r
move.l 0,KickMemPtr(a6)
r
moveq 1,dO
moveq 0,dl
move.b 6(al),dl
rol.l dl,d0
reconstituer masque signal
move.l (al),al
récupérer adresse de tâche
CALLEXEC Signal
envoyer signal pour réveiller
la tâche
moveq 0,dO
rts
reset
CALLEXEC Disable
interruptions interdites
move.l 0,ColdCapture(a6)
move.l 0,CoolCapture(a6)
move.l 0,KickTagPtr(a6)
move.l 0,KickMemPtr(a6)
lea Clean Reset(pc),a5
CALLEXEC Supervisor
Clean_Reset
lea 2,a0
RESET
jmp (aO)
int name INTNAME
even
IntuitionBase
dc. l 0
text_alert
dc. b 1,00,15,'ATTENTION!',0,1
dc. b 0,100,30,'un programme trepelu a voulu '
dc. b "accaparer le reset !!!",0,1
dc. b 0,80,45,'F. Mazué et COMMODORE REVUE '
dc. b 'viennent de vous sauver la vie',0,0
even
new_window
dc. w 200
dc. w 0
dc. w 300
dc. w 10
dc. b 0
dc. b 1
dc. l CLOSEWINDOW ;flags IDCMP de.1 WINDOWDEPTH|WINDOWCLOSE|WINDOWDRAG
dc. l 0 ;pas de gadgets
dc. l 0 ;pas d'images
dc. l titre
dc. l 0 écran courant
dc. l 0 v'pas de bitmap
dc. w 300
dc. w 10
dc. w 300
dc. w 10
dc. w WBENCHSCREEN titre
dc. b 'Sentinelle par F. Mazué',0 even
* ****************************************************************
* Programme : Sentinelle.C
* Fonction : Programme C qui linké avec sentinelle_asm permet *
* de lancer la sentinelle en tâche de fond *
* ****************************************************************
tinclude exec types.h>
include libraries dos.h> tinclude proto dos.h>
LONG _stack = 4000;
char *_procname = "sentinelle";
LONG jpriority;
LONG _BackGroundIO = 1; extern BPTR _Backstdout;
extern VOID sentinelle();
VOID _main()
if (_Backstdout) * pour se décrocher du CLI *

Close (_Backstdout);
_Backstdout=0;
}
sentinelle();
Fichier de linkage Sentinelle, lnk
FROM LIB: cback. O+"sentinelle. O"+"sentinelle_asm.o" TO "sentinelle"
LIB LIB: le. Lib LIB:amiga. Lib
NODEBUG
SMALLCODE
SMALLDATA
F. Mazué
PARIS
nüSci ? R
RUE DU PRÉSIDENT ÉD. HERRIOT
39-41, rue Paul-Chenavard 69001 LYON © 72.00.96.96
Pour tout achat, GVL vous offre 1 heure de stationnement sur présentation du ticket de parking du Quai de la Pecherie ouvert du mardi au samedi de 9 h 45 à 13 h et de 14 h à 19 h
10, boulevard de Strasbourg 75010 PARIS ® 42.06.50.50
ouvert tous les jours sauf dimanche SAV : 54, rue René-Boulanger 75010 PARIS © 42.06.77.78
ouvert du mardi au samedi métro Strasbourg St-Denis - Parking à proximité Magasins ouverts de 9 h 45 à 13 h et de 14 h à 19 h
LE GRAND SPECIALISTE
INFORMATIQUE
LE NOUVEAU GENERALISTE: 6000 A SUR 200 RAGES, DISPONIBLE CHEZ VOTRE MARCHAND DE JOURNAUX. COURREZ VITE L'ACHETER.
LECTEUR 5111 4 AMIGA
ELAN PERFORMER
Logiciel d'animation graphique, présentation graphique et vidéo. Complément idéal de DELUXE PAINT " • 1 I
Réf: 0121
LE CLICHE DE GENERAL | SOURIS AMIGA
2-4 aiguilles 170 CPS 80 Cols
Réf: 2369
Réf: 0365
CONFIGURATION IMAGE DE SYNTHESE
Amiga 2500 + moniteur couleur + carte 68030 + Turbo Silver
Réf : 0751
1 Livré avec 1 manuel dis
guette ,
I en français. |
ES32®
1 Utilitaire de création. 1 Objet terrain + 3D
Réf: 1530
LA MANNESMAN MT81
A UN PRIX PLUS QUE CONCURRENTIEL 155 CPS
9 aiguilles, 80 colonnes
HAUTE PASSEBEl XT Réf: 3017
+ LECTEURS 5" 1 4 + MANUELS + DOS 3.3
PROMO
Réf: 2918
LE GRAND SPECIALISTE i
A
Ml
IGAl
PARIS 10
42. 06.50.50
LYON 1er
72. 00.96.96
GENËRAL
AMIGA 500
FICHE TECHNIQUE
Pour les utilisateurs particuliers, Commodore a lancé l'AMIGA 500 avec lequel il conquiert leur cœur et leur portefeuille.
LA PUISSANCE D'AMIGA : le davier de l'A 500 est incorporé dans le boîtier système. Ses dimensions sont les suivants : 47 cm de large sur 6,35 de haut et 32 cm de profondeur. Un microprocesseur Motorola 68000 alimente le système. C'est ce même microprocesseur qui constitue le cœur des ordinateurs Amiga 1000 et Amiga 2000 utilise également les puces spécialisées Amiga destinées à améliorer les fonctions grapniques et sonores, les fonctions d'animation et l'accès direct à la mémoire (DMA). Notamment, l'A500 utilise la version "FAT" (84 broches) de la puce personnalisée Agnès et un circuit prédiffusé
AVEC MONITEUR 1084
+ EXTENSION MEMOIRE 512 Ko Réf: 0446
CANON BJ 130
Imprimante à bulle d'encre, 240 cps,
132 colonnes Réf: 2914
- Traitement de texte Kind Words
- Page setter (mise en page)
- Infofile - Artists1 choice
- Calefont - Avec moniteur
Réf: 3868
| AMIGA STARTER KIT
Kind Words + Fusion Paint + Crazy Car + Super SKI + Miniature Golf
Réf: 3869
| COMMODORE H PORTABLE 286IT
Le COMMODORE 286 LT est un portable autonome au format note book équipé d'un disque dur et d'un écran VGA pour un poids de 3 kg.
CAMERON HANDY SCANNER "TYPE 6 " AMIGA
W
Filtre électronique pour digitaliseur. Entrées PAL. SECAM et RVB sur prise SCART. Version AMIGA.
Réf: 7168
FICHE TECHNIQUE Microprocesseur 80286 12 Mhz. Mémoire 1 Mo extensible à 5 Mo. Disque dur 20 Mo à 24 Mo. Lecteur 3"l 2, 1,44 Mo. Ecran VGA rétro éclairé. Poids :
3 kg, batterie incluse. Couleur Noir. Livré avec le MS DOS 4
A PA«S. LES
13
yifWKousupebeuba.oooe
parking bonne nouvelle au N° 2, Rue d’Hautevtl ..
à l'angle du boulevard Bonne Nouvell
NOËL A DOMICILE
En Novembre et Décembre, GENERAL livré GRATUITEMENT votre micro-ordinateur à domicile le samedi.
(Uniquement Paris et dans les départements 92,93,94).
F. TTC
ADDIDAS CHAMP FOOT .. 249
AQUAVENTURA ..... 349
ATF 2 ... 249
BARBARIANN 2 ..... 249
BARDSTALE 3 .. 249
BAT ..... 299
BATTLeWe .... 249
BETRAYAL . 299
BLADE WARRIOR .. 249
BILLY THE KID . NC
CENTURION ..... 249
CHALLENGER .. 299
CHAOS STRIKE BACK ..... 249
CHASE HQ 2 ..... 249
CHUCK YEAGERS AFT 2 . 249
DASBOOT . 499
DICK TRAC Y ..... NC
DINOWARS . 199
DRAGONSBREED ... 249
E SWAT ...... NC
ELVIRA 299
EPIC 249
FLIGHT OF THE INTRUDE 299
FULL BLAST ..... 249
GEISHA . 279
GOLDEN AXE ... 249
GRAND PRIX 500 CC 2 ..... 249
GREAT COURTS 2 . 249
HARPOON 299
HEREOS OUEST 2 . NC
KILLING GAME SHOW ..... 249
LES WARRIORS . .. NC
M1 TANK PLATOON ... 249
MIG 29 FULCRUM .. NC
NARC .. 249
NIGHTBREED ARC 249
PICK'N PILE ...... 249
POWERMONGER ... 299
Q 8 249
ROBOCOP 2 ..... 249
SAINT DRAGON .. 249
SIMULACRA ..... 249
SLIDERS 249
SPEEDBALL 2 .. 249
SWIV 249
TEENAGE HERO TURTLES .... 249
THEBLUEMAX ... 499
THETELLER ..... 199
TOKI .. 249
TOM AND THE GHOSTS ... 249
ULTIMA 5 249
UMS2 .. 299
VROOM ...... 249
WOLFPACK ...... 299
WONDERLAND 299
Boîtier Carte réseau ETHERNET pour Amiga 500 livré avec son logiciel d'exploitation, un manuel en franc câble de liaison cheapernet coaxial 50 ohms.
INEWS AMIGA
AMIGANET 500
Réf: 0761
RESEAU AMIGANET

LE GRAND SPECIALISTE]
Mi
II
Gi
A
Vous permettre d'optimiser votre
m
5890 FTTC
Réf: 7026
+ Moniteur couleur + GVP 30 Série 2,
+ AutoBoot
25890 FTTC
Réf: 1566 Réf: 1567 Réf: 1568 Réf: 1569
30690 FTTC
| DISQUE DUR GVP
GVP HC 30
Série 2
3Q690 FTTC
35390 FTTC
RESEAU
ETHERNET
en option
ICAMERON HANDY SÇANWERjnnrP lO
VES-ONE IPRO VIDEO +
90 effets de transition - Nombreux effets italiques, diagonales métal multi-couleur... -16 fontes, nombreuses fontes disponibles en option
Genlock
- Incrustateur - Digitaliser pour A 500 et A 2000
‘tes
Version Amiga
Réf: 0137
Réf: 2952
GENERAL EN FETE
Recevez un bon d'achat de ÎOO F
Tirage au sort toutes les heures d'un numéro de facture pendant les mois de Novembre et Décembre. La liste des numéros gagnants sera affichée tous les soirs chez Général PARIS et LYON ainsi que dans LE PETIT GENERALISTE des mois de Décembre et Janvier.
Tirage pendant les heures d'ouverture du magasin. Les bons d'achat seront valables pendant une durée de deux mois à compter de leur émission et seront remis sur présentation de la facture justificative du numéro tiré au sort.
à
AMIGA 2000 UNE MACHINE CONÇUE POUR EVOLUER :
FICHE TECHNIQUE:
L'Amiga 2000 comporte une mémoire de un mégaoctet, des connecteurs internes, trois unités de disaues internes. Il offre également la possibilité d'éxécuter des tâches au moyen d'un coprocesseur dans les fenêtres Amiga. Amiga 2000 est un ordinateur de Commodore dont la mémoire standard a été augmentée par rapport à celle de l'Amiga 1000 :
Il comporte également des connecteurs internes en vue d'une extension ultérieure et offre la possibilité d'ajouter la compatibilité logiciel IBM PC XT au moyen d'une carte d'extension, la carte A2088. En plus des connecteurs d'extension, propres à Amiga, l'Amiga 2000 comporte un dus IBM PC AT incorporé. Par conséquent, l'Amiga 2000 peut non seulement exécuter les logiciels IBM mais permettre à vos applications IBM B d'avoir accès aux extensions IBM PC, notamment aux cartes 80286 et 80386.
ARCHITECTURE D'EXTENSION : la raison d'être du A2000, c'est la présence de connecteurs sur le fond de panier. Ainsi l'Amiga possède des possibilités d'extension interne. De plus, il offre une méthode unique et astucieuse d'exécution du MS DOS. Le connecteur le plus intéressant du fond de panier, c'est celui de la CPU à 86 broches qui a le même accès non tamponné aux bus de données et d'adresses de l'Amiga que le PC 68000.
+ Moniteur couleur (Al 084)
+ GVP 30 Série 2,
+ Carte XT + Lecteur 5"l 4
Réf: 0757
AMIGANET 2000
I AMIGA 2000
| AMIGA 2000
Réf: 1982
AMIGA 2000 2000 COULEURS
PARIS 10e
42. 06.50.50
LYON 1er
72. 00.96.96
7490 FTTC
| AMIGA 3000
LE MUST
FICHE TECHNIQUE :
Microprocesseur : Motorola 68030 (32 bits) et coprocesseur arthmétique 68881 à 16 Mhz à 25MHz
Mémoire : 1 Mo de mémoire vidéo, extensible à 2 Mo sur la carte mère 1 Mo de mémoire système, extensible à 4 Mo sur la carte mère
Modes graphiques : Palettes de 4096 couleurs, très haute résolution 1280 x 512 Horloge temps réel interne Connecteur d'extension : 4 connecteurs d'extension 32 bits zorro incompatible avec connecteurs A2000) avec 2 connecteurs d'extension PC AT
1 connecteur d'extension vidéo, 1 connecteur bus local 68030,
32 bits, 200 broches, pour mémoire cache et coprocesseurs.
Interfaces : Connecteur 23 broches Amiga vidéo
Connecteur 15 broches
Sortie son stéréo : Connecteur externe SCSI 25 broches
Connecteur interne SCSI 50 broches Connecteur série, parallèle, disque externe
2 connecteurs souris manette de jeux crayon optique
Disque dur 40 Mo
Notre puissance : Une équipe de conseillers techniques de haut niveau vous acueillant dans notre show room.
Nos atouts : Des services vous assurant une sécurité maximum dans un temps minimum, des formations à la hauteur de vos bureaux.
16 Mhz sans écran
16 Mhz écran 14" multisynchro
25 Mhz sans écran
25 Mhz écran 14" multisynchro
IQST 2500
Atari ou Amiga, un seul genlock. Genlock, décodeur, codeur, incrustateur polystandart. Entrées et sorties :
PAL, RVB, Y.C., BETA composantes. Synchronise un ordinateur Atari ou Amiga soit sur une source vidéo de référence PAL, RVB, Y.C., ou composantes, soit sur un générateur interne de Blockburst normalisé. Le GST 2500 est un outil vidéo performant de qualité broadcadt permettant non seulement le codage d'un ordinateur vidéo mais aussi le transfert de standart, exemple : PAL, ou Y.C. en RVB ou composante BETA. Il s'adapte à toutes les régies, PAL,
Y. C., ou BETA.
GENERAL PRO
él. : 42 06 00 66 - Fax 42 38 24 23
Général a décidé une fois de plus de s'imposer comme le leader. Pour cela, Général vient ae mettre à votre disposition, un département qui va enthousiasmer les utilisateurs professionnels.
Notre mission
investissement et de vous donner le meilleur rapport qualité prix.
I_I
I I I
I I I
RÉF.
DÉSIGNATION
Pour toute commande de logiciels, précisez le type de la machine et le format de(s) disquette(s) désiré(es)
QUANTITÉ
PRIX UNITAIRE
MONTANTS
Oui, je désire c
ommander le catalogue "LE NOUVEAU GENERALISTE"
35f
BON DE COMMANDE A RETOURNER A GÉNÉRAL, 10 BD DE STRASBOURG, 75010 PARIS
Avez-vous déjà commandé par correspondance chez GÉNÉRAL depuis le 01.09.90 OUI ? NON ?
Dnte
TOTAL
COMMANDE
1 FORFAIT T de PORT
Observations du client :
Signature
Pour les mineurs, la signature des parents est obligatoire.
L FRAIS ¦ CONTRE-REMBOURS.
TOTAL A RÉGLER
m
PLUS DE 6500 ENTREPRISES ET COLLECTIVITES NOUS ONT DEJA FAIT CONFIANCE : VOUS AUSSI, OUVREZ UN COMPTE CHEZ GENERAL
Si vous ne pouvez vous déplacer ce service est fait pour vous
numéro de téléphone et votre numéro de Carte Bleue. Si vous souhaitez des renseignements ou une documentation supplémentaire, vous pouvez nous poser vos questions et nous vous répondrons dans les délais les plus courts. Vous pouvez aussi vous amuser sur notre serveur grâce aux concours permanents et gagner de nombreux lots.
6) A CREDIT : si vous souhaitez des renseignements détaillés pour l'achat à crédit, vous pouvez joindre Mlle TANIA, Responsable Crédit, au (1) 42 06 50 50, poste 458. Si tout vous paraît dairç vous
1 ’ 1 ----------l_î* jrser une partie comptant.
Rvez nous retourner dûment fions le matériel. Pièces demandées : informatisée.
2°) un financement personnalisé : crédit-bail pour tout matériel d’une valeur supérieure à 10.000 F à condition d’avoir au moins deux exercises d’activité. Ce mode de financement vous permet en outre de récupérer la TVA sur les loyers mensuels.
3°) une formation d’initiation gratuite de votre personnel avec chaque machine vendue (durée 1 2 journée) ;
4°) une formation approfondie, soit dans nos locaux, soit auprès d’instituts spécialisés qui ont notre confiance tel le prestigieux ALTITUDE 21 ;
5°) une assistance téléphonique, sans limitation de temps ;
6°) une maintenance sur site au travers de puissants groupes spécialisés tels AMSTI ou MIS ;
7°) une tarification étudié en fonction des quantités souhaitées et de votre statut d’entreprise.
VENTE EN GROS
Code Postal
Ville
J_L
Rue
5) PAR MINITEL : TAPEZ 3615 code GVF, puis choisissez dans notre catalogue Minitel le ou les articles que vous souhaitez commander. Indiquez-nous votre adresse complète, votre
ATTENTION : pour toute commande supérieure à 10 000 F, joindre un acompte de 20 % à lo commande
4) PAR MANDAT : vous remplissez le bon de commande ci-dessous en précisant aue vous désirez régler par mandat postal ou par mandat-lettre. N'omettez pas de compter le forfait transport (voir ci- dessous). A réception ae votre mandat, nou$ expédions votre commande.
ETUDIANTS
NOTRE TARIF COLLECTIVITE EST AUSSI POUR VOUS
En dehors des prix promotionnels et des actions temporaires GENERAL, vous avez droit à un tarif spécial sur l’ensemble des produits de notre magasin. L’inscnption pour obtenir la CARTE ETUDIANT GENERAL est immédiate et gratuite.
Le mois de sa parution et remplace les précédentes éditions. Produits proposés dans la limite des stocks disponibles. Nos promotions ne sont pas cumulables.
10, bd de Strasbourg 75010 PARIS
SERVICE VPC
6 MODES DE RÈGLEMENT AU CHOIX :
porteur (envoi ae plus ae a Kg ou a une vai
Remplissez le bon ae commande ci-dessous. Si vous ne souhaitez pas mutiler votre revue,photocopie; le ou écrivez-nous sur papier libre ou encore, téléphonez-nous (demander M. BÉRNARD c
(1) 42 06 50 50, postes 436 ou 441).
2) PAR CARTE BLEUE : vous pouvez nous téléphoner et nous commander le matériel désiré, en nous donnant le numéro de votre carte bleue. Vous pouvez également utiliser le bon de commande ci-dessous.
3) PAR CHÈQUE OU CCP : vous remplissez le bon de commande ci-dessous en joignant le règlement du total de votre commande plus le forfait transport correspondant à l'ordre de GÉNÉRAL VIDEO (voir ci-contre).
Are mue immim, _icun, uu *?*. Vu w w, pv»o -»w. .w.
envoyez le bon de commande ci-dessous en précisant si vous souhaitez verser Par retour du courrier, nous vous envoyons un dossier de crédit que vous devez i rempli et signé. Après acceptation de ce dossier, nous vous expédions le matérie pièce d'identité, dernier bulletin de salaire, RIB, quittance ËDF ou de loyer ir
• FORFAIT TRANSPORT : 20 F pour 2 softs, 35 F pour 3 softs et plus.
50 F pour les accessoires et les disquettes vierges.
60 F pour les imprimantes.
120 F pour les machines.
(Dom-Tom et étranger, nous consulter).
Ce forfait n'est pas cumulable, c'est-à-dire que si vous commandez un micro-ordinateur plus des logiciels, vous ne payez que le forfait transport machine, donc 120 F. Tous nos matériels sont expédiés en recommandé.
BON DE COMMANDE EXPRES
Je, soussigné, dédore commander à GÉNÉRAL, les marchandises et fournitures à-après désignées pour expédition à mon adresse indiquée ci-contre.
J• choisis do régler par : ;. I Contre-remboursement
I I Carte Bleue CH Chèque CCP EU Mandat EE Crédit
* N° de Carte Bleue Date expir. CB
NOM
Prénom

Vous aurez droit à des prix professionels, livraison sous 24 heures, règlement sur relevé de tactures.
La vente en gros s’adresse aux entreprises, collectivités, administrations, etc...
Les membres de ces collectivités peuvent se rendre individuellement chez GENERAL, munis d’un justificatif. Il se verront remettre une CARTE COLLECTIVITE qui leur donnera accès aux prix de gros.
Pour toute information, contactez M.N’GOM, M.DELPIT ou Mme LE POULL, tél. 42.06.50.50, télex
214. 034, télécopie 42.38.35.60.
Entreprises, nous sommes en mesure de vous proposer les services suivants pour l’acquisitionde votre matériel chez GENERAL :
1°) ouverture d’un compte, après la première commande ;
CONDITIONS DE VENTE : ce catalogue n'est valable que pour
APPLICATION
TRAVAIL A LA CHAINE
Il est parfois utile, nécessaire ou inévitable dans un programme Assembleur, d’avoir à manipuler des chaînes de caractères. Or, si tout langage dit “évolué” offre un minimum de fonctions pour ce faire, le programmeur machine est obligé de se taper lui-même tout le boulot. D’où la petite bibliothèque de fonctions que voici.
C est sur un plateau d’argent que je vous offre ce mois-ci non pas une, ni deux, ni même trois mais une dizaine de routines destinées à résoudre les problèmes les plus fréquemment rencontrés lorsqu’on doit s’amuser avec les chaînes de caractères. On y retrouve les inévitables recherche de la longueur d’une chaîne, comparaison de deux chaînes et transformations en minuscules et majuscules, mais aussi les moins fréquentes concaténation, inversion ou recherche d’un caractère. Quelques petites précisions cependant, avant de passer à la description de ces fonctions. Il fallait faire un choix quant au format des chaînes que nous allons traiter ; le langage C étant par définition le roi sur Amiga, j’ai adopté son principe : une chaîne est définie comme une suite de caractères dont la fin est marquée par un caractère nul (zéro). L’avantage de la méthode, c’est qu’une chaîne peut avoir n’importe quelle longueur. L’inconvénient, c’est que chaque fois que l’on a besoin de connaître cette longueur, il faut la calculer - ou plutôt, la compter. Pour comparaison, en BCPL, comme en Basic d’ailleurs, une chaîne de caractères contient d’abord une indication sur sa longueur, suivie des caractères qui la compose. Avantage : on connaît tout de suite la longueur ; inconvénient : cette même longueur est limitée à 255 caractères si elle est codée sur 1 octet. Ce qui prouve bien, une fois de plus s’il en était besoin, qu’on ne peut pas avoir le beurre, l’argent du beurre et la fermière en prime...
DES CHAINES QUI NE MANQUENT PAS DE CARACTERE(S)
Mais laissons-là les considérations laitières, et voyons de plus près de quoi il retourne, si j’ose dire. Voici sans plus tarder une brève mais suc- cinte description des routines ci-dessus citées. Les plus attentifs d’entre-vous auront remarqué que non seulement, j’ai piqué au C le format de ses chaînes, mais qu’en plus, j’ai également piqué le nom de ses fonctions. Messieurs Kernigan et Ritchie s’en retourneraient dans leur tombe s’ils étaient morts, bien que je ne sois même pas sûr que ce ne soit pas le cas.
Pour simplifier et uniformiser (argh ! Voilà pourtant un terme que je n’aime guère en ce moment...) les choses, toutes les chaînes sont pointées par aO (et a1 lorsqu’il en faut une seconde) et les fonctions retournent leur valeur de réponse dans dO ou dans rien du tout suivant les cas. Mais quoiqu’il arrive, tous les registres sont préservés, c’est la moindre des choses.
- strlen : retourne dans dO la longueur de la chaîne pointée par aO ;
- strcmp : compare la chaîne pointée par a1 à celle pointée par aO. En retour, dO contient 0 si les chaînes sont identiques, -1 si la première et inférieure à la seconde, et +1 dans le cas contraire ;
- strcpy : copie la chaîne pointée par a1 dans le buffer pointé par aO. Aucune valeur en réponse ;
- strncpy : copie au maximum dO caractères de la chaîne pointée par a1 dans le buffer pointé par aO. La copie s’arrête lorsque la fin de la chaîne est rencontrée ou le maximum atteint (NDLR : après relecture, j’aime cette phrase, on dirait du Micro-Application) ;
- strcat : concatène la chaîne pointée par a1 à celle pointée par aO. Attention à ne pas empiéter n’importe où en mémoire, prévoyez un buffer assez large ;
- strncat : concatène au maximum dO caractère de la chaîne pointée par a1 à celle pointée par aO. Même remarque que précédemment concernant la taille du buffer ;
- strchr : recherche la première apparition du caractère dO dans la chaîne pointée par aO. Retourne dans dO la position de ce caractère ou -1 s’il ne figure pas dans la chaîne ;
- strrexr : inverse la Chaîne pointée par aO. Par exemple, “Max” devient “xaM” ; ’ ; ; -
- toupper : transforme toutes les lettres minuscules de la chaîne pointée par aO en majuscules ;
- tolower : c’est l’inverse ; cette fonction transforme toutes les lettres majuscules de la chaîne pointée par aO en minuscule.
Voilà, y’a de quoi en faire beaucoup d’autres, mais on n’est pas là non plus pour vous mâcher tout le travail. Comme disait si justement Fucius, qui avait oublié de l’être “c’est pas parce que y’en a qui aiment le travail qu’il faut le leur laisser”.
PUB
On nous a demandé de lui faire un maximum de tapage publicitaire, alors en attendant la méga-campagne d’affichage dans toute la rue du Paradis, je ne puis que vous recommander vivement de vous abonner dès maintenant à la nouvelle formule de l’ANT, qui devrait voir le jour début 91 si Saddam Hussein ne décide rien de fâcheux d’ici là. Vous abonner le plut tôt possible, ça vous permet évidemment d’être sûr de ne pas rater un seul numéro, mais ça nous permet aussi de nous faire une idée de la viabilité du projet. De toute façon, vous ne risquez rien, vos chèques ne seront pas débités avant la sortie officielle du premier numéro.
Bon, sur ce, on se retrouve dès le mois prochain pour la suite de mes trépidantes aventures. D’ici là, assemblez peu, mais assemblez bien.
Max
“là où y’a de la chaîne, y’a pas de plaisir”
; gestion de chaînes de caractères ; en assembleur. Fournit 10 fonctions ; du C standard.
; Par Max.
; Note : CE = conditions d'entrée
; CS = conditions de sorties
* ** fonction 1 : strlen **************
* renvoie la longueur de la chaîne *
* *************************************
* CE = aO pointe la chaîne *
* CS = dO contient sa longueur *
* *************************************
strlen move.l a0,-(sp)
moveq -l,d0
.loop addq.l l,d0
tst.b (a0) +
bne.s .loop
move.l (sp)+,a0 rts
* ** fonction 2 : strcmp **************
* compare deux chaînes *
* *************************************
* CE = aO pointe la chaîne 1 *
* al pointe la chaîne 2 *
* CS = dO = 0 si chaîne 1 = chaîne 2 *
* dO > 0 si chaîne 1 > chaîne 2 *
* dO 0 si chaîne i chaîne 2 *
* *************************************
strcmp
movem.l
dl-d2 a0-al,- (sp)
moveq
0,d0
.loop
move.b
(a0)+,dl
beq. S
.eosl
move.b
(al)+,d2
beq. S
• sup.
.comp
cmp.b
d2,dl
beq. S
.loop
bcc.s
.sup
.inf
moveq
-l,d0
bra.s
.ret
w
I
pQQ QGBD
(al)+, (a0) + .ret
dO,.loop2 (sp)+f aO-al
.loop2 move.b beq. S dbra .ret movem.l rts
* ** fonction 7 :
.sup
moveq
l,d0 '
bra. S
.ret -
.eosl
move.b
(al) +,d2
beq. S
.ret
.égal
moveq
-l,d0
.ret
movem.l
(sp)+,dl-d2 a0-al
rts
* copie la, chaîne 2 dans la chaîne 1
* **************************************
* *************
* Recherche la première apparition du*
* catractère c dans la chaîne
* *************************************
* CE = aO pointe la chaîne
* dO contient le car. Recherché *
* CS = dO contient sa position
* ou -1 s'il ne figure
* pas dans la chaîne
* *************************************
strehr .loop
.oui
.non .ret
* ** fonction 3 : strcpy ***************
* CE = aO pointe.la chaîne 1 *
* al pointe la chaîne"2
* CS = aucune *
* **************************************
* Attention : le buffer pointé par aO *
* doit être suffisamment grand pour *
* recevoir la chaîne 2
* ************************************** strcpy movem.l aO-al,-(sp)
(al)+, (a0) +
.loop
(sp)+,aO-al
dl-d2 a0>-(sp)
-l,d2
l,d2
(aO) + dl
.non
dl,dO
.loop
d2,d0
.ret
-l,dO
(sp)+,dl-d2 a0
movem.l
moveq
addq.l
move.b
beq. S
cmp.b
bne.s
move.1
bra.s
moveq
movem.l
rts
move.b
bne.s
movem.l
rts
.loop
* ** fonction 4 : strncpy *************
* Copie au maximum x caractères *
* de . La chaîne 2 dans la chaîne 1
* *************************************
*
* CS = aO pointe la chaîne 1
* al pointe la chaîne 2
* dO contient le nombre max
* caractères à copier
* *
de
* CS = aucune , *
* *************************************
* Attention : le buffer pointé par aO*
* doit être suffisamment grand pour *
* recevoir la chaîne 2 *
* *************************************
strncpy movem.l aO-al,-(sp)
l,dO
subq.l
move.b
beq. S
dbra
movem.l
rts
(al)+, (aÔ) +
loop
.ret
dO,.loop (sp)+,aO-al
.ret
* ** fonction 5 : streat **************
* Concatène la chaîne 2 à la chaîne 1*
* *************************************
* CE = aO pointe la chaîne 1 *
* al pointe la chaîne 2
* CS = aucune *
* *************************************
* Attention : le buffer pointé par aO*
* doit être suffisamment grand pour *
* recevoir les 2 chaînes
* *************************************
streat:
movem.l
a0-al,-(sp)
.loopl
tst.b
(a0) +
bne.s
.loopl
.loop2
move.b
(al)+, (a0) +
bne.s
.loop2
movem.l
(sp)+,a0-al
rts
* ** fonction 8 : strrev **************
* inverse la chaîne
* *************************************
* CE =.a0 pointe la chaîne *
* CS = aucune
* *************************************
strrev movem.l dO-dl aO-al,-(sp)
movea.l aO,al
bsr strlen
adda.l dO,al
lsr.l l,dO
subq.l l,dÔ
.loop move.b (aO),dl
move.b -(al),(aO)+
move.b dl, (al)
dbra dO,.loop
movem.l (sp)+,dO-dl aO-al
rts
* ** fonction 9 : toupper *************
* convertit la chaîne en majuscules *
* *************************************
* CE = aO pointe la- chaîne *
* CS = aucune
* ************************************* toupper movem.l dO aO,-(sp)
(aO)+,dO .ret 'a',dO .loop 'z'+l,dO .loop $ df,dO dO,-l(aO)
move.b
beq. S
empi.w
bcs.s
empi.w
bcc.s
andi.b
move.b
bra.s
movem.l
rts
loop
.loop
(sp)+,dO aO
.ret
* ** fonction 10 : tolower ************
* convertit la chaînes en minuscules *
* *************************************
* CE = aO pointe la chaîne *
* CS = aucune *
* *************************************
tolower
movem.l
d0 a0,-(sp)
.loop
move.b
(a0)+,d0
beq. S
.ret
cmpi.w
'A',dO
bcs.s
.loop
cmpi.w
' Z'+l,d0
bcc.s
.loop
ori.b
$ 20,dO
move.b
d0,-l (aO)
bra.s
.loop
.ret
movem.l
(sp)+,d0 a0
rts
. * *
de * *
*
D
D) f5
i r
i r
APPLICATION
TETRIS 3D
Jérôme ETIENNE, programmeur fou et fidèle lecteur de Commodore Revue nous a envoyé un excellent et sympathique programme de TETRIS 3D pour votre plus grand plaisir. Mais trêve de bavardages, voici sans plus attendre votre cadeau de Noël.
RESERVE 200000
OPENS 1,0,0,319,200,4,0
OPENW 1,0,0,319,200,0.&H800
init_hall
choosejevel
draw_room
prepa_pieces
initialisations
gestion
attend_touche
main_end
PROCEDURE choosejevel RESTORE cmap FOR i%=0 TO 15 READ coulS
SETCOLOR i%,VAL(“&h”+coul$ )
NEXTi% cmap:
DATA
0,fff,0f0,ff0,f0f,aaa,0ff,8f8,f80,08 f,aaa,860,ca6,ffa,753 DEFMOUSE 5
ALERT 0," choisisez le NIVEAU de départ: ",2,” nul I bon I pro ",choix%
SELECT choix%
CASE 1 level=1 CASE 2 level=5 CASE 3 level=9 ENDSELECT timing=700-lever80 RETURN
PROCEDURE draw_room
DIM size(20),room(12,12,27),piece(20,12),x(4),y(4),
current_piece(12),old_piece(12)
ARRAYFILL room(),TRUE FOR z&=5 TO 22 FOR i&=4 TO 8 FOR j&=4 TO 8 room(i&,j&,z&)=0 NEXT j&
NEXT i&
NEXT z&
c=60
a=5
g=1.09
size(0)=8
size=8
COLOR14
FOR y=0 TO PRED(a)
FOR x=0 TO PRED(a)
BOX x*size+(320-size*a) 2-c,y*size+(200- size*a) 2,x*size + size + (320-size*a) 2- c,y*size+size+(200-size*a) 2 NEXT x NEXT y INC cur MUL size,g REPEAT COLOR 14
BOX (320-size*a) 2-c,(200-size*a) 2,a*size+(320- size*a) 2-c,a*size+(200-size*a) 2 size(cur)=size FOR i=0 TO a
LINE i*size(cur)+(320-size(cur)*a) 2-c,(200- size(cur)*a) 2,i*size(cur-1 )+(320-size(cur-1 )*a) 2- c,(200-size(cur-1)*a) 2
LINE i*size(cur) + (320-size(cur)*a) 2- c,a*size(cur)+(200-size(cur)*a) 2,i‘size(cur-1)+(320- size(cur-1)*a) 2-c,a*size(cur-1)+(200-size(cur-
1) *a) 2
LINE (320-size(cur)*a) 2-c,i*size(cur)+(200- size(cur)*a) 2,(320-size(cur- 1 )*a) 2-c,i*size(cur-1 )+(200-size(cur-1 )*a) 2
LINE a*size(cur)+(320-size(cur)*a) 2-c,i*size (cur)+(200-size(cur)*a) 2,a*size(cur-1)+(320- size(cur-1)*a) 2-c,i*size(cur-1)+(200-size(cur- 1 )*a) 2 N EXT i MUL size.g INC cur UNTIL cur=19 RETURN
PROCEDURE prepa_pieces RESTORE piece FOR j=0 TO 16 FOR i=0 TO 11 READ piece(j,i)
NEXT i NEXT j piece:
DATA 0,0,0,0,0,0,0,1,0,1,0,0 DATA 0,0,0,0,-2,0,0,-1,0,1,0,0 DATA 0,0,0,0,-2,0,0,-1,0,-1,0,0 DATA 1,0,0,0,0,0,0,1,0,0,-1,0 DATA-1,0,0,0,0,0,0,0,0,1,0,0 DATA-1,0,0,-1,0,0,0,0,0,0,0,0 DATA 0,0,0,1,0,0,0,1,0,1,1,0 DATA 0,0,0,0,0,0,0,0,0,0,0,0 DATA 0,0,0,-1,0,0,-1,-1,0,0,1,0 DATA 0,0,0,-1,0,0,-2,0,0,1,0,0 DATA 0,0,0,-1,0,0,0,-1,0,0,0,-1 DATA-1,0,0,-1.-1,0,0,1,0,0,2,0 DATA 0,0,0,0,-1,0,-1,-2,0,1,1,0 DATA-1,0,0,0,1,0,1,1,0,2,0,0 DATA-2,-1,0.-1,0,0,0,-1,0,1,0,0 DATA-1,0,0,0,-1,0,1,0,0,0,1,0 DATA-2,1,0,-1,0,0,0,-1,0,1,-2,0 RETURN
PROCEDURE initialisations menu(200,0,315,80) ecrit(“TETRIS 3D”,220,40) ecritfNOTICE: ”,220,90) ecrit(“A-Q= ROTATION X”,200,100) ecrit(“Z-S= ROTATION ¥”,200,110) ecrit(“E-D= ROTATION Z",200,120) ecrit(“JOY= MOVEX Y";200,130) ecrit(“BOUTON= MOVE Z”,200,140) ecrit(“SCORE : ”,205,164) ecrit(“LEVEL : “,205,177) ecrit(“PLANES: ”,205,190)
GET 0,0,195,200,first_room$
GET 0,0,195,200,current_room$
nb_piece=9
z=22
x=6
y=6
pp=RANDOM(9)
FOR i=0 TO 11 current_piece(i)=piece(pp,i)
NEXT i
PUT 0,0,first_room$ atf_new_room
GET 0,0,195,200,current_room$
PUT 0,0,current_room$ aff_piece_v(x-4,y-4,z-4)
RETURN
PROCEDURE gestion DO
1 1 Gestion joystick ***
i ************************
dic=STICK(1)
button=STRIG(1)
INC time .
IF time>timing CLR time button=1 ENDIF IF die inc=TRUE
IF dic=1 ! Up
FOR i=0 TO 3
inc=inc AND room(x+current_piece(i*3),y+cur- rent_piece(i*3+1 )-1 ,z+current_piece(i*3+2))=0 NEXT i ADD y,inc
ELSE IF dic=2 ! Down FOR i=0 TO 3
inc=inc AND room(x+current_piece(i*3),y+cur-
rent_piece(i‘3+1)+1,
z+current_piece(i*3+2))=0
NEXT i
SUB y,inc
ELSE IF dic=4 ! Left
FOR i=0 TO 3
inc=inc AND room(x+current_piece(i*3)-1 ,y+cur- rent_piece(i*3+1),z+current_piece(i*3+2))=0 NEXT i ADD x,inc
ELSE IF dic=8 ! Rigth
FOR i=0 TO 3
inc=inc AND room(x+current_piece(i*3)+1,y+cur-
rent_piece(i*3+1),
z+current_piece(i*3+2))=0
NEXT i
SUB x.inc
ENDIF
PUT 0,0,current_room$ aff_piece_v(x-4,y-4,z-4)
ENDIF IF button CLR stop,time FOR i=0 TO 3 IF
room(x+current_piece(i*3),y+current_piece(i*3+1),
z+current_pieçe(i*3+2)-1)
stop=TRUE
ENDIF •
NEXT i
IF stop AND z 22 FOR i=0 TO 3
room(x+current_piece(i*3),y+current_piece(i*3+1),
z+current_piece(i*3+2))=TRUE
NEXT i
PUT 0,0,first_room$
ADD score,5 aff_new_room
GET 0,0,195,200,current_room$
z=22
x=6
y=6
pp=RANDOM(nb_piece)
FOR i=0 TO 11 current_piece(i)=piece(pp,i)
NEXT i
ELSE IF stop AND z=22
perdu
ELSE
DEC z
ENDIF
PUT 0,0,current_room$
‘ *** Gestion clavier ***
» ***********************
key$ =UPPER$ (INKEY$ )
IF key$ >’’”
IF key$ =CHR$ (27) perdu ENDIF IF ke.y$ =” “
G ET 40,96,150,104,1000$ ecrit(“- PAUSED -”,72,104)
REPEAT
UNTIL INKEY$ =" “ OR STRIG(1)
PUT 40,96,fondS ENDIF
FOR i=0 TO 11 old_piece(i)=current_piece(i)
NEXTi
IF key$ =”E" ! Rotation plan(X,Y)
FOR i=0 TO 3
SWAP current_piece(i*3),current_piece(i*3+1 )
MUL current_piece(i*3+1),-1 NEXTi
ELSE IF key$ =”D"
FOR i=0 TO 3
MUL current_piece(i*3+1),-1
SWAP current_piece(i*3),current_piece(i*3+1)
NEXTi
ELSE IF key$ =”Z” ! Rotation plan(X,Z)
FOR i=0 TO 3
SWAP current_piece(i*3),current_piece(i*3+2)
MUL current_piece(i*3+2),-1 NEXTi
ELSE IF key$ =”S”
FOR i=0 TO 3
MUL current_piece(i*3+2),-1
SWAP current_piece(i*3),current_piece(i*3+2)
NEXTi
ELSE IF key$ =”A” ! Rotation plan(Y,Z)
FOR i=0 TO 3
SWAP current_piece(i*3+1),current_piece(i*3+2)
MUL current_piece(i*3+1),-1
NEXTi
ELSE IF key$ =”Q”
FOR i=0 TO 3
MUL current_piece(i*3+1),-1
SWAP current_piece(i*3+1),current_piece(i*3+2)
NEXTi
ENDIF
FOR i=OTO 3
IF room(x+current_piece(i*3),y+ current_piece(i*3+1),z+current_piece(i*3+2))
FOR i=0 TO 11 current_piece(i)=old_piece(i)
NEXTi
ENDIF
NEXTi
PUT 0,0,current_room$ aff_piece_v(x-4,y-4,z-4)
ENDIF
LOOP
RETURN
PROCEDURE main_end
CLOSEW 1
CLOSES 1
EDIT
RETURN
PROCEDURE aff_piece_v(xx,yy,zz)
FOR i=0 TO 3
boite(xx+current_piece(i*3),yy+current_piece(i*3+1)
zz+current_piece(i*3+2))
NEXTi
RETURN
PROCEDURE aff_piece_p(xx,yy,zz)
FOR i=0 TO 3
pboite(xx+current_piece(i*3),yy+current_piece
(i*3+1),zz+current_piece(i*3+2))
NEXTi
RETURN
PROCEDURE aff_new_room
FOR iz&=1 TO 18
test:
test=TRUE
FOR ix&=0 TO PRED(a)
FOR iy&=0 TO PRED(a)
test=test AND room(ix&+4,iy&+4,iz&+4)
IF room(ix&+4,iy&+4,iz&+4) pboite(ix&,iy&,iz&)
ENDIF NEXT iy&
NEXT ix&
IF test
FOR zz&=iz&+4 TO 21 FOR yy&=4 TO 4+PRED(a)
FOR xx&=4 TO 4+PRED(a) room(xx&,yy&,zz&)=room(xx&,yy&,zz&+1) NEXT xx&
NEXT yy&
NEXT zz& iz&=1
PUT 0,0,first_room$
ADD score, 100 INC planes ADD level.0.3 timing=1000-level*50 IF timing 100 timing=100 ENDIF
IF level>3 AND level 13
nb_piece=6+level
ELSE
nb_piece=9 ENDIF GOTO test ENDIF NEXT iz&
COLOR 0
PBOX 259,157,300,195 ecrit(STR$ (score),260,164) ecrit(STR$ (l NT(level)), 260,177) ecrit(STR$ (planes),260,190)
RETURN
PROCEDURE boite(ax,ay,az)
COLOR 1
size_1 =size(az)
size_2=size(PRED(az))
x11 =ax*size_1 +(320-size_1 *a) 2-c
x12=SUCC(ax)*sizeJ +(320-size_1 *a) 2-c
y11 =ay*size_1 +(200-size_1 *a) 2
y12=SUCC(ay)*size_1 +(200-size_1 *a) 2
x21=ax*size_2+(320-size_2*a) 2-c
x22=SUCC(ax)*size_2+(320-size_2*a) 2-c
y21 =ay*size_2+(200-size_2*a) 2
y22=SUCC(ay)*size_2+(200-size_2*a) 2
BOX x11 ,y11 ,x12,y12
BOX x21,y21,x22,y22
UNE x11,y11,x21,y21
LINE x12,y12,x22,y22
UNE x11,y12,x21,y22
UNE x12,y11,x22,y21
RETURN
PROCEDURE pboite(ax,ay,az)
COLOR 2+az-INT(az 8)*8 size_1=size(az)
x11 =ax*size_1 +(320-size_1 *a) 2-c x12=SUCC(ax)*size_1 +(320-size J *a) 2-c y11 =ay*size_1 +(200-size_1 *a) 2 y12=SUCC(ay)*size_1 +(200-size_1 *a) 2 PBOX x1 T,y11 ,x12,y12 COLOR 0
BOX x11 ,y11 ,x12,y12 RETURN
PROCEDURE menu(x,y,xx,yy)
COLOR 13
PBOX SUCC(x) ,SUCC(y), PRED(xx), PRED(yy)
COLOR 11
BOX x,y,xx,yy
COLOR 12
LINE x,y,xx,y
LINE x,y,x,yy
RETURN
PROCEDURE perdu
ALERT 0,” TU AS PERDU ! I SCORE:"+STR$ (score)+”l ",1"DESOLE”,choose% halljame
ALERT 0," VEUX TU REFAIRE I UN AUTRE PARTIE ?",1,” OUI I NON ",choose%
IF choose%=1
RUN
ELSE
main_end
ENDIF
RETURN
PROCEDURE ecrit(a$ ,x,y)
GRAPHMODE 0 COLOR 11 TEXT x,y,a$
COLOR 12
TEXT PRED(x),PRED(y),a$
GRAPHMODE 1 RETURN
PROCEDURE init_hall hall$ =STRING$ (20+9*40,0)
IF EXIST(“HALL.B_0”)
OPEN 1", 1 ,”HALL.B_0”
BGET 1,V:hall$ ,LEN(hall$ )
CLOSE
ELSE
hall$ =MKI$ (-1)+STRING$ (9,MKI$ (0))
FOR i=1 TO 9
hall$ =hall$ +” “+STR$ (i)+” PERSONNE (LEVEL
0) 0000POINTS"
NEXTi
ENDIF
RETURN
PROCEDURE halljame FOR i=9 DOWNTO 1
EXIT IF score>=DPEEK(V:hall$ +i*2) AND
score DPEEK
(V:hall$ +PRED(i)*2)
NEXTi IF i
PRINT AT(6,12);"ENTRE TON NOM :
FORM INPUT 10,nom$ nom$ =nom$ +"
hàll$ =MID$ (hall$ ,1,21 +PRED(i)*40)+STR$ (i)+"“+ MID$ (nom$ ,1,10)+" (LEVEL “+STR$ (level,2)+”)“+ STR$ (score,4)+" POINTS "+MID$ (hall$ ,21 + PRED(i)*40)
hall$ =MID$ (hall$ ,1,20+9*40) j$ =MID$ (hall$ ,1,20)
j$ =MID$ (j$ , 1 ,i*2)+MKI$ (score)+MID$ (j$ , 1 +i*2) hall$ =MID$ (j$ , 1,20)+MID$ (hall$ ,21 )
IF i 9
FOR j=i TO 9-i
hall$ =MID$ (hall$ ,1,21 +j*40)+STR$ (j+1)+MID$ (hall$ ,23+j*40)
NEXT j ENDIF
OPEN "0,,, 1,"HALLB_0”
BPUT 1,V:hall$ ,LEN(hall$ )
CLOSE
ENDIF
COLOR 0
PBOX 0,0,320,200
menu(0,0,319,49)
menu(1,1,318,48)
ecrit(“THE HALL OF FAME",90,30)
FOR i=0 TO 8 COLOR i+2
TEXT 5,100+i*8,MID$ (hall$ ,21+i*40,40)
NEXTi
RETURN
Jérôme ETIENNE
Hard Cards
40 Mo 84 Mo 100 Mo 200 Mo
4990 Frs 6990 Frs 8100 Frs 10900 Frs
Extensions mémoire ADRAM ICD A500
1 Mo 1500,00 Frs
2 Mo 1950,00 Frs
4 Mo 2699,00 Frs
6 Mo 5299,00 Frs
Hard Cards ICD
0 Mo
1099 Frs
1
2 Mo
1690 Frs
Code: ......
4 Mo
3990 Frs
. Système: .
6 Mo
4990 Frs
¦ Je commande
8 Mo
5990 Frs
¦
40 Mo 84 Mo 100 Mo 200 Mo
3890 Frs 6490 Frs 7590 Frs 9490 Frs
Une gamme exclusive de lecteurs de disquettes!
Le célèbre lecteur PC880
¦ Circuit spécial éliminant le bruit du lecteur au repos
¦ Port E S pour branchement en chaîne
¦ 880 Ko formattés
¦ Livré avec une disquette utilitaire
¦ Garantie 12 mois
570. 00 Frs
NOUVEAU
Double lecteur 3‘ ’ avec alimentation intégré
1200,00 Frs
Extensions Mémoire
Carte A500 avec horloge
La carte d'extension RAM cle Power Computing comprend une horloge sauvegardée par pile.
410. 00 Frs
Carte RAM sans horloge 360,00 Frs
Carte RAM et lecteur PC880 .940,00 Frs
La carte d'expansion 1,5 Mo se fixe aisément dans votre Amiga (Kickstart 1,3 et supérieur) pour vous donner la mémoire dont vous avez besoin
990. 00 Frs
Puces RAM pour les spécialistes de l'upgrade
RAM 1 x 1 Mbit 60 Frs
RAM 256 x 4 60 Frs
Cartes Ram ICD A2000
Nouveau disque dur GVP Série 2 A 500 avec extension mémoire jusqu'à 8 Mo
0 Mo 2 Mo 8 Mo 20 Mo 4990 Frs 6190 Frs 9390 Frs
45 Mo 5990 Frs 7190 Frs 9990 Frs
80 Mo 8490 Frs 9690 Frs 12890 Frs
GVP Série 2 A 2000
¦ Totalement compatible SCSI
¦ Jusqu'à 8 Mo de Fast Ram
¦ Contrôleur rapide "FAASTRAM"
¦ Auto-boot de n'importe quelle partition FFS
¦ Toutes combinaisons disponibles
Power Computing France,
63, rue Victor Hugo; 94701 Maisons Alfort Hot Line Amiga ( 15 h - 18 h): ( 1) 43 78 76 82 Fax: (1)43 78 70 48
Pour commander, il vous suffit de remplir le bon ci-contre, et de l'expédier, accompagné de votre
Modules Ram
2 Mo
1120 Frs
4 Mo
2290 Frs
8 Mo
4250 Frs
Nom: ....Prénom:
Adresse: .
règlement à
Flicker Fixer ICD
2990. 00 Frs
2160. 00 Frs
A500, Al00, A2000 AD Speed 14 Mhz.
Digitaliseur temps réel PPS
Ci-joint un chèque de .....
Frs
à l'ordre de Power Computing France.
De 1 à 4096 couleurs,
Signature:
compatible avec la plupart des logiciels graphiques Nombreuses fonctions de traitement d'images
6000,00 Frs
Ihbgüb bbbp
ImÏÏ
i_r
APPLICATION
DIR-MOI ET LIST-ME SONT DANS UN BATEAU...
Parmi tout le courrier que nous recevons à TANT, plusieurs lettres posent toujours plus ou moins la même question : “comment lire le catalogue entier d’une disquette, comme le fait la commande “DIR ALL” ? Intéressante question, je me remercie de l’avoir posée.
Ce nrest pas tant que le but fixé soit très difficile à atteindre, mais cela demande de connaître un tout petit peu le système, et plus particulièrement F AmigaDOS. Je tiens ici à rappeler que notre célèbre Max avait déjà donné, dans te cadre de sa rubrique ‘assembleur', une routine permettant de lire le catalogue drun répertoire. Le sous-programme GfA que je vous propose ce mois-ci est donc en quelque sorte et comme qui dirait, une extension de la routine de Max. Mais nous allons de plus utiliser les facilités qu'offre le Basic dans le traitement des chaînes de caractères pour éliminer impitoyablement les fichiers ".Info" de notre directory, toujours sources de confusion de l'éléphant. Notez que l'on aurait également pu éliminer les "fastdir", rejetons les outils tels que CLIMate ou DiskMaster, mais bon, si on va par là, on peut carrément éliminer de la liste tous les fichiers, donc ne pas écrire de routine du tout et par là-même, me mettre au chômage technique. Ce qui est loin d'être le but recherché.
LE BON DOS
Avant que de parler strictement GfA-Basic, abordons, si vous le vouiez bien, les quelques fonctions de l'AmigaDOS qui vont nous aider à accomplir notre tâche. Ce que je trouve le plus boulversifiant dans tout cela, c'est qu'elles ne sont qu'au nombre de quatre :
- Lock (pointeur sur le nom, mode_d'accès) permet d'obtenir un "look" sur le répertoire à examiner. En d'autres termes, il s'agit de demander à AmigaDOS la permission de farfouiller dans les entrailles dudit répertoire. Ceci est nécessaire car dans un système multitâche, un autre programme peut accéder également à ce même répertoire pour en changer le contenu ; les "looks" permettent à AmigaDOS de s'y retrouver dans sa petite cuisine et de ne pas communiquer d'informations fausses au demandeur, en l'occurence nous. Le paramètre mode d'accès précise si l'on désire accéder à ce répertoire en lecture (-2) ou en écriture (-1). Un accès en écriture interdit à d'autres tâches d'accéder à ce même répertoire, tant qu'il n'a pas été libéré (voir la fonction UnLockf) ci-dessous). Lockf) renvoie l’adresse d'une structure Lock qui sera nécessaire par la suite, mais dont on n'a pas besoin de connaître le contenu. Reportez-vous aux ‘RKM : includes & autodocs' si la curiosité vous démange par trop.
- UnLock(lock) est la fonction inverse de Lock() : elle signifie à AmigaDOS que l’on en a terminé avec le répertoire que l’on avait précédemment bouclé (en anglais, lock’ signifie à peu de choses près ‘clef’). Le paramètre ‘lock’ est l’adresse de la structure Lock renvoyée par Lock() (NDLR : si vous vous y retrouvez parmi toutes ces loques, chapeau !).
- Examine(lock, fïb) permet de lire le nom du premier fichier - ou répertoire - contenu dans le répertoire en cours d’examen. Encore une fois, le paramètre ‘lock’ est celui renvoyé par Lock(). Quant à ‘fib’, il s'agit de l’adresse d’une structure FilelnfoBlock longue de 260 octets qu’ExamineQ remplira avec tous les renseignements dont nous avons besoin. Il est préférable qu’elle soit entièrement remplie de 0 avant l’appel à Examine)) et indispensable que son adresse soit multiple de 4, pour de vagues raisons de BCPL à la noix. Le meilleur moyen de réunir ces deux conditions est de la créer dynamiquement par un appel à AllocMemO. Il ne faudra alors pas oublier le FreeMemj) correspondant, complémentaire et indispensable à la fois. Examine() retourne en réponse une valeur qui, si elle est nulle, indique une erreur, par exemple si le répertoire à examiner est vide.
- ExNextflock, fib), permet, enfin, au sein d’une boucle, de lire le nom de tous les fichiers suivants dans le répertoire. Le paramètre ‘lock’ est toujours le même, ainsi que ‘fib’ - qui ne doit bien entendu pas être réinitialisée entre temps. De même qu’Examine(), ExNextO renvoie une valeur nulle en cas d’erreur.
Voyons maintenant de plus près le contenu de la structure FilelnfoBlock, dans laquelle nous allons piocher les informations qui nous seront utiles :
Structure FilelnfoBlock
(‘fib’ pour les intimes, Max pour les autres).
Longueur : 260 octets.
Offset Nom Signification
0 DiskKey, Numéro de la disquette
4 DirEntryType 0 si fichier, >0 si répertoire
8 FileName 108 octets pour le nom (30 utilisés)
116 Protection Attributs (voir la commande Protect)
120 EntryType Ben... Fieu.. Je sais pas...
124 Size Taille du fichier
128 NumBlocks Nombre de blocs occupés
132 Days Date de création
136 Minutes Fleure de création (minutes)
140 Ticks Fleure de création (secondes)
144 Comment 80 octets pour le commentaire
224 Reserved 36 octets réservés au DOS
Lorsque l’on sait tout cela, l’écriture d'une routine de lecture du répertoire entier d’une disquette devient chose simple. La preuve.
OU L’ON RECURSIVE A SOUHAIT
Or donc, la routine présentée ici l’est sous forme de fonction retournant un paramètre : le nombre de fichiers répertoriés (tiroirs compris). Ce sera peut-être gadget pour certains, mais utiles à d’autres. Néanmoins, la transformation en procédure standard est des plus faciles.
Le principe retenu est celui de la récursivité. Il s'agit de l’une des facilités du GfA-Basic les moins souvent employées, alors qu’elle peut faire des merveilles. Je ne vous ferai pas l’affront de vous rappeler qu’une procédure ou une fonction est récursive lorsqu’elle peut s’appeler elle- même sans perdre le contenu de ses variables. Pour schématiser le fonctionnement, on appelle une première fois la fonction ‘lit_dir’, qui commence à lire le catalogue du répertoire dont le nom a été passé en paramètre. Si l’entrée lue est un fichier, on affiche son nom, sinon, si c’est un répertoire, on appelle récursivement la fonction ‘lit_dir’ avec pour paramètre le nom de ce répertoire, qui sera à son tour examiné jusqu’au plus profond de ses entrailles, etc. Une fois toutes les entrées de ce sous-répertoire traitées, on remonte d’un niveau dans la récursivité et on continue jusqu’à ce que toute la disquette ait été examinée. Vous avez le droit de relire plusieurs fois ce paragraphe si vous n’avez pas tout bien compris (NDLR : merci !).
Certains se demanderont sûrement ce à quoi peut bien servir la variable ‘prof&’ initialisée à 1 en début de programme : tout simplement à comptabiliser le niveau de récurvisité de manière à indenter joliment la sortie à l’écran, c’est tout. C’est pas parce qu’on est fainéant qu’il ne faut pas faire les choses proprement.
EXTENSIONS POSSIBLES
Il est évidemment possible d’améliorer cette routine de moult manières, par exemple en y ajoutant un tri des noms de fichiers, comme le fait la commande Dir du CLI, ou bien en sortant également les attributs des fichiers, leur commentaire, etc. C’est à vous de voir. Il est même pos-
sible de la modifier pour en faire une fonction de recherche d’un fichier sur la disquette ou un effaceur de ‘.BAK’ global... Ce ne sont pas les idées qui manquent.
ANT : PLUS VITE, PLUS HAUT, PLUS FORT
Amiga 500 1000 Disques durs de Quantum,
750 Ko sec, 19 ms, silencieux, auto-boot.
42 Mo 4999 F
84 Mo 6599 F
Amiga 2000 SCSI, 17 ms,
750 Ko sec, 52 Mo 4599 F auto-boot. 105 Mo 6599 F
Lecteur amovible Lecteurs externes Syquest44 Mo, SCSI, complets,5"1 4avec 20 ms, 470 Ko sec, 40 80 commutation médium inclus6699F 5"1 4 659 F
Médium 799F 3"1 2 5 99 F
Pour terminer, un peu de pub : vous n’êtes pas sans savoir que l’Amiga NewsTech, notre cher ANT, est en passe de devenir indépendant de Commodore Revue, pour ne plus être vendu que par abonnement. C’est une formule à laquelle nous croyons dur comme fer et qui vous offrira évidemment pas mal d’avantages : plus de pages pratiques dans Commodore Revue, plus de pages pour nous (merci Monsieur Le Directeur), donc plus d’articles, plus d’informations, plus de plus, plus de tout. Mais pour que cela marche, nous comptons sur vous ; alors abonnez-vous, abonnez votre frère, votre soeur, votre grand-mère et votre chien... Pour que l’ANT devienne LE magazine des programmeurs sur Amiga, faites-vous ce petit plaisir pour Noël, il en restera toujours quelque chose...
Stéphane Schreiber
' Lecture du catalogue complet d'une disquette ’ en GfA-Basic. Evite les ".info".
’ Syntaxe :
1 nombre_de_fichiers=@lit_dir (Répertoire$ )

prof&=l ! Niveau de profondeur
PRINT @lit_dir("Devpac:");" fichiers."! Lecture du répertoire END
FUNCTION lit_dir (nom$ )
LOCAL nom*,lockl,fib?s,ok*,nbt,n$ ! Variables locales
’ ! Because récursivité
Extension de mémoire A500 512 Ko 429 F
512 Ko équipé, extensible 2 Mo 1329 F
A2000 2Mo équipé extensible 8 Mo 1999 F équipé 2999 F
nb%=0
n$ =nom$ +CHR$ (0)
nom*=V:n$
*
lock*=Lock(nom%,-2) ! Lock sur le répertoire
IF lock%
fib%=AllocMem(260 &H10001) ! 260 octets public+clear
IF fib%
ok!=Examine(lock%,fib%) ! Examine
DO
ok*=ExNext(lockl,fib%) ! Suivant
EXIT IF okl=0 ! Fin si dernier
INC nbl
n$ =CHAR fib%+8} ! Récupère son nom
IF LONG fibH4}>0 ! Réperoire ou fichier ?
PRINT SPACE$ (prof&) ;n$ ;" (dir)"
INC profs
IF RIGHT$ (nom$ )=":"
ADD nb%,@lit_dir(non$ +n$ )
ELSE
ADD nbMlit_dir(nom$ +" "+n$ )
ENDIF
ELSE IF RIGHT$ (n$ ,5)o".info" ! Tout sauf les ".info" PRINT SPACE$ (prof&*3);n$
ENDIF
LOOP
~FreeMem(fib% 260) ! Libère la mémoire ENDIF
Découvrez et comparez nos produits. Profitez de nos offres.
~UnLock(lock%) ! Libère le lock ENDIF DEC prof&
RETURN nbl ! C'est tout !
ENDFUNC
Tel.: 87.88.40.44
Rue Paul Henri Spaak, 57350 Stiring Wendel. Ouvert du lundi au vendredi de 9h à 18h. Règlement contre-remboursement par les P.T.T.
lOlogy PrixTTC
nformatiqcie
S. fl.R.L.
IDQD DQGQ
i r
APPLICATION
LE 3D SE CACHE (Partie
Pour ce mois-ci je vous propose le programme d’application en C de l’étude algorithmique effectuée dans le numéro 27 de Commodore Revue sur l’élimination des faces cachées. Ce programme reprend en grande partie les fonctionnalités du programme d’animation en filaire en y intégrant la gestion des faces cachées.
ERRATUM
Avant toute chose, il y avait une erreur dans l’article du Numéro 27 et plus particulièrement lors du calcul du plan associé à chaque face de l’objet, le coefficient h est faux . On remplacera donc avantageusement la formule proposée par :
h = a*XA + b*YA + c*ZA (et en plus c’est plus court !).
LE PROGRAMME
Peu de chose à dire au sujet du programme, si ce n’est que les performances d’un tel algorithme se dégradent rapidement avec l’augmentation du nombre de faces (facteur N*N ou N représente le nombre de faces). Je vous conseille donc de vous limiter à des objets ayant moins de 25 faces si vous voulez obtenir quelque chose de correct au niveau animation.
D’autre part le programme ne gérant pas le clipping, positionnez toujours votre observateur assez loin de l’objet. Faites également attention à la manière dont vous décrivez les faces (toujours dans le sens trigono- métrique lorsqu’on les regarde), sinon elles seront invisibles. Voilà j’ai terminé pour les recommandations d’usage. Voici maintenant un exemple d’objet que vous pouvez utiliser avec le programme, il s’agit d’un tétraèdre.
Le fichier “point” :
4
0 0 20 20 0 0 0-20 0 000
Le fichier “ligne” :
6
01
02
03 1 2 23
31
Le fichier “face” :
4 02 1
032 301 1 23
MODIFICATION DU GENERATEUR DE TORE
Le mois dernier je vous avais proposé un programme permettant de générer un tore. La modification que je vous propose va lui permettre de générer également le fichier de face pour le programme d’élimination
des parties cachées. Pour ce faire il vous suffira d’ajouter ce bout de programme à la fin de tore.c. simple non !
R OUVERTURE DU FICHIER DE FACES 7
if(!(fp = fopen(“tface.datYw"))) exitO;
fprintf(fp,”%d n”,n*n*2); t NOMBRE DE FACES DE L'OBJET 7
for(j=0;j n;j++) for(i = 0;i n;i++)
fprintf(fp,”%d %d %d nTi*n+j,(i+1)%n*n+j,(i+1)%n*n+(j+1)%n); fprintf(fp,”%d %d %d n”,i*n+(j+1)%n,i*n+j,(i+1)%n*n+(j+1)%n);
}
fclose(fp);
Je vous laisse maintenant avec le listing du programme et je vous retrouve le mois prochain pour de nouvelles aventures.
Herr Doktor Von Truc
Programme d'animation d'objets avec faces cachées
tinclude stdio.h> tinclude math.h> tinclude exec types.h> tinclude graphics gfx.h> tinclude graphics rastport.h> tinclude graphics copper.h> tinclude graphics view.h> tinclude graphics gels.h> tinclude graphies régions.h> tinclude graphics clip.h> tinclude exec exec.h> tinclude graphics text.h> tinclude graphics gfxbase.h> tinclude hardware dmabits.h> tinclude hardware custom.h> tinclude hardware blit.h> tinclude devices keymap.h>
tdefine CARRE(x) ((x) * (x))
tdefine DB1 0 tdefine DB2 1 tdefine PLAN 1 tdefine COLOR 2 tdefine HORIZONT 640 tdefine VERT 512 tdefine MODE HIRES|LACE UWORD dbuff[2] = DB1,DB2};
int bascule; int i;
struct View view; struct ViewPort viewport;
struct Raslnfo rasinfo[2];
struct BitMap bitmap[2]; struct RastPort rastport[2];
struct GfxBase *GfxBase; struct View *ecran_sauvegarde;
ÜWORD colortable[COLOR] = 0x000,0x77F }; char *bouton_gauche = (char *) OxbfeOOl; double sinus[360],cosinus[360]; double r;
struct cprlist *LOF[2]; struct cprlist *SHF[2];
void init(),ouvrecran(),chargepoint(),chargeligne(),libéré(), cree_ecran();
void init_table(),éliminé(),trace(),chargeface(),échangé();
double point3D[100][3]; double sommet[100][3]; int ligne[100] [2]; struct int A,B,C;
double a,b,c,h;
} face[100];
int nbrpoint,nbrligne,nbrface ,nbrligneE;
double peps = le-5, meps = -le-5, unmeps = l-le-5, unpeps = l+le-5; int alpha = 0 ,teta = 0; int va,vt;
char nomligne[100],nompoint[100] ,nomface[100] ;
* -
* Programme principal * -
void main()
init () ;
printf("nom du fichier de point : ");
scanf("%s",nompoint);
printf("nom du fichier de ligne : ");
scanf("%s",nomligne);
printf("nom du fichier de face : ");
scanf("%s",nomface);
printf("valeur de la vitesse V(alpha): "); scanf("%d",&va);
printf("valeur de la vitesse V(teta) : ");
scanf("%d",&vt);
printf("distance r :");
scanf("%lf",&r);
chargepoint ( );
chargeligne();
chargeface();
init_table() ;
ouvrecran();
SetAPen(Srastport[dbuff[DB1]], 1) ;
SetAPen(Srastport[dbuff[DB2]3,1); bascule = 0;
while(!((*bouton_gauche & 0x40)-64))
SetRast(& rastport[dbuff[! Bascule]],0);
alpha += va; if (alpha >= 360)
alpha -= 360;
teta += vt; if(teta >= 360)
teta -= 360;
cree_ecran(&view,bascule); éliminé () ; bascule A= 1;
LoadView(ecran_sauvegarde); libéré () ;

V
* Init() Ouvre la bibliothèque et *
* sauvegarde l'ancien écran *
* *
void init ()

if((GfxBase = (struct GfxBase *)
OpenLibrary("graphies.library", 0) ). == NULL) exit(l);
écran sauvegarde = GfxBase->ActiView;
*
7
* chargepoints() charge la table des points sur disque *
* *
void chargepoint()

FILE *fich, *fopen () ;
fich = fopen(nompoint,"r"); if(fich == NULL)
printf("Problème d'ouverture du fichier Point.dat n"); exit(FALSE);
}
else
fscanf(fich,"%d",Snbrpoint);
printf("Chargement de la structure POINT en cours..An");
for (i = 0; i nbrpoint;i++)
fscanf(fich,"%lf %lf %lf",&point3D[i][0],
&point3D[i][1],
&point3D[i][2]);
}
fclose(fich);
7
* chargeligne() charge les lignes sur le disque*
* *
void chargeligne()

FILE *fich, *fopen() ; int origine,extreme;
fich = fopen (nomligne, "r") ; if(fich == NULL)
printf("Problème d'ouverture du fichier ligne.dat n"); exit(FALSE);
}
else
fscanf (fich,"%d",Snbrligne);
printf("Chargement de la structure LIGNE en cours... n")
for (i = 0; i nbrligne;i++)
fscanf(fich,"%d %d",&origine,Sextreme); ligne[i][0] = origine; ligne[i][1] = extreme;
}
}
fclose(fich);
void chargefaceO
FILE *fich,*fopen(); int i;
int A, B, C;
fich = fopen(nomface,"r"); if(fich == NULL)
printf("Problème d'ouverture du fichier Face.dat n") ; exit(FALSE);
}
else
fscanf(fich,"%d",Snbrface);
printf ("Chargement de la structure FACE en
cours... n");
printf("nbrface = %d n",nbrface); for (i = 0; i nbrface ; i++)
fscanf(fich,"!d %d Id",&A,&B,&C);
face[i].A = A; face[i].B = B; face[i].C = C;
}
}
fclose(fich);
for ( i=0;i 2;i++)
InitRastPort(Srastport[i]); rastport[i].BitMap = &bitmap[i];
}
MakeVPort(Sview,Sviewport);
MrgCop(Sview);
LOF[DBl] = view.LOFCprList;
SHF [DB1] = view.SHFCprList;
viewport.Raslnfo = &rasinfo[DB2]; rasinfo[DB2].Next = &rasinfo[DBl];
view.LOFCprList = NULL; view.SHFCprList = NULL;
MakeVPort(Sview,&viewport);
MrgCop(&view);
LOF[DB2] = view.LOFCprList;
SHF[DB2j = view.SHFCprList;
* *
* ouvrecranO initialise le double buffer et ouvre un écran* * *
void ouvrecranO
InitView (Sview) ;
InitVPort (Sviewport) ; view.ViewPort = Sviewport;
view.Modes = MODE;
InitBitMap(&bitmap[DBl],PLAN,HORIZONT,VERT); InitBitMap(&bitmap[DB2],PLAN,HORIZONT,VERT);
for (i=0 ; i 2 ; i++)
rasinfo[i].BitMap = &bitmap[i]; rasinfo[i].RxOffset = 0; rasinfo[i].RyOffset = 0; rasinfo[i].Next = NULL;
viewport.DxOffset = 0; viewport.DyOffset = 0; viewport.DWidth = HORIZONT; viewport.DHeight = VERT; viewport.Raslnfo = &rasinfo[DBl]; viewport.Modes = MODE; viewport.Next = NULL;
viewport.ColorMap = (struct ColorMap *)GetColorMap(COLOR); LoadRGB4(&viewport,Scolortable[0],COLOR);
for ( i=0;i PLAN;i++)
if ((bitmap[DB1].Planes[i] = (PLANEPTR)AllocRaster(HORIZONT, VERT)) == NULL) exit(2);
BltClear ((UBYTE *)bitmap[DBl].Planes[i],RASSIZE(HORIZONT, VERT) , 0) ;
}
for ( i=0;i PLAN;i++)
if ((bitmap[DB2].Planes[i] = (PLANEPTR)AllocRaster(HORIZONT, VERT)) = NULL) exit (3);
BltClear((UBYTE *)bitmap[DB2].Planes[i],RASSIZE(HORIZONT, VERT),0);
}
* *
*libere() libéré la mémoire utilisée*
* : *
void libéré ()

for(i = 0;i PLAN;i++)
FreeRaster(bitmap[DB1].Planes[i], HORIZONT,VERT);
for(i = 0;i PLAN;i++)
FreeRaster(bitmap[DB2].Planes[i],HORIZONT,VERT);
FreeColorMap(viewport.ColorMap);
FreeVPortCopLists(&viewport);
FreeCprList(LOF[DB1]);
FreeCprList(SHF[DB1]);
FreeCprList(LOF[DB2]);
FreeCprList(SHF[DB2]);
CloseLibrary(GfxBase);
*--*
* cree_ecran() affiche l'écran *
*--*
void cree_ecran(view,bascule) struct View *view; int bascule;

view->LOFCprList = LOF[bascule]; view->SHFCprList = SHF[bascule]; LoadView(view);
WaitTOF();
}
* *
* init_table initialise la table des sinus et cosinus* * *
void init_table()

double rad;
rad =(double)(2.*PI 360.); for (i=0 i 360;i++)

sinus[i] = sin((rad*(double)i));
cosinus[i] = cos((rad*(double)i));
1
* *
* Elimination des parties cachées et traçage*
* *
void éliminé ()

double vl1,vl2,vl3,v21,v22,v2 3, v32, v33 ; double unit;
* Coefficients de la matrice de transformation perspective *
vil = -sinus[alpha];
vl2 = -cosinus[teta]*cosinus[alpha];
vl3 = -sinus[teta]*cosinus[alpha];
v21 = cosinus[alpha];
v22 = -cosinus[teta]*sinus[teta];
v23 = -sinus[teta]*sinus[alpha];
v32 = sinus[teta];
v33 = -cosinus[teta];
* Passage des points dans le repère observateur *
for(i=0; i nbrpoint; i++)
sommet[i][0]=vll*point3D[i][0]+v21*point3D[i][1];
sommet [i][l]=vl2*point3D[i][0]+v22*point3D[i][l]+v32*point3D[i][2
sommet[i][2]=vl3*point3D[i][0]+v23*point3D[i][l]+v33*point3D[i][2 ]+r;
. }
* Initialisation des coefficients des faces *
for(i=0; icnbrface; i++)
face[i].a= sommet[face[i].A][1]*(sommet[face[i].B][2] - sommet [face[i] .C] [2] )
- sommet [face[i] .B] [1] * (sommet [face[i] .A] [2] -
sommet[face[i].C] [2] )
+sommet[face[i].C][1]*(sommet[face[i].A][2] - sommet [face[i] .B] [2] ) ;
face[i].b= -(sommet[face[i].A][0]*(sommet[face[i].B][2] - sommet[face[i] .C] [2] )
- sommet [face[i] .B] [0] * (sommet [face [i] .A] [2] - sommet [face [i] .C] [2] )
+ sommet[face[i].C][0]*(sommet[face[i].A][2] - sommet [face [i] .B] [2] ) ) ;
face[i].c= sommet[face[i].A][0]*(sommet[face[i].B][1] - sommet [face [i] .C] [1] )
- sommet [face[i] .B] [0] * (sommet [face[i] .A] [1] -
sommet [face[i] .C] [1] )
+sommet[face[i].C][0]*(sommet[face[i].A][1] - sommet [face [i] .B] [1] ) ;
face[i].h = face[i].a*sommet[face[i].A][0]+ face[i].b*sommet[face[i].A][1]+ face[i].c*sommet[face[i].A][2];
unit=sqrt(CARRE(face[i].a) + CARRE(face[i].b) +
CARRE(face[i].c));
face[i].a = unit; face[i].b = unit; face[i].c = unit; face[i].h = unit;
}
* Elimination et traçage du segment PQ *
for(i=0; i nbrligne; i++)
int 11= ligne[i][0],12 = ligne[i] [1]; trace(0,sommet[11][0],sommet[11][1],sommet[11][2], sommet [12] [0], sommet [12] [1], sommet [12] [2] ) ;
}
}
• *
* Traçage d'un segment après test de visibilité*
* *
void trace(jj,xP,yP,zP,xQ,yQ,zQ) double xP,yP,zP,xQ,yQ,zQ; int jj;

int j = jj, traceln =1,A,B,C,i,Pb,Qb,dehors,Pdehors,Qdehors, eA,eB,eC,somme;
int xel,yel,xe2,ye2;
double Cpos,Ppos,Qpos,epsl;
double a,b,c,h,hP,hQ,rl,r2,r3,xA,yA,zA,xB,yB,zB,xC,yC,zC, dA,dB,dC,MIN,MAX;
double lambda,mu,xmin,ymin, zmin, xmax,ymax, zmax, Cl,C2,C3,
Kl,K2,K3,denoml,denom2;
* Pour toutes les faces *
while(j nbrface)
a = face[j].a; * Coefficients du plan associé à la face * b = face[j].b; c = face[j].c; h = face[j].h;
epsl = peps + (peps*h); * Calcul de l'erreur relative *
if (h = 0) * si h = 0 la face passe par
l'observateur E et ne cache rien *
j++; * si h 0 la face est une face arriè
re et ne cache rien * continue;

* test 1*
hP = a*xP + b*yP + c*zP; hQ = a*xQ + b*yQ + c*zQ;
if((hP = (h+epsl)) && (hQ = (h+epsl))) j++;
continue;
} * PQ n'est pas derrière ABC *
* test 2*
Kl = yP*zQ - yQ*zP;
K2 = zP*xQ - zQ*xP;
K3 = xP*yQ - xQ*yP;
A = face[j].A;
B = face[j].B;
C = face[j].C;
xA = sommet[A][0]; yA = sommet[A][1]; zA = sommet[A][2];
xB = sommet[B][0]; yB = sommet[B][1]; zB = sommet[B][2];
} ‘ ' '
xC = sommet [C] [0] ; yC = sommet [C] [1] ; zC = sommet [C] [2]
if (dehors)
j++;
dA = Kl*xA + K2*yA + K3*zA;
continue;
dB = Kl*xB + K2*yB + K3*zB; dC = Kl*xC + K2*yC + K3*zC;
* si dA,dB,dC sont de même signe les points A,B,C sont du même
}
* test4 *
coté que EPQ *
if (!(Pdehors || Qdehors))
traceln = 0; * PQ est invisible *
eA = (dA > peps) ? 1 : (dA meps) ? -1 : 0;
break;
eB = (dB > peps) ? 1 : (dB meps) ? -1 : 0; eC = (dC > peps) ? 1 : (dC meps) ? -1 : 0;
somme = eA+eB+eC;
}
* test5 * rl = xQ - xP;
if(abs(somme) >= 2)
r2 = yQ - yP;
j++;
r3 = zQ - zP;
continue;
' 1
}
xmin = xP + MIN*rl; ymin = yP + MIN*r2;
* Si ce test est un succès alors la ligne infinie PQ est extérieure à la pyramide EABC *
zmin = zP + MIN*r3;
* dans le cas contraire il y a intersection *
if ((a*xmin + b*ymin + c*zmin) (h-epsl)) j++;
* test 3 *
continue;
}
xmax = xP + MAX*rl;
Pdehors = Qdehors = 0;
MIN = 1;
ymax = yP + MAX*r2;
MAX = 0;
zmax = zP + MAX*r3;
for(i=0; i 3; i++)
if ((a*xmax + b*ymax + c*zmax) (h-epsl))
Cl = yA * zB - yB * zA;
j++;
C2 = zA * xB - zB * xA; * Cl*x + C2*y + C3*z = 0 est
continue;
le plan EAB *
C3 = xA * yB - xB * yA;
}
* si ce test est un succès il existe un point d'intersection
Cpos = Cl*xC + C2*yC + C3*zC;
entre PQ et ABC *
Ppos = Cl*xP + C2*yP + C3*zP;
* test6 *
Qpos = Cl*xQ + C2*yQ + C3*zQ; denoml = Qpos-Ppos;
if (Pdehors || (hP (h-epsl)))
trace(j+l,xP, yP, zP, xmin, ymin, zmin);
if (Qdehors || (hQ (h-epsl)))
if (Cpos>peps)
Pb = (Ppos meps);
trace(j+l,xQ, yQ, zQ, xmax, ymax, zmax);
Qb = (Qpos meps);
traceln = 0;
dehors = (Pb && (Qpos = peps)) || (Qb && (Ppos = peps));
1
break;
»

else

if (traceln)
if (Cpos meps)
xel = (int) (320 + (xP zP)*100);
Pb = (Ppos > peps);
yel = (int)(256 + (yP zP)*100); * Calcul des coordon
Qb = (Qpos > peps);
nées écran *
dehors = (Pb && (Qpos >= meps)) ||
xe2 = (int)(320 + (xQ zQ)*100);
(Qb && (Ppos >= meps));
}
else dehors = 1;
ye2 = (int)(256 + (yQ zQ)*100);
* Attention il n'y a pas de test de débordement *
if (dehors) break;
Move(Srastport[dbuff[! Bascule]],xel,yel); Draw(&rastport[dbuff[îbascule]],xe2,ye2);
lambda = (abs(denoml) = peps) ? I.e7 : -Ppos denoml; Pdehors |= Pb;
}
}
Qdehors |= Qb;
void échangé(a,b,c)
denom2 = dB - dA;
double *a,*b,*c;
mu = (abs(denom2) = peps) ? I.e7 : -dA denom2;

double aux = *a;
if ((mu >= meps) && (mu = unpeps) &&
* a = *b;
(lambda >= meps) && (lambda = unpeps)) (
* b = *c;
if (lambda MIN) MIN = lambda;
* c = aux;
if (lambda > MAX) MAX = lambda;
}
échangé(&xA, &xB, &xC); échangé(&yA, &yB, &yC); échangé(&zA, &zB, &zC); échangé(&dA, &dB, &dC) ;
}
L'ESSENTIEL DL
115,00 F
120. 00 F
149. 00 F
65. 00 F
45. 00 F
15. 00 F
65. 00 F
45. 00 F
15. 00 F
39. 00 F
30. 00 F
70. 00 F
50. 00 F
50. 00 F
3,00 F 8,70 F 1,85 F 4,40 F
2,90 F 8,50 F 1,80 F 4,20 F
50. 00 F
64. 00 F
110. 00 F
2,80 F 8,30 F 1,75 F 3,90 F
garanties 100 % sans erreur, livrées avec étiquettes, stickers et pochettes.
Prix unitaire TTC, TVA 18,6 % incluse
Par quantité de 10
Disquette 3" 1 2 720 ko Disquette 3" 1 2 1.44 mo Disquette 5" 1 4 360 ko Disquette 5" 1 4 1.2 mo
Par quantité de 100
Disquette 3" 1 2 720 ko Disquette 3” 1 2 1.44 mo Disquettes" 1 4 360 ko Disquette 5" 1 4 1.2 mo
Par quantité de 600
Disquette 3" 1 2 720 ko Disquette 3" 1 2 1.44 mo Disquette 5” 1 4 360 ko Disquette 5" 1 4 1.2 mo
BOITE DE 101 JEUX pour AMSTRAD PC IBM PC AT et COMPATIBLES
595F ne
Tapis pour souris Tapis fluo pour souris (couleurs variées)
200 étiquettes pour 5" 1 4 (couleurs variées)
100 étiquettes pour 3" 1 2 (couleurs variées)
Manette ACE (atari, amiga, amstrad) Manette 2 boutons (atari, commodore) Speedking (atari, amiga)
BOITES DE RANGEMENT
BOITES DE RANGEMENT
DIVERS CONSOMMABLES
5" 1 4 par 100 5" 1 4 par 50 5" 1 4 par 10 3" 1 2 par 80 3" 1 2 par 40 3” 1 2 par 10 3" 1 2 par 15
SOURIS OPTIQUE
(atari, amiga)
résolution 100 à 800 DPI, 3 vitesses
490. 00 F TTC TRACKBALL
(atari. Amiga)
395. 00 F TTC HANDY SCAN
(atari. Amiga)
1 990,00 F TTC
pC g 15 PC S 18
estoiMXfù
Carte d'extension mémoire pour AMIGA 500 (avec horloge et interrupteur)
Carte 512 ko 590,00 F
Carte 2 Mb 2990,00 F
Fast fire turbo (atari, amiga, amstrad Fast winner turbo (IBM et compatibles) Speedking
(IBM et compatibles) Manette 2 boutons
(Sega, nitendo, atari, amstrad, commodore)
149,00 F
Modèle
Qté
Prix unitaire
ne
Prix total
ne
Livraison consommables
50 F
Au-dessus de 200 disquettes nous consulter
Total
BON DE COMMANDE
A retourner à :
PC S 18 - 5, rue J-F. LEPINE - 75018 Paris
Je vous prie de bien vouloir noter ma commande référencée ci-contre.
Nom
Société
Adresse
Code postal Ville
Toutes les marques citées sont déposées. Prix modifiables sans préavis.
Tous nos prix sont TTC. Sauf si spécifiés.
Lecteur externe 3" 1 2 (atari, amiga)
950,00 F
IMPRIMANTES
Livrée avec câble parallèle CITIZEN 120 D STAR LC10 STAR LC10 couleur
1290. 00 F
1650. 00 F
2150. 00 F
Je désire régler par : ? Chèque ? Carte bleue N° i I I I I I I I I 1 I 1
Date de val. I I I I I
Date Signature
11
PC S 18
Cty)
I
I
. J
5, rue J.-F. LEPINE - 75018 PARIS Tél. : 42 05 96 66 - Fax : 46 07 97 60
CR29
???? ????
I r
INITIATION
LES PRINCIPALES INSTRUCTIONS D’AMAL
Deuxième volet de notre série sur le langage d’animation intégré à l’AMOS. Dans cet article, nous allons inspecter en détail l’évaluation d’expression, les registres internes et externes,les boucles et les branchements.
3. Expressions et variables
AmaL peut effectuer des calculs et garder les résultats en mémoire. Cette évaluation d’expression est cependant extrêmement simplifiée pour en accélérer l’exécution.
3. 1. Opérateurs et expressions
Vous pouvez utiliser dans vos calculs les quatre opérateurs courants :
U M U n M M
¦ I I ) '
Les calculs sont évalués de gauche à droite, STRICTEMENT, sans priorité d’opérateurs. AMAL ne reconnaît pas les parenthèses.
Exemple à ne pas suivre :
Si l’on veut : 3*2 + 2 =8
et qu’on fait : 2 + 3*2, on a tout faux ! AMAL calcule en premier 2 + 3 = 5 puis 5*2 = 10.
AMAL reconnaît également les opérateurs logiques : “=”, “ ",
V, (ET logique), “ù” (OU logique). Attention la version 1.1 de l'AMOS ne reconnaît pas cet opérateur (oui je sais, bug !).
Les opérateurs de comparaison ramènent la valeur -1 ($ FFFF) lorsque l’expression est VRAIE, et 0 dans le cas contraire. Afin d’accélérer l’exécution, AMAL se contente de deux octets pour stocker les chiffres (contre 4 pour AMOS). Les limites de calcul sont donc - 32768 à + 32767.
3. 2. Les variables ou registres
Contrairement au basic, AMAL ne vous permet pas de choisir le nom de vos variables. Le système utilisé se rapproche plus de celui d’une calculatrice programmable. Le compilateur reconnaît un registre par la lettre R, suivit d’une LETTRE ou d’un CHIFFRE.
3. 2.1. Les registres locaux
Sont désignés par un R suivit d’un chiffre (0 à 9). Vous en avez donc 10 à votre disposition. Ces registres n’appartiennent qu’au canal d’animation, et à lui seul.
3. 2.2. Les registres globaux
Sont désignés par un R suivit d’une lettre (majuscule bien sûr). Ces 26 registres sont communs à tous les canaux d’animation, et doivent être réservés au tranfert d’informations d’un canal à l’autre. Par exemple un canal gérant une balle détecte une collision avec la cible, met à 1 l’un des registres globaux pour indiquer l’explosion.
3. 2.3. Les variables réservées
Sont au nombre de trois : X, Y et A.
- X représente la coordonnée en X produite par le canal d’animation. Elle retourne la valeur actuelle produite par le canal. A l’inverse, modifier sa valeur reviendra à bouger l’objet affecté au canal.
- Y est la coordonnée en Y
- A est l’image (A comme Animation).
3. 3. L’instruction d’affectation
Comme au bon vieux temps, pour affecter le résultat d’un calcul à un registre ou à une variable réservée, il faut utiliser l’instruction Let (ou L). Let R0 = 1 Let X = X + 1 L X = RA 2 + 10
4. Branchements et boucles
Sans boucle, pas de programme complexe. AMAL possède le strict nécessaire pour faire des branchements.
4. 1. Etiquettes et branchements
4. 1.1. Les étiquettes
Pas de numéros de lignes en AMAL, mais comme en AMOS, des labels. Pour simplifier la tâche du compilateur, le nombre d’étiquettes est limité à 26, les 26 lettres de l’alphabet. Pour marquer un label, il suffit d’utiliser une lettre majuscule suivie d’un Comme d’habitude, vous pouvez intercaler des lettres minuscules avant les deux points. Exemples :
Boucle : (équivalent à B:)
Ici se branche le programme : (équivalent à I:)
Les labels sont locaux à chaque chaîne. Le compilateur refusera de traiter deux fois la même étiquette pour un canal.
4. 1.2. Jump
AMAL possède son propre GOTO : Jump (ou J seul). Il doit être suivit d’un label défini ailleurs dans la chaîne.
4. 1.2. Pause
Voici un exemple :
' Initialisation Curs Off : Flash Off Double Buffer
Load "AMOS_DATA:Sprites Octopus.Abk"
Fade 1 To -1
' Définition du programme AMAL
A___
A$ =A$ +"Boucle: Let X=X+1;"
A$ =A$ +" Jump Boucle"
_
' Démarrage du programme _
Bob 1,0,0,1 Channel 1 To Bob 1 Amal 1, A$
Amal On Wait Key
Un exemple très simple. La partie initialisation charge la banque de sprites, puis modifie les couleurs en interruptions (Fade 1 To - 1, - 1 signifiant de récupérer la palette de couleurs des sprites). Suit la définition de la chaîne AMAL, et le démarrage de celle-ci. A première vue, ça marche, même un peu trop bien! Un programme AMAL est appelé tous les 1 50e de seconde. Pour traverser l’écran, le bob devrait mettre 320 50 = 6,4 secondes. Or il fait ce chemin en environ 1 seconde.
Ce programme est le parfait exemple à ne pas suivre. Il s’agit d’une boucle sans fin qui devrait normalement bloquer l’ordinateur si je n’avais programmé une sécurité : chaque canal possède un petit compteur qui n’autorise que 6 sauts au maximum pour chaque 1 5.0e de seconde. Ainsi tout les 1 50e notre programme “fait” 6 tours, puis rend la main au système, le bob met donc 6,64 6 soit 1,07 secondes pour traverser l’écran. Vous devez utiliser l’instruction “Pause” (ou “P”) pour réguler la vitesse : lorsque AMAL rencontre cette instruction, il rend la
main à l’AMOS. L’exécution recommence 1 50e de seconde plus tard, à l’instruction suivant immédiatement Pause.
Modifiez la deuxième ligne de notre exemple pour réduire la vitesse :
A$ =A$ +" Pause; Jump Boucle"
On peut encore réduire la vitesse :
A$ =A$ +" P;P;P;P; Jump Boucle"
4. 2. Les tests
Les tests de conditions peuvent être réalisés au moyen des instructions If (ou I) et Jump :
If condition Jump Label
Si la condition est VRAIE (résultat différent de zéro), le programme fera un saut au label spécifié, sinon AMAL sautera le Jump.
Exemple 2 :
Récupérez le programme précédent, et modifiez les lignes à partir de la définition du programme AMAL. Il montre comment utiliser les registres globaux pour synchroniser parfaitement un grand nombre de bobs :
Définition du programme AMAL
UN PRODUIT
REMARQUABLE
CHEZ VOTRE DISTRIBUTEUR
CONSEIL
LA PUISSANCE INFORMATIQUE AUX NORMES DE LA VIDÉO
GENLOCKS professionnels DIGITALISATION ¦ PÉRIPHÉRIQUES VIDÉO TRANSCODEURS
PAL - YC - RVB - BETA : 14 750 F H.T. BROADCAST
COMPATIBLE AMIGA - PC - MAC
GST GOLD Codeur asservi PRO AMIGA et FADER PAL-YC
7600 F TTC
GOLD S P PAL - YC SPLITTER AUTOMATIQUE
5500 F ttc
SATELLITE ET TÉLÉVISION SA Z.I. EST - rue de l’Artisanat -14500 Vire LA VIDÉO EST NOTRE savoir-faire Tél. : (16) 31.67.12.62 - Fax : (16) 31.68.96.97
A$ =A$ +" > boucle montante"
A$ =A$ +"Boucle: Let RA=RA+1; Let RB=RB+1;"
A$ =A$ +" Pause;"
A$ =A$ +" If RA 160 Jump Boucle"
A$ =A$ +" > boucle descendante"
A$ =A$ +"Retour: Let RA=RA-1; Let RB=RB-1;"
A$ =A$ +" Pause;"
A$ =A$ +" If RA Jump Retour"
A$ =A$ +"-> retour au départ"
A$ =A$ +" Jump Boucle"
B$ =B$ +"Boucle: Let X=RA;
B$ =B$ +" > l'image affichée variera de 1 a 4" B$ =B$ +" Let A-RB&3+1;"
B$ =B$ +" Pause;"
B$ =B$ +" Jump Boucle"
C$ =C$ +"-> coordonnée de départ"
C$ =C$ +" Let R0=Y;"
C$ =C$ +"Boucle: Let X=320-RA;"
C$ =C$ +" > sauts autour de la coordonnée de départ" C$ =C$ +" Let Y=RB&7+R0;"
C$ =C$ +" Pause;"
C$ =C$ +" Jmp Boucle"
' Démarrage du programme
For N=1 To 13 Step 2 Bob N,0,N*16,1 Bob N+1,320,N*16,1 Channel N To Bob N Channel N+l To Bob N+l Amal N,B$
Amal N+1,C$
Next
Amal 0,A$
Amal On Wait Key
La première chaîne (A$ ) va nous servir de générateur de coordonnées pour les autres chaînes. En effet, cette chaîne est affectée au canal 0, dont la sortie se fait vers le sprite hardware 0. Or le programme n’a pas affiché de sprite, rien que des bobs. La chaîne 0 n’aura donc AUCUN EFFET VISIBLE. Elle va par contre modifier le contenu des registres globaux RA et RB. La chaîne B$ sera utilisée par les canaux de numéro impair, pour les bobs situés à gauche de l’écran. La chaîne C$ garde dans un registre LOCAL la coordonnée en Y du bob lors du lancement du programme.
N. B. : j’ai utilisé dans mes remarques AMAL les caractères - et >. Bien qu’ils ne soient pas ignorés par le compilateur dans les expressions, celui-ci n’en tient pas compte LORSQU’IL ATTEND UNE INSTRUCTION ! Cela permet de donner plus de variété au listing. Attention cependant, pour ne pas enduire AMAL d’erreur (!), il faut clore chaque expression par un séparateur (genre point-virgule). Si vous enlevez par exemple celui situé dans la chaine B$ , après Let X = RA ; vous aurez un message d’erreur.
4. 3. Les boucles
Comme nous l’avons vu le mois dernier, il est possible de faire des boucles For Next en AMAL. La syntaxe à respecter est la suivante : For Rx=... To ...; suite d’instructions ; Next Rx ou
F Rx=... T ...;...; N Rx
Vous devez impérativement utiliser un REGISTRE (local ou global) comme variable de boucle. Il faut toujours préciser le registre après l’instruction Next.
Il est parfaitement possible d’imbriquer plusieurs boucles (autant que de registres, soit 26 + 10 = 36 boucles). Le compilateur refusera un saut à l’intérieur d’une boucle. Vous pouvez par contre en sortir sans problème.
On peut remplacer la chaîne A$ dans l’exemple précédent par :
A$ =A$ +"-> boucle montante"
A$ =A$ +"Boucle: For RA=0 To 100;"
A$ =A$ +" Let RB=RB+1; "
A$ =A$ +" Next RA"
A$ =A$ +"-> boucle descendante"
A$ =A$ +"Retour: For R0=0 To RA;"
A$ =A$ +" Let RA=RA-1;"
A$ =A$ +" Let RB=RB+1;"
A$ =A$ +" Next R0"
A$ =A$ +" Jump Boucle"
Le pas de la boucle étant toujours de 1, il a fallu ruser pour la boucle
descendante en utilisant une variable locale.
Exemple 3 : positionnement automatique d’un écran.
' EXEMPLE 3 : gestion d'écrans
' Affiche quelque chose dans 1'écran
Curs Off
For N=0 To 55
Print "Commodore revue...";
Next
' Appelle la procédure
SET_AUTO
' Marque les bords
Ink 0 : Bar 0,0 To 16,16 : Bar 304,184 To 319,199
Ink 3 : Box 0,0 To 16,16 : Box 304,184 To 319,199
' Libère la souris
, et passe en mode direct
Limit Mouse 0,0 To 640,400
Direct
Procédure SET_AUTO
N=Screen
X$ =Chr$ (65+N*5)
: Y$ =Chr$ (66+N*5)
TX$ =Chr$ (67+N*5) : TY$ =Chr$ (68+N*5)
F$ =Chr$ (69+N*5)
' Premier programme fixant la position de l'écran
A$ =A$ +"Boucle:
If K1=0 Jump Rien"
A$ =A$ +"
If R"+F$ +"=l Jump Dejala"
A$ =A$ +"
If R"+F$ +" Jump Fin"
A$ =A$ +"Ok:
Let R0=XM-X; Let R1=YM-Y;"
A$ =A$ +"
If R0 0 Jump Rien"
A$ =A$ +"
If R0>16 Jump Rien"
A$ =A$ +"
If R1 0 Jump Rien"
A$ =A$ +"
If RI>16 Jump Rien"
A$ =A$ +"
Let R"+F$ +"=l;"
A$ =A$ +"Dejala:
Let X=XM-R0 & 65520; Let Y=YM-R1;"
A$ =A$ +"Fin:
Let R"+X$ +"=X; Let R"+Y$ +"=Y;"
A$ =A$ +"
Pause; Jump Boucle"
A$ =A$ +"Rien:
Let R"+F$ +"=0; Jump Fin"
' Deuxième programme fixant sa taille
B$ =B$ +"
Let R2=X; Let R3=Y;"
B$ =B$ +"Boucle:
If K1=0 Jump Rien"
B$ =B$ +"
If R"+F$ +"=2 Jump Dejala"
B$ =B$ +"
If R"+F$ +" Jump Fin"
B$ =B$ +"
Let R0=R"+X$ +"+X-XM; Let Rl=R"+Y$ +"+Y-YM;"
B$ =B$ +"
If R0 0 Jump Rien"
B$ =B$ +"
If R0>32 Jump Rien"
B$ =B$ +"
If R1 0 Jump Rien"
B$ =B$ +"
If RI>32 Jump Rien"
B$ =B$ +"
Let R"+F$ +"=2;"
B$ =B$ +"Dejala: Let X=XM-R"+X$ +"+R0 & 65520; Let Y=YM-
R"+Y$ +"+Rl;"
B$ =B$ +"
If X R2 Jump X"
B$ =B$ +"
Let X=R2;"
B$ =B$ +"X:
If Y R3 Jump Fin"
B$ =B$ +"
Let Y=R3;"
B$ =B$ +"Fin:
Let R"+TX$ +"=X; Let R"+TY$ +"=Y;"
B$ =B$ +"
Pause; Jump Boucle"
. B$ =B$ +"Rien:
Let R"+F$ +"=0; Jump Fin"
' Troisième programme positionnant les offsets
C$ =C$ +"Boucle:
If K1=0 Jump Rien"
C$ =C$ +"
If R"+F$ +"=3 Jump Dejala"
C$ =C$ +"
If R"+F$ +" Jump Fin"
C$ =C$ +"
Let R0=XM-R"+X$ +"; Let R1=YM-R"+Y$
C$ =C$ +"
If R0 16 Jump Rien"
C$ =C$ +"
If R0+16>R"+TX$ +" Jump Rien"
C$ =C$ +"
If R1 0 Jump Rien"
C$ =C$ +"
If R1+16>R"+TY$ +" Jump Rien"
C$ =C$ +"
Let R"+F$ +"=3;"
C$ =C$ +"Dejala:
Let R2=R0+R"+X$ +"-XM; Let R3=Rl+R"+Y$ +"-YM;"
C$ =C$ +"
If R2 0 Jump X"
C$ =C$ +"
Let X=R2;"
C$ =C$ +"X:
If R3 0 Jump Fin"
C$ =C$ +"
Let Y=R3;"
C$ =C$ +"Fin:
Pause; Jump Boucle"
C$ =C$ +"Rien:
Let R"+F$ +"=0; Jump Fin"
' Démarrage de tout le monde!
Channel N*3 To Screen Display N
Channel N*3+l
To Screen SizeN
Channel N*3+2 To Screen Offset N
Amal N*3,A$
Amal N*3fl,B$
Amal N*3+2,C$
'Amal On End Proc
La procédure SET_AUTO initialise trois canaux d’interruptions dirigés vers l’écran courant. Ces trois canaux permettent de fixer en interruptions :
1 - La position de l’écran (SCREEN DISPLAY), en cliquant en haut et à gauche de celui-ci.
2 - La taille de l’affichage (SCREEN SIZE), en cliquant en bas et à droite.
3 - Le scrolling à l’intérieur de l’écran (SCREEN OFFSET), en cliquant au milieu.
Vous pouvez utiliser cette procédure pour tout écran de numéro inférieur à 5.
Aucun test n’est effectué pour vérifier la validité des valeurs envoyées à la liste copper, l’affichage sera modifié (sans aucun danger) pour des valeurs extrêmes.
Pour bien comprendre le programme, sachez que =XM, =YM, et =K1 sont des fonctions AMAL qui retournent la position et l’état des touches de la souris.
Vous remarquerez l’utilisation de registres GLOBAUX pour échanger les données entre les chaînes. Ces registres sont calculés au début de la procédure en fonction du numéro de l’écran. Par exemple, RA, RB, RC, RD et RE seront utilisés par l’écran 0, RF, RG etc. par l’écran 1. Les chaînes de caractères permettent de jongler avec les numéros de registre !
Voici l’utilisation de ces registres :
- RA et RB : position en X et Y de l’écran, fixés par la chaîne A$
- RC et RD : taille en X et Y, fixés par la chaîne B$
- RE: flag empêchant plusieurs chaînes de fonctionner simultanément. Voilà pour aujourd’hui. Ne vous en faites pas, cela va encore se compliquer le mois prochain. Je reste à votre disposition sur le 3615 ComRev pour toute question ou remarque concernant cet article, AMAL, AMOS, la vie, la mort, Dieu, etc. Enfin tout quoi.
François LIONET
] r
REQUESTER
Question: : Je vous écris à propos d’un problème qui me tracasse, m’empêche de dormir, m’attriste... et si vous pouviez le résoudre, je vous en serais très reconnaissant. Voilà l’affaire :
Je possède un Amiga 500 depuis 2 ans (kickstart 1.2), une extension mémoire et une imprimante. Mon problème est que, dès que mon alimentation est bien chaude (disons environ après 3 heures d’utilisation), mon Amiga plante !!
En effet, lorsque j’utilise Excellence, le méchant GURU vient me persécuter sans arrêt, ce qui m’oblige à sauver mon texte toutes les lignes ou presque... Vous voyez la galère !!
Et ceci aussi avec Deluxe Paint 3 ou tout autre utilitaire.
J’ai bien sûr fait quelques vérifications : ma version d’Excellence fonctionne parfaitement sur un autre Amiga, même au bout de 5 heures d’utilisation. Nous avons échangé nos alimentations, nos extensions mémoire, mais rien à faire.
J’ai tout de même constaté une chose : le code placé derrière le GURU est toujours le même. Je me suis donc procuré un petit utilitaire du domaine public appelé GURU (tiens donc !) Qui, affiche ceci :
ALERT TYPE : DEAD END
GENERATED BY : EXEC.LIBRARY
SPECIFIC CAUSE : CORRUPTED MEMORY LIST
Peut-être que ceci vous aidera à me conseiller sur la cause de mes
problèmes. Je compte sur vous et sur votre expérience pour
m’aider. Merci d’avance et longue vie à Commodore Revue et à
l’Amiga.
Guenael Delavault (thouars)
Réponse : En ce moment, nos lecteurs adorent nous poser des problèmes difficiles... Et moi qui suis si fatigué (gros soupir).
Votre Amiga a contracté une maladie. En effet, vos vérifications permettent d'être sûr qu’il ne s’agit pas d’un problème hard, ni d’un problème d’alimentation d’ailleurs. De même que ce n’est pas un problème soft car jamais DpaintJ qui est remarquablement bien programmé ne pourrait vous faire une chose pareille. Il s’agit donc d’un virus. Il y a eu à une époque un virus qui réservait périodiquement de petite quantité de mémoire de façon tout à fait désordonnée ce qui finissait par provoquer un gourou comme celui qui vous
AMIGA500
+ souris + péri tel
INCROYABLE
AMIGA500 +peritel +extension 512K +horloge
3390
AMIGA500
+ écran couleurs + extension 512K +horloge
5190
AMIGA500
+ écran couleurs
raoMO
AMIGA500
avec compatibilité
PC
nousconsulter
LECTEUR3"1 2
EXTERNE
650
REPRISE POSSIBLE DE VOTRE ANCIEN MICRO
Wfm
extension interne 4Mo pour A 500 .
.4100
Trumpcard 500 30 Mo ..
.4900
accélérateur de carte XT 2000 .
...990
émulateur AMAXII .....
3490
PHASE
GALERIE'UESQUARE 93, Avenue du G1 Leclerc 75014PARIS 45 45 73 00
M° Alésia -1 Oh à 19h Lundi-Samedi
'WMmMéM
mm
disque dur 20Mo pour A500 ...
......2900
genlock GSTGOLD S P ..
......5400
CARTF.68020+2Mo ...
.3850
CREDIT-DÉTAXE
AMIGA500
AMIGA2000
- Eécran couleurs
- Eécran couleurs
+disque dur 20Mo
- Ecarte XT
+deux.lect.3"l 2
7990
9990
AMIGA2000
- fecran couleurs +extension 2Mo +disque40Mo
LCIO ...1890
LclOcoul ....2490
LC24-10 .....2990
SWIFT24 ...3490
13690
AMIGA2000
Carte extension
- Eécran couleurs
2 Mo
- Ecarte AT
- Edeux.lect.3"l 2
extensible à 8
12990
1940
VENTE PAR CORRESPONDANCE - PRIX T.T.C.
?H HP BBHP
embête tant. Peu importe le nom de ce virus (que j’ai de toute façon oublié) car il s’agit peut-être d’un de ces nouveaux OVNI (Obnubilants Virus Non Identifiés, ainsi nommés à cause du cri désespéré de leurs malheureuses victimes: “J’en ai marre tiens !”). Vu le contexte de vos ennuis et considérant que votre disque dur n’est pas autoboot (kickstart 1.2) il est à peu près certain que votre disquette d’installation (au moins) est infectée. Utilisez par exemple VirusX pour faire le ménage. S’il s’agit d’un nouveau virus coquille, le programme Sentinelle de ce mois-ci pourra peut-être vous aider à le localiser.
A ce propos, il semble à la mie du courrier surabondant et angoissé de nos lecteurs à ce sujet, qu’actuellement beaucoup de programmeurs en manque d’idées s’ingénient à bidouiller de nouveaux virus. C’est bien dommage car sur un Amiga, il y a beaucoup mieux à faire. Il y a même un farfelu qui sous prétexte de vouloir écrire un article dans l’ANT m'a envoyé une disquette infectée de ces dernières créations. Pas de chance, ma Sentinelle à moi (programme complet) monte la garde efficacement. M’enfin !
0
Question : Lecteur de Commodore Revue depuis le N° 1, je tiens à vous féliciter pour la qualité de votre revue, ainsi que pour son évolution depuis les premiers numéros. Un grand bravo pour TANT, rubrique qui me semble indispensable dans une revue d’informatique.
A ce sujet, pourriez-vous faire une initiation au langage C (la 3D pour débuter, c’est dur) traitant plus spécialement des fonctionnalités particulières à l’Amiga. (menu, souris, etc.).
Existe-t-il quelques ouvrages sérieux dédiés à l'Amiga traitant ce sujet (en dehors de “Bien Débuter en C” qui est un peu "léger").
Suite à de nombreux problèmes avec mon disque dur, (Read write errors à la pelle, refus de booter en DHO : etc.), j’ai pris contact avec mon revendeur qui m’a assuré qu’il s’agissait d’un virus, non détectable avec VirusX 4.0, et ne s'attaquant qu'aux disques durs. Qu’en est-il ? Ce virus existe-t-il vraiment, et si oui comment le repérer et comment s'en débarrasser?
Je vous remercie d'avance, et souhaite une longue vie à Commodore Revue et à l’Amiga.
David Herr (St Etienne)
Réponse : Toute l’équipe de CR vous remercie pour vos compliments. Nous envisageons de faire très prochainement une rubrique régulière sur le C dans l’ANT car de plus en plus de lecteurs le souhaitent. Actuellement. Abonnez-vous vite à l’ANT qui devient indépendante dès Janvier, nous avons besoin de votre soutien. En ce qui concerne les livres, voici un avis qui n’engage que moi : il n’existe pas d’ouvrages français sérieux sur l’Amiga. Il faut donc se rabattre sur les Amiga Rom Kernel Manual (en anglais) qui contiennent tout ce que Ton a toujours voulu savoir sur l’Amiga sans jamais oser le demander. De plus 99 % des programmes d’exemples sont écrits en C (lattice C 5.04 évidemment). Que demander de mieux ? Tout simplement que les vendeurs français comprennent enfin que Ton ne vend pas un ordinateur comme une machine à laver et qu’ils fassent les efforts nécessaires afin d’être capables de vous fournir cette documentation. Le magasin MAD (voyez les pubs dans la revue) en est capable, téléphonez-lui.
Voilà que ça recommence, encore un épisode de la terrible guerre des immondes. Sachez d’abord qu’il existe maintenant une version 4.01 de VirusX. Oui, les virus capables d’attaquer un disque dur existent, leur programmation ne présente même aucune diffi- %ilté. Si VirusX ne reconnaît pas votre virus, et si le virus n’est que siir disque dur, il s’agit d’un virus coquille. Vous pouvez alors - après avoir installé la Sentinelle de TANT de ce mois-ci - lancer un par un tous les exécutables. La Sentinelle déclenchera l’alerte lors du lancement du programme infecté. Détruisez alors impitoyablement ce programme. Attention, plusieurs fichiers peuvent être infectés, il faut donc tout tester. Deuxième solution, fastidieuse mais radicale : sauvegardez vos sources et autres fichiers texte (non exécutables) sur disquette, reformatez votre disque dur et réinstallez tout à partir de disquettes originales donc non infectées. Ces opérations sont finalement simples grâce aux utilitaires vendus (en principe) avec un disque dur. Installez la Sentinelle dont le rôle est de prévenir de toute nouvelle infection plutôt que de guérir. Ne jamais installer un programme sur le disque dur sans l’avoir auparavant testé comme expliqué plus haut. Enfin se méfier comme de la peste des copies pirates et plus encore des démos tape à l’œil et tapageuses, vecteurs privilégiés de ce genre d’infection.
0
Question : Je suis un abonné récent, mais lecteur ancien, et possède un Amiga 500 sur lequel j’essaie de programmer en assembleur à l’aide de Devpac 2. Je pense que vous devez être submergés de courrier (FM : oh que oui ! Pauvre de moi) de la part de programmeurs en herbe, étant donné le nombre de questions et de problèmes qui apparaissent au cours de notre progression.
Je voudrais savoir dans quels ouvrages, en français ou en anglais, je pourrai trouver des détails explicatifs sur les librairies. Par exemple dans la Bible Amiga : Intuition.library, lorsque je vois à - 222 RefershGadgets' (Gadgets,Ptr,Req) (A0,A1,A2) j’aimerai bien savoir ce que sont les Gadgets, P-tr et Req. L’abréviation de leur nom ne constituant pas pour moi (FM : ni pour personne d’ailleurs, alors à quoi servent ces pages hein ?) Une explication suffisante me permettant de les utiliser.
De même, où peut-on trouver des explications détaillées sur les codes renvoyés par les gourous qui me rendent si souvent visite L J'essaie, dans la mesure du possible, de résoudre par moi-même mes problèmes de programmation. Je devine que vous avez autre chose à faire que d’examiner et corriger les programmes sources balbutiants des débutants. Si néanmoins, ponctuellement, nous sommes bloqués avec un programme qui semble se comporter anormalement (en tout cas pas comme nous l’attendions !), pouvons- nous vous envoyer une lettre (avec espoir de réponse bien sûr car envoyer une lettre on peut toujours) expliquant le problème de manière très concise avec éventuellement une disquette contenant le programme source ?
JL Brefort (St Aubin Mer)
Réponse : La Bible de l’Amiga est, pour votre malheur, un livre treize et pets mais plein de vent. Mieux vaut laisser tomber cette horreur et consulter les Amiga Rom Kernel Manual. Je sais bien que j’ai déjà dit tout ça plusieurs fois, mais comme beaucoup semblent ne pas avoir entendu, je le répète une dernière fois un peu plus fort : ACHETEZ LES AMIGA ROM KERNEL MANUAL, ils contiennent tout ce que vous voulez savoir et plus encore. Les gourous y sont bien sûr traités sauf les gourous N° 2 à B qui sont des exceptions 68000 traitées dans les ouvrages sur le 68000.
Nous avons certes beaucoup à faire, mais il ne faut pas hésiter à nous soumettre vos problèmes de programmation car nous avons besoin de les connaître. Peut-être avez vous remarqué que bon nombre d’articles ont été dernièrement écrits à partir de questions formulées par des lecteurs ? En effet quel meilleur moyen de vous satisfaire que de connaître vos problèmes et tenter d’y remédier ? Chaque fois que vous posez une question de programmation, cela nous permet de mieux vous connaître et de nous efforcer de construire TANT de façon à intéresser le plus grand nombre. Voici, afin que tout le monde soit satisfait quelques règles simples à observer :
- Posez votre question de la manière la plus concise et la plus précise possible. Pour la petite histoire, j’ai lu dernièrement une lettre de deux pages dans laquelle finalement aucune question n ’était posée. N’omettez pas de décrire avec exactitude votre configuration matérielle (drives, mémoires, etc.)
- Ecrivez lisiblement et non pas en hiéroglyphes, idéogrammes, caractères runiques, gothiques ou autres. Pour éviter tous problèmes pourquoi ne pas écrire votre lettre sur disquette ?
- Tout fichier contenant du texte DOIT être un fichier ASCII sans aucune exception.
- N'oubliez pas de laisser : nom, prénom, adresse (complète) et numéro de téléphone.
- Mettez sur une disquette les sources et éxécutables MEME si ces derniers ne marchent pas.
- Pensez que MAX ou moi-même avons beaucoup de travail et donc que votre lettre risque de ne pas être suivie d'effet du jour au lendemain De plus une question peut être l'idée de base d'un article qui paraîtra dans plusieurs mois. Enfin sachez que lorsque vous lisez par exemple l'ANT du N° 26, nous sommes en train de préparer l'ANT du numéro trente ou trente et un, ce qui est évidemment source de décalages spatio-temporels profonds aussi complexes que déroutants.
- Indiquez sur l'enveloppe à qui vous voulez écrire, afin d'éviter que votre lettre ne se perde. (Herr Doktor Von Glouton Stimmel ImDorf en a mangé une l'autre jour lorsque son compilateur s'est mis à délirer)
- Si ce que vous souhaitez savoir sur un logiciel est dans la notice dudit logiciel, n'espérez pas de réponse...
- Tout programme en assembleur doit être écrit sur Devpac 2. Soyez certains que tous les sources écrits sur le picrocholique K-SEKA iront à la poubelle. Un bon outil permet de faire du bon travail et contrairement à ce que certains pensent peut-être, tout ce qu'il est possible de faire sur K-SEKA Test aussi avec Devpac 2. C'est l'inverse qui n'est pas vrai.
- Si vous souhaitez passer un programme dans TANT, il est préférable que celui-ci fonctionne chez nous, car l'argument éploré et bien connu : “mais chez moi ça marche pourtant !" A peu de chances de nous influencer.
- Si possible envoyez nous un listing.
- Ne mettez pas de virus sur vos disquettes.
Question : Je suis, depuis peu, devenu propriétaire d'un Amiga 2000 et je rencontre le problème suivant : après avoir réalisé un programme en AmigaBasic, je n’arrive pas à le sauvegarder. En effet le message erreur envoyé par le système est le suivant : disquette pleine. (Il s’agit de la disquette Extras fournie avec l’appareil). Si je veux la remplacer par une disquette vierge mais formatée, le système me réclame alors la disquette Extras. Je suis persuadé que vous pourrez m’aider à trouver la solution qui me permettrait enfin de ne plus tourner en rond.
Réponse : Une fouace n'est pas costume, la question est simple et la réponse aussi. Sur votre disquette formatée, copiez le langage AmigaBasic et lui seulement. Chargez ensuite le langage à partir de cette disquette. Ecrivez votre programme que vous pourrez ensuite sauver sur la disquette qui vous offre plus de place qu'il ne vous en faut. Complément d’information sur l'article BOOT ALLOCATOR (CR
26) . Ce programme ne fonctionnant pas correctement, sur un Amiga 2000 équipé d'un méga de chip, j'avais dit que je soupçonnais un bug dans la routine AllocEntry. Il n'en est rien. Ce qui se passe est que les 512 K supplémentaires de chip, contrairement à ce que je présumais (mea culpa car sur un Amiga il ne faut jamais rien présumer), ne sont pas reconnus immédiatement lors du reset mais seulement lors de l’Autoconfig. Ce qui signifie que si un programme est dans cette zone mémoire, il sera détruit lors du reset. Pour remédier à cela, il suffit d'installer le module résident dans la zone mémoire chip d'adresse $ 0 à $ 80000. Ceci est facile en employant par exemple la routine AllocAbs.
Le même problème se présente évidemment sur un Amiga 500 équipé de plus d'un méga de mémoire. Il suffit dans ce cas de demander à votre assembleur de placer le programme en chip ram.
DERNIERE MINUTE WORKS PLATINUM
(Intégré: Tableur, base de données, traitement de texte et Communication)
999 Frs
(g) (1) 42 82 16 03
E
34, Avenue des Champs Elysées 75008 PARIS
DALLAS - PARIS - GERMANY
SPECIAL CARTES ACCELERATRICES Enfin la Vitesse a un prix raisonable pour A2000®
68020 avec 2 Mégas 32bits 3790 Frs 68030 avec 4 mégas 32bits 9100 Frs
(autres cartes nous consulter)
EXCELLENCE!
Le traitement de texte Pro sur AMIGA® Dictionnaire 145000 Mots Entièrement Francisé
1590 Frs
TRACK BALL
Plus rapide et plus facile à utiliser qu’une souris Ne prend pas de place.
La Seule TrackBall Faite pour AMIGA®
AMTRACK 745 Frs
AMOS
The Creator Une réussite sans précédent Notre Prix
445 Frs PRO DRAW 2
1390 Frs
PRO PAGE 3
SPECIAL ETUDIANT Nous proposons aussi des Micros PC
Nous consulter pour les différentes configurations
2150 Frs
Deluxe paint 3
810 Frs
Nombreux Logiciels disponibles Au Prix Inter Computing Nous consulter
AT 286 12Mhz (Intel) Lecteur 5 1 4 (ou 3 1 2) Disque dur 20 Mégas Port et Série Carte VGA 256KO Ecran VGA Monochrome Clavier 102 Touches
8500 Frs (ttc)
INTER COMPUTING FRANCE
POKE PAR,code code = code + 2Ai NEXTi
REM test bouton gauche test = MOUSE(O)
REM si oui, alors c’est fini IF test = 1 THEN END
GOTO SORTIE
REM Fin de Programme
Olivier Mangon
Liste des Composants :
R : Résistance de 3.3Kohms
RI : Résistance de 180 ohms T : Transistor NPN BC107
LED : Comme bon vous semble des rouges, vertes, carrés, rondes
SUB D-25 Mâles
Ah ! Aussi un Amiga si possible.
Effectivement nous allons réaliser une interface vous permettant de contrôler des LED ainsi nous pourrons à la fois éclairer et créer des effets lumineux.
Pour cela nous aurons besoin de faire appel à deux choses : le Hardware et le Software, notre Amiga devra commander des leds.
Grâce au port parallèle nous pourrons commander 8 Leds et nous choisirons de les éclairer comme bon nous semble. L’interface est constituée de Transistor qui permettront de commander les leds, quand un 1 se présentera sur le portpa- rallèle alors une Led s’allumera.
La programmation du port parallèle peut se faire simplement grâce aux différents langages présents sur notre machine, nous utiliserons le basic Amiga que tout le monde possède chez soit.
Programme K2000 :
REM Programme en AmigaBAsic REM Ce programme permet de simuler l’œil de KIT
REM Ouverture du port parallèle REM Adresse du port parallèle
PAR =12574977&
REM on sort dès que l’on appuie sur le bouton de la souris
Sortie : code = 0
REM on fait un décalage à gauche FOR i = 1 to 8
REM on envoie sur le port parallèle
C’est bientôt Noël, uos préoccupations ne doivent pas être très loin du “qu’est-ce que je vais bien pouvoir offrir à ma tante de Bretagne” pour cela on ne pourra pas vous aider, par contre si vous avez envie de décorer votre Amiga, là nous allons peut être pouvoir faire quelque chose pour vous...
LA GUIRLANDE AMIGA
Avant
SuPérieurt
SCANNER A MAIN
Enfin un scanner pour tous!
GoldenIMAGE s
m Le scanner à main W GOLDEN IMAGE m permet de digitaliser m n'importe quel m document (photo ou W texte), de le remanier I à l'aide du formidable f logiciel TOUCH-UP et d'imprimer votre document personnalisé. Précision 400 dpif 64 tons de gris, largeur de 105 mm. ™
Modèle ATARI ou AMIGA (avec le logiciel TOUCH UP)
Vous devriez en parler à votre spécialiste micro !
IMAGINE’S
27-41, boulevard Louise MICHEL 92230 GENNEVILLIERS - Tél. : 47.91.06.25 Fax : 47.91.38.07 - Télex : 620294
COLOGNE EN IMAGE
Cette manifestation est une des plus importantes parmi celles qui concernent Yamiga en Europe et cette année encore on a pu y découvrir une foule de produits nouveaux qui donnent pour les mois à venir, la tendance en graphisme et vidéo.
Il semble bien cette fois que la qualité monte d’un cran et Yamateur ou le professionnel se voit offrir enfin l’accès au standard 24 bits à des prix raisonnables...
ne masse de gens se pressait autour du Videotoaster dont la démonstration était très impressionnante. Genlock, digitaliseur, générateur de caractères, etc. le Videotoaster fait tout. Du dessin en 24 bits (via Digi- paint 3) aux effets vidéo les plus divers en passant par la modélisation et l’animation 3D, cet ensemble logiciel et matériel est actuellement certainement parmi ce qu’on peut trouver de mieux sur micro toutes machines confondues à condition de résider aux USA, car il ne fonctionne actuellement qu’en NTSC. Sur la disponibilité d’une version PAL, l’un des développeurs me répondit que Newtek aviserait après l’amortissement commercial de la version actuelle et qu’il faudrait en tout état de cause attendre une année, puisque cela nécessitait la refonte totale du hardware.
U
Mais consolez-vous car il n’est pas sûr que vous attendiez son arrivée après les quelques descriptions que voici.
Une foule de sociétés présentait des produits vidéo, dont Videotechnik Dieze- mann et sa gamme de digitalisées “Snapshot” de très bonne qualité ou G2 qui vendait 3 types de genlock : G2 Vi- deoCenter, VideoCenter PLUS (PAL ou NTSC, sorties Composite YC Key) et Broadcast VideoCenter (PAL ouNTSC, BNC, sorties :
Composite Y C Y crCb RG Bs Key )
Leurs prix : respectivement 645,995 et
1. 995 £.
On pouvait voir aussi SCALA, un générateur de caractères avec arrière-plan, typographies (ombrées, souligées, 3D...) effets de volets paramétrables, qui permet l’import de graphismes et d’animations. Du côté des cartes d’affichages, les nouveautés ne manquaient pas.
DES CARTES, DES CARTES
L’Amiga a beau les accueillir (via sa partie PC) tout le monde ne peut s’offrir les excellents services d’une carte Vista ni même ceux plus démocratique
(25. 000 F environ tout de même) de ses petites soeurs, les nouvelles Targa Plus 16 et 32 bits.
Pour un prix plus décent (non encore fixé mais qui devrait se situer aux alentours de 2.000 $ ), on trouvait sur le stand de GVP le prototype de leur carte 24 bits.
Celle-ci a été développée par deux suisses aussi compétents que sympathiques qui, au terme de pas mal d’efforts, ont Fini par mettre au point un produit de belle facture, car cette carte fait office de :
- Frame Buffer 24 bits (pour parler clairement et simplement, un Frame Buffer est une carte qui récupère des fichiers 24 bits, par exemple de Sculpt, Silver, ImageLink, et les affiche en 16 millions de couleurs grâce à sa propre mémoire vidéo), affichage en 830*630 (ça, c’est de l’overscan), digitaliseur temps réel, Genlock, Keyer (permet de gérer des masques et des transparences) et avec ça je vous mets un Flicker-Fixer comme on pouvait en juger à la netteté des caractères à l’écran).
Un très bon produit qui affichait d’ailleurs en 24 bits grâce à un driver spécifique quelques très belles images de Painter 3D. Il ne lui manque qu’un logiciel de dessin et de retouche.
Sur le stand d’intelligent Memory on présentait la FireCracker (doit-on traduire la “pète-le-feu”?) Qui comme son nom ne l’indique pas est la carte Frame Buffer 24 bits d’Impulse, 2 Mégaoctets de ram vidéo, 768*580 overscan, sortie RGB, cette version Pal sera disponible en janvier 1991 pour environ 1.500 non pas Dollars mais DeutschMark avec des drivers pour les principaux logiciels susceptibles de l’adresser. Après un rapide calcul mental qui vous a permis de convertir le DM en F. français, vous vous dites in petto (restez polis s’il vous plaît) :
- “les prix baissent, voilà qui est intéressant”, en vous frottant les mains de l’air du mercanti chafouin.
Mais ma dernière carte je l’abats maintenant. C’est un des membres de la dé- léguation de CBM Belgique avec qui j’avais apprécié la carte GVP qui m’indiqua où se trouvait la “chose” qu’on avait failli rater.
Dans un coin de l’exposition, je découvrais le stand de MAST (Australie) gardé par un démonstrateur volubile et tonitruant qui semblait tout droit sorti du séminaire tant il semblait prêcher plus que démontrer. Un vrai gourou (mais non pas la software failure).
Il faut avouer (à moitié pardonnée) que le produit méritait quelques haussements de sourcils attentionnés, jugez vous-mêmes :
- Frame Buffer 24 bits, rien que de très banal me direz-vous, en jouant maintenant les blasés...
- Pal overscan, 768*580 Sortie RGB... hum...
Livré avec des drivers pour Digiview', Sculpt, Imagine...
... et un soft de traitement d’images ainsi qu’un soft de dessins 24 bits temps réel... ça porte le doux nom de Color- burst (décidément) et ça coûte ? 300 dollars.
J’en vois qui s’assied...
Mast nous promet ça dans les semaines qui viennent le temps de terminer le logiciel de dessin, qui n’était pas encore disponible sur l’Ami-Expo.
J’ai pu assister à une démonstration de quelques effets permis par cette carte de très belle qualité, dont la retouche d’images et l’incrustation dans l’écran du Workbench d’une image de fruits en 24 bits derrière lesqueües le présentateur faisait passer les icônes. Je partis en assurant l’homme de Mast qu’il pouvait compter sur moi pour parler de sa carte. “You can Guru” d’Australie fis-je en le quittant.
Plaisanterie mis à part voilà une carte qui va réveiller la concurrence, et aussi bien sûr l’Amiga. Si Mast tient ses promesses car en d’autres temps les mêmes nous firent miroiter des cartes accélératrices dont on n’a toujours pas vu la couleur même en 1 bitplane.
VR0UUUUMMMM
Pour faire tourner vos logiciels préférés en 78 tours, des cartes accélératrices, il
1
fonction 6 : strneat *************
* Concatène au maximum x caractères *
* de la chaîne 2 à la chaîne 1
* *************************************
* CE = aO pointe la chaîne 1
* al pointe la chaîne 2
* dO contient le nombre max.
* caractère à concaténer
* CS = aucune
* *************************************
* Attention : le buffer pointé par aO*
* doit être suffisamment grand pour *
* recevoir les 2 chaînes
* *************************************
strneat movem.l aO-al,-(sp)
.loopl tst.b (a0)+
bne.s .loopl
subq.l l,dO
ien sûr l’Amiga. Si Mast tient ses promesses car en d’autres temps les mêmes nous firent miroiter des cartes accélératrices dont on n’a toujours pas vu la couleur même en 1 bitplane. VR0UUUUMMMM
Pour faire tourner vos logiciels préférés en 78 tours, des cartes accélératrices, il
1
fonction 6 : strneat *************
* Concatène au maximum x caractères *
* de la chaîne 2 à la chaîne 1
* *************************************
* CE = aO pointe la chaîne 1
* al pointe la chaîne 2
* dO contient le nombre max.
* caractère à concaténer
* CS = aucune
* *************************************
* Attention : le buffer pointé par aO*
* doit être suffisamment grand pour *
* recevoir les 2 chaînes
* *************************************
strneat movem.l aO-al,-(sp)
.loopl tst.b (a0)+
bne.s .loopl
subq.l l,dO

Click image to download PDF

AMIGA NEWS TECH numero 18 (12-1990)

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


Thanks for you help to extend Amigaland.com !
frdanlenfideelhuitjanoplptroruessvtr

Connexion

Pub+

66.2% 
8.9% 
2.3% 
2.2% 
1.7% 
1.7% 
1.3% 
1% 
0.7% 
0.6% 

Today: 4
Yesterday: 98
This Week: 649
Last Week: 1108
This Month: 3391
Last Month: 3918
Total: 89523

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