Vous n'êtes pas identifié.
je suis pas un spécialiste en asm. alors est-ce que qqun pourrait me convertir cette fonction pour quel fonctionne sous l'adresse video 0x1A60 et non pas sous l'adresse 0x1A20 (qui s'affiche a l'écran). merci de m'aider car je pige RIEN (je sais je devraii me mettre a l'asm mais bon...)
void setPix(int x,int y,char couleur) { if (couleur==0 || couleur==1) { asm { mov cx,x mov dx,y mov al,couleur mov si,0x003f sub si,dx sub cx,0x80 not cx push cx and cl,0xf8 shl cx,0x03 add si,cx pop cx and cl,0x07 mov ah,0xfe rol ah,cl and es:[si],ah mov ah,al rol ah,cl or es:[si],ah } } }
Hors ligne
Essaye plutot celle-ci:
void setPix(unsigned short int x, unsigned short int y,unsigned int segm,char state) {asm push ax; asm push cx; asm push dx; asm mov cx,x; asm mov dx,y; asm mov es,segm; asm mov al,state; asm mov si,0x003f; asm sub si,dx; asm sub cx,0x80; asm not cx; asm push cx; asm and cl,0xf8; asm shl cx,0x03; asm add si,cx; asm pop cx; asm and cl,0x07; asm mov ah,0xfe; asm rol ah,cl; asm and es:[si],ah; asm mov ah,al; asm rol ah,cl; asm or es:[si],ah; asm pop dx; asm pop cx; asm pop ax;}
setPix(x,y,0x1A60,couleur);
arès ben tu px enlever le int segm et remplacer le segm de la routine par l'adresse du buffer que tu veux.
Hors ligne
Merci Casiomax
Enfin. 1 mois et demi plus tard, le "moteur graphique" de Cyclo II avance.
Pour ceux qui se posent la question, Non il n'y aura pas de niveau de gris (je verrai pour dans le future)
Hors ligne
Mais tout comptes faits ta routine est bcp plus optimisée, donc essaye ça: (g pas testé):
void setPix(int x,int y,char couleur,.../*int segm*/)) { if (couleur==0 || couleur==1) { asm { mov ax,segm //ici l'adresse du buffer video mov es,ax //on met dans es la valeur de ax, soit le buffer voulu mov cx,x mov dx,y mov al,couleur mov si,0x003f sub si,dx sub cx,0x80 not cx push cx and cl,0xf8 shl cx,0x03 add si,cx pop cx and cl,0x07 mov ah,0xfe rol ah,cl and es:[si],ah mov ah,al rol ah,cl or es:[si],ah } } }
Les "..." après la virgule c un truc pr dire au compilateur ke ta ft peut contenir plus d'arguments, donc à toi de voir.
Sinon les grayscale c très simple:
que ce soit en mode CB (3*C3) ou DB (3*D3) c le même principe!
1pixel dans le buf 1 allumé et 1 pixel dans le buf3 allumé->Noir
1pixel dans le buf 1 éteint et 1 pixel dans le buf3 allumé-> Gris
Rien d'allumé->blanc
VOilà, et je crois que les adresses des buffers c:
0x1A20
0x1A60 (le buf 2 sert à rien pas de chgmt perceptible->cf tuto de Whyp)
0x1AA0 ou 0x1A80 je sais pus
Voilou! Je crois que je ne me suis pas trompé!
Hors ligne