From 951c4fee39f0ee27a55f492dfb5cc5d1f81264d0 Mon Sep 17 00:00:00 2001
From: rick <rick@gnous.eu>
Date: Wed, 13 Sep 2023 15:52:45 +0200
Subject: [PATCH 1/3] add docs

---
 framebuffer.c |  2 +-
 framebuffer.h | 55 ++++++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 51 insertions(+), 6 deletions(-)

diff --git a/framebuffer.c b/framebuffer.c
index bedd7c7..755a163 100644
--- a/framebuffer.c
+++ b/framebuffer.c
@@ -5,7 +5,7 @@ void fb_write_cell(unsigned int i, char c, unsigned char fg, unsigned char bg)
 {
   char *fb = (char*) 0xB8000; // adresse du framebuffer
   *(fb + i) = c;
-  *(fb + i + 1) = (fg & 0x0F) | ((bg & 0x0F) << 4); // little endian ??
+  *(fb + i + 1) = (fg & 0x0F) | ((bg & 0x0F) << 4);
 }
 
 void fb_move_cursor(unsigned short pos)
diff --git a/framebuffer.h b/framebuffer.h
index fc29e8a..397e08a 100644
--- a/framebuffer.h
+++ b/framebuffer.h
@@ -1,21 +1,59 @@
-/** @file framebuffer.h */
+/** @file framebuffer.h
+ * Fichier d'en-tête pour le framebuffer VGA.
+ *
+ * Références:
+ * - ports utilisés :
+ *      https://wiki.osdev.org/VGA_Hardware#Port_0x3C4.2C_0x3CE.2C_0x3D4
+ * - ports utilisés, registres, couleurs, explications sur les adresses
+ *   mémoires pour communiquer avec le framebuffer VGA :
+ *      http://www.brokenthorn.com/Resources/OSDev10.html
+ * - explications sur les registres et sous-registres accessibles via les
+ *   ports : http://www.osdever.net/FreeVGA/vga/vgareg.htm#indexed
+ * - commandes possibles : http://www.osdever.net/FreeVGA/vga/crtcreg.htm
+ * - encodage du caractère pour le framebuffer :
+ *   https://devse.wiki/x86_64/p%C3%A9riph%C3%A9riques/framebuffer.html
+ */
 
 #ifndef FRAMEBUFFER_H
 #define FRAMEBUFFER_H
 
+/**
+ * @def FB_ADDRESS
+ * L'adresse mémoire du mode texte couleur du VGA.
+ */
+#define FB_ADDRESS 0xB800
+
 /**
  * @def FB_COMMAND_PORT
- * Le port pour pouvoir envoyer des instructions au curseur du framebuffer
+ * Le port pour pouvoir indiquer le sous-registre que l'on souhaite modifier
+ * dans le framebuffer VGA. Il s'agit du registre d'adresses.
  */
 #define FB_COMMAND_PORT 0x3D4
+
 /**
  * @def FB_DATA_PORT
- * Le port pour pouvoir envoyer des instructions au curseur du framebuffer
+ * Le port pour pouvoir indiquer des données à écrire dans un sous-registre du
+ * framebuffer VGA. Il s'agit du registre de données.
  */
 #define FB_DATA_PORT 0x3D5
 
-#define FB_HIGH_BYTE_COMMAND 14
-#define FB_LOW_BYTE_COMMAND 15
+/**
+ * @def FB_HIGH_BYTE_COMMAND
+ * Le sous-registre à modifier pour mettre à jour les premiers bits (15-8) du
+ * registre indiquant la position du curseur.
+ *
+ * Plus d'information : http://www.osdever.net/FreeVGA/vga/crtcreg.htm#0E
+ */
+#define FB_HIGH_BYTE_COMMAND 0x0E
+
+/**
+ * @def FB_LOW_BYTE_COMMAND
+ * Le sous-registre à modifier pour mettre à jour les derniers bits (7-0) du
+ * registre indiquant la position du curseur.
+ *
+ * Plus d'information : http://www.osdever.net/FreeVGA/vga/crtcreg.htm#0F
+ */
+#define FB_LOW_BYTE_COMMAND 0x0F
 
 #define FB_WHITE 0x0F
 #define FB_BLACK 0x00
@@ -23,6 +61,13 @@
 /**
  * permet d'écrire dans un emplacement du framebuffer
  *
+ * Il va écrire dans l'emplacement i et i+1 du framebuffer le caractère c suivi
+ * d'un byte coupé en 2 : 4 bits pour la couleur du texte et 4 pour celle du
+ * fond.
+ *
+ * Structure du mot mit en mémoire où X = bit pour le caractère, Y la couleur
+ * du texte et Z couleur du fond : (0) XXXXXXXX YYYYZZZZ (15)
+ *
  * @param i l'emplacement où il faut écrire
  * @param c le caractère
  * @param fg la couleur du texte

From 54593c95f97eeed9d1165cc94b1afa54211e187d Mon Sep 17 00:00:00 2001
From: rick <rick@gnous.eu>
Date: Wed, 13 Sep 2023 16:05:29 +0200
Subject: [PATCH 2/3] fix bad command and name

---
 framebuffer.c | 8 ++++----
 framebuffer.h | 6 +++---
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/framebuffer.c b/framebuffer.c
index 755a163..84c9370 100644
--- a/framebuffer.c
+++ b/framebuffer.c
@@ -3,15 +3,15 @@
 
 void fb_write_cell(unsigned int i, char c, unsigned char fg, unsigned char bg)
 {
-  char *fb = (char*) 0xB8000; // adresse du framebuffer
+  char *fb = (char *) FB_ADDRESS;
   *(fb + i) = c;
-  *(fb + i + 1) = (fg & 0x0F) | ((bg & 0x0F) << 4);
+  *(fb + i + 1) = ((bg & 0x0F) << 4) | (fg & 0x0F);
 }
 
 void fb_move_cursor(unsigned short pos)
 {
-  outb(FB_COMMAND_PORT, FB_HIGH_BYTE_COMMAND);
+  outb(FB_ADDRESS_PORT, FB_HIGH_BYTE_COMMAND);
   outb(FB_DATA_PORT, (pos >> 8) & 0x00FF);
-  outb(FB_COMMAND_PORT, FB_HIGH_BYTE_COMMAND);
+  outb(FB_ADDRESS_PORT, FB_LOW_BYTE_COMMAND);
   outb(FB_DATA_PORT, pos & 0x00FF);
 }
diff --git a/framebuffer.h b/framebuffer.h
index 397e08a..a98fdc8 100644
--- a/framebuffer.h
+++ b/framebuffer.h
@@ -21,14 +21,14 @@
  * @def FB_ADDRESS
  * L'adresse mémoire du mode texte couleur du VGA.
  */
-#define FB_ADDRESS 0xB800
+#define FB_ADDRESS 0x000B8000
 
 /**
- * @def FB_COMMAND_PORT
+ * @def FB_ADDRESS_PORT
  * Le port pour pouvoir indiquer le sous-registre que l'on souhaite modifier
  * dans le framebuffer VGA. Il s'agit du registre d'adresses.
  */
-#define FB_COMMAND_PORT 0x3D4
+#define FB_ADDRESS_PORT 0x3D4
 
 /**
  * @def FB_DATA_PORT

From c6922febc18498b7c72d7c18240c0a3521443abe Mon Sep 17 00:00:00 2001
From: rick <rick@gnous.eu>
Date: Wed, 13 Sep 2023 16:05:40 +0200
Subject: [PATCH 3/3] add colors

---
 framebuffer.h | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/framebuffer.h b/framebuffer.h
index a98fdc8..88f8308 100644
--- a/framebuffer.h
+++ b/framebuffer.h
@@ -55,8 +55,22 @@
  */
 #define FB_LOW_BYTE_COMMAND 0x0F
 
-#define FB_WHITE 0x0F
-#define FB_BLACK 0x00
+#define FB_BLACK        0x00
+#define FB_BLUE         0x01
+#define FB_GREEN        0x02
+#define FB_CYAN         0x03
+#define FB_RED          0x04
+#define FB_MAGENTA      0x05
+#define FB_BROWN        0x06
+#define FB_L_GREY       0x07
+#define FB_D_GREY       0x08
+#define FB_L_BLUE       0x09
+#define FB_L_GREEN      0x0A
+#define FB_L_CYAN       0x0B
+#define FB_L_RED        0x0C
+#define FB_L_MAGENRA    0x0D
+#define FB_YELLOW       0x0E
+#define FB_WHITE        0x0F
 
 /**
  * permet d'écrire dans un emplacement du framebuffer