Simple Operating System - Chargement du noyau
Driver de la carte graphique
La carte graphique est mappée en mémoire à l'adresse 0xb8000 (qui correspond au début de la zone mémoire reroutée vers la carte graphique). Elle est vue comme un tableau à 2 dimensions de LIGNES x COLONNES éléments. Chaque élément correspond à une structure contenant un caractère et un attribut (souligné, couleur, couleur de fond...).
/* The text video memory starts at address 0xB8000. Odd bytes are the
ASCII value of the character, even bytes are attribute for the preceding character. */
#define VIDEO 0xb8000
/* Console screen size */
#define LINES 25
#define COLUMNS 80
/** The structure of a character element in the video memory. @see
http://webster.cs.ucr.edu/AoA DOS edition chapter 23 */
typedef struct {
unsigned char character;
unsigned char attribute;
} __attribute__ ((packed)) x86_video_mem[LINES*COLUMNS];
Effacer l'écran
Pour éffacer l'écran il suffit d'itérer sur tous les éléments de la zone mémoire graphique et de positionner le caractère à 0, l'attribut peut être utilisé pour modifier la couleur de fond par exemple.
sos_ret_t sos_x86_videomem_cls(unsigned char attribute)
{
/* Clears the screen */
int i;
for(i = 0 ; i < LINES*COLUMNS ; i++)
{
(*video)[i].character = 0;
(*video)[i].attribute = attribute;
}
return SOS_OK;
}
Ecriture d'un caractère à l'écran
Pour réaliser cette opération il suffit de positionner l'offset vidéo sur la ligne (nb lignes x nb colonnes) et la colonne (ligne + nb colonnes) souhaitées. Il ne reste plus qu'à positionner le caractère ainsi que son attribut.
sos_ret_t sos_x86_videomem_putchar(unsigned char row, unsigned char col,unsigned char attribute,unsigned char c)
{
unsigned video_offs = row*COLUMNS + col;
if (video_offs >= LINES*COLUMNS)
return -SOS_EINVAL;
(*video)[video_offs].character = c;
(*video)[video_offs].attribute = attribute;
return SOS_OK;
}