commit ed1e0cf4c8f1b3abd22e3148c4f298b8be39bd41 Author: Georges Dupéron Date: Fri Apr 15 01:14:48 2011 +0200 Initial commit. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1df2044 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +dist +travail diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3832600 --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +SHELL = /bin/sh + +REP_MAKEFILES := src/makefiles/ + +MAKEFILES := affichage.makefile \ + fichiersDossiers.makefile \ + commandes.makefile \ + regles.makefile + +MAKEFILES := $(patsubst %,$(REP_MAKEFILES)/%,$(MAKEFILES)) + +include $(MAKEFILES) diff --git a/src/demarrage/grub/menu.lst b/src/demarrage/grub/menu.lst new file mode 100644 index 0000000..d8fcdf5 --- /dev/null +++ b/src/demarrage/grub/menu.lst @@ -0,0 +1,5 @@ +default 0 +timeout 0 +title gruntnetwork +kernel /boot/gruntnetwork.elf +module /donnees/police.fnt diff --git a/src/demarrage/grub/stage1 b/src/demarrage/grub/stage1 new file mode 100644 index 0000000..c10df80 Binary files /dev/null and b/src/demarrage/grub/stage1 differ diff --git a/src/demarrage/grub/stage2 b/src/demarrage/grub/stage2 new file mode 100644 index 0000000..27ce526 Binary files /dev/null and b/src/demarrage/grub/stage2 differ diff --git a/src/demarrage/grub/stage2_eltorito b/src/demarrage/grub/stage2_eltorito new file mode 100644 index 0000000..1faa58b Binary files /dev/null and b/src/demarrage/grub/stage2_eltorito differ diff --git a/src/demarrage/grub/stage2_eltorito_vbe b/src/demarrage/grub/stage2_eltorito_vbe new file mode 100644 index 0000000..6f8d29e Binary files /dev/null and b/src/demarrage/grub/stage2_eltorito_vbe differ diff --git a/src/inclusions/algo/math/math.h b/src/inclusions/algo/math/math.h new file mode 100644 index 0000000..a39da14 --- /dev/null +++ b/src/inclusions/algo/math/math.h @@ -0,0 +1,36 @@ +#ifndef ALGO_MATH_MATH_H +#define ALGO_MATH_MATH_H + +#include + +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +#define min(a, b) (((a) < (b)) ? (a) : (b)) + +#define abs(x) (((x) >= 0) ? (x) : -(x)) + +#define sign(x) (((x) >= 0) \ + ? (((x) == 0) ? 0 : 1) \ + : -1) + +#define sinRapide_(a, sgn) ((((a) * 4) \ + - ((a)*(a) >> 13)) \ + * sgn) + +#define sinRapide(a) sinRapide_(abs((int32)(a)) % 32768, (((a) & 32768) ? 1 : -1)) + +#define cosRapide(a) sinRapide((a)+16384) + +#define clip(x, min_, max_) min(max_, max((x),min_)) + +typedef struct Div64 { + uint64 quotient; + uint64 reste; +} Div64; + +typedef struct EtatMath { +} EtatMath; + +Div64 div64 (uint64 numerateur, uint64 denominateur); + +#endif diff --git a/src/inclusions/demarrage/multiboot/multiboot.h b/src/inclusions/demarrage/multiboot/multiboot.h new file mode 100644 index 0000000..fb50408 --- /dev/null +++ b/src/inclusions/demarrage/multiboot/multiboot.h @@ -0,0 +1,244 @@ +#ifndef DEMARRAGE_MULTIBOOT_MULTIBOOT_H +#define DEMARRAGE_MULTIBOOT_MULTIBOOT_H + +#include + +/** + * @brief Informations récupérées par grub + * + * D'abord les sous-structures, puis la structure principale. + */ + +/* FIXME : De quoi s'agit-il réellement ? */ +typedef uint32 pointeurLointain; + +/** + * @brief Disponibilité des informations. + */ +typedef struct MultibootInfoFlags { + bool mem:1; + bool bootDevice:1; + bool cmdline:1; + bool mods:1; + bool aout:1; + bool elf:1; + bool mmap:1; + bool drives:1; + bool configTable:1; + bool bootLoaderName:1; + bool apmTable:1; + bool vbe:1; + uint32 PADDING:20; +} PACKED MultibootInfoFlags; + +/** + * @brief Média de stockage utilisé lors du démarrage. + */ +typedef struct MultibootInfoBootDevice { + uint8 part1; + uint8 part2; + uint8 part3; + uint8 drive; +} PACKED MultibootInfoBootDevice; + +/** + * @brief Modules chargés par le chargeur de démarrage. + */ +typedef struct MultibootInfoModule { + void* modStart; + void* modEnd; + + StringZ string; + + uint32 reserved; +} PACKED MultibootInfoModule; + +/** + * @brief Table des symboles a.out . + */ +typedef struct MultibootInfoAout { + uint32 aoutTabSize; + uint32 aoutStrSize; + + /* le type de aoutAddr devrait être nlist (cf. standard + * multiboot), mais de quoi s'agit-t-il ? */ + void* aoutAddr; + + uint32 reserved; +} PACKED MultibootInfoAout; + +/** + * @brief Table des en-têtes de section pour ELF. + */ +typedef struct MultibootInfoElf { + uint32 num; + uint32 size; + + void* addr; + + StringZ* shndx; /* Tableau de StringZ ou de String ? */ +} PACKED MultibootInfoElf; + +/** + * @brief Cartographie de la mémoire. + * + * Si type != MultibootInfoMmapRam alors cette mémoire est réservée + * (mémoire vidéo, etc.) + */ +#define MultibootInfoMmapRam = 1; +typedef struct MultibootInfoMmap { + /* Attention, mmapAddr tel que fourni par grub pointe sur le 2e + * champ (baseAddr), il faut donc enlever 4 octets à + * l'adresse. */ + uint32 size; + + /* Avec 32_low suivi de 32_high, je peux en faire 64. Ne me + * seais-je pas trompé dans l'endianisme ? */ + uint64 baseAddr; + uint64 length; + uint32 type; +} PACKED MultibootInfoMmap; + +/** + * @brief Média de stockage. + */ +typedef enum { CHS = 0, LBA = 1 } MultibootInfoDriveMode; +typedef struct MultibootInfoDrive { + uint32 size; + + uint8 driveNumber; + + /* Cela permet-il de contraindre la taille d'un enum ? */ + MultibootInfoDriveMode driveMode:8; + + + uint16 driveCylinders; + uint8 driveHeads; + uint8 driveSectors; + + /* Et comment je gère cette horreur moi ? */ + uint16 drivePorts; +} PACKED MultibootInfoDrive; + +/** + * @brief Fonction GET CONFIGURATION du BIOS. + */ +typedef struct MultibootInfoConfigTable { + /* Chercher le format de retour de l'appel au BIOS nommé + * GET CONFIGURATION */ +} PACKED MultibootInfoConfigTable; + +/** + * @brief Advanced Power Management. + */ +typedef struct MultibootInfoApmTable { + /* Voir le standard apm pour les types... + * http://www.micr.../hwdev/busbios/amp_12.htm + * Soit dit en passant, sympa la référence à micr... dans un + * standard libre (très mal écrit le standard au fait...) */ + uint16 version; + uint16 cseg; + uint32 offset; + uint16 cseg16; + uint16 dseg; + uint16 flags; + uint16 csegLen; + uint16 cseg16Len; + uint16 dsegLen; +} PACKED MultibootInfoApmTable; + +/** + * @brief Contrôleur VESA Bios Extension + */ +typedef struct MultibootInfoVbeControllerInfo{ + char signature[4]; /* == "VESA" */ + union { + uint16 version; + struct { + uint8 versionMajeure; /* 2 pour VBE 2.* */ + uint8 versionMineure; /* 0 pour VBE *.0 */ + }; + }; + /* pointeurLointain ??? */ + uint16 oemString[2]; /* Nom du périphérique, donné par le constructeur */ + uint32 capabilities; /* Fonctionnalités offertes */ + /* pointeurLointain ??? */ + uint16 videomodes[2]; /* Liste de modes vidéo */ + uint16 totalMemory; /* nombre de blocs de 64ko */ +} PACKED MultibootInfoVbeControllerInfo; + +/** + * @brief Mode vidéo VESA Bios Extension + */ +typedef struct MultibootInfoVbeModeInfo { + uint16 attributes; + uint8 winA,winB; + uint16 granularity; + uint16 winsize; + uint16 segmentA, segmentB; + pointeurLointain winFunc; + uint16 pitch; /* octets par scanline */ + + uint16 Xres, Yres; + uint8 Wchar, Ychar, planes, bpp, banks; + uint8 memory_model, bank_size, image_pages; + uint8 reserved; + + struct { + uint8 maskSize; + uint8 fieldPos; + } red, green, blue, reservedChannel; + uint8 directcolor_attributes; + + void* linearAddress; /* L'adresse du framebuffer linéaire :) */ + void* offscreenAddress; + uint16 offscreenSizeKB; +} PACKED MultibootInfoVbeModeInfo; + +/** + * @brief Informations récupérées par grub + */ +typedef struct MultibootInfo { + MultibootInfoFlags flags; + + uint32 memLower; + uint32 memUpper; + + MultibootInfoBootDevice bootDevice; + + StringZ cmdline; + + uint32 modsCount; + MultibootInfoModule* modsAddr; + + union { + MultibootInfoAout aout; + MultibootInfoElf elf; + } PACKED syms; + + uint32 mmapLength; + MultibootInfoMmap* mmapAddr; + + uint32 drivesLength; + MultibootInfoDrive* drivesAddr; + + MultibootInfoConfigTable* configTable; + + StringZ bootLoaderName; + + MultibootInfoApmTable* apmTable; + + MultibootInfoVbeControllerInfo* vbeControlInfo; + MultibootInfoVbeModeInfo* vbeModeInfo; + uint16 vbeMode; + uint16 vbeInterfaceSeg; + uint16 vbeInterfaceOff; + uint16 vbeInterfaceLen; +} PACKED MultibootInfo; + +typedef struct EtatMultiboot { + MultibootInfo* InfoMultiboot; + uint32 magicMultiboot; +} EtatMultiboot; + +#endif diff --git a/src/inclusions/interfaceUtilisateur/clavier/clavier.h b/src/inclusions/interfaceUtilisateur/clavier/clavier.h new file mode 100644 index 0000000..88995d6 --- /dev/null +++ b/src/inclusions/interfaceUtilisateur/clavier/clavier.h @@ -0,0 +1,7 @@ +#ifndef INTERFACE_UTILISATEUR_CLAVIER_CLAVIER_H +#define INTERFACE_UTILISATEUR_CLAVIER_CLAVIER_H + +typedef char EtatClavier; + +#endif + diff --git a/src/inclusions/interfaceUtilisateur/console/console.h b/src/inclusions/interfaceUtilisateur/console/console.h new file mode 100644 index 0000000..7cb858a --- /dev/null +++ b/src/inclusions/interfaceUtilisateur/console/console.h @@ -0,0 +1,116 @@ +#ifndef INTERFACE_UTILISATEUR_CONSOLE_CONSOLE_H +#define INTERFACE_UTILISATEUR_CONSOLE_CONSOLE_H + +#include + +typedef struct CouleurComposantes { + uint8 bleu; + uint8 vert; + uint8 rouge; + uint8 alpha; +} CouleurComposantes; + +typedef uint32 Couleur; + +typedef struct CouleurAvAr { + Couleur av; + Couleur ar; +} CouleurAvAr; + +typedef struct Position { + uint32 x; + uint32 y; +} Position; + +typedef void (*FonctionAffichage) (char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y); + +typedef struct Console { + uint32 x; + uint32 y; + uint32 largeur; + uint32 hauteur; + FonctionAffichage fonctionAffichage; +} Console; + +typedef struct EtatConsole { + Console* consoleActive; + uint32 x; + uint32 y; + uint32 couleurAv; + uint32 couleurAr; + bool consolePrete; +} EtatConsole; + + +Console* definirConsoleActive(Console* console); + +CouleurAvAr getConsoleCouleur(); +CouleurAvAr consoleCouleur(Couleur couleurAv, Couleur couleurAr); + +Position getConsolePosition(); +Position consolePosition(uint32 x, uint32 y); +void consolePositionAvancerX(); +void consolePositionAvancerY(); + +void afficherCaractereCouleurPositionBrut(char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y); +void afficherCaractereCouleurPosition(char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y); +void afficherCaractere(char caractere); +void afficherCaractereBrut(char caractere); +void afficherCaractereCouleur(char caractere, uint32 couleurAv, uint32 couleurAr); +void afficherCaractereCouleurBrut(char caractere, uint32 couleurAv, uint32 couleurAr); +void afficherCaracterePosition(char caractere, uint32 x, uint32 y); +void afficherCaracterePositionBrut(char caractere, uint32 x, uint32 y); + +void effacerConsole(); +void afficherChaineZ(char* chaine); +void afficherChaine(char* chaine, int longueur); +void afficherEntierVirguleEnDecimal(uint32 entier, int32 nbDecimales); +void afficherEntierEnDecimal(uint32 entier); +void afficherEntierEnHexa(uint32 entier); +void afficherEntierEnBinaire(uint32 entier); +void afficherTableCaracteres(); + +bool consolePrete(); + +#define STR_Ccedil "\200" +#define STR_uuml "\201" +#define STR_eacute "\202" +#define STR_acirc "\203" +#define STR_auml "\204" +#define STR_agrave "\205" +#define STR_aring "\206" +#define STR_ccedil "\207" +#define STR_ecirc "\210" +#define STR_euml "\211" +#define STR_egrave "\212" +#define STR_iuml "\213" +#define STR_icirc "\214" +#define STR_igrave "\215" +#define STR_Auml "\216" +#define STR_Aring "\217" +#define STR_Eacute "\220" +#define STR_aelig "\221" +#define STR_AElig "\222" +#define STR_ocirc "\223" +#define STR_ouml "\224" +#define STR_ograve "\225" +#define STR_ucirc "\226" +#define STR_ugrave "\227" +#define STR_yuml "\230" +#define STR_Ouml "\231" +#define STR_Uuml "\232" +#define STR_cent "\233" +#define STR_pound "\234" +#define STR_yen "\235" +#define STR_xxxxxxxx "\236" +#define STR_fonction "\237" +#define STR_aacute "\240" +#define STR_iacute "\241" +#define STR_oacute "\242" +#define STR_uacute "\243" +#define STR_ntilde "\244" +#define STR_Ntilde "\245" +#define STR_ordm "\246" +#define STR_degr "\247" + +#endif diff --git a/src/inclusions/interfaceUtilisateur/demo/demo.h b/src/inclusions/interfaceUtilisateur/demo/demo.h new file mode 100644 index 0000000..2ce9ac3 --- /dev/null +++ b/src/inclusions/interfaceUtilisateur/demo/demo.h @@ -0,0 +1,6 @@ +#ifndef INTERFACE_UTILISATEUR_DEMO_DEMO_H +#define INTERFACE_UTILISATEUR_DEMO_DEMO_H + +typedef char EtatDemo; + +#endif diff --git a/src/inclusions/interfaceUtilisateur/police/police.h b/src/inclusions/interfaceUtilisateur/police/police.h new file mode 100644 index 0000000..9a2e9a3 --- /dev/null +++ b/src/inclusions/interfaceUtilisateur/police/police.h @@ -0,0 +1,10 @@ +#ifndef INTERFACE_UTILISATEUR_POLICE_POLICE_H +#define INTERFACE_UTILISATEUR_POLICE_POLICE_H + +typedef struct EtatPolice { + uint8* tableCaracteres; +} EtatPolice; + +void policeAfficherCaractereCouleurPosition(char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y); + +#endif diff --git a/src/inclusions/math.h b/src/inclusions/math.h new file mode 100644 index 0000000..d2362cb --- /dev/null +++ b/src/inclusions/math.h @@ -0,0 +1,6 @@ +#ifndef MATH_H +#define MATH_H + +#include + +#endif diff --git a/src/inclusions/modeleModule.h b/src/inclusions/modeleModule.h new file mode 100644 index 0000000..ecfe0a9 --- /dev/null +++ b/src/inclusions/modeleModule.h @@ -0,0 +1,7 @@ +#ifndef MODELE_MODULE_H +#define MODELE_MODULE_H + +typedef struct EtatModeleModule { +} EtatModeleModule; + +#endif diff --git a/src/inclusions/module.h b/src/inclusions/module.h new file mode 100644 index 0000000..076ba7f --- /dev/null +++ b/src/inclusions/module.h @@ -0,0 +1,62 @@ +#ifndef MODULE_H +#define MODULE_H + +#include + +typedef enum { + ETAPE_MODULE_CHARGE = 0, + ETAPE_MODULE_INITIALISE = 1, +} EtapeChargementModule; + + +typedef struct InfoModule { + char* nom; + void (*init) (void** etat); + void (*deinit) (void** etat); + EtapeChargementModule etapeChargementModule; + void* etat; + struct DependanceModule* dependances; + struct InfoModule* suivant; + struct InfoModule* suivantRecursionDependances; + int nbDependances; +} PACKED ALIGNED(32) InfoModule; + +typedef struct DependanceModule { + InfoModule* module; + InfoModule* dependance; +} PACKED DependanceModule; + + +#define MODULE(nom) \ + Etat ## nom _etat ## nom USED; \ + Etat ## nom* etat ## nom USED = &_etat ## nom; \ + \ + void (init ## nom) (void** etat); \ + void (deinit ## nom) (void** etat); \ + InfoModule __infoModule_ ## nom \ + SECTION(.modules) \ + USED \ + = { \ + (#nom), \ + (init ## nom), \ + (deinit ## nom), \ + ETAPE_MODULE_CHARGE, \ + NULL, \ + NULL, \ + NULL, \ + NULL, \ + 0 \ + } + +#define DEPENDANCE_MODULE(module, dependance) \ + extern InfoModule __infoModule_ ## module; \ + extern InfoModule __infoModule_ ## dependance; \ + DependanceModule __dependanceModule ## module ## _ ## dependance \ + __attribute__ ((section(".dependancesModules"))) \ + USED \ + = { \ + & __infoModule_ ## module, \ + & __infoModule_ ## dependance \ + } + +#endif diff --git a/src/inclusions/pc/gdt/gdt.h b/src/inclusions/pc/gdt/gdt.h new file mode 100644 index 0000000..7b3a8ad --- /dev/null +++ b/src/inclusions/pc/gdt/gdt.h @@ -0,0 +1,96 @@ +#ifndef PC_GDT_GDT_H +#define PC_GDT_GDT_H + +#include + +typedef enum { + SEGMENT_DONNEES = 0, + SEGMENT_CODE = 1 +} TypeSegmentCodeDonnees; + +typedef enum { + DESCRIPTEUR_SEGMENT_SYSTEME = 0, + DESCRIPTEUR_SEGMENT_CODE_DONNEES = 1 +} TypeDescripteurSegment; + +typedef enum { + TAILLE_OPERATION_16 = 0, + TAILLE_OPERATION_32 = 1 +} TailleOperationSegment; + +/* Union avec TailleOperationSegment */ +typedef enum { + LIMITE_HAUTE_64Ko = 0, + LIMITE_HAUTE_4Go = 1 +} LimiteHauteSegment; + +typedef enum { + GRANULARITE_1octet = 0, + GRANULARITE_4Ko = 1 +} GranulariteSegment; + +/* x86-doc-vol3.pdf section 3.4.5, fig 3-8 */ +typedef struct DescripteurSegment { + uint16 limite_15_0; + + uint16 base_15_0; + + uint8 base_23_16; + bool accede:1; + bool lecture_ecriture:1; + bool expansionBas_conforme:1; + TypeSegmentCodeDonnees codeDonnees:1; + + TypeDescripteurSegment typeDescripteur:1; + uint8 niveauPrivilegeDescripteur:2; + bool present:1; + + uint8 limite_19_16:4; + uint8 _disponible:1; + uint8 _reserve:1; /* Segment de code 64 bits (IA32 seulement) */ + TailleOperationSegment tailleOperation:1; + /* union avec ci-dessus : LimiteHauteSegment limiteHaute:1; */ + GranulariteSegment granularite:1; + uint8 base_31_24; +} PACKED ALIGNED(8) DescripteurSegment; + +#define descripteurSegmentNULL { \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ +} + +#define descripteurSegmentBasicFlatModel(_codeDonnees) \ + { \ + .limite_15_0 = 0xFFFF, \ + .base_15_0 = 0x0000, \ + .base_23_16 = 0x00, \ + .accede = FALSE, \ + .lecture_ecriture = TRUE, \ + .expansionBas_conforme = FALSE, \ + .codeDonnees = _codeDonnees, \ + .typeDescripteur = DESCRIPTEUR_SEGMENT_CODE_DONNEES, \ + .niveauPrivilegeDescripteur = 0, \ + .present = 1, \ + .limite_19_16 = 0xF, \ + ._disponible = 0, \ + ._reserve = 0, \ + .tailleOperation = TAILLE_OPERATION_32, \ + .granularite = GRANULARITE_4Ko, \ + .base_31_24 = 0 \ + } + + +/* x86-doc-vol3.pdf section 2.4.1, fig 2.5 */ +typedef struct RegistreGDTR { + uint16 limite; + DescripteurSegment* base; +} PACKED ALIGNED (4) RegistreGDTR; +/* TODO : Vérifier le ALIGNED 4 : + * x86-doc-vol3.pdf section 3.5.1, 2e page */ + + +typedef struct EtatGdt { + DescripteurSegment* tableDescripteursSegment; + RegistreGDTR registreGDTR; +} EtatGdt; + +#endif diff --git a/src/inclusions/pc/idt/idt.h b/src/inclusions/pc/idt/idt.h new file mode 100644 index 0000000..24263d4 --- /dev/null +++ b/src/inclusions/pc/idt/idt.h @@ -0,0 +1,64 @@ +#ifndef PC_IDT_IDT_H +#define PC_IDT_IDT_H + +#include + +typedef enum { + DESCRIPTEUR_PORTE_TACHE = 1, + DESCRIPTEUR_PORTE_INTERRUPTION = 2, + DESCRIPTEUR_PORTE_TRAPPE = 3 +} TypeDescripteurInterruption; + +typedef enum { + TAILLE_PORTE_16 = 0, + TAILLE_PORTE_32 = 1 +} TaillePorte; + +/* x86-doc-vol3.pdf section 5.11, fig 5-2 */ +typedef struct DescripteurInterruption { + uint16 offset_15_0; + + uint16 selecteurSegment; + + uint8 _zero_a; + /* TypeDescripteurInterruption type:2; + uint8 _un:1; + TaillePorte taillePorte:1; + uint8 _zero_b:1; */ + uint8 type:5; + + uint8 niveauPrivilegeDescripteur:2; + bool present:1; + + uint16 offset_31_16; +} PACKED ALIGNED(8) DescripteurInterruption; + + +/* x86-doc-vol3.pdf section 2.4.1, fig 2.5 */ +typedef struct RegistreIDTR { + uint16 limite; + DescripteurInterruption* base; +} PACKED ALIGNED (8) RegistreIDTR; +/* TODO : Vérifier le ALIGNED 4 : + * x86-doc-vol3.pdf section 3.5.1, 2e page */ + + +typedef void (*EnregistreurContexteInterruption) (); +typedef void (*GestionnaireInterruption) (); + + +typedef struct EtatIdt { + DescripteurInterruption tableDescripteursInterruption[256]; + int interruptionsDesactivees; + int nombreDescripteursInterruption; + RegistreIDTR registreIDTR; +} EtatIdt; + + +int desactiverInterruptions(); +int activerInterruptions(); +void definirGestionnaireInterruption(int numeroInterruption, GestionnaireInterruption gestionnaire); +void activerInterruption(int numeroInterruption); +void desactiverInterruption(int numeroInterruption); + +#endif diff --git a/src/inclusions/pc/io/io.h b/src/inclusions/pc/io/io.h new file mode 100644 index 0000000..3d7b1ef --- /dev/null +++ b/src/inclusions/pc/io/io.h @@ -0,0 +1,20 @@ +#ifndef PC_IO_IO_H +#define PC_IO_IO_H + +#define inb(port) \ + ({ \ + uint8 ret; \ + asm volatile ("inb %w1,%0" \ + : "=a" (ret) \ + : "i" (port) ); \ + ret; \ + }) + +#define outb(port, val) \ + asm volatile ("outb %b0,%w1" \ + : \ + : "a" (val), "i" (port) ) + +typedef char EtatIo; + +#endif diff --git a/src/inclusions/pc/irq/irq.h b/src/inclusions/pc/irq/irq.h new file mode 100644 index 0000000..3a41058 --- /dev/null +++ b/src/inclusions/pc/irq/irq.h @@ -0,0 +1,107 @@ +#ifndef PC_IRQ_IRQ_H +#define PC_IRQ_IRQ_H + +#define PORT_PIC_MAITRE_COMMANDE 0x0020 +#define PORT_PIC_MAITRE_DONNEES 0x0021 +#define PORT_PIC_ESCLAVE_COMMANDE 0x00A0 +#define PORT_PIC_ESCLAVE_DONNEES 0x00A1 + +/* 8259A page 10-12 (fig 7) */ +typedef enum { + PIC_ICW1_SEUL = 1, + PIC_ICW1_CASCADE = 0 +} PIC_ICW1_SNGL; + +typedef enum { + PIC_ICW1_INTERVALLE_4 = 1, + PIC_ICW1_INTERVALLE_8 = 0 +} PIC_ICW1_ADI; + +typedef enum { + PIC_ICW1_LEVEL_TRIGGERED_MODE = 1, + PIC_ICW1_EDGE_TRIGGERED_MODE = 0 +} PIC_ICW1_LTIM; + +typedef struct PicICW1 { + bool ICW4_present:1; + PIC_ICW1_SNGL single:1; + PIC_ICW1_ADI adi:1; + PIC_ICW1_LTIM ltim:1; + uint8 init:1; + /* MCS-80/85 seulement : + * uint8 adresseVecteurInterruption_7_5:3; */ + uint8 _zero:4; +} PicICW1; + + +typedef struct PicICW2 { + /* MCS-80/85 seulement : + * uint8 adresseVecteurInterruption_15_8; */ + uint8 _zero:3; + uint8 adresseVecteurInterruption_7_3:5; +} PicICW2; +/* typedef uint8 PicICW2; */ + + +#define ESCLAVE_CONNECTE_SUR_MAITRE_PATTE(patteConnexionMaitre) (1<<(patteConnexionMaitre)) +typedef uint8 PicICW3_Maitre; + +typedef struct PicICW3_Esclave { + uint8 patteConnexionMaitre:3; + uint8 _zero:5; +} PicICW3_Esclave; + + +typedef enum { + PIC_ICW4_MODE_8086_8088 = 1, + PIC_ICW4_MODE_MCS_80_85 = 0 +} PIC_ICW4_MICRO_PM; + +typedef enum { + PIC_ICW4_MODE_SANS_TAMPON = (0 | 0), + PIC_ICW4_TAMPON_ESCLAVE = (2 | 0), + PIC_ICW4_TAMPON_MAITRE = (2 | 1) +} PIC_ICW4_BUF_MS; + +typedef struct PicICW4 { + PIC_ICW4_MICRO_PM microPM:1; + bool autoEOI:1; + PIC_ICW4_BUF_MS tampon:2; + bool specialFullyNestedMode:1; + uint8 _zero:3; +} PicICW4; + + +typedef void (*FonctionEnvoiFinInterruption) (); +typedef void (*GestionnaireRequeteInterruption) (); + +typedef struct EtatIrq { + FonctionEnvoiFinInterruption* tableFonctionsEnvoiFinInterruption; + GestionnaireRequeteInterruption* tableGestionnairesRequeteInterruption; + + uint8 adresseVecteurInterruptionMaitre; + uint8 adresseVecteurInterruptionEsclave; + + PicICW1 ICW1_Maitre; + PicICW2 ICW2_Maitre; + PicICW3_Maitre ICW3_Maitre; + PicICW4 ICW4_Maitre; + + PicICW1 ICW1_Esclave; + PicICW2 ICW2_Esclave; + PicICW3_Esclave ICW3_Esclave; + PicICW4 ICW4_Esclave; + + uint8 masqueMaitre; + uint8 masqueEsclave; + + uint8 ancienMasqueMaitre; + uint8 ancienMasqueEsclave; +} EtatIrq; + + +void definirGestionnaireRequeteInterruption(int ligne, GestionnaireRequeteInterruption gestionnaire); +void activerLigneRequeteInterruption(int ligne); +void desactiverLigneRequeteInterruption(int ligne); + +#endif diff --git a/src/inclusions/pc/kbc/kbc.h b/src/inclusions/pc/kbc/kbc.h new file mode 100644 index 0000000..39c1c99 --- /dev/null +++ b/src/inclusions/pc/kbc/kbc.h @@ -0,0 +1,35 @@ +#ifndef PC_KBC_KBC_H +#define PC_KBC_KBC_H + +/* TODO : Vérifier ces informations dans la doc Intel. */ + +#define LIGNE_IRQ_CLAVIER 1 +#define LIGNE_IRQ_SOURIS 12 + +#define PORT_KBC_DONNEES 0x60 +#define PORT_KBC_SCANCODE PORT_KBC_DONNEES +#define PORT_KBC_SOURIS PORT_KBC_DONNEES +#define PORT_KBC_COMMANDE_SOURIS PORT_KBC_DONNEES +#define PORT_KBC_PPI 0x61 +#define PORT_KBC_COMMANDE 0x64 + +#define KBC_DEMMANDE_ECRITURE_CLAVIER 0xd1 +#define KBC_DEMMANDE_ECRITURE_SOURIS 0xd4 +#define KBC_DEMMANDE_LECTURE_COMPAQ_STATUS_BYTE 0x20 +#define KBC_DEMMANDE_ECRITURE_COMPAQ_STATUS_BYTE 0x60 +#define KBC_RESET_CPU 0xfe + +typedef void (*GestionnaireClavier) (uint8 scancode); + +typedef struct EtatKbc { + GestionnaireClavier gestionnaireClavier; +} EtatKbc; + +void attenteKbc(); +void attenteLectureKbc(); +void activerClavier(); +void desactiverClavier(); +void resetCpu(); +void definirGestionnaireClavier(GestionnaireClavier gestionnaireClavier); + +#endif diff --git a/src/inclusions/pc/pit/pit.h b/src/inclusions/pc/pit/pit.h new file mode 100644 index 0000000..0b3cac2 --- /dev/null +++ b/src/inclusions/pc/pit/pit.h @@ -0,0 +1,84 @@ +#ifndef PC_PIT_PIT_H +#define PC_PIT_PIT_H + +#define LIGNE_IRQ_PIT 0 +#define PORT_PIT_CANAUX 0x40 +#define PORT_PIT_CANAL_0 PORT_PIT_CANAUX + 0 +#define PORT_PIT_CANAL_1 PORT_PIT_CANAUX + 1 +#define PORT_PIT_CANAL_2 PORT_PIT_CANAUX + 2 +#define PORT_PIT_COMMANDE 0x43 + +#define FREQUENCE_PIT_MILI_HZ 1193181667 + +typedef enum { + PIT_CANAL_0 = 0, + PIT_CANAL_1 = 1, + PIT_CANAL_2 = 2, + PIT_COMMANDE_LECTURE = 3, +} PitCanal; + +typedef enum { + PIT_COMMANDE_VERROU = 0, + PIT_OCTET_BAS = 1, + PIT_OCTET_HAUT = 2, + PIT_OCTETS_HAUT_BAS = 3, +} PitModeAcces; + +typedef enum { + /* Mauvaises traductions... */ + PIT_MODE_INTERRUPTION_FIN_COMPTEUR = 0, + PIT_MODE_UN_COUP_RE_ACTIVABLE = 1, + PIT_MODE_GENERATEUR_FREQUENCE = 2, + PIT_MODE_GENERATEUR_ONDE_CARREE = 3, + PIT_MODE_SIGNAL_A_DECLENCHEMENT_LOGICIEL = 4, + PIT_MODE_SIGNAL_A_DECLENCHEMENT_MATERIEL = 5, +} PitModeCanal; + +typedef struct PitCommandeMode { + bool bcd:1; + PitModeCanal mode:3; + PitModeAcces acces:2; + PitCanal canal:2; +} PACKED PitCommandeMode; + +typedef struct PitCommandeVerrou { + PitCanal canal:2; + uint8 zero:6; +} PitCommandeVerrou; + +typedef struct PitCommandeLecture { + uint8 un:2; + bool nePasVerouillerCompteur:1; + bool nePasVerouillerEtat:1; + bool lectureCanal0:1; + bool lectureCanal1:1; + bool lectureCanal2:1; + uint8 zero:1; +} PitCommandeLecture; + +typedef struct PitEtatCanal { + bool bcd:1; + PitModeCanal mode:3; + PitModeAcces acces:2; + bool attenteCopieRechargeCompteur:1; + bool etatSortie:1; +} PitEtatCanal; + +typedef void (*GestionnairePit) (); + +typedef struct EtatPit { + PitModeCanal modeCanal0; + PitModeCanal modeCanal1; + PitModeCanal modeCanal2; + PitModeAcces modeAcces; + + GestionnairePit gestionnairePit; +} EtatPit; + +uint32 definirFrequenceCanal(uint32 freq, PitCanal canal); +uint32 definirDelaiCanal(uint32 delai, PitCanal canal); +void definirCompteurCanal(uint16 compteur, PitCanal canal); +void definirModeCanal(PitModeCanal mode, PitCanal canal); +void definirGestionnairePit(GestionnairePit gestionnairePit); + +#endif diff --git a/src/inclusions/pc/sourisPS2/sourisPS2.h b/src/inclusions/pc/sourisPS2/sourisPS2.h new file mode 100644 index 0000000..5b89352 --- /dev/null +++ b/src/inclusions/pc/sourisPS2/sourisPS2.h @@ -0,0 +1,146 @@ +#ifndef PC_SOURIS_PS2_SOURIS_PS2_H +#define PC_SOURIS_PS2_SOURIS_PS2_H + +#include + +#define SOURIS_PS2_DEFINIR_RESOLUTION 0xe8 +#define SOURIS_PS2_DEMANDER_PAQUET 0xeb +#define SOURIS_PS2_OBTENIR_MOUSE_ID 0xf2 +#define SOURIS_PS2_DEFINIR_FREQUENCE 0xf3 +#define SOURIS_PS2_AUTO_PAQUETS 0xf4 +#define SOURIS_PS2_DESACTIVER_PAQUETS 0xf5 +#define SOURIS_PS2_RESET 0xff + +#define SOURIS_PS2_ACK 0xfa +#define SOURIS_PS2_RESET_1 0xaa +#define SOURIS_PS2_RESET_2 0x00 + +#define ENVOYER 1 +#define RECEVOIR 2 +#define ENVOYER_V 3 +#define RECEVOIR_V 4 +#define RECEVOIR_OU_PAS 42 /* Que la force soit avec la souris */ +#define COMMANDE 5 + + + +static const uint8 DialogueDefinirResolution[] = { + ENVOYER, SOURIS_PS2_DEFINIR_RESOLUTION, + RECEVOIR, SOURIS_PS2_ACK, + ENVOYER_V, 0, + RECEVOIR, SOURIS_PS2_ACK +}; + +static const uint8 DialogueDemanderPaquet[] = { + ENVOYER, SOURIS_PS2_DEMANDER_PAQUET, + RECEVOIR, SOURIS_PS2_ACK +}; + +static const uint8 DialogueObtenirMouseID[] = { + ENVOYER, SOURIS_PS2_OBTENIR_MOUSE_ID, + RECEVOIR, SOURIS_PS2_ACK, + RECEVOIR_V, 0 +}; + +static const uint8 DialogueDefinirFrequence[] = { + ENVOYER, SOURIS_PS2_DEFINIR_FREQUENCE, + RECEVOIR, SOURIS_PS2_ACK, + ENVOYER_V, 0, + RECEVOIR, SOURIS_PS2_ACK +}; + +static const uint8 DialogueAutoPaquets[] = { + ENVOYER, SOURIS_PS2_AUTO_PAQUETS, + RECEVOIR, SOURIS_PS2_ACK +}; + +static const uint8 DialogueDesactiverPaquets[] = { + ENVOYER, SOURIS_PS2_DESACTIVER_PAQUETS, + RECEVOIR, SOURIS_PS2_ACK +}; + +static const uint8 DialogueReset[] = { + ENVOYER, SOURIS_PS2_RESET, + RECEVOIR_OU_PAS, SOURIS_PS2_ACK, + RECEVOIR, SOURIS_PS2_RESET_1, + RECEVOIR, SOURIS_PS2_RESET_2 +}; + +static const uint8 DialogueObtenirCompaqStatusByte[] = { + COMMANDE, KBC_DEMMANDE_LECTURE_COMPAQ_STATUS_BYTE, + RECEVOIR_V, 0 + /* RECEVOIR_OU_PAS, 0xd8 Certaines versions de Bochs envoient mystérieusement cet octet. */ +}; + +static const uint8 DialogueDefinirCompaqStatusByte[] = { + COMMANDE, KBC_DEMMANDE_ECRITURE_COMPAQ_STATUS_BYTE, + ENVOYER_V, 0 + /* RECEVOIR_OU_PAS, SOURIS_PS2_ACK */ +}; + + + +typedef struct PaquetSourisPS2_1 { + uint8 boutonGauche:1; + uint8 boutonDroite:1; + uint8 boutonMilieu:1; + uint8 un:1; + uint8 xNegatif:1; + uint8 yNegatif:1; + uint8 xOverflow:1; + uint8 yOverflow:1; +} PaquetSourisPS2_1; + +typedef enum { + MOLETTE_DEFILEMENT_AUCUN = 0, + MOLETTE_DEFILEMENT_HAUT = 1, + MOLETTE_DEFILEMENT_BAS = 0xf, + MOLETTE_DEFILEMENT_GAUCHE = 0xe, + MOLETTE_DEFILEMENT_DROITE = 2 +} ModeDefilementSourisPS2; + +typedef struct PaquetSourisPS2_4 { + uint8 ignorer:2; + uint8 bouton5:1; + uint8 bouton4:1; + ModeDefilementSourisPS2 modeDefilement:4; +} PaquetSourisPS2_4; + + +typedef enum { + ETAT_GESTIONNAIRE_SOURIS_PS2_ATTENTE, + ETAT_GESTIONNAIRE_SOURIS_PS2_PAQUET, + ETAT_GESTIONNAIRE_SOURIS_PS2_DIALOGUE +} EtatGestionnaireSourisPS2; + +typedef void (*FonctionRappelSourisPS2) (bool erreur); + +typedef struct DialogueSourisPS2 { + const uint8* sequence; + int longueur; + uint8* parametre; + FonctionRappelSourisPS2 rappel; +} DialogueSourisPS2; + + +typedef struct EtatSourisPS2 { + uint8 resolution; + uint8 frequence; + uint8 mouseID; + uint8 compaqStatusByte; + bool resetPotentiel; + uint8 paquets[4]; + int paquet; + bool paquetsDoiventEtreZero; + bool debordementXY; + DialogueSourisPS2 dialogue; + int etapeDialogue; + EtatGestionnaireSourisPS2 etatGestionnaireSourisPS2; + + /* DEBUG */ + int32 curseur_x; + int32 curseur_y; + uint32 couleur; +} EtatSourisPS2; + +#endif diff --git a/src/inclusions/pc/vesaGraphique/vesaGraphique.h b/src/inclusions/pc/vesaGraphique/vesaGraphique.h new file mode 100644 index 0000000..1b07cd6 --- /dev/null +++ b/src/inclusions/pc/vesaGraphique/vesaGraphique.h @@ -0,0 +1,22 @@ +#ifndef PC_VESA_GRAPHIQUE_VESA_GRAPHIQUE_H +#define PC_VESA_GRAPHIQUE_VESA_GRAPHIQUE_H + +#include + +typedef struct Pixel { + uint32 rvb:24; +} PACKED Pixel; + +typedef struct EtatVesaGraphique { + Pixel* memoireVideo; + Console console; +} EtatVesaGraphique; + + +void setPixel32 (uint32 x, uint32 y, uint32 couleur); +void ligne (uint32 x1, uint32 y1, uint32 x2, uint32 y2, uint32 couleur); +void rectanglePlein (uint32 x1, uint32 x2, uint32 y1, uint32 y2, uint32 couleur); +void rectangleContour (uint32 x1, uint32 x2, uint32 y1, uint32 y2, uint32 couleur); +void vesaGraphiqueAfficherCaractereCouleurPosition(char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y); + +#endif diff --git a/src/inclusions/pc/vgaTexte/vgaTexte.h b/src/inclusions/pc/vgaTexte/vgaTexte.h new file mode 100644 index 0000000..31d63ef --- /dev/null +++ b/src/inclusions/pc/vgaTexte/vgaTexte.h @@ -0,0 +1,38 @@ +#ifndef PC_VGA_TEXTE_VGA_TEXTE_H +#define PC_VGA_TEXTE_VGA_TEXTE_H + +#include + +typedef struct CouleurVgaTexte { + uint8 avClair:1; + uint8 avRouge:1; + uint8 avVert:1; + uint8 avBleu:1; + uint8 _reserve:1; + uint8 arRouge:1; + uint8 arVert:1; + uint8 arBleu:1; +} CouleurVgaTexte; + +typedef struct CaractereVgaTexte { + char caractere; + CouleurVgaTexte couleur; +} PACKED CaractereVgaTexte; + + +typedef struct EtatVgaTexte { + CaractereVgaTexte* memoireVideo; + Console console; +} EtatVgaTexte; + + +void vgaTexteEffacerConsole(); +void vgaTexteAfficherCaractereCouleurPosition(char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y); +uint32 vgaTexteConsoleCouleur(uint32 couleur); +void vgaTexteConsolePosition(int position); + +void consoleNL(); +void afficherCaractereBrut(char caractere); +void afficherCaractere(char caractere); + +#endif diff --git a/src/inclusions/recherche/dichotomique/dichotomique.h b/src/inclusions/recherche/dichotomique/dichotomique.h new file mode 100644 index 0000000..55b26e9 --- /dev/null +++ b/src/inclusions/recherche/dichotomique/dichotomique.h @@ -0,0 +1,9 @@ +#ifndef RECHERCHE_DICHOTOMIQUE_DICHOTOMIQUE_H +#define RECHERCHE_DICHOTOMIQUE_DICHOTOMIQUE_H + +typedef char EtatRechercheDichotomique; + +int rechercheDichotomiquePremier(void* e, void* t, int taille, AccesseurIndex get, ComparaisonStricte comparer); +int rechercheDichotomiqueDernier(void* e, void* t, int taille, AccesseurIndex get, ComparaisonStricte comparer); + +#endif diff --git a/src/inclusions/stockage/ata/ata.h b/src/inclusions/stockage/ata/ata.h new file mode 100644 index 0000000..a081683 --- /dev/null +++ b/src/inclusions/stockage/ata/ata.h @@ -0,0 +1,53 @@ +#ifndef STOCKAGE_ATA_ATA_H +#define STOCKAGE_ATA_ATA_H + +#define PORT_ATA 0x1f0 + +#define PORT_ATA_DONNEES PORT_ATA + 0 + +#define PORT_ATA_ERREUR PORT_ATA + 1 + +#define PORT_ATA_NOMBRE_SECTEURS PORT_ATA + 2 + +#define PORT_ATA_ADRESSE_PARTIELLE_SECTEUR PORT_ATA + 3 +#define PORT_ATA_ADRESSE_PARTIELLE_SECTEUR_1 PORT_ATA_ADRESSE_PARTIELLE_SECTEUR + 0 +#define PORT_ATA_ADRESSE_PARTIELLE_SECTEUR_2 PORT_ATA_ADRESSE_PARTIELLE_SECTEUR + 1 +#define PORT_ATA_ADRESSE_PARTIELLE_SECTEUR_3 PORT_ATA_ADRESSE_PARTIELLE_SECTEUR + 2 + + +#define PORT_ATA_DIVERS PORT_ATA + 6 +#define PORT_ATA_SELECTION_LECTEUR PORT_ATA_DIVERS +#define PORT_ATA_DRAPEAUX PORT_ATA_DIVERS +#define PORT_ATA_FIN_ADRESSE_SECTEUR PORT_ATA_DIVERS + +#define PORT_ATA_COMMANDE_ETAT PORT_ATA + 7 +#define PORT_ATA_COMMANDE PORT_ATA_COMMANDE_ETAT +#define PORT_ATA_ETAT PORT_ATA_COMMANDE_ETAT + +#define PORT_ATA_CONTROLE_ETAT_ALTERNATIF 0x3f6 +#define PORT_ATA_CONTROLE PORT_ATA_CONTROLE_ETAT_ALTERNATIF +#define PORT_ATA_ETAT_ALTERNATIF PORT_ATA_CONTROLE_ETAT_ALTERNATIF + +typedef struct AtaOctetEtat { + bool srv:1; /* TODO : traduire "Overlapped mode service request" */ + bool erreurDisque:1; + bool pret:1; + bool occupe:1; + bool transfertPret:1; + uint8 reserve:2; + bool erreur; +} AtaOctetEtat; + +typedef struct AtaControle { + uint8 reserve_b:1; + bool interruptions:1; + bool reInitialisation:1; + uint8 reserve_a:4; + bool octetHaut:1; +} AtaControle; + + +typedef struct EtatAta { +} EtatAta; + +#endif diff --git a/src/inclusions/string.h b/src/inclusions/string.h new file mode 100644 index 0000000..438d541 --- /dev/null +++ b/src/inclusions/string.h @@ -0,0 +1,23 @@ +#ifndef STRING_H +#define STRING_H + +#include + +int strcmp(StringZ s1, StringZ s2) { + while (*s1 == *s2 && *s1 != 0) { + s1++; + s2++; + } + if (*s1 == *s2) + return 0; + else if (*s1 < *s2) + return -1; + else + return 1; +} + +bool streq(StringZ s1, StringZ s2) { + return (strcmp(s1,s2) == 0); +} + +#endif diff --git a/src/inclusions/temps/temps/temps.h b/src/inclusions/temps/temps/temps.h new file mode 100644 index 0000000..e053f37 --- /dev/null +++ b/src/inclusions/temps/temps/temps.h @@ -0,0 +1,26 @@ +#ifndef TEMPS_TEMPS_TEMPS_H +#define TEMPS_TEMPS_TEMPS_H + +typedef void (*FonctionRappel) (); + +typedef struct Echeance { + uint64 dateEcheance; + FonctionRappel fonction; + struct Echeance* echeanceSuivante; +} Echeance; + +typedef struct EtatTemps { + uint32 increments; /* 1..10^9 Nombre de nanosecondes entre chaque 'tic' d'horloge. */ + + uint32 nanosec; /* nanosecondes depuis la dernière seconde entière. */ + uint64 sec; /* secondes depuis le 01/01/1970 à 00h00 . */ + uint64 delta; /* Décalage connu à rattrapper / ralentir progressivement . */ + uint64 etapesDelta; /* Rattrapper le décalage en combien de nanosecondes ? */ + + Echeance* listeEcheancesDate; /* Tiennent compte immédiatement (ou pas ?) de delta */ + Echeance* listeEcheancesDelai; /* Ne tiennent pas compte de delta */ + + uint64 debug; /* DEBUG */ +} EtatTemps; + +#endif diff --git a/src/inclusions/tri/tas/tas.h b/src/inclusions/tri/tas/tas.h new file mode 100644 index 0000000..7f251e2 --- /dev/null +++ b/src/inclusions/tri/tas/tas.h @@ -0,0 +1,8 @@ +#ifndef TRI_TAS_TAS_H +#define TRI_TAS_TAS_H + +typedef char EtatTriParTas; + +void triParTas(void* t, int taille, AccesseurIndex get, AccesseurEchanger echanger, Comparaison comparer); + +#endif diff --git a/src/inclusions/types.h b/src/inclusions/types.h new file mode 100644 index 0000000..e1cbeb2 --- /dev/null +++ b/src/inclusions/types.h @@ -0,0 +1,59 @@ +#ifndef TYPES_H +#define TYPES_H + +/* Types simples */ +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef unsigned int uint32; +typedef unsigned long long uint64; + +typedef int int32; + +typedef enum { + TRUE = 1, + FALSE = 0 +} bool; + + +/* Types composés */ +#define CAST_STRUCT_TO_INT(_struct) (*((int*)((void*)(&_struct)))) +#define CAST_INT_TO_STRUCT(_int, _struct_t) (*((_struct_t*)((void*)(&_int)))) + +typedef struct Liste { + void* car; + struct Liste* cdr; +} Liste; + +typedef char* String; +typedef String StringZ; + +#define LONGUEUR(t) (sizeof (t) / sizeof (*(t))) + + +/* Attributs */ +#define ALIGNED(alignement) __attribute__ ((aligned(alignement))) +#define PACKED __attribute__ ((packed)) +#define USED __attribute__ ((used)) +#define SECTION(sec) __attribute__ ((section(#sec))) + + +/* Constantes */ +#define NULL (void*)0 + + +/* Prototypes de fonctions */ + +/* Comparaison ComparaisonStricte + * a < b : return <0 <0 + * a = b : return peu importe =0 + * a > b : return >=0 >0 */ +typedef int (Comparaison)(void* a, void* b); + +typedef Comparaison ComparaisonStricte; + +typedef void* (AccesseurIndex)(void* t, uint32 index); + +typedef void (AccesseurEchanger)(void* t, uint32 a, uint32 b); + + +#endif diff --git a/src/makefiles/affichage.makefile b/src/makefiles/affichage.makefile new file mode 100644 index 0000000..857c88a --- /dev/null +++ b/src/makefiles/affichage.makefile @@ -0,0 +1,42 @@ +VIDE = + +# Couleurs +COULEUR = [$(1)m +COULEUR_AUCUNE = $(call COULEUR,) +COULEUR_BLEU_CLAIR = $(call COULEUR,1;34) +COULEUR_VERT_CLAIR = $(call COULEUR,1;32) +COULEUR_GRIS = $(call COULEUR,1;30) +COULEUR_JAUNE_CLAIR = $(call COULEUR,1;33) +COULEUR_VERT_FONCE = $(call COULEUR,0;32) + +COULEUR_SOURCE = $(COULEUR_BLEU_CLAIR) +COULEUR_DEST = $(COULEUR_VERT_FONCE) +COULEUR_TAG = $(COULEUR_GRIS) +COULEUR_TAG_CC = $(COULEUR_VERT_FONCE) +COULEUR_TAG_AS = $(COULEUR_TAG_CC) +COULEUR_TAG_LD = $(COULEUR_BLEU_CLAIR) +COULEUR_TAG_CD = $(COULEUR_JAUNE_CLAIR) +COULEUR_TAG_TT = $(COULEUR_VERT_CLAIR) + +# Apparence +FORMAT_TAG = $(COULEUR_TAG)[$(call COULEUR_TAG_$(1))$(1)$(COULEUR_TAG)]$(COULEUR_AUCUNE) $(VIDE) +FORMAT_FLECHE = $(VIDE) <- $(VIDE) +FORMAT_SOURCE = $(COULEUR_SOURCE)$(call FORMAT_CHEMIN,$(1))$(COULEUR_AUCUNE) +FORMAT_DEST = $(COULEUR_DEST)$(call FORMAT_CHEMIN,$(1))$(COULEUR_AUCUNE) + +FORMAT_CHEMIN = $(subst //,/,$(1)) + +FORMAT_ACTION_1 = $(call FORMAT_TAG,$(1))$(call FORMAT_DEST,$(2)) +FORMAT_ACTION_2 = $(call FORMAT_ACTION_1,$(1),$(3))$(FORMAT_FLECHE)$(call FORMAT_SOURCE,$(2)) + +# Fonctions d'affichage +AFFICHE = echo "$(1)" + +AFFICHE_ACTION = $(call AFFICHE,$(call FORMAT_ACTION_$(1),$(2),$(3),$(4))) + +AFFICHE_CC = $(call AFFICHE_ACTION,2,CC,$(1),$(notdir $(2))) +AFFICHE_AS = $(call AFFICHE_ACTION,2,AS,$(1),$(notdir $(2))) +AFFICHE_FN = $(call AFFICHE_ACTION,2,FN,$(1),$(notdir $(2))) +AFFICHE_LD = $(call AFFICHE_ACTION,2,LD,$(notdir $(1)),$(notdir $(2))) +AFFICHE_CD = $(call AFFICHE_ACTION,1,CD,$(1)) +AFFICHE_TT = $(call AFFICHE_ACTION,1,TT,$(1)) diff --git a/src/makefiles/commandes.makefile b/src/makefiles/commandes.makefile new file mode 100644 index 0000000..200a810 --- /dev/null +++ b/src/makefiles/commandes.makefile @@ -0,0 +1,37 @@ +CC := gcc +CC_OPTS := -Werror -Wall -Wextra \ + -nostdlib -nostdinc -ffreestanding -undef \ + -O3 -fomit-frame-pointer \ + -fno-strict-aliasing \ + -std=gnu99 -fasm \ + -frandom-seed=1234 + # -fextended-identifiers ? + # -finput-charset=utf-8 ? +CC_INCLUSIONS = $(patsubst %,-I%,$(REP_INCLUSIONS)) + +LD := ld +LD_OPTS := --warn-common --fatal-warnings \ + -nostdlib + +FN := $(REP_SCRIPTS)/creerPolice.sh +FN_OPTS := + +EMU := qemu +EMU_OPTS := -m 4 --full-screen + +GEN_ISO := genisoimage + +GEN_ISO_OPTS := -R -boot-load-size 4 -no-emul-boot -b boot/grub/stage2_eltorito -boot-info-table -c boot/boot.cat \ + -input-charset utf-8 -quiet \ + +RM := rm +RM_OPTS := + +CAT := cat +CAT_OPTS := + +MKDIR := mkdir +MKDIR_OPTS := -p + +CREATE_FILE := touch +CREATE_FILE_OPTS := diff --git a/src/makefiles/fichiersDossiers.makefile b/src/makefiles/fichiersDossiers.makefile new file mode 100644 index 0000000..d531e58 --- /dev/null +++ b/src/makefiles/fichiersDossiers.makefile @@ -0,0 +1,37 @@ +REP_SOURCES := ./src + +REP_TRAVAIL := ./travail + +REP_DIST := ./dist + +REP_INCLUSIONS := $(REP_SOURCES)/inclusions + +REP_SCRIPTS := $(REP_SOURCES)/scripts + +REP_A_SUPPRIMER := $(REP_TRAVAIL) $(REP_DIST) + + + +IMAGE_CDROM := $(REP_DIST)/cdrom/gruntnetwork.iso + +NOYAU_ELF := $(REP_DIST)/noyau.elf + +POLICE_FNT := $(REP_DIST)/police.fnt + +SCRIPT_LD := $(REP_SCRIPTS)/creerImage.lds + +LISTE_FICHIERS_ISO := $(REP_SCRIPTS)/liste-chemins.lst + + + +FICHIERS_ISO := $(shell cut -d '=' -f 2- $(LISTE_FICHIERS_ISO)) + +SOURCES := $(shell find $(REP_SOURCES) -name '*.c' -or -name '*.S' -or -name '*.fnt') + +OBJETS := $(patsubst %,$(REP_TRAVAIL)/%.o,$(SOURCES)) + +OBJETS_LD := $(filter %.c.o %.S.o,$(OBJETS)) + +OBJETS_FNT := $(filter %.fnt.o,$(OBJETS)) + +DEPENDANCES := $(patsubst %.o,%.d,$(OBJETS)) diff --git a/src/makefiles/regles.makefile b/src/makefiles/regles.makefile new file mode 100644 index 0000000..294c1f8 --- /dev/null +++ b/src/makefiles/regles.makefile @@ -0,0 +1,53 @@ +.PHONY: all +all: $(IMAGE_CDROM) + +.PHONY: clean +clean: + @echo " Suppression..." + @$(RM) $(RM_OPTS) -rf $(REP_A_SUPPRIMER) + @$(MKDIR) $(MKDIR_OPTS) $(REP_A_SUPPRIMER) + rmdir ./travail ./dist + mkdir ./travail ./dist + +.PHONY: test +test: $(IMAGE_CDROM) + @$(call AFFICHE_TT,$<,$@) + @sync + @$(EMU) $(EMU_OPTS) -cdrom $< -boot d + + + +-include $(DEPENDANCES) + + + +$(IMAGE_CDROM): $(FICHIERS_ISO) + @$(call AFFICHE_CD,$^,$@) + @$(MKDIR) $(MKDIR_OPTS) $(dir $@) + @$(GEN_ISO) $(GEN_ISO_OPTS) -o $@ -graft-points -path-list $(LISTE_FICHIERS_ISO) + +$(POLICE_FNT): $(OBJETS_FNT) + @$(CAT) $(CAT_OPTS) $^ > $@ + +$(NOYAU_ELF): $(OBJETS_LD) + @$(call AFFICHE_LD,$^,$@) + @$(LD) $(LD_OPTS) -o $(NOYAU_ELF) -T $(SCRIPT_LD) $^ + + + +.PRECIOUS: %.dir +%.dir: + @$(MKDIR) $(MKDIR_OPTS) $(dir $@) + @$(CREATE_FILE) $(CREATE_FILE_OPTS) $@ + +$(REP_TRAVAIL)/%.c.o: %.c $(REP_TRAVAIL)/%.dir $(MAKEFILES) + @$(call AFFICHE_CC,$<,$@) + @$(CC) $(CC_OPTS) -MMD -MF $(@:.o=.d) $(CC_INCLUSIONS) -c $< -o $@ + +$(REP_TRAVAIL)/%.S.o: %.S $(REP_TRAVAIL)/%.dir $(MAKEFILES) + @$(call AFFICHE_AS,$<,$@) + @$(CC) $(CC_OPTS) -MMD -MF $(@:.o=.d) $(CC_INCLUSIONS) -c $< -o $@ -DASM + +$(REP_TRAVAIL)/%.fnt.o: %.fnt $(REP_TRAVAIL)/%.dir $(MAKEFILES) $(FN) + @$(call AFFICHE_FN,$<,$@) + @$(FN) $(FN_OPTS) $< $@ diff --git a/src/modules/algo/math/math.c b/src/modules/algo/math/math.c new file mode 100644 index 0000000..a22f593 --- /dev/null +++ b/src/modules/algo/math/math.c @@ -0,0 +1,39 @@ +#include +#include +#include + +MODULE(Math); + +/* denominateur < 2^63 */ +Div64 div64 (uint64 numerateur, uint64 denominateur) { + uint64 reste = 0; + uint64 quotient = 0; + Div64 resultat; + + int i; + for (i = 0; i < 64; i++) { + quotient <<= 1; + reste <<= 1; + reste |= (numerateur & 0x8000000000000000L) ? 1 : 0; + numerateur <<= 1; + if (reste >= denominateur) { + quotient |= 1; + reste -= denominateur; + } + } + + resultat.quotient = quotient; + resultat.reste = reste; + + return resultat; +} + + + +void initMath (void** etat) { + *etat = etatMath; +} + +void deinitMath (void** etat) { + *etat = NULL; +} diff --git a/src/modules/demarrage/multiboot/multiboot.S b/src/modules/demarrage/multiboot/multiboot.S new file mode 100644 index 0000000..b8da44e --- /dev/null +++ b/src/modules/demarrage/multiboot/multiboot.S @@ -0,0 +1,31 @@ +.section .multiboot +.set magicEnTeteMultiboot, 0x1badb002 +.set optionsEnTeteMultiboot, 4 +.set sommeControleEnTeteMultiboot, -(magicEnTeteMultiboot + optionsEnTeteMultiboot) +.set taillePile, 4096 + +.align 4 +.long magicEnTeteMultiboot +.long optionsEnTeteMultiboot +.long sommeControleEnTeteMultiboot +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 1024 +.long 768 +.long 24 + +.section .text +.globl _start +_start: + mov $(stack+taillePile), %esp + + push %eax + push %ebx + + call pointEntreeNoyau + +.comm stack, taillePile, 4 diff --git a/src/modules/demarrage/multiboot/multiboot.c b/src/modules/demarrage/multiboot/multiboot.c new file mode 100644 index 0000000..a525c08 --- /dev/null +++ b/src/modules/demarrage/multiboot/multiboot.c @@ -0,0 +1,214 @@ +#include +#include +#include + +#include +#include +#include +#include + +MODULE(Multiboot); + +DEPENDANCE_MODULE(Multiboot, Console); + +/* __listeModule et __finListeModules sont définis dans modules/creerImage.lds */ + +extern InfoModule __listeModules; +extern InfoModule __finListeModules; + +extern DependanceModule __listeDependancesModules; +extern DependanceModule __finListeDependancesModules; + + +void afficherNomModule(InfoModule* module) { + CouleurAvAr ancienneCouleur = consoleCouleur(0x00ff00ff, 0); + afficherChaineZ(module->nom); + afficherChaineZ("\n"); + consoleCouleur(ancienneCouleur.av, ancienneCouleur.ar); +} + +void afficherNomsModulesManques(InfoModule* listeModules) { + // effacerConsole(); /* Seulement en mode texte, en mode graphique, l'écran est déjà noir... */ + InfoModule* module = listeModules; + + while (module != NULL) { + if (module->etapeChargementModule == ETAPE_MODULE_INITIALISE) + afficherNomModule(module); + module = module->suivant; + } +} + + +void* triDependancesGet(void* t, uint32 index) { + return ((DependanceModule*)t) + index; +} + +void triDependancesEchange(void* t, uint32 a, uint32 b) { + DependanceModule* tt = t; + DependanceModule c; + + c = tt[a]; + tt[a] = tt[b]; + tt[b] = c; +} + +int triDependancesCmp(void* a, void* b) { + void* aa = ((DependanceModule*)a)->module; + void* bb = ((DependanceModule*)b)->module; + + if (aa < bb) + return -1; + else if (aa == bb) + return 0; + else + return 1; +} + +void pointEntreeNoyau(void* addrInfoMultiboot, uint32 magicMultiboot) { + asm volatile ("cli"); + + int nbModules = 0; + InfoModule* module; + InfoModule* moduleTemp; + InfoModule* listeModules = &__listeModules; + InfoModule* finListeModules = &__finListeModules; + + int i; + int nbDependancesModules; + int premiereDependanceModule; + int derniereDependanceModule; + DependanceModule dependanceRecherchee; + DependanceModule* dependanceModule; + DependanceModule* listeDependancesModules = &__listeDependancesModules; + DependanceModule* finListeDependancesModules = &__finListeDependancesModules; + + /* Pré-initialisation de l'état du module multiboot */ + etatMultiboot->InfoMultiboot = addrInfoMultiboot; + etatMultiboot->magicMultiboot = magicMultiboot; + + + /* Tri de la liste de dépendances */ + nbDependancesModules = ((int)finListeDependancesModules - (int)listeDependancesModules) / sizeof(DependanceModule); + triParTas( + listeDependancesModules, + nbDependancesModules, + triDependancesGet, + triDependancesEchange, + triDependancesCmp + ); + + /* Chaînage des modules */ + nbModules = ((int)finListeModules - (int)listeModules) / sizeof(InfoModule); + module = listeModules; + while (module < finListeModules) { + module->suivant = module + 1; + + dependanceRecherchee = (DependanceModule){ module, NULL }; + premiereDependanceModule = rechercheDichotomiquePremier( + &dependanceRecherchee, + listeDependancesModules, + nbDependancesModules, + triDependancesGet, + triDependancesCmp + ); + + if (premiereDependanceModule < 0) { + module->dependances = NULL; + module->nbDependances = -1; + } else { + derniereDependanceModule = rechercheDichotomiqueDernier( + &dependanceRecherchee, + listeDependancesModules, + nbDependancesModules, + triDependancesGet, + triDependancesCmp + ); + module->dependances = listeDependancesModules + premiereDependanceModule; + module->nbDependances = derniereDependanceModule - premiereDependanceModule + 1; + } + + module++; + } + if (nbModules != 0) + (module-1)->suivant = NULL; + + + /* Initialisation des modules */ + module = (nbModules != 0) ? listeModules : NULL; + bool consoleDisponible = FALSE; + /* GCC BUG : + * + * while ((void*)module != (void*)NULL) { + * ... + * } + * + * Lorsqu'on regarde la sortie assembleur de GCC, on voit qu'il teste + * avant l'entrée dans la boucle s'il doit l'éviter, après quoi aucune + * instruction ne permet d'en sortir. Ce qui explique le fonctionnement + * incorrect du programme à l'exécution. De plus, on se rend compte + * avec des comparaisons ( < , = , > ) qu'il semble considérer que + * 1 < module < 2 (donc on a un pointeur flottant \o/ ). Vu qu'il y a + * très peu de chances pour que l'info sur un module soit située à 1 (!), + * on utilise ((void*)module > (void*)(1)) . */ + + while ((void*)module > (void*)(1)) { + if (module->etapeChargementModule != ETAPE_MODULE_INITIALISE) { + dependanceModule = module->dependances; + + for (i = 0; i < module->nbDependances; i++) { + if (dependanceModule->dependance->etapeChargementModule != ETAPE_MODULE_INITIALISE) { + dependanceModule->dependance->suivantRecursionDependances = module; + module = dependanceModule->dependance; + goto finBoucleInitialisationModules; + } + dependanceModule++; + } + + + if (consoleDisponible) + afficherNomModule(module); + + + (*(module->init)) (module->etat); + module->etapeChargementModule = ETAPE_MODULE_INITIALISE; + + if (!consoleDisponible && consolePrete()) { + consoleDisponible = TRUE; + afficherNomsModulesManques(listeModules); + } + } + + + if (module->suivantRecursionDependances != NULL) { + moduleTemp = module->suivantRecursionDependances; + module->suivantRecursionDependances = NULL; + module = moduleTemp; + } else { + module = module->suivant; + } + + finBoucleInitialisationModules: + {} /* Fausse instruction pour éviter un "error: label at end of compound statement" */ + } + + + /* Fin */ + afficherChaineZ("\n\n"); + + for (;;) asm volatile ("hlt;"); +} + + +void initMultiboot(void** etat) { + *etat = etatMultiboot; + + /* if (etatMultiboot->InfoMultiboot->flags.bootLoaderName) { + afficherChaineZ("Charg" STR_eacute " par "); + afficherChaineZ(etatMultiboot->InfoMultiboot->bootLoaderName); + afficherChaineZ(".\n"); + } */ +} + +void deinitMultiboot(void** etat) { + *etat = NULL; +} diff --git a/src/modules/interfaceUtilisateur/clavier/clavier.c b/src/modules/interfaceUtilisateur/clavier/clavier.c new file mode 100644 index 0000000..5b6a460 --- /dev/null +++ b/src/modules/interfaceUtilisateur/clavier/clavier.c @@ -0,0 +1,26 @@ +#include +#include +#include +#include +#include + +MODULE(Clavier); + +DEPENDANCE_MODULE(Clavier, Kbc); +DEPENDANCE_MODULE(Clavier, Console); + + +void gestionnaireClavier(uint8 scancode) { + afficherEntierEnHexa(scancode); + afficherChaineZ("\n"); +} + +void initClavier (void** etat) { + *etat = NULL; + + definirGestionnaireClavier(gestionnaireClavier); +} + +void deinitClavier (void** etat) { + *etat = NULL; +} diff --git a/src/modules/interfaceUtilisateur/console/console.c b/src/modules/interfaceUtilisateur/console/console.c new file mode 100644 index 0000000..d373926 --- /dev/null +++ b/src/modules/interfaceUtilisateur/console/console.c @@ -0,0 +1,245 @@ +#include +#include +#include + +MODULE(Console); + +/* Cette variable risque d'être utilisée avant l'apel de initConsole(), + * donc on la déclare à l'extérieur de etatConsole, dont la valeur est + * indéfinie tant que initConsole n'a pas été apellée. */ +static bool _consolePrete; + + +Console* definirConsoleActive(Console* console) { + Console* ancienneConsole = etatConsole->consoleActive; + + ancienneConsole->x = etatConsole->x; + ancienneConsole->y = etatConsole->y; + + etatConsole->x = console->x; + etatConsole->y = console->y; + + etatConsole->consoleActive = console; + + _consolePrete = TRUE; + return ancienneConsole; +} + + +CouleurAvAr getConsoleCouleur() { + CouleurAvAr couleurs; + couleurs.av = etatConsole->couleurAv; + couleurs.ar = etatConsole->couleurAr; + return couleurs; +} + +CouleurAvAr consoleCouleur(Couleur couleurAv, Couleur couleurAr) { + CouleurAvAr couleurs = getConsoleCouleur(); + + etatConsole->couleurAv = couleurAv; + etatConsole->couleurAr = couleurAr; + + return couleurs; +} + + +Position getConsolePosition() { + Position pos; + pos.x = etatConsole->x; + pos.y = etatConsole->y; + return pos; +} + +Position consolePosition(uint32 x, uint32 y) { + Position pos = getConsolePosition(); + + if (x >= etatConsole->consoleActive->largeur) { + x %= etatConsole->consoleActive->largeur; + y++; + } + + if (y >= etatConsole->consoleActive->hauteur) { + y %= etatConsole->consoleActive->hauteur; + } + + etatConsole->x = x; + etatConsole->y = y; + + return pos; +} + +void consolePositionAvancerX() { + consolePosition(etatConsole->x + 1, etatConsole->y); +} + +void consolePositionAvancerY() { + consolePosition(etatConsole->x, etatConsole->y + 1); +} + + +void afficherCaractereCouleurPositionBrut(char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y) { + etatConsole->consoleActive->fonctionAffichage(caractere, couleurAv, couleurAr, x, y); + + consolePositionAvancerX(); + + consoleCouleur(couleurAv, couleurAr); +} + +void afficherCaractereCouleurPosition(char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y) { + if (caractere == '\n') + consolePosition(0, etatConsole->y + 1); + else + afficherCaractereCouleurPositionBrut(caractere, couleurAv, couleurAr, x, y); +} + + +void afficherCaractere(char caractere) { + afficherCaractereCouleurPosition(caractere, etatConsole->couleurAv, etatConsole->couleurAr, etatConsole->x, etatConsole->y); +} + +void afficherCaractereBrut(char caractere) { + afficherCaractereCouleurPositionBrut(caractere, etatConsole->couleurAv, etatConsole->couleurAr, etatConsole->x, etatConsole->y); +} + + +void afficherCaractereCouleur(char caractere, uint32 couleurAv, uint32 couleurAr) { + afficherCaractereCouleurPosition(caractere, couleurAv, couleurAr, etatConsole->x, etatConsole->y); +} + +void afficherCaractereCouleurBrut(char caractere, uint32 couleurAv, uint32 couleurAr) { + afficherCaractereCouleurPositionBrut(caractere, couleurAv, couleurAr, etatConsole->x, etatConsole->y); +} + + +void afficherCaracterePosition(char caractere, uint32 x, uint32 y) { + afficherCaractereCouleurPosition(caractere, etatConsole->couleurAv, etatConsole->couleurAr, x, y); +} + +void afficherCaracterePositionBrut(char caractere, uint32 x, uint32 y) { + afficherCaractereCouleurPositionBrut(caractere, etatConsole->couleurAv, etatConsole->couleurAr, x, y); +} + + +void effacerConsole() { + uint32 x, y; + consoleCouleur(0xffffffff, 0); + for (x=0; x < etatConsole->consoleActive->largeur; x++) + for (y=0; y < etatConsole->consoleActive->hauteur; y++) + afficherCaracterePosition(' ', x, y); + consolePosition(0, 0); +} + +void afficherChaineZ(char* chaine) { + while (*chaine) + afficherCaractere(*(chaine++)); +} + +void afficherChaine(char* chaine, int longueur) { + while (longueur-- > 0) + afficherCaractere(*(chaine++)); +} + +void afficherEntierVirguleEnDecimal(uint32 entier, int32 nbDecimales) { + int pos, nbChar = sizeof(int)*4 + 1; + char chiffres[nbChar]; + + for (pos = 0; (pos < nbChar) && ((nbDecimales >= 0) || (entier != 0)); nbDecimales--, pos++) { + if (nbDecimales == 0) + chiffres[pos++]='.'; + chiffres[pos] = 48 + (entier % 10); + entier /= 10; + } + + if (pos == 0) + afficherCaractere('0'); + else + for (pos--; pos >= 0; pos--) + afficherCaractere(chiffres[pos]); +} + +void afficherEntierEnDecimal(uint32 entier) { + int pos, nbChar = sizeof(int)*4; + char chiffres[nbChar]; + + for (pos = 0; (pos < nbChar) && (entier != 0); pos++) { + chiffres[pos] = 48 + (entier % 10); + entier /= 10; + } + + if (pos == 0) + afficherCaractere('0'); + else + for (pos--; pos >= 0; pos--) + afficherCaractere(chiffres[pos]); +} + +void afficherEntierEnHexa(uint32 entier) { + afficherCaractere('0'); + afficherCaractere('x'); + + int pos, nbChar = sizeof(entier)*2; + char hexa[nbChar]; + + for (pos = 0; pos < nbChar; pos++) { + if ((entier % 16) < 10) + hexa[pos] = 48 + (entier % 16); + else + hexa[pos] = 87 + (entier % 16); + entier /= 16; + } + + for (pos--; pos >= 0; pos--) + afficherCaractere(hexa[pos]); +} + +void afficherEntierEnBinaire(uint32 entier) { + int pos = 0; + for (pos = 0; pos < 32; pos++) { + if (entier & 0x80000000) + afficherChaineZ("1"); + else + afficherChaineZ("0"); + entier = entier << 1; + } +} + + +void afficherTableCaracteres() { + int i; + for (i = 0; i < 256; i++) + afficherCaractereBrut(i); +} + + +void fonctionAffichageVide (char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y) { + caractere = caractere; + couleurAv = couleurAv; + couleurAr = couleurAr; + x = x; + y = y; +} + +Console consoleVide = { + .largeur = 80, + .hauteur = 25, + .fonctionAffichage = fonctionAffichageVide +}; + +bool consolePrete() { + return _consolePrete; +} + +void initConsole(void** etat) { + *etat = etatConsole; + + etatConsole->x = 0; + etatConsole->y = 0; + etatConsole->couleurAv = 0xffffffff; + etatConsole->couleurAr = 0x00000000; + definirConsoleActive(&consoleVide); + _consolePrete = FALSE; +} + +void deinitConsole(void** etat) { + *etat = NULL; +} diff --git a/src/modules/interfaceUtilisateur/demo/demo.c b/src/modules/interfaceUtilisateur/demo/demo.c new file mode 100644 index 0000000..cfeef76 --- /dev/null +++ b/src/modules/interfaceUtilisateur/demo/demo.c @@ -0,0 +1,278 @@ +#include +#include +#include +#include +#include +#include +#include + +MODULE(Demo); + +DEPENDANCE_MODULE(Demo, Police); +DEPENDANCE_MODULE(Demo, VesaGraphique); +DEPENDANCE_MODULE(Demo, VgaTexte); +DEPENDANCE_MODULE(Demo, Clavier); + +void demoAffiche(uint32 x1, uint32 y1) { + uint32 fg1 = 0x00880044; + uint32 fg2 = 0x00770055; + uint32 fg3 = 0x00550077; + uint32 fg4 = 0x00440088; + uint32 bg = 0x00ffcccc; + uint32 ctr = 0x00886666; + + policeAfficherCaractereCouleurPosition('L', fg1, bg, x1, y1); + policeAfficherCaractereCouleurPosition('y', fg2, bg, x1 + 8, y1); + policeAfficherCaractereCouleurPosition('r', fg3, bg, x1 + 2*8, y1); + policeAfficherCaractereCouleurPosition('a', fg4, bg, x1 + 3*8, y1); + + rectangleContour (x1 - 1, y1 - 2, x1+(4*8) + 2, y1+15 + 1, ctr); +} + +void faireDemo () { + int32 x1 = 1024/2-8*2; + int32 y1 = 768/2-15/2; + + int32 ac1 = 0x00ff0000; + int32 ac2 = 0x000000ff; + int32 dc1 = 50; + int32 dc2 = 50; + int32 c = ac1; + int32 x2 = 0; + int32 y2 = 768 / 2; + int32 x3 = x2; + int32 y3 = y2; + int32 dx = 3; + int32 dy = 7; + int32 ddx = 1; + int32 ddy = 1; + + while (FALSE) { + demoAffiche(x1, y1); + asm volatile ("hlt"); + asm volatile ("hlt"); + rectanglePlein (x1 - 1, y1 - 2, x1+(4*8) + 2, y1+15 + 1, 0); + + x1 = ((x1 + x1*x1*y1 + y1*3 + 7) % (1024 - 4*8 + 3)) + 1; + y1 = ((y1 + y1*y1*x1 + x1*3 + 42) % (768 - 15 + 3)) + 2; + + dc1 = dc1 + dy / 10; + dc2 = dc1 + dx / 5; + c = dc1 * ac1 + dc2 * ac2; + x3 = x2 + dx; + y3 = y2 + dy; + dx += abs(ddx - 3) - 1; + dy += abs(ddy - 5) - 2; + ddx = (ddx + 1) % 6; + ddy = (ddy + 1) % 10; + + if (x3 >= 1024) { + x3 = 1024 - (x3 % 1024); + dx = -dx; + } + if (y3 >= 768) { + y3 = 768 - (y3 % 768); + dy = -dy; + } + + if (x3 < 0) { + x3 = abs(x3) % 1024; + dx = -dx; + } + if (y3 < 0) { + y3 = abs(y3) % 768; + dy = -dy; + } + + ligne(x2, y2, x3, y3, c); + + x2 = x3; + y2 = y3; + } + + { + int32 alx1 = 1024/2-8*2; + int32 aly1 = 768/2-15/2; + int32 lx1 = alx1; + int32 ly1 = aly1; + int32 lx2 = lx1; + int32 ly2 = ly1; + + uint32 i, compteur = 0, compteur2 = 0; + int32 angle=0; + int32 dangle=3; + int32 ddangle=0; + int32 x1 = 100; + int32 y1 = 768/2; + int32 x2 = x1; + int32 y2 = y1; + int32 ax = lx2; // 1024-100; + int32 ay = ly2; // 768/2; + int32 v = 15; + int32 dx, dy, adx1, ady1, adx2, ady2; + int32 cx1 = 9; + int32 cy1 = 9; + int32 colmod; + + + + int32 noiralx1 = 1024/2-8*2; + int32 noiraly1 = 768/2-15/2; + int32 noirlx1 = noiralx1; + int32 noirly1 = noiraly1; + int32 noirlx2 = noirlx1; + int32 noirly2 = noirly1; + + uint32 noiri, noircompteur = 0, noirprecompteur = 0, noircompteur2 = 0; + int32 noirangle=0; + int32 noirdangle=3; + int32 noirddangle=0; + int32 noirx1 = 100; + int32 noiry1 = 768/2; + int32 noirx2 = noirx1; + int32 noiry2 = noiry1; + int32 noirax = noirlx2; // 1024-100; + int32 noiray = noirly2; // 768/2; + int32 noirv = 15; + int32 noirdx, noirdy, noiradx1, noirady1, noiradx2, noirady2; + int32 noircx1 = 9; + int32 noircy1 = 9; + + while (TRUE) { + // demoAffiche(lx2, ly2); + compteur2++; + compteur = compteur2 / 4; + + // if (compteur2 % 4 == 0) + // asm volatile ("hlt"); + // else + { int t; for (t = 0; t < 1000000; t++) asm volatile ("nop"); } + + // lx2 += sign(alx1-lx2); + // ly2 += sign(aly1-ly2); + lx2 = alx1; + ly2 = aly1; + + rectanglePlein (lx1 - 1, ly1 - 2, lx1+(4*8) + 2, ly1+15 + 1, 0); + demoAffiche(lx2, ly2); + + lx1 = lx2; + ly1 = ly2; + + alx1 = (1024 - 96)/2 + 32 + (1024 - 64) * sinRapide(compteur2 * (2<<7) ) / (2<<15); + aly1 = (768 - 80)/2 + 32 + (768 - 48) * cosRapide(compteur2 * (2<<4)*3) / (2<<15); + + + for (i = 0; i < 2000; i += dx*dx + dy*dy) { + ax = alx1; + ay = aly1; + + adx1 = v * cosRapide(angle) / (2<<15); + ady1 = v * sinRapide(angle) / (2<<15); + + adx2 = (ax-x2) / 100; + ady2 = (ay-y2) / 100; + + dx = (cx1*adx1 + (10-cx1)*adx2) / 10; + dy = (cy1*ady1 + (10-cy1)*ady2) / 10; + + x2 += dx; + y2 += dy; + + dangle += abs(ddangle - 4) - 2; + // dangle++; + angle += dangle*16; + + colmod = 0xcc / 2 + (0xcc * sinRapide(compteur * (2<<4)*15) / (2<<15)); + if ((x1 > 0) && (x1 < 1024) && + (x2 > 0) && (x2 < 1024) && + (y1 > 0) && (y1 < 768) && + (y2 > 0) && (y2 < 768)) + ligne(x1,y1,x2,y2,0x00ff0000 | (colmod << 8) | colmod); + + x1 = x2; + y1 = y2; + } + if (compteur2 % 4 == 0) + ddangle = (ddangle + 1) % 8; + + + + + + if (noirprecompteur <= 15) { + noirprecompteur++; + } else { + + noircompteur2++; + noircompteur = noircompteur2 / 4; + + // noirlx2 += sign(noiralx1-noirlx2); + // noirly2 += sign(noiraly1-noirly2); + noirlx2 = noiralx1; + noirly2 = noiraly1; + + //// rectanglePlein (noirlx1 - 1, noirly1 - 2, noirlx1+(4*8) + 2, noirly1+15 + 1, 0); + //// demoAffiche(noirlx2, noirly2); + + noirlx1 = noirlx2; + noirly1 = noirly2; + + noiralx1 = (1024 - 96)/2 + 32 + (1024 - 64) * sinRapide(noircompteur2 * (2<<7) ) / (2<<15); + noiraly1 = (768 - 80)/2 + 32 + (768 - 48) * cosRapide(noircompteur2 * (2<<4)*3) / (2<<15); + + + for (noiri = 0; noiri < 2000; noiri += noirdx*noirdx + noirdy*noirdy) { + noirax = noiralx1; + noiray = noiraly1; + + noiradx1 = noirv * cosRapide(noirangle) / (2<<15); + noirady1 = noirv * sinRapide(noirangle) / (2<<15); + + noiradx2 = (noirax-noirx2) / 100; + noirady2 = (noiray-noiry2) / 100; + + noirdx = (noircx1*noiradx1 + (10-noircx1)*noiradx2) / 10; + noirdy = (noircy1*noirady1 + (10-noircy1)*noirady2) / 10; + + noirx2 += noirdx; + noiry2 += noirdy; + + noirdangle += abs(noirddangle - 4) - 2; + // dangle++; + noirangle += noirdangle*16; + + if ((noirx1 > 0) && (noirx1 < 1024) && + (noirx2 > 0) && (noirx2 < 1024) && + (noiry1 > 0) && (noiry1 < 768) && + (noiry2 > 0) && (noiry2 < 768)) + ligne(noirx1,noiry1,noirx2,noiry2,0); + + noirx1 = noirx2; + noiry1 = noiry2; + } + if (noircompteur2 % 4 == 0) + noirddangle = (noirddangle + 1) % 8; + + } // if noirprecompteur <= 10 + } + } +} + +void demoNombres() { + int i; + for (i = 0; i <= 10; i++) { + afficherEntierEnDecimal(i); + afficherChaineZ(" "); + } + afficherChaineZ("\n"); +} + + +void initDemo(void** etat) { + *etat = NULL; +} + +void deinitDemo(void** etat) { + *etat = NULL; +} diff --git a/src/modules/interfaceUtilisateur/police/8x15/,.png b/src/modules/interfaceUtilisateur/police/8x15/,.png new file mode 100644 index 0000000..8261149 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/,.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/..png b/src/modules/interfaceUtilisateur/police/8x15/..png new file mode 100644 index 0000000..34b1bec Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/..png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/0.png b/src/modules/interfaceUtilisateur/police/8x15/0.png new file mode 100644 index 0000000..138dc48 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/0.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/1.png b/src/modules/interfaceUtilisateur/police/8x15/1.png new file mode 100644 index 0000000..9d0a15a Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/1.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/2.png b/src/modules/interfaceUtilisateur/police/8x15/2.png new file mode 100644 index 0000000..6f471ca Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/2.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/3.png b/src/modules/interfaceUtilisateur/police/8x15/3.png new file mode 100644 index 0000000..1dc84ee Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/3.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/4.png b/src/modules/interfaceUtilisateur/police/8x15/4.png new file mode 100644 index 0000000..cd4b6b5 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/4.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/5.png b/src/modules/interfaceUtilisateur/police/8x15/5.png new file mode 100644 index 0000000..fbd31c8 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/5.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/6.png b/src/modules/interfaceUtilisateur/police/8x15/6.png new file mode 100644 index 0000000..e6dd092 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/6.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/7.png b/src/modules/interfaceUtilisateur/police/8x15/7.png new file mode 100644 index 0000000..81a9b6e Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/7.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/8.png b/src/modules/interfaceUtilisateur/police/8x15/8.png new file mode 100644 index 0000000..072db31 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/8.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/8x15.fnt b/src/modules/interfaceUtilisateur/police/8x15/8x15.fnt new file mode 100644 index 0000000..cc715e4 --- /dev/null +++ b/src/modules/interfaceUtilisateur/police/8x15/8x15.fnt @@ -0,0 +1,256 @@ +0 curseur.png +1 espace.png +2 espace.png +3 espace.png +4 espace.png +5 espace.png +6 espace.png +7 espace.png +8 espace.png +9 espace.png +10 espace.png +11 espace.png +12 espace.png +13 espace.png +14 espace.png +15 espace.png +16 espace.png +17 espace.png +18 espace.png +19 espace.png +20 espace.png +21 espace.png +22 espace.png +23 espace.png +24 espace.png +25 espace.png +26 espace.png +27 espace.png +28 espace.png +29 espace.png +30 espace.png +31 espace.png +32 espace.png +33 espace.png +34 espace.png +35 espace.png +36 espace.png +37 espace.png +38 espace.png +39 espace.png +40 ,.png +41 espace.png +42 espace.png +43 espace.png +44 espace.png +45 espace.png +46 ..png +47 espace.png +48 0.png +49 1.png +50 2.png +51 3.png +52 4.png +53 5.png +54 6.png +55 7.png +56 8.png +57 9.png +58 espace.png +59 espace.png +60 espace.png +61 espace.png +62 espace.png +63 espace.png +64 espace.png +65 A.png +66 B.png +67 C.png +68 D.png +69 E.png +70 F.png +71 G.png +72 H.png +73 I.png +74 J.png +75 K.png +76 L.png +77 M.png +78 N.png +79 O.png +80 P.png +81 Q.png +82 R.png +83 S.png +84 T.png +85 U.png +86 V.png +87 W.png +88 X.png +89 Y.png +90 Z.png +91 espace.png +92 espace.png +93 espace.png +94 espace.png +95 espace.png +96 espace.png +97 a.png +98 b.png +99 c.png +100 d.png +101 e.png +102 f.png +103 g.png +104 h.png +105 i.png +106 j.png +107 k.png +108 l.png +109 m.png +110 n.png +111 o.png +112 p.png +113 q.png +114 r.png +115 s.png +116 t.png +117 u.png +118 v.png +119 w.png +120 x.png +121 y.png +122 z.png +123 espace.png +124 espace.png +125 espace.png +126 espace.png +127 espace.png +128 espace.png +129 espace.png +130 espace.png +131 espace.png +132 espace.png +133 espace.png +134 espace.png +135 espace.png +136 espace.png +137 espace.png +138 espace.png +139 espace.png +140 espace.png +141 espace.png +142 espace.png +143 espace.png +144 espace.png +145 espace.png +146 espace.png +147 espace.png +148 espace.png +149 espace.png +150 espace.png +151 espace.png +152 espace.png +153 espace.png +154 espace.png +155 espace.png +156 espace.png +157 espace.png +158 espace.png +159 espace.png +160 espace.png +161 espace.png +162 espace.png +163 espace.png +164 espace.png +165 espace.png +166 espace.png +167 espace.png +168 espace.png +169 espace.png +170 espace.png +171 espace.png +172 espace.png +173 espace.png +174 espace.png +175 espace.png +176 espace.png +177 espace.png +178 espace.png +179 espace.png +180 espace.png +181 espace.png +182 espace.png +183 espace.png +184 espace.png +185 espace.png +186 espace.png +187 espace.png +188 espace.png +189 espace.png +190 espace.png +191 espace.png +192 espace.png +193 espace.png +194 espace.png +195 espace.png +196 espace.png +197 espace.png +198 espace.png +199 espace.png +200 espace.png +201 espace.png +202 espace.png +203 espace.png +204 espace.png +205 espace.png +206 espace.png +207 espace.png +208 espace.png +209 espace.png +210 espace.png +211 espace.png +212 espace.png +213 espace.png +214 espace.png +215 espace.png +216 espace.png +217 espace.png +218 espace.png +219 espace.png +220 espace.png +221 espace.png +222 espace.png +223 espace.png +224 espace.png +225 espace.png +226 espace.png +227 espace.png +228 espace.png +229 espace.png +230 espace.png +231 espace.png +232 espace.png +233 espace.png +234 espace.png +235 espace.png +236 espace.png +237 espace.png +238 espace.png +239 espace.png +240 espace.png +241 espace.png +242 espace.png +243 espace.png +244 espace.png +245 espace.png +246 espace.png +247 espace.png +248 espace.png +249 espace.png +250 espace.png +251 espace.png +252 espace.png +253 espace.png +254 espace.png +255 espace.png diff --git a/src/modules/interfaceUtilisateur/police/8x15/9.png b/src/modules/interfaceUtilisateur/police/8x15/9.png new file mode 100644 index 0000000..ff17bef Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/9.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/A.png b/src/modules/interfaceUtilisateur/police/8x15/A.png new file mode 100644 index 0000000..0c4d312 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/A.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/B.png b/src/modules/interfaceUtilisateur/police/8x15/B.png new file mode 100644 index 0000000..77303c9 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/B.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/C.png b/src/modules/interfaceUtilisateur/police/8x15/C.png new file mode 100644 index 0000000..e63652a Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/C.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/D.png b/src/modules/interfaceUtilisateur/police/8x15/D.png new file mode 100644 index 0000000..8b7032f Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/D.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/E.png b/src/modules/interfaceUtilisateur/police/8x15/E.png new file mode 100644 index 0000000..10c5cb9 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/E.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/F.png b/src/modules/interfaceUtilisateur/police/8x15/F.png new file mode 100644 index 0000000..a7658e6 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/F.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/G.png b/src/modules/interfaceUtilisateur/police/8x15/G.png new file mode 100644 index 0000000..5ef54da Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/G.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/H.png b/src/modules/interfaceUtilisateur/police/8x15/H.png new file mode 100644 index 0000000..499ebc5 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/H.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/I.png b/src/modules/interfaceUtilisateur/police/8x15/I.png new file mode 100644 index 0000000..a500671 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/I.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/J.png b/src/modules/interfaceUtilisateur/police/8x15/J.png new file mode 100644 index 0000000..0bf3d1e Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/J.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/K.png b/src/modules/interfaceUtilisateur/police/8x15/K.png new file mode 100644 index 0000000..43a068a Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/K.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/L.png b/src/modules/interfaceUtilisateur/police/8x15/L.png new file mode 100644 index 0000000..9351a9d Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/L.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/M.png b/src/modules/interfaceUtilisateur/police/8x15/M.png new file mode 100644 index 0000000..8f3da26 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/M.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/N.png b/src/modules/interfaceUtilisateur/police/8x15/N.png new file mode 100644 index 0000000..50173ad Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/N.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/O.png b/src/modules/interfaceUtilisateur/police/8x15/O.png new file mode 100644 index 0000000..3b65e1b Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/O.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/P.png b/src/modules/interfaceUtilisateur/police/8x15/P.png new file mode 100644 index 0000000..4915a18 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/P.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/Q.png b/src/modules/interfaceUtilisateur/police/8x15/Q.png new file mode 100644 index 0000000..daa0da5 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/Q.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/R.png b/src/modules/interfaceUtilisateur/police/8x15/R.png new file mode 100644 index 0000000..6dd0ba4 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/R.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/S.png b/src/modules/interfaceUtilisateur/police/8x15/S.png new file mode 100644 index 0000000..936ca68 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/S.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/T.png b/src/modules/interfaceUtilisateur/police/8x15/T.png new file mode 100644 index 0000000..ecccc0e Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/T.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/U.png b/src/modules/interfaceUtilisateur/police/8x15/U.png new file mode 100644 index 0000000..b93f822 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/U.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/V.png b/src/modules/interfaceUtilisateur/police/8x15/V.png new file mode 100644 index 0000000..46e121d Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/V.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/W.png b/src/modules/interfaceUtilisateur/police/8x15/W.png new file mode 100644 index 0000000..f1b7853 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/W.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/X.png b/src/modules/interfaceUtilisateur/police/8x15/X.png new file mode 100644 index 0000000..2912c40 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/X.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/Y.png b/src/modules/interfaceUtilisateur/police/8x15/Y.png new file mode 100644 index 0000000..af76e6b Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/Y.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/Z.png b/src/modules/interfaceUtilisateur/police/8x15/Z.png new file mode 100644 index 0000000..0f82bca Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/Z.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/a.png b/src/modules/interfaceUtilisateur/police/8x15/a.png new file mode 100644 index 0000000..d997d10 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/a.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/b.png b/src/modules/interfaceUtilisateur/police/8x15/b.png new file mode 100644 index 0000000..f77ebb3 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/b.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/c.png b/src/modules/interfaceUtilisateur/police/8x15/c.png new file mode 100644 index 0000000..dc87bcd Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/c.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/curseur.png b/src/modules/interfaceUtilisateur/police/8x15/curseur.png new file mode 100644 index 0000000..8a523dc Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/curseur.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/d.png b/src/modules/interfaceUtilisateur/police/8x15/d.png new file mode 100644 index 0000000..5ddcfb5 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/d.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/e.png b/src/modules/interfaceUtilisateur/police/8x15/e.png new file mode 100644 index 0000000..8b02382 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/e.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/espace.png b/src/modules/interfaceUtilisateur/police/8x15/espace.png new file mode 100644 index 0000000..e4cc615 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/espace.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/f.png b/src/modules/interfaceUtilisateur/police/8x15/f.png new file mode 100644 index 0000000..c9b00e5 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/f.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/g.png b/src/modules/interfaceUtilisateur/police/8x15/g.png new file mode 100644 index 0000000..97fe436 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/g.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/h.png b/src/modules/interfaceUtilisateur/police/8x15/h.png new file mode 100644 index 0000000..47e6089 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/h.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/i.png b/src/modules/interfaceUtilisateur/police/8x15/i.png new file mode 100644 index 0000000..ff63334 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/i.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/j.png b/src/modules/interfaceUtilisateur/police/8x15/j.png new file mode 100644 index 0000000..7b70f36 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/j.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/k.png b/src/modules/interfaceUtilisateur/police/8x15/k.png new file mode 100644 index 0000000..607b700 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/k.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/l.png b/src/modules/interfaceUtilisateur/police/8x15/l.png new file mode 100644 index 0000000..92c4791 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/l.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/m.png b/src/modules/interfaceUtilisateur/police/8x15/m.png new file mode 100644 index 0000000..98245a3 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/m.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/magickCPZzva b/src/modules/interfaceUtilisateur/police/8x15/magickCPZzva new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/interfaceUtilisateur/police/8x15/magickILOpac b/src/modules/interfaceUtilisateur/police/8x15/magickILOpac new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/interfaceUtilisateur/police/8x15/magickNIygPK b/src/modules/interfaceUtilisateur/police/8x15/magickNIygPK new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/interfaceUtilisateur/police/8x15/magickTAbVVp b/src/modules/interfaceUtilisateur/police/8x15/magickTAbVVp new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/interfaceUtilisateur/police/8x15/magickUbyoYb b/src/modules/interfaceUtilisateur/police/8x15/magickUbyoYb new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/interfaceUtilisateur/police/8x15/magickYmNcu2 b/src/modules/interfaceUtilisateur/police/8x15/magickYmNcu2 new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/interfaceUtilisateur/police/8x15/magickcylYvt b/src/modules/interfaceUtilisateur/police/8x15/magickcylYvt new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/interfaceUtilisateur/police/8x15/magickdVV9sC b/src/modules/interfaceUtilisateur/police/8x15/magickdVV9sC new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/interfaceUtilisateur/police/8x15/magickmas2Rl b/src/modules/interfaceUtilisateur/police/8x15/magickmas2Rl new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/interfaceUtilisateur/police/8x15/magicknw0TJ4 b/src/modules/interfaceUtilisateur/police/8x15/magicknw0TJ4 new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/interfaceUtilisateur/police/8x15/magickoVnTPK b/src/modules/interfaceUtilisateur/police/8x15/magickoVnTPK new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/interfaceUtilisateur/police/8x15/magickuHXNJE b/src/modules/interfaceUtilisateur/police/8x15/magickuHXNJE new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/interfaceUtilisateur/police/8x15/n.png b/src/modules/interfaceUtilisateur/police/8x15/n.png new file mode 100644 index 0000000..f3ddbd8 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/n.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/o.png b/src/modules/interfaceUtilisateur/police/8x15/o.png new file mode 100644 index 0000000..38d4967 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/o.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/p.png b/src/modules/interfaceUtilisateur/police/8x15/p.png new file mode 100644 index 0000000..3a59660 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/p.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/q.png b/src/modules/interfaceUtilisateur/police/8x15/q.png new file mode 100644 index 0000000..f733965 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/q.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/r.png b/src/modules/interfaceUtilisateur/police/8x15/r.png new file mode 100644 index 0000000..441ce5e Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/r.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/s.png b/src/modules/interfaceUtilisateur/police/8x15/s.png new file mode 100644 index 0000000..68e27eb Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/s.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/t.png b/src/modules/interfaceUtilisateur/police/8x15/t.png new file mode 100644 index 0000000..1a42115 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/t.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/u.png b/src/modules/interfaceUtilisateur/police/8x15/u.png new file mode 100644 index 0000000..9df3def Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/u.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/v.png b/src/modules/interfaceUtilisateur/police/8x15/v.png new file mode 100644 index 0000000..e40a9f5 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/v.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/w.png b/src/modules/interfaceUtilisateur/police/8x15/w.png new file mode 100644 index 0000000..e95961a Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/w.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/x.png b/src/modules/interfaceUtilisateur/police/8x15/x.png new file mode 100644 index 0000000..954f674 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/x.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/y.png b/src/modules/interfaceUtilisateur/police/8x15/y.png new file mode 100644 index 0000000..9bef089 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/y.png differ diff --git a/src/modules/interfaceUtilisateur/police/8x15/z.png b/src/modules/interfaceUtilisateur/police/8x15/z.png new file mode 100644 index 0000000..ce7f0f7 Binary files /dev/null and b/src/modules/interfaceUtilisateur/police/8x15/z.png differ diff --git a/src/modules/interfaceUtilisateur/police/police.c b/src/modules/interfaceUtilisateur/police/police.c new file mode 100644 index 0000000..1ea7c32 --- /dev/null +++ b/src/modules/interfaceUtilisateur/police/police.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include + +MODULE(Police); + +DEPENDANCE_MODULE(Police, Multiboot); +// DEPENDANCE_MODULE(Police, VesaGraphique); + +extern EtatMultiboot* etatMultiboot; + +void initPolice (void** etat) { + *etat = etatPolice; + + etatPolice->tableCaracteres = etatMultiboot->InfoMultiboot->modsAddr[0].modStart; +} + +void deinitPolice (void** etat) { + *etat = NULL; +} + +void policeAfficherCaractereCouleurPosition(char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y) { + int i, j; + for (i = 0; i < 15; i++) + for (j = 0; j < 8; j++) + if ((etatPolice->tableCaracteres[(uint8)caractere * 15 + i] >> j) & 1) + setPixel32(x + 8 - j, y + i, couleurAv); + else + setPixel32(x + 8 - j, y + i, couleurAr); +} diff --git a/src/modules/modeleModule.c b/src/modules/modeleModule.c new file mode 100644 index 0000000..6125fe5 --- /dev/null +++ b/src/modules/modeleModule.c @@ -0,0 +1,18 @@ +#include +#include +#include + +#include /* DEBUG */ + +MODULE(ModeleModule); + +/* DEPENDANCE_MODULE(ModeleModule, ...); */ +DEPENDANCE_MODULE(ModeleModule, Console); /* DEBUG */ + +void initModeleModule (void** etat) { + *etat = etatModeleModule; +} + +void deinitModeleModule (void** etat) { + *etat = NULL; +} diff --git a/src/modules/pc/gdt/gdt.c b/src/modules/pc/gdt/gdt.c new file mode 100644 index 0000000..b811844 --- /dev/null +++ b/src/modules/pc/gdt/gdt.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include + +MODULE(Gdt); + +static DescripteurSegment tableDescripteursSegment[] = { + [0] = descripteurSegmentNULL, + [1] = descripteurSegmentBasicFlatModel(SEGMENT_CODE), + [2] = descripteurSegmentBasicFlatModel(SEGMENT_DONNEES) +}; + +void initGdt (void** etat) { + *etat = etatGdt; + + etatGdt->tableDescripteursSegment = tableDescripteursSegment; + etatGdt->registreGDTR.base = etatGdt->tableDescripteursSegment; + etatGdt->registreGDTR.limite = sizeof (tableDescripteursSegment) - 1; + + asm volatile ("\ + lgdt %0 \n\ + ljmp %1, $label \n\ + label: \n\ + movw %2, %%ax \n\ + movw %%ax, %%ds \n\ + movw %%ax, %%es \n\ + movw %%ax, %%fs \n\ + movw %%ax, %%gs \n\ + movw %%ax, %%ss" + : + : "m" (etatGdt->registreGDTR), "g" (8), "g" (16) + : "memory", "eax" + ); +} + +void deinitGdt (void** etat) { + *etat = NULL; +} diff --git a/src/modules/pc/idt/idt.S b/src/modules/pc/idt/idt.S new file mode 100644 index 0000000..6d1ab7b --- /dev/null +++ b/src/modules/pc/idt/idt.S @@ -0,0 +1,79 @@ +.section .text + +.irp _ligne_1,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f +.irp _ligne_2,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f + +.globl enregistrerContexteInterruption\_ligne_1\_ligne_2 +enregistrerContexteInterruption\_ligne_1\_ligne_2: + +/* Les noms de registres proviennent de : + * x86-doc-vol3.pdf fig 6.2 (section 6.2.1) */ +pushl %esp +pushl %ebp + +pushl %edi +pushl %esi + +pushl %eax +pushl %ebx +pushl %ecx +pushl %edx + +subl $2,%esp +pushw %ds +pushw %es +pushw %fs +pushw %gs +pushw %ss + +call *(tableGestionnairesInterruption + 4*0x\_ligne_1\_ligne_2) + +popw %ss +popw %gs +popw %fs +popw %es +popw %ds +addl $2,%esp + +popl %edx +popl %ecx +popl %ebx +popl %eax + +popl %esi +popl %edi + +popl %ebp +popl %esp + +iret + +.endr +.endr + + +.section .data + +.globl tableEnregistreursContexteInterruption +tableEnregistreursContexteInterruption: +.irp _ligne_1,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f +.irp _ligne_2,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f + .long (enregistrerContexteInterruption\_ligne_1\_ligne_2) +.endr +.endr + +/* .globl tableEnregistreursContexteInterruption + tableEnregistreursContexteInterruption: + .long (_tableEnregistreursContexteInterruption) */ + +.globl tableGestionnairesInterruption +tableGestionnairesInterruption: +.irp _ligne_1,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f +.irp _ligne_2,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f + .long (gestionnaireInterruptionVide) +.endr +.endr + +/* .globl tableGestionnairesInterruption + tableGestionnairesInterruption: + .long (_tableGestionnairesInterruption) */ diff --git a/src/modules/pc/idt/idt.c b/src/modules/pc/idt/idt.c new file mode 100644 index 0000000..53a286a --- /dev/null +++ b/src/modules/pc/idt/idt.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include + +MODULE(Idt); + +DEPENDANCE_MODULE(Idt, Gdt); + +extern EnregistreurContexteInterruption tableEnregistreursContexteInterruption[]; +extern GestionnaireInterruption tableGestionnairesInterruption[]; + +void gestionnaireInterruptionVide() { +} + +void initIdt (void** etat) { + *etat = etatIdt; + + etatIdt->interruptionsDesactivees = 0; + desactiverInterruptions(); + + etatIdt->nombreDescripteursInterruption = LONGUEUR(etatIdt->tableDescripteursInterruption); + etatIdt->registreIDTR.base = etatIdt->tableDescripteursInterruption; + etatIdt->registreIDTR.limite = sizeof (etatIdt->tableDescripteursInterruption) - 1; + + int i; + for (i = 0; i < etatIdt->nombreDescripteursInterruption; i++) + etatIdt->tableDescripteursInterruption[i] = (DescripteurInterruption){ + .offset_15_0 = (uint32)(tableEnregistreursContexteInterruption[i]) & 0xffff, + .selecteurSegment = 1 << 3, /* Segment de code */ + + ._zero_a = 0, + /* .type = 0, + ._un = 1, + .taillePorte = 0, + ._zero_b = 0, */ + .type = 14, + .niveauPrivilegeDescripteur = 0, + .present = FALSE, + .offset_31_16 = (((uint32)(tableEnregistreursContexteInterruption[i])) >> 16) & 0xffff + }; + + asm volatile ("lidt %0" + : + : "m" (etatIdt->registreIDTR) + : "memory" + ); + + activerInterruptions(); +} + +void deinitIdt (void** etat) { + *etat = NULL; +} + +int desactiverInterruptions() { + asm volatile ("cli"); + etatIdt->interruptionsDesactivees++; + return 0; +} + +int activerInterruptions() { + if (etatIdt->interruptionsDesactivees <= 1) { + etatIdt->interruptionsDesactivees = 0; + asm volatile ("sti"); + } else { + etatIdt->interruptionsDesactivees--; + } + return 0; +} + +void definirGestionnaireInterruption(int numeroInterruption, GestionnaireInterruption gestionnaire) { + desactiverInterruptions(); + + tableGestionnairesInterruption[numeroInterruption] = gestionnaire; + + activerInterruptions(); +} + +void activerInterruption(int numeroInterruption) { + desactiverInterruptions(); + etatIdt->tableDescripteursInterruption[numeroInterruption].present = TRUE; + activerInterruptions(); +} + +void desactiverInterruption(int numeroInterruption) { + desactiverInterruptions(); + etatIdt->tableDescripteursInterruption[numeroInterruption].present = FALSE; + activerInterruptions(); +} diff --git a/src/modules/pc/io/io.c b/src/modules/pc/io/io.c new file mode 100644 index 0000000..203142a --- /dev/null +++ b/src/modules/pc/io/io.c @@ -0,0 +1,13 @@ +#include +#include +#include + +MODULE(Io); + +void initIo (void** etat) { + *etat = NULL; +} + +void deinitIo (void** etat) { + *etat = NULL; +} diff --git a/src/modules/pc/irq/irq.S b/src/modules/pc/irq/irq.S new file mode 100644 index 0000000..c01995a --- /dev/null +++ b/src/modules/pc/irq/irq.S @@ -0,0 +1,53 @@ +.section .text + +.irp ligne,0,1,2,3,4,5,6,7 + +.globl envoyerFinInterruptionMaitre\ligne +envoyerFinInterruptionMaitre\ligne: + +mov $0x20, %al +outb %al, $0x20 + +call *(tableGestionnairesRequeteInterruption + 4*\ligne) + +ret + +.endr + + +.irp ligne,0,1,2,3,4,5,6,7 + +.globl envoyerFinInterruptionEsclave\ligne +envoyerFinInterruptionEsclave\ligne: + +mov $0x20, %al +outb %al, $0xa0 +outb %al, $0x20 + +call *(tableGestionnairesRequeteInterruption + 4*(8 + \ligne)) + +ret + +.endr + + +.section .data + +.globl tableFonctionsEnvoiFinInterruption +tableFonctionsEnvoiFinInterruption: +.irp ligne,0,1,2,3,4,5,6,7 + .long (envoyerFinInterruptionMaitre\ligne) +.endr +.irp ligne,0,1,2,3,4,5,6,7 + .long (envoyerFinInterruptionEsclave\ligne) +.endr + + +.globl tableGestionnairesRequeteInterruption +tableGestionnairesRequeteInterruption: +.irp ligne,0,1,2,3,4,5,6,7 + .long (gestionnaireRequeteInterruptionVide) +.endr +.irp ligne,0,1,2,3,4,5,6,7 + .long (gestionnaireRequeteInterruptionVide) +.endr diff --git a/src/modules/pc/irq/irq.c b/src/modules/pc/irq/irq.c new file mode 100644 index 0000000..307c4cc --- /dev/null +++ b/src/modules/pc/irq/irq.c @@ -0,0 +1,132 @@ +#include +#include +#include +#include +#include +#include /* DEBUG */ + +MODULE(Irq); + +DEPENDANCE_MODULE(Irq, Idt); +DEPENDANCE_MODULE(Irq, Io); + +extern GestionnaireRequeteInterruption tableFonctionsEnvoiFinInterruption[]; +extern GestionnaireRequeteInterruption tableGestionnairesRequeteInterruption[]; + +void gestionnaireRequeteInterruptionVide() { +} + +void initIrq (void** etat) { + desactiverInterruptions(); + + *etat = etatIrq; + + etatIrq->tableFonctionsEnvoiFinInterruption = tableFonctionsEnvoiFinInterruption; + etatIrq->tableGestionnairesRequeteInterruption = tableGestionnairesRequeteInterruption; + + etatIrq->adresseVecteurInterruptionMaitre = 32; + etatIrq->adresseVecteurInterruptionEsclave = 32 + 8; + + etatIrq->masqueMaitre = 0xff & (~(1 << 2)); /* connexion avec l'esclave activée */ + etatIrq->masqueEsclave = 0xff; + + etatIrq->ancienMasqueMaitre = inb(PORT_PIC_MAITRE_DONNEES); + etatIrq->ancienMasqueEsclave = inb(PORT_PIC_ESCLAVE_DONNEES); + + + etatIrq->ICW1_Maitre = (PicICW1){ + .ICW4_present = TRUE, + .single = PIC_ICW1_CASCADE, + .adi = PIC_ICW1_INTERVALLE_8, + .ltim = PIC_ICW1_EDGE_TRIGGERED_MODE, + .init = 1, + ._zero = 0 + }; + + etatIrq->ICW2_Maitre = (PicICW2){ + ._zero = 0, + .adresseVecteurInterruption_7_3 = etatIrq->adresseVecteurInterruptionMaitre >> 3 + }; + + etatIrq->ICW3_Maitre = ESCLAVE_CONNECTE_SUR_MAITRE_PATTE(2); + + etatIrq->ICW4_Maitre = (PicICW4){ + .microPM = PIC_ICW4_MODE_8086_8088, + .autoEOI = FALSE, + .tampon = PIC_ICW4_MODE_SANS_TAMPON, + .specialFullyNestedMode = FALSE + }; + + + etatIrq->ICW1_Esclave = etatIrq->ICW1_Maitre; + + etatIrq->ICW2_Esclave = (PicICW2){ + ._zero = 0, + .adresseVecteurInterruption_7_3 = etatIrq->adresseVecteurInterruptionEsclave >> 3 + }; + + etatIrq->ICW3_Esclave = (PicICW3_Esclave){ + .patteConnexionMaitre = 2, + ._zero = 0 + }; + + etatIrq->ICW4_Esclave = etatIrq->ICW4_Maitre; + + + outb (PORT_PIC_MAITRE_COMMANDE, etatIrq->ICW1_Maitre); + outb (PORT_PIC_MAITRE_DONNEES, etatIrq->ICW2_Maitre); + outb (PORT_PIC_MAITRE_DONNEES, etatIrq->ICW3_Maitre); + outb (PORT_PIC_MAITRE_DONNEES, etatIrq->ICW4_Maitre); + outb (PORT_PIC_MAITRE_DONNEES, etatIrq->masqueMaitre); + + outb (PORT_PIC_ESCLAVE_COMMANDE, etatIrq->ICW1_Esclave); + outb (PORT_PIC_ESCLAVE_DONNEES, etatIrq->ICW2_Esclave); + outb (PORT_PIC_ESCLAVE_DONNEES, etatIrq->ICW3_Esclave); + outb (PORT_PIC_ESCLAVE_DONNEES, etatIrq->ICW4_Esclave); + outb (PORT_PIC_ESCLAVE_DONNEES, etatIrq->masqueEsclave); + + int i; + for (i = 0; i < 8; i++) { + definirGestionnaireInterruption(etatIrq->adresseVecteurInterruptionMaitre + i, tableFonctionsEnvoiFinInterruption[i]); + } + + for (i = 0; i < 8; i++) + definirGestionnaireInterruption(etatIrq->adresseVecteurInterruptionEsclave + i, tableFonctionsEnvoiFinInterruption[i+8]); + activerInterruptions(); +} + +void deinitIrq (void** etat) { + *etat = NULL; +} + +void definirGestionnaireRequeteInterruption(int ligne, GestionnaireRequeteInterruption gestionnaire) { + desactiverInterruptions(); + + etatIrq->tableGestionnairesRequeteInterruption[ligne] = gestionnaire; + + activerInterruptions(); +} + +void activerLigneRequeteInterruption(int ligne) { + if (ligne < 8) { + activerInterruption(etatIrq->adresseVecteurInterruptionMaitre + ligne); + etatIrq->masqueMaitre &= ~(1 << (ligne & 0x07)); + outb (PORT_PIC_MAITRE_DONNEES, etatIrq->masqueMaitre); + } else { + activerInterruption(etatIrq->adresseVecteurInterruptionEsclave + ligne - 8); + etatIrq->masqueEsclave &= ~(1 << (ligne & 0x07)); + outb (PORT_PIC_ESCLAVE_DONNEES, etatIrq->masqueEsclave); + } +} + +void desactiverLigneRequeteInterruption(int ligne) { + if (ligne < 8) { + desactiverInterruption(etatIrq->adresseVecteurInterruptionMaitre + ligne); + etatIrq->masqueMaitre |= (1 << (ligne & 0x07)); + outb (PORT_PIC_MAITRE_DONNEES, etatIrq->masqueMaitre); + } else { + desactiverInterruption(etatIrq->adresseVecteurInterruptionEsclave + ligne - 8); + etatIrq->masqueEsclave |= (1 << (ligne & 0x07)); + outb (PORT_PIC_ESCLAVE_DONNEES, etatIrq->masqueEsclave); + } +} diff --git a/src/modules/pc/kbc/kbc.c b/src/modules/pc/kbc/kbc.c new file mode 100644 index 0000000..23c30a8 --- /dev/null +++ b/src/modules/pc/kbc/kbc.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include + +MODULE(Kbc); + +DEPENDANCE_MODULE(Kbc, Irq); +DEPENDANCE_MODULE(Kbc, Io); +DEPENDANCE_MODULE(Kbc, Console); + +void gestionnaireRequeteInterruptionKbc() { + etatKbc->gestionnaireClavier(inb(PORT_KBC_SCANCODE)); +} + +void gestionnaireClavierVide(uint8 scancode) { + scancode = scancode; +} + +void activerClavier() { + uint8 ppi = inb(PORT_KBC_PPI); + ppi = ppi & ~0x80; + outb(PORT_KBC_PPI, ppi); +} + +void activerSouris() { + +} + +void desactiverClavier() { + uint8 ppi = inb(PORT_KBC_PPI); + ppi = ppi | 0x80; + outb(PORT_KBC_PPI, ppi); +} + +void attenteKbc() { + /* Attendre un tampon d'entrée vide */ + while ((inb(PORT_KBC_COMMANDE) & 2) == 2); +} + +void attenteLectureKbc() { + /* Attendre un tampon d'entrée plein */ + while ((inb(PORT_KBC_COMMANDE) & 2) != 2); +} + +void resetCpu() { + attenteKbc(); + outb(PORT_KBC_COMMANDE, KBC_DEMMANDE_ECRITURE_CLAVIER); + + attenteKbc(); + outb(PORT_KBC_SCANCODE, KBC_RESET_CPU); +} + +void definirGestionnaireClavier(GestionnaireClavier gestionnaireClavier) { + etatKbc->gestionnaireClavier = gestionnaireClavier; +} + +void initKbc (void** etat) { + *etat = etatKbc; + + etatKbc->gestionnaireClavier = gestionnaireClavierVide; + + definirGestionnaireRequeteInterruption(LIGNE_IRQ_CLAVIER, gestionnaireRequeteInterruptionKbc); + activerLigneRequeteInterruption(LIGNE_IRQ_CLAVIER); + + activerClavier(); +} + +void deinitKbc (void** etat) { + *etat = NULL; +} diff --git a/src/modules/pc/pit/pit.c b/src/modules/pc/pit/pit.c new file mode 100644 index 0000000..281aa02 --- /dev/null +++ b/src/modules/pc/pit/pit.c @@ -0,0 +1,110 @@ +#include +#include +#include +#include +#include +#include + +#include /* DEBUG */ + +MODULE(Pit); + +DEPENDANCE_MODULE(Pit, Irq); +DEPENDANCE_MODULE(Pit, Io); +DEPENDANCE_MODULE(Pit, Math); +DEPENDANCE_MODULE(Pit, Console); /* DEBUG */ + +void gestionnaireRequeteInterruptionPit() { + etatPit->gestionnairePit(); +} + +void gestionnairePitVide() { +} + +void definirCompteurCanal(uint16 compteur, PitCanal canal) { + uint8 haut = (compteur >> 8) & 0xff; + uint8 bas = compteur & 0xff; + int port = PORT_PIT_CANAUX + canal; + /* TODO : lorsqu'on fait les outb avec un entier dans une variable + * pour le port, il y a un problème. */ + port = port; + + if ((etatPit->modeAcces == PIT_OCTET_BAS) || + (etatPit->modeAcces == PIT_OCTETS_HAUT_BAS)) + outb(PORT_PIT_CANAUX, bas); + + if ((etatPit->modeAcces == PIT_OCTET_HAUT) || + (etatPit->modeAcces == PIT_OCTETS_HAUT_BAS)) + outb(PORT_PIT_CANAUX, haut); +} + +void definirModeCanal(PitModeCanal mode, PitCanal canal) { + PitCommandeMode commande; + commande.bcd = FALSE; + commande.mode = mode; + commande.acces = etatPit->modeAcces; + commande.canal = canal; + + outb(PORT_PIT_COMMANDE, commande); +} + +/* freq en 1/1000 hz [~18000..FREQUENCE_PIT_KHZ] */ +uint32 definirFrequenceCanal(uint32 freq, PitCanal canal) { + uint32 diviseur = FREQUENCE_PIT_MILI_HZ / freq; + + if (diviseur > 65536) { + return 0; + } else if (diviseur == 65536) { + definirCompteurCanal(0, canal); + return FREQUENCE_PIT_MILI_HZ / 65536; + } else if (diviseur == 0) { + definirCompteurCanal(1, canal); + return FREQUENCE_PIT_MILI_HZ; + } else { + definirCompteurCanal(diviseur, canal); + return FREQUENCE_PIT_MILI_HZ / diviseur; + } +} + +/* delai en ns [1..10^8] */ +uint32 definirDelaiCanal(uint32 delai, PitCanal canal) { + //afficherEntierVirguleEnDecimal(delai, 9); + uint64 fd = (uint64)FREQUENCE_PIT_MILI_HZ * (uint64)delai; + Div64 r = div64 (fd, 1000000000000); + uint64 diviseur = r.quotient; + + if (diviseur >= 65536) { + definirCompteurCanal(0, canal); + diviseur = 65536; + } else if (diviseur == 0) { + definirCompteurCanal(1, canal); + diviseur = 1; + } else { + definirCompteurCanal(diviseur, canal); + } + + Div64 delaiEffectif = div64(diviseur * 1000000000000L, FREQUENCE_PIT_MILI_HZ); + + return (uint32)delaiEffectif.quotient; +} + +void definirGestionnairePit(GestionnairePit gestionnairePit) { + etatPit->gestionnairePit = gestionnairePit; +} + +void initPit (void** etat) { + *etat = etatPit; + + etatPit->gestionnairePit = gestionnairePitVide; + + definirGestionnaireRequeteInterruption(LIGNE_IRQ_PIT, gestionnaireRequeteInterruptionPit); + activerLigneRequeteInterruption(LIGNE_IRQ_PIT); + + etatPit->modeAcces = PIT_OCTETS_HAUT_BAS; + definirModeCanal(PIT_MODE_GENERATEUR_FREQUENCE, 0); + definirCompteurCanal(0, 0); +} + +void deinitPit (void** etat) { + *etat = NULL; +} diff --git a/src/modules/pc/sourisPS2/sourisPS2.c b/src/modules/pc/sourisPS2/sourisPS2.c new file mode 100644 index 0000000..a5872c8 --- /dev/null +++ b/src/modules/pc/sourisPS2/sourisPS2.c @@ -0,0 +1,265 @@ +#include +#include +#include +#include +#include +#include +#include +#include /* DEBUG */ +#include /* DEBUG */ +#include /* DEBUG */ +#include /* DEBUG */ + +MODULE(SourisPS2); + +DEPENDANCE_MODULE(SourisPS2, Kbc); +DEPENDANCE_MODULE(SourisPS2, Clavier); /* DEBUG */ +DEPENDANCE_MODULE(SourisPS2, VesaGraphique); /* DEBUG */ + + +void envoyerCommandeSourisPS2(uint8 commande) { + /* TODO : ne pas partir dans une attente infinie en cas de bug matériel */ + attenteKbc(); + outb(PORT_KBC_COMMANDE, KBC_DEMMANDE_ECRITURE_SOURIS); + + attenteKbc(); + outb(PORT_KBC_COMMANDE_SOURIS, commande); +} + +void gestionnairePaquetSourisPS2(uint8 val) { + etatSourisPS2->paquets[etatSourisPS2->paquet++] = val; + + if (((etatSourisPS2->mouseID == 0) && (etatSourisPS2->paquet == 3)) || (etatSourisPS2->paquet >= 4)) { + etatSourisPS2->paquet = 0; + etatSourisPS2->etatGestionnaireSourisPS2 = ETAT_GESTIONNAIRE_SOURIS_PS2_ATTENTE; + + /* DEBUG */ + //afficherChaineZ(" p"); + //afficherEntierEnHexa(*(uint32*)(void*)&(etatSourisPS2->paquets)); + + PaquetSourisPS2_1 p1 = CAST_INT_TO_STRUCT(etatSourisPS2->paquets[0], PaquetSourisPS2_1); + int xsgn = p1.xNegatif ? 0xffffff00 : 0; + int ysgn = p1.yNegatif ? 0xffffff00 : 0; + + if (p1.boutonGauche) + etatSourisPS2->couleur = 0xffffffff; + else if (p1.boutonDroite) + etatSourisPS2->couleur = 0; + else if (p1.boutonMilieu) + etatSourisPS2->couleur = 0xff8800ff; + + etatSourisPS2->curseur_x += etatSourisPS2->paquets[1] | xsgn; + etatSourisPS2->curseur_y -= etatSourisPS2->paquets[2] | ysgn; + etatSourisPS2->curseur_x = clip(etatSourisPS2->curseur_x, 0, 1023); + etatSourisPS2->curseur_y = clip(etatSourisPS2->curseur_y, 0, 767); + // setPixel32(etatSourisPS2->curseur_x, etatSourisPS2->curseur_y, etatSourisPS2->couleur); + policeAfficherCaractereCouleurPosition(0, etatSourisPS2->couleur, 0x00000000, etatSourisPS2->curseur_x, etatSourisPS2->curseur_y); + } +} + +void gestionnaireDialogueSourisPS2(uint8 val) { + // afficherChaineZ(" gestionnaireDialogueSourisPS2"); + // afficherChaineZ(" r"); + // afficherEntierEnHexa(val); /* DEBUG */ + // afficherChaineZ(" "); + // afficherEntierEnDecimal(etatSourisPS2->etapeDialogue); + // afficherChaineZ(" "); + // afficherEntierEnDecimal(etatSourisPS2->dialogue.longueur); + // afficherChaineZ(" "); + + + DialogueSourisPS2 dialogue = etatSourisPS2->dialogue; + int etape; + uint8 action, valeur; + uint8* parametre = dialogue.parametre; + + + boucle: + etape = etatSourisPS2->etapeDialogue++; + action = dialogue.sequence[etape * 2]; + valeur = dialogue.sequence[etape * 2 + 1]; + + if (etape >= dialogue.longueur) + goto fin; + + if (action == RECEVOIR) { + if (val != valeur) { + etatSourisPS2->etatGestionnaireSourisPS2 = ETAT_GESTIONNAIRE_SOURIS_PS2_ATTENTE; + dialogue.rappel(TRUE); + return; + } + } else if (action == RECEVOIR_V) { + *parametre = val; + } else if (action == RECEVOIR_OU_PAS) { + if (val != valeur) + goto boucle; + } + /* Fin boucle */ + + etape = etatSourisPS2->etapeDialogue++; + while (etape < dialogue.longueur) { + action = dialogue.sequence[etape * 2]; + valeur = dialogue.sequence[etape * 2 + 1]; + + if (action == ENVOYER) { + /* DEBUG */ + // afficherChaineZ(" s"); + // afficherEntierEnHexa(valeur); + envoyerCommandeSourisPS2(valeur); + } else if (action == ENVOYER_V) { + /* DEBUG */ + // afficherChaineZ(" s"); + // afficherEntierEnHexa(*parametre); + envoyerCommandeSourisPS2(*parametre); + } else if (action == COMMANDE) { + attenteKbc(); + outb(PORT_KBC_COMMANDE, valeur); + } else { + break; + } + etape = etatSourisPS2->etapeDialogue++; + } + + fin: + if (etape >= dialogue.longueur) { + etatSourisPS2->etatGestionnaireSourisPS2 = ETAT_GESTIONNAIRE_SOURIS_PS2_ATTENTE; + dialogue.rappel(FALSE); + } +} + +bool dialoguer(const uint8* sequence, int longueur, uint8* parametre, FonctionRappelSourisPS2 rappel) { + // afficherChaineZ(" dialoguer"); + desactiverInterruptions(); + + longueur /= 2; + + if (etatSourisPS2->etatGestionnaireSourisPS2 != ETAT_GESTIONNAIRE_SOURIS_PS2_ATTENTE) { + activerInterruptions(); + return FALSE; + } + + uint8 action, valeur; + int etape; + for (etape = 0; etape < longueur; etape++) { + action = sequence[etape * 2]; + valeur = sequence[etape * 2 + 1]; + + if (action == ENVOYER) { + /* DEBUG */ + // afficherChaineZ(" s"); + // afficherEntierEnHexa(valeur); + envoyerCommandeSourisPS2(valeur); +// afficherChaineZ(" "); afficherEntierEnDecimal(etape); afficherChaineZ(" "); afficherEntierEnDecimal(longueur); afficherChaineZ(" "); + } else if (action == ENVOYER_V) { + /* DEBUG */ + // afficherChaineZ(" s"); + // afficherEntierEnHexa(*parametre); + envoyerCommandeSourisPS2(*parametre); +// afficherChaineZ(" "); afficherEntierEnDecimal(etape); afficherChaineZ(" "); afficherEntierEnDecimal(longueur); afficherChaineZ(" "); + } else + break; + } + + if (etape >= longueur) { + rappel(FALSE); + } else { + etatSourisPS2->dialogue.sequence = sequence; + etatSourisPS2->dialogue.longueur = longueur; + etatSourisPS2->dialogue.parametre = parametre; + etatSourisPS2->dialogue.rappel = rappel; + etatSourisPS2->etapeDialogue = etape; + etatSourisPS2->etatGestionnaireSourisPS2 = ETAT_GESTIONNAIRE_SOURIS_PS2_DIALOGUE; + } + + activerInterruptions(); + return TRUE; +} + +void gestionnaireSourisPS2() { + // afficherChaineZ(" gs "); + uint8 val; + val = inb(PORT_KBC_SOURIS); + // afficherEntierEnHexa(val); + + switch (etatSourisPS2->etatGestionnaireSourisPS2) { + case ETAT_GESTIONNAIRE_SOURIS_PS2_ATTENTE : + case ETAT_GESTIONNAIRE_SOURIS_PS2_PAQUET : + gestionnairePaquetSourisPS2(val); + break; + case ETAT_GESTIONNAIRE_SOURIS_PS2_DIALOGUE : + gestionnaireDialogueSourisPS2(val); + break; + } +} + +void fonctionRappelVide(bool erreur) { + erreur = erreur; + // afficherChaineZ(" rappel "); /* DEBUG */ + // afficherEntierEnDecimal(erreur); +} + + +void definirResolution(uint8 res) { + etatSourisPS2->resolution = res; + dialoguer(DialogueDefinirResolution, LONGUEUR(DialogueDefinirResolution), &(etatSourisPS2->resolution), fonctionRappelVide); +} + +void demanderPaquet() { + // afficherChaineZ(" demanderPaquet"); /* DEBUG */ + dialoguer(DialogueDemanderPaquet, LONGUEUR(DialogueDemanderPaquet), NULL, fonctionRappelVide); +} + +void autoPaquets() { + // afficherChaineZ(" autoPaquets"); /* DEBUG */ + dialoguer(DialogueAutoPaquets, LONGUEUR(DialogueAutoPaquets), NULL, fonctionRappelVide); +} + +uint8 obtenirCompaqStatusByte() { + // afficherChaineZ(" getcsb"); /* DEBUG */ + + attenteKbc(); + outb(PORT_KBC_COMMANDE, KBC_DEMMANDE_LECTURE_COMPAQ_STATUS_BYTE); + + // attenteLectureKbc(); + return inb(PORT_KBC_DONNEES); +} + +void definirCompaqStatusByte(uint8 csb) { + attenteKbc(); + outb(PORT_KBC_COMMANDE, KBC_DEMMANDE_ECRITURE_COMPAQ_STATUS_BYTE); + + attenteKbc(); + outb(PORT_KBC_DONNEES, csb); +} + +void activerIrq12() { + definirGestionnaireRequeteInterruption(LIGNE_IRQ_SOURIS, gestionnaireSourisPS2); + activerLigneRequeteInterruption(LIGNE_IRQ_SOURIS); + + uint8 csb = obtenirCompaqStatusByte(); + // afficherEntierEnHexa(csb); afficherChaineZ(" "); /* DEBUG */ + csb |= 2; // Activer Irq 12 + csb &= ~0x20; // Désactiver l'horloge souris + // afficherEntierEnHexa(csb); /* DEBUG */ + definirCompaqStatusByte(csb); +} + +void initSourisPS2 (void** etat) { + *etat = etatSourisPS2; + + etatSourisPS2->etapeDialogue = 0; + etatSourisPS2->etatGestionnaireSourisPS2 = ETAT_GESTIONNAIRE_SOURIS_PS2_ATTENTE; + + etatSourisPS2->curseur_x = 1024/2; + etatSourisPS2->curseur_y = 768/2; + + activerIrq12(); + + autoPaquets(); + + etatSourisPS2->couleur = 0xffffffff; /* DEBUG */ +} + +void deinitSourisPS2 (void** etat) { + *etat = NULL; +} diff --git a/src/modules/pc/vesaGraphique/vesaGraphique.c b/src/modules/pc/vesaGraphique/vesaGraphique.c new file mode 100644 index 0000000..bc8ced9 --- /dev/null +++ b/src/modules/pc/vesaGraphique/vesaGraphique.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include +#include +#include + +MODULE(VesaGraphique); + +DEPENDANCE_MODULE(VesaGraphique, Multiboot); +DEPENDANCE_MODULE(VesaGraphique, Console); +DEPENDANCE_MODULE(VesaGraphique, Police); + +extern EtatMultiboot* etatMultiboot; + + +void setPixel32 (uint32 x, uint32 y, uint32 couleur) { + etatVesaGraphique->memoireVideo[x + 1024*y].rvb = couleur; +} + +void ligne (uint32 x1, uint32 y1, uint32 x2, uint32 y2, uint32 couleur) { + uint32 mdx2, mdy2, dx2, dy2; + int32 err, dx, dy; + + setPixel32 (x2, y2, couleur); + + dx = x2 - x1; + dy = y2 - y1; + + if (abs(dx) > abs(dy)) { // y++ ou y-- ou y=y à chaque tour + err = - abs(dx); + mdx2 = 2 * err; + dy2 = 2 * abs(dy); + + for (; x1 != x2; x1 += sign(dx)) { + setPixel32 (x1, y1, couleur); + err += dy2; + if (err >= 0) { + err += mdx2; + y1 += sign(dy); + } + } + } else { // x++ ou x-- ou x=x à chaque tour + err = - abs(dy); + mdy2 = 2 * err; + dx2 = 2 * abs(dx); + + for (; y1 != y2; y1 += sign(dy)) { + setPixel32 (x1, y1, couleur); + err += dx2; + if (err >= 0) { + err += mdy2; + x1 += sign(dx); + } + } + } +} + +void rectanglePlein (uint32 x1, uint32 y1, uint32 x2, uint32 y2, uint32 couleur) { + uint32 y; + for (; x1 <= x2; x1++) + for (y = y1; y <= y2; y++) + setPixel32(x1, y, couleur); +} + +void rectangleContour (uint32 x1, uint32 y1, uint32 x2, uint32 y2, uint32 couleur) { + uint32 x; + for (x = x1; x <= x2; x++) { + setPixel32(x, y1, couleur); + setPixel32(x, y2, couleur); + } + + for (; y1 <= y2; y1++) { + setPixel32(x1, y1, couleur); + setPixel32(x2, y1, couleur); + } +} + + +void vesaGraphiqueAfficherCaractereCouleurPosition(char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y) { + policeAfficherCaractereCouleurPosition(caractere, couleurAv, couleurAr, x * 8, y * 15); + caractere = caractere; + couleurAv = couleurAv; + couleurAr = couleurAr; + x = x; + y = y; +} + + +void initVesaGraphique (void** etat) { + *etat = etatVesaGraphique; + + /* Passage en mode graphique. Actuellement effectué par grub (avec le patch pour VBE) */ + + etatVesaGraphique->memoireVideo = etatMultiboot->InfoMultiboot->vbeModeInfo->linearAddress; + + etatVesaGraphique->console.x = 0; + etatVesaGraphique->console.y = 0; + etatVesaGraphique->console.largeur = 1024 / 8; + etatVesaGraphique->console.hauteur = 768 / 15; + etatVesaGraphique->console.fonctionAffichage = vesaGraphiqueAfficherCaractereCouleurPosition; + + definirConsoleActive(&etatVesaGraphique->console); +} + +void deinitVesaGraphique (void** etat) { + *etat = NULL; +} diff --git a/src/modules/pc/vgaTexte/vgaTexte.c b/src/modules/pc/vgaTexte/vgaTexte.c new file mode 100644 index 0000000..54f4dd8 --- /dev/null +++ b/src/modules/pc/vgaTexte/vgaTexte.c @@ -0,0 +1,52 @@ +#include +#include +#include +#include + +MODULE(VgaTexte); + +DEPENDANCE_MODULE(VgaTexte, Console); + +CouleurVgaTexte CouleursVersCouleurVgaTexte(Couleur couleurAv, Couleur couleurAr) { + CouleurComposantes composantesAv = CAST_INT_TO_STRUCT(couleurAv, CouleurComposantes); + CouleurComposantes composantesAr = CAST_INT_TO_STRUCT(couleurAr, CouleurComposantes); + + CouleurVgaTexte couleurVgaTexte; + + couleurVgaTexte.avClair = ((composantesAv.rouge + composantesAv.vert + composantesAv.bleu) > 3*128); + couleurVgaTexte.avRouge = (composantesAv.rouge > 128); + couleurVgaTexte.avVert = (composantesAv.vert > 128); + couleurVgaTexte.avBleu = (composantesAv.bleu > 128); + + couleurVgaTexte._reserve = 0; + couleurVgaTexte.arRouge = (composantesAr.rouge > 128); + couleurVgaTexte.arVert = (composantesAr.vert > 128); + couleurVgaTexte.arBleu = (composantesAr.bleu > 128); + + return couleurVgaTexte; +} + +void vgaTexteAfficherCaractereCouleurPosition(char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y) { + etatVgaTexte->memoireVideo[x + y * etatVgaTexte->console.largeur] = (CaractereVgaTexte) { + .caractere = caractere, + .couleur = CouleursVersCouleurVgaTexte(couleurAv, couleurAr) + }; +} + +void initVgaTexte (void** etat) { + *etat = etatVgaTexte; + + etatVgaTexte->memoireVideo = (CaractereVgaTexte*)0xb8000; + + etatVgaTexte->console.x = 0; + etatVgaTexte->console.y = 0; + etatVgaTexte->console.largeur = 80; + etatVgaTexte->console.hauteur = 25; + etatVgaTexte->console.fonctionAffichage = vgaTexteAfficherCaractereCouleurPosition; + + // definirConsoleActive(&etatVgaTexte->console); +} + +void deinitVgaTexte (void** etat) { + *etat = NULL; +} diff --git a/src/modules/recherche/dichotomique.c b/src/modules/recherche/dichotomique.c new file mode 100644 index 0000000..9e6a66b --- /dev/null +++ b/src/modules/recherche/dichotomique.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include + +MODULE(RechercheDichotomique); + +void* testGet(void* t, uint32 index) { + return ((int*)t) + index; +} + +int testCmp(void* a, void* b) { + int aa = *((int*)a); + int bb = *((int*)b); + return (aa == bb) ? 0 : ((aa < bb) ? -1 : 1); +} + +void initRechercheDichotomique(void** etat) { + *etat = NULL; +} + +void deinitRechercheDichotomique(void** etat) { + *etat = NULL; +} + +int rechercheDichotomiquePremier(void* e, void* t, int taille, AccesseurIndex get, ComparaisonStricte comparer) { + int i = 0; + int j = taille - 1; + int m; + + if (comparer(get(t, i), e) == 0) + return i; + + while (i + 1 < j) { + m = (i + j) / 2; + if (comparer(get(t, m), e) < 0) + i = m; + else + j = m; + } + + return (comparer(get(t, j), e) == 0) ? j : -1; +} + +int rechercheDichotomiqueDernier(void* e, void* t, int taille, AccesseurIndex get, ComparaisonStricte comparer) { + int i = 0; + int j = taille - 1; + int m; + + if (comparer(get(t, j), e) == 0) + return j; + + while (i + 1 < j) { + m = (i + j) / 2; + if (comparer(get(t, m), e) > 0) + j = m; + else + i = m; + } + + return (comparer(get(t, i), e) == 0) ? i : -1; +} diff --git a/src/modules/stockage/ata/ata.c b/src/modules/stockage/ata/ata.c new file mode 100644 index 0000000..93765b2 --- /dev/null +++ b/src/modules/stockage/ata/ata.c @@ -0,0 +1,18 @@ +#include +#include +#include + +#include /* DEBUG */ + +MODULE(Ata); + +/* DEPENDANCE_MODULE(Ata, ...); */ +DEPENDANCE_MODULE(Ata, Console); /* DEBUG */ + +void initAta (void** etat) { + *etat = etatAta; +} + +void deinitAta (void** etat) { + *etat = NULL; +} diff --git a/src/modules/temps/temps/temps.c b/src/modules/temps/temps/temps.c new file mode 100644 index 0000000..459cb1d --- /dev/null +++ b/src/modules/temps/temps/temps.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include + +#include /* DEBUG */ + +MODULE(Temps); + +DEPENDANCE_MODULE(Temps, Pit); +DEPENDANCE_MODULE(Temps, Console); /* DEBUG */ + +void gestionnairePit() { + etatTemps->nanosec += etatTemps->increments; + etatTemps->debug++; + if (etatTemps->nanosec >= 1000000000) { + etatTemps->nanosec -= 1000000000; + etatTemps->sec++; + + Position p = consolePosition(118, 0); + afficherEntierEnHexa(etatTemps->sec); + consolePosition(p.x, p.y); + } +} + +void initTemps (void** etat) { + *etat = etatTemps; + + etatTemps->nanosec = 0; + etatTemps->sec = 0; + etatTemps->delta = 0; + etatTemps->etapesDelta = 1; + etatTemps->increments = definirDelaiCanal(1000000000, 0); + + etatTemps->listeEcheancesDate = NULL; + etatTemps->listeEcheancesDelai = NULL; + + definirGestionnairePit(gestionnairePit); + etatTemps->sec = 0; // TODO : Récupérer depuis la RTC + etatTemps->nanosec = 0; // TODO : Récupérer depuis la RTC + + Position p = consolePosition(118, 0); + afficherEntierEnHexa(0); + consolePosition(p.x, p.y); +} + +void deinitTemps (void** etat) { + *etat = NULL; +} diff --git a/src/modules/tri/tas/tas.c b/src/modules/tri/tas/tas.c new file mode 100644 index 0000000..7bded31 --- /dev/null +++ b/src/modules/tri/tas/tas.c @@ -0,0 +1,63 @@ +#include +#include +#include + +MODULE(TriParTas); + + +void initTriParTas(void** etat) { + *etat = NULL; +} + +void deinitTriParTas(void** etat) { + *etat = NULL; +} + +void percoler(int racine, void* t, int taille, AccesseurIndex get, AccesseurEchanger echanger, Comparaison comparer) { + int gauche = 2 * racine + 1; + int droite = 2 * racine + 2; + + void* valracine; + void* valgauche; + + while (droite < taille) { + valracine = get(t, racine); + valgauche = get(t, gauche); + + if (comparer(valracine, valgauche) < 0) { + if (comparer(valgauche, get(t, droite)) < 0) { + echanger(t, racine, droite); + racine = droite; + } + else { + echanger(t, racine, gauche); + racine = gauche; + } + } else { + if (comparer(valracine, get(t, droite)) < 0) { + echanger(t, racine, droite); + racine = droite; + } else { + return; + } + } + + gauche = 2 * racine + 1; + droite = 2 * racine + 2; + } + + if ((gauche < taille) && (comparer(get(t, racine), get(t, gauche)) < 0)) + echanger(t, racine, gauche); +} + +void triParTas(void* t, int taille, AccesseurIndex get, AccesseurEchanger echanger, Comparaison comparer) { + int i; + for (i = (taille / 2) - 1; i >= 0; i--) + percoler(i, t, taille, get, echanger, comparer); + + for (i = taille - 1; i > 0; i--) { + echanger(t, i, 0); + taille--; + percoler(0, t, taille, get, echanger, comparer); + } +} diff --git a/src/scripts/creerImage.lds b/src/scripts/creerImage.lds new file mode 100644 index 0000000..81368e7 --- /dev/null +++ b/src/scripts/creerImage.lds @@ -0,0 +1,43 @@ +ENTRY (_start) + +SECTIONS { + /* le format ELF utilise les 0x80 premiers octets. Si on met 0x100000, + * il remplit le début du fichier par des zéros jusqu'à 4ko, pour être + * aligné. Ici, 0x100080 nous permet d'être juste après l'en-tête ELF, + * et de gaspiller moins de place */ + . = 0x100080 ; + + .multiboot . : { + *(.multiboot*) + /* On force l'allocation au début du fichier : */ + LONG (0); + } + + .text . : { + *(.text*) + } + + .data . : { + *(.data*) + } + + .rodata . : { + *(.rodata*) + } + + .modules : { + __listeModules = .; + *(.modules*); + __finListeModules = . ; + } + + .dependancesModules . : { + __listeDependancesModules = .; + *(.dependancesModules*); + __finListeDependancesModules = . ; + } + + .bss . : { + *(.bss*); + } +} diff --git a/src/scripts/creerModule.sh b/src/scripts/creerModule.sh new file mode 100644 index 0000000..c76e2e8 --- /dev/null +++ b/src/scripts/creerModule.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +if [ "$1" == "--help" ]; then + echo "$0 catégorie/nomModule" + exit +fi + +n="$(basename "$1" | dd bs=1 count=1 2>/dev/null)" +omMod="$(basename "$1" | dd bs=1 skip=1 2>/dev/null)" + +N="$(echo "$n" | tr '[:lower:]' '[:upper:]')" +OMMOD="$(echo "$omMod" | sed -e 's/[A-Z]/_\0/g' | tr '[:lower:]' '[:upper:]')" + +nomMod="$n$omMod" +NomMod="$N$omMod" +NOMMOD="$N$OMMOD" + +NOMCAT="$(echo "$1" | sed -e 's/[A-Z]/_\0/g; s|/|_|g' | tr '[:lower:]' '[:upper:]')" + +destc="src/modules/$1/$nomMod.c" +desth="src/inclusions/$1/$nomMod.h" + +[ -e "$destc" ] && echo "$destc existe !" && exit +[ -e "$desth" ] && echo "$desth existe !" && exit + +mkdir -p "$(dirname "$destc")" +mkdir -p "$(dirname "$desth")" + +echo --------------- "$destc" --------------- +cat src/modules/modeleModule.c | sed -e "s|modeleModule|$1/$nomMod|g; s/ModeleModule/$NomMod/g; s/MODELE_MODULE/${NOMCAT}_$NOMMOD/g" | tee -a "$destc" +echo +echo --------------- "$desth" --------------- +cat src/inclusions/modeleModule.h | sed -e "s|modeleModule|$1/$nomMod|g; s/ModeleModule/$NomMod/g; s/MODELE_MODULE/${NOMCAT}_$NOMMOD/g" | tee -a "$desth" + +geany "$destc" "$desth" & diff --git a/src/scripts/creerPolice.sh b/src/scripts/creerPolice.sh new file mode 100755 index 0000000..6ec92c5 --- /dev/null +++ b/src/scripts/creerPolice.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +( + cd "$(dirname "$1")" + montage $(sort -g "$(basename "$1")" | cut -d ' ' -f 2-) -tile 1x -geometry +0+0 pbm:- | tail -n +3 +) > "$2" diff --git a/src/scripts/liste-chemins.lst b/src/scripts/liste-chemins.lst new file mode 100644 index 0000000..002731f --- /dev/null +++ b/src/scripts/liste-chemins.lst @@ -0,0 +1,4 @@ +boot/gruntnetwork.elf=./dist/noyau.elf +boot/grub/stage2_eltorito=./src/demarrage/grub/stage2_eltorito_vbe +boot/grub/menu.lst=./src/demarrage/grub/menu.lst +donnees/police.fnt=./dist/police.fnt