Vous n'êtes pas identifié.
La je suis a la fac, mais g un peu de temps, alors je vait voue nbricoler une detaillée, mais sans pouvoir faire de test savoir si ça marche :
Effacer l'ecran
Deja faut passer en mode 0xD3
Pour cela, mettre dans le port 2 cette valeur.
Ensuite, pour afficher un pixel (total freestyle) :
mov cx,X ;met l'abscisse dans cx
mov si,Y ;met l'ordonnée dans si
shl si,4 ;multiplie par 16 pour se positionner sur la bonne ligne
mov cl,ch ;pour pouvoir calculer la division par 8 et son reste
shr cx,3 ;on divise bx par 8, le resultat est dans ch
shr cl,5 ;on ajuste le reste
add si,ch ; on ajoute le resultat dans si, maintenant on pointe sur le bon octet memoire
xor bl,bl ; met l'octet a afficher a 0
db 0x0F,0x14,0x0C3 ; On place dans bx le bit afficher grace au reste dans cl
or es:[si],bl ; et on affiche le bit a l'ecran sans modifier les autres.
Enfin on remet le mode normal (0xE3 dans le port 2) si on a plus rien a faire. Le passage en ce mode ne devrai pas etre compter dans le timming de l'affiche (@2072).
Le principe de fonctionnement de cet algorithme est que dans le mode D3, l'affichage des octets se fait lignes par ligne en partant en bas a droite de l'ecran pour arrivé en haut a gauche de l'ecran, le tout en se deplaçant de 8 pixels (bit) a chaques fois vers la gauche.
Un mode d'affichage sympa et bien plus simple que l'actuel.
Je pense qu'un tel truc ferai un bon tuto, mais etant au bahu et n'ayant pas testé cette routine (mais le mode est cependant fonctionnel, ça je l'ai testé)....
Voila, si vous avez des corrections, n'hesitez pas.
Il semblerais qu'un mode en niveau de gris exite aussi pour ce mode, mais je ne l'ai pas experimenté (la theorie voudrais que ce soit le mode 0xDB).
Je suis sur que ça vous sera très utile !
@+
P.S. : va qd meme falloir que je face payer dans droit de decouverte moi ...
Je parle du mode de l'ecran, donc a la fois de la routine a brad, des mes precedentes, et de setpixel. avant la valeur incrite dans le port 2 etait C3 ou E, mais ici c D3, alors que pour le gris c C3
C le mode.
@+
Hors ligne
Ouai je vais tester ça au fait pourrais-tu m'expliquer cette commande en assembleur car je ne la comprends pas, je vois pas ce qu'elle fait:
db 0x0F,0x14,0x0C3
Merci, @+
Hors ligne
set1 bl,cl Ca met le bit numero cl de bl a 1. C une commande que nasm connait pas, mais qui marche qouq v30
Hors ligne
hum... et la je fais quoi ?
@+
Hors ligne
exactement,
L@rk, il faut que tu comprennes ke le buffer de l'ecran est en mémoire, donc pour changer son état à tt moment, il faut écrire dans ce buffer, pas dautres facons pour tracer un pixel !!!
y@ss
Hors ligne
Oui mais que signifie les valeurs en hexa, je sais que la commande db signifie define byte mais mes connaissances en asm sont encore très rudimentaires.
merci @+
Hors ligne
Bon ça y est j'ai réussi à faire fonctionner ta fonction en la modifiant car il y avait quelques erreurs, j'ai aussi ajouter des commentaires:
mov cx,x mov si,y [b]mov es,segm_video[/b] shl si,4 [i];si *= 16 (16 * 8 == 128 pixel/line) now we are on the right line[/i] [b]mov ch,cl[/b] [i];0<=cx<128 so this is allowed and now cl==x and ch==x[/i] shr cx,3 [i];cx /= 8 the result is in ch and the remainder is (cl>>5)[/i] shr cl,5 [i];cl is now the remainder of cx / 8[/i] [b]xor bx,bx[/b] [i];bx = 0[/i] [b]mov bl,ch[/b] [i];bx = ch[/i] [b]add si,bx[/b] [i];si += ch so si is now on the right byte[/i] xor bl,bl [i]; bl = 0[/i] db 0x0F,0x14,0x0C3 [i]; set1 bl,cl // set to 1 the bit cl of bl[/i] or es:[si],bl [i]; or the byte at segm_video:si with our bl ![/i]
Les lignes en gras sont les lignes que j'ai ajouté ou modifié, le problème c'est que cette version a 2 instructions en plus. Mais le temps indiqué par mon TOUCHE est le même que pour la fontion normal même s'il y a un push et un pop en moins !
Pour les erreurs que j'ai corrigé :
- j'ai juste mis la bonne valeur dans es (peut on utiliser directement segm_video à la place de es dans la dernière ligne ?).
- t'avais mis les 8 bits de poids fort de cx dans les 8 bits de poids faible de cx
- On ne pouvait pas faire add si,ch car si fait 16bits et ch 8bits, ça provoquait une erreur lors de la compilation.
Enfin propose si t'as une meilleur idée pour optimiser, parce que l'asm et moi ça fait encor 1,5 !
@+
Hors ligne
non, ben faudrais que je me lance dans les test. Mais bon si c pareil en vitesse, alors c pas aussi cool que je l'esperat, mais ce mode video est drolement plus simple a comprendre et a gerer que l'autre.
Je vais voir.
@+
Un petit rajout : mettre la bonne valeur de es dans cette routine fait perdre du temps et ne sert a rien, on va qd meme pas la reecrire a chaques fois. un appel a la fonction setvideo, et hop on y touche plus. Donc ça fais deux cycles de moins
Hors ligne
Au fait, un autre truc logique, mais cool, c que les niveau de gris marche aussi dans ce mode.
@+
Hors ligne
Je me suis peut être mal exprimé.
Je sais tres bien que le buffer vidéo EST en mémoire.
Je sais tres bien que la SEULE facon d'afficher 1 point c'est d'écrire dedans.
Je sais aussi qu'il existe plusieurs méthodes : les interruptions (très lent), l'écriture directe (rapide) et la méthode de Whyp (rapidité ???).
Je voulais JUSTE connaitre la vitesse de celle de Whyp comparée aux autres et en quoi elle consistait. C'est tout !
(PS: je vous paraît peut être un peu lourd mais ya des trucs que g qd meme envie de comprendre: ca peut être utile !)
Sur ce ...
Hors ligne
Oula mec, te sens pas offensé, ya pas de soucis. Pour connaitre la vitesse de mes routines, va dans touche, graphic tet, 2072 les y a incluses. Sinon, g reecrsi la ft que 2072 avait reecrite, mais mon Pc etant en deperdition g pas encore reussi a l'essayé...
@+
Hors ligne
Mais ... je suis tout a fait zen, calme et serein !
Il n'y avait aucune intention méchante ni quoi que ce soit ds mon précédent post !
Enfin bon.
Merci qd même pour ta réponse Whyp !
;-)
@+ et bonne progra !
Hors ligne
En fait qu'est-ce qui garanti que es ne va pas être modifié entre le moment ou on appel setvideo et le moment où on utilise la fonction ?
Ah oui est peux-tu m'expliquer la signification des valeurs en hexa dans la commande db 0x0F,0x14,0x0C3
Merci @+
Hors ligne
Sous TC, si tu specifie que tu ne souhaite pas utilisé de registre, il ne te les modifiera pas, et es gardera sa valeur. En sam, faut y faire gaffe, mais ça se voit si ça change.
Sinon, le db 0x14.... ben en fait c le code hexa de set1 bl,cl. C comme ça que l'assembleur aurais trnascris cette fonction, mais le probleme c qu'elle ne la connais pas, donc faut l'ecrire a la main.
C le code hexa de cette fonction, tel qu'il sera lu et compris par le processeur.
@+
Hors ligne
Donc J'ai trifouillé la zone video avec Touche (Merci 2072) et j'ai trouvé ceci :
d'abord, tt le monde le sait, la structure du code a mettre dans le port 2 :
1 ! 2 ! 3 ! 4 ! 5 ! 6 ! 7 ! 8 ---------------------------------------------------------------------------------- Ne Pas Toucher ! Inutile ! Type de ! Couleur ! Plus Clair ! XXX ! Si 6=1 ! ! ! Mode ! Nb/Gris ! ! !Plus Clair
Voila, atention si vous touchez aux bits 1,2 et 7, l'ecran soit devient Bleu (trés mauvais) soit il s'etein t et la calto reponds plus.
Et voila les valeurs a mettre :
Normal - N&B : C3 : 11000011 Normal - Gris : CB : 11001011 Basique - N&B : D3 : 11010011 Basique - Gris : DB : 11011011 (La valeur DC : 11011100 marche aussi)
Et j'ai aussi testé le mode Basique - Gris et sa structure.
La structure est diferente que celle du Normal - Gris.
Au lieu que ce soit:
Pour une ligne : 3 lignes
NON, c mieux, ya que 3 couleurs Noir(Gris Foncé) / Gris / et Blanc, pas de Gris clair
Sinon, c'est egalement trés simple
Pour tester, j'ai mis, un bit 1 sur une page (du mode normal soit 40h, quand je parle de page, ça veut dire ça) et 1 bit sur la 2nd et sur la troisieme, en changeant ces ordres, j'ai observé :
Couleur ! 1 ! 2 ! 3 ! ------------------------------ Noir ! 1 ! 1 ! 1 ! ------------------------------ Gris ! 1 ! 1 ! 0 ! ------------------------------ Noir ! 1 ! 0 ! 1 ! ------------------------------ Gris ! 0 ! 1 ! 1 ! ------------------------------ Blanc ! 0 ! 1 ! 0 ! ------------------------------ Gris ! 1 ! 0 ! 0 ! ------------------------------ Gris ! 0 ! 0 ! 1 ! ------------------------------
Donc la page 2 ne sert a rien et les bits ne cahngent rien.
On recapitule :
Noir : On met un bit dans le 1 et 3 a la m^me position
Gris : On met un bit soit dans le 1 ou dans le 3
Blanc : On me 0 aux 1 et 3
Le 2 ne sert pas
Donc theoriquement on peut faire un buffer intercroisé
Cad qu'on utilise que 4 pages
Explications, la page 2 ne sert a rien donc on peut faire un buffer de cette façon :
MEMOIRE! Page 0 - Image 1.1 ! Page 1 - Image 2.1 ! Page 2 - Image 1.2 ! Page 3 - Image 2.2
Et on place la video soit sur la page 0 ou 1, elle ne tiendra pas compte dans le cas du 0 de la page 1 et dans le cas du 1 de la page 2
Voila, Des questions ?
Hors ligne
juste qq precision : alors deja, l'ecran peu devenir bleu, mais en aucun cas le mode video ne plante la caltos. Sous touche suffit de faire shift off, et on se rend bien compte qu'elle repond encore. Sinon, la seconde couhe dans les niveau de gris, elle donne un gris tres legerement different, mais il est differetns qd meme, j'en suis sur, g verifié.
@+
P.S. : l'ecran peu devenir bleu certe, mais tu n'as pas parlé des niveau de bleus.... de plus il existe un mode ou ya 4 niveau de couleur, mais je suis pas sur qu'on puisse l'utilisé.
oula, ça change kan meme pas mal de chose pour mon nouvel utilitaire (GIMC), en effet je voulais coder des images en 4 couleurs soit:
-blanc
-noir
-gris foncé
-gris clair
mais la vous me dites kil nya presque pas de différence entre les deux gris, voulez vous ke je continue en 4 couleurs ou bien se ramener a 3, de tte facon ca ne change rien pour mon prog en tant ke tel, mais avec 4 couleurs on a plusde possiblités et de nuances ( normal)
j'attends vos avis !!
Pour whyp, jai tesé ta methode et apparement ce ki a de nouveau cest kelle fusionne 2 rangées de pixels successives (chacune comportant 8 pix)
donc c afait des colones de 64*16 et non 64*8,
enfin dapr`s mon test,
sinon le code ke tu mas proposé lautre fois fait tt de meme planter la caltos lorskon veut revenir en mode txt apres avoir mis delgray() !!
Derniere chose , pourrais tu me montrer comment est ce ke je pourrai faire un petit fichier daide comme graphics.h c a d en *.chm (je pense)
Merci
@+
y@ss
Hors ligne
G utilisé le logiciel HTML Help Workshop pour faire mes fihiers d'aide.
Sinon, je pense que 3 couleurs suffisent largement, et te previent que superna en deja fais un format 3 couleurs, je pense que vous devriez vous mettre d'accord.
Sinon, c bizzare car chez moi la outine marche tres bien...
G pas bien compris 7 histoire de colonnes fusionnée, tu peut precisé, "ma methode" ?
@+
Sous TC, si tu specifie que tu ne souhaite pas utilisé de registre, il ne te les modifiera pas, et es gardera sa valeur. En sam, faut y faire gaffe, mais ça se voit si ça change.
Sinon, le db 0x14.... ben en fait c le code hexa de set1 bl,cl. C comme ça que l'assembleur aurais trnascris cette fonction, mais le probleme c qu'elle ne la connais pas, donc faut l'ecrire a la main.
C le code hexa de cette fonction, tel qu'il sera lu et compris par le processeur.
-oui j'ai essayé cette option dans TC mais mon prog prend 1 à 2 Ko de plus et est sûrement plus lent alors...
-sinon pour db 0x14... j'avais bien compris de quoi il s'agissait mais ce que je te demandais c'était la signification de chaque valeur en hexa : laquelle correspond au registre bl, au registre cl, à la comande set1. en fait j'aimerais utiliser set1 (et les autres instruction qqch1) mais avec des registres complet (16bits) pour optimiser mes routines d'affichage (routines qui inverse l'écran word/word etc...). Où puis-je trouver les valeurs hexa correspondant aux différentes instructions assembleurs ?
Merci bcp @+
Hors ligne
Ah Ok j'avais pas compris.
Alor sen fait c assez simple, decomposition binaire, donc 24 chiffres :
00001111 : c l'instruction special v30, sur un 8086 ça fais pop cs, mais comme c inutile, Nec l'as remplacé par son propre jeu d'instruction, donc toute les commande speciales commencent par ça.
0001010011000 : c pour dire qu'on utilise set1 reg8,CL
xxx : specifie le registre reg8
Tout ça tu le trouve dans le manuel d sinstruction de nec, dispo sur mon site au format pdf.
@+