MSX Village forum

La Place des Développeurs Projet Carwar

Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 31/01/2011 à 09h13

Reprise du message précédent

aoineko :
Quand on écris dans la VRAM sans passer par le BIOS, y a pas moyen de copier un block de donnée sans passer par les coordonnées X/Y (en utilisant directement l'adresse) ?


:hum :hum :hum :hum :hum



Ce sont les bases de l'accès à la VRAM en assembleur, et c'est expliqué dans tous les bouquins.

Un peu de recherche et de lecture devrait t'apporter la réponse.



Le forum est là pour aider, et répondre aux questions, mais il faut commencer par chercher un peu soi-même :tea


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)
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 31/01/2011 à 09h42
Metalion :
Le forum est là pour aider, et répondre aux questions, mais il faut commencer par chercher un peu soi-même :tea




Ça fait 2 semaines que je bouffe de la doc MSX tous les soirs... :gne

C'est vraiment pas évident de s'y retrouver pour quelqu'un qui n'a jamais programmé sur MSX (ni sur aucun ordi des années 80) ! Surtout que tout ce que j'ai lu au début, je n'y comprenais pas grand chose. Ceci dit, libre à vous de pas répondre si vous trouvez une question trop bête. ^^



Sinon, pour la solution de MSXosaure, c'est de la copie octet par octet non ? Je chercherai s'il n'existait pas une copie par bloc. Je vais relire la doc au cas ou qq chose m'ait échappé...


On est toujours ignorant avant de savoir.
Github    
Franck Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 22h54

Messages: 3295

Le 31/01/2011 à 09h55
Je pense que les gens du Village sont là pour t'aider, Aoineko ^^

Et quand on voit ce que tu parviens à faire sans rien connaître au départ du MSX, j'avoue que je suis assez bluffé :|

Alors continuons tous ensemble vers peut-être un nouveau jeu qui fera date dans le petit monde du MSX :D
   
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 31/01/2011 à 11h33
Désolé pour ma réponse un peu sèche :gne

Mais j'ai un peu de mal à comprendre que tu ne saches pas répondre toi même à cette question, vu tout ce que tu as déjà accompli jusqu'à maintenant, et tout ce que tu sembles connaitre sur la programmation en assembleur du système MSX.

Soit ... Ce n'est pas grave, après un café et une gaufre au chocolat, mon lundi matin semble mieux parti :tea

La VRAM, on peut y accéder octet par octet, par la méthode donnée par MSXOsaure.
Une remarque, les instructions EX (SP),HL de temporisation ne sont utiles que sur MSX1, en MSX2 on peut les supprimer.

Pour la copie en bloc, tu la connais déjà, il s'agit de la commande HMMC, abordée et expliquée dans le sujet Projet Ambidex


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)
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 31/01/2011 à 12h18
En fait, j'ai du mal formuler ma question. C'était juste pour savoir s'il existait un moyen de faire une copie d'un bloc en RAM vers la VRAM en passant par des adresses et non pas le système de coordonnées X/Y.

Si j'ai bien compris, ce n'est pas possible. Soit je passe par l'adresse directe et je dois alors faire la copie octet par octet, soit je fait une copie par bloc (HMMC) et dans ce cas, je dois utiliser l'espace 2d (x/y).

Je trouve pas ça très pratique pour écrire dans les zones réservés aux sprites, mais on va faire avec. ^^


On est toujours ignorant avant de savoir.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 31/01/2011 à 13h30
Pour tester, j'ai envoyé mes données de sprites (une entrée dans la TAS, TGS et TCS) via HMMC vers la partie visible de l'écran... et ça à l'air d'être bon (je vois les pixels correspondant aux octets envoyés) ! Par contre, quand je regarde le contenu de ma VRAM via BlueMSX, je trouve mes données à des adresses incohérentes (ne correspondant pas au X + Y * 256 ou j'ai fait ma copie). Vu que j'imagine que le visualiseur de VRAM de BlueMSX fonctionne, j'ai pas du capter qq chose... :moue Edité par aoineko Le 31/01/2011 à 13h32


On est toujours ignorant avant de savoir.
Github    
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 31/01/2011 à 13h50
aoineko :
En fait, j'ai du mal formuler ma question. C'était juste pour savoir s'il existait un moyen de faire une copie d'un bloc en RAM vers la VRAM en passant par des adresses et non pas le système de coordonnées X/Y.



Si j'ai bien compris, ce n'est pas possible. Soit je passe par l'adresse directe et je dois alors faire la copie octet par octet, soit je fait une copie par bloc (HMMC) et dans ce cas, je dois utiliser l'espace 2d (x/y).



Je trouve pas ça très pratique pour écrire dans les zones réservés aux sprites, mais on va faire avec. ^^


Si c'est possible ... Il existe une solution intermédiaire.



Le VDP accepte les données en écriture séquentielle, c'est à dire que le Z80 peut envoyer les données l'une derrière l'autre et le VDP les transfèrera, en incrémentant lui même l'adresse en VRAM après chaque donnée.



Voici un exemple en syntaxe asMSX (tiré d'un projet de jeu sur MSX2, en chantier depuis plusieurs années ...:oups )



Code :
; Chargement des données sprites

    VRAM=18000h

    ld    a,VRAM>>14     ; Shift right adresse VRAM sur 14 bits
    di
    out    [VDP],a
    ld    a,80h+14
    out    [VDP],a
    ld    a,VRAM&255
    out    [VDP],a
    ld    a,40h+(VRAM>>8)&63
    out    [VDP],a

    ld    bc,(VDP-1)
    ld    hl,Level1_SPR
REPT 11
    otir   ; 11x256 = 2816 octets
ENDR
    ei


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)
   
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1501

Le 31/01/2011 à 13h53
Et en utilisant LDIRVM ? C'est clair qu'en utilisant le BIOS tu perdras en rapidité mais c'est exactement ce que tu demandes à savoir un transfert de bloc RAM vers VRAM.


MSX un jour, MSX toujours ! :D
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 31/01/2011 à 14h10
Metalion :
Il est possible de paramétrer le VDP pour faire sur le port d'écriture en VRAM une écriture séquentielle, c'est à dire que le Z80 envoie les données l'une derrière l'autre et le VDP les transfère, en incrémentant lui même l'adresse en VRAM à chaque donnée.




J'utilise les séries de outi (je connaissais pas otir) pour envoyer les paramètres des commandes VDP. Le problème, c'est qu'on doit répéter ces instructions un nombres de fois qui ne peut être variable. Ceci dit, pour des données dont la taille est fixe (genre une entrée dans les tables de sprites), c'est une très bonne solution. J'essaye ça ce soir. Merci. :top



Pour ce qui est du Bios, j'essaye autant que possible d'éviter de l'utiliser.


On est toujours ignorant avant de savoir.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 01/02/2011 à 16h07
Bon, après moult tests, j'en arrive à 2 conclusions :
  • Le visualiseur de VRAM de BlueMSX ne marche pas (ou je ne sais pas l'utiliser),
  • Que ce soit via un HMMC ou des otir mes données semblent bien en place.

Conclusion, le fait que mon sprite ne s'affiche pas viens surement d'ailleurs !

J'ai bien scruté la valeur des registres du VDP et tout semble ok.

RO0eBits 1,2 et 3 à 1 pour mode 8
R160Bits 3 et 4 à 0 pour mode 8; Bits 0 et 1 à 0 pour sprite 8x8 sans MAG
R23f1f première page (0000h), 3f seconde (1000h)
R380
R400
R5eePartie basse adresse TAS 01EEh pour F700h
R61fAdresse TGS 001Fh pour F800h
R704
R899Bit 1 à 0 pour afficher les sprites
R9b1Bit 7 à 1 pour mode 212 lignes
R1O00
R1101Partie haute adresse TAS 01EEh pour F700h


Reste les données en elles-mêmes.
Pour mes tests je rempli juste la 1er entrée de chaque table avec pour la TGS :
Code CPP :
0x7C, // .#####..
0xEE, // ###.###.
0xEE, // ###.###.
0xEE, // ###.###.
0xEE, // ###.###.
0xEE, // ###.###.
0xEE, // ###.###.
0x7C, // .#####..


Pour la TAS :
Code CPP :
0x40, 0x40, 0, 0 // Position 64/64, sprite 0


Et pour la TCS :
Code CPP :
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F // couleur blanche


Vous voyez qq chose qui cloche ? :hum Edité par aoineko Le 01/02/2011 à 21h30


On est toujours ignorant avant de savoir.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 01/02/2011 à 18h42
Quand je me balade dans la zone non visible avec ma voiture (et donc que j'écrase les données après D400h) je vois parfois mon sprite apparaitre (le 0). J'en conclu que le problème viens de la TAS/TCS et que les données du TGS sont bonnes. Mais ça m'avance pas beaucoup... :moue


On est toujours ignorant avant de savoir.
Github    
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 01/02/2011 à 19h03
Pour afficher les sprites, c'est le bit 1 du R#8 qui doit être à zéro, pas le bit 2. Tu vas me dire qu'avec la valeur $99, la condition est remplie ... Oui, mais le registre R#8 contient toute une série de paramètres auquels il ne vaut mieux pas toucher (structure physique VRAM, paramétrage du bus de couleur, souris, crayon optique ...). Dans ton cas, seul le bit 1 doit être modifié, tout le reste doit rester tel qu'à l'initialisation. Je te conseille donc de prendre la valeur telle quelle et de seulement mettre le bit 1 à zéro.

Autre chose, ta couleur n'est pas bonne ...
En SCREEN8, la couleur est codée en RGB sur 8 bits : G2 G1 G0 R2 R1 R0 B1 B0.
La valeur $0F donne donc une couleur dans l'espace RGB qui doit être du mauve foncé.
Pour avoir du blanc, c'est la valeur $FF que tu dois utiliser.

Le codage des TAS et TGS est correct ...

A part ça je ne vois rien d'autre de flagrant ...
Il faudrait vérifier si tu écris les données aux bonnes adresses dans la VRAM.


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)
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 01/02/2011 à 21h29
Metalion :
Pour afficher les sprites, c'est le bit 1 du R#8 qui doit être à zéro, pas le bit 2. Tu vas me dire qu'avec la valeur $99, la condition est remplie ... Oui, mais le registre R#8 contient toute une série de paramètres auquels il ne vaut mieux pas toucher (structure physique VRAM, paramétrage du bus de couleur, souris, crayon optique ...). Dans ton cas, seul le bit 1 doit être modifié, tout le reste doit rester tel qu'à l'initialisation. Je te conseille donc de prendre la valeur telle quelle et de seulement mettre le bit 1 à zéro.



Autre chose, ta couleur n'est pas bonne ...

En SCREEN8, la couleur est codée en RGB sur 8 bits : G2 G1 G0 R2 R1 R0 B1 B0.

La valeur $0F donne donc une couleur dans l'espace RGB qui doit être du mauve foncé.

Pour avoir du blanc, c'est la valeur $FF que tu dois utiliser.



Le codage des TAS et TGS est correct ...



A part ça je ne vois rien d'autre de flagrant ...

Il faudrait vérifier si tu écris les données aux bonnes adresses dans la VRAM.




Pour le R#8, c'est bien le bit 1 (le 2e ^^) que je mets à zéro.



Quant aux couleurs, la doc semble dire qu'en mode 8 on a 16 couleurs prédéfini. Le FFh étant le blanc. Edité par aoineko Le 01/02/2011 à 21h30


On est toujours ignorant avant de savoir.
Github    
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 01/02/2011 à 21h39
aoineko :
Quant aux couleurs, la doc semble dire qu'en mode 8 on a 16 couleurs prédéfini. Le FFh étant le blanc.


Oui, tu as raison, autant pour moi.

Les sprites en mode SCREEN8 ne peuvent avoir que 16 couleurs prédéfinies, et le blanc est bien la valeur $0F.



As-tu pu vérifier si les données arrivaient aux bonnes adresses ?


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)
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 01/02/2011 à 21h54
En essayant de copier mes données TAS/TCS un peu avant dans la VRAM je vois apparaitre des choses, parfois un des mes sprites mis en TGS. Y a qq chose de particulier avec l'adressage des tables TAS et TCS ? Pour la TCS, je sais qu'on passe d'une entrée à l'autre en ajoutant 16 à l'adresse (même en mode 8x8), mais à part ça, je vois pas... :moue



Metalion :
As-tu pu vérifier si les données arrivaient aux bonnes adresses ?




Comment faire ? Le viewer de VRAM de BlueMSX ne semble pas fonctionner. Par exemple, il voit pas mes données en 1D400h ou je stock mes sprites alors que tout fonctionne très bien. Par contre, via les HMMC, j'ai retiré un offset pour déplacer mes copies vers la partie visible de l'écran et tout avait l'air bon. Edité par aoineko Le 01/02/2011 à 21h59


On est toujours ignorant avant de savoir.
Github    
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 01/02/2011 à 22h34
aoineko :
Comment faire ? Le viewer de VRAM de BlueMSX ne semble pas fonctionner


Si, il fonctionne, je l'ai souvent utilisé.

Re-vérifie ton code, si tu ne vois pas tes données dans le VRAM au bon endroit, c'est que le transfert ne s'est pas fait correctement.



Tu peux poster ton code de transfert des données sprites ?


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