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 1, partie 2, affichage de rasters à l'aide du Copper
(Article écrit par Nori - octobre 2023)
|
|
Monsieur Preskovic
Un peu comme le lapin de Lewis Carroll, je suis toujours en retard, j'avais promis à David Brunet de lui
rendre l'article pour la mi-août, je pourrais prétexter que j'étais très occupé, mais la vérité est
moins glorieuse, un plaisir coupable en fait : j'ai découvert cette merveille qu'est
Indianapolis 500 et j'y ai
joué presque chaque soir avant de me coucher. Une piètre excuse, c'est pourquoi je vous présente
toutes mes confuses.
Création d'une démo, partie 1
Cet article est la première partie d'une série d'articles qui vont vous guider dans la programmation
d'une démo. Celle-ci sera relativement simple, on aura un logo, des effets rasters et du texte défilant.
Chaque futur article présenterait une partie de la démo jusqu'à complétion de celle-ci.
Les frontières s'estompent, les repères se troublent
Il paraît loin le temps où j'ai eu affaire pour la première fois aux rasters. C'était sur mon Commodore 64.
Une intro pirate (je peux l'avouer maintenant car il y a prescription, je ne faisais que jouer et uniquement
avec des logiciels tipiakés) avait particulièrement retenu mon attention car elle affichait plus de
couleurs que ce que j'avais l'habitude de voir auparavant. De plus, ces couleurs, loin d'être statiques,
se mouvaient de telle manière que ça en devenait presque hypnotique. Pourtant, mon manuel technique officiel
de Commodore précisait qu'il ne pouvait y avoir que trois couleurs maximum par cellule de 8x8 pixels,
à cela s'ajoutait une couleur de fond commune, mais il était manifeste qu'il y en avait largement plus.
Les pirates sont des génies, ils auraient trouvé un nouveau mode graphique jusque-là inexploité, me dis-je.
L'affaire en resta là.
Pour les non affranchis, le terme "raster" (je suis désolé, je n'ai pas trouvé d'équivalent en français)
désigne le fait de rédéfinir la même couleur à certaines positions de votre choix du faisceau à électrons
du moniteur. Ça tombe bien, ça, le Copper sait faire, et plutôt bien.
L'intro pirate du jeu Airborn Ranger sur Commodore 64
Environnement de développement
Comme déjà évoqué, nous travaillerons en assembleur.
Je pianote généralement sur une vraie machine mais dans le cadre de cet article, pour des raisons pratiques,
je vais tout faire sur PC et émulateur. Cela m'évitera des transferts longs et fastidieux de sources et
données entre l'Amiga et le PC. Je pourrais utiliser le Workbench sous WinUAE pour développer directement
sous Asm-One mais le clavier PC sous émulation m'est désagréable, car non adapté à l'environnement Workbench.
C'est un détail futile, j'en ai conscience, mais l'Amiga devrait rester une passion, et en tant que tel,
ce serait dommage de basculer vers le déplaisir. Alors comme solution médiane, autant utiliser un éditeur
PC avec un clavier PC. Voilà, je crois que j'en ai fini avec les justifications.
Sans rentrer dans les détails, voici ce que j'ai utilisé pour cet article :
- vasm + vlink.
- WinUAE (configuration A500).
- Éditeur de texte.
vasm est un assembleur assez puissant et rapide. Asm-One est aussi un assembleur, mais cantonné à
l'environnement Amiga classique. Plus modeste, mais pratique et compact avec éditeur de texte intégré.
Il est idéal pour de petits développements.
Le source peut parfaitement être utilisé sous Asm-One sans difficulté, excepté peut-être pour certains
caractères français qui risquent d'être corrompus, mais ça n'empêchera en rien la compilation.
Présentation
Il est temps, je crois, de rentrer dans le vif du sujet. Nous allons utiliser le Copper pour modifier
une seule couleur à plusieurs positions verticales données afin de créer un dégradé. Rien ou presque
n'empêche de modifier plusieurs registres couleur différents sur une ligne, mais nous allons nous en
tenir à quelque chose de simple, de basique. Idéal pour débuter.
Nous allons ensuite rajouter des barres horizontales de rasters qui bougent en mouvement oscillatoire
par-dessus le dégradé qui lui, sera fixe.
Explication
La structure et les étapes du programme pourraient être représentées de manière simplifiée comme suit :
- Attendre que le faisceau à électrons arrive à une position verticale donnée pour pouvoir se synchroniser
avec le moniteur.
- Effacer les barres rasters (c'est-à-dire l'affichage du dégradé de fond).
- Afficher les barres rasters.
- Saut à l'étape première.
Mais avant de commenter ces étapes, je désirerais m'attarder sur une portion du programme qui se déroule durant
l'initialisation. Je veux parler de la construction de la liste Copper :
; construction liste Copper
; entrée:
; sortie:
; regs : d0/d1/d7/a0/a1
initcop6:
lea copper0,a0 ;
move.l #$01060000,(a0)+ ; bplcon3 minimal
move.l #$01fc0000,(a0)+ ; mode 16 bits lutins/plan de bits
; registre définition écran
move.l #$01020000,(a0)+ ; délai DMA plan de bits
move.l #$01040064,(a0)+ ; priorité pdb/lutins
move.w #$0180,(a0)+ ;
move.w #COLB,(a0)+ ; couleur bordure haute
move.l #$01000200,(a0)+ ; écran sans aucun plans de bits
; partie rasters
move.l a0,sdegcop ; sauve pos. ds liste Copper du dégradé de couleurs
lea degrade(pc),a1 ;
move.l #$2cdffffe,d0 ; partie droite ligne
move.l #$2c07fffe,d1 ; partie gauche ligne
move.w #HS-1,d7 ; nb-1 de lignes à traiter
.l: ;
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,.l ; prochaine ligne
move.l #$fffffffe,(a0)+ ; fin liste Copper
|
La partie qui nous intéresse particulièrement est le paragraphe nommé "partie rasters". C'est ici que
le dégradé est généré. C'est aussi dans cette partie que les barres rasters seront injectées dans la
boucle principale. 256 lignes sont créées et voici à quoi ressemble la toute première ligne de ce dégradé
Copper :
$2C07, $FFFE ; premier "wait" de début de ligne.
$0180,$RVB ; couleur de la ligne.
$2CDF,$FFFE ; deuxième "wait" de fin de ligne.
$0180,$000 ; met le bord en noir.
La seconde ligne Copper qui affiche la seconde ligne du dégradé :
$2D07, $FFFE ; premier "wait" de début de ligne.
$0180,$RVB ; couleur de la ligne.
$2DDF,$FFFE ; deuxième "wait" de fin de ligne.
$0180,$000 ; met le bord en noir.
etc. 256 fois...
Si vous avez suivi la première partie
de cet article consacré au Copper, vous ne devriez avoir aucun mal à décrypter ces lignes.
Étape 1
.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
|
Les registres $DFF004 et $DFF006 contiennent les positions verticales et horizontales du faisceau à
électrons. On isole la position verticale (avec un masque) et on la compare à une ordonnée désirée et
choisie. Lorsque le faisceau à électrons atteint cette ordonnée, le traitement peut commencer.
Étape 2
Ce n'est pas un effacement à proprement parler. On se contente de réafficher le dégradé de couleurs, ce
qui fait automatiquement disparaître les barres. Rappelez-vous, nous n'utilisons qu'un seul registre
couleur ($DFF180).
Le dégradé de couleurs du fond est stocké dans une table de valeurs RVB :
degrade:
dc.w $000,$000,$000,$000,$000,$000,$001,$000
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
|
La petite routine (lente) qui s'occupe de copier ces valeurs dans la liste Copper :
lea degrade(pc),a0 ; couleurs du dégradé de fond
move.l sdegcop(pc),a2 ; pt vers liste Copper
move.w #HS-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
|
Étape 3
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
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
|
Nous avons deux boucles imbriquées :
- La boucle ".2" calcule les ordonnées des (16) barres. Elles sont piochées dans la table "tbsin" qui
contient des ordonnées qui décrivent un mouvement oscillatoire.
- La boucle ".1" affiche une barre. Elle récupère l'ordonnée de celle-ci (dans d0) et l'affiche à la
position adéquate dans la liste Copper. Par exemple, si l'ordonnée est nulle, l'affichage de la barre se
fera en tout début de liste Copper qui gère le dégradé. Cette boucle est executée 16 fois (compteur dans
le registre d7).
Remarques
- Le programme coupe le système, évitez donc de le lancer alors que d'autres applications cruciales tournent
en fond.
- Le code n'utilise aucun plan de bits. Tout se fait uniquement en altérant la couleur de fond.
- Sur le plan technique, comparer d'autres programmes à celui-ci, serait un peu comme comparer un
bon vieux Camembert à de La Vache Qui Rit, un pur sang arabe à un percheron ou encore Bourdieu à BHL.
J'ai bien conscience des lacunes qui le jonchent. Mais encore une fois, je tiens à préciser que ce
programme est à but didactique, destiné aux néophytes ou débutants.
Points à améliorer
- Utiliser Allocmen() pour réserver la mémoire nécessaire pour le Copper. Allouer la mémoire dynamiquement
permet de raccourcir la taille du fichier exécutable.
- Utiliser des double tampons pour les listes Copper. Cela permet d'avoir plus d'amplitude dans les
effets affichés.
- Utilisation du Blitter à la place du 68000 pour injecter les couleurs (du fond et des barres) dans
la liste Copper. Valable pour un A500 de base, sur les autres configurations, le 68000 est plus rapide.
- Je n'ai pas utilisé de "include" et autre "incbin" car non adapté à un article affiché.
Au détriment de la lisibilité du source malheureusement.
- Les routines de sauvegarde et restauration du contexte système sont réduites au minimum syndical
(toujours pour gagner en place).
- Le source est utilisable sous Asm-One.
- Je ne possède qu'un Amiga 500, je suis donc incapable de dire si cela fonctionne sur d'autres machines
plus puissantes. Mais à priori, cela ne devrait pas poser de problème.
- Table du mouvement oscillatoire à remplacer par une table sinus normalisée et plus précise.
- Auto-générer la table sinus.
Pour information
Les couleurs ont été générées avec le logiciel RLE.
Un truc qui n'est ni actuel, ni pratique et encore
moins convivial, il ne fonctionne que sur Amiga classique. Il existe d'autres utilitaires pour générer
des dégradés et rasters, plus récents et conviviaux. Vous pouvez aussi choisir, si vous le désirez,
de programmer vos propres utilitaires en assembleur ou autre pour générer vos couleurs, l'avantage c'est
que vous aurez un contrôle total sur le "style" et le caractère de vos dégradés.
RLE sur Amiga 500
Nous arrivons au bout de cet article partie 2. La prochaine fois, nous rajouterons un logo en haut de l'écran.
D'ici là, portez-vous bien.
Résultat : barres de couleurs qui oscillent sur un fond dégradé
Le listing
; **************************************************
; * *
; * EFFET RASTERS *
; * *
; **************************************************
; 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 ;
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
;***************************************************
;* 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
move.w #$7fff,$96(a6) ; désactive tous les DMA
bsr initcopvide ; génère la liste Copper vide
lea $dff000,a6 ; attend d'être dans la zone non affichable
move.l #300<<8,d1 ; avant de continuer
bsr vbl ;
waitblt ; on s'assure que le blitter ne tourne pas
move.w #$7fff,$96(a6) ;
move.w #$83ef,$96(a6) ; active DMA pdb,Copper,Blitter,lutins,zic
move.w #$7fff,$9a(a6) ; coupe interruptions
bsr init ; inits vars/tabs 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
rts
; construction liste Copper
; entrée:
; sortie:
; regs : d0/d1/d7/a0/a1
initcop6:
lea copper0,a0 ;
move.l #$01060000,(a0)+ ; bplcon3 minimal
move.l #$01fc0000,(a0)+ ; mode 16 bits lutins/plan de bits
; registre définition écran
move.l #$01020000,(a0)+ ; délai DMA plan de bits
move.l #$01040064,(a0)+ ; priorité pdb/lutins
move.w #$0180,(a0)+ ;
move.w #COLB,(a0)+ ; couleur bordure haute
move.l #$01000200,(a0)+ ; écran sans aucun plan de bits
; partie rasters
move.l a0,sdegcop ; sauve pos. ds liste Copper du dégradé de couleurs
lea degrade(pc),a1 ;
move.l #$2cdffffe,d0 ; partie droite ligne
move.l #$2c07fffe,d1 ; partie gauche ligne
move.w #HS-1,d7 ; nb-1 de lignes à traiter
.l: ;
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,.l ; prochaine ligne
move.l #$fffffffe,(a0)+ ; fin liste Copper
rts
; active un écran noir vide
initcopvide:
lea copperv,a0 ;
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
; change pts pdbs dans liste Copper
; pour le double tampon
; 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/d7/a0
;setpdbdbf:
;.l:
; move.w d0,6(a0) ;
; swap d0 ;
; move.w d0,2(a0) ;
; swap d0 ;
; add.l d1,d0 ;
; addq.l #8,a0 ;
; dbf d7,.l ;
; rts
; **************************************************
; * *
; * VARS/TABLES *
; * *
; **************************************************
principal: dc.l 0 ; pt vers sous routine principale
sdegcop: dc.l 0 ; pt vers dégradé couleurs ds liste Copper
degrade:
dc.w $000,$000,$000,$000,$000,$000,$001,$000
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 sinus
tbsin: dc.b 128,126,124,123,121,120,118,117,115,113,112
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 ; 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
sintena: dc.w 0 ;
sdmacon: dc.w 0 ;
nom_glib: dc.b"graphics.library",0 ;
even
; **************************************************
; * *
; * SOUS-ROUTINES BOUCLE PRINCIPALE *
; * *
; **************************************************
; tt double tampon
; entrée:
; sortie:
; regs :
;dtampon:
; eor.b #$ff,flgdf ; permute 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 ;
move.w d0,(a0)+ ;
add.w #6,d0 ; déphasage des barres
dbf d7,.ib ;
bsr initcop6 ; construction nouvelle liste Copper
move.l #copper0,$dff080 ; active nouvelle liste Copper
addq.l #6,sdegcop ; pointe directement sur couleur ds liste dégradé Copper
move.l #part6,principal ; débute tt effet rasters
rts
part6:
; bsr dtampon ; tt double tampon
bsr rasters ; tt effets barres de couleurs
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-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
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
; liste Copper principale
even
copper0: blk.b 4096+1024,0 ; à modifier par un allocmem()
fcopper0:
even
copperv: blk.b 24,0 ; liste Copper vide (écran noir)
end
|
|