Utilisateur anonyme
-
6 mai 2009 à 19:17
BLUEBIBUBBLE
Messages postés116Date d'inscriptionsamedi 4 juin 2005StatutMembreDernière intervention10 avril 2013
-
5 juin 2009 à 22:36
Bonjour à toutes & à tous
J'aimerai savoir s'il existe un moyen de deplacer le curseur en mode texte sous dos
sans utiliser les interruptions Dos / Bios ??
Tasm 4
winxp
MErci d avance et bonne prog ;-)
A voir également:
Deplacer le curseur en mode texte sans les interruptions
bofur
Messages postés39Date d'inscriptionlundi 13 novembre 2000StatutMembreDernière intervention 5 juin 2009 10 mai 2009 à 23:01
pour pouvoir déplacer le curseur en mode texte, il faut pouvoir modifier des registre de la carte video
la carte video comprend la position du curseur comme une adresse (num du caractère + num de ligne x nombre de collonne)
voici le code pour faire ça (il faut au préalable mettre dans bx la position du curseur):
mov dx,3D4h ;sav pos cur
mov al,0Eh
out dx,al
mov dx,3D5h
mov al,bh
out dx,al
mov dx,3D4h
mov al,0Fh
out dx,al
mov dx,3D5h
mov al,bl
out dx,al
Hello !!
& tout d'abord merci pour ta reponse, mais elle ne correspond pas a ce que je cherche, mais ma demande n'etait peut etre pas tres precise.
=>Concernant SetCursorPos je suis tout a fait d'accord !!! (mais c'est une fonction windows et mon but est de na pas utiliser la librairie "standard").
Bref je m'explique : mon objectif est purement didactique et consiste a connaitre reellement le fonctionnement du pc. Je code sous dos & windows depuis 15ans (bp, tpw, tasm, delphi...) et je suis tout a fait d'accord que l'utilisation de la librairie standard est tres pratique, le resultat est rapide certe, mais j'ai toujours le meme problème : comment ca marche ?? Depuis des annees je me sert de librairies, d'api, de composants etc... qui sont ecrits par d'autres et dont je ne sait jamais (ou tres mal) ce qu'ils font reellement (tout en augmentant de maniere considerable la taille du code - cela va sans dire ;-( ).
Ma question est la suivante :
Comment est codé le curseur (en mode texte sous dos) en memoire video ???
Merci a+ & Bonne prog!!
PS : si pour toi les interruptions sont des horreurs !!???!! comment fait tu pour terminer un exe sans la 21h ?? Donne moi ta reponse je ne demande qu'a apprendre !! et c'est d'ailleurs pour ca que je me suis inscrit sur ce forum !!
cs_ghuysmans99
Messages postés3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 7 mai 2009 à 20:16
Si tu veux savoir comment fonctionne le positionnement du curseur, regarde par exemple des parties du source de Linux.
<hr size="2" width="100%" />Comment quitter ??
xor (e)ax,(e)ax
ret
<hr size="2" width="100%" />Les interruptions MS-DOS sont à proscrire quand on est sous Windows : on est maintenant en mode protégé, les process possèdent leur mémoire virtuelle de 4Go, n'accèdent pas à celle des autres, on ne fait plus ce que l'on veut avec les périphériques et on possède des registres 2x plus grands (16 bits => 32 bits)
.
Plus question d'utiliser les interruption, car tu fais appel à NTVDM, l'émulateur de DOS de Windows et, par conséquent, tu perds le plus grand avantage de l'assembleur : sa vitesse. Le vrai DOS a totalement disparu depuis Windows NT.
Et ce n'est qu'avec les APIs que tu peux exploiter toutes les possibilités de la machine !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Merci pour ta reponse !!
Je vais essayer ta combine !! Quand au source de linux je vais essayer mais je ne connait pas bien, je me sert occasionnellement de kde mais je ne suis jamais allé voir dans les sources du systeme. Quand a tes remarques sur windows je suis tout a fait d'accord mais mon objectif est simplement didactique ;-) Quand j'ai besoin de coder en asm sous xp c juste des fonctions pour delphi et là j'ai pas besoin de me preoccuper de l'affichage !
@+ & bonne prog!
PS : le dos est mort sauf chez moi !! j'ai toujours un 80286, un 80386, un 80486 et un des premiers pentiums !!
Hello bofur
et Merci pour ta réponse !!
Je vais examiner ton code & le tester dès que possible !! A priori c'est exactement ce que je cherchait !! =;-) Comme quoi c'etait à priori bien possible !!
Je me souvient maintenant avoir lu un truc y'a des annees sur le DAC de la carte video (de memoire je pense que c'est ca). C'est ce que ton code utilise ou ca n'a rien a voir ?
bofur
Messages postés39Date d'inscriptionlundi 13 novembre 2000StatutMembreDernière intervention 5 juin 2009 12 mai 2009 à 23:46
oui c'est les port du crtc (cathodic? ray tube controleur), c'est les ports de la carte EGA ou CGA il me semble, le dac c'est pour changer les couleurs du mode 256 couleurs (et ptet meme 16 couleurs)
le pti bout de code ne peut que marcher je l'ai uttilisé dans un os-maison
Hello
j'ai retrouvé mes docs Vga et c'est effectivement le Crtc, & le Dac pour gerer la palette.
Je ne doute pas que ton code fonctionne (aux vues de mortimer ;-)) c'est juste que je veut toujours savoir comment ca marche plutot que de copier coller bêtement sans comprendre.
Voyons voir si j'ai bien compri : pour acceder au crtc
=> index = 3d4h
=> donnees = 3d5h
la fonction 0eh => octet poid fort de la position du curseur et 0fh => partie basse. On utilise dx car le n° de port est >256 et on envoie les 2 bytes respectifs vers le port pour deplacer le curseur.
J'ai (encore) une petite question : les fonctions 0eh & 0fh requierent-elle de désactiver le bit 7 du reg 11h du Crtc (bit de protection) et si oui pourquoi ? Quel est le risque ?
MErci & vivement ce weekend que je puisse coder tout ca.
@+ & bonne prog
Hello
ca marche nickel merci !!
J'avais juste un bug mais c'etait pour l'adresse du curseur dans bx.
J'avais mal compri ton "num caractere" je pensais au depart que c'etait l'ascii
du curseur mais comme je ne trouvai pas dans ma doc je l'ai remplacé par
(numero de ligne desiré*nb de colonnes du mode txt)+colonne désirée
et c'est ok.
Juste une petite question : on passe toujours par al pour envoyer sur un port ?
bofur
Messages postés39Date d'inscriptionlundi 13 novembre 2000StatutMembreDernière intervention 5 juin 2009 20 mai 2009 à 20:55
j'aurait du dire position du curseur au lieu de adresse
on peut aussi de servir de ax pour envoyer des données aux ports, mais dans ce cas le processeur envoie d'abord al puis ah car on a toujour que des port de 8bit
y'a d'autre instriction comme par exemple "mul" qui font automatiquement les opération avec ax (ou dx:ax ou edx:eax et dans ces cas ci les LSB sont dans ax et les MSB sont dans dx)
BLUEBIBUBBLE
Messages postés116Date d'inscriptionsamedi 4 juin 2005StatutMembreDernière intervention10 avril 20131 5 juin 2009 à 22:36
Hi !
Si tu est en mode texte sous MS-DOS, écrit directement dans la mémoire vidéo (Seg: 0B800h en mode texte, 0A000h en mode graphique).
En mode texte, chaques caractères prend 2 octets (1 pour le code ASCII du caractère et 1 pour la couleur(fore/front/clignotement), mais je ne me souvient plus dans quel ordre! Fais des essais!)
Pour la position du curseur (si 80 colonnes=160 octets par lignes), calcul l'offset avec un truc du genre : y*160+x*2