Vous n'êtes pas identifié.
donc voila, je ne suis pas le seul à avoir des pb avec setpixel
Hors ligne
en parlant d'apprendre à lire, sur la même version, t'avais mis contrat() avec un "e" ( contraste() mais c fini ca )
Bon, sinon, j'ai un pb, y a moyen d'afficher du gris par dessus du noir, sans tout effacer ?
J'ai bien essayer de modifier prgnuls.h, mais suis pas un pro en ASM, t la seule chose que j'ai réussi à faire, c'est d'afficher du gris lorsque le fond est noir, mais lmorsqu'il est blancca reste blanc ( en fait, j'ai regarrdé le tuto de whyp, et j'ai changer qq petit truc
voila la fonction originel :
gpix: asm { mov al,1 shl al,cl add si,0x800 or es:[si],al jmp end }
et que j'ai modifié :
asm { mov bh,0xFF db 0x0F,0x12,0x0C7 and es:[si],bh add si,0x0800 // and es:[si],bh mov al,1 shl al,cl add si,0x800 or es:[si],al jmp end }
siuplè, édè moa...
Hors ligne
"t'avais mis contrat() avec un "e""
MOI CA ME GONFLE LES GENS QUI BALANCENT DU CODE SANS LE TESTER!!!!
(pr casioworld et certains autres)
Iscache> changer quelque chose en gris, suffit de mettre une couche a 1 et l' autre a 0! cad tu doi modifier 2 octets
Hors ligne
??? j'e'spère que tu vas faire de la com l'an prochain X-thunder28, pour être plus explicite, parceque là ?!?!?
"il suffit de mettre une couchea1 et l'autre a 0! " c'est quoi une couche ?
" cad tu doi modifier 2 octets " je les modifie où ?
Hors ligne
en mode DB, tu utilises 2 couches... si le bit d'un pixel sur la premiere couche est 1 et aussi 1 sur la 2eme couche, le pixel correspondant paraitra noir; si un seul des 2 bits est à 1 et l'autre à 0, ton pixel sera gris.
Ce qu'il a voulu dire, c qu'il suffit de mettre à 0 un des bits correspondant au pixels sur une des 2 couches au choix (généralement la premiere).
en fait tu peux bricoler une fonction du genre:
void setpix_eclair(char x,char y) { // ne modifie que les pixels noirs et les transforme en pixels gris asm { pusha mov ax,0x1A60 mov es,ax xor ax,ax mov al,127 sub al,x // al = 127-x mov cl,al // sauvegarde de al shr ax,3 // divise x par 8 mov di,ax // di pointe sur l'octet en bas de l'ecran dans la bonne colonne and cl,7 // cl garde x%8 mov bl,63 sub bl,y mov ax,16 mul bl // ax = (63-y)*16 add di,ax // di pointe sur le bon octet dans le buffer 0x1AE0 mov dx,1 // dl sera l'octet avec le pixel a afficher shl dx,cl // on decale dx mov al,es:[di] and al,es:[di+0x800] // seuls les pixels noirs du bon octet sont gardes sans al and dl,al not dl and es:[di],dl // eteind le pixel sur 0x1A60 si necessaire popa } }
Attention, je n'ai pas testé, mais ca devrait aller.
De plus le calcul de di dans la premiere partie de la fonction n'est pas optimal, on peut faire plus rapide que ca, mais j'ai pas envie de refaire des calculs maintenant
Note aussi que cette fonction ne fonctionne que qd tu utilises le double buffering, donc qd tu n'affiches pas directement a l'ecran. je suppose donc que tu as tous tes dessins dans un buffer en dehors de l'ecran (segments 0x1A60 et 0x1AE0), et que tu fais un refresh pour actualiser tout en un coup...Si toutefois ce n'est pas le cas et que tu preferes afficher directement a l'ecran sans passer par un buffer, modifie la premiere ligne
mov ax,0x1A60
par
mov ax,0x1A20
Hors ligne
merci,
bon, maintenant que j'ai des bases en C, va falloir que je me construise celle de l'ASM, ou du chinoi, comme on veut
Hors ligne