17#include <manux/errno.h>
19#include <manux/appelsysteme.h>
21#include <manux/string.h>
35#ifdef MANUX_CONSOLES_VIRTUELLES
40static int nombreDeConsoles = 0;
61#ifdef MANUX_CLAVIER_CONSOLE
69static char bufferClavierNoyau[4096];
87 for (l = 0; l < cons->
nbLignes; l++) {
97static void scrollUp(
Console * cons)
116static void avancerLigne(
Console * cons)
134void consoleAfficherCaractere(
Console * cons,
char c)
148#define MIN(a, b) (((a)<(b))?(a):(b))
149#define MAX(a, b) (((a)>(b))?(a):(b))
158static void consoleSelectGraphicRendition(
Console * cons,
int m)
277static void consoleTraiterAEC_CSI(
Console * cons,
int n,
int m,
char c)
322 consoleSelectGraphicRendition(cons, n);
338static int consoleGererAEC(
Console * cons,
char * msg,
int nbOctets)
359 while ((r < nbOctets)&&(msg[r] >=
ASCII_0)&&(msg[r] <=
ASCII_9)) {
373 while ((r < nbOctets)&&(msg[r] >=
ASCII_0)&&(msg[r] <=
ASCII_9)) {
384 consoleTraiterAEC_CSI(cons,
a,
b,
c);
397#ifdef MANUX_CONSOLE_AVEC_MUTEX
412 r = consoleGererAEC(cons, msg, nbOctets);
417 consoleAfficherCaractere(cons, *msg);
422#ifdef MANUX_CONSOLE_AVEC_MUTEX
448 nombre[i] = n%10 +
'0';
452 for (i--; i>=0; i--) {
454 consoleAfficherCaractere(cons, nombre[i]);
458#ifdef MANUX_CLAVIER_CONSOLE
459static void consoleSetClavier(
Console * cons,
void * buffer)
462 cons->tailleBuffer = 4096;
463 cons->bufferClavier = buffer;
464 cons->nbCarAttente = 0;
465 cons->indiceProchainCar = 0;
474static void consoleInitialiser(
Console * cons,
char * adresseEcran)
480#ifdef MANUX_CONSOLES_VIRTUELLES
482 cons->adresseEcranCopie = adresseEcran;
493#ifdef MANUX_CONSOLE_AVEC_MUTEX
500#ifdef MANUX_CONSOLES_VIRTUELLES
502 cons->suivante = consoleActive->suivante;
503 consoleActive->suivante = cons;
504 cons->precedente = consoleActive;
505 cons->suivante->precedente = cons;
506 cons->numero = nombreDeConsoles++;
508#ifdef MANUX_CLAVIER_CONSOLE
509 consoleSetClavier(cons,
NULL);
513#ifdef MANUX_CONSOLES_VIRTUELLES
517Console * creerConsoleVirtuelle(
void)
533 consoleInitialiser(result, page +
sizeof(
Console));
535#ifdef MANUX_CLAVIER_CONSOLE
539#ifdef MANUX_BASCULER_NOUVELLE_CONSOLE
540 basculerVersConsole(result);
546static void consoleAfficherEntierHex(
Console * cons,
int nbOctets,
uint32_t reg)
548 char chiffre[17] =
"0123456789abcdef";
549 char nombre[2*nbOctets+2];
552 for (i = 0; i<2*nbOctets; i++) {
560 consoleAfficherCaractere(cons, nombre[i]);
568void basculerVersConsole(
Console * suivante)
574 if (suivante == consoleActive)
581 consoleActive->adresseEcranCopie[i] = consoleActive->
adresseEcran[i];
586 consoleActive->
adresseEcran = consoleActive->adresseEcranCopie;
589 consoleActive = suivante;
591#ifdef MANUX_CONSOLE_AVEC_MUTEX
601 consoleActive->
adresseEcran[i] = consoleActive->adresseEcranCopie[i];
605 l = consoleActive->
ligne;
608 consoleActive->
ligne = 0;
613 consoleAfficherEntierHex(consoleActive, 4,(
uint32_t)consoleActive);
620 consoleActive->
ligne = l;
624#ifdef MANUX_CONSOLE_AVEC_MUTEX
632void basculerVersConsoleSuivante(
void)
636 basculerVersConsole(consoleActive->suivante);
641#ifdef MANUX_CLAVIER_CONSOLE
642#define min(a, b) (((a)<(b)) ? (a) : (b))
647int consoleLire(
Console * cons,
void * buffer,
int nbOctets)
656 aLire =
min(nb-lu, 4096 - cons->indiceProchainCar);
658 cons->bufferClavier+cons->indiceProchainCar,
661 cons->indiceProchainCar = (cons->indiceProchainCar + aLire);
662 cons->nbCarAttente = cons->nbCarAttente - aLire;
676#define EST_CHIFFRE_DEC(x) ((x>= '0') && (x<= '9'))
677#define EST_CHIFFRE_HEX(x) (((x>= '0') && (x<= '9')) ||((x>= 'a') && (x<= 'f')))
679int consoleLireEntier(
Console * cons)
685 while (cons->nbCarAttente == 0)
690 while ((cons->nbCarAttente)
691 && (EST_CHIFFRE_HEX(cons->bufferClavier[cons->indiceProchainCar]))
693 if (EST_CHIFFRE_DEC(cons->bufferClavier[cons->indiceProchainCar])) {
694 result = 16 * result + cons->bufferClavier[cons->indiceProchainCar] -
'0';
696 result = 16 * result + cons->bufferClavier[cons->indiceProchainCar] -
'a' + 10;
698 cons->nbCarAttente--;
699 cons->indiceProchainCar++;
701 }
while ((cons->nbCarAttente == 0)
702 ||(EST_CHIFFRE_HEX(cons->bufferClavier[cons->indiceProchainCar])));
704 if (cons->nbCarAttente) {
705 cons->nbCarAttente--;
706 cons->indiceProchainCar++;
718static size_t consoleFichierLire(
Fichier * f,
void * buffer,
size_t nbOctets)
722 return consoleLire(con, buffer, nbOctets);
729static size_t consoleFichierLire(
Fichier * f,
void * buffer,
size_t nbOctets)
775 .lire = consoleFichierLire
783static void initialiserConsoleNoyau(
void)
788#ifdef MANUX_CLAVIER_CONSOLE
789 consoleSetClavier(&_consoleNoyau, bufferClavierNoyau);
792#ifdef MANUX_CONSOLES_VIRTUELLES
795 _consoleNoyau.adresseEcranCopie = copieEcranConsoleNoyau;
799 consoleActive = &_consoleNoyau;
800 consoleActive->suivante = consoleActive;
801 consoleActive->precedente = consoleActive;
810 return &_consoleNoyau;
818#ifdef MANUX_CONSOLES_VIRTUELLES
858 consoleInitialiserINoeud(result,
c);
871 initialiserConsoleNoyau();
880#ifdef MANUX_APPELS_SYSTEME
884int sys_ecrireConsole(
ParametreAS as,
void * msg,
int n)
891#if defined(MANUX_TACHES) && defined(MANUX_TACHE_CONSOLE)
895 Console * cons = &_consoleNoyau;
Définition des codes ASCII (C) Manu Chaput 2026-2026.
#define ASCII_CARRIAGE_RETURN
void consoleAfficher(Console *cons, char *msg)
Affichage d'un message sur une console.
int consoleInitialisation(void)
Initialisation du système de console.
void consoleAffecterCouleurTexte(Console *cons, Couleur coul)
void consoleEffacer(Console *cons)
void consoleAfficherEntier(Console *cons, int n)
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...
Console * consoleNoyau(void)
Obtention d'un pointeur sur la console par défaut.
void consoleAfficherN(Console *cons, char *msg, int nbOctets)
void consoleNoyauAfficher(char *msg)
Affichage d'un message sur la console noyau.
Définition des caractéristiques de base de l'écran.
#define MANUX_CON_COLONNES
Couleur
Définition des couleurs utilisables pour l'affichage.
@ COUL_FOND_MAGENTA_CLAIR
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
#define MANUX_COULEUR_TEXTE
Couleur de texte par défaut.
#define MANUX_COULEUR_FOND
Couleur de fond par défaut.
#define MANUX_CONSOLE_MAJEUR
Définition des fonctions de base d'accés à la console.
size_t consoleEcrire(Fichier *f, void *buffer, size_t nbOctets)
typedef void(Handler(void))
void * memcpy(void *dest, const void *src, size_t n)
#define outb(port, octet)
Emission d'un octet sur un port.
void * kmalloc(size_t n)
Allocation d'une zone de n octets.
uint16_t a
Exemple de fonction de mise-à-jour d'un paramètre dans un registre.
#define paniqueNoyau(fmt, args...)
Tache * tacheEnCours
: L'identification de la tâche en cours
void ordonnanceur(void)
Basculer vers la prochaine tache à exécuter.
struct __attribute__((__packed__))
char * adresseEcran
Adresse à laquelle se trouve le contenu affiché
uint8_t nbLignes
Caractéristiques de l'écran.
int ligne
Position et attribut (couleur, ...) actuels.
: Qu'est-ce qu'un fichier ouvert du point de vue du noyau ?
INoeud * iNoeud
Caractérisation de la structure.
: Un INoeud représente un fichier, d'un point de vue statique Il s'agit donc de la description d'un f...
TypePeripherique typePeripherique
MethodesFichier * methodesFichier
: Définition des opérations réalisables sur un fichier
int(* ouvrir)(INoeud *iNoeud, Fichier *f, uint16_t fanions, uint16_t mode)
#define totalMinutesDansTemps(t)
#define secondesDansTemps(t)