probleme d'affichage de caracteres

probleme d'affichage de caracteres - C - Programmation

Marsh Posté le 24-10-2006 à 15:43:27    

slt tlm, j'ai une fonction pour afficher une caractere mais elle ne semble pas se comporter comme je le souhaite.

Code :
  1. void car(char caractere)
  2. {
  3. unsigned char* ptr=(unsigned char*)0xB8000;
  4. char temps;
  5. temps = caractere;
  6. if(temps=='\n')
  7. {
  8.  positionX=0;
  9.  positionY++;
  10. }
  11.  else{
  12.   ptr[positionX*2+positionY*160+1]=BLANC;
  13.   ptr[positionX*2+positionY*160]=temps;
  14.   positionX++;
  15.   if(positionX==80)
  16.   {
  17.    positionY++;
  18.    positionX=0;
  19.   }
  20.  }
  21.  if(positionY>=25)
  22.   scrollup();
  23. }


 
si je fais un car('t');
ca marche pas de probleme
par contre

Code :
  1. int i=0;
  2. char text[]="hello world";
  3. for (i=0;i!=11;i++)
  4. car(text[i]);


la ca plante... je comprends pas pourquoi...


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 24-10-2006 à 15:43:27   

Reply

Marsh Posté le 24-10-2006 à 16:35:12    

carot0 a écrit :


par contre

Code :
  1. int i=0;
  2. char text[]="hello world";
  3. for (i=0;i!=11;i++)
  4. car(text[i]);


la ca plante... je comprends pas pourquoi...


 

Code :
  1. int i=0;
  2. char text[]="hello world";
  3. for (i=0;i<strlen(text);i++)
  4.    car(text[i]);


 
Le 0 finit une chaine de caractères en C.


---------------
Töp of the plöp
Reply

Marsh Posté le 24-10-2006 à 17:08:41    

_darkalt3_ a écrit :

Code :
  1. int i=0;
  2. char text[]="hello world";
  3. for (i=0;i<strlen(text);i++)
  4.    car(text[i]);


 
Le 0 finit une chaine de caractères en C.


oui et ... dans text il y est bien!
meme si il etait pas le for devrait quand meme afficher "hello world" avec d'autre truc derriere


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 24-10-2006 à 17:11:52    

Ca plante comment dans ce cas ?


---------------
Töp of the plöp
Reply

Marsh Posté le 24-10-2006 à 17:19:54    

_darkalt3_ a écrit :

Ca plante comment dans ce cas ?


ca fige et je commence a trouver des idées de reponse :  

Code :
  1. if(positionX==80)
  2.             {
  3. positionX=0;
  4.                 positionY++;}


cette condition pose probleme, le texte ne s'affiche pas quand elle est activé ( un caractere ca passe pas mais pas plusieurs....)
si j'enleve le positionX=0; tout marche bien ( mais je dois le mettre a 0 ! )


Message édité par carot0 le 24-10-2006 à 17:23:25

---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 24-10-2006 à 19:07:00    

carot0 a écrit :

Code :
  1. void car(char caractere)
  2. {
  3. unsigned char* ptr=(unsigned char*)0xB8000;




Y'avait longtemp que je n'avais pas vu ce genre de code... Tu es sous DOS ?

Message cité 1 fois
Message édité par Emmanuel Delahaye le 24-10-2006 à 19:07:34

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 24-10-2006 à 22:01:25    

Emmanuel Delahaye a écrit :

Y'avait longtemp que je n'avais pas vu ce genre de code... Tu es sous DOS ?


encore mieux : je code mon propre kernel ( le mot est fort mais decrit bien la situation  :sol: )


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 24-10-2006 à 23:04:34    

carot0 a écrit :

encore mieux : je code mon propre kernel ( le mot est fort mais decrit bien la situation  :sol: )


OK. Tu es donc en mode réel, c'est ça ? Les adresses physiques et logiques sont les mêmes, pas de MMU. On est d'accord ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 25-10-2006 à 09:17:28    

Emmanuel Delahaye a écrit :

OK. Tu es donc en mode réel, c'est ça ? Les adresses physiques et logiques sont les mêmes, pas de MMU. On est d'accord ?


je suis passé en mode protégé, j'ai une gdt pour avoir des adresses logique ( et plus un segment et un offset )
les adresse logique et physique ne doivent pas etre les meme car je n'ai pas mis en place la pagination
je ne doit pas avoir de MMU ( vu que j'ai rien codé a ce sujet la ).


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 25-10-2006 à 10:52:45    

carot0 a écrit :

je suis passé en mode protégé, j'ai une gdt pour avoir des adresses logique ( et plus un segment et un offset )
les adresse logique et physique ne doivent pas etre les meme car je n'ai pas mis en place la pagination
je ne doit pas avoir de MMU ( vu que j'ai rien codé a ce sujet la ).


Et en mode protégé, un pointeur initialisé en dur comme

Code :
  1. unsigned char* ptr=(unsigned char*)0xB8000;


ça a un sens ?
 
 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 25-10-2006 à 10:52:45   

Reply

Marsh Posté le 25-10-2006 à 11:25:39    

Emmanuel Delahaye a écrit :

Et en mode protégé, un pointeur initialisé en dur comme

Code :
  1. unsigned char* ptr=(unsigned char*)0xB8000;


ça a un sens ?


oui c'est l'adresse de la mémoire video pour le mode console 80x25.


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 25-10-2006 à 13:07:58    

carot0 a écrit :

oui c'est l'adresse de la mémoire video pour le mode console 80x25.


Oui, on sait bien, en mode réel. Mais en mode protégé ? Ca correspond à la même adresse physique ? Y'a pas une histoire de GDT justement ?
 
Et quid du mode noyau ou utilisateur. Tu autorises un utilisateur à bricoler dans la mémoire video ? C'est pas plutôt des drivers en mode noyau qui font ça ?
 
Est-ce qu'il ne faut pas écrire une fonction système utilisable uniquement en mode noyau, et qui retournerait l'adresse logique d'une adresse physique (il y a un truc comme ça sous Linux), genre :

Code :
  1. void *k_logical_address (unsigned long physical_address);
  2. char *p_video = k_logical_address (0xB000);


Je me pose des questions, c'est tout. Comme tu es en train d'écrire un noyau d'OS, ça peut avoir son importance...

Message cité 1 fois
Message édité par Emmanuel Delahaye le 25-10-2006 à 14:17:35

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 25-10-2006 à 13:54:45    

Emmanuel Delahaye a écrit :

Oui, on sait bien, en mode réel. Mais en mode protégé ? Ca correspond à la même adresse physique ? Y'a pas une histoire de GDT justement ?
 
Et quid du mode noyau ou utilisateur. Tu autorises un utilisateur à bricoler dans la mémoire video ? C'est pas plutôt des drivers en mode noyau qui font ça ?
 
Est-ce qu'il ne faut pas écrire une fonction système utilisable uniquement en mode noyau, et qui retournerait l'adresse logique d'une adresse physique (il y a un truc comme ça sous Linux), genre :

Code :
  1. void *k_logical_address (unsigned long physical_address);
  2. char *p_video = get_logical_address (0xB000);


Je me pose des questions, c'est tout. Comme tu es en train d'écrire un noyau d'OS, ça peut avoir son importance...


 
la j'en suis justement au drivers de la console. en mode protégé cest bien cette adresse la.
une gdt est bien presente pour transformer les segment + offset en adresse logique ( pour les adresse physique ca doit etre lier a la pagination dont je ne me suis pas encore occupé! )


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed