La Place des Développeurs Question sur Zone des Sprites
ericb59
Membre non connecté
Conseiller Municipal
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
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
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
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
ericb59
Membre non connecté
Conseiller Municipal
Jipe :
je ne sais pas si on peux reporter l'adresse des sprites sur la page 1 ce qui serait une solution
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
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
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
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...
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...
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...
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
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.
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.
igal
Membre non connecté
Conseiller Municipal
ericb59
Membre non connecté
Conseiller Municipal
igal :
Je pense pas qu'il faile plus que ça
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 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
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 !
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
Citation :
OK, je te fais ça ce soir ou demain matin.
Génial ! Merci !
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 !
(Par exemple afficher les sprites 0 à 3, ou 9 à 13 sur les mêmes coordonnées)
igal
Membre non connecté
Conseiller Municipal
Metalion :
Ce n'était pas la question d'Eric, qui souhaitait libérer les lignes 0 à 255.
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
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
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
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
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