My Project
Chargement...
Recherche...
Aucune correspondance
console.c
Aller à la documentation de ce fichier.
1
13#include "manux/ascii.h"
14#include "manux/ecran.h"
15#include <manux/console.h>
16
17#include <manux/errno.h>
18#include <manux/io.h>
19#include <manux/appelsysteme.h>
20#include <manux/memoire.h> // NULL
21#include <manux/string.h> // memcpy
22#include <manux/debug.h> // assert
23#include <manux/temps.h>
24#ifdef MANUX_KMALLOC
25# include <manux/kmalloc.h>
26#endif
27
28/*
29 * La console du noyau est celle "par défaut", sur laquelle seront
30 * envoyés en particulier les messages du noyau (ceux affichés par
31 * printk).
32 */
33static Console _consoleNoyau;
34
35#ifdef MANUX_CONSOLES_VIRTUELLES
36
40static int nombreDeConsoles = 0;
41
47Console * consoleActive;
48
54static char copieEcranConsoleNoyau[2*MANUX_CON_COLONNES*MANUX_CON_LIGNES];
55#endif // MANUX_CONSOLES_VIRTUELLES
56
61#ifdef MANUX_CLAVIER_CONSOLE
69static char bufferClavierNoyau[4096];
70
71#endif // MANUX_CLAVIER_CONSOLE
72
74{
75 cons->attribut = (cons->attribut & 0x0F)|(coul);
76}
77
79{
80 cons->attribut = (cons->attribut & 0xF0)|(coul);
81}
82
84{
85 int l, c;
86
87 for (l = 0; l < cons->nbLignes; l++) {
88 for (c = 0; c < cons->nbColonnes; c++) {
89 cons->adresseEcran[2*(l*cons->nbColonnes+c)] = ' ';
90 cons->adresseEcran[2*(l*cons->nbColonnes+c)+1] = cons->attribut;
91 }
92 }
93 cons->ligne = 0;
94 cons->colonne = 0;
95}
96
97static void scrollUp(Console * cons)
98/*
99 * Remonté de l'écran d'une ligne
100 */
101{
102 int c;
103
104 /* Remontée du contenu de l'écran */
105 memcpy(cons->adresseEcran,
106 cons->adresseEcran+2*cons->nbColonnes,
107 2*((cons->nbLignes-1)*cons->nbColonnes));
108
109 /* On place une ligne d'espaces en bas de l'écran */
110 for (c = 0; c < cons->nbColonnes; c++) {
111 cons->adresseEcran[2*((cons->nbLignes-1)*cons->nbColonnes+c)] = ' ';
112 cons->adresseEcran[2*((cons->nbLignes-1)*cons->nbColonnes+c)+1] = cons->attribut;
113 }
114}
115
116static void avancerLigne(Console * cons)
117{
118 assert(cons->nbLignes != 0);
119
120 cons->ligne++;
121 if (!(cons->ligne % cons->nbLignes)) {
122 cons->ligne = cons->nbLignes - 1;
123 scrollUp(cons);
124 }
125}
126
127/*
128 * L'attribut est là pour maintenir la compilation même sans
129 * optimisation (donc pour le debogage)
130 */
131static
132inline
133 __attribute__((always_inline))
134void consoleAfficherCaractere(Console * cons, char c)
135{
136 cons->adresseEcran[(cons->nbColonnes*cons->ligne+cons->colonne)*2] = c;
137 cons->adresseEcran[(cons->nbColonnes*cons->ligne+cons->colonne)*2+1] = cons->attribut;
138 cons->colonne++;
139
140 // On avance d'un caratère
141 assert(cons->nbColonnes != 0);
142 if (!(cons->colonne % cons->nbColonnes)) {
143 cons->colonne = 0;
144 avancerLigne(cons);
145 }
146}
147
148#define MIN(a, b) (((a)<(b))?(a):(b))
149#define MAX(a, b) (((a)>(b))?(a):(b))
150
158static void consoleSelectGraphicRendition(Console * cons, int m)
159{
160 switch (m) {
161 case 0 :
162 // WARNING utiliser la macro de défaut
165 break;
166 case 30 :
168 break;
169 case 31 :
171 break;
172 case 32 :
174 break;
175 case 33 :
177 break;
178 case 34 :
180 break;
181 case 35 :
183 break;
184 case 36 :
186 break;
187 case 37 :
189 break;
190 case 90 :
192 break;
193 case 91 :
195 break;
196 case 92 :
198 break;
199 case 93 :
201 break;
202 case 94 :
204 break;
205 case 95 :
207 break;
208 case 96 :
210 break;
211 case 97 :
213 break;
214
215 case 40 :
217 break;
218 case 41 :
220 break;
221 case 42 :
223 break;
224 case 43 :
226 break;
227 case 44 :
229 break;
230 case 45 :
232 break;
233 case 46 :
235 break;
236 case 47 :
238 break;
239 case 100 :
241 break;
242 case 101 :
244 break;
245 case 102 :
247 break;
248 case 103 :
250 break;
251 case 104 :
253 break;
254 case 105 :
256 break;
257 case 106 :
259 break;
260 case 107 :
262 break;
263
264 default:
265 break;
266 }
267}
268
277static void consoleTraiterAEC_CSI(Console * cons, int n, int m, char c)
278{
279 switch (c) {
280 case 'F' : // CPL : Cursor beginning of n(=1) lines up
281 cons->colonne = 0;
282 [[fallthrough]];
283 case 'A' : // CUU : Cursor up n (default n=1) cell
284 n = n?n:1;
285 cons->ligne = MAX(cons->ligne - n, 0);
286 break;
287 case 'E' : // CNL : Cursor beginning of n(=1) lines down
288 cons->colonne = 0;
289 [[fallthrough]];
290 case 'B' : // CUD : Cursor down n (default n=1) cell
291 n = n?n:1;
292 cons->ligne = MIN(cons->ligne + n, cons->nbLignes);
293 break;
294 case 'C' : // CUF : Cursor forward n (default n=1) cell
295 n = n?n:1;
296 cons->colonne = MIN(cons->colonne + n, cons->nbColonnes);
297 break;
298 case 'D' : // CUB : Cursor back n (default n=1) cell
299 n = n?n:1;
300 cons->colonne = MAX(cons->colonne - n, 0);
301 break;
302 case 'G' : // CHA: Cursor horizontal absolute n (default n=1)
303 n = n?n:1;
304 cons->colonne = MIN(cons->nbColonnes, n);
305 break;
306 case 'H' : // CUP: Cursor position n, m (default 1)
307 n = n?n:1 - 1; // Ca commence à 1 mais moi à 0
308 m = m?m:1 - 1;
309 cons->ligne = MIN(cons->nbLignes, n);
310 cons->colonne = MIN(cons->nbColonnes, m);
311 break;
312 case 'J' : // ED : Erase in Display
313 if (n == 0) {
314 // On efface tout à partir du curseur
315 } else if (n == 1) {
316 // On efface tout jusqu'au curseur
317 } else if (n == 2) {
318 consoleEffacer(cons);
319 }
320 break;
321 case 'm' : // SGR : Select Graphic Rendition
322 consoleSelectGraphicRendition(cons, n);
323 break;
324 }
325}
326
338static int consoleGererAEC(Console * cons, char * msg, int nbOctets)
339{
340 int a=0, b=0; //< Il peut y avoir deux coefficients
341 char c; //< Le code lui-même
342 int r = 0; //< Le nombre d'octets consommés
343
344 // On teste et on consomme l'ASCII_ESC
345 if (msg[r] != ASCII_ESC) {
346 goto fin;
347 }
348 r++;
349 if (r >= nbOctets){
350 goto fin;
351 }
352 // Pour le moment on ne gère que les CSI
353 if (msg[r] != '[') {
354 goto fin;
355 }
356 r++;
357
358 // Lecture du premier coefficient
359 while ((r < nbOctets)&&(msg[r] >= ASCII_0)&&(msg[r] <= ASCII_9)) {
360 a = 10*a + msg[r] - ASCII_0;
361 r++;
362 }
363 if (r >= nbOctets){
364 goto fin;
365 }
366 if (msg[r] == ASCII_SEMICOLON) {
367 r++;
368 }
369 if (r >= nbOctets){
370 goto fin;
371 }
372 // Lecture du second coefficient
373 while ((r < nbOctets)&&(msg[r] >= ASCII_0)&&(msg[r] <= ASCII_9)) {
374 b = 10*b + msg[r] - ASCII_0;
375 r++;
376 }
377 if (r >= nbOctets){
378 goto fin;
379 }
380 // On lit enfin le code lui-même
381 c = msg[r];
382
383 // On peut maintenant appliquer le code
384 consoleTraiterAEC_CSI(cons, a, b, c);
385
386 // On termine en donnant le nombre d'octets consommés
387 fin :
388 return r;
389}
390
391void consoleAfficherN(Console * cons, char * msg, int nbOctets)
392{
393 int r;
394
395 assert(nbOctets > 0);
396
397#ifdef MANUX_CONSOLE_AVEC_MUTEX
398 exclusionMutuelleEntrer(&cons->scAcces);
399#endif
400
401 assert(cons->nbColonnes != 0);
402
403 while (nbOctets) {
404 switch (*msg) {
405 case ASCII_LINE_FEED : // '\n'
406 avancerLigne(cons);
407 [[fallthrough]];
408 case ASCII_CARRIAGE_RETURN : // '\r'
409 cons->colonne = 0;
410 break;
411 case ASCII_ESC :
412 r = consoleGererAEC(cons, msg, nbOctets);
413 msg += r;
414 nbOctets -= r;
415 break;
416 default :
417 consoleAfficherCaractere(cons, *msg);
418 break;
419 }
420 msg++;nbOctets--;
421 }
422#ifdef MANUX_CONSOLE_AVEC_MUTEX
423 exclusionMutuelleSortir(&cons->scAcces);
424#endif
425}
426
427void consoleAfficher(Console * cons, char * msg)
428{
429 int n = 0;
430 while (msg[n])n++;
431 consoleAfficherN(cons, msg, n);
432}
433
437void consoleNoyauAfficher(char * msg)
438{
439 consoleAfficher(&_consoleNoyau, msg);
440}
441
443{
444 char nombre[12];
445 int i = 0;
446
447 do {
448 nombre[i] = n%10 + '0';
449 n = n / 10;
450 i++;
451 } while (n);
452 for (i--; i>=0; i--) {
453 assert(cons->nbColonnes != 0);
454 consoleAfficherCaractere(cons, nombre[i]);
455 }
456}
457
458#ifdef MANUX_CLAVIER_CONSOLE
459static void consoleSetClavier(Console * cons, void * buffer)
460{
461 // Le buffer accueillant le clavier
462 cons->tailleBuffer = 4096; // WARNING !!
463 cons->bufferClavier = buffer;
464 cons->nbCarAttente = 0;
465 cons->indiceProchainCar = 0;
466}
467#endif
468
474static void consoleInitialiser(Console * cons, char * adresseEcran)
475{
478 cons->adresseEcran = adresseEcran;
479
480#ifdef MANUX_CONSOLES_VIRTUELLES
482 cons->adresseEcranCopie = adresseEcran;
483#endif
484
485 // La configuration de base
486 cons->ligne = 0;
487 cons->colonne = 0;
491
492 /* Initialisation du verrou */
493#ifdef MANUX_CONSOLE_AVEC_MUTEX
494 exclusionMutuelleInitialiser(&cons->scAcces);
495#endif
496
497 // Un peu de ménage
498 consoleEffacer(cons);
499
500#ifdef MANUX_CONSOLES_VIRTUELLES
501 // On l'insère après la console active dans la liste des consoles gérées
502 cons->suivante = consoleActive->suivante;
503 consoleActive->suivante = cons;
504 cons->precedente = consoleActive;
505 cons->suivante->precedente = cons;
506 cons->numero = nombreDeConsoles++;
507#endif // MANUX_CONSOLES_VIRTUELLES
508#ifdef MANUX_CLAVIER_CONSOLE
509 consoleSetClavier(cons, NULL);
510#endif // MANUX_CLAVIER_CONSOLE
511}
512
513#ifdef MANUX_CONSOLES_VIRTUELLES
517Console * creerConsoleVirtuelle(void)
518{
519 Console * result;
520 void * page;
521
525 page = allouerPage();
526 if (page == NULL) {
527 paniqueNoyau("Plus de memoire !");
528 }
529
530 result = (Console *)page;
531
533 consoleInitialiser(result, page + sizeof(Console));
534
535#ifdef MANUX_CLAVIER_CONSOLE
536 consoleSetClavier(result, allouerPage());
537#endif // MANUX_CLAVIER_CONSOLE
538
539#ifdef MANUX_BASCULER_NOUVELLE_CONSOLE
540 basculerVersConsole(result);
541#endif // MANUX_BASCULER_NOUVELLE_CONSOLE
542
543 return result;
544}
545
546static void consoleAfficherEntierHex(Console * cons, int nbOctets, uint32_t reg)
547{
548 char chiffre[17] = "0123456789abcdef";
549 char nombre[2*nbOctets+2];
550 int i = 0;
551
552 for (i = 0; i<2*nbOctets; i++) {
553 nombre[i] = chiffre[reg%16];
554 reg = reg / 16;
555 };
556 nombre[i++] = 'x';
557 nombre[i] = '0';
558 for (; i>=0; i--) {
559 assert(cons->nbColonnes != 0);
560 consoleAfficherCaractere(cons, nombre[i]);
561 }
562}
563
564
565/*
566 * Basculer vers une console virtuelle. Attention, elle doit exister.
567 */
568void basculerVersConsole(Console * suivante)
569{
570 int i, l, c, a;
571
572 assert(consoleActive != NULL);
573
574 if (suivante == consoleActive)
575 return;
576
577 assert(suivante != NULL);
578
579 // On sauvegarde l'écran physique dans la console active
580 for (i=0; i < MANUX_CON_LIGNES*MANUX_CON_COLONNES*2; i++) { // WARNING utiliser bcopy
581 consoleActive->adresseEcranCopie[i] = consoleActive->adresseEcran[i];
582 }
583
584 // On la désactive (à partir de maintenant, ce qui y est écrit
585 // n'est plus visible à l'écran)
586 consoleActive->adresseEcran = consoleActive->adresseEcranCopie;
587
588 // On passe à la nouvelle CV
589 consoleActive = suivante;
590
591#ifdef MANUX_CONSOLE_AVEC_MUTEX
592 exclusionMutuelleEntrer(&consolesVirtuelles[consoleCourante]->scAcces);
593#endif
594
595 // On l'active (à partir de maintenant, ce qui y est écrit apparaît
596 // directement à l'écran).
597 consoleActive->adresseEcran = MANUX_CON_SCREEN;
598
599 // On copie son état actuel sur l'écran
600 for (i=0; i < MANUX_CON_LIGNES*MANUX_CON_COLONNES*2; i++) { // WARNING utiliser bopy
601 consoleActive->adresseEcran[i] = consoleActive->adresseEcranCopie[i];
602 }
603
604 /* On affiche un bandeau d'info en haut */
605 l = consoleActive->ligne;
606 c = consoleActive->colonne;
607 a = consoleActive->attribut;
608 consoleActive->ligne = 0;
609 consoleActive->colonne = 55;
610
611 consoleActive->attribut = 0x1B;
612 consoleAfficher(consoleActive, "Cons ");
613 consoleAfficherEntierHex(consoleActive, 4,(uint32_t)consoleActive);
614 consoleAfficher(consoleActive, " t= ");
616 consoleAfficher(consoleActive, ":");
618 consoleAfficher(consoleActive, " ");
619
620 consoleActive->ligne = l;
621 consoleActive->colonne = c;
622 consoleActive->attribut = a;
623
624#ifdef MANUX_CONSOLE_AVEC_MUTEX
625 exclusionMutuelleSortir(&consoleActive->scAcces);
626#endif
627}
628
629/*
630 * Basculer vers la console suivante
631 */
632void basculerVersConsoleSuivante(void)
633{
634 assert(consoleActive != NULL);
635
636 basculerVersConsole(consoleActive->suivante);
637}
638
639#endif // CONSOLES_VIRTUELLES
640
641#ifdef MANUX_CLAVIER_CONSOLE
642#define min(a, b) (((a)<(b)) ? (a) : (b))
643
647int consoleLire(Console * cons, void * buffer, int nbOctets)
648{
649 // On ne peut pas en lire plus qu'il y en a !
650 uint16_t nb = min(nbOctets, cons->nbCarAttente);
651 uint16_t lu = 0; // Le cumul des lectures
652 uint16_t aLire; // Combien on en lit à chaque passage
653
654 while (lu < nb) {
655 // On lit sur la "fin" du tableau circulaire
656 aLire = min(nb-lu, 4096 - cons->indiceProchainCar);
657 memcpy(buffer+lu,
658 cons->bufferClavier+cons->indiceProchainCar,
659 aLire);
660 // On décompte cette lecture du buffer
661 cons->indiceProchainCar = (cons->indiceProchainCar + aLire); // WARNING FAUX !
662 cons->nbCarAttente = cons->nbCarAttente - aLire;
663
664 lu = lu + aLire;
665 }
666
667 return lu;
668}
669
676#define EST_CHIFFRE_DEC(x) ((x>= '0') && (x<= '9'))
677#define EST_CHIFFRE_HEX(x) (((x>= '0') && (x<= '9')) ||((x>= 'a') && (x<= 'f')))
678
679int consoleLireEntier(Console * cons)
680{
681 int result = 0;
682
683 do {
684 // On attend qu'il y ai qqchose
685 while (cons->nbCarAttente == 0)
686 ordonnanceur();
687
688 // On lit tant qu'il y a des chiffres et on arrête quand il y a
689 // autre chose
690 while ((cons->nbCarAttente)
691 && (EST_CHIFFRE_HEX(cons->bufferClavier[cons->indiceProchainCar]))
692 ) {
693 if (EST_CHIFFRE_DEC(cons->bufferClavier[cons->indiceProchainCar])) {
694 result = 16 * result + cons->bufferClavier[cons->indiceProchainCar] - '0';
695 } else {
696 result = 16 * result + cons->bufferClavier[cons->indiceProchainCar] - 'a' + 10;
697 }
698 cons->nbCarAttente--;
699 cons->indiceProchainCar++; // WARNING modulo taille !!!
700 }
701 } while ((cons->nbCarAttente == 0)
702 ||(EST_CHIFFRE_HEX(cons->bufferClavier[cons->indiceProchainCar])));
703 // On supprime le caractère qui nous a fait finir (WARNING !!)
704 if (cons->nbCarAttente) {
705 cons->nbCarAttente--;
706 cons->indiceProchainCar++; // WARNING modulo taille !!!
707 }
708 return result;
709}
710
717[[maybe_unused]] // Juste affectée
718static size_t consoleFichierLire(Fichier * f, void * buffer, size_t nbOctets)
719{
720 Console * con = f->iNoeud->prive;
721
722 return consoleLire(con, buffer, nbOctets);
723}
724#else // MANUX_CLAVIER_CONSOLE
728[[maybe_unused]] // Juste affectée
729static size_t consoleFichierLire(Fichier * f, void * buffer, size_t nbOctets)
730{
731 (void) f;
732 (void) buffer;
733 (void) nbOctets;
734
735 return 0;
736}
737#endif // MANUX_CLAVIER_CONSOLE
738
739#ifdef MANUX_FICHIER
746static int consoleOuvrir(INoeud * iNoeud, Fichier * f, uint16_t fanions, uint16_t mode)
747{
748 (void) iNoeud;
749 (void) f;
750 (void) fanions;
751 (void) mode;
752
753 return ESUCCES;
754}
755
759size_t consoleEcrire(Fichier * f, void * buffer, size_t nbOctets)
760{
761 Console * con = f->iNoeud->prive;
762
763 consoleAfficherN(con, buffer, nbOctets);
764
765 return nbOctets; // WARNING
766}
767
772MethodesFichier consoleMethodesFichier = {
773 .ouvrir = consoleOuvrir,
774 .ecrire = consoleEcrire,
775 .lire = consoleFichierLire
776};
777#endif // MANUX_FICHIER
778
783static void initialiserConsoleNoyau(void)
784{
786 consoleInitialiser(&_consoleNoyau, MANUX_CON_SCREEN);
787
788#ifdef MANUX_CLAVIER_CONSOLE
789 consoleSetClavier(&_consoleNoyau, bufferClavierNoyau);
790#endif
791
792#ifdef MANUX_CONSOLES_VIRTUELLES
795 _consoleNoyau.adresseEcranCopie = copieEcranConsoleNoyau;
796
799 consoleActive = &_consoleNoyau;
800 consoleActive->suivante = consoleActive;
801 consoleActive->precedente = consoleActive;
802#endif
803}
804
809{
810 return &_consoleNoyau;
811}
812
813#ifdef MANUX_FICHIER
814
815static void consoleInitialiserINoeud(INoeud * i, Console * c)
816{
818#ifdef MANUX_CONSOLES_VIRTUELLES
819 i->typePeripherique.mineur = c->numero;
820#else
822#endif
823
824 i->prive = c;
825 i->methodesFichier = &consoleMethodesFichier;
826}
827
833int consoleInitialisationINoeud(INoeud * iNoeudConsole)
834{
837
839 consoleInitialiserINoeud(iNoeudConsole, &_consoleNoyau);
840
841 return ESUCCES;
842}
843
844# ifdef MANUX_KMALLOC
850INoeud * consoleCreerINoeud(Console * c)
851{
852 INoeud * result;
853
854 result = kmalloc(sizeof(INoeud));
855
856 if (result) {
858 consoleInitialiserINoeud(result, c);
859 }
860
861 return result;
862}
863# endif // MANUX_KMALLOC
864#endif
865
870{
871 initialiserConsoleNoyau();
872
873 // On invalide le curseur du BIOS
874 outb(0x3D4, 0x0A);
875 outb(0x3D5, 0x20);
876
877 return ESUCCES;
878}
879
880#ifdef MANUX_APPELS_SYSTEME
881/*
882 * L'implantation de l'AS ecrireConsole
883 */
884int sys_ecrireConsole(ParametreAS as, void * msg, int n)
885{
886 (void) as; // Juste pour ne pas écraser les paramètres
887
891#if defined(MANUX_TACHES) && defined(MANUX_TACHE_CONSOLE)
893 Console * cons = tacheEnCours->console;
894#else
895 Console * cons = &_consoleNoyau;
896#endif
897
898 assert(cons != NULL);
899 consoleAfficherN(cons, msg, n);
900
901 return n;
902}
903#endif // MANUX_APPELS_SYSTEMES
Définition des codes ASCII (C) Manu Chaput 2026-2026.
#define ASCII_SEMICOLON
Definition ascii.h:21
#define ASCII_9
Definition ascii.h:16
#define ASCII_0
Definition ascii.h:15
#define ASCII_LINE_FEED
Definition ascii.h:13
#define ASCII_CARRIAGE_RETURN
Definition ascii.h:14
#define ASCII_ESC
Definition ascii.h:12
void consoleAfficher(Console *cons, char *msg)
Affichage d'un message sur une console.
Definition console.c:427
int consoleInitialisation(void)
Initialisation du système de console.
Definition console.c:869
void consoleAffecterCouleurTexte(Console *cons, Couleur coul)
Definition console.c:78
#define MIN(a, b)
Definition console.c:148
void consoleEffacer(Console *cons)
Definition console.c:83
void consoleAfficherEntier(Console *cons, int n)
Definition console.c:442
void consoleAffecterCouleurFond(Console *cons, Couleur coul)
Si on gère le clavier, on prévoie une zone mémoire pour celui du noyau (qui est le seule si pas de co...
Definition console.c:73
Console * consoleNoyau(void)
Obtention d'un pointeur sur la console par défaut.
Definition console.c:808
void consoleAfficherN(Console *cons, char *msg, int nbOctets)
Definition console.c:391
void consoleNoyauAfficher(char *msg)
Affichage d'un message sur la console noyau.
Definition console.c:437
#define MAX(a, b)
Definition console.c:149
Définition des caractéristiques de base de l'écran.
#define MANUX_CON_COLONNES
Definition ecran.h:28
#define MANUX_CON_LIGNES
Definition ecran.h:29
Couleur
Définition des couleurs utilisables pour l'affichage.
Definition ecran.h:36
@ COUL_FOND_BLEU_CLAIR
Definition ecran.h:62
@ COUL_TXT_BLEU_CLAIR
Definition ecran.h:46
@ COUL_FOND_BLANC
Definition ecran.h:68
@ COUL_TXT_MAGENTA_CLAIR
Definition ecran.h:50
@ COUL_FOND_BLEU
Definition ecran.h:54
@ COUL_TXT_JAUNE
Definition ecran.h:51
@ COUL_TXT_NOIR
Definition ecran.h:37
@ COUL_FOND_CYAN_CLAIR
Definition ecran.h:64
@ COUL_TXT_CYAN_CLAIR
Definition ecran.h:48
@ COUL_FOND_MAGENTA
Definition ecran.h:58
@ COUL_FOND_CYAN
Definition ecran.h:56
@ COUL_FOND_JAUNE
Definition ecran.h:67
@ COUL_FOND_GRIS
Definition ecran.h:61
@ COUL_FOND_VERT
Definition ecran.h:55
@ COUL_TXT_BLANC
Definition ecran.h:52
@ COUL_FOND_MAGENTA_CLAIR
Definition ecran.h:66
@ COUL_FOND_ROUGE
Definition ecran.h:57
@ COUL_TXT_MAGENTA
Definition ecran.h:42
@ COUL_TXT_BLEU
Definition ecran.h:38
@ COUL_TXT_VERT
Definition ecran.h:39
@ COUL_TXT_GRIS
Definition ecran.h:45
@ COUL_TXT_ROUGE_CLAIR
Definition ecran.h:49
@ COUL_TXT_ROUGE
Definition ecran.h:41
@ COUL_TXT_GRIS_CLAIR
Definition ecran.h:44
@ COUL_FOND_NOIR
Definition ecran.h:53
@ COUL_FOND_VERT_CLAIR
Definition ecran.h:63
@ COUL_TXT_VERT_CLAIR
Definition ecran.h:47
@ COUL_FOND_ROUGE_CLAIR
Definition ecran.h:65
@ COUL_TXT_CYAN
Definition ecran.h:40
#define MANUX_CON_SCREEN
Definition ecran.h:27
void exclusionMutuelleEntrer(ExclusionMutuelle *em)
Entrée en exclusion mutuelle.
void exclusionMutuelleInitialiser(ExclusionMutuelle *em)
Initialisation d'une exclusion mutuelle.
void exclusionMutuelleSortir(ExclusionMutuelle *em)
#define MANUX_TAILLE_PAGE
Temps nbTopHorloge
Definition horloge.c:22
#define MANUX_COULEUR_TEXTE
Couleur de texte par défaut.
Definition console.h:9
#define MANUX_COULEUR_FOND
Couleur de fond par défaut.
Definition console.h:14
#define MANUX_CONSOLE_MAJEUR
Definition console.h:19
Définition des fonctions de base d'accés à la console.
size_t consoleEcrire(Fichier *f, void *buffer, size_t nbOctets)
#define ESUCCES
Definition errno.h:10
typedef void(Handler(void))
Définition de kmalloc.
void * allouerPage(void)
Definition memoire.c:234
#define NULL
Definition stddef.h:10
void * memcpy(void *dest, const void *src, size_t n)
Definition string.c:12
unsigned long uint32_t
Definition types.h:20
unsigned short uint16_t
Definition types.h:16
#define outb(port, octet)
Emission d'un octet sur un port.
Definition io.h:13
void * kmalloc(size_t n)
Allocation d'une zone de n octets.
Definition kmalloc-zs.c:139
INoeud iNoeudConsole
uint16_t b
uint16_t a
Exemple de fonction de mise-à-jour d'un paramètre dans un registre.
uint16_t c
#define assert(cond)
Definition debug.h:126
#define paniqueNoyau(fmt, args...)
Definition debug.h:107
#define chiffre
Definition printk.c:24
Tache * tacheEnCours
: L'identification de la tâche en cours
Definition scheduler.c:91
void ordonnanceur(void)
Basculer vers la prochaine tache à exécuter.
Definition scheduler.c:98
struct __attribute__((__packed__))
Definition segment.c:14
Structure d'une console.
Definition console.h:37
uint8_t nbColonnes
Definition console.h:42
char * adresseEcran
Adresse à laquelle se trouve le contenu affiché
Definition console.h:39
unsigned char attribut
Definition console.h:45
uint8_t nbLignes
Caractéristiques de l'écran.
Definition console.h:41
int colonne
Definition console.h:44
int ligne
Position et attribut (couleur, ...) actuels.
Definition console.h:44
: Qu'est-ce qu'un fichier ouvert du point de vue du noyau ?
Definition fichier.h:46
INoeud * iNoeud
Caractérisation de la structure.
Definition fichier.h:48
: Un INoeud représente un fichier, d'un point de vue statique Il s'agit donc de la description d'un f...
Definition inoeud.h:27
TypePeripherique typePeripherique
Definition inoeud.h:28
void * prive
Definition inoeud.h:29
MethodesFichier * methodesFichier
Definition inoeud.h:30
: Définition des opérations réalisables sur un fichier
Definition fichier.h:36
int(* ouvrir)(INoeud *iNoeud, Fichier *f, uint16_t fanions, uint16_t mode)
Definition fichier.h:37
uint16_t mineur
Definition inoeud.h:20
uint16_t majeur
Definition inoeud.h:19
#define totalMinutesDansTemps(t)
Definition temps.h:17
#define secondesDansTemps(t)
Definition temps.h:19
#define min(a, b)
Definition virtio.c:30