Problème d'écriture dans la mémoire vidéo en C
Bonjour,
Voila ça fait quelque temps que j'essaye de crée un OS pour le "fun" on va dire ... Cependant ca fait plus d'une semaine que je suis bloqué sur la ligne de départ car je n'arrive pas à créer une fonction qui écrit dans la mémoire video.
Le C étant mon langage de prédilection je pensais le maitriser ... visiblement c'est pas du tout le cas mdrrr.
Je suis 2 tutos pour la création de l'os : https://michelizza.developpez.com/re...ropre-systeme/ et https://systeme.developpez.com/tutor...eloppement-OS/
Pour en revenir au sujet si je fais en asm :
Code:
1 2 3
|
mov byte [0xB8000], 'H'
mov byte [0xB8000], 0x57 |
pas de soucie, tout ce passe pour le mieux.
Mes problèmes commencent quand je passe au C.
Si je fais :
Code:
1 2 3 4
|
char *tt = (char *)0xB8000;
tt[0] = 'H'
tt[1] = 0x57 |
BOOOM ca fonctionne plus, il m'affiche W (code hexa en ascii : 0x57) et pas H (si j'inverse il m'affiche H mais pas le bon background). Mais si je fais :
Code:
1 2 3 4
|
char *tt = (char *)0xB8000;
tt[1] = 'H'
tt[2] = 0x57 |
et bien ça fonctionne, donc je me suis dit que peut etre qu'il fallait ajouté 1 a l'adresse 0xB8000 (soit 0xB8001)
Mais plus si je fais :
Code:
1 2 3 4
|
char *tt = (char *)0xB8001;
tt[0] = 'H'
tt[1] = 0x57 |
ben ca marche pas.
Du coup j'ai testé d'autres choses :
Code:
1 2 3 4
|
char *tt = (char *)0xB8000;
*tt = 'H';
*(tt + 1) = 0x57; |
ça ne fonctionne pas, mais :
Code:
1 2 3 4 5
|
char *tt = (char *)0xB8000;
*tt = 'H'
++tt;
*tt = 0x57; |
ben ça fonctionne ... mais si je fais une boucle dans ma fonction putcar pour faire le fameux ++tt, ca fonctionne plus non plus.
Du coup j'avoue ne pas tout saisir mais je ne me suis pas découragé et j'ai trouvé une autre méthode avec des short à la place des char ... or les memes problemes apparaissent a peut pres.
Bref du coup ca me décourage car j'ai deja passé des dizaines d'heures et j'ai jamais reussi à passer la ligne de départ ...
Pour le moment ma fonction putcar ressemble à ça (elle ne marche pas et a été modifié au moins 150000000000fois mdrr)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
void putcar(char letter, char style, short *X, short *Y) {
short *video = (short *)0x0B8000;
short index, i, x , y, value;
x = *X, y = *Y;
if (letter == 10) //Retour à la ligne
x = 0, ++y;
else if (letter == 13) //Retour au début de la ligne
x = 0;
else if (letter == 9) //TAB
x = x + 8 - (x % 8);
else { //AUTRE CHAR
index = 80 * y + x;
value = style; //Tout les tutos mettent la lettre ici mais ca n'a jamais fonctionné pour ma par, or mettre le style à ça place a fonctionné une fois ...
value = value << 8;
value |= letter;
for (i = 0; i < index; ++i)
++video;
*(video) = value;
++x;
}
if (x > 79)
x = 0, ++y;
if (y > 24) {
for(index = 0; index < (y - 24); ++index) //C'est pas opti mais j'changerai ca plus tard et de toute facon je ne l'ai pas encore testé
scrollup();//scrollup(Y - 24);
}
*X = x, *Y = y;
} |
cette fonction affiche (a priori) le bon background, au bon endroit mais met toujours le char '?' à la place de la lettre demandé.
(j'aime pas trop les variables globales et meme, avec ou sans variables globales ca n'a rien changé à ce niveau la....)
En terme de Hardware je suis sur une VM kali (avec virtualbox), mon proc est un AMD A9 7th gen, et j'ai 4G de RAM (d'ailleurs je vais passé a 16Giga ... ça aura une influence sur l'os ?). Ah et je suis en mode protégé.
j'ai aussi entendu parlé de char far* sauf que ça pour le coup j'en ai jamais utilisé et il me semble qu'il necessite un include (on peut inclure des librairie pour la création d'un OS ?)
Quelqu'un pourrai-t-il m'aider ou m'expliquer ou bien meme me trouver un cours/tuto/faq/forum qui reponde a cette question s'il vous plait ... parce que je ne sais meme plus quoi tester la ...
PS : Mon but est de crée un OS 64 bit et pas 32, si qq un ce sent de m'expliquer les différences que cela va impliquer il est le bienvenue ... mais bon j'en suis pas encore la.