PDA

Voir la version complète : [GBA][Aide] Plotter un pixel en mode 4 bits


thoduv
18/09/2006, 00h15
J'en peux plus c'est plus possible je viens d'y passer ma soirée je vais casser mon pc je vais pas pouvoir dormir cette nuit. >( >( >(

Bon ... hum ... salut à tous ! :whst:

J'ai un peu honte, mais j'aimerai que quelqu'un me file une fonction de plottage pour bg 4 bits sur Gba, qui fonctionne avec DevkitArm r19b (j'en viens à penser que ca viens du compilo). :)

J'en ai bien une qui théoriquement est bonne, qui marche sur DS, mais impossible de la faire fonctionner sur Gba, le compilateur faisant n'importe quoi avec les "ou binaires" et transformant des valeurs 16 bits en 32 bits... <_<

Merci (beaucoup) d'avance. ^^

DJP
18/09/2006, 00h27
en mode 4 bit ou en mode 4 ? Le second me "parle" mais pas le premier :p

thoduv
18/09/2006, 00h33
Mode 4 bits, ou mode "16 couleurs".

Alekmaul
18/09/2006, 09h38
OK, mais comme dis DJP, en mode tile ou bitmap 16 couleurs ?

thoduv
18/09/2006, 09h42
Le mode bitmap 16 couleurs n'existe pas il me semble... enfin, oui, c'est en mode tiles.

DJP
18/09/2006, 15h54
Pour plotter un pixel en mode 0 tu n'as pas d'autre choix que de plotter la tile qui lui correspond.
Le problème c'est que si cette tiles n'est pas unique, tu te retrouverais avec ce pixel modifié sur toutes les autres...
C'est ce que j'ai fait pour Picross Advance (même si c'était en Dragon Basic)

Mollusk
18/09/2006, 16h59
Ben tu peux ripper le code de PAlib, j'ai un mode 4bit pour afficher du texte :)

Sinon, poste le code ici pour voir

DJP : suffit d'avoir que des tiles différentes et tu plottes sans soucis ;)

thoduv
18/09/2006, 19h38
Ben tu peux ripper le code de PAlib, j'ai un mode 4bit pour afficher du texte :)

Sinon, poste le code ici pour voir

DJP : suffit d'avoir que des tiles différentes et tu plottes sans soucis ;)
Tu peux m'indiquer où dans Palib, je n'ai pas trouvé ... :D
Sinon voilà ma fonction:

void PlotOnTiles4(u8 *buf, u16 x, u16 y, u16 w, u8 color)
{
u16 pixaddr;
u16 *pixels;
u16 padding;

pixaddr = (((y / 8) * (w / 8) + (x / 8)) * 64 / 2) + (((y % 8) * 8 + x % 8) / 2);
pixels = (u16*)(buf + pixaddr);

padding = (x % 4) << 2;

*pixels &= ~(0xF << padding);
*pixels |= color << padding;
}

Mollusk
18/09/2006, 19h43
Je suis embarrassé, en fait je viens de regarder, et... je viens de voir que je n'avais pas mis la fonction pour plotter un seul pixel (mais je l'avais faite quand j'avais testé :/)

Par contre, les fonctions pour initialiser les tiles, et pour plotter 8 pixels (donc savoir à quel endroit plotter) y sont, ca peut toujours servir...

Fichier PA_16c.h

thoduv
18/09/2006, 19h47
Merci, mais le problème a bien l'air d'être dans la lecture depuis la Vram du pixel, et dans le | binaire... Je vais "essayer" de faire la fonction en assembleur...

Mollusk
18/09/2006, 19h55
Ben la lecture est pas bien méchante quand tu as le bon emplacement... en 16bit, ca te fait lire 4 pixels d'un coup...

donc ca doit etre du genre
decal = (pixel&3)*4; // combien-t-ième pixel sur les 4
u16 pixels = vram[slot]&(~(15<<decal)); // on efface le pixel, donc on garde tout le reste
vram[slot] = pixels|(couleur<<decal); // on rajoute la couleur...


En gros, non ? Et si tu veux en 32 bit, tu fais &7 pour la position sur 8, et u32 pixels...

thoduv
18/09/2006, 20h04
Ben non ca ne marche toujours pas, ca me fait des lignes (plot réussi, plot réussi, remise à 0, remise à 0 : || || || || ...)
J'y comprends vraiment rien là ... Ton "pixel" c'est quoi ? l'adresse du pixel, sa valeur X, ..?

Mollusk
18/09/2006, 20h07
pixel : valeur X du pixel (pas clair mon truc ^^)

thoduv
18/09/2006, 20h12
Donc ca ne marche pas... Et pourtant ca marche sur DS. Problème de Devkitpro alors ?

Mollusk
18/09/2006, 20h15
bizarre ca :/ je ne vois pas trop pourquoi devkitpro poserait problème en fait

thoduv
18/09/2006, 20h18
Pour plotter un pixel en mode 4 bits, il faut lire 16 bits, supprimer le pixel en question, le remettre, puis réécrire 16 bits.
Or, à chaque fois que l'adresse est impaire, la fonction lit une valeur bizarre (style 0xff0000ff) qui ne fait meme pas 16 bits...

Edit: bon ben voilà je me suis donné la solution tout seul, une adresse 16 bits ne peut pas être impaire, donc j'ai ajouté un & ~1 à la fin du calcul de l'adresse et ca marche. :| Merci quand meme de ton aide Mollusk ! :)