Suivez-nous sur X

|
|
|
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
|
|
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
|
|
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
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Création d'une démo - chapitre 2, partie 2, les plans de bits
(Article écrit par Nori - février 2024)
|
|
Alien, le 8e passager
Je suis ronchon. Le résultat d'un excès de sucre et de chocolat, probablement. Et j'espère sincèrement
que ma mauvaise humeur ne déteindra pas sur le corps de l'article. Mais vous pardonnerez, au vu de mon état,
ma lente dérive vers le côté orageux.
Récemment, j'ai été aspiré par un court mais non moins intéressant billet qui s'apparentait plus à une
diatribe antichirurgie esthétique, en fait. De grands noms de la réalisation américaine se plaignaient
de l'excès de chirurgie esthétique par des actrices de plus en plus jeunes et nombreuses. La voie vers
la perfection par le biais d'un sourire sans rides leur ouvre grand les bras. Tirer la peau, gonfler les
lèvres ou bloquer certains muscles du visage, entre autres, nuiraient à la qualité du jeu d'acteur. La
raison ? Les rides et mouvements quasi indécelables du visage seraient indispensables à l'émotion juste.
Ici, l'imperfection et l'erreur n'ont pas leur place, mais en contrepartie, on pourrait se poser la question,
pas si paradoxale, de ce que serait la perfection sans son imperfection ? Cet indéfinissable quelque chose
qui nous rendrait imparfaits, donc humain. Ça me ramène à Ripley, lorsqu'elle demanda à Ash (un parfait symbole
de la science) la raison de son admiration pour cet alien, il lui répondit que cet être était parfait,
hautement hostile, dépourvu de toute morale. Elle lutta de toutes ses forces pour ne pas laisser entrer ce
8e passager dans son monde. Peine perdue, non seulement il s'y est engouffré, mais il a converti un à un la
population entière du Nostromo. Un monde où seuls les plus forts, lisses, sans défauts, agressifs et dégagés
de toute empathie, seraient tolérés. Je vous l'ai dit, je suis d'humeur maussade.
Présentation
Le voici donc, cet élément supplémentaire, un logo affiché dans la bande horizontale supérieure de notre écran.
Pour ajouter un peu d'action, nous allons le faire bouger latéralement dans un mouvement oscillatoire. Pour
des raisons de place et ne pas surcharger le source, et donc épargner des lignes supplémentaires à l'article,
nous n'allons utiliser qu'un seul plan de bits, soit deux couleurs pour le dessiner, ou pour résumer simplement,
le logo sera structurellement en monochrome. Pour apporter un peu de fantaisie, nous lui adjoindrons un
dégradé de couleurs changeantes dans le corps.
Pour résumer donc, à l'issue de cet article, nous aurons dans cette démo :
- Un fond dégradé verticalement.
- Des barres de couleurs horizontales qui oscillent verticalement.
- Un logo qui oscille horizontalement.
- Des couleurs mouvantes dans le logo.
Description de notre écran
Notre écran est pour l'instant construit de la manière suivante :
- La zone supérieure de dimension 320x64 pixels contiendra le logo. Cette zone sera paramétrée de
façon à contenir un plan de bits, ce qui permet donc d'avoir des graphismes en deux couleurs.
- La zone juste au-dessous de dimension 320x192 pixels ne contient, pour l'instant, aucun plan de bits.
Elle contiendra des rasters qui déborderont sur les côtés.
Le passage d'un mode graphique à un autre entre les deux zones se fera à leur frontière par des instructions
Copper à la position $6C. Pour trouver cette ordonnée Copper à laquelle procéder à ce changement, rien de plus
simple, nous savons grâce à DIWSTRT ($DFF08e) que l'ordonnée de départ des DMA plans de bits vaut $2C,
le plan de bits contenant le logo a une hauteur définie de 64 pixels de haut. Ce qui nous fait donc : $2C+$40
(64 en décimal) = $6C.
$6C est l'ordonnée de départ de la zone B, à cette position, il suffit d'insérer une instruction WAIT dans
la liste Copper, à ça rajouter d'autres instructions Copper qui modifient les registres d'affichage, nous
obtiendrons ainsi une transition douce et sans perturbation.
Le logo bouge
Nous allons concentrer notre attention sur la zone A. Pour bouger le logo horizontalement, nous allons, à
chaque trame, altérer les pointeurs plans de bits ($E0, $E2, etc.) et les bits de retard DMA plans de bits
contenus dans BPLCON1 ($DFF102).
Si votre mémoire vous est fidèle (Cf. article
précédent), vous vous souviendrez que le retard de DMA n'est effectif que pour les DMA et uniquement
les DMA plans de bits. Les données qui concernent le plan de bits hors zone visible en sont exclues. Ce qui
explique ce phénomène inévitable : tous les pixels qui apparaitraient à gauche du premier pixel de notre écran
visible seront vides, donc affichés avec la couleur n°0 ($DFF180).
Pour contourner ce problème, il suffit de cacher la zone visible de notre écran en utilisant DIWSTR.
Pour illustrer mon propos, il vous suffirait dans le source de remplacer cette ligne :
move.l #$008e2c91,(a0)+ ; DIWSTRT
|
...par celle-ci :
move.l #$008e2c81,(a0)+ ; DIWSTRT
|
En faisant ça, on ramènerait DIWSTRT au même niveau que DDFSTRT, ce qui ferait apparaître les pixels noirs
entrant par la gauche. Donc, pour résumer, on ne peut résoudre le problème, la seule alternative est de
cacher la bande verticale de 16 pixels qui se trouve à l'extrême gauche de notre écran visible. Pour ce
faire, on modifie le registre DIWSTRT en augmentant sa valeur de 16 ($10 en hexadécimal).
Nous pouvons, sur ce schéma, voir cette bande de 16 pixels représentée hachurée en couleur bleu clair :
Conversion de formats
Nous partons du principe que le logo a été dessiné avec un logiciel natif Amiga qui sauve notre fichier
au format ILBM. Malheureusement, notre Amiga ne sait pas reconnaître ce format à l'affichage, il
faudra au préalable passer par une conversion. Pour intégrer le graphisme du logo dans notre démo,
on a le choix parmi plusieurs possibilités. La plus simple et la plus logique serait d'intégrer le
fichier ILBM directement dans notre programme avec une commande "incbin" (inclusion du fichier binaire
dans le corps du programme). Une fois ce fichier intégré, il faudrait ajouter dans le source de la démo
une routine pour convertir son format afin qu'il soit enfin affichable par les circuits graphiques de
l'Amiga, format final que l'on appellera BRUT (RAW en anglais). Toutefois, nous n'allons pas choisir cette
solution, nous allons procéder autrement. Pour ce faire, nous ferons appel à un petit logiciel bien pratique :
IFFMaster. Il permet, entre autres, et c'est ce que l'on va voir, de convertir, au préalable sans que nous
ayons à le faire dans notre source, une image ILBM en format BRUT. Nous pourrons ainsi l'intégrer dans notre
source sans nous soucier de la conversion.
Figure 1 : logiciel IFFMaster
Chargeons l'image (ou la brosse) du logo en format ILBM. Avant tout, bien vérifier que l'image est au bon
format/taille/nombre de couleurs (640x64 pixels en deux couleurs). On obtient quelque chose d'équivalent
à la figure 1. Ensuite, allons dans le menu préférences et activons les options telles que vous les voyez
sur la figure 2.
Figure 2 : menu "Options" d'IFFMaster
Enfin, sélectionnez avec la souris le logo aux dimensions désirées, ici 640x64 pixels, attention soyez
précis, la sélection ne souffre aucun décalage.
Figure 3 : sélection du logo
Allez dans la barre de menu : "Project/Save Brush/As Raw Data". Sauvez le fichier.
C'est celui-ci que l'on utilisera dans notre programme. En temps normal, on devrait aussi sauver
la palette pour l'intégrer dans ASMOne mais comme il s'agit d'un dessin en monochrome, on le
fera directement à la main dans le source, ce sera plus rapide.
Initialisation de la zone logo
Intéressons-nous à la manière dont on met en place la bande écran contenant le logo. Pour ce faire,
nous utilisons le mieux qualifié pour ce genre de tâche, à savoir le Copper. C'est pourquoi nous allons
décrire la manière dont nous l'initialisons (sous routine "initcop"). Procédons par étape :
La palette
La palette du logo est chargée dans les registres couleurs. Ici rien de bien compliqué, puisque nous n'avons
que deux couleurs, celle du fond et celle du logo en soi.
lea pallogo(pc),a1 ; tableau contenant les valeurs RVB de la palette
move.w #$0180,d0 ; 1er registre couleur
move.w #(1<<NBPDBL)-1,d7 ; nb-1 couleurs
.c: ;
move.w d0,(a0)+ ;
move.w (a1)+,(a0)+ ; couleur
addq.w #2,d0 ; incrémente registre couleur
dbf d7,.c ; prochaine couleur
|
Dimension fenêtre affichage
Rien de bien extraordinaire, des dimensions d'écran standard, à savoir 320x256. Bien évidemment,
la hauteur de l'écran sera tronquée à 64 pixels par le Copper. A noter aussi la bande de 16 pixels
la plus à gauche de notre écran qui est cachée (pour les explications, voir plus haut), nous avons donc
un écran visible de 304x64.
move.l #$008e2c91,(a0)+ ; DIWSTRT / cache le 1er mot de DMA à chqe ligne
move.l #$00902cc1,(a0)+ ; DIWSTOP
move.l #$00920038,(a0)+ ; DDFSTR
move.l #$009400d0,(a0)+ ; DDTSTOP / 20 mots de DMA chargés à chqe ligne
|
Pointeurs plans de bits
Nous devons indiquer à quelles adresses se situent les plans de notre logo. IFFMaster les range l'un après
l'autre, il peut aussi, en fonction de ce qu'on lui indiquerait dans les préférences, les ranger d'une
manière différente, mais on expliquera ce point particulier dans un autre billet, pour l'instant, contentons-nous
d'une méthode basique. De toute façon, nous n'avons qu'un seul plan, la question ne se pose pas réellement.
Si notre logo était en huit couleurs par exemple, ses plans seraient rangés de la manière suivante :
- Premier plan rangé à une adresse donnée, par exemple dans notre source l'adresse est "logo".
- Le deuxième plan se situerait à l'adresse : logo+taille du premier plan.
La taille du premier plan vaut : largeur*hauteur, en octets. Ce qui nous donnerait dans notre cas :
(640/8)*hauteur = 80*64 = 5120 octets. Notre second plan se trouverait donc à logo+5120.
- Troisième plan : logo+(taille1erplan)*2.
Nous aurions donc : logo + 5120*2 = logo+10240
Quelle que soit la méthode de rangement, prenez soin de poser les plans à des adresses paires.
Dans ce cas précis, nous sommes dans un cas particulier, à savoir, il n'y a qu'un seul plan de bits (logo
en deux couleurs). Nous n'avons donc que les pointeurs BPL1PTH et BPL1PTL ($DFF0EO et $DFF0E2) à renseigner.
C'est ce que fait cette routine :
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 byte d'1 pdb => 80*64 = 5120 octets
move.w #NBPDBL-1,d7 ; nb-1 de pdb
bsr setpdb ; injecte init pdb ds liste Copper
.
.
.
.
; injecte pts pdbs dans liste Copper
; entree: d0= adr 1er pdb
; d1= taille en byte 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 ;
rts
|
"sptlogo" contient l'adresse mémoire exacte où se trouveraient les instructions Copper du chargement des
registres vidéo, ces instructions Copper sont comme suit :
$00E0,Adresse haute plan de bit 0 logo
$00E2,Adresse basse plan de bit 0 logo
Retard de DMA
Le changement de pointeurs vidéo seul ne suffit pas à obtenir un déplacement d'écran fluide (déplacement par
pas de 1 mot, soit 16 pixels), il faut y adjoindre un déplacement plus fin (précision de 1 pixel).
Dans cette routine d'initialisation Copper, nous mettons en place le registre BPLCON1 ($DFF102). Nous en
profitons aussi pour sauver l'adresse Copper du contenu de ce registre $102 dans sretardlogo (réutilisé
dans la boucle principale). Ce qui nous donnerait quelque chose comme : $010200xx où x = [0,15].
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)+ ; délai DMA plan de bits
|
Pour résumer, afin d'obtenir un déplacement fin, à chaque trame, dans la boucle principale, en fonction
d'une abscisse de logo : nous calculons l'adresse du plan de bits du logo que nous injecterons dans la
liste Copper (adresse retrouvée grâce à sptlogo) et nous injectons aussi un décalage plus fin qui nous
permet de placer le logo plus précisément (adresse d'injection retrouvée grâce à sretardlogo).
Modulos
Pour les modulos, c'est très simple. Nous soustrayons la largeur totale du plan de bits de la largeur de
l'écran visible, tout ça en octet, le résultat doit être pair. Ce qui donne : (LL/8)-(WL/8) = 80-40 = 40.
C'est ce que fait ce passage :
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
|
Mode écran
Et enfin, nous renseignons BPLCON0, pour indiquer le mode graphique et le nombre de plans. Ce que fait ce code :
move.w #$0100,(a0)+ ; registre contrôle pdb
move.w #(NBPDBL*$1000)+$0200,(a0)+ ; écran 1 plan de bits
|
Arrivé à ce stade, nous avons un logo affiché, fixe.
A cela, nous allons lui adjoindre la possibilité d'avoir un dégradé de lignes horizontales dont leurs
couleurs seront dégradées verticalement. Nous rajouterons donc le code suivant :
; dégradé couleurs dans logo
move.l a0,sdeglogocop ; sauve pos. ds liste Copper des couleurs du dégradé logo
addq.l #6,sdeglogocop ; on se positionne directement sur la 1ère couleur
lea deglogo(pc),a1 ; table de couleurs du dégradé
move.l #$2bdffffe,d0 ; 1er WAIT
move.w #HL-1,d7 ; couleurs sur toute la hauteur du logo
.l1: ;
move.l d0,(a0)+ ; WAIT Copper
move.w #$0182,(a0)+ ; couleur du logo à dégrader
move.w (a1)+,(a0)+ ; couleur de la ligne
add.l #$01000000,d0 ; incrémente ordonnée du WAIT
dbf d7,.l1 ; prochaine ligne
|
Il suffira ensuite dans la boucle principale, à chaque trame, d'altérer les couleurs qui se trouvent à
chaque ligne. Nous pourrons accéder à ces couleurs grâce au pointeur au préalable renseigné dans "sdeglogocop".
Une fois le logo complètement affiché, nous remettrons à zéro le compteur de plans (dans BPLCON0) ce qui
équivaut à couper les DMA plans de bits. Ce que fait ce code :
move.l #(($2b+HL)<<24)+($df<<16)+$fffe,(a0)+ ; wait fin logo et début rasters = $6bdffffe
move.l #$01000200,(a0)+ ; désactive tous les plans de bits
|
Ce qui génére ce code Copper :
$6bdf,$fffe ; WAIT à l'ordonnée 6D, abscisse $DF
$0100,$0200 ; MOVE la valeur $0200 dans $DFF100
|
Après ces instructions Copper, nous serions prêts, si on le désirait, à la définition d'une nouvelle fenêtre
ou plusieurs, au choix. Ici en l'occurrence, nous n'avons qu'un reste d'écran dépourvu de plans.
Boucle principale
Un peu d'action. Quittons la construction de la liste Copper et intéressons-nous à présent à ce qui se
passe à chaque trame. La routine suivante est appelée à chaque trame afin de faire bouger le logo latéralement.
; mvt oscillatoire logo
; entrée:
; 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 grâce à incrémentation index
and.w #$00ff,d1 ; empêche débordement index
move.w d1,itbmvtlogo-tbmvtlogo(a0) ; réinjecte nouvel index
add.w d0,d0 ; table en .W
move.w (a0,d0.w),d0 ; abscisse
add.w #WL/2,d0 ; recentrage 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 ;
lsl.w #4,d2 ;
or.w d2,d1 ;
move.l sretardlogo(pc),a0 ; pos. du registre retard ds liste Copper
move.w d1,(a0) ; injecte nouvelle valeur retard
move.l sptlogo(pc),a0 ; pos. ds liste Copper
move.l #LL/8*HL,d1 ; taille en byte d'1 pdb
move.w #NBPDBL-1,d7 ; nb-1 de pdb à traiter
bsr setpdb ; injecte pt pdb ds liste Copper
|
Nous allons chercher une abscisse dans la table de mouvement oscillatoire "tbmvtlogo".
Grâce à cette abscisse, nous calculons l'adresse du plan de bits et le retard de DMA.
Calcul adresse plan :
lsr.w #4,d0 ; nbre de mots
add.w d0,d0 ; adresse partielle paire, en octets
add.l #logo,d0 ; adresse finale
|
Nous calculons l'adresse relative partielle du logo par rapport au bord gauche de l'écran. Le résultat est
ajouté à l'adresse du plan de bits, ici, nous l'avons appelé "logo".
Ensuite, le décalage plus fin se calcule de la façon suivante :
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
|
Le calcul est lui aussi assez simple. Nous n'avons besoin que des quatre derniers bits de l'abscisse du
logo car le retard DMA ne peut avoir que des valeurs appartenant à l'ensemble [0,15]. Pour ce faire,
nous effaçons les autres bits avec un "and.w #$000F,d1". Nous n'avons plus qu'à faire 15-d1 = retard.
Dernière opération, il faut dédoubler cette valeur dans les quatre bits supérieurs car si l'on jette un
oeil à BPLCON1, nous avons :
BPLCON1 détail. La Bible De L'Amiga, © Micro Application
Effectivement, le retard des plans pairs se trouve dans les bits 0-3 et ceux des plans impairs dans les
bits 4-7.
Le dédoublement de cette valeur se fait comme suit :
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
|
Nous n'avons plus qu'à injecter cette valeur dans la liste Copper :
move.l sretardlogo(pc),a0 ; pos. du registre retard ds liste Copper
move.w d1,(a0) ; injecte nouvelle valeur retard
|
Enfin, nous injectons l'adresse du plan de bits du logo (= registre d0) dans la liste Copper :
add.l #logo,d0 ; adresse finale plan du logo
move.l sptlogo(pc),a0 ; pos. ds liste Copper
move.l #LL/8*HL,d1 ; taille en byte de 1 pdb
move.w #NBPDBL-1,d7 ; nb-1 de pdb à traiter
bsr setpdb ; injecte pt pdb ds liste Copper
|
Concernant les remarques et points à améliorer, ceux évoqués dans le
chapitre consacré au Copper
s'appliquent aussi ici, donc rien de nouveau.
Nous arrivons au bout de l'article. La prochaine étape sera la mise en place d'un champ de lutins se
mouvant en (pseudo) parallaxe.
Capture d'écran de notre démo
; **************************************************
; * *
; * DEMO OBLIGEMENT *
; * *
; **************************************************
; date: octobre 2023
; auteur: NoRi
; plateforme: Amiga OCS (512Ko minimum)
; compileur/linkeur: VASM + VLINK (ou Asm-one)
; publication: Amiga Obligement
INCDIR "" ; recherche fichiers et données dans le répertoire
section programme,code_p ; hunk pour DOS, alloue mémoire pour code
DEBUG = 0 ; drapeau activation des parties code pour debogage
; constantes pour écran
LECRAN = 320 ; largeur écran video affichage
HECRAN = 256 ; hauteur écran video affichage
; données affichage écran (centrage affichage)
XSTRT = 129 ; position de départ
XSTOP = XSTRT+LECRAN ; 129+320
YSTRT = $2c ;
YSTOP = YSTRT+HECRAN ;
HSTRT = XSTRT-16 ; 129-16
RES = 8 ; 8=basse résolution (4=haute résolution)
; **************************************************
; * CONSTANTES ECRAN PRINCIPAL *
; **************************************************
NBP = 0 ; nb de plan de bits
WS = LECRAN ; largeur écran de travail
HS = HECRAN ; hauteur écran 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 écran logo, DMA*16
; ***************************************************
; * MACRO DEFINITION *
; ***************************************************
; macro d'attente de la libération du blitter
waitblt MACRO
tst.b $02(a6) ; évite bug A4000
.\@ btst #6,$02(a6) ;
bne.b .\@ ;
ENDM
debut:
; **************************************************
; * INIT GENERALES *
; **************************************************
bsr sauvesys ; pas terrible à remplacer par qqch de plus solide
lea $dff000,a6 ; adresse de base registres spécialisés de l'amiga
waitblt ; on s'assure que le blitter ait fini
bsr initcopvide ; génère la liste Copper vide
move.w #$7fff,$96(a6) ; désactive tous les DMA
lea $dff000,a6 ; attend d'être dans la zone non affichable
move.l #300<<8,d1 ; avant de continuer
bsr vbl ;
move.w #$83c0,$96(a6) ; active DMA pdb,Copper,blitter
move.w #$7fff,$9a(a6) ; coupe interruptions
bsr init ; inits générales
; **************************************************
; * *
; * BOUCLE PRINCIPALE *
; * *
; **************************************************
bouclep:
lea $dff000,a6 ; synchro verticale
move.l #280<<8,d1 ;
bsr vbl ;
move.l principal,a0 ; récupère pointeur vers routine principale en cours
jsr (a0) ; tt principal
btst.b #6,$bfe001 ; test bouton gauche souris appuyé ?
bne.b bouclep ; non alors continue la boucle
exit: ; oui
bsr restauresys ; pas terrible à remplacer par qqch de plus solide
clr.l d0 ; code retour Amiga DOS
rts ; sortie vers DOS
; **************************************************
; * *
; * SOUS-ROUTINES GENERALES *
; * *
; **************************************************
; synchro verticale
; entrée: 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 à électron 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
; désactive éventuels lutins parasites
lea $dff000,a6 ; on veut être sûr d'être dans la zone
move.l #300<<8,d1 ; du temps mort vertical avant de
bsr vbl ; traiter la désactivation des lutins
lea $140(a6),a0 ;
move.w #$0020,$96(a6) ; désactive DMA lutins
moveq #8-1,d7 ; désactive les 8 lutins
.l: ;
clr.w (a0)+ ; efface SPRxPOS
clr.w (a0)+ ; efface SPRxCTL
clr.w (a0)+ ; efface SPRxDATAA
clr.w (a0)+ ; efface SPRxDATAB
dbf d7,.l ; tt prochain lutin
rts
; construction liste Copper
; entrée:
; 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 supérieure = 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 ; incrémente registre couleur
dbf d7,.c ; tt prochaine couleur
move.l #$008e2c91,(a0)+ ; DIWSTRT / cache le 1er mot de DMA à chqe ligne
move.l #$00902cc1,(a0)+ ; DIWSTOP
move.l #$00920038,(a0)+ ; DDFSTR
move.l #$009400d0,(a0)+ ; DDTSTOP / 20 mots de DMA chargés à 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)+ ; délai DMA plan de bits
move.l #$01040064,(a0)+ ; priorité 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)+ ; écran 1 plan de bits
; dégradé couleurs ds logo
move.l a0,sdeglogocop ; sauve pos. ds liste Copper des couleurs du dégradé logo
addq.l #6,sdeglogocop ; on se positionne directement sur la 1ère couleur
lea deglogo(pc),a1 ; table de couleurs du dégradé
move.l #$2bdffffe,d0 ; 1er WAIT
move.w #HL-1,d7 ; nb-1 de lignes à traiter
; -> couleurs sur toute la hauteur du logo
.l1: ;
move.l d0,(a0)+ ; WAIT Copper
move.w #$0182,(a0)+ ; registre couleur du logo à dégrader
move.w (a1)+,(a0)+ ; couleur de la ligne
add.l #$01000000,d0 ; incrémente ordonnée du WAIT
dbf d7,.l1 ; tt prochaine ligne
move.l #(($2b+HL)<<24)+($df<<16)+$fffe,(a0)+ ; wait fin logo et début rasters = $6bdffffe
move.l #$01000200,(a0)+ ; désactive tous les plans de bits
; écran principal = dégradé et barres couleurs
move.l a0,sdegcop ; sauve pos. ds liste Copper du dégradé de couleurs
lea degrade(pc),a1 ;
move.l #$6cdffffe,d0 ; partie droite ligne
move.l #$6c07fffe,d1 ; partie gauche ligne
move.w #HS-HL-1,d7 ; nb-1 de lignes à traiter
.l2: ;
move.l d1,(a0)+ ; wait pour bordure gauche
move.w #$0180,(a0)+ ; couleur de fond dégradée
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 écran 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 degradé couleurs ds liste Copper
degrade:
dc.w $000,$000,$000,$000,$000,$000,$001,$000 ; couleurs du dégradé
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 ; index 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 dégradé couleurs logo ds liste Copper
deglogo:
dc.w $FFF,$FFF,$FFF,$EFF,$EFF,$EFF,$EFF,$DFF ; liste couleurs du dégradé 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 dégradé 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
; **************************************************
; * *
; * SOUS-ROUTINES BOUCLE PRINCIPALE *
; * *
; **************************************************
; tt double tampon
; entrée:
; 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
; entrée:
; sortie:
; regs : d0/d7/a0
initpart6:
bsr initcopvide ; écran 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 ; empêche débordement index
move.w d0,(a0)+ ;
add.w #6,d0 ; déphase 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 à la prochaine trame
clr.w itbsin ; raz index table sinus
addq.l #6,sdegcop ; pointe directement sur couleur ds liste dégradé Copper
move.l #part6,principal ; à la prochaine trame, le tt se fera
; dans l'effet démo en-soi
rts
part6:
; bsr dtampon ; tt double tampon
bsr rasters ; effet de couleurs barres et fond coloré
bsr cologo ; effet couleurs dans logo
bsr mvtlogo ; oscillation horizontale logo
rts
; couleurs mouvantes dans logo
; entrée:
; 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 ; déplace couleurs
and.w #$00ff,d0 ; empêche débordement index
move.w d0,ideglogo-deglogo(a0) ; sauve nouvel index
move.l sdeglogocop(pc),a1 ; 1ère couleur du dégradé ds liste Copper
move.w #HL-1,d7 ; nb-1 de couleurs à traiter
.l: ;
and.w #$00ff,d0 ; empêche débordement 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 ; déplace pos. 1ère couleur
and.w #$00ff,d0 ; empêche débordement index
dbf d7,.l ; tt prochaine ligne
rts
; mvt oscillatoire logo
; entrée:
; 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 grâce à incrémentation index
and.w #$00ff,d1 ; empêche débordement index
move.w d1,itbmvtlogo-tbmvtlogo(a0) ; réinjecte 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 à traiter
bsr setpdb ; injecte pt pdb ds liste Copper
rts
; tt effets de couleurs au Copper
; entrée:
; sortie:
; regs : d0/d6/d7/a0/a1/a2/a3/a4
rasters:
; tt effacement barres rasters
lea degrade(pc),a0 ; couleurs du dégradé de fond
move.l sdegcop(pc),a2 ; pt vers liste Copper
move.w #HS-HL-1,d7 ; 256 lignes à 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)+ ; incrémente index
and.w #$00ff,d0 ; évite débordement
move.b (a1,d0.w),d0 ; ordonnée écran 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. début dégradé 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 ;
; ***********************************************
; * *
; * CHIP RAM *
; * *
; ***********************************************
section donneesgraph,data_c
; premier plan du logo qui est déjà préchargé 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 Copper principale
even
copper0: blk.b 4096+2048,0 ; à modifier par un allocmem()
fcopper0:
even
copperv: blk.b 24,0 ; liste Copper vide (écran noir)
end
|
|