Vous n'êtes pas identifié.
voila, je voudrais savoir comment on affiche un sprite en ASM. je voudrais tout savoir, si possible un exemple. merci
Hors ligne
(Depuis un cybercafé pres de la plage alors vous plaignez pas...)
ben t'as 2 methodes:
-le pixel par pixel, c'est lent, un pixel = 1 octet, mais ca permet de faire des effets de transparence...
exemple:
//supposons que la fonction d'affichage de pixel soit: void pix_blanc(char x,char y) void pix_gris(char x,char y) void pix_noir(char x,char y) //et pour les couleurs: #define COULEUR_BLANC 0 #define COULEUR_GRIS 1 #define COULEUR_NOIR 2 #define COULEUR_TRANSPARENT 3 //on a: unsigned char sprite[8][8]{ 1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3, 0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3, 0,0,0,0,0,0,0,0}; //:-) c'est juste un exemple... //et: void sprite(char x,char y, unsigned char* sprit) { char i; char j; for(j=0;j<8;j++) { for(i=0;i<8;i++) { switch(sprit[j][i]) { case COULEUR_BLANC: pix_blanc(x+i,y+j) break; case COULEUR_GRIS: pix_gris(x+i,y+j) break; case COULEUR_NOIR: pix_noir(x+i,y+j) break; case COULEUR_TRANSPARENT: default: //on laisse le pixel precedent... } } } return; }
C'est la methode la plus facile(MAIS PAS LA PLUS RAPIDE), et permet de gerer facilement les nivo de gris et la transparence...
-l'octet par octet: passage par l'asm quasi obligé(voir dans un post résté sur le furom normal pour le code[le nom du post contient le mot sprite]) MAIS EXTREMEMENT PLUS RAPIDE...
par contre, plus difficile de gerer transparence et niveaux de gris)
Sinon attendre debut septembre ca m'a donné envie de faire un tuto, et vu que je suis en vacances je peux pas pour l'instant...
(c'est moi mastermage ce forum m'a encore deco)
EXCUSE MOI j'avais pas vu "en asm"
g ressorti mon post...
Mode d'emploi: compiler avec NASM en .obj,
et utiliser avec N'importe quoi... OU copier le code assembleur dans une fonction...
En utilisant par exemple
Code:Code:
unsigned char monsprite[8]={ 0xAA, //10101010 0x55, //01010101 0xAA, //10101010 0x55, //01010101 0xFF, //11111111 0x00, //00000000 0xFF, //11111111 0x00}; //00000000 sprite8or(20,39,monsprite);Voila vous compilez ca(le code ci-dessous) avec nasm (ne prenez que les fonctions necessaires...) pour en faire un .obj, et apres on peut le linker avec des programmes faits avec nasm ou turbo c(parce qu'il faut savoir que turbo c rajoute un "_" (sans les ") avant chaque nom, quand on ecrit sprite8(...) turbo c ecrit _sprite8) voila pour les questions repondez au post.
ne vous inquietez pas pour la taille de la routine, c'est beaucoup lus rapide (meme si c'est pas optimisé).
les _specialLeft et les _SpecialRight sont a garder avec la routine principale, ils gerent les bord gauche et droite de l'ecran...
Code:Code:
SEGMENT _TEXT class=CODE GLOBAL _Sprite8 GLOBAL _Sprite8or GLOBAL _Sprite8xor GLOBAL _Sprite8_noclip GLOBAL _Sprite8or_noclip GLOBAL _Sprite8xor_noclip ;------------> Sprite8 <----------- ;Affiche le sprite8 à DS:SI ;DX=y CX=x ;registres détruits: AX,BX,CX,DX,SI,DI ;---------------------------------- ;void Sprite8(int x,int y,void* spr); _Sprite8: mov cx,[sp+2] mov dx,[sp+4] mov si,[sp+6] Sprite8: mov di,1023 mov bx,8 cmp dx,0 jge .clippedTop add si,dx add bx,dx xor dx,dx cmp bx,0 jg .clippedy ret .clippedTop: cmp dx,56 jle .clippedy mov ax,dx sub ax,56 sub bx,ax jg .clippedy ret .clippedy: sub di,dx cmp cx,0 jge .OKLeft jmp Sprite8_SpecialLeft .OKLeft: cmp cx,120 jl .OKRight jmp Sprite8_SpecialRight .OKRight: sub di,64 mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor al,al or ah,0xff shr ax,cl and [es:di+bx],ah and [es:di+bx+64],al xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne .loopdisplay ret Sprite8_SpecialRight: cmp cx,128 jl .OKclipped ret .OKclipped: mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor al,al or ah,0xff shr ax,cl and [es:di+bx],al xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],ah dec bx cmp bx,dx jne .loopdisplay ret Sprite8_SpecialLeft: cmp cx,-8 jg .OKclipped ret .OKclipped: add cx,8 and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor al,al or ah,0xff shr ax,cl and [es:di+bx],ah xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al dec bx cmp bx,dx jne .loopdisplay ret ;void Sprite8or(int x,int y,void* spr); _Sprite8or: mov cx,[sp+2] mov dx,[sp+4] mov si,[sp+6] Sprite8or: mov di,1023 mov bx,8 cmp dx,0 jge .clippedTop add si,dx add bx,dx xor dx,dx cmp bx,0 jg .clippedy ret .clippedTop: cmp dx,56 jle .clippedy mov ax,dx sub ax,56 sub bx,ax jg .clippedy ret .clippedy: sub di,dx cmp cx,0 jge .OKLeft jmp Sprite8or_SpecialLeft .OKLeft: cmp cx,120 jl .OKRight jmp Sprite8or_SpecialRight .OKRight: sub di,64 mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne .loopdisplay ret Sprite8or_SpecialRight: cmp cx,128 jl .OKclipped ret .OKclipped: mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],ah dec bx cmp bx,dx jne .loopdisplay ret Sprite8or_SpecialLeft: cmp cx,-8 jg .OKclipped ret .OKclipped: add cx,8 and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al dec bx cmp bx,dx jne .loopdisplay ret ;void Sprite8xor(int x,int y,void* spr); _Sprite8xor: mov cx,[sp+2] mov dx,[sp+4] mov si,[sp+6] Sprite8xor: mov di,1023 mov bx,8 cmp dx,0 jge .clippedTop add si,dx add bx,dx xor dx,dx cmp bx,0 jg .clippedy ret .clippedTop: cmp dx,56 jle .clippedy mov ax,dx sub ax,56 sub bx,ax jg .clippedy ret .clippedy: sub di,dx cmp cx,0 jge .OKLeft jmp Sprite8xor_SpecialLeft .OKLeft: cmp cx,120 jl .OKRight jmp Sprite8xor_SpecialRight .OKRight: sub di,64 mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne .loopdisplay ret Sprite8xor_SpecialRight: cmp cx,128 jl .OKclipped ret .OKclipped: mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],ah dec bx cmp bx,dx jne .loopdisplay ret Sprite8xor_SpecialLeft: cmp cx,-8 jg .OKclipped ret .OKclipped: add cx,8 and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al dec bx cmp bx,dx jne .loopdisplay ret ;-----------> Sprite8_noclip <----------- ;Pareil que Sprite8, mais ne gere pas le clipping ;Attention aux limites de l'ecran !! ;---------------------------------------- ;void Sprite8_noclip(int x,int y,void* spr); _Sprite8_noclip: mov cx,[sp+2] mov dx,[sp+4] mov si,[sp+6] Sprite8_noclip: mov di,959 ;1023-64 mov bx,8 sub di,dx mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor al,al or ah,0xff shr ax,cl and [es:di+bx],ah and [es:di+bx+64],al xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne .loopdisplay ret ;void Sprite8or_noclip(int x,int y,void* spr); _Sprite8or_noclip: mov cx,[sp+2] mov dx,[sp+4] mov si,[sp+6] Sprite8or_noclip: mov di,959 ;1023-64 mov bx,8 sub di,dx mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne .loopdisplay ret ;void Sprite8xor_noclip(int x,int y,void* spr); _Sprite8xor_noclip: mov cx,[sp+2] mov dx,[sp+4] mov si,[sp+6] Sprite8xor_noclip: mov di,959 ;1023-64 mov bx,8 sub di,dx mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al xor [es:di+bx+64],ah dec bx cmp bx,dx jne .loopdisplay ret
Hors ligne
En fait si g bien compris il suffit de mettre: (en C)
SEGMENT _TEXT class=CODE GLOBAL _Sprite8 GLOBAL _Sprite8or GLOBAL _Sprite8xor GLOBAL _Sprite8_noclip GLOBAL _Sprite8or_noclip GLOBAL _Sprite8xor_noclip void Sprite8(int x,int y,void* spr) { copier-coller la routine }
et c'est bon?
Sinon comment on peut gérer des niveausx de gris avec cette routine?
Hors ligne
tu fou
GLOBAL _Sprite8
GLOBAL _Sprite8or
GLOBAL _Sprite8xor
si tu veux le clipping
et
GLOBAL _Sprite8_noclip
GLOBAL _Sprite8or_noclip
GLOBAL _Sprite8xor_noclip
t'as pas besoin de mettre les deux. Mais sinon tu as compris.
C'est en fait le clipping ????
C'est code en base quoi OxAA (ce qui remplace les 01010101 du sprite)???
Ca serait pas poosible d'avoir une fonction quiinverse les pixels ??? e trouve ca plus facile pour effacer un element du decor.
merci
Hors ligne
les globals c de l'asm non? En fait j'y comprends que dalle! Ni à l'hexa ni à l'asm!
Donc si tu (ou qqn d'autre) pouvait mettre un exemple CONCRET en C ce serait pas mal, et ça aiderait plein de monde.
Hors ligne
bon voila des explications et du code :
GLOBAL et SEGMENT c pour nasm
:idea: le clipping et une methode permettant de ne pas afficher les pixels hors de l'ecran, car lorsque cela arrive les calculs sont faux et des octets peuvent etre ecrits n'importe ou dans la memoire... (pour ceux qui ont deja eux des bugs graphiques avec pong de basbak c ca)
:arrow: le clipping prend du temps donc utilisez les fonctions sans le clipping si vous etes sur que ca debordera pas.
:arrow: sinon sous turboc on doit ecrire en decimal ou en hexadecimal(base 16)
une valeur en hexa est tjs precedee de 0x , et chaque chiffre en hexa correspond a 4 bits, ce qui simplifie les choses.
:twisted: voila le code des fomctions sous turbo c:
//prototypes des fonctions: void Sprite8(int x,int y,void* spr,int segm); //affiche un sprite (utilisation de mov) // 1 -> met le pixel a noir // 0 -> met le pixel a blanc void Sprite8or(int x,int y,void* spr,int segm); //affiche un sprite, n'affiche que le noir (utilisation du OR) // 1 -> met le pixel a noir // 0 -> rien void Sprite8xor(int x,int y,void* spr,int segm); //affiche un sprite en inversant les pixels (utilisation du XOR) // 1 -> inversion // 0 -> rien void Sprite8_noclip(int x,int y,void* spr,int segm); //comme Sprite8 mais ne gere pas le clipping void Sprite8or_noclip(int x,int y,void* spr,int segm); //comme Sprite8or mais ne gere pas le clipping void Sprite8xor_noclip(int x,int y,void* spr,int segm); //comme Sprite8xor mais ne gere pas le clipping //code des fonctions: void Sprite8(int x,int y,void* spr,int segm) { asm{ push ax push bx push cx push dx push si push di push es mov cx,x mov dx,y mov si,spr mov ax,segm mov es,ax mov di,1023 mov bx,8 cmp dx,0 jge sp8clippedTop add si,dx add bx,dx xor dx,dx cmp bx,0 jg sp8clippedy jmp sp8end } sp8clippedTop: asm{ cmp dx,56 jle sp8clippedy mov ax,dx sub ax,56 sub bx,ax jg sp8clippedy jmp sp8end } sp8clippedy: asm{ sub di,dx cmp cx,0 jge sp8OKLeft jmp Sprite8_SpecialLeft } sp8OKLeft: asm{ cmp cx,120 jl sp8OKRight jmp Sprite8_SpecialRight } sp8OKRight: asm{ sub di,64 mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8loopdisplay: asm{ xor al,al or ah,0xff shr ax,cl and [es:di+bx],ah and [es:di+bx+64],al xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne sp8loopdisplay jmp sp8end } Sprite8_SpecialRight: asm{ cmp cx,128 jl sp8srOKclipped jmp sp8end } sp8srOKclipped: asm{ mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8srloopdisplay: asm{ xor al,al or ah,0xff shr ax,cl and [es:di+bx],al xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],ah dec bx cmp bx,dx jne sp8srloopdisplay jmp sp8end } Sprite8_SpecialLeft: asm{ cmp cx,-8 jg sp8slOKclipped jmp sp8end } sp8slOKclipped: asm{ add cx,8 and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8slloopdisplay: asm{ xor al,al or ah,0xff shr ax,cl and [es:di+bx],ah xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al dec bx cmp bx,dx jne sp8slloopdisplay } sp8end: asm{ pop es pop di pop si pop dx pop cx pop bx pop ax } return; } void Sprite8or(int x,int y,void* spr,int segm) { asm{ push ax push bx push cx push dx push si push di push es mov cx,x mov dx,y mov si,spr mov ax,segm mov es,ax mov di,1023 mov bx,8 cmp dx,0 jge sp8orclippedTop add si,dx add bx,dx xor dx,dx cmp bx,0 jg sp8orclippedy jmp sp8orend } sp8orclippedTop: asm{ cmp dx,56 jle sp8orclippedy mov ax,dx sub ax,56 sub bx,ax jg sp8orclippedy jmp sp8orend } sp8orclippedy: asm{ sub di,dx cmp cx,0 jge sp8orOKLeft jmp Sprite8or_SpecialLeft } sp8orOKLeft: asm{ cmp cx,120 jl sp8orOKRight jmp Sprite8or_SpecialRight } sp8orOKRight: asm{ sub di,64 mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8orloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne sp8orloopdisplay jmp sp8orend } Sprite8or_SpecialRight: asm{ cmp cx,128 jl sp8orsrOKclipped jmp sp8orend } sp8orsrOKclipped: asm{ mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8orsrloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],ah dec bx cmp bx,dx jne sp8orsrloopdisplay jmp sp8orend } Sprite8or_SpecialLeft: asm{ cmp cx,-8 jg sp8orslOKclipped jmp sp8orend } sp8orslOKclipped: asm{ add cx,8 and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8orslloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al dec bx cmp bx,dx jne sp8orslloopdisplay } spor8end: asm{ pop es pop di pop si pop dx pop cx pop bx pop ax } return; } void Sprite8xor(int x,int y,void* spr,int segm) { asm{ push ax push bx push cx push dx push si push di push es mov cx,x mov dx,y mov si,spr mov ax,segm mov es,ax mov di,1023 mov bx,8 cmp dx,0 jge sp8xorclippedTop add si,dx add bx,dx xor dx,dx cmp bx,0 jg sp8xorclippedy jmp sp8xorend } sp8xorclippedTop: asm{ cmp dx,56 jle sp8xorclippedy mov ax,dx sub ax,56 sub bx,ax jg sp8xorclippedy jmp sp8xorend } sp8xorclippedy: asm{ sub di,dx cmp cx,0 jge sp8xorOKLeft jmp Sprite8xor_SpecialLeft } sp8xorOKLeft: asm{ cmp cx,120 jl sp8xorOKRight jmp Sprite8xor_SpecialRight } sp8xorOKRight: asm{ sub di,64 mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8xorloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al xor [es:di+bx+64],ah dec bx cmp bx,dx jne sp8xorloopdisplay jmp sp8xorend } Sprite8xor_SpecialRight: asm{ cmp cx,128 jl sp8xorsrOKclipped jmp sp8xorend } sp8xorsrOKclipped: asm{ mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8xorsrloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],ah dec bx cmp bx,dx jne sp8xorsrloopdisplay jmp sp8xorend } Sprite8xor_SpecialLeft: asm{ cmp cx,-8 jg sp8xorslOKclipped jmp sp8xorend } sp8xorslOKclipped: asm{ add cx,8 and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8xorslloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al dec bx cmp bx,dx jne sp8xorslloopdisplay } sp8xorend: asm{ pop es pop di pop si pop dx pop cx pop bx pop ax } return; } void Sprite8_noclip(int x,int y,void* spr) { asm{ push ax push bx push cx push dx push si push di push es mov cx,x mov dx,y mov si,spr mov qx,segm mov es,ax mov di,959 ;1023-64 mov bx,8 sub di,dx mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8ncloopdisplay: asm{ xor al,al or ah,0xff shr ax,cl and [es:di+bx],ah and [es:di+bx+64],al xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne sp8xorncloopdisplay pop es pop di pop si pop dx pop cx pop bx pop ax } return; } void Sprite8or_noclip(int x,int y,void* spr) { asm{ push ax push bx push cx push dx push si push di push es mov cx,x mov dx,y mov si,spr mov qx,segm mov es,ax mov di,959 ;1023-64 mov bx,8 sub di,dx mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8xorncloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne sp8xorncloopdisplay pop es pop di pop si pop dx pop cx pop bx pop ax } return; } void Sprite8xor_noclip(int x,int y,void* spr) { asm{ push ax push bx push cx push dx push si push di push es mov cx,x mov dx,y mov si,spr mov qx,segm mov es,ax mov di,959 ;1023-64 mov bx,8 sub di,dx mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8xorncloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al xor [es:di+bx+64],ah dec bx cmp bx,dx jne sp8xorncloopdisplay pop es pop di pop si pop dx pop cx pop bx pop ax } return; }
Hors ligne
c pas du flood parce que c'est intelligent, que ca sert a tt le monde... en general le flood c des conneries dedans... :x
Hors ligne
tu devrais les débugguer tes routines! Car tu as tout fait au copier-coller!
mov qx,segmt mov es, qx
devrait être remplacé par:
mov ax,segmt mov es,ax
Ensuite, tu as oublié des arguments dans certaines fonctions, il faut rajouter un int segmt)
ou bien remplacer segmt par l'adresse d'un buf video mais cela va de soi.
et puis à chaque compilation il me met que l'op ":" a été ignoré!
à voir...
PS: viiite! à débugguer! c important pr moi!
Hors ligne
Eh oh tu croyais pas que j'allais tout reecrire...
sinon pour le "qx" c'est un peu normal je suis comme je l'ai dis plein de fois aux states et g pas l'habitude du qwerty...
Bon excuse pour les fautes...
Rajoute les int segm
Je ferai un tuto sur les sprites des que je rentrerai en france (parce que la c rien ce que g marque)
euh regarde ou il te met ": a ete ignore"
Hors ligne
Ah ok t'es sur un clavier qwerty c pour ça! Mais c'est pas grave, j'ai presque fini de tout débugguer, car tu avais aussi oublié de changer les labels, et je retrouvais des commandes de saut vers des labels qui n'avaient rien à voir avec la fonction! Mais bon, ça c'est pas grave du tout. En ce qui concerne les ":", je vais essayer ça: (attention pas testé>>probablement buggué)
xor ah,ah lodsb xchg al,ah shr ax,cl xor es:[di+bx],al xor es:[di+bx+64],ah dec bx cmp bx,dx jne sp8xorncloopdisplay
ça c'est pour le sprite8_or_noclip(dsl si je me suis gourré dans le nom )
En fait j'ai modifié la déclaration de l'adresse video, le segment reste sans crochets, alors que l'offset lui en a (pense à mov es:[si],al)
Voila je vais tester ça et je vous dis
++
Hors ligne
C'est bon j'ai réussi à afficher correctement un sprite ne te casse plus la tête les autres on plus. Donc bougez surtout pas, je vais aller vous programmer une lib avec ces fonctions toutes bien débugguées, et pê (mais ce sera pas pour aujourd'hui) les mêmes fonctions mais pour le grayscale.
Voilà, j'y vais moi!
Hors ligne
Hop voila moi aussi g tout debugge lol
//prototypes des fonctions: void Sprite8(int x,int y,void* spr,int segm); //affiche un sprite (utilisation de mov) // 1 -> met le pixel a noir // 0 -> met le pixel a blanc void Sprite8or(int x,int y,void* spr,int segm); //affiche un sprite, n'affiche que le noir (utilisation du OR) // 1 -> met le pixel a noir // 0 -> rien void Sprite8xor(int x,int y,void* spr,int segm); //affiche un sprite en inversant les pixels (utilisation du XOR) // 1 -> inversion // 0 -> rien void Sprite8_noclip(int x,int y,void* spr,int segm); //comme Sprite8 mais ne gere pas le clipping void Sprite8or_noclip(int x,int y,void* spr,int segm); //comme Sprite8or mais ne gere pas le clipping void Sprite8xor_noclip(int x,int y,void* spr,int segm); //comme Sprite8xor mais ne gere pas le clipping //code des fonctions: void Sprite8(int x,int y,void* spr,int segm) { asm{ push ax push bx push cx push dx push si push di push es mov cx,x mov dx,y mov si,spr mov ax,segm mov es,ax mov di,1023 mov bx,8 cmp dx,0 jge sp8clippedTop add si,dx add bx,dx xor dx,dx cmp bx,0 jg sp8clippedy jmp sp8end } sp8clippedTop: asm{ cmp dx,56 jle sp8clippedy mov ax,dx sub ax,56 sub bx,ax jg sp8clippedy jmp sp8end } sp8clippedy: asm{ sub di,dx cmp cx,0 jge sp8OKLeft jmp Sprite8_SpecialLeft } sp8OKLeft: asm{ cmp cx,120 jl sp8OKRight jmp Sprite8_SpecialRight } sp8OKRight: asm{ sub di,64 mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8loopdisplay: asm{ xor al,al or ah,0xff shr ax,cl and [es:di+bx],ah and [es:di+bx+64],al xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne sp8loopdisplay jmp sp8end } Sprite8_SpecialRight: asm{ cmp cx,128 jl sp8srOKclipped jmp sp8end } sp8srOKclipped: asm{ mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8srloopdisplay: asm{ xor al,al or ah,0xff shr ax,cl and [es:di+bx],al xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],ah dec bx cmp bx,dx jne sp8srloopdisplay jmp sp8end } Sprite8_SpecialLeft: asm{ cmp cx,-8 jg sp8slOKclipped jmp sp8end } sp8slOKclipped: asm{ add cx,8 and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8slloopdisplay: asm{ xor al,al or ah,0xff shr ax,cl and [es:di+bx],ah xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al dec bx cmp bx,dx jne sp8slloopdisplay } sp8end: asm{ pop es pop di pop si pop dx pop cx pop bx pop ax } return; } void Sprite8or(int x,int y,void* spr,int segm) { asm{ push ax push bx push cx push dx push si push di push es mov cx,x mov dx,y mov si,spr mov ax,segm mov es,ax mov di,1023 mov bx,8 cmp dx,0 jge sp8orclippedTop add si,dx add bx,dx xor dx,dx cmp bx,0 jg sp8orclippedy jmp sp8orend } sp8orclippedTop: asm{ cmp dx,56 jle sp8orclippedy mov ax,dx sub ax,56 sub bx,ax jg sp8orclippedy jmp sp8orend } sp8orclippedy: asm{ sub di,dx cmp cx,0 jge sp8orOKLeft jmp Sprite8or_SpecialLeft } sp8orOKLeft: asm{ cmp cx,120 jl sp8orOKRight jmp Sprite8or_SpecialRight } sp8orOKRight: asm{ sub di,64 mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8orloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne sp8orloopdisplay jmp sp8orend } Sprite8or_SpecialRight: asm{ cmp cx,128 jl sp8orsrOKclipped jmp sp8orend } sp8orsrOKclipped: asm{ mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8orsrloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],ah dec bx cmp bx,dx jne sp8orsrloopdisplay jmp sp8orend } Sprite8or_SpecialLeft: asm{ cmp cx,-8 jg sp8orslOKclipped jmp sp8orend } sp8orslOKclipped: asm{ add cx,8 and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8orslloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al dec bx cmp bx,dx jne sp8orslloopdisplay } sp8orend: asm{ pop es pop di pop si pop dx pop cx pop bx pop ax } return; } void Sprite8xor(int x,int y,void* spr,int segm) { asm{ push ax push bx push cx push dx push si push di push es mov cx,x mov dx,y mov si,spr mov ax,segm mov es,ax mov di,1023 mov bx,8 cmp dx,0 jge sp8xorclippedTop add si,dx add bx,dx xor dx,dx cmp bx,0 jg sp8xorclippedy jmp sp8xorend } sp8xorclippedTop: asm{ cmp dx,56 jle sp8xorclippedy mov ax,dx sub ax,56 sub bx,ax jg sp8xorclippedy jmp sp8xorend } sp8xorclippedy: asm{ sub di,dx cmp cx,0 jge sp8xorOKLeft jmp Sprite8xor_SpecialLeft } sp8xorOKLeft: asm{ cmp cx,120 jl sp8xorOKRight jmp Sprite8xor_SpecialRight } sp8xorOKRight: asm{ sub di,64 mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8xorloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al xor [es:di+bx+64],ah dec bx cmp bx,dx jne sp8xorloopdisplay jmp sp8xorend } Sprite8xor_SpecialRight: asm{ cmp cx,128 jl sp8xorsrOKclipped jmp sp8xorend } sp8xorsrOKclipped: asm{ mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8xorsrloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],ah dec bx cmp bx,dx jne sp8xorsrloopdisplay jmp sp8xorend } Sprite8xor_SpecialLeft: asm{ cmp cx,-8 jg sp8xorslOKclipped jmp sp8xorend } sp8xorslOKclipped: asm{ add cx,8 and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8xorslloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al dec bx cmp bx,dx jne sp8xorslloopdisplay } sp8xorend: asm{ pop es pop di pop si pop dx pop cx pop bx pop ax } return; } void Sprite8_noclip(int x,int y,void* spr,int segm) { asm{ push ax push bx push cx push dx push si push di push es mov cx,x mov dx,y mov si,spr mov ax,segm mov es,ax mov di,959 //;1023-64 mov bx,8 sub di,dx mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8xorncloopdisplay: asm{ xor al,al or ah,0xff shr ax,cl and [es:di+bx],ah and [es:di+bx+64],al xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne sp8xorncloopdisplay pop es pop di pop si pop dx pop cx pop bx pop ax } return; } void Sprite8or_noclip(int x,int y,void* spr,int segm) { asm{ push ax push bx push cx push dx push si push di push es mov cx,x mov dx,y mov si,spr mov ax,segm mov es,ax mov di,959 //;1023-64 mov bx,8 sub di,dx mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8xorncloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne sp8xorncloopdisplay pop es pop di pop si pop dx pop cx pop bx pop ax } return; } void Sprite8xor_noclip(int x,int y,void* spr,int segm) { asm{ push ax push bx push cx push dx push si push di push es mov cx,x mov dx,y mov si,spr mov ax,segm mov es,ax mov di,959 //;1023-64 mov bx,8 sub di,dx mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx } sp8xorncloopdisplay: asm{ xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al xor [es:di+bx+64],ah dec bx cmp bx,dx jne sp8xorncloopdisplay pop es pop di pop si pop dx pop cx pop bx pop ax } return; }
Hors ligne