Amstrad Plus Index du Forum

Amstrad Plus
Découverte de la gamme Old et Plus des Cpc d'Amstrad.

 FAQFAQ   RechercherRechercher   MembresMembres   GroupesGroupes   S’enregistrerS’enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

*****Les sprites soft sur Cpc
Aller à la page: 1, 2, 3  >
 
Poster un nouveau sujet   Répondre au sujet    Amstrad Plus Index du Forum -> Bienvenue sur ce forum -> Programmation
Sujet précédent :: Sujet suivant  
Auteur Message
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Mar 18 Juil - 11:21 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

Plusieurs solutions sont à envisager pour l'affichage des sprites. Avant toute chose, cela dépends du contexte dans lequel vous voulez les afficher, masqués ou pas, au pixel, à l'octet, mais aussi du mode graphique dans lequel ils sont affichés.

Commençons par le commencement. Qu'est-ce qu'un sprite ? C'est ni plus ni moins qu'un amas de pixels affichés à l'écran à une position x,y.

1. L'affichage simple

Il est de type affichage sur un fond vide, c'est ce que nous pourrions appeler de façon vulgaire, l'affichage d'un window

Le principe :

On va lire les datas du sprite et l'afficher "bêtement" à l'écran dans tenir compte du fond.

En gros, plusieurs options sont disponibles.

Méthode 1.

Code:
     ld de,#c000 ; adresse écran où afficher votre window
     ld hl,#1000 ; adresse où se trouve les datas de votre sprite
     ld a,(hl) ; on prends le premier octet du sprite
     ld (de),a ; on poke à l'écran
     inc hl ; on passe un octet plus loin
     inc de ; on passe à l'octet suivant
... etc...



optimisation possible : utilisation de inc l/inc e à la place de inc hl/inc de.
Cette routine nécessite 8us pour afficher un octet, soit 2 pixels en mode 0, 4 pixels en mode 1, et 8 pixels en mode 2.
En optimisant un peu, on gagnerait 2us, ce qui porterait la routine à 6us au lieu de 8us par octet.

Méthode 2.

Utilisation de Ldi ou Ldir

Code:
    ld de,#c000 ; adresse écran
    ld hl,#1000 ; sprite
    ldi ; transfert
...



ou

Code:
     ld de,#c000 ; adresse écran
     ld hl,#1000 ; sprite
     ld bc,5 ; nbre d'octets à copier
     ldir
...



Un ldi prends 5us pour le transfert d'un octet, ce qui reste le plus intéressant.
Optimisation possible : il suffit de mettre ld a,(hl):ld (de),a pour copier le dernier octet ce qui ne prendra que 4us. On gagnera donc 1 us mais seulement au dernier octet.

L'instruction LDIR prends 6us mais évite aussi les répétions du style :

Code:
...
     ldi ; routine A
     ldi
     ldi
     ldi
     ldi
...


Cependant, la routine suivante sera plus rapide que :
Code:
....
     ld bc,5 ; routine B
     ldir
.....


La routine A prendra 25 us, là ou la routine B prendra 28 us.
Utiliser des routines déroulées sera donc plus rapide, mais si vous manquez de place, utilisez plutôt la routine B ou achetez-vous une X-Mem ! Avec 512K de ram, ça devrait aller mieux.

Méthode 3.

La méthode suivante utilise la pile pour aller chercher les données.

Code:
     di ; on désactive les interruptions
     ld (pile+1),sp ; on sauve la pile avant de l'utiliser
     ld sp,#1000 ; on pointe la pile vers les datas du sprite
     ld hl,#c000 ; adresse écran à laquelle afficher les datas
     pop de ; on récupère les datas 2 par 2 (d et e)
     ld (hl),e:inc hl
     ld (hl),d:inc hl
....
pile ld sp,#caca
      ei ; on restaure les interruptions
      ret


Le code de transfert se fait 2 octets par 2 octets. Il prends 11us pour afficher 2 octets. il est donc plus lent que 2 ldi (5us par ldi).
Optimisation : utilisation de inc l à la place de inc hl ce qui porterait le transfert à 9us pour 2 octets et serait donc plus rapide que 2 ldi.


Une autre possibilité serait l'affichage direct à la pile.

Code:
     di ; on désactive les interruptions
     ld (pile+1),sp ; sauve toujours la pile avant utilisation
     ld sp,#c000+2 ; sp pointe sur l'adresse écran 
     ld hl,#FFAA ; on précharge les datas du sprites
     push hl ; on poke H en #c001 puis on poke L en #c000
...


L'instruction push prends 4us soit un total de 7us avec les valeurs pré-chargées dans HL. 7us pour afficher 2 octets. C'est la méthode la plus rapide ici... Vous me suivez ?

On peut aussi utiliser cette méthode mais sans la pile.

Méthode 4.

Cette méthode reste la même que celle utilisée plus haut.
Code:
     ld hl,#c000
     ld de,#ffaa
     ld (hl),e:inc hl
     ld (hl),d:inc hl
...  


L'instruction ld (hl),reg prends 2us soit 11 us pour 2 octets pré-chargés.
Optimisation possible : remplacer inc hl par inc l soit un gain de 2us pour 2 octets. On est encore loin des 7us.

Une autre possiblité pourrait être :

Code:
     ld hl,#c000
     ld (hl),#aa:inc hl
     ld (hl),#ff:inc hl
...



L'instruction ld (hl),valeur prends 3 us soit 10 us pour afficher 2 octets.
Optimisation : remplacer inc hl par inc l et on passera à 8us pour 2 octets.

Concernant l'optimisation qui consiste à remplacer une instruction d'incrémentation 16 bits (inc hl) par une instruction 8 bits (inc l) cela n'est possible que si vous ne dépassez pas la valeur 256, donc avec un écran reformaté à 64 char, type arkanoid, rick dangerous par exemple.
Un truc à retenir cependant lorsque vous partez d'un adresse paire (par exemple #c000), on peut alterner inc l puis inc hl, ce qui permet de gagner 1us tous les 2 octets et permet le dépassement (>256).
Dans le cas où l'adresse serait impaire (#c001 par ex), il faudrait d'abord faire un inc hl puis un inc l.


Une fois tous les octets de la première ligne du sprite affichés, il faut passer à la seconde. Cela se fait via le vecteur #bc26 redéfini par mes soins. En effet, celui du système ne permet de travailler que sur des écrans de 80 chars.
Un simple res 3,h vous permettra de ne pas dépasser la limite des adresses écran, n'est-ce pas Roudoudou ?

2. L'affichage masqué

Il ne vous aura pas échappé que les routines proposées plus haut vous permettent effectivement d'afficher un sprite mais aussi que celui ci détruit le background qui est devant/derrière.

La solution est de passer par les masques. Masquer un sprite permet donc de l'afficher devant ou derrière le fond.

La routine serait de type :
Code:
; hl=adresse ecran
; de=data du sprite
...
        ld a,(de) ; recup data sprite
        ld c,a     ; on sauve dans c
        ld a,(hl) ; recup le fond
        and xx   ; on applique le masque
        or c       ; voir aussi add a,c - on poke data du sprite
        ld (hl),a ; on affiche à l'écran
        inc hl    ; prochaine adresse ecran
        inc de   ; prochain octet du sprite
...


Comme vous pouvez vous en douter, masquer un sprite prends plus de temps machine, ici 14us contre 5us (avec ldi)

Voyons maintenant comment fonctionne l'instruction AND

And | 0 | 0 | -> 0
       | 1 | 0 | -> 0
       | 0 | 1 | -> 0
       | 1 | 1 | -> 1

Ainsi si a=255 (%11111111) et qu'on applique un and #0f (%00001111), ne seront conservés que les bits positionnés à 1. Ceux positionnés à 0 seront purement et simplement effacés, a serait donc égal à #0f.

Laissons place à l'instruction OR

OR   | 0 | 0 | -> 0
       | 1 | 0 | -> 1
       | 0 | 1 | -> 1
       | 1 | 1 | -> 1

Si le a=&F0 (&x11110000) et qu'on applique un or 3 (%00000011), a prendrait la valeur de #f3 (&x11110011).

Tout ceci est ultra simple, mais ce n'est pas sans compter l'entrelacement des pixels sur Cpc. Pour compliquer encore plus la chose, celui-ci varie en fonction du mode écran 0, 1 ou 2.

2a. Le mode 2

C'est le plus simple ! Chaque bit est égal à un pixel. Pour rappel, le mode 2 ne permet de travailler que sur 2 couleurs, une pour le fond, une pour l'encre.
En mode 2, chaque octet permet d'afficher 8 pixels.

Mode 2 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
              |----------------------------------- Pixel le plus à gauche
                                                    |------ Pixel le plus à droite

2b. Le mode 1

Le mode 1 permet, comme tout le monde le sait déjà, permet de travailler avec 4 couleurs, 1 pour le fond et 3 pour l'encre. En mode 1, chaque octet contient 4 pixels.

Mode 1 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
               |---------------|-----------------  Pixel le plus à gauche
                    |---------------|-------------- 2ème Pixel
                         |--------------|----------- 3ème Pixel
                              |---------------|------ 4ème Pixel, pixel le plus à droite

Si nous dégrossissons la chose, on s'aperçoit que les pixels fonctionnent par duo de pixels avec, en partant de gauche à la droite, les bits 7 et 3 pour le pixel 1, les bits 6 et 2 pour le pixel 2, les bits 5 et 1 pour le pixel 3 et les bit 4 et 0 pour le pixel 4.

L'organisation des bits permet de définir la couleur du pixel affiché.

Val   | 1 | 2 |
Bits | 0 | 0 | -> Couleur encre 0
       | 1 | 0 | -> Couleur encre 1
       | 0 | 1 | -> Couleur encre 2
       | 1 | 1 | -> Couleur encre 3              

Prenons un exemple simple, imaginons que nous voulions avoir le pixel 2 dans l'encre 2
a serait égal à %00000100

Vous voyez le truc ? 01 = encre 2
Code:
..
        ld a,%00000100 ; 2ème pixel (gauche) encre 2
        ld (#c000),hl


ou en basic
Code:
poke &c000,&x00000100



2c. Le mode 0

En mode 0, vous aurez droit à 16 couleurs, 1 pour le fond et 15 encres. Comme d'habitude, pour ne rien changer, l'entrelacement des pixels est là aussi différent. Au lieu de fonctionner par duo de bits, nous aurons des quartets de bits, soit 2 pixels affichés par octet.

Mode 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
               |-------|-------|------|----------  1er Pixel, Pixel le plus à gauche
                    |-------|-------|-------|------ 2ème pixel, pixel le plus à droite


Pour résumer, les bits 7, 5, 3 et 1 concernent le pixel de gauche alors que les bits 6, 4, 2 et 0, le pixel de droite. Voyons l'organisation des couleurs.

Val   | 1 | 4 | 2 | 8 |
Bits | 0 | 0 | 0 | 0 | -> Couleur encre 0
       | 1 | 0 | 0 | 0 | -> Couleur encre 1
       | 0 | 0 | 1 | 0 | -> Couleur encre 2
       | 1 | 0 | 1 | 0 | -> Couleur encre 3
       | 0 | 1 | 0 | 0 | -> Couleur encre 4
       | 1 | 1 | 0 | 0 | -> Couleur encre 5
       | 0 | 1 | 1 | 0 | -> Couleur encre 6
       | 1 | 1 | 1 | 0 | -> Couleur encre 7
       | 0 | 0 | 0 | 1 | -> Couleur encre 8
       | 1 | 0 | 0 | 1 | -> Couleur encre 9
       | 0 | 0 | 1 | 1 | -> Couleur encre 10
       | 1 | 0 | 1 | 1 | -> Couleur encre 11
       | 0 | 1 | 0 1 | -> Couleur encre 12
       | 1 | 1 | 0 1 | -> Couleur encre 13
       | 0 | 1 | 1 1 | -> Couleur encre 14
       | 1 | 1 | 1 1 | -> Couleur encre 15        


Comme un exemple vaut mieux qu'un long discours essayons de mettre le pixel 1 à l'encre 1 et le pixel 2 à l'encre 10

1er    pixel -> 1x0x0x0x -> 1000 = encre 1
2ème pixel -> x0x0x1x1 -> 0011 = encre 10

On mixe les 2 pixels soit

10000101

Code:
        ld a,%10000101 ; Pixel Gauche (encre 1) | Pixel Droit (encre 2)
        ld (#c000),a


en basic
Code:
poke &c000,&x10000101



L'essayer, c'est l'adopter !!!

3. L'utilisation des masques

Supposant qu'un exemple vaut tous les longs discours nous allons essayer de mettre le pixel 3 encre 1 sur les pixels 0,1,2,3 encre 3. (Mode 1, soyons précis!)

Code:

...
;
; Mode 1
;
        ld a,#ff ; 4 pixels encre 3
        ld hl,#c000
       
        ld c,%0010000 ; pixel 3 encre 1
        and %11011101 ; on garde tous les pixels sauf le 3ème qu'on mets à zéro
        or c                   ; on poke le pixel 3 encre 1
        ld (hl),a             ; on affiche à l'écran


Petit rappel utile, lorsque l'on fait un AND, si le bit est à 1 la valeur du bit est conservée, dans le cas contraire, elle est effacée.

       
A suivre...
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Dernière édition par Ast le Ven 28 Juil - 15:10 (2017); édité 7 fois
Revenir en haut
Publicité






MessagePosté le: Mar 18 Juil - 11:21 (2017)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
roudoudou


En ligne

Inscrit le: 14 Juil 2016
Messages: 274
Localisation: LYON

MessagePosté le: Mar 18 Juil - 12:06 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

Et les sprites générés, tu connais des jeux qui le font? Parait que Trantor en met pour le perso principal

Code:

LD DE,#1234
LD (HL),D
INC L
LD (HL),E
INC L


Revenir en haut
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Mar 18 Juil - 12:10 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

Oui j'ai écrit en même temps que tu devais poster, juste après ma pause repas. Mort de Rire

A ce propos, un inc l n'est pas toujours possible!
2 cas connus, redéfinir un écran à 64 ou 128 chars avec le reg 2 du crtc.

Code:
     ld bc,#bc02
     ld a,#20 ; 64 chars
     out (c),c
     inc b
     out (c),a
...




Pour l'affichage 128 chars, ça se complique...

Code:
     ld bc,#bc00     ld a,#40 ; pour éviter l'overflow ou l'écran noir
     out (c),c
     inc b
     out (c),a
     ld bc,#bc02 ; puis 128 chars     out (c),c
     inc b
     out (c),a
...



_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Mar 18 Juil - 12:32 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

roudoudou a écrit:
Et les sprites générés, tu connais des jeux qui le font? Parait que Trantor en met pour le perso principal


LD DE,#1234
LD (HL),D
INC L
LD (HL),E
INC L





Gryzor, renegade, tous les jeux de david perry, de trantor à savage.... en plus encore !
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
snake_plissken


Hors ligne

Inscrit le: 03 Déc 2014
Messages: 281
Localisation: les pont de cé

MessagePosté le: Mar 18 Juil - 12:44 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

Merci pour ces infos !

Revenir en haut
Tronic


Hors ligne

Inscrit le: 20 Mai 2015
Messages: 15

MessagePosté le: Mer 19 Juil - 16:56 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

Salut,
Sympa ce thread.
Pour ce que ça vaut et selon effectivement le contexte d'affichage+effet souhaité, j'avais fait pour ma part un truc de ce style il y a quelques années (voir dsk en pj) pour la partie de fin de la cuddly (qui n'est jamais sortie donc et dont je ne sais même pas si elle a été vue/distribuée...).
Bref... L'objectif initial était de faire un gros logo GPA qui "ondule en sinus" et ce par dessus une grille fixe.

Ça utilisait : ld (nnnn),hl (5 nops avec 2 octets pokés d'un coup au lieu d'un seul)

Grosso-modo la routine de sprite était (de mémoire) la suivante :
Code:

ld (save_stack+1),sp
di
ld sp,sprite_reversed
pop hl
ld (&c000),hl
pop hl
ld (&c800),hl
pop hl
ld (&d000),hl
pop hl
ld (&d800),hl
...
...
save_stack
ld sp,0000
ei
ret
sprite_reversed :
db 00,00,00,02,01...

Pour faire monter/descendre le sprite (stocké dans ce cas en colonne avec octets inversés à cause du pop hl) du logo il suffisait simplement de faire pointer la pile plus ou moins loin dans la table du sprite qui contenait bien évidemment du vide (00) et ce à chaque vbl.
Ce vide (00) fut compensé par la suite par des "barres verticales" (simple valeur &xx) stockées dans le sprite et donnant donc l'impression que ce sprite passait par dessus... (j'sais pas si je suis clair...)
Pour les barres horizontales, il s'agit de simples lignes de rasters...
Il me semble également que j'utilise un flipping (type &c3) et donc tout en &4000 au niveau vram.

Voili, voilou.
Et encore bravo pour ces petits tutos, j'aime bcp.
A+
Tronic/GPA


Revenir en haut
Tronic


Hors ligne

Inscrit le: 20 Mai 2015
Messages: 15

MessagePosté le: Mer 19 Juil - 16:58 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

Zut, le dsk n'est pas passé visiblement... (?)Le revoici...

Revenir en haut
Tronic


Hors ligne

Inscrit le: 20 Mai 2015
Messages: 15

MessagePosté le: Mer 19 Juil - 17:02 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

http://gosub42.com/spritegpa.dsk

Revenir en haut
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Mer 19 Juil - 18:06 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

@Tronic : merci pour ton intervention Okay
Ca permet de faire vivre un peu le sujet.
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
snake_plissken


Hors ligne

Inscrit le: 03 Déc 2014
Messages: 281
Localisation: les pont de cé

MessagePosté le: Jeu 20 Juil - 08:44 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

@Tronic:pas mal du tout ton effet Smile

Revenir en haut
Tronic


Hors ligne

Inscrit le: 20 Mai 2015
Messages: 15

MessagePosté le: Jeu 20 Juil - 16:46 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

Salut,

Pour ce que ça vaut là encore et dans une autre mesure, un autre contexte ou un autre effet nécessitant d'afficher un bout de sprite j'avais également en magasin ce genre de chose mais que je n'ai jamais utilisé car pas sûr que ça en valait la chandelle... Bref, je vous fais tout de même partager...

L'idée était d'utiliser les registres d'index (ix ou iy) et leurs possibilités d'indexer de -127 en arrière à +127 en avant pour se passer notamment et dans certains cas des bc26/bc29 et de la contrainte des inc hl/inc l...

Sachant que (par exemple) en se plaçant en &c050, si on enlève &50 on tombe sur &c000 et que si on rajoute &50 on tombe sur &c0a0 et que &50 est compris dans l'intervalle d'indexage possible des registres d'index (-127/+127) nous sommes donc en mesure de poker au niveau zéro, 8 lignes au dessus et 8 lignes en dessous :



 
Code:
ld iy,&c050    ; on se place en &c050 (4 nops)
ld (iy-&50),&aa    ; on poke un bout du sprite au dessus, en &c000 (6 nops)
ld (iy+&00),&bb ; on poke un bout du sprite en &c050 (6 nops)
ld (iy+&50),&cc    ; on poke un bout du sprite en dessous, en &c0a0 (6 nops)

Reste plus qu'à incrémenter iy d'une ligne (+&800) de la sorte pour faire le reste, ce qui donne un truc du style :


 
Code:
 ld iy,&c000+&50        ;4
ld bc,&800        ;3

ld (iy-&50),&ff        ;6 (&c000)=&ff
ld (iy+0),&ff        ;6 (&c050)=&ff
ld (iy+&50),&ff        ;6 (&c0a0)=&ff

add iy,bc        ;4 (iy=&c850)
ld (iy-&50),&ff        ;6 (&c800)=&ff
ld (iy+0),&ff        ;6 (&c850)=&ff
ld (iy+&50),&ff        ;6 (&c8a0)=&ff

add iy,bc        ;4 ... etc...
ld (iy-&50),&ff        ;6
ld (iy+0),&ff        ;6
ld (iy+&50),&ff        ;6

add iy,bc        ;4
ld (iy-&50),&ff        ;6
ld (iy+0),&ff        ;6
ld (iy+&50),&ff        ;6

add iy,bc        ;4
ld (iy-&50),&ff        ;6
ld (iy+0),&ff        ;6
ld (iy+&50),&ff        ;6

add iy,bc        ;4
ld (iy-&50),&ff        ;6
ld (iy+0),&ff        ;6
ld (iy+&50),&ff        ;6

add iy,bc        ;4
ld (iy-&50),&ff        ;6
ld (iy+0),&ff        ;6
ld (iy+&50),&ff        ;6

add iy,bc        ;4
ld (iy-&50),&ff        ;6
ld (iy+0),&ff        ;6
ld (iy+&50),&ff        ;6

            ; total = 179 nops.

On a donc là l'affichage d'une colonne d'un octet de large d'un sprite autogénéré, de 8x3=24 lignes sans passer par du bc26/bc29 et pour lequel il suffit juste d'incrémenter iy pour passer à la colonne suivante... Et que l'on pourrait multiplier à souhait pour faire 24 autres (ou plus) lignes...

La grosse contrainte de cette routine (car il y en a une) étant la "difficulté" de pouvoir faire descendre/monter (en Y donc) l'ensemble des ces 24 lignes...
Car il faut, en l'état du moins, impérativement placer le sprite sur des adresses de type "1ère ligne" &c000, &c050, &c0a0... (Testez iy en &c850, vous comprendrez tout de suite...)

Bien pour du déplacement en X donc... Et encore... Pas sûr qu'en terme d'optimisation/temps machine ça soit rentable... à voir, tester, comparer selon ce que l'on veut faire...
Pour du déplacement en Y ça devient en revanche vite relou je pense...
Votre avis ?

A+
Tronic/GPA


Revenir en haut
roudoudou


En ligne

Inscrit le: 14 Juil 2016
Messages: 274
Localisation: LYON

MessagePosté le: Jeu 20 Juil - 16:51 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

Super chouette ton sprite qui ondule, très beau!

Revenir en haut
Tronic


Hors ligne

Inscrit le: 20 Mai 2015
Messages: 15

MessagePosté le: Jeu 27 Juil - 12:46 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

Salut,

Concernant la méthode 3 énoncée plus haut par notre vénérable AST qui utilise la pile pour aller chercher les données ou bien pour les afficher, ci-joint 4 petites routines de sprites faites ces derniers jours & qui mixent les deux (get sprite+put sprite) et ce toujours avec la pile donc.
Deux d'entre elles utilisent d'ailleurs les registres secondaires ce qui peut être intéressant...
Je dois admettre qu'elles sont quand même un peu "tordues" et que leur utilité est à mon avis un peu douteuse, mais bon... Faut voir...
Côté temps machine, là aussi je ne sais pas trop quoi en penser comparativement à d'autres routines, mais bon à vous de voir...
Bref, les voici :

Code:


; 4 bytes/16 lines sprite test routine
; 453 nops/64=7.07 RL
; Tronic/GPA

    org &1000
    nolist
    run start
start    di
    ld (stack),sp
; From here...
    ld sp,bloc1    
    ld bc,&800    
    pop ix        
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:push hl:push de:ld sp,iy
    pop ix
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:pop iy:ld sp,ix:add ix,bc:push hl:push de:ld sp,iy
    pop hl:pop de:ld sp,ix:push hl:push de        
    ld sp,(stack)
; To here = 453 nops / 64 = 7.07 rasters lines
    ei
    ret
bloc1    dw &c004
ligne1    dw &ffff,&ffff,ligne2
ligne2    dw &ffff,&ffff,ligne3
ligne3    dw &ffff,&ffff,ligne4
ligne4    dw &ffff,&ffff,ligne5
ligne5    dw &ffff,&ffff,ligne6
ligne6    dw &ffff,&ffff,ligne7
ligne7    dw &ffff,&ffff,ligne8
ligne8    dw &ffff,&ffff,bloc2
bloc2    dw &c054
ligne9    dw &ffff,&ffff,ligne10
ligne10    dw &ffff,&ffff,ligne11
ligne11    dw &ffff,&ffff,ligne12
ligne12    dw &ffff,&ffff,ligne13
ligne13    dw &ffff,&ffff,ligne14
ligne14    dw &ffff,&ffff,ligne15
ligne15    dw &ffff,&ffff,ligne16
ligne16    dw &ffff,&ffff
stack    dw 0000




Code:


; 8 bytes/16 lines sprite test routine
; 782 nops/64=12.21 RL
; Tronic/GPA

    org &1000
    nolist
    run start
start    di
; From here...
    ex af,af'
    push af
    exx
    push hl
    push bc
    push de
    ld (stack),sp
    ld sp,bloc1    
    ld bc,&800    
    pop ix        
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop ix
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:add ix,bc:push hl:push de:exx:push hl:push de:exx:ld sp,iy
    pop hl:pop de:exx:pop hl:pop de:exx:pop iy:ld sp,ix:push hl:push de:exx:push hl:push de
    ld sp,(stack)
    pop de
    pop bc
    pop hl
    exx
    pop af
    ex af,af'
; To here = 782 nops / 64 = 12.21 rasters lines
    ei
    ret
bloc1    dw &c008
ligne1    dw &ffff,&ffff,&ffff,&ffff,ligne2
ligne2    dw &ffff,&ffff,&ffff,&ffff,ligne3
ligne3    dw &ffff,&ffff,&ffff,&ffff,ligne4
ligne4    dw &ffff,&ffff,&ffff,&ffff,ligne5
ligne5    dw &ffff,&ffff,&ffff,&ffff,ligne6
ligne6    dw &ffff,&ffff,&ffff,&ffff,ligne7
ligne7    dw &ffff,&ffff,&ffff,&ffff,ligne8
ligne8    dw &ffff,&ffff,&ffff,&ffff,bloc2
bloc2    dw &c058
ligne9    dw &ffff,&ffff,&ffff,&ffff,ligne10
ligne10    dw &ffff,&ffff,&ffff,&ffff,ligne11
ligne11    dw &ffff,&ffff,&ffff,&ffff,ligne12
ligne12    dw &ffff,&ffff,&ffff,&ffff,ligne13
ligne13    dw &ffff,&ffff,&ffff,&ffff,ligne14
ligne14    dw &ffff,&ffff,&ffff,&ffff,ligne15
ligne15    dw &ffff,&ffff,&ffff,&ffff,ligne16
ligne16    dw &ffff,&ffff,&ffff,&ffff
stack    dw 0000




Code:


; 6 bytes/16 lines sprite test routine
; 562 nops/64=8.78 RL
; Tronic/GPA

    org &1000
    nolist
    run start
start    di
    ld (stack),sp
; From here...
    ld sp,table
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:pop iy:ld sp,ix:push hl:push bc:push de:ld sp,iy
    pop ix:pop hl:pop bc:pop de:ld sp,ix:push hl:push bc:push de
    ld sp,(stack)
; To here = 562 nops / 64 = 8.78 rasters lines
    ei
    ret
table
ligne1    dw &c006,&ffaa,&ffaa,&ffaa,ligne2
ligne2    dw &c806,&ffaa,&ffaa,&ffaa,ligne3
ligne3    dw &d006,&ffaa,&ffaa,&ffaa,ligne4
ligne4    dw &d806,&ffaa,&ffaa,&ffaa,ligne5
ligne5    dw &e006,&ffaa,&ffaa,&ffaa,ligne6
ligne6    dw &e806,&ffaa,&ffaa,&ffaa,ligne7
ligne7    dw &f006,&ffaa,&ffaa,&ffaa,ligne8
ligne8    dw &f806,&ffaa,&ffaa,&ffaa,ligne9
ligne9    dw &c056,&ffaa,&ffaa,&ffaa,ligne10
ligne10    dw &c856,&ffaa,&ffaa,&ffaa,ligne11
ligne11    dw &d056,&ffaa,&ffaa,&ffaa,ligne12
ligne12    dw &d856,&ffaa,&ffaa,&ffaa,ligne13
ligne13    dw &e056,&ffaa,&ffaa,&ffaa,ligne14
ligne14    dw &e856,&ffaa,&ffaa,&ffaa,ligne15
ligne15    dw &f056,&ffaa,&ffaa,&ffaa,ligne16
ligne16    dw &f856,&ffaa,&ffaa,&ffaa
stack    dw 0000




Code:


; 12 bytes/16 lines sprite test routine
; 999 nops/64=15.60 RL
; Tronic/GPA

    org &1000
    nolist
    run start
start    di
; From here...
    ex af,af'
    push af
    exx
    push hl
    push bc
    push de
    ld (stack),sp
    ld sp,table
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:pop iy:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de:exx:ld sp,iy
    pop ix:pop hl:pop bc:pop de:exx:pop hl:pop bc:pop de:exx:ld sp,ix:push hl:push bc:push de:exx:push hl:push bc:push de
    ld sp,(stack)
    pop de
    pop bc
    pop hl
    exx
    pop af
    ex af,af'
; To here = 999 nops / 64 = 15.60 rasters lines
    ei
    ret
table
ligne1    dw &c00c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne2
ligne2    dw &c80c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne3
ligne3    dw &d00c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne4
ligne4    dw &d80c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne5
ligne5    dw &e00c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne6
ligne6    dw &e80c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne7
ligne7    dw &f00c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne8
ligne8    dw &f80c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne9
ligne9    dw &c05c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne10
ligne10    dw &c85c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne11
ligne11    dw &d05c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne12
ligne12    dw &d85c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne13
ligne13    dw &e05c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne14
ligne14    dw &e85c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne15
ligne15    dw &f05c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,ligne16
ligne16    dw &f85c,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa,&ffaa
stack    dw 0000


Votre avis ?
A+
Tronic/GPA


Revenir en haut
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Jeu 27 Juil - 13:01 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

C'est en effet "tordu" mais si ça fait le taf... Okay
Va falloir que j'enchaine avec les sprites masqués... ou la joie d'utiliser le couple and/or Mr. Green
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
snake_plissken


Hors ligne

Inscrit le: 03 Déc 2014
Messages: 281
Localisation: les pont de cé

MessagePosté le: Jeu 27 Juil - 13:16 (2017)    Sujet du message: *****Les sprites soft sur Cpc Répondre en citant

Ast a écrit:

C'est en effet "tordu" mais si ça fait le taf... Okay
Va falloir que j'enchaine avec les sprites masqués... ou la joie d'utiliser le couple and/or Mr. Green
Super ! Okay

Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 23:49 (2017)    Sujet du message: *****Les sprites soft sur Cpc

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Amstrad Plus Index du Forum -> Bienvenue sur ce forum -> Programmation Toutes les heures sont au format GMT + 1 Heure
Aller à la page: 1, 2, 3  >
Page 1 sur 3

 
Sauter vers:  

Index | Panneau d’administration | Creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com