Obligement - L'Amiga au maximum

Vendredi 23 mai 2025 - 21:17  

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 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.

Copper
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 :
  1. Attendre que le faisceau à électrons arrive à une position verticale donnée pour pouvoir se synchroniser avec le moniteur.
  2. Effacer les barres rasters (c'est-à-dire l'affichage du dégradé de fond).
  3. Afficher les barres rasters.
  4. 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.

Copper
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.

Copper
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



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