MSX Village forum

La Place des Développeurs Question sur Zone des Sprites

ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5492

Le 12/01/2016 à 10h53
Dans le screen 8, la zone de sprites ( forme et couleurs) se trouve aux adresses &hF000 à &hF47F

Ces adresses correspondent donc aussi aux couleurs des pixels qui se trouvent aux lignes 241 à 248 de l'écran. Zone qui est en fait, non visible à l'écran.
(Zone visible Lignes 0 à 212)

Dans le cadre d'un scroll hardware vertical, avec la commande VDP(24) ou sur un 2+ avec set scroll, je suis amené à modifier les lignes 241 à 255 avec des graphismes... Donc, du coup, cela écrase aussi les formes de sprites...

est-il donc incompatible de, à la foi utiliser des sprites, et d'écrire dans la zone des lignes 241 à 248 de la VRAM? Edité par ericb59 Le 12/01/2016 à 10h54


banniere-ericb59e
Site web    
Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10369

Le 12/01/2016 à 11h34
a mon humble avis tu ne peux pas utiliser les 2 car tu utilise toute la vram pour les images de scroll

256x256 pixels = &HFFFF

je ne sais pas si on peux reporter l'adresse des sprites sur la page 1 ce qui serait une solution

sinon il faut passer par des copy de blocs de la page 1 vers la page 0 pour faire les sprites


:noel
Site web    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5492

Le 12/01/2016 à 12h07
Jipe :


je ne sais pas si on peux reporter l'adresse des sprites sur la page 1 ce qui serait une solution





Apparemment on peut... Mais du coup ils ne semblent plus utilisable sur la page 0





Jipe :


sinon il faut passer par des copy de blocs de la page 1 vers la page 0 pour faire les sprites





Oui, mais comment déplacer un sprite software (copy) sur ma page 0 sans qu'il ne clignote lors du déplacement sans double buffer ? Edité par ericb59 Le 12/01/2016 à 12h07


banniere-ericb59e
Site web    
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1488

Le 12/01/2016 à 12h09
ericb59 :
est-il donc incompatible de, à la foi utiliser des sprites, et d'écrire dans la zone des lignes 241 à 248 de la VRAM?


Non, pas du tout, il suffit de déplacer la zone des sprites.



Il y a plusieurs solutions pour le faire, mais celle en BASIC (l'instruction BASE(x) = ...) est effectivement limitée par l'adressage relatif (comme Jipe l'indique) et ne fonctionnera pas. Il faut donc manipuler directement les registres du VDP.



Tu dois modifier les valeurs des registres 5 et 11 (table des attributs) et 6 (table de génération). Les registres 5 et 11 vont contenir la nouvelle adresse de la table des attributs divisée par 128, et le registre 6 va contenir la nouvelle adresse de la table de génération divisée par 2048.



Voir "Pratique du MSX2", page 138 pour plus de détail.


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5492

Le 12/01/2016 à 12h52
Ok Metalion...
Mais peux tu être plus explicite et me donner un exemple concret ? Car je ne maitrise pas du tout le sujet, même avec le bouquin de GDX !

j'avais trouvé cette info pour déplacer la zone de sprite en page 1
VDP(5)=4:VDP(12)=3:VDP(6)=49

le problème est qu'un put sprite sur la page 0 n'a plus aucun effet...


banniere-ericb59e
Site web    
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1488

Le 12/01/2016 à 13h42
ericb59 :
Ok Metalion...

Mais peux tu être plus explicite et me donner un exemple concret ? Car je ne maitrise pas du tout le sujet, même avec le bouquin de GDX !



j'avais trouvé cette info pour déplacer la zone de sprite en page 1

VDP(5)=4:VDP(12)=3:VDP(6)=49



le problème est qu'un put sprite sur la page 0 n'a plus aucun effet...


C'est normal, parce que tout est lié. Lorsque que tu déplace les tables en VRAM, soit tu fais tout en BASIC et le tout reste cohérent, soit tu modifies "en manuel", et du coup le BASIC est perdu, il ne sait plus où sont les tables.



Code :
VDP(5)=4:VDP(12)=3


Cette opération place la table des attributs à l'adresse : (4 + 3*256) * 128 = 98 816



Code :
VDP(6)=49


Cette opération place la table de génération à l'adresse : 49 * 2048 = 100 352



Le problème, c'est qu'après ces opérations, si on veut continuer à utiliser le BASIC pour les sprites, il faut lui "dire" que les adresses en VRAM ont changé. Et là, on retombe sur le même souci d'adressage : le BASIC ne manipule que des nombres à 2 octets maximum, soit 65535. Et donc, retour à la case départ.



Il ne reste donc qu'à manipuler les sprites manuellement. En soi ce ne serait pas trop difficile, puisqu'on connait l'adresse des tables en VRAM. Il suffirai donc de faire quelques VPOKEs pour changer les attributs, et notamment les coordonnées des sprites (dans la table des attributs). Mais ... on retombe sur le même problème : impossible pour le BASIC de faire des VPOKEs pour des adresses supérieures à 65535.



La seule solution semble de descendre encore d'un niveau dans la couche logicielle, et de passer au langage machine, malheureusement.


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 12/01/2016 à 13h57
Salut metalion.

Il est absolument pas nécessaire de déplacer la zone de Sprite originaire de la page 0 tout au bout de l'extrémité du bord de la page 1 mais simplement de l'équivalent de quelques lignes disons que la zone zlserait déplacée de sorte à couvrir une zone allant de la ligne 44 (ou moins) à la ligne 0 de la page 1.

Y a pas besoin de plus pour solutionner la chose:)

@eric: un truc tout bête que j'avais pensé mais pas testé:
Lorsqu'un sprite n'apparaît pas, considèrent que c'est un Sprite qui existe mais aurais disparu.
A partir de la, tu peux essayer de déplacer verticalement ou horizontalement jusqu'à ce que ce sprite finisse par "glisser" de "la ou on le voit pas" jusqu'à ce qu'il apparaisse sur la page active :)

C'est juste une idée.


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 12/01/2016 à 14h19
voici un dessin on ne peut plus clair sur le déplacement des zones réservées de quelques lignes seulement!



Je pense pas qu'il faile plus que ça :)


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5492

Le 12/01/2016 à 14h29
igal :


Je pense pas qu'il faile plus que ça :)




Oui Igal... Le problème en faisant ça c'est que PUT SPRITE ne fonctionne plus, car il ne trouve plus ses pettis. Que la zone soit déplacée de 40 lignes ou de 150 lignes, ca ne résout pas le problème.





@MEtalion

Ok passons à l'assembleur alors !! :|



Dans nestor Basic/Kun Basic on peut insérer de petites routines en Assembleur écrite en Hexadécimale.

Metalion pourrais tu m'écrire une petite routine ASM :D qui :

1- Modifie la zone des sprite pour la placer dans la zone invisible de la Page1 (Screen8)

2- Place Un Sprite N aux coordonnées X,Y avec la couleur C, sur le plan P ? Une routine qui remplace le put sprite en somme !



En exemple ci-dessous la routine qui me permet de lire mes samples COVOX depuis la VRAM



MErci d'avance pour ton aide ! ;)



Code TEXT :
 
4116 _TURBO ON (PM)
4117 PA=&H1:S=250:E=PM-250:A=PEEK(&H2D):IF A=3THENSP=&H80 ELSE SP=&HA
4119 '#I &hF5,&hC5,&hD5,&hE5,&hDD,&hE5,&hFD,&hE5,&hF3,&h3A,PA,&h2A,S,&hED,&H5B,E,&hCB,&h4,&h17,&hCB,&h4,&h17,&hCB,&h3C,&hCB,&h3C,&hD3,&h99,&h3E,&h8E,&hD3,&h99,&h7D,&h0,&hD3,&h99,&h7C,&hD3,&h99,&hDB,&h98,&hD3,&h91,&h3A,SP,&H47,&h10,&hFE
4120 '#I &hCD,&h20,&h0,&h1B,&h20,&hF0,&hFB,&hFD,&hE1,&hDD,&hE1,&HE1,&HD1,&hC1,&hF1
4122 _TURBO OFF
 
 


banniere-ericb59e
Site web    
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1488

Le 12/01/2016 à 15h00
igal :
Il est absolument pas nécessaire de déplacer la zone de Sprite originaire de la page 0 tout au bout de l'extrémité du bord de la page 1 mais simplement de l'équivalent de quelques lignes disons que la zone zlserait déplacée de sorte à couvrir une zone allant de la ligne 44 (ou moins) à la ligne 0 de la page 1.


Ce n'était pas la question d'Eric, qui souhaitait libérer les lignes 0 à 255.



igal :
Lorsqu'un sprite n'apparaît pas, considèrent que c'est un Sprite qui existe mais aurais disparu. A partir de la, tu peux essayer de déplacer verticalement ou horizontalement jusqu'à ce que ce sprite finisse par "glisser" de "la ou on le voit pas" jusqu'à ce qu'il apparaisse sur la page active


Ce n'est pas ça le problème.

Il n'apparait pas parce qu'il n'est pas visible, mais bien parce qu'il n'est pas défini (pour le BASIC en tout cas).



ericb59 :
Ok passons à l'assembleur alors !!



Dans nestor Basic/Kun Basic on peut insérer de petites routines en Assembleur écrite en Hexadécimale.

Metalion pourrais tu m'écrire une petite routine ASM qui :

1- Modifie la zone des sprite pour la placer dans la zone invisible de la Page1 (Screen8)

2- Place Un Sprite N aux coordonnées X,Y avec la couleur C, sur le plan P ? Une routine qui remplace le put sprite en somme !



En exemple ci-dessous la routine qui me permet de lire mes samples COVOX depuis la VRAM



MErci d'avance pour ton aide !




OK, je te fais ça ce soir ou demain matin.


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5492

Le 12/01/2016 à 15h09
Citation :
OK, je te fais ça ce soir ou demain matin.




Génial ! Merci ! :kiss



Je pense qu'(il est préférable que la modification de la zone de sprites se fasse en amont de la routine, depuis le Basic j'imagine...

Si la routine peut être utilisée pour afficher plusieurs sprites en même temps (aux même coordonnées) pour faire un sprite multicolor c'est encore mieux ! :siffle

(Par exemple afficher les sprites 0 à 3, ou 9 à 13 sur les mêmes coordonnées)


banniere-ericb59e
Site web    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 12/01/2016 à 15h39
Metalion :
igal :
Il est absolument pas nécessaire de déplacer la zone de Sprite originaire de la page 0 tout au bout de l'extrémité du bord de la page 1 mais simplement de l'équivalent de quelques lignes disons que la zone zlserait déplacée de sorte à couvrir une zone allant de la ligne 44 (ou moins) à la ligne 0 de la page 1.


Ce n'était pas la question d'Eric, qui souhaitait libérer les lignes 0 à 255.



@Métalion:

J'ai cru comprendre qu'Eric voulait "Juste" déplacer la Zone réservée [212/255] de la page zéro vers "n'importe ou" sur la page 1. Disons vers la lignes [0 à 43] de la page 1.

Si je t'ai bien lu métalion, ca reste possible de faire cela en basic et exploitable en Basic ;)



Pour parler simplement:

Si déplacer la zone [212 à 255] de la page 0 vers [212 à 255] de la Page 1 pose un problème supplémentaire, alors il est peut être bon de préciser que le [Buffering] de la page 0 sur la page 1 ne peut pas fonctionner et pour cause => Le Scrolling VDP(24) tel qu'on l'utilise s'affiche en continue sur les lignes [0 à 255] de la page 0.

L'usage du [buffering] de la même image en Page 1 des lignes [0 à 211] sera fonctionnelle, mais les lignes [212 à 255] de la page 1 seront inutilisables comme on peut le voir sur la vidéo [caveman ninja] ici => https://www.youtube.com/watch?v=zf2X2YdEho0



Les lignes 202 à 556 BLOAD sur la page 0 et COPY sur la Page 1 les lignes 0 à 211 inclus.

Les lignes 562 à 612 BLOAD sur la page 0 (ou les sprites sont désactivés) et BLOAD une seconde fois sur la page 1 en utilisant BLOAD"XYZ",S,0+32768!.



Malheureusement, lorsque l'on regarde le "Faux Sprite" se déplacer, l'image "bufferisée" en page 1 depuis les lignes [0 à 211] viennent correctement jouer leur role mais les lignes [212 à 255] de ce buffer semble s'être évaporées :fou



Bref: Sauf indication contraire d'Eric, un simple déplacement comme sur le schéma devrait suffir largement. (je peux me tromper évidemment :)) Edité par igal Le 12/01/2016 à 15h41


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1488

Le 12/01/2016 à 16h17
igal :
@Métalion:

J'ai cru comprendre qu'Eric voulait "Juste" déplacer la Zone réservée [212/255] de la page zéro vers "n'importe ou" sur la page 1. Disons vers la lignes [0 à 43] de la page 1.

Si je t'ai bien lu métalion, ca reste possible de faire cela en basic et exploitable en Basic


Non, parce que l'adresse du premier pixel de la ligne 0 en page 1 est 65536.

L'instruction BASE(x) n'accepte que des valeurs comprises entre 0 et 65535.



EDIT : plus précisément, les adresses définies par l'instruction BASE(x) sont relatives, c'est à dire qu'elles sont positionnées par rapport au "zéro" de la page active. En screen 8, par exemple, si on c'est la page 0 qui est active, on peut donc couvir les adresses de 0 à 65535, et si c'est la page 1 qui est active, on peut alors couvrir les adresses de 65536 à 131071.



Mais cela ne change rien dans le problème qui est posé par Eric, puisque chaque changement de page active réinitialise les adresses des tables, ainsi que le "zéro" de référence. Edité par Metalion Le 12/01/2016 à 16h30


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 12/01/2016 à 18h00
Ok ok...On peut donc pas indiquer une Valeur Négative qui aurait permis d'atteindre la "Page non Active" juste avec la valeur -1 :'( :'( :'(

M'en veuillez pas je suis persistant :lol


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1488

Le 12/01/2016 à 20h43
igal :
Ok ok...On peut donc pas indiquer une Valeur Négative qui aurait permis d'atteindre la "Page non Active" juste avec la valeur -1


Non, car les valeurs négatives ne sont qu'une illusion.

Ce ne sont pas des valeurs "en plus", c'est simplement une façon différente d'interpréter un même chiffre.



Un nombre sur 2 octets peut coder une valeur entre 0 et 65535. Mais si on considère que le dernier bit représente le signe, alors on peut dire aussi que ces 2 octets peuvent coder une valeur entre -32767 et +32768. Et c'est en fait strictement la même chose.


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie