2 ; TURMITES (c) F.Fleuret 28/11/89
3 ; version assembleur AMIGA
5 ; opt d+ ; option d'assemblage (sauve les labels)
26 ntur equ 1024 ; nombre maximum de turmites
32 V equ 8 ; niveau d'énergie
33 Table equ 10 ; table de comportement
53 ; On réserve de la mémoire en CHIP-RAM pour les bitplanes,
54 ; les sprites et la copper-list. (l'ami Thomas va etre heureux !)
57 move.l #$8000*4+256*8+32*2,d0
58 move.l #$10002,d1 ; CHIP et CLEAR
61 move.l d0,plan1 ; premier bitplan
62 beq alerte ; si pas de chip reservée !
64 move.l d0,plan2 ; second bitplan
66 move.l d0,SaveImage ; zone de sauvegarde
68 move.l d0,copper_list ; copper-list
70 move.l d0,SpriteCursor ; et les sprites
74 move.l d0,SpriteSelect
76 move.l d0,SpriteTableau
78 move.l d0,SpriteNombre
86 move.l #$8000*4+256*8+32*2,d0
103 lea IntuitionName(pc),a1
104 move.l (ExecBase).w,a6
105 jsr OldOpenLibrary(a6)
108 lea TexteAlerte(pc),a0
114 move.l (ExecBase).w,a6
119 dc.b 0,32,18," Turmites meditation: pas assez de CHIP ! ",0,0
123 ; ************************************************************
124 ; ************************************************************
125 ; ************* Voila le coeur du programme !!! *************
126 ; ************************************************************
127 ; ************************************************************
131 bsr save_all ; sauve tout pour pouvoir revenir
132 bsr Inits ; initialise les registres hard
134 lea TableAdan,a1 ; copie le tableau de la première turmite
146 bsr AfficheNombre ; routine pour afficher le nombre de turmites
147 bsr GetKey ; routine de lecture clavier
150 tst.b d0 ; si appuie et pas relache, on ne fait rien
154 ; A Nutrition automatique
157 ; 1-2-3-4 Changement de couleur de nourriture
159 ; R Reset (repart avec turmite actuelle)
160 ; F Suivre la turmite sélectionnée
163 ; M Mémorise l'image actuelle
164 ; f1-f2-f3-f4 Reconstruit terrain en blocs
165 ; f5 Remplie le terrain
166 ; f6 Ramène l'image sauvée
176 move.w #-1,ModeDroite
177 move.l SpriteCursor,a0
179 bsr InitSprites ; copie les données bitmap du sprite 'selection'
185 move.l SpriteCursor,a0
187 bsr InitSprites ; copie les données bitmap du sprite 'tuer'
192 not.w FlagSuivre ; commute le flag
213 cmp.w #$50,d0 ; "f1" à "f4"
221 bsr DrawWorld ; redessine le terrain
227 bsr ClearWorld ; vide avec la couleur en cours
233 not.w FlagPause ; commute le flag
239 move.w #-1,FlagQuit ; personnellement, je suis contre, mais
240 bra ApresKeys ; les meilleurs choses ont une fin...
243 move.w d0,d1 ; "1" à "4"
248 move.w d1,Color ; change la couleur en cours
250 move.w CouleursSouris(pc,d1.w),$dff180+18*2
253 dc.w $000,$f00,$00f,$ec0 ; noir, rouge, bleu, jaune.
259 not.w FlagAffiche ; commute le flag de l'affichage
262 bsr AfficheCerveau ; si mode affiche
269 beq ResetComplet ; si toutes mortes, on repart du début
274 bsr BigStart ; reprend au début
277 lea TableAdan,a1 ; copie le tableau de la première turmite
287 add.w #1,CompteurFreq
288 cmp.w #Frequence,CompteurFreq
295 btst #6,$bfe001 ; test de la touche gauche de la souris
297 bsr Paves ; routine qui affiche la nourriture
300 tst.w FlagAffiche ; le mode affichage y-est-il ?
303 cmp.l PAdrSelect,d0 ; la turmite a-t-elle changé ?
305 move.l AdrSelect,PAdrSelect ; mémorise la nouvelle turmite
309 tst.w FlagQuit ; veut-on quitter ?
313 bsr restore_all ; remet tout en place
314 moveq #0,d0 ; et revient
317 VblFlag: dc.w 0 ; flag de synchronisation VBL
318 ModeDroite: dc.w -1 ; role du bouton droit souris (select/tuer)
319 FlagAuto: dc.w 0 ; flag pour la nutrition auto.
320 CompteurFreq: dc.w 0 ; Compteur pour la nutrition
321 FlagPause: dc.w 0 ; flag pour le mode pause
322 FlagSuivre: dc.w 0 ; flag pour 'follow'
323 FlagQuit: dc.w 0 ; flag pour quitter
324 FlagAffiche: dc.w 0 ; flag pour l'affichage du tableau
325 PAdrSelect: dc.l 0 ; turmite actuellement affichée
326 Color: dc.w 2 ; couleur de la nourriture actuelle
329 ; **********************************************************
330 ; ********* Affichage du nombre de turmites à l'écran ******
331 ; **********************************************************
335 lea TableCarChiffres,a4 ; table des caractères numériques
336 divu #10,d0 ; utilise le reste d'une division par 10
359 move.l SpriteNombre,a0 ; adresse des datas de ce sprite
360 lea 4(a0),a0 ; datas bitmap
361 move.w #5,d0 ; caractères de 6 lignes
362 BoucleAfficheNombre: ; recopie les caractères de la table
363 move.w (a4)+,d1 ; dans le sprite.
375 dbf d0,BoucleAfficheNombre
379 ; **********************************************************
380 ; *** Routine d'initialisation de la table des turmites ****
381 ; **********************************************************
385 lea AdressesLibres,a5 ; constitue la table des adresses libres
393 move.l (a5)+,a0 ; initialise la première turmite
401 move.w #(ndatas-Table)/2-1,d0
404 dbf d0,BoucleBigStart
407 bsr DrawWorld ; affiche le décors avec un bloc central de 256
409 clr.l AdrSelect ; on vire la sélection et l'affichage
415 ; **********************************************************
416 ; ******* Routine d'affichage des paves de nourriture ******
417 ; **********************************************************
420 move.w Xmousew,d0 ; si on dépasse à droite alors on corrige
426 and.w #$0f,d4 ; masque pour le décalage
428 cmp.w #497,d1 ; test le dépassement en bas
432 ; calcul de l'adresse en mémoire vidéo
433 lsl.w #6,d1 ; 64 octets par ligne (512 points)
434 lsr.w #3,d0 ; on divise X par 8
435 and.w #$fffe,d0 ; force une adresse paire
437 move.l plan1,a0 ; + base de la mémoire
439 move.l plan2,a1 ; idem plan 2
442 move.l #$ffff0000,d0 ; dessin du bloc
443 lsr.l d4,d0 ; avec décalage
447 clr.l d2 ; dessin pour le plan 1
448 clr.l d3 ; dessin pour le plan 2
450 ; on modifie d2 et d3 en fonction des bits de la couleur
462 move.w #15,d4 ; blocs de 16 lignes de haut
474 ; **********************************************************
475 ; *********** Routine d'affichage d'un 'Cerveau' ***********
476 ; **********************************************************
480 tst.l AdrSelect ; y a-t-il une turmite sélectionnée ?
481 beq PasCerveau ; si non, alors ne rien faire
483 move.l SpriteTableau,a0 ; sprite pour afficher le tableau
484 lea 4(a0),a0 ; adresse des données bitmap du sprite
485 move.l AdrSelect,a1 ; adresse de la turmite sélectionnée
486 lea Table(a1),a1 ; adresse de son tableau de comportement
487 move.w #3,d0 ; 4 états
489 move.w #3,d1 ; et 4 couleurs par état
495 lea TableCarDirections,a2 ; table des caractères (g/a/d)
500 lea TableCarEtats,a3 ; table des caractères états (A/B/C/D)
505 lea TableCarChiffres,a4 ; chiffres (0/1/2/3...)
526 ClearTableau: ; vide la bitmap du sprite tableau
528 move.l SpriteTableau,a0
536 dbf d0,BoucleClearTableau
540 ; **********************************************************
541 ; **** Routine de gestion des déplacements des turmites ****
542 ; **********************************************************
547 clr.w nombre ; vide le nombre
548 lea DataTurmites,a0 ; tableau des turmites
549 move.l SPtur,a5 ; pile des adresses libres
550 move.l plan1,a4 ; base mémoire vidéo plan 1
551 move.l plan2,a3 ; base mémoire vidéo plan 2
552 move.l #ntur-1,d0 ; nombre de turmites
555 tst.w V(a0) ; est-elle en vie ?
556 beq finboucle ; si non, sniff...
558 add.w #1,nombre ; une de plus en vie !
563 move.w Xmousew,d3 ; est-elle sous la souris ?
578 btst #10,$dff016 ; POTGOR
581 ; elle est sous la souris
585 ModeSelection: ; si mode sélection, mémorise son adresse
589 clr.w V(a0) ; si mode tuer, on la desintègre
590 move.l a0,-(a5) ; nouvelle adresse libre dans la pile
591 cmp.l AdrSelect,a0 ; si c'était elle qui était sélectionnée
593 clr.l AdrSelect ; elle ne l'est plus
594 clr.w FlagSuivre ; le mode follow dégage
595 clr.w FlagAffiche ; le tableau disparait
596 bsr ClearTableau ; il faut l'effacer
600 tst.w FlagPause ; est-on en mode pause
601 bne finboucle ; si oui, on ne fait pas les mouvements
603 move.w d1,d3 ; si non
606 add.w d3,d2 ; d2 adr dans le bitplan
610 moveq #0,d3 ; d3 couleur de la case sous la turmite
611 btst d1,(a4,d2.w) ; on test les bits en mémoire vidéo
621 ; calcul de l'adresse de la case dans le tableau de comportement
623 move.w d3,d4 ; d3=d3*3 (pour la colonne, 3 octets par case)
627 move.w E(a0),d4 ; d4=état*12 (pour la ligne, 12 octets par ligne)
636 move.b 1(a1),E+1(a0) ; nouvel état
639 and.b #3,O+1(a0) ; nouvelle direction
641 move.b 2(a1),d3 ; couleur à mettre sous la turmite avant de partir
643 bit0d: ; le plot pour afficher la turmite
644 btst #0,d3 ; surement optimisable...
662 sub.w #1,V(a0) ; elle se fatigue
663 sub.w d3,V(a0) ; et perd la valeur de ce qu'elle met sur la case
664 bgt PasMorte ; est-elle morte de fatigue ?
666 clr.w V(a0) ; la vie est dure au pays des turmites
667 move.l a0,-(a5) ; nouvelle adresse libre dans la pile
668 cmp.l AdrSelect,a0 ; si c'était elle qui était sélectionnée
670 clr.l AdrSelect ; elle ne l'est plus
671 clr.w FlagSuivre ; le mode follow dégage
672 clr.w FlagAffiche ; le tableau disparait
673 bsr ClearTableau ; il faut l'effacer
676 move.w O(a0),d1 ; sinon, mouvement
684 and.w #511,Y(a0) ; limite à 512 points en hauteur
695 and.w #511,X(a0) ; limite à 512 points en largeur
702 cmp.w #128,V(a0) ; a-t-elle suffisament d'énergie pour se reproduire ?
705 lsr.w V(a0) ; elle perd de l'énergie
706 cmp.l #AdressesLibres,a5 ; y-a-t-il de la place ?
707 beq finboucle ; non...
712 rept ndatas/2 ; recopie son tableau dans son descendant
718 ; **** Mutations ****
722 ; d3 et d4 = random(256)
724 move.w CompteurRnd,d4
729 move.l d4,CompteurRnd
731 move.w CompteurRnd,d3
736 move.l d3,CompteurRnd
740 and.w #15,d5 ; 16 cases possibles dans le tableau
741 move.w d5,d1 ; *3 car 3 octets par case
744 lea Table(a2,d5.w),a1
747 cmp.w #1,d4 ; modifie-t-on la direction ?
748 bne PasDir ; si non...
750 move.w CompteurRnd,d3
755 move.l d3,CompteurRnd
759 move.b rnd3(pc,d3),0(a1)
763 and.w #3,d3 ; modifie-t-on l'état ?
764 cmp.w #2,d4 ; si non...
769 cmp.w #3,d4 ; modifie-t-on la couleur ?
770 bne aleatoire ; si non, on revient au début
773 dbf d6,aleatoire ; et on fait ça 4 fois
777 add.l #ndatas,a0 ; turmite suivante
779 move.l a5,SPtur ; sauve le nouveau pointeur
785 ; ******************************************************
786 ; *********** Routine de traçage du terrain ************
787 ; ******************************************************
789 ; D0=Largeur du coté (32/64/128/256)
794 move.l plan1,a0 ; bases des bitplanes
798 move.w #$1fff,d3 ; tout d'abord, on efface
804 move.w d0,d1 ; calcul de l'adresse de début, on passe
805 move.w d0,d2 ; des octets pour la marge de gauche.
814 bsr ChoixBits ; voire ci-dessous
816 move.l #512,d3 ; combien de carrés ?
817 divu d0,d3 ; un DIVU ne peut pas faire de mal
818 lsr.w #1,d3 ; (enfin, pas trop de mal...)
831 move.w a2,d4 ; boucle verticale des carrés
833 move.w a2,d5 ; idem horizontale
836 move.w a3,d3 ; les boucles pour UN carré
842 dbf d7,DWpetiteboucleHfill
844 DWpetiteboucleHclear:
847 dbf d7,DWpetiteboucleHclear
848 dbf d3,DWpetiteboucleV
858 ClearWorld: ; remplie l'écran avec la couleur en cours
883 ChoixBits: ; la routine qui détermine les mots en
884 moveq #0,d1 ; fonction des bits de la couleur
898 ; ******************************************************
899 ; ******************* Initialisations ******************
900 ; ******************************************************
905 move.w #$7fff,$9a(a6) ; INTENA
906 move.w #$7fff,$96(a6) ; DMACON
907 move.w #$c020,$9a(a6) ; IT vbl uniquement
908 move.w #$83a0,$96(a6) ; copper et bitplan
914 move.l SpriteTableau,a0 ; positionne les sprites
917 move.w #$2e58,256(a0)
918 move.w #$4a00,256+2(a0)
919 move.w #$2e60,512(a0)
920 move.w #$4a00,512+2(a0)
921 move.w #$2e68,768(a0)
922 move.w #$4a00,768+2(a0)
924 move.l SpriteNombre,a0
930 move.l SpriteCursor,a0
933 move.l SpriteSelect,a0
937 move.l copper_list,a0
939 move.l #$00e00000,(a0)+ ; la copper-list met les pointeurs
940 move.l #$00e20000,(a0)+ ; bitplanes
941 move.l #$00e40000,(a0)+
942 move.l #$00e60000,(a0)+
943 move.l #$01020000,(a0)+
944 move.l #$fffffffe,(a0)+
946 ; On se met en 256*256 2 bitplanes (4 couleurs) avec 16 points cachés
947 ; sur la gauche pour pouvoir faire un scrolling avec le delay.
949 move.l copper_list,$80(a6) ; COP1LC
950 clr.w $88(a6) ; COPJMP1
951 move.l #$2ca12ca1,$8e(a6) ; DIWSTRT et DIWSTOP
952 move.w #$2200,$100(a6) ; BPLCON0
953 clr.l $102(a6) ; BPLCON1 et BPLCON2
954 move.w #30,$108(a6) ; BPLMOD1
955 move.w #30,$10a(a6) ; BPLMOD2
956 move.l #$004000c0,$92(a6) ; DDFSTRT et DDFSTOP
958 move.l #irq,$6c ; vecteur irq
960 move.w #$0024,$dff104 ; priorité des sprites
961 move.w #$555,$dff180+17*2 ; couleurs de ces meme sprites
962 move.w #$00f,$dff180+18*2
963 move.w #$fff,$dff180+19*2
964 move.w #$fff,$dff180+21*2
965 move.w #$fff,$dff180+25*2
966 move.w #$fff,$dff180+29*2
968 clr.w $dff180 ; couleur playfield
969 move.w #$f00,$dff182 ; noir, rouge, bleu, jaune
972 bsr InitClavier ; initialise le clavier
981 dbf d0,RecopieSprites
985 ; ********************************************************
986 ; ******************* Gestion de la souris ***************
987 ; ********************************************************
990 move.b $dff00a,d1 ; abscisse souris (absolue) JOY0DAT
992 move.b $dff00b,d0 ; ordonnée souris (absolue) JOY0DAT
995 sub.b PrecXmouse,d0 ; - précédente abscisse= déplacement relatif
996 cmp.b #127,d0 ; > 127, c'est que l'on a fait un tour complet
998 add.b #255,d0 ; on corrige
1001 sub.b PrecYmouse,d1 ; idem pour l'ordonnée
1007 ext.w d0 ; passage en .W (relatif, peut etre négatif)
1009 move.b d3,PrecYmouse ; nouvelle coordonnées absolues du système
1010 move.b d2,PrecXmouse
1011 add.w d0,Xmouse ; ajoute le mouvement relatif aux coordonnées du
1012 add.w d1,Ymouse ; programme (qui sont absolues)
1014 cmp.w #255,Xmouse ; dépasse-t-on à droite ?
1016 move.w Xmouse,d0 ; si oui, on déplace la fenetre
1017 move.w #255,Xmouse ; et on remet la valeur maximum
1022 tst.w Xmouse ; dépasse-t-on à gauche ?
1024 move.w Xmouse,d0 ; si oui, on déplace aussi la fenetre
1025 clr.w Xmouse ; et on met la valeur minimum
1028 cmp.w #255,Ymouse ; idem pour Y
1045 add.w #$a0,d0 ; coordonnées translatées dans le cadre écran
1049 add.w #8,d2 ; Y du bas du sprite
1051 move.w d0,d3 ; calcul des deux mots de controle en fonction
1052 lsr.w #1,d3 ; de HSTART, VSTART et VSTOP
1066 move.l SpriteCursor,a0 ; met en place les deux mots de controle
1073 dc.w $ff00,$fe00 ; une petit flèche 8*8
1082 dc.w $ff00,$ff00 ; un petit carré 8*8
1091 dc.w $d800,$d800 ; une petite mire 8*8
1109 ; ******************************************************
1110 ; *************** Routine du 'scrolling' **************
1111 ; ******************************************************
1114 tst.w FlagSuivre ; est-on-en mode suivie automatique ?
1116 tst.l AdrSelect ; une turmite est-elle sélectionnée ?
1118 move.l AdrSelect,a0 ; si oui
1119 tst.w V(a0) ; est-elle vivante ?
1122 move.w X(a0),d0 ; prend ses coordonnées
1123 sub.w #128,d0 ; centre
1124 move.w d0,Xwindow ; et les met dans celles de la fenetre
1130 move.w Xwindow,d0 ; on corrige éventuellement les
1131 bpl PasWindowGauche ; coordonnées de la fenetre
1153 move.w Xmouse,Xmousew ; coordonnées absolues de la souris dans
1154 add.w d0,Xmousew ; le terrain
1155 move.w Ymouse,Ymousew
1158 lsl.w #6,d1 ; calcule de l'adresse de départ des bitplanes
1170 move.l copper_list,a1 ; met le delay dans la copper-list
1177 move.w d0,6(a1) ; met l'adresse dans la copper-list
1182 add.l #$8000,d0 ; deuxième bitplan
1187 moveq #0,d4 ; gestion du sprite curseur de sélection
1190 beq PasSpriteSelection
1193 beq PasSpriteSelection
1196 bmi PasSpriteSelection
1198 bpl PasSpriteSelection
1201 bmi PasSpriteSelection
1203 bpl PasSpriteSelection
1205 add.w #$9d,d0 ; pareil que pour celui de la souris
1227 move.l SpriteSelect,a0
1234 ; ******************************************************
1235 ; ****************** Routines de l'IRQ *****************
1236 ; ******************************************************
1245 move.w #$20,$dff09c ; it vbl traitée INTREQ
1248 ; ******************************************************
1249 ; ***** Routine de gestion des sprites (début VBL) *****
1250 ; ******************************************************
1253 move.l SpriteCursor,$dff120 ; SPR0PT
1254 move.l SpriteSelect,$dff124 ; SPR1PT
1255 move.l SpriteNombre,d0
1256 move.l d0,$dff128 ; SPR2PT
1258 move.l d0,$dff12c ; SPR3PT
1259 move.l SpriteTableau,d0 ; 4 sprites pour le tableau
1260 move.l d0,$dff130 ; SPR4PT
1262 move.l d0,$dff134 ; SPR5PT
1264 move.l d0,$dff138 ; SPR6PT
1266 move.l d0,$dff13c ; SPR7PT
1269 ; ******************************************************
1270 ; **************** Routines du clavier *****************
1271 ; ******************************************************
1274 clr.w PointeurClavierRead ; vide les pointeurs du tampon
1275 move.w #1,PointeurClavierWrite
1276 lea ItClavier(pc),a0 ; en PC-relatif !
1277 move.l a0,$68 ; vecteur niveau 2 (clavier)
1278 move.b #%10001000,$bfed01 ; ICR, bit SP (fin de transfert série)
1279 move.w #$8008,$dff09a ; INTENA (IT CIA-A)
1283 movem.l a0/d0/d1,-(sp)
1284 move.w $dff01e,d0 ; INTREQ (read: IT CIA-A ?)
1289 btst #3,d0 ; pas clavier
1291 move.w PointeurClavierWrite,d1
1298 cmp.w PointeurClavierRead,d1
1299 beq TamponClavierSature
1300 lea TamponClavier(pc),a0
1302 move.w d1,PointeurClavierWrite
1303 TamponClavierSature:
1306 move.w #$0008,$dff09c ; INTREQ (IT traitée)
1308 movem.l (sp)+,a0/d0/d1
1314 move.w PointeurClavierRead,d1 ; pointeur relatif sur le tampon
1315 add.b #1,d1 ; touche suivante
1316 cmp.w PointeurClavierWrite,d1 ; a-t-on vidé le tampon ?
1318 move.b TamponClavier(pc,d1.w),d0 ; si non, on remet le code
1319 move.w d1,PointeurClavierRead ; sauve le pointeur
1320 move.l (sp)+,d1 ; et on revient
1323 not.w d0 ; code d'erreur -1
1327 PointeurClavierRead: dc.w 0
1328 PointeurClavierWrite: dc.w 0
1329 TamponClavier: ds.b 256
1333 move.b #%10000111,$bfd100
1336 move.l $68,save_vecteur_kbd
1337 move.l $6c,save_vecteur_irq
1338 move.w $dff01c,save_intena ; INTENA (read)
1339 or.w #$c000,save_intena
1340 move.w $dff002,save_dmacon ; DMACON (read)
1341 or.w #$8100,save_dmacon
1345 move.w #$7fff,$dff09a ; INTENA (write: clear all)
1346 move.w #$7fff,$dff096 ; DMACON (write: clear all)
1347 move.l save_vecteur_kbd,$68 ; vecteur IT clavier
1348 move.l save_vecteur_irq,$6c ; vecteur IT vbl
1349 move.w save_intena,$dff09a ; INTENA (write: remet les bits)
1350 move.w save_dmacon,$dff096 ; DMACON (write: remet les bits)
1353 jsr OldOpenLibrary(a6)
1355 move.l 38(a0),$dff080 ; COP1LC
1356 clr.w $dff088 ; COPJMP1
1358 jsr CloseLibrary(a6)
1363 save_vecteur_irq: dc.l 0
1364 save_vecteur_kbd: dc.l 0
1366 GraphicName: dc.b "graphics.library",0
1367 DosName: dc.b "dos.library",0
1368 IntuitionName: dc.b "intuition.library",0
1372 ; Table des caractères
1375 dc.w $0000,$0400,$0C00,$1C00,$0C00,$0400,0,0
1376 dc.w $0000,$1800,$1800,$1800,$1800,$1800,0,0
1377 dc.w $0000,$2000,$3000,$3800,$3000,$2000,0,0
1379 dc.w $00C0,$0120,$0120,$01E0,$0120,$0120,0,0
1380 dc.w $01C0,$0120,$01C0,$0120,$0120,$01C0,0,0
1381 dc.w $00E0,$0100,$0100,$0100,$0100,$00E0,0,0
1382 dc.w $01C0,$0120,$0120,$0120,$0120,$01C0,0,0
1384 dc.w $0006,$0009,$0009,$0009,$0009,$0006,0,0
1385 dc.w $0002,$0006,$000A,$0002,$0002,$0002,0,0
1386 dc.w $0006,$0009,$0001,$0002,$0004,$000F,0,0
1387 dc.w $0006,$0009,$0002,$0001,$0009,$0006,0,0
1388 dc.w $0008,$0008,$000A,$000F,$0002,$0002,0,0
1389 dc.w $000F,$0008,$000E,$0001,$0001,$000E,0,0
1390 dc.w $0007,$0008,$000E,$0009,$0009,$0006,0,0
1391 dc.w $000F,$0001,$0001,$0002,$0002,$0002,0,0
1392 dc.w $0006,$0009,$0006,$0009,$0009,$0006,0,0
1393 dc.w $0006,$0009,$0009,$0007,$0001,$000E,0,0
1407 dc.b d,B,1,a,A,0,a,B,0,a,B,0
1408 dc.b a,B,0,a,A,0,d,C,0,a,A,0
1409 dc.b a,B,0,a,A,0,a,D,0,a,A,0
1410 dc.b a,B,0,a,A,0,g,A,0,a,A,0
1413 dc.b " Ecrit par F.Fleuret, Novembre 1989 " ; je suis toujours possessif
1417 ds.l ntur ; Pile des adresses libres
1420 plan1: ds.l 1 ; pointeurs pour la CHIP-RAM réservée
1421 plan2: ds.l 1 ; Le Devpac se plante (et si !) si il
1422 SaveImage: ds.l 1 ; y a des DC.x dans le segment BSS
1424 SpriteCursor: ds.l 1
1425 SpriteSelect: ds.l 1
1426 SpriteTableau: ds.l 1
1428 SpriteNombre: ds.l 1