Deplacer le curseur en mode texte sans les interruptions

Résolu
Utilisateur anonyme - 6 mai 2009 à 19:17
BLUEBIBUBBLE Messages postés 116 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 10 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 ;-)

14 réponses

bofur Messages postés 39 Date d'inscription lundi 13 novembre 2000 Statut Membre Derniè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

G.I.G.O.
3
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
6 mai 2009 à 21:21
T'es sous XP, alors pas question d'interruptions ou de toute autre horreur du même genre.
http://msdn.microsoft.com/en-us/library/ms648394(VS.85).aspx
0
Utilisateur anonyme
7 mai 2009 à 14:47
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 !!

(stp ne repond pas exitcode merci ;-)
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
9 mai 2009 à 18:25
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 !!
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
9 mai 2009 à 18:52
J'ai aussi un 486 DX 4 avec la carte-mère et la carte son.
0
Utilisateur anonyme
11 mai 2009 à 15:03
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 ?


Merci pour tout a+ & bonne prog ;-)
0
Utilisateur anonyme
11 mai 2009 à 15:51
A priori je croit bien que ca n'a rien n'a voir !!
Ne serait-ce pas les ports du crtc ?


@+ et merci d'avance
0
bofur Messages postés 39 Date d'inscription lundi 13 novembre 2000 Statut Membre Derniè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

G.I.G.O.
0
Utilisateur anonyme
13 mai 2009 à 13:24
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
0
bofur Messages postés 39 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 5 juin 2009
13 mai 2009 à 23:35
je dirait que tou a bien été comprit ^_^

pour ce qui est de la protection par le bit 7 du registre 11h,
elle ne concerne que les 8 premiers secteurs donc rien a craindre de ce problème

G.I.G.O.
0
Utilisateur anonyme
19 mai 2009 à 13:37
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 ?

Merci @+ et bonne prog
0
bofur Messages postés 39 Date d'inscription lundi 13 novembre 2000 Statut Membre Derniè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)

G.I.G.O.
0
BLUEBIBUBBLE Messages postés 116 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 10 avril 2013 1
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
0
Rejoignez-nous