Obligement - L'Amiga au maximum

Vendredi 27 décembre 2024 - 01:50  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

Actualité (récente)
Actualité (archive)
Comparatifs
Dossiers
Entrevues
Matériel (tests)
Matériel (bidouilles)
Points de vue
En pratique
Programmation
Reportages
Quizz
Tests de jeux
Tests de logiciels
Tests de compilations
Trucs et astuces
Articles divers

Articles in English


Réseaux sociaux

Suivez-nous sur X




Liste des jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z,
ALL


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : Création d'une démo - chapitre 3, partie 2, les lutins
(Article écrit par Nori - octobre 2024)


Introduction

Nous voilà prêts pour un plongeon dans l'univers des lutins deuxième opus, un plongeon en eau claire, calme, apaisée, il n'y aura donc aucune difficulté à surnager tant le sujet est facile à appréhender, à un point tel que j'ai l'impression de vous vendre du vent.

Évoqué dernièrement, nous ferons évoluer notre programme de façon à ajouter un champ de lutins qui bougeront en parallaxe. L'effet que je vous propose ressemble à s'y méprendre aux champs étoilés tels qu'on peut les voir dans certaines vielles démos Amiga. Ces champs sont en général composés de lutins ayant une hauteur d'une seule ligne pour quelques pixels de large, quatre ou cinq tout au plus. Pour notre démo, j'ai volontairement considérablement grossi les étoiles de façon à rendre l'exemple plus parlant.

Un prérequis sera d'avoir lu la partie 1 de cet article que l'on peut trouver ici.

Principe

Nous allons utiliser la capacité d'afficher avec un seul canal DMA plusieurs lutins, cela n'est possible que s'ils ne se superposent pas verticalement. Sachant que nous choisissons de ne déplacer les lutins qu'horizontalement, cela devient donc très facile à appliquer car l'électronique de l'Amiga est parfaitement adaptée à ce type d'effet.

Avant de continuer, nous allons jeter un oeil sur un des effets d'une célèbre démo du groupe Scoopex : Mental Hangover. L'effet en question est un champ d'étoiles qui se déplace horizontalement, il est composé de trois plans qui bougent en (pseudo) parallaxe, exactement le même effet que l'on s'apprête à programmer.

Lutins
Champ d'étoiles bleues de la démo Mental Hangover/Scoopex

Voyons comment le programmeur s'y prend. Au tout début de la démo, pendant l'affichage de l'aigle, interrompez le déroulement du programme (utilisez Action Replay ou un émulateur), la routine qui gère le déplacement des étoiles se trouve à l'adresse $00000426. Ce sous-programme ne fait que 26 octets de long, c'est court, très court, mais amplement suffisant pour déplacer les étoiles latéralement sur trois plans distincts. Ce que nous indique ce bout de programme est que la première liste de lutins se trouve en $07F802, les étoiles pour chaque plan sont au nombre de 45 (le compteur de boucle vaut $2C), ce qui nous fait donc un total de 45*3=135 lutins. La boucle ne fait rien d'autre qu'incrémenter l'abscisse de chaque lutin des listes de respectivement 2, 4 et 6 pixels (en basse résolution).

; sous-routine deplacement lutins (etoiles)
$000426 41f9 0007 f803           lea $7f803,a0
$00042c 7e2c                     moveq #$2c,d7
$00042e 5610                     addq.b #$03,(a0)
$000430 5428 016c                addq.b #$02,$016c(a0)
$000434 5228 02d8                addq.b #$01,$02d8(a0)
$000438 5088                     addq.l #$08,a0
$00043a 51cf fff2                dbf .w d7,#$fff2
$00043e 4e75                     rts

; liste premier plan du champ d'etoiles (etoiles les plus rapides)
$7F802 2756 2800 0006 0003 2D9F 2E00 0006 0003
$7F812 3311 3400 0006 0003 3980 3A00 0006 0003
$7F822 3FD9 4000 0006 0003 4503 4600 0006 0003
$7F832 4B55 4C00 0006 0003 51A9 5200 0006 0003
$7F842 57C0 5800 0006 0003 5D6D 5E00 0006 0003
$7F852 63FE 6400 0006 0003 6937 6A00 0006 0003

Parallaxe

Revenons à notre démo, nous allons définir trois plans de déplacement distincts, avec une seule liste de lutins par plan. Chaque objet volant sera en seize couleurs, ce qui implique et oblige à combiner les lutins deux par deux (Cf. partie de l'article précédent sur les lutins). Voilà comment nous allons distribuer les huit lutins :
  • Champ d'avant-plan composé de quatre lutins pour obtenir un objet de 32 pixels de large pour une hauteur de huit lignes :

    Une étoile de ce champ composée de quatre lutins ressemble à ceci :

    Lutins

    Cet objet a une largeur de 32 pixels, sachant qu'il s'agit de lutins en seize couleurs, il faut donc : 2x2=4 lutins en tout pour composer une étoile du premier plan.

  • Champ intermédiaire composé de lutins pour un objet de 16 pixels x 6 lignes :

    Lutins

    La largeur de l'objet est exactement de seize pixels, nous n'avons besoin que de deux lutins pour le représenter. Oui deux lutins de quatre couleurs parfaitement superposés nous donnent à l'affichage un lutin de seize couleurs (Cf. article précédent).

  • Champ d'arrière-plan composé de lutins de 16 pixels x 4 lignes :
Lutins

Ici, même remarque que pour le plan intermédiaire.

Convertisseurs

Nous avons dessiné nos lutins (sous Deluxe Paint ou autre), nos fichiers sauvés en IFF, il nous faut à présent les convertir en format compréhensible par l'électronique de l'Amiga. Pour ce faire, IFFMaster est notre allié.

Avant de charger le fichier image de notre étoile, veillez à correctement paramétrer les caractéristiques des fichiers de sortie :

Lutins

Après chargement de l'image, il faudra sélectionner l'étoile, la sélection horizontale devra avoir une taille de seize pixels de largeur, pour un dessin plus large que seize pixels, il faudra traiter chaque tranche de seize pixels une à une.

Lutins

La sélection achevée, aller dans le menu et sauver le fichier lutin tel quel :

Lutins

Voilà, les fichiers ainsi convertis sont prêts à être embarqués dans notre programme.

Commentaire du programme

Liste Copper

Comme d'habitude, nous allons débuter par la construction de la liste Copper, du moins la partie qui a en charge les lutins.

          ; palette lutins

          lea pall(pc),a1                          ; liste palette source
          move.w #$01a0,d0                         ; 1er registre couleur
          move.w #16-1,d7                          ; nb de couleurs
.lc:                                               ;
          move.w d0,(a0)+                          ; registre couleur
          move.w (a1)+,(a0)+                       ; couleur
          addq.w #2,d0                             ; incremente registre couleur
          dbf d7,.lc                               ;

Ce bout de programme charge la palette des lutins, ici seize couleurs sont chargées. On pourrait ne charger que douze couleurs (les quatre autres correspondent aux couleurs transparentes) mais j'ai voulu, une fois de plus, simplifier.

          ; pointeurs lutins

          lea ptlut(pc),a1                         ; liste des pointeurs donnees lutins
          move.w #$0120,d0                         ; registre pointeur
          moveq #16-1,d7                           ;
.lp:                                               ;
          move.l (a1)+,d1                          ; pt lutin
          beq.b .e                                 ; sortie boucle si fin de liste
          move.w d0,(a0)+                          ; registre pointeur partie haute
          swap d1                                  ; partie haute adresse lutin
          move.w d1,(a0)+                          ; partie haute adresse lutin
          addq.w #2,d0                             ;
          move.w d0,(a0)+                          ; registre pointeur partie basse
          addq.w #2,d0                             ;
          swap d1                                  ; partie basse adresse lutin
          move.w d1,(a0)+                          ; partie basse adresse lutin
          bra.b .lp                                ; tt prochain lutin
.e:

Nous chargeons les pointeurs des lutins ($DFF120,$DFF122,...) avec les adresses des listes lutins correspondants aux étoiles des champs.

  • $DFF120,$DFF122,$DFF124,$DFF126,$DFF128,$DFF12A,$DFF12C,$DFF12E sont chargés avec l'étoile, la grosse (32x8 pixels).

  • $DFF130,$DFF132,$DFF134,$DFF136 sont chargés avec les lutins correspondants à l'étoile moyenne (16x6 pixels).

  • $DFF138,$DFF13A,$DFF13C,$DFF13E sont chargés avec les lutins correspondants à la petite étoile (16x4 pixels).

Initialisation

La toute première initialisation consiste à dupliquer les lutins de chaque liste. Les étoiles de chaque plan étant identiques, nous n'avons donc qu'à copier le premier lutin dans tous les lutins de la liste.

Voici à quoi ressemble la liste de nos lutins, le premier lutin de chaque liste est le seul renseigné. Au passage, vous remarquerez le bit "AT" ($0080) activé dans chaque mot de contrôle du lutin impair, ceci nous permet d'afficher des lutins en seize couleurs.

              ; liste lutins 32x8 pairs

lut0:         dc.w $0000,$0000
              dc.w $2666,$1E1E,$6666,$1E1E,$E666,$1E1E,$E666,$1E1E
              dc.w $E666,$1E1E,$E666,$1E1E,$6666,$1E1E,$2666,$1E1E
flut0:
              blk.b NBLG*(flut0-lut0),0
              dc.w $0000,$0000                                       ; fin de liste

              ; liste lutins 32x8 impairs x4

lut1:         dc.w $0000,$0080
              dc.w $01FE,$0001,$01FE,$0001,$01FE,$0001,$01FE,$0001
              dc.w $01FE,$0001,$01FE,$0001,$01FE,$0001,$01FE,$0001
flut1:
              blk.b NBLG*(flut1-lut1),0
              dc.w $0000,$0000                                       ; fin de liste

              ; liste lutins 32x8 pairs

lut2:         dc.w $0000,$0000
              dc.w $1998,$0784,$1998,$0786,$1998,$0787,$1998,$0787
              dc.w $1998,$0787,$1998,$0787,$1998,$0786,$1998,$0784
flut2:
              blk.b NBLG*(flut2-lut2),0                              ; 3 autres lutins
              dc.w $0000,$0000                                       ; fin de liste

              ; liste lutins 32x8 impairs x4

lut3:         dc.w $0000,$0080
              dc.w $007C,$FFFC,$007E,$FFFE,$007F,$FFFF,$007F,$FFFF
              dc.w $007F,$FFFF,$007F,$FFFF,$007E,$FFFE,$007C,$FFFC
flut3:
              blk.b NBLG*(flut3-lut3),0                              ; 3 autres lutins
              dc.w $0000,$0000                                       ; fin de liste

              ; liste lutins 16x6 pairs x7

lut4:         dc.w $0000,$0000
              dc.w $2670,$1E0C,$E673,$1E0F,$E673,$1E0F,$E673,$1E0F
              dc.w $E673,$1E0F,$2670,$1E0C
flut4:
              blk.b NBLM*(flut4-lut4),0                              ; 6 autres lutins
              dc.w $0000,$0000                                       ; fin de liste

              ; liste lutins 16x6 impairs x7

lut5:         dc.w $0000,$0080
              dc.w $01FC,$0000,$01FF,$0000,$01FF,$0000,$01FF,$0000
              dc.w $01FF,$0000,$01FC,$0000
flut5:
              blk.b NBLM*(flut5-lut5),0                              ; 6 autres lutins
              dc.w $0000,$0000                                       ; fin de liste

              ; liste lutins 16x4 pairs x11

lut6:         dc.w $0000,$0000
              dc.w $6300,$1F00,$E300,$1F00,$E300,$1F00,$6300,$1F00
flut6:
              blk.b NBLP*(flut6-lut6),0                              ; 11 autres lutins
              dc.w $0000,$0000                                       ; fin de liste

              ; liste lutins 16x4 impairs x11
lut7:         dc.w $0000,$0080
              dc.w $0080,$0000,$00C0,$0000,$00C0,$0000,$0080,$0000
flut7:
              blk.b NBLP*(flut7-lut7),0                              ; 11 autres lutins
              dc.w $0000,$0000                                       ; fin de liste

Il suffit donc de simplement dupliquer les données des lutins le long de la liste (mots de contrôle inclus).

              ; duplique lutins dans liste

              lea ptlut(pc),a0                  ; liste des lutins de reference pour copie
              lea nlutc(pc),a1                  ; nb de copie par lutin
              lea tlut(pc),a2                   ; table taille lutin
              move.w #8-1,d7                    ; 8 listes lutins
 .c0:                                           ;
              move.l (a0)+,a3                   ; pt vers lutin
              move.l a3,a5                      ;
              move.l (a2)+,d6                   ; taille d'un lutin
              lea (a3,d6.w),a4                  ; adr depart copie
              subq.w #1,d6                      ; compteur pr copie
              move.w d6,d4                      ;
              moveq #0,d5                       ;
              move.b (a1)+,d5                   ;
              subq.w #2,d5                      ; compteur pr copie
.c1:                                            ;
              move.l a5,a3                      ; adr source corrigee
              move.w d4,d6                      ; compteur copie
.c2:                                            ;
              move.b (a3)+,(a4)+                ; duplique lutin
              dbf d6,.c2                        ; copie d'un lutin
              dbf d5,.c1                        ; copie prochaine lutin de la liste
              dbf d7,.c0                        ; tt prochaine liste lutins

La seconde des initialisations correspond à celles des ordonnées des lutins. Les étoiles sont distribuées aléatoirement dans la zone rectangulaire occupée par le logo. Cependant, verticalement les étoiles ne sont pas positionnées aléatoirement, car il y a la contrainte que les lutins de chaque plan (trois plans) ne doivent pas se superposer, ni même se trouver collées l'une sous l'autre. Bien évidemment les ordonnées respectives doivent être croissantes. Nous avons entré les ordonnées des trois listes dans trois tables manuellement :

               ; ordonnees des 3 listes de lutins

coorlut0:      dc.b $2c+04,$2c+16,$2c+32,$2c+48                       ;  4x ordonnees lutins taille 32x8
               dc.b 0                                                 ;  marqueur de fin de liste
coorlut1:      dc.b $2c+00,$2c+08,$2c+16,$2c+24,$2c+38,$2c+48,$2c+58  ;  7x ordonnees lutins taille 16x6
               dc.b 0                                                 ;  marqueur de fin de liste
coorlut2:      dc.b $2c+02,$2c+08,$2c+16,$2c+22,$2c+30,$2c+37,$2c+44  ;  11x ordonnees lutins taille 16x4
               dc.b $2c+51,$2c+58,$2c+64,$2c+70                       ;
               dc.b 0                                                 ;  marqueur de fin de liste

Vous remarquerez que la première liste contient quatre lutins, la deuxième sept, et la troisième onze. La zone étant étroite verticalement (64 pixels de haut) et les lutins relativement gros, on ne peut donc en placer énormément.

Il suffit maintenant de récupérer les ordonnées de ces tables pour les injecter dans les mots de contrôle des lutins. Ce que fait cette routine :

            ; init ordonnees lutins champs etoiles -grandes-

            lea coorlut0(pc),a0                                 ; ordonnees
            lea lut0,a1                                         ; liste lutins pairs -grande taille
            lea lut1,a2                                         ; liste lutins impairs -grande taille
            lea lut2,a3                                         ; 2eme partie lutin
            lea lut3,a4                                         ; 2eme partie lutin
            moveq #NBLG-1,d7                                    ; nb-1 lutins
.0:                                                             ;
            move.b (a0)+,d0                                     ; y
            move.b d0,(a1)                                      ;
            move.b d0,(a2)                                      ;
            move.b d0,(a3)                                      ;
            move.b d0,(a4)                                      ;
            addq.b #TGL,d0                                      ;
            move.b d0,2(a1)                                     ; y+hauteur+1
            move.b d0,2(a2)                                     ; idem pour lutin impair
            move.b d0,2(a3)                                     ; idem 2eme partie lutin
            move.b d0,2(a4)                                     ; idem 2eme partie lutin
            lea flut0-lut0(a1),a1                               ; passe au prochain lutin de la liste
            lea flut0-lut0(a2),a2                               ; idem pour lutin impair
            lea flut0-lut0(a3),a3                               ; idem 2eme partie lutin
            lea flut0-lut0(a4),a4                               ; idem 2eme partie lutin
            dbf d7,.0                                           ; tt prochain lutin

            ; init ordonnees lutins champs etoiles -moyennes-

            lea coorlut1(pc),a0                                 ; ordonnees
            lea lut4,a1                                         ; liste lutins
            lea lut5,a2                                         ; 2eme partie lutin
            moveq #NBLM-1,d7                                    ; nb-1 lutins
.1:                                                             ;
            move.b (a0)+,d0                                     ; y
            move.b d0,(a1)                                      ;
            move.b d0,(a2)                                      ;
            addq.b #TML,d0                                      ;
            move.b d0,2(a1)                                     ; y+hauteur+1
            move.b d0,2(a2)                                     ; idem pour lutin impair
            lea flut4-lut4(a1),a1                               ; passe au prochain lutin de la liste
            lea flut5-lut5(a2),a2                               ; idem pour lutin impair
            dbf d7,.1                                           ; tt prochain lutin

            ; init ordonnees lutins champs etoiles -petites-

            lea coorlut2(pc),a0                                 ; ordonnees
            lea lut6,a1                                         ; liste lutins
            lea lut7,a2                                         ; 2eme partie lutin
            moveq #NBLP-1,d7                                    ; nb-1 lutins
.2:                                                             ;
            move.b (a0)+,d0                                     ; y
            move.b d0,(a1)                                      ;
            move.b d0,(a2)                                      ;
            addq.b #TPL,d0                                      ;
            move.b d0,2(a1)                                     ; y+hauteur+1
            move.b d0,2(a2)                                     ; idem pour lutin impair
            lea flut6-lut6(a1),a1                               ; passe au prochain lutin de la liste
            lea flut7-lut7(a2),a2                               ; idem pour lutin impair
            dbf d7,.2                                           ; tt prochain lutin

L'initialisation horizontale, quant à elle, est une autre affaire, nous pouvons sans contrainte distribuer aléatoirement les abscisses.

Pour ce faire, nous avons donc ajouté une routine qui génère aléatoirement des abscisses pour chaque lutin de la liste. Petite difficulté (un bien grand mot) supplémentaire, les abscisses des lutins associés pour être affichés en seize couleurs doivent être rigoureusement identiques.

La période des nombres générés aléatoirement n'est pas d'une grande amplitude mais, pour notre cas, elle suffit amplement.

            ; genere des abscisses pseudo aleatoires lutins
                                             
            moveq #0,d0                      ; genere une racine base de
            lea $dff000,a6                   ; la generation nbre aleatoire
            move.w 6(a6),d0                  ;
            lsl.w #8,d0                      ;
            nop                              ;
            move.b 7(a6),d0                  ; racine

            lea ptlut(pc),a0                 ; liste des lutins
            lea nlut(pc),a1                  ; liste nb de nbre aleatoire a generer par lutin
            lea lluti(pc),a2                 ; liste taille lutins (en octets)
            lea llut(pc),a3                  ; liste taille entre deux lutins (en octets)
            moveq #4-1,d7                    ; nb-1 de paires de lutins a traiter
.3:                                          ;
            move.w d0,d1                     ; copie racine

            move.l (a0),a4                   ; pointeur vers mot controle lutin
            move.l (a2)+,d3                  ; distance entre lutin pair/impair
            move.l (a3)+,d2                  ; taille d'un lutin
            moveq #0,d6                      ;
            move.b (a1)+,d6                  ;
            subq.w #1,d6                     ; nb-1 lutins de la liste
.4:                                          ;
            lsl.w #5,d1                      ;
            add.w d0,d1                      ;
            addq.w #1,d1                     ; nb aleatoire
            move.w d1,d0                     ; nouvelle racine

            move.b d1,1(a4)                  ; abscisse lutin
            move.b d1,1(a4,d3.w)             ; meme abscisse lutin impair
            add.w d2,a4                      ; prochain lutin liste
            dbf d6,.4                        ;
            addq.w #8,a0                     ; prochain lutin pair
            dbf d7,.3                        ; prochain nbre
            rts

Nous en avons fini avec l'initialisation, passons au traitement des lutins qui se trouvent dans la boucle principale. Il consiste en toute simplicité à déplacer horizontalement chaque lutin. Pour ce faire, tout ce que nous avons à faire est d'incrémenter l'abscisse dans le mot de contrôle de chaque lutin. Autre astuce pour simplifier le traitement, nous n'incrémentons que H1-H8, qui se trouvent dans l'octet de poids faible du premier mot de contrôle, on ne peut plus simple car une unique instruction d'incrémentation suffit : addq.b #x,mot de contrôle. La contrainte est que les abscisses des lutins ne peuvent être que paires car le bit H0 n'est pas activé ni altéré. Si le bit H0 était activé, les abscisses seraient toutes impaires.

Lutins
Extrait de La Bible De L'Amiga © Micro Application

            ; deplacement etoiles -grandes-
                                            
            lea lut0+1,a1                      ; liste lutins pairs -grande taille
            lea lut1+1,a2                      ; liste lutins impairs -grande taille
            lea lut2+1,a3                      ; liste 2eme partie lutins pairs -grande taille
            lea lut3+1,a4                      ; liste 2eme partie lutins impairs -grande taille
            moveq #4-1,d7                      ; nb-1 lutins
.0:                                            ;
            move.b (a1),d0                     ;
            addq.b #VGL,d0                     ; deplacement de 6 pixels a droite
            move.b d0,(a1)                     ; injecte nouvelle abscisse
            move.b d0,(a2)                     ; idem pour lutin impair
            addq.b #8,d0                       ; abscisse 2eme partie lutins
            move.b d0,(a3)                     ; injecte nouvelle abscisse
            move.b d0,(a4)                     ; idem pour lutin impair

            lea flut0-lut0(a1),a1              ; passe au prochain lutin de la liste
            lea flut0-lut0(a2),a2              ; idem pour lutin impair
            lea flut0-lut0(a3),a3              ; passe au prochain lutin de la liste
            lea flut0-lut0(a4),a4              ; idem pour 2eme partie lutins
            dbf d7,.0                          ;

            ; deplacement etoiles -moyennes-

            lea lut4+1,a1                      ; liste lutins pairs -grande taille
            lea lut5+1,a2                      ; liste lutins impairs -grande taille
            moveq #7-1,d7                      ; nb-1 lutins
.1:                                            ;
            move.b (a1),d0                     ;
            addq.b #VML,d0                     ; deplacement de 4 pixels a droite
            move.b d0,(a1)                     ; injecte nouvelle abscisse
            move.b d0,(a2)                     ; idem pour lutin impair

            lea flut4-lut4(a1),a1              ; passe au prochain lutin de la liste
            lea flut5-lut5(a2),a2              ; idem pour lutin impair
            dbf d7,.1                          ;

            ; deplacement etoiles -petites-

            lea lut6+1,a1                      ; liste lutins pairs -grande taille
            lea lut7+1,a2                      ; liste lutins impairs -grande taille
            moveq #11-1,d7                     ; nb-1 lutins
.2:                                            ;
            move.b (a1),d0                     ;
            addq.b #VPL,d0                     ; deplacement de 2 pixels a droite
            move.b d0,(a1)                     ; injecte nouvelle abscisse
            move.b d0,(a2)                     ; idem pour lutin impair

            lea flut6-lut6(a1),a1              ; passe au prochain lutin de la liste
            lea flut7-lut7(a2),a2              ; idem pour lutin impair
            dbf d7,.2                          ;

Vous aurez remarqué que c'est exactement ce que fait la routine du champ d'étoiles de la démo de Scoopex, à la petite différence que ses étoiles à lui ont toute la même hauteur, soit une seule ligne.

Nous sommes arrivés au programme complet, plus bas. Même s'il manque encore quelques éléments, le résultat commence à ressembler étrangement à une démo.

Je vous laisse à la lecture et la compréhension du programme et je vous donne rendez-vous pour un prochain article traitant du Blitter et plus particulièrement de l'affichage des BOB. Ce n'est pas extrêmement compliqué (le mode copie de blocs en tout cas) mais cela nécessite tout de même pas mal d'explications.

Lutins
Champ d'étoiles bougeant en parallaxe sous le logo

Dernière remarque

Le positionnement simpliste des lutins de ce genre est guidé par la simplicité de l'effet, un cas particulier, donc simplifié à outrance. Si on devait positionner librement un lutin n'importe où à l'écran, voici ce à quoi ressemblerait la routine renseignant les mots de contrôle. Je n'ai pas testé cette routine et à dire vrai, je n'ai jamais programmé ce type de routine auparavant, mais à la relecture cela me semble correct (combien de fois ne me suis-je trompé avec une telle affirmation ?). La difficulté de ce programme réside dans le fait que les bits sont esseulés, mélangés dans le deuxième mot de contrôle, il faut donc à coup de décalage et activation de bits rétablir la cohérence du tout.

Personnellement, je n'ai jamais utilisé ce genre de petit programme tel que celui ci-dessous. Pour positionner un lutin à l'écran, je lui préfère et je crois que tous les autres programmeurs aussi, la méthode qui met en scène deux tables précalculées. L'une contient tous les premiers mots de contrôle pour chaque abscisse, l'autre tous les deuxièmes mots de contrôle pour chaque ordonnée. Ainsi donc, si je veux afficher un lutin à la position (x,y), il suffit d'aller piocher dans la table le mot de contrôle en utilisant comme index de tables 2x et 2y (x et y sont les coordonnées du lutin). Plus simple, ce serait indécent. Il y a tout de même une contrainte et non des moindres, la hauteur du lutin ne peut être changée à la volée, il faudrait recalculer une autre table en fonction de la hauteur changeante. Si vous utilisez des lutins à hauteur fixe et possédez un Amiga 500 de base, cette méthode est la plus rapide.

HAUTEURLUTIN = 16
            ; init : parametres entree

            move.w #2,d0                                         ; abscisse lutin
            move.w #211,d1                                       ; ordonnee lutin
            bsr lutin                                            ; renseigne mots controle
            rts

            ; positionne lutin
            ; entree : d0 = x d1 = y
            ; sortie :
            ; regs   : d0/d1/d2/d3
lutin:
            ; traitement H0

            move.w #%0000000000000000,d2                         ; deuxieme mot controle lutin
            and.w #$01ff,d0                                      ; abscisse dans l'intervalle [0,511]
            lsr #1,d0                                            ; recupere H0 dans le drapeau C
            bcc.b .0                                             ; C = 0 ?
            bset #0,d2                                           ; non alors H0 = 1
            bra.b .1                                             ;
.0:                                                              ;
            bclr #0,d2                                           ; oui alors H0 = 0
.1:
            ; traitment E8

            cmp.w #255,d1                                        ; y > 255 ?
            bcs.b .2                                             ;
            bset #2,d2                                           ; oui alors active E8
            bra.b .3                                             ;
.2:                                                              ;
            bclr #2,d2                                           ; non alors desactive E8
.3:
            move.w d1,d3                                         ;

            ; traitment L8

            add.w #HAUTEURLUTIN,d1                               ; ordonnee + 1 de la derniere ligne lutin
            cmp.w #255,d1                                        ; y > 255 ?
            bcs.b .4                                             ;
            bset #1,d2                                           ; oui alors active L8
            bra.b .5                                             ;
.4:                                                              ;
            bclr #1,d2                                           ; non alors desactive L8
.5:
            ; fusionne x/2 et y/2 dans 1er mot de controle

            lsl.w #8,d3                                          ; decale Ex dans octet superieur du 1er mot de controle
            add.w d3,d0                                          ; 1er mot de controle
            move.w d0,motcontrole                                ; injecte dans premier mot de controle du lutin
            move.w d2,motcontrole+2                              ; injecte dans second mot de controle du lutin
            rts

Programme

                  ; **************************************************
                  ; *                                                *
                  ; *                 DEMO OBLIGEMENT                *
                  ; *                                                *
                  ; **************************************************

                  ; date:                       aout 2023
                  ; auteur:                     NoRi
                  ; plateforme:                 Amiga OCS (512 ko minimum)
                  ; compileur/linkeur:          ASm-One ou VASM + VLINK
                  ; publication:                Amiga Obligement


                  INCDIR     ""                                          ; recherche fichiers et donnees dans le repertoire

                  section    programme,code_p                            ; hunk pour DOS, alloue memoire pour code

DEBUG          = 0                                                       ; drapeau activation des parties code pour debogage

                  ; constantes ecran

LECRAN         = 320                                                     ; largeur ecran video affichage
HECRAN         = 256                                                     ; hauteur ecran video affichage

                  ; donnees affichage ecran (centrage affichage)

XSTRT          = 129                                                     ; position de depart
XSTOP          = XSTRT+LECRAN                                            ; 129+320
YSTRT          = $2c                                                     ;
YSTOP          = YSTRT+HECRAN                                            ;
HSTRT          = XSTRT-16                                                ; 129-16
RES            = 8                                                       ; 8=basse resolution (4=haute resolution)

                  ; **************************************************
                  ; *          CONSTANTES ECRAN PRINCIPAL            *
                  ; **************************************************

NBP            = 0                                                       ; nb de plan de bits
WS             = LECRAN                                                  ; largeur ecran de travail
HS             = HECRAN                                                  ; hauteur ecran de travail

                  ; **************************************************
                  ; *                CONSTANTES RASTERS              *
                  ; **************************************************

COLB            = $0000                                                  ; couleur bordure
NBB             = 16                                                     ; nb de barres rasters
HBR             = 16                                                     ; hauteur en pixel d'une barre

                  ; **************************************************
                  ; *                CONSTANTES LOGO                 *
                  ; **************************************************

HL              = 64                                                     ; hauteur en pixels logo
LL              = 640                                                    ; largeur en pixels logo
NBPDBL          = 1                                                      ; nb de plans de bits partie logo
WL              = WS                                                     ; largeur ecran logo, DMA*16

                  ; **************************************************
                  ; *               CONSTANTES LUTINS                *
                  ; **************************************************

NBLG           = 4                                                       ; nb de grands lutins champ etoile
NBLM           = 7                                                       ; nb de moyens lutins champ etoile
NBLP           = 11                                                      ; nb de petits lutins champ etoile
TGL            = 8                                                       ; hauteur lutins -grands
TML            = 6                                                       ; hauteur lutins -moyens
TPL            = 4                                                       ; hauteur lutins -petits
VGL            = 5                                                       ; vitesse champs de lutins -grands
VML            = 2                                                       ; vitesse champs de lutins -moyens
VPL            = 1                                                       ; vitesse champs de lutins -petits

                  ; ***************************************************
                  ; *                 MACRO DEFINITION                *
                  ; ***************************************************

                  ; macro d'attente de la liberation du blitter
waitblt           MACRO
                  tst.b        $02(a6)                                   ; evite bug A4000
.\@               btst        #6,$02(a6)                                 ;
                  bne.b        .\@                                       ;
                  ENDM

debut:
                  ; **************************************************
                  ; *                  INIT GENERALES                *
                  ; **************************************************

                  bsr sauvesys                                           ; pas terrible a remplacer par qqch de plus solide

                  lea $dff000,a6                                         ; adresse de base registres specialises de l'amiga
                  waitblt                                                ; on s'assure que le blitter ait fini
                  bsr initcopvide                                        ; genere la liste copper vide
                  move.w #$7fff,$96(a6)                                  ; desactive tous les DMA

                  lea $dff000,a6                                         ; attend d'etre dans la zone non affichable
                  move.l #300<<8,d1                                      ; avant de continuer
                  bsr vbl                                                ;

                  move.w #$83e0,$96(a6)                                  ; active DMA pdb,copper,blitter
                  move.w #$7fff,$9a(a6)                                  ; coupe interruptions
                  bsr init                                               ; inits generales

                  ; **************************************************
                  ; *                                                *
                  ; *                BOUCLE PRINCIPALE               *
                  ; *                                                *
                  ; **************************************************

bouclep:
                  lea $dff000,a6                                         ; synchro verticale
                  move.l #280<<8,d1                                      ;
                  bsr vbl                                                ;

                  move.l principal,a0                                    ; recupere pointeur vers routine principale en cours
                  jsr (a0)                                               ; tt principal

                  btst.b     #6,$bfe001                                  ; test bouton gauche souris appuye ?
                  bne.b      bouclep                                     ; non alors continue la boucle
exit:                                                                    ; oui
                  bsr restauresys                                        ; pas terrible a remplacer par qqch de plus solide
                  clr.l d0                                               ; code retour Amiga DOS
                  rts                                                    ; sortie vers DOS

                  ; **************************************************
                  ; *                                                *
                  ; *             SOUS-ROUTINES GENERALES            *
                  ; *                                                *
                  ; **************************************************

                  ; synchro verticale
                  ; entree: d1 = position verticale raster * 256
                  ;         a6 = $dff000
                  ; sortie:
                  ; regs  : d0/d1/d2
vbl:
                  move.l #$1ff00,d2                                      ; masque
.1:                                                                      ;
                  move.l     $04(a6),d0                                  ; position faisceau a electron en cours
                  and.l      d2,d0                                       ;
                  cmp.l      d1,d0                                       ; position atteinte ?
                  bne.b      .1                                          ; non
                  rts                                                    ; oui commence tt trame

sauvesys:
                  move.b #%10000111,$bfd100                              ;
                  move.w $dff01c,sintena                                 ;
                  or.w #$c000,sintena                                    ;
                  move.w $dff002,sdmacon                                 ;
                  or.w #$8100,sdmacon                                    ;
                  rts                                                    ;
restauresys:
                  move.w #$7fff,$dff09a                                  ;
                  move.w sintena,$dff09a                                 ;
                  move.w #$7fff,$dff096                                  ;
                  move.w sdmacon,$dff096                                 ;
                  move.l 4,a6                                            ;
                  lea nom_glib,a1                                        ;
                  moveq #0,d0                                            ;
                  jsr -552(a6)                                           ;
                  move.l d0,a0                                           ;
                  move.l 38(a0),$dff080                                  ;
                  clr.w $dff088                                          ;
                  move.l 4,a6                                            ;
                  jsr -138(a6)                                           ;
                  rts


                  ; *************************************************
                  ; *                                               *
                  ; *                INITIALISATIONS                *
                  ; *                                               *
                  ; *************************************************
init:
                  move.l #initpart6,principal                            ; init pt routine principale

                  ; duplique lutins dans liste

                  lea ptlut(pc),a0                                       ; liste des lutins de reference pour copie
                  lea nlutc(pc),a1                                       ; nb de copie par lutin
                  lea tlut(pc),a2                                        ; table taille lutin
                  move.w #8-1,d7                                         ; 8 listes lutins
 .c0:                                                                    ;
                  move.l (a0)+,a3                                        ; pt vers lutin
                  move.l a3,a5                                           ;
                  move.l (a2)+,d6                                        ; taille d'un lutin
                  lea (a3,d6.w),a4                                       ; adr depart copie
                  subq.w #1,d6                                           ; compteur pr copie
                  move.w d6,d4                                           ;
                  moveq #0,d5                                            ;
                  move.b (a1)+,d5                                        ;
                  subq.w #2,d5                                           ; compteur pr copie
.c1:                                                                     ;
                  move.l a5,a3                                           ; adr source corrigee
                  move.w d4,d6                                           ; compteur copie
.c2:                                                                     ;
                  move.b (a3)+,(a4)+                                     ; duplique lutin
                  dbf d6,.c2                                             ; copie d'un lutin
                  dbf d5,.c1                                             ; copie prochaine lutin de la liste
                  dbf d7,.c0                                             ; tt prochaine liste lutins

                  ; init ordonnees lutins champs etoiles -grandes-

                  lea coorlut0(pc),a0                                    ; ordonnees
                  lea lut0,a1                                            ; liste lutins pairs -grande taille
                  lea lut1,a2                                            ; liste lutins impairs -grande taille
                  lea lut2,a3                                            ; 2eme partie lutin
                  lea lut3,a4                                            ; 2eme partie lutin
                  moveq #NBLG-1,d7                                       ; nb-1 lutins
.0:                                                                      ;
                  move.b (a0)+,d0                                        ; y
                  move.b d0,(a1)                                         ;
                  move.b d0,(a2)                                         ;
                  move.b d0,(a3)                                         ;
                  move.b d0,(a4)                                         ;
                  addq.b #TGL,d0                                         ;
                  move.b d0,2(a1)                                        ; y+hauteur+1
                  move.b d0,2(a2)                                        ; idem pour lutin impair
                  move.b d0,2(a3)                                        ; idem 2eme partie lutin
                  move.b d0,2(a4)                                        ; idem 2eme partie lutin
                  lea flut0-lut0(a1),a1                                  ; passe au prochain lutin de la liste
                  lea flut0-lut0(a2),a2                                  ; idem pour lutin impair
                  lea flut0-lut0(a3),a3                                  ; idem 2eme partie lutin
                  lea flut0-lut0(a4),a4                                  ; idem 2eme partie lutin
                  dbf d7,.0                                              ; tt prochain lutin

                  ; init ordonnees lutins champs etoiles -moyennes-

                  lea coorlut1(pc),a0                                    ; ordonnees
                  lea lut4,a1                                            ; liste lutins
                  lea lut5,a2                                            ; 2eme partie lutin
                  moveq #NBLM-1,d7                                       ; nb-1 lutins
.1:                                                                      ;
                  move.b (a0)+,d0                                        ; y
                  move.b d0,(a1)                                         ;
                  move.b d0,(a2)                                         ;
                  addq.b #TML,d0                                         ;
                  move.b d0,2(a1)                                        ; y+hauteur+1
                  move.b d0,2(a2)                                        ; idem pour lutin impair
                  lea flut4-lut4(a1),a1                                  ; passe au prochain lutin de la liste
                  lea flut5-lut5(a2),a2                                  ; idem pour lutin impair
                  dbf d7,.1                                              ; tt prochain lutin

                  ; init ordonnees lutins champs etoiles -petites-

                  lea coorlut2(pc),a0                                    ; ordonnees
                  lea lut6,a1                                            ; liste lutins
                  lea lut7,a2                                            ; 2eme partie lutin
                  moveq #NBLP-1,d7                                       ; nb-1 lutins
.2:                                                                      ;
                  move.b (a0)+,d0                                        ; y
                  move.b d0,(a1)                                         ;
                  move.b d0,(a2)                                         ;
                  addq.b #TPL,d0                                         ;
                  move.b d0,2(a1)                                        ; y+hauteur+1
                  move.b d0,2(a2)                                        ; idem pour lutin impair
                  lea flut6-lut6(a1),a1                                  ; passe au prochain lutin de la liste
                  lea flut7-lut7(a2),a2                                  ; idem pour lutin impair
                  dbf d7,.2                                              ; tt prochain lutin

                  ; genere des abscisses pseudo aleatoires lutins

                  moveq #0,d0                                            ; genere une racine base de
                  lea $dff000,a6                                         ; la generation nbre aleatoire
                  move.w 6(a6),d0                                        ;
                  lsl.w #8,d0                                            ;
                  nop                                                    ;
                  move.b 7(a6),d0                                        ; racine

                  lea ptlut(pc),a0                                       ; liste des lutins
                  lea nlut(pc),a1                                        ; liste nb de nbre aleatoire a generer par lutin
                  lea lluti(pc),a2                                       ; liste taille lutins (en octets)
                  lea llut(pc),a3                                        ; liste taille entre deux lutins (en octets)
                  moveq #4-1,d7                                          ; nb-1 de paires de lutins a traiter
.3:                                                                      ;
                  move.w d0,d1                                           ; copie racine

                  move.l (a0),a4                                         ; pointeur vers mot controle lutin
                  move.l (a2)+,d3                                        ; distance entre lutin pair/impair
                  move.l (a3)+,d2                                        ; taille d'un lutin
                  moveq #0,d6                                            ;
                  move.b (a1)+,d6                                        ;
                  subq.w #1,d6                                           ; nb-1 lutins de la liste
.4:                                                                      ;
                  lsl.w #5,d1                                            ;
                  add.w d0,d1                                            ;
                  addq.w #1,d1                                           ; nb aleatoire
                  move.w d1,d0                                           ; nouvelle racine

                  move.b d1,1(a4)                                        ; abscisse lutin
                  move.b d1,1(a4,d3.w)                                   ; meme abscisse lutin impair
                  add.w d2,a4                                            ; prochain lutin liste
                  dbf d6,.4                                              ;
                  addq.w #8,a0                                           ; prochain lutin pair
                  dbf d7,.3                                              ; prochain nbre
                  rts

nlut:             dc.b NBLG,NBLG,NBLM,NBLP                               ; nb de nbr aleatoires a generer par liste
nlutc:            dc.b NBLG,NBLG,NBLG,NBLG,NBLM,NBLM,NBLP,NBLP           ; nb de nbr aleatoires a generer par liste developpee
                  even
lluti:            dc.l lut1-lut0,lut3-lut2,lut5-lut4,lut7-lut6           ; taille lutins
llut:             dc.l flut0-lut0,flut2-lut2,flut4-lut4,flut6-lut6       ; taille lutins
tlut:             dc.l flut0-lut0,flut1-lut1,flut2-lut2,flut3-lut3       ; taille lutins pour duplication en init
                  dc.l flut4-lut4,flut5-lut5,flut6-lut6,flut7-lut7       ;

                  ; construction liste copper
                  ; entree:
                  ; sortie:
                  ; regs  : d0/d1/d7/a0/a1
initcop:
                  lea copper0,a0                                         ;
                  move.l #$01060000,(a0)+                                ; bplcon3 minimal
                  move.l #$01fc0000,(a0)+                                ; mode 16 bits lutins/plan de bits

                  ; partie superieure = logo

                  lea pallogo(pc),a1                                     ; table contenant les valeurs RVB de la palette
                  move.w #$0180,d0                                       ; 1er registre couleur
                  move.w #(1<<NBPDBL)-1,d7                               ; nb-1 couleurs / tt 2 couleurs
.c:                                                                      ;
                  move.w d0,(a0)+                                        ; registre couleur
                  move.w (a1)+,(a0)+                                     ; couleur RVB
                  addq.w #2,d0                                           ; incremente registre couleur
                  dbf d7,.c                                              ; tt prochaine couleur

                  move.l #$008e2c91,(a0)+                                ; DIWSTRT / cache le 1er mot de DMA a chqe ligne
                  move.l #$00902cc1,(a0)+                                ; DIWSTOP
                  move.l #$00920038,(a0)+                                ; DDFSTR
                  move.l #$009400d0,(a0)+                                ; DDTSTOP / 20 mots de DMA charges a chqe ligne

                  move.l a0,sptlogo                                      ; sauve pos registre pdb ds liste copper
                  move.l #logo,d0                                        ; adr 1er pdb
                  move.l #(LL/8)*(HL),d1                                 ; taille en octets d'1 pdb => 80*64 = 5120 octets
                  move.w #NBPDBL-1,d7                                    ; nb-1 de pdb
                  bsr setpdb                                             ; injecte init pdb ds liste copper

                  move.l a0,sretardlogo                                  ; sauve pos dans liste copper du registre retard
                  addq.l #2,sretardlogo                                  ; on se cale directement sur la valeur du registre
                  move.l #$01020000,(a0)+                                ; delai DMA plan de bits
                  move.l #$01040000,(a0)+                                ; priorite pdb/lutins
                  move.w #$0108,(a0)+                                    ;
                  move.w #(LL/8)-(WL/8),(a0)+                            ; modulo plans impairs = 40
                  move.w #$010a,(a0)+                                    ;
                  move.w #(LL/8)-(WL/8),(a0)+                            ; modulo plans pairs   = 40
                  move.w #$0100,(a0)+                                    ; registre contrôle pdb
                  move.w #(NBPDBL*$1000)+$0200,(a0)+                     ; ecran 1 plan de bits


                  ; palette lutins

                  lea pall(pc),a1                                        ; liste palette source
                  move.w #$01a0,d0                                       ; 1er registre couleur
                  move.w #16-1,d7                                        ; nb de couleurs
.lc:                                                                     ;
                  move.w d0,(a0)+                                        ; registre couleur
                  move.w (a1)+,(a0)+                                     ; couleur
                  addq.w #2,d0                                           ; incremente registre couleur
                  dbf d7,.lc                                             ;

                  ; pointeurs lutins

                  lea ptlut(pc),a1                                       ; liste des pointeurs donnees lutins
                  move.w #$0120,d0                                       ; registre pointeur
                  moveq #16-1,d7                                         ;
.lp:                                                                     ;
                  move.l (a1)+,d1                                        ; pt lutin
                  beq.b .e                                               ; sortie boucle si fin de liste
                  move.w d0,(a0)+                                        ; registre pointeur partie haute
                  swap d1                                                ; partie haute adresse lutin
                  move.w d1,(a0)+                                        ; partie haute adresse lutin
                  addq.w #2,d0                                           ;
                  move.w d0,(a0)+                                        ; registre pointeur partie basse
                  addq.w #2,d0                                           ;
                  swap d1                                                ; partie basse adresse lutin
                  move.w d1,(a0)+                                        ; partie basse adresse lutin
                  bra.b .lp                                              ; tt prochain lutin
.e:

                  ; degrade couleurs ds logo

                  move.l a0,sdeglogocop                                  ; sauve pos. ds liste copper des
                                                                         ; couleurs du degrade logo
                  addq.l #6,sdeglogocop                                  ; on se positionne directement sur la 1ere couleur
                  lea deglogo(pc),a1                                     ; table de couleurs du degrade
                  move.l #$2bdffffe,d0                                   ; 1er WAIT
                  move.w #HL-1,d7                                        ; nb-1 de lignes a traiter -> couleurs
                                                                         ; sur toute la hauteur du logo
.l1:                                                                     ;
                  move.l d0,(a0)+                                        ; WAIT copper
                  move.w #$0182,(a0)+                                    ; registre couleur du logo a degrader
                  move.w (a1)+,(a0)+                                     ; couleur de la ligne
                  add.l #$01000000,d0                                    ; incremente ordonnee du WAIT
                  dbf d7,.l1                                             ; tt prochaine ligne

                  move.l #(($2b+HL)<<24)+($df<<16)+$fffe,(a0)+           ; wait fin logo et debut rasters = $6bdffffe
                  move.l #$01000200,(a0)+                                ; desactive tous les plan de bits

                  ; ecran principal = degrade et barres couleurs

                  move.l a0,sdegcop                                      ; sauve pos. ds liste copper du degrade de couleurs
                  lea degrade(pc),a1                                     ;
                  move.l #$6ce3fffe,d0                                   ; partie droite ligne
                  move.l #$6c07fffe,d1                                   ; partie gauche ligne
                  move.w #HS-HL-1,d7                                     ; nb-1 de lignes a traiter
.l2:                                                                     ;
                  move.l d1,(a0)+                                        ; wait pour bordure gauche
                  move.w #$0180,(a0)+                                    ; couleur de fond degradee
                  move.w (a1)+,(a0)+                                     ; couleur de la ligne
                  move.l d0,(a0)+                                        ; wait pour bordure droite
                  move.w #$0180,(a0)+                                    ;
                  move.w #COLB,(a0)+                                     ; couleur bordure (noire)
                  add.l #$01000000,d0                                    ;
                  add.l #$01000000,d1                                    ;
                  dbf d7,.l2                                             ; prochaine ligne
                  move.l #$fffffffe,(a0)+                                ; fin liste copper
                  rts

                  ; active un ecran noir vide
initcopvide:
                  lea copperv,a0                                         ; liste copper minimaliste
                  move.l #$01000200,(a0)+                                ; aucun plans de bits
                  move.l #$01800000,(a0)+                                ; fond noir
                  move.l #$fffffffe,(a0)+                                ; fin liste copper
                  move.l #copperv,$dff080                                ;
                  clr.w $dff088                                          ; active liste copper noire
                  rts

                  ; injecte pts pdbs dans liste copper
                  ; entree: d0= adr 1er pdb
                  ;         d1= taille en octets d'1 pdb
                  ;         a0= pos liste copper
                  ;         d7= nb-1 de pdb
                  ; sortie:
                  ; Regs  : d0/d1/d2/d7/a0
setpdb:
                  move.w #$00e0,d2                                      ; premier registre pt pdb
.l:                                                                     ;
                  move.w d2,(a0)                                        ; registre pt pdb poids fort
                  move.w d0,6(a0)                                       ; adresse pdb poids faible
                  swap d0                                               ;
                  addq.w #2,d2                                          ;
                  move.w d2,4(a0)                                       ; registre pt pdb poids faible
                  move.w d0,2(a0)                                       ; adresse pdb poids fort
                  swap d0                                               ;
                  add.l d1,d0                                           ;
                  addq.w #2,d2                                          ; prochain registre pt pdb
                  addq.l #8,a0                                          ; prochaine position dans liste copper
                  dbf d7,.l                                             ; tt prochain plan
                  rts


                  ; **************************************************
                  ; *                                                *
                  ; *                   VARS/TABLES                  *
                  ; *                                                *
                  ; **************************************************

principal:        dc.l 0                                                 ; pt vers sous routine principale

sdegcop:          dc.l 0                                                 ; pt vers degrade couleurs ds liste copper
degrade:
                  dc.w $000,$000,$000,$000,$000,$000,$001,$000           ; couleurs du degrade
                  dc.w $001,$001,$101,$001,$101,$101,$111,$101
                  dc.w $111,$111,$111,$111,$112,$111,$112,$112
                  dc.w $112,$112,$112,$112,$112,$112,$112,$112
                  dc.w $112,$112,$112,$112,$112,$112,$213,$212
                  dc.w $213,$213,$213,$213,$213,$213,$213,$213
                  dc.w $213,$213,$213,$213,$213,$213,$213,$213
                  dc.w $213,$213,$213,$213,$213,$213,$213,$213
                  dc.w $213,$213,$223,$213,$223,$223,$223,$223
                  dc.w $223,$223,$223,$223,$223,$223,$223,$223
                  dc.w $223,$223,$223,$223,$223,$223,$223,$223
                  dc.w $223,$223,$223,$223,$223,$223,$223,$223
                  dc.w $223,$223,$223,$223,$223,$223,$223,$223
                  dc.w $223,$223,$223,$223,$223,$223,$223,$223
                  dc.w $223,$223,$223,$223,$223,$223,$223,$223
                  dc.w $223,$223,$223,$223,$223,$223,$223,$223
                  dc.w $223,$223,$223,$223,$233,$233,$233,$233
                  dc.w $233,$233,$233,$233,$233,$233,$233,$233
                  dc.w $233,$233,$233,$233,$233,$233,$243,$233
                  dc.w $243,$243,$243,$243,$243,$243,$243,$243
                  dc.w $244,$244,$244,$244,$244,$244,$244,$244
                  dc.w $244,$244,$244,$244,$244,$244,$244,$244
                  dc.w $244,$244,$244,$244,$244,$244,$254,$244
                  dc.w $254,$254,$254,$254,$254,$254,$254,$254
                  dc.w $254,$254,$253,$254,$253,$253,$253,$253
                  dc.w $353,$353,$353,$353,$353,$353,$353,$353
                  dc.w $353,$353,$452,$353,$452,$452,$452,$452
                  dc.w $452,$452,$452,$452,$452,$452,$452,$452
                  dc.w $552,$552,$552,$552,$552,$552,$551,$552
                  dc.w $561,$561,$561,$561,$561,$561,$561,$561
                  dc.w $561,$561,$561,$561,$661,$561,$661,$661
                  dc.w $661,$661,$661,$661,$661,$661,$661,$661

itbsin:           blk.w NBB,0                                            ; indexes table mvt barres rasters
tbsin:            dc.b 128,126,124,123,121,120,118,117,115,113,112       ; table des ordonnees barres rasters
                  dc.b 110,109,107,106,104,103,101,100,99,97,96,94
                  dc.b 93,92,91,89,88,87,86,84,83,82,81,80,79,78
                  dc.b 77,76,75,74,73,72,72,71,70,70,69,68,68,67
                  dc.b 67,66,66,65,65,65,64,64,64,64,64,64,64,64
                  dc.b 64,64,64,64,64,64,65,65,65,66,66,66,67,67
                  dc.b 68,69,69,70,71,71,72,73,74,75,75,76,77,78
                  dc.b 79,80,82,83,84,85,86,87,89,90,91,92,94,95
                  dc.b 97,98,99,101,102,104,105,107,108,110,111
                  dc.b 113,114,116,117,119,120,122,124,125,127
                  dc.b 128,130,131,133,135,136,138,139,141,142
                  dc.b 144,145,147,148,150,151,153,154,156,157
                  dc.b 158,160,161,163,164,165,166,168,169,170
                  dc.b 171,172,173,175,176,177,178,179,180,180
                  dc.b 181,182,183,184,184,185,186,186,187,188
                  dc.b 188,189,189,189,190,190,190,191,191,191
                  dc.b 191,191,191,191,191,191,191,191,191,191
                  dc.b 191,190,190,190,189,189,188,188,187,187
                  dc.b 186,185,185,184,183,183,182,181,180,179
                  dc.b 178,177,176,175,174,173,172,171,169,168
                  dc.b 167,166,164,163,162,161,159,158,156,155
                  dc.b 154,152,151,149,148,146,145,143,142,140
                  dc.b 138,137,135,134,132,131,129,128


barre:            dc.w $0518,$0627,$0746,$0865                           ; couleurs barre raster de 16 lignes de haut
                  dc.w $0A84,$0B93,$0CB2,$0DD1
                  dc.w $0DD1,$0CB2,$0B93,$0A84
                  dc.w $0865,$0746,$0627,$0518

itbmvtlogo:       dc.w 0                                                 ; index table mvt logo
tbmvtlogo:
                  dc.w 0,-3,-7,-11,-15,-19,-23,-27,-31,-35,-39,-42,-46   ; table des abscisses du mvt logo 
                  dc.w -50,-54,-57,-61,-65,-68,-72,-75,-79,-82,-85,-89
                  dc.w -92,-95,-98,-101,-104,-107,-110,-113,-116,-118
                  dc.w -121,-124,-126,-128,-131,-133,-135,-137,-139
                  dc.w -141,-143,-144,-146,-148,-149,-150,-152,-153
                  dc.w -154,-155,-156,-157,-157,-158,-158,-159,-159
                  dc.w -159,-159,-159,-159,-159,-159,-159,-158,-158
                  dc.w -157,-156,-155,-154,-153,-152,-151,-150,-148
                  dc.w -147,-145,-144,-142,-140,-138,-136,-134,-132
                  dc.w -130,-127,-125,-122,-120,-117,-114,-112,-109
                  dc.w -106,-103,-100,-97,-94,-90,-87,-84,-80,-77,-73
                  dc.w -70,-66,-63,-59,-55,-52,-48,-44,-40,-37,-33
                  dc.w -29,-25,-21,-17,-13,-9,-5,-1,1,5,9,13,17,21
                  dc.w 25,29,33,37,40,44,48,52,55,59,63,66,70,73,77
                  dc.w 80,84,87,90,94,97,100,103,106,109,112,114,117
                  dc.w 120,122,125,127,130,132,134,136,138,140,142,144
                  dc.w 145,147,148,150,151,152,153,154,155,156,157
                  dc.w 158,158,159,159,159,159,159,159,159,159,159
                  dc.w 159,158,158,157,157,156,155,154,153,152,150
                  dc.w 149,148,146,144,143,141,139,137,135,133,131
                  dc.w 128,126,124,121,118,116,113,110,107,104,101
                  dc.w 98,95,92,89,85,82,79,75,72,68,65,61,57,54,50
                  dc.w 46,42,39,35,31,27,23,19,15,11,7,3
sretardlogo:      dc.l 0                                                 ; pt vers registre retard logo ds liste copper
sptlogo:          dc.l 0                                                 ; pt vers registres pt pdb logo ds liste copper

pallogo:          dc.w $0000,$0ffe                                       ; palette logo

sdeglogocop:      dc.l 0                                                 ; sauve pt vers degrade couleurs logo ds liste copper
deglogo:
                  dc.w $FFF,$FFF,$FFF,$EFF,$EFF,$EFF,$EFF,$DFF           ; liste couleurs du degrade de couleurs logo
                  dc.w $DFF,$DEF,$CEF,$CEF,$CEF,$CEF,$BEF,$BEF
                  dc.w $BEF,$AEF,$AEF,$ADF,$ADF,$9DF,$9DF,$9DF
                  dc.w $8DF,$8DF,$8DF,$8DF,$7CF,$7CF,$7CF,$6CF
                  dc.w $6CF,$6CF,$6CF,$5CF,$5CF,$5CF,$5CF,$5CE
                  dc.w $5CE,$5CD,$6CD,$6CD,$6CC,$6CC,$6CB,$7CB
                  dc.w $7CA,$7BA,$7BA,$7B9,$8B9,$8B8,$8B8,$8B7
                  dc.w $8B7,$9B7,$9B6,$9B6,$9B5,$9A5,$AA4,$AA4
                  dc.w $AA4,$AA3,$BA3,$BA2,$BA2,$BA1,$CA1,$CA1
                  dc.w $CA0,$CA0,$CA0,$CA0,$CA1,$CA1,$CA1,$CA2
                  dc.w $DA2,$DA2,$DA3,$DA3,$DA3,$DA4,$DA4,$E94
                  dc.w $E95,$E95,$E95,$E96,$E96,$E97,$F97,$F98
                  dc.w $F98,$F99,$F99,$F9A,$F9A,$F9A,$F9A,$F9A
                  dc.w $F9A,$FAB,$FAB,$FAB,$FAB,$FBB,$FBC,$FBC
                  dc.w $FBC,$FCC,$FCD,$FCD,$FCD,$FDD,$FDD,$FDE
                  dc.w $FDE,$FEE,$FEE,$FEF,$FEF,$FFF,$FFF,$FFF
fdeglogo:
ideglogo:         dc.w 0                                                 ; index table degrade couleurs logo

sintena:          dc.w 0                                                 ; sauve intena
sdmacon:          dc.w 0                                                 ; sauve dmacon
nom_glib:         dc.b"graphics.library",0                               ; nom de la librairie
                  even

                  ; donnees lutins

pall:             dc.w $0000,$0115,$0225,$0236,$0246,$0256,$0167
                  dc.w $0177,$0198, $01A8,$00B8,$00C9,$00D9,$00EA
                  dc.w $00FA,$0000

                  ; liste pointeurs vers lutins

ptlut:            dc.l lut0,lut1,lut2,lut3,lut4,lut5,lut6,lut7           ;
                  dc.l 0                                                 ; marqueur fin de liste

                  ; ordonnees des 3 listes de lutins

coorlut0:         dc.b $2c+04,$2c+16,$2c+32,$2c+48                       ;  4x ordonnees lutins taille 32x8
                  dc.b 0                                                 ;  marqueur de fin de liste
coorlut1:         dc.b $2c+00,$2c+08,$2c+16,$2c+24,$2c+38,$2c+48,$2c+58  ;  7x ordonnees lutins taille 16x6
                  dc.b 0                                                 ;  marqueur de fin de liste
coorlut2:         dc.b $2c+02,$2c+08,$2c+16,$2c+22,$2c+30,$2c+37,$2c+44  ; 11x ordonnees lutins taille 16x4
                  dc.b $2c+51,$2c+58,$2c+64,$2c+70                       ;
                  dc.b 0                                                 ;  marqueur de fin de liste

                  even


                  ; **************************************************
                  ; *                                                *
                  ; *        SOUS-ROUTINES BOUCLE PRINCIPALE         *
                  ; *                                                *
                  ; **************************************************

                  ; tt double tampon
                  ; entree:
                  ; sortie:
                  ; regs  :
;dtampon:
;                  eor.b #$ff,flgdf                                      ; permutte indicateur double tampon
;                  beq.b .page2                                          ;
;                  bra.b .nxt1                                           ;
;.page2:
;                  bra.b .nxt1
;nxt1:
;                  rts


                  ; initialisations rasters
                  ; entree:
                  ; sortie:
                  ; regs  : d0/d7/a0
initpart6:
                  bsr        initcopvide                                 ; ecran noir et vide

                  ; init les index des barres rasters

                  lea itbsin(pc),a0                                      ;
                  moveq #0,d0                                            ;
                  move.w #NBB-1,d7                                       ;
.ib:                                                                     ;
                  and.w #$00ff,d0                                        ; empeche debordement index
                  move.w d0,(a0)+                                        ;
                  add.w #6,d0                                            ; dephase le prochain index de 6
                  dbf d7,.ib                                             ; tt prochain index

                  bsr initcop                                            ; construction nouvelle liste copper
                  move.l #copper0,$dff080                                ; nouvelle liste copper active a la prochaine trame

                  clr.w itbsin                                           ; raz index table sinus
                  addq.l #6,sdegcop                                      ; pointe directement sur couleur ds
                                                                         ; liste degrade copper

                  move.l #part6,principal                                ; a la prochaine trame, le tt se fera
                                                                         ; dans l'effet demo en-soi
                  rts

part6:
;                 bsr dtampon                                            ; tt double tampon

                  bsr mvtetoiles                                         ; deplace lutins du champ etoiles
                  bsr rasters                                            ; effet de couleurs barres et fond colore
                  bsr cologo                                             ; effet couleurs dans logo
                  bsr mvtlogo                                            ; oscillation horizontale logo
                  rts


                  ; couleurs mouvantes dans logo
                  ; entree:
                  ; sortie:
                  ; regs  : d0/d1/d7/a0/a1
cologo:
                  lea deglogo(pc),a0                                     ; table des couleurs
                  move.w ideglogo(pc),d0                                 ; index
                  addq.w #2,d0                                           ; deplace couleurs
                  and.w #$00ff,d0                                        ; empeche debordement index
                  move.w d0,ideglogo-deglogo(a0)                         ; sauve nouvel index
                  move.l sdeglogocop(pc),a1                              ; 1ere couleur du degrade ds liste copper
                  move.w #HL-1,d7                                        ; nb-1 de couleurs a traiter
.l:                                                                      ;
                  and.w #$00ff,d0                                        ; empeche debordement index
                  move.w (a0,d0.w),(a1)                                  ; injecte nouvelle couleur ds liste copper
                  addq.w #8,a1                                           ; on se positionne sur prochaine ligne copper
                  addq.w #2,d0                                           ; deplace pos. 1ere couleur
                  and.w #$00ff,d0                                        ; empeche debordement index
                  dbf d7,.l                                              ; tt prochaine ligne
                  rts

                  ; mvt oscillatoire logo
                  ; entree:
                  ; sortie:
                  ; regs  : d0/d1/d2/d7/a0
mvtlogo:
                  lea tbmvtlogo(pc),a0                                   ; table mvt logo
                  moveq #0,d0                                            ;
                  move.w itbmvtlogo(pc),d0                               ; index table
                  move.w d0,d1                                           ;
                  addq #2,d1                                             ; mouvement grace a incrementation index
                  and.w #$00ff,d1                                        ; empeche debordement index
                  move.w d1,itbmvtlogo-tbmvtlogo(a0)                     ; reinjecte nouvel index
                  add.w d0,d0                                            ; table en .W
                  move.w (a0,d0.w),d0                                    ; abscisse
                  add.w #WL/2,d0                                         ; recentrage abscisse logo
                  move.w d0,d1                                           ;
                  lsr.w #4,d0                                            ; nbre de mots
                  add.w d0,d0                                            ; adresse partielle paire, en octets
                  add.l #logo,d0                                         ; adresse finale plan du logo
                  and.w #$000f,d1                                        ; uniquement 4 bits poids faible abscisse logo
                  move.w #15,d2                                          ;
                  sub.w d1,d2                                            ;
                  move.w d2,d1                                           ; retard plans pairs
                  lsl.w #4,d2                                            ; calcul retard plans impairs
                  or.w d2,d1                                             ; retard plans pairs et impairs
                  move.l sretardlogo(pc),a0                              ; pos. du registre retard ds liste copper
                  move.w d1,(a0)                                         ; injecte nouvelle valeur retard ds liste copper

                  move.l sptlogo(pc),a0                                  ; pos. ds liste copper
                  move.l #LL/8*HL,d1                                     ; taille en octets d'1 pdb
                  move.w #NBPDBL-1,d7                                    ; nb-1 de pdb a traiter
                  bsr setpdb                                             ; injecte pt pdb ds liste copper
                  rts

                  ; tt effets de couleurs au copper
                  ; entree:
                  ; sortie:
                  ; regs  : d0/d6/d7/a0/a1/a2/a3/a4
rasters:

                  ; tt effacement barres rasters

                  lea degrade(pc),a0                                     ; couleurs du degrade de fond
                  move.l sdegcop(pc),a2                                  ; pt vers liste copper
                  move.w #HS-HL-1,d7                                     ; 256 lignes a traiter
.clr:                                                                    ;
                  move.w (a0)+,(a2)                                      ; injecte couleur ds liste copper
                  lea 16(a2),a2                                          ; prochaine ligne copper
                  dbf d7,.clr                                            ; tt prochaine ligne

                  ; tt affichage barres rasters

                  lea itbsin(pc),a0                                      ; liste d'index des 16 barres rasters
                  lea tbsin(pc),a1                                       ;
                  move.l sdegcop(pc),a2                                  ; pointe vers liste copper
                  move.w #NBB-1,d7                                       ; nb-1 barres rasters
.2:
                  move.w (a0),d0                                         ; index table sinus
                  addq.w #1,(a0)+                                        ; incremente index
                  and.w #$00ff,d0                                        ; evite debordement
                  move.b (a1,d0.w),d0                                    ; ordonnee ecran de la barre raster
                  sub.w #HL-1,d0                                         ; recentrage
                  lsl.w #4,d0                                            ; adresse offset ds liste copper
                  move.l a2,a3                                           ; base adr. debut degrade dans liste copper
                  add.w d0,a3                                            ; a3=adr. cible ds liste copper où y dessiner barre

                  lea barre(pc),a4                                       ; pointe sur couleurs de la barre raster
                  move.w #HBR-1,d6                                       ; hauteur-1 d'une barre raster
.1:                                                                      ;
                  move.w (a4)+,(a3)                                      ; injecte couleur ligne barre raster ds liste copper
                  lea 16(a3),a3                                          ;
                  dbf d6,.1                                              ; tt prochaine ligne de la barre
                  dbf d7,.2                                              ; tt prochaine barre
                  rts                                                    ;


                  ; deplace lutins en parallax
                  ; entree:
                  ; sortie:
                  ; regs  : d0/d7/a1/a2/a3/a4
mvtetoiles:

                  ; deplacement etoiles -grandes-

                  lea lut0+1,a1                                          ; liste lutins pairs -grande taille
                  lea lut1+1,a2                                          ; liste lutins impairs -grande taille
                  lea lut2+1,a3                                          ; liste 2eme partie lutins pairs -grande taille
                  lea lut3+1,a4                                          ; liste 2eme partie lutins impairs -grande taille
                  moveq #4-1,d7                                          ; nb-1 lutins
.0:                                                                      ;
                  move.b (a1),d0                                         ;
                  addq.b #VGL,d0                                         ; deplacement de 6 pixels a droite
                  move.b d0,(a1)                                         ; injecte nouvelle abscisse
                  move.b d0,(a2)                                         ; idem pour lutin impair
                  addq.b #8,d0                                           ; abscisse 2eme partie lutins
                  move.b d0,(a3)                                         ; injecte nouvelle abscisse
                  move.b d0,(a4)                                         ; idem pour lutin impair

                  lea flut0-lut0(a1),a1                                  ; passe au prochain lutin de la liste
                  lea flut0-lut0(a2),a2                                  ; idem pour lutin impair
                  lea flut0-lut0(a3),a3                                  ; passe au prochain lutin de la liste
                  lea flut0-lut0(a4),a4                                  ; idem pour 2eme partie lutins
                  dbf d7,.0                                              ;

                  ; deplacement etoiles -moyennes-

                  lea lut4+1,a1                                          ; liste lutins pairs -grande taille
                  lea lut5+1,a2                                          ; liste lutins impairs -grande taille
                  moveq #7-1,d7                                          ; nb-1 lutins
.1:                                                                      ;
                  move.b (a1),d0                                         ;
                  addq.b #VML,d0                                         ; deplacement de 4 pixels a droite
                  move.b d0,(a1)                                         ; injecte nouvelle abscisse
                  move.b d0,(a2)                                         ; idem pour lutin impair

                  lea flut4-lut4(a1),a1                                  ; passe au prochain lutin de la liste
                  lea flut5-lut5(a2),a2                                  ; idem pour lutin impair
                  dbf d7,.1                                              ;

                  ; deplacement etoiles -petites-

                  lea lut6+1,a1                                          ; liste lutins pairs -grande taille
                  lea lut7+1,a2                                          ; liste lutins impairs -grande taille
                  moveq #11-1,d7                                          ; nb-1 lutins
.2:                                                                      ;
                  move.b (a1),d0                                         ;
                  addq.b #VPL,d0                                         ; deplacement de 2 pixels a droite
                  move.b d0,(a1)                                         ; injecte nouvelle abscisse
                  move.b d0,(a2)                                         ; idem pour lutin impair

                  lea flut6-lut6(a1),a1                                  ; passe au prochain lutin de la liste
                  lea flut7-lut7(a2),a2                                  ; idem pour lutin impair
                  dbf d7,.2                                              ;

                  rts



                  ; ***********************************************
                  ; *                                             *
                  ; *                  CHIP RAM                   *
                  ; *                                             *
                  ; ***********************************************


                  section    donneesgraph,data_c

;logo:             blk.b 80*64,0

                  ; premier plan du logo qui est deja precharge par le graphisme du logo
logo:
                  dc.l $00000000,$00000000,$0007FE00,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$001FFF80,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$003FFFE0,$00001FF8,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$003F8000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$007FFFF8,$0000FFF0
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$03FFF800,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00FFFFFC,$0003FFF0,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$0FFFFE00,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00FFFFFE,$000FFFF0
                  dc.l $00000000,$00007F00,$00000000,$00000000,$00000000,$3FFFFF80,$007F8000,$0000FE00
                  dc.l $0FE00000,$00000000,$00000000,$00000000,$00000000,$00000000,$000FF000,$00000000
                  dc.l $00000000,$00000000,$01FFFFFF,$001FFFE0,$00000000,$0000FFC0,$00000000,$00000000
                  dc.l $00000000,$FFFFFFC0,$007FC000,$0000FF80,$1FF00000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$000FFC00,$00000000,$00000000,$00000000,$01FFFFFF,$807FFFE0
                  dc.l $00000000,$0001FFE0,$00000000,$00000000,$00000001,$FFFFFFE0,$007FF000,$0000FFC0
                  dc.l $3FF80000,$00000000,$00000000,$00000000,$00000000,$00000000,$0007FE00,$00000000
                  dc.l $00000000,$00000000,$03FFFFFF,$C0FFFFC0,$00000000,$0001FFE0,$00000000,$00000000
                  dc.l $00000003,$FFFFFFF0,$003FF000,$0000FFE0,$7FFC0000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$0007FE00,$00000000,$00000000,$00000000,$03FFFFFF,$E3FFFFC0
                  dc.l $00000000,$0003FFE0,$00000000,$00000000,$00000007,$FF80FFF8,$003FF800,$0000FFF0
                  dc.l $7FFC0000,$00000000,$00000000,$00000000,$00000000,$00000000,$0007FF00,$00000000
                  dc.l $00000000,$00000000,$03FFFFFF,$F7FFFFC0,$00000000,$0003FFE0,$00000000,$00000000
                  dc.l $0000000F,$FE003FFC,$007FF800,$0000FFF0,$7FFC0000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$0007FF00,$00000000,$00000000,$00000000,$01FFFF0F,$FFFF7F80
                  dc.l $00000000,$0001FFE0,$00000000,$00000000,$0000001F,$F8001FFC,$007FF800,$0000FFF0
                  dc.l $7FFC0000,$00000000,$00000000,$00000000,$00000000,$00000000,$000FFF00,$00000000
                  dc.l $00000000,$00000000,$01FFFF07,$FFFE7F80,$00000000,$0000FFC0,$00000000,$00000000
                  dc.l $0000003F,$F0000FFE,$00FFF800,$0001FFF0,$3FF80000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$000FFF00,$00000000,$00000000,$00000000,$00FFFF03,$FFF8FF80
                  dc.l $00000000,$00007F80,$00000000,$00000000,$0000007F,$E00007FE,$00FFF000,$0001FFE0
                  dc.l $1FF00000,$00000000,$00000000,$00000000,$00000000,$00000000,$001FFE00,$00000000
                  dc.l $00000000,$00000000,$00FFFF00,$FFF0FF00,$00000000,$00001E00,$00000000,$00000000
                  dc.l $000000FF,$C00003FF,$00FFF000,$0003FFE0,$07C00000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$001FFE00,$00000000,$00000000,$00000000,$007FFF81,$FFE1FF00
                  dc.l $00000000,$00000000,$00000000,$00000000,$000000FF,$800003FF,$01FFF000,$0003FFC0
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$003FFE00,$00000000
                  dc.l $00000000,$00000000,$003FFFC3,$FFE1FF00,$00000000,$00000000,$00000000,$00000000
                  dc.l $000001FF,$000003FF,$01FFE000,$0003FFC0,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$003FFC00,$00000000,$00000000,$00000000,$000FFFE7,$FFC3FE3F
                  dc.l $C0000000,$0001FE00,$00000000,$00000000,$000001FF,$03FF81FF,$83FFE3FE,$0007FFC0
                  dc.l $7F800000,$00000000,$FF007F80,$00000000,$0000FF00,$3F000000,$003FFC00,$00000000
                  dc.l $00000000,$00000000,$0003FF8F,$FFC3FE3F,$F01FF00F,$F007FF00,$00007F00,$000007F0
                  dc.l $000003FE,$0FFFE1FF,$83FFEFFF,$8007FF80,$FFC00000,$1FE0000F,$FFE03FE0,$1FF00FE0
                  dc.l $000FFFE0,$7FE007FC,$007FFC00,$00000000,$00000000,$00000000,$00007E1F,$FFC7FE1F
                  dc.l $F87FF87F,$FC07FF00,$01FFFFC0,$007FC7F8,$000003FE,$3FFFF1FF,$87FFFFFF,$E00FFF80
                  dc.l $FFE0007F,$FFF8003F,$FFF03FF0,$7FF87FFC,$003FFFF0,$3FF03FFF,$07FFFF80,$00000000
                  dc.l $00000000,$00000000,$0000003F,$FFE7FE1F,$F8FFFCFF,$FE07FF00,$07FFFFE0,$01FFE7FC
                  dc.l $000003FC,$7FFFF9FF,$87FFFFFF,$F00FFF00,$FFE001FF,$FFFC00FF,$FFF83FF9,$FFF9FFFE
                  dc.l $00FFFFF8,$3FF8FFFF,$9FFFFFC0,$00000000,$00000000,$00000000,$3800007F,$FFFFFC1F
                  dc.l $FDFFFFFF,$FF07FF00,$1FFFFFF0,$07FFFFFE,$000007FC,$FFFFF9FF,$8FFFFFFF,$F01FFF00
                  dc.l $FFE007FF,$FFFC01FF,$F3F83FFF,$FFFFFFFE,$01FFF3F8,$3FF9FFFF,$DFFFFFC0,$00000000
                  dc.l $00000000,$00000000,$F80000FF,$FFFFFC1F,$FFFFFFFF,$FF07FF00,$7FFFFFF0,$0FFFFFFE
                  dc.l $000007FD,$FFFFF9FF,$8FFFF03F,$F81FFF01,$FFE00FFF,$FFFE03FF,$E1FC3FFF,$FFFFFFFF
                  dc.l $03FFE1FC,$3FFFFFFF,$FFFFFFC0,$00000000,$00000000,$00000003,$F80001FF,$FFFFF83F
                  dc.l $FFCFFFFF,$FF07FF00,$FFFFFFF0,$1FFFFFFE,$000007FF,$FFFFF9FF,$9FFFC03F,$F81FFE01
                  dc.l $FFE01FFF,$FFFE07FF,$C1FC3FFF,$8FFFFFFF,$07FFC1FC,$3FFFFFFF,$FBFFE780,$00000000
                  dc.l $00000000,$00000007,$F80003FF,$FCFFF83F,$FF07FF8F,$FF0FFF01,$FFF3FFF0,$3FFE7FFE
                  dc.l $000007FF,$FFFFF9FF,$9FFF801F,$F83FFE01,$FFC03FFC,$FFFE0FFF,$C1FC3FFF,$07FF8FFF
                  dc.l $0FFFC1FC,$3FFFC3FF,$C1FFE000,$00000000,$00000000,$0000000F,$F80007FF,$F87FF83F
                  dc.l $FE07FF07,$FF0FFE03,$FFC1FFF0,$7FF83FFE,$000003FF,$FFFFFBFF,$9FFF003F,$FC3FFE03
                  dc.l $FFC07FF8,$3FFE1FFF,$81FC7FFE,$07FE0FFF,$1FFF81FC,$3FFF81FF,$C3FFE000,$00000000
                  dc.l $00000000,$0000001F,$F8000FFF,$F87FF87F,$FE07FE0F,$FF1FFE03,$FFC0FFF0,$FFF01FFE
                  dc.l $000003FF,$F0FFF3FF,$BFFE003F,$FC7FFC03,$FFC0FFF0,$1FFE1FFF,$83FC7FFC,$07FE0FFE
                  dc.l $1FFF83FC,$7FFF03FF,$C3FFC000,$00000000,$00000000,$0000003F,$F8003FFF,$F03FF87F
                  dc.l $FC07FE0F,$FF1FFE07,$FF80FFF0,$FFF03FFC,$000001FF,$E0FFF3FF,$BFFE003F,$FC7FFC07
                  dc.l $FF81FFF0,$1FFE3FFF,$87FC7FFC,$0FFC1FFE,$3FFF87FC,$7FFE07FF,$C7FFC000,$00000000
                  dc.l $00000000,$0000003F,$FC007FFF,$F07FF07F,$FC0FFC1F,$FE1FFC0F,$FF80FFF1,$FFF03FFC
                  dc.l $0000007F,$C0FFE7FF,$3FFE007F,$FC7FFC07,$FF81FFE0,$1FFE3FFF,$8FF8FFF8,$1FFC1FFE
                  dc.l $3FFF8FF8,$FFFC07FF,$87FFC000,$00000000,$00000000,$0000007F,$FE01FFFF,$E07FF07F
                  dc.l $F81FFC1F,$FE3FFC0F,$FF00FFF1,$FFF07FF8,$0000001F,$C3FFC7FF,$3FFE00FF,$F8FFFC07
                  dc.l $FF03FFE0,$3FFC7FFF,$FFF8FFF8,$1FF83FFC,$7FFFFFF8,$FFFC0FFF,$87FFC000,$00000000
                  dc.l $00000000,$0000007F,$FF8FFFFF,$E0FFF0FF,$F83FF83F,$FE3FF81F,$FF01FFF3,$FFF07FF8
                  dc.l $1C00001F,$E3FF0FFF,$3FFE00FF,$F8FFF80F,$FF03FFE0,$3FFC7FFF,$FFF0FFF8,$3FF87FFC
                  dc.l $7FFFFFF0,$FFF81FFF,$8FFFC03C,$00000000,$00000000,$0000007F,$FFFFFFFF,$C0FFF0FF
                  dc.l $F83FF87F,$FC7FF81F,$FF83FFF3,$FFF07FF0,$3E00001F,$E1FC1FFF,$3FFE03FF,$F8FFF80F
                  dc.l $FF07FFE0,$7FFCFFFF,$FFF1FFF0,$7FF07FFC,$FFFFFFF1,$FFF01FFF,$0FFFC07C,$00000000
                  dc.l $00000000,$0000007F,$FFFFFFFF,$C0FFF1FF,$F07FF07F,$FC7FF81F,$FFC7FFE3,$FFF8FFF0
                  dc.l $3E00003F,$F0003FFE,$3FFF07FF,$F8FFF81F,$FE07FFF1,$FFFCFFFF,$FFE1FFF0,$7FF0FFF8
                  dc.l $FFFFFFE1,$FFF03FFF,$0FFFC0FC,$00000000,$00000000,$0000007F,$FFFFFFFF,$80FFF1FF
                  dc.l $F07FF0FF,$F87FF83F,$FFFFFFE3,$FFFFFFF0,$7C00003F,$F000FFFE,$3FFFFFFF,$F1FFFC1F
                  dc.l $FE07FFFF,$FFFCFFFF,$FFC3FFF0,$FFF0FFF8,$FFFFFFC3,$FFF03FFE,$0FFFC0FC,$00000000
                  dc.l $00000000,$0000007F,$FFFFFFFF,$01FFE3FF,$F0FFF0FF,$F8FFF87F,$FFFFFFE3,$FFFFFFF0
                  dc.l $7C00003F,$FC03FFFC,$3FFFFFFF,$F1FFFC1F,$FE0FFFFF,$FFF8FFFF,$FF87FFE0,$FFE1FFF8
                  dc.l $FFFFFF87,$FFE03FFE,$0FFFC1F8,$00000000,$00000000,$0000007F,$FFFFFFFE,$01FFE3FF
                  dc.l $F0FFE1FF,$F8FFF87F,$FFFFFFE3,$FFFFFFF0,$F800003F,$FFFFFFFC,$1FFFFFFF,$F1FFFF7F
                  dc.l $FE1FFFFF,$FFF8FFFE,$7F07FFE1,$FFE1FFF0,$FFFE7F07,$FFE07FFE,$0FFFE7F0,$00000000
                  dc.l $00000000,$0000007F,$FFFFFFFE,$01FFE3FF,$E1FFE1FF,$F8FFFDFF,$FFFFFFC3,$FFFFFFFD
                  dc.l $F000003F,$FFFFFFF8,$1FFFFFFF,$E1FFFFFF,$FFBFFFFF,$FFF87FFE,$001FFFE1,$FFE1FFF0
                  dc.l $7FFE001F,$FFE07FFE,$1FFFFFF0,$00000000,$00000000,$0000003F,$FFFFFFFC,$01FFF7FF
                  dc.l $E1FFE1FF,$F8FFFFFF,$FFFFFFC3,$FFFFFFFF,$F000003F,$FFFFFFF8,$1FFFFFFF,$C1FFFFFF
                  dc.l $FFFFFFFF,$FFF87FFF,$003FFFE3,$FFC1FFF0,$7FFF003F,$FFC07FFE,$0FFFFFE0,$00000000
                  dc.l $00000000,$0000003F,$FFFFFFF8,$03FFF7FF,$E3FFE1FF,$F8FFFFFF,$FFFFFFC1,$FFFFFFFF
                  dc.l $E000001F,$FFFFFFF0,$0FFFFFFF,$C1FFFFFF,$FFFFFFFF,$FFF03FFF,$81FFFFC3,$FFC1FFF0
                  dc.l $3FFF81FF,$FFC07FFE,$0FFFFFC0,$00000000,$00000000,$0000001F,$FFFFFFF8,$03FFFFFF
                  dc.l $E3FFC1FF,$FCFFFFEF,$FFFFFFC1,$FFFFFFFF,$C000001F,$FFFFFFE0,$07FFFFFF,$80FFFFFF
                  dc.l $FFFFFFFF,$FFF03FFF,$FFFFFFC3,$FFC1FFF8,$3FFFFFFF,$FFC07FFF,$0FFFFF80,$00000000
                  dc.l $00000000,$0000000F,$FFFFFFF0,$03FFFFFF,$E3FFC0FF,$FFFFFFC7,$FFFFFF80,$FFFFFFFF
                  dc.l $8000001F,$FFFFFFC0,$03FFFFFF,$00FFFFFF,$FFF9FFFF,$FFF01FFF,$FFFFFFC7,$FFC1FFFF
                  dc.l $1FFFFFFF,$FFC03FFF,$EFFFFF00,$00000000,$00000000,$0000000F,$FFFFFFE0,$03FFFFFF
                  dc.l $C3FFC0FF,$FFFFFF83,$FFFFFF80,$7FFE7FFF,$0000000F,$FFFFFF80,$01FFFFFC,$00FFFFEF
                  dc.l $FFF0FFFF,$FFF00FFF,$FFFFFFC7,$FFC0FFFF,$0FFFFFFF,$FFC03FFF,$E7FFFE00,$00000000
                  dc.l $00000000,$00000007,$FFFFFFC0,$01FFFFFF,$C3FFC07F,$FF3FFF01,$FFEFFF80,$3FFC3FFE
                  dc.l $00000007,$FFFFFF00,$007FFFF8,$007FFF87,$FFC03FFB,$FFE007FF,$FFE7FFC7,$FFC0FFFF
                  dc.l $07FFFFE7,$FFC01FFF,$C7FFFC00,$00000000,$00000000,$00000003,$FFFFFF00,$01FFFFFF
                  dc.l $C3FFC03F,$FE0FFC00,$3F0FFF00,$1FF01FF8,$00000007,$FFFFFC00,$001FFFC0,$001FFE03
                  dc.l $FF800FE3,$FFE001FF,$FF01FFC3,$FFC03FFE,$01FFFF01,$FFC00FFF,$81FFF000,$00000000
                  dc.l $00000000,$00000000,$FFFFFE00,$01FFFF3F,$C1FFC00F,$F803E000,$001FFF00,$07C007E0
                  dc.l $00000003,$FFFFF800,$0001FE00,$0007F000,$FC000003,$FFC0001F,$F0007FC3,$FF800FF8
                  dc.l $001FF000,$7FC003FE,$007F8000,$00000000,$00000000,$00000000,$3FFFF800,$00FFFE00
                  dc.l $00FF0000,$00000000,$001FFF00,$00000000,$00000000,$FFFFC000,$00000000,$00000000
                  dc.l $00000007,$FFC00000,$00000000,$FE000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$0FFFC000,$007FF800,$00000000,$00000000,$003FFE00,$00000000
                  dc.l $00000000,$3FFE0000,$00000000,$00000000,$00000007,$FFC00000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$000F8000
                  dc.l $00000000,$00000003,$007FFE00,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $0000E00F,$FF800000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000007,$C0FFFC00,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$0000F81F,$FF800000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000007,$FFFFFC00,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $0001FFFF,$FF000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000007,$FFFFF800,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$0001FFFF,$FF000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$0000000F,$FFFFF800,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $0001FFFF,$FE000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$0000000F,$FFFFF000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$0001FFFF,$FE000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000007,$FFFFE000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $0001FFFF,$FC000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000007,$FFFFE000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$0001FFFF,$F8000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000007,$FFFFC000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $0000FFFF,$F0000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000003,$FFFF8000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$0000FFFF,$F0000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000001,$FFFF0000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00007FFF,$C0000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$FFFE0000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00003FFF,$80000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$7FF80000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000FFF,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$0FE00000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$000003FC,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
                  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000

                  ; liste lutins 32x8 pairs

lut0:             dc.w $0000,$0000
                  dc.w $2666,$1E1E,$6666,$1E1E,$E666,$1E1E,$E666,$1E1E
                  dc.w $E666,$1E1E,$E666,$1E1E,$6666,$1E1E,$2666,$1E1E
flut0:
                  blk.b NBLG*(flut0-lut0),0
                  dc.w $0000,$0000                                       ; fin de liste

                  ; liste lutins 32x8 impairs x4

lut1:             dc.w $0000,$0080
                  dc.w $01FE,$0001,$01FE,$0001,$01FE,$0001,$01FE,$0001
                  dc.w $01FE,$0001,$01FE,$0001,$01FE,$0001,$01FE,$0001
flut1:
                  blk.b NBLG*(flut1-lut1),0
                  dc.w $0000,$0000                                       ; fin de liste

                  ; liste lutins 32x8 pairs

lut2:             dc.w $0000,$0000
                  dc.w $1998,$0784,$1998,$0786,$1998,$0787,$1998,$0787
                  dc.w $1998,$0787,$1998,$0787,$1998,$0786,$1998,$0784
flut2:
                  blk.b NBLG*(flut2-lut2),0                              ; 3 autres lutins
                  dc.w $0000,$0000                                       ; fin de liste

                  ; liste lutins 32x8 impairs x4

lut3:             dc.w $0000,$0080
                  dc.w $007C,$FFFC,$007E,$FFFE,$007F,$FFFF,$007F,$FFFF
                  dc.w $007F,$FFFF,$007F,$FFFF,$007E,$FFFE,$007C,$FFFC
flut3:
                  blk.b NBLG*(flut3-lut3),0                              ; 3 autres lutins
                  dc.w $0000,$0000                                       ; fin de liste

                  ; liste lutins 16x6 pairs x7

lut4:             dc.w $0000,$0000
                  dc.w $2670,$1E0C,$E673,$1E0F,$E673,$1E0F,$E673,$1E0F
                  dc.w $E673,$1E0F,$2670,$1E0C
flut4:
                  blk.b NBLM*(flut4-lut4),0                              ; 6 autres lutins
                  dc.w $0000,$0000                                       ; fin de liste

                  ; liste lutins 16x6 impairs x7

lut5:             dc.w $0000,$0080
                  dc.w $01FC,$0000,$01FF,$0000,$01FF,$0000,$01FF,$0000
                  dc.w $01FF,$0000,$01FC,$0000
flut5:
                  blk.b NBLM*(flut5-lut5),0                              ; 6 autres lutins
                  dc.w $0000,$0000                                       ; fin de liste

                  ; liste lutins 16x4 pairs x11

lut6:             dc.w $0000,$0000
                  dc.w $6300,$1F00,$E300,$1F00,$E300,$1F00,$6300,$1F00
flut6:
                  blk.b NBLP*(flut6-lut6),0                              ; 11 autres lutins
                  dc.w $0000,$0000                                       ; fin de liste

                  ; liste lutins 16x4 impairs x11
lut7:             dc.w $0000,$0080
                  dc.w $0080,$0000,$00C0,$0000,$00C0,$0000,$0080,$0000
flut7:
                  blk.b NBLP*(flut7-lut7),0                              ; 11 autres lutins
                  dc.w $0000,$0000                                       ; fin de liste

                  ; liste copper principale
                  even
copper0:          blk.b        8192,0                                    ; a modifier par un allocmem()
fcopper0:


                  even
copperv:          blk.b 24,0                                             ; liste copper vide (ecran noir)

                  end



[Retour en haut] / [Retour aux articles] [Article précédent]