refactor: ajout d'information dans les fichiers MD, réindentation des fichiers, corrections de bogues

This commit is contained in:
Nicolas Hordé 2018-12-12 15:25:04 +01:00
parent 89ac2cc30f
commit 3c7ddafc2d
63 changed files with 48800 additions and 28101 deletions

23
API.md
View File

@ -1,15 +1,20 @@
## Liste des API ## API List
Bibliothèques disponibles dans COS2000 APIs given by COS2000 libraries
### libc ### LIBC
Fonctions disponibles dans la librairie "libc" All fonction in the "libc" library.
#### test_api ------
u32 test_api(void); `u32 test_api(void);`
syscall id : 0 *Description: function to test if the syscall mecanism is running.*
arguments : 0
résultat : oui (0x66666666) * syscall id : **0**
* arguments : **0**
* * argument 1 : **u32 none** *Afin de documenter un argument*
* results : **yes (always 0x66666666)**
------

28
BUGS.md Normal file
View File

@ -0,0 +1,28 @@
## Liste de BUGS à corriger
### VIDEO
* Interpolation des droites lorsques les coordonnées sortent de l'écran : erreur les coefficient directeur sont faux.
* Les modes VGA ne fonctionnent pas tous.
* Ralentissement lors du défilemment de la console en VESA.
### MEMOIRE
La commande mem plante parfois ?!
### 3D
La 3D utiliser sauvagement la mémoire sans malloc !!
### 2D
Le remplissage des triangles n'est pas parfais, 2 algo différents entre lignes et remplissage.
### SHELL
* La fonction regs est à reprendre...
* La fonction IDT est à adapter à la taille de l'écran

168
README.md
View File

@ -23,9 +23,9 @@ Sans système d'exploitation votre ordinateur est inopérant: c'est une boite vi
#### Comment utiliser COS2000 ? #### Comment utiliser COS2000 ?
COS2000 n'a pas pour but d'être utilisé en exploitation, c'est un système en cours de COS2000 n'a pas pour but d'être utilisé en production. Il s'agit d'un système en cours de
développement. Vous pouvez néanmoins l'utiliser sur un ordinateur physique ou une machine virtuelle développement que vous pouvez néanmoins tester sur un ordinateur physique ou de préférence sur une machine virtuelle.
afin de voir le fonctionnement d'un système d'exploitation rudimentatire. Voir compilation de COS2000... Il est nécessaire de compiler le système avant de démarrer celui-ci à partir d'un périphérique amovible (clé usb).
#### Sur quel ordinateur fonctionne t'il ? #### Sur quel ordinateur fonctionne t'il ?
@ -41,6 +41,10 @@ COS2000 est sous licence LGPL v3.0, en simplifiant un peu :
* REUTILISER - OUI en citant l'auteur * REUTILISER - OUI en citant l'auteur
* VENDRE - NON * VENDRE - NON
Les détails se trouvent dans le fichier `LICENSE.md`
![logo](https://www.gnu.org/graphics/lgplv3-with-text-154x68.png)
### Compilation de COS2000 ### Compilation de COS2000
#### Avant la compilation #### Avant la compilation
@ -57,23 +61,34 @@ Les numéros de version des logiciels sont données à titre indicatif car il es
Compilation: Compilation:
* NASM version 2.11.08 Nom | Paquet | Version
* gcc version 5.4.0 20160609 --- | --- | ---
* GNU Make version 4.1 NASM | nasm | 2.11.08
* binutils version 2.26-8 gcc | gcc | 5.4.0 20160609
GNU Make | make | 4.1
Outils divers | binutils | 2.26-8
Images disques, débogage & émulation: Images disques, débogage & émulation:
* fuse-umfuse-ext2 version 0.4 29 Nom | Paquet | Version
* fusefat version 0.1a-1.1 --- | --- | ---
* CGDB: a curses debugger version 0.6.7 fuse-umfuse-ext2 | fuseext2 | 0.4 29
* QEMU emulator version 2.5.0 fusefat | fusefat | 0.1a-1.1
* OVMF version 0~20160408.ffea0a2c-2 CGDB: a curses debugger | cgdb | 0.6.7
* hexdump (bsdmainutils version 9.0.6) QEMU emulator | qemu | 2.5.0
* dd (coreutils version 8.25-2) OVMF | ovmf | 0~20160408.ffea0a2c-2
* tar version 1.28-2.1 hexdump | bsdmainutils | 9.0.6
* GNU indent version 2.2.11 dd | coreutils | 8.25-2
* Bochs (optionnel) tar | tar | 1.28-2.1
Bochs | bochs | 2.6
Suivi et développement:
Nom | Paquet | Version
--- | --- | ---
GNU indent | indent | 2.2.11
GIT | git | 2.7.4
Dos2unix | dos2unix| 6.0.4
##### Téléchargement de COS2000 ##### Téléchargement de COS2000
@ -81,107 +96,112 @@ Afin de faciliter la mise à jour et le suivi des version de COS2000, GIT est ut
Si vous n'avez pas GIT, installez le avec la commande suivante : Si vous n'avez pas GIT, installez le avec la commande suivante :
```sudo apt-get install git``` `sudo apt-get install git`
Puis cloner le source chez vous avec la commande : Puis cloner le source chez vous avec la commande :
```git clone https://github.com/dahut87/cos2000.git``` `git clone https://github.com/dahut87/cos2000.git`
##### Installation des paquets nécessaires ##### Installation des paquets nécessaires
Sous linux - Debian & Ubuntu like Sous linux - Debian & Ubuntu like
```sudo apt-get install nasm gcc qemu fusefat fuseext2 cgdb ovmf bsdmainutils tar bsdmainutils indent binutils``` `sudo apt-get install nasm gcc qemu fusefat fuseext2 cgdb ovmf bsdmainutils tar bsdmainutils indent binutils`
ou sinon, depuis un terminal disposé sur le répertoire cos2000 ou sinon, depuis un terminal disposé sur le répertoire cos2000
```make install``` `make install`
#### Compilation #### Compilation
Commande de compilation de base Commande de compilation de base
* ```make all``` compile tout le projet dans sa version disque dur et disque dur en UEFI * `make all` compile tout le projet dans sa version disque dur et disque dur en UEFI
Autres commandes de compilation de COS2000 Autres commandes de compilation de COS2000
* ```make harddisk``` compile la version disque dur * `make harddisk` compile la version disque dur
* ```make uefi``` compile la version disque dur UEFI * `make uefi` compile la version disque dur UEFI
* ```make bochstest``` lance l'émulation BOCHS en 32 bits sur disque dur * `make bochstest` lance l'émulation BOCHS en 32 bits sur disque dur
* ```make test``` lance l'émulation QEMU en 32 bits sur disque dur * `make test` lance l'émulation QEMU en 32 bits sur disque dur
* ```make test64``` lance l'émulation QEMU en 64 bits sur disque dur en UEFI * `make test64` lance l'émulation QEMU en 64 bits sur disque dur en UEFI
* ```make clean``` supprime les fichers compilés * `make clean` supprime les fichers compilés
* ```VESA=no make test``` préfixe à utiliser (VESA=no) pour faire appel au pilote VGA et non pas VESA * `VESA=no make test` préfixe à utiliser (VESA=no) pour faire appel au pilote VGA et non pas VESA
#### Utilisation #### Utilisation
##### Sur un ordinateur émulé ##### Sur un ordinateur émulé
Pour tester l'OS en émulation taper donc la commande ```make test``` qui compilera avant de lancer Qemu. Pour tester l'OS en émulation taper donc la commande `make test` qui compilera avant de lancer Qemu.
##### Sur un ordinateur physique ##### Sur un ordinateur physique
Lancer une compilation du système COS2000 Lancer une compilation du système COS2000
```make all``` `make all`
Puis, il faut copier l'image sur une clé (Attention l'opération effacera le contenu de la clé) : Puis, il faut copier l'image sur une clé (Attention l'opération effacera le contenu de la clé) :
```sudo dd if=./final/harddisk.img.final of=/dev/sdx bs=1M``` (ou sdx est votre périphérique) `sudo dd if=./final/harddisk.img.final of=/dev/sdx bs=1M` (ou sdx est votre périphérique)
Bootez sur votre clé en mode bios (legacy). Bootez sur votre clé en mode bios (legacy).
Pour un boot en mode UEFI Pour un boot en mode UEFI
```sudo dd if=./final/harddiskuefi.img.final of=/dev/sdx bs=1M``` (ou sdx est votre périphérique) `sudo dd if=./final/harddiskuefi.img.final of=/dev/sdx bs=1M` (ou sdx est votre périphérique)
Pour connaitre le numéro de votre périphérique (clé) Pour connaitre le numéro de votre périphérique (clé)
```lsblk``` `lsblk`
##### Usage de COS2000 ##### Usage de COS2000
Pour l'instant quelques commandes seulement sont disponibles: Pour l'instant quelques commandes seulement sont disponibles:
* REBOOT redémarre le PC, * `REBOOT` redémarre le PC,
* CLEAR efface l'écran, * `CLEAR` efface l'écran,
* MODE change le mode video, * `MODE` change le mode video,
* DETECTCPU detecte et affiche les informations CPU, * `DETECTCPU` detecte et affiche les informations CPU,
* DETECTPCI detecte et affiche les périphériques PCI, * `DETECTPCI` detecte et affiche les périphériques PCI,
* TEST2D teste l'affichage graphique 2D, * `TEST2D` teste l'affichage graphique 2D,
* TEST3D teste l'affichage graphique 2D, * `TEST3D` teste l'affichage graphique 2D,
* REGS affiche les registres CPU, * `REGS` affiche les registres CPU,
* GDT affiche la table des descripteurs, * `GDT` affiche la table des descripteurs,
* IDT affiche la table des interruptions, * `IDT` affiche la table des interruptions,
* MEM affiche les statistiques d'occupation memoire, * `MEM` affiche les statistiques d'occupation memoire,
* INFO affiche des informations issues de GRUB, * `INFO` affiche des informations issues de GRUB,
* ERR génère une exception (ARGUMENTS), * `ERR` génère une exception (ARGUMENTS),
* VIEW visionne la mémoire vive (ARGUMENTS), * `VIEW` visionne la mémoire vive (ARGUMENTS),
* LOGO affiche le logo, * `LOGO` affiche le logo,
* FONT change la police d'affichage (ARGUMENTS), * `FONT` change la police d'affichage (ARGUMENTS),
* HELP affiche les commandes disponibles, * `HELP` affiche les commandes disponibles,
* BPSET met un point d'arrêt pour le débogueur (ARGUMENTS), * `BPSET` met un point d'arrêt pour le débogueur (ARGUMENTS),
* BPCLR efface un point d'arrêt (ARGUMENTS), * `BPCLR` efface un point d'arrêt (ARGUMENTS),
* DISASM désassemble une portion de mémoire (ARGUMENTS), * `DISASM` désassemble une portion de mémoire (ARGUMENTS),
![COS2000 le 28-09-2018](https://github.com/dahut87/cos2000v2/raw/develop/Graphisme/screenshots/28-09-2018.png) ![COS2000 le 28-09-2018](https://github.com/dahut87/cos2000v2/raw/develop/Graphisme/screenshots/28-09-2018.png)
#### Organisation du dépôt #### Organisation du dépôt
* debug - fichiers configuration débogueur * `debug` - fichiers configuration débogueur
* final - img raw utilisables avec un émulateur des 3 versions * `final` - img raw utilisables avec un émulateur des 3 versions
* * harddisk.img.final * * `harddisk.img.final`
* * harddiskuefi.img.final * * `harddiskuefi.img.final`
* * floppy.img.final * * `floppy.img.final`
* Graphisme - fichiers images * `Graphisme` - fichiers images
* * screenshots - screenshots de l'évolution du système * * `screenshots` - screenshots de l'évolution du système
* * Thème - thème de démarrage COS2000 pour plymouth * * `Thème` - thème de démarrage COS2000 pour plymouth
* include - fichier d'entête C * `include` - fichier d'entête C
* lib - librairies pour le noyau * `lib` - librairies pour le noyau
* makefile - Makefile du projet * `makefile` - Makefile du projet
* programs - programme pour le domaine utilisateur (en cours) * `programs` - programmes pour le domaine utilisateur
* README.md - ce que vous lisez * * `include` - fichier d'entête C
* system - le noyau lui-même * * `lib` - librairies pour le domaine utilisateur
* `README.md` - ce que vous lisez
* `LICENSE.md` - la licence LGPLv3.0
* `BUGS.md` - bugs rélevés dans le système
* `API.md` - Liste des APIs fournies par le système COS2000
* `system` - le noyau lui-même
### En savoir plus... ### En savoir plus...
@ -201,10 +221,14 @@ Pour l'instant quelques commandes seulement sont disponibles:
* mode protégé limité à 4Go de mémoire vive (32 bits), * mode protégé limité à 4Go de mémoire vive (32 bits),
* gestion avancée de la mémoire (vmalloc). * gestion avancée de la mémoire (vmalloc).
#### A faire #### En cours
* espace utilisateur et appels systèmes, * espace utilisateur et appels systèmes,
* ordonnanceur de tâche (par TSS), * ordonnanceur de tâche (par TSS),
* liste d'API automatiquement mise à jour,
#### A faire
* chargeur ELF32, * chargeur ELF32,
* pilote IDE/ATA (PIO mode), * pilote IDE/ATA (PIO mode),
* fonctions affichage image PNG, * fonctions affichage image PNG,
@ -215,6 +239,12 @@ Pour l'instant quelques commandes seulement sont disponibles:
![COS2000 le 29-11-2018](https://github.com/dahut87/cos2000v2/raw/develop/Graphisme/screenshots/29-11-2018.png) ![COS2000 le 29-11-2018](https://github.com/dahut87/cos2000v2/raw/develop/Graphisme/screenshots/29-11-2018.png)
#### Autres Licences (autres auteurs)
Des fichiers sources utilisés par COS2000 sont sous d'autres licences, parmis ceux-ci figurent :
* `include/queues.h` sous licence Berkeley Software Distribution License
#### Historique du projet #### Historique du projet
* Version 2.2fr - C en mode protégé Reprise du projet * Version 2.2fr - C en mode protégé Reprise du projet
* Version 2.1fr - C en mode protégé Abandon du projet * Version 2.1fr - C en mode protégé Abandon du projet

View File

@ -5,13 +5,15 @@
#include "matrix.h" #include "matrix.h"
#include "video.h" #include "video.h"
typedef struct triface { typedef struct triface
{
u16 V1; u16 V1;
u16 V2; u16 V2;
u16 V3; u16 V3;
} triface __attribute__ ((packed)); } triface __attribute__ ((packed));
typedef struct model3d { typedef struct model3d
{
u8 name[12]; u8 name[12];
matrix44 view; matrix44 view;
vector4 *vertexlist; vector4 *vertexlist;
@ -20,9 +22,12 @@ typedef struct model3d {
u16 facenb; u16 facenb;
} model3d __attribute__ ((packed)); } model3d __attribute__ ((packed));
typedef struct vertex3d { typedef struct vertex3d
union { {
struct { union
{
struct
{
float x; float x;
float y; float y;
float z; float z;
@ -41,10 +46,12 @@ typedef enum type3D
} type3D __attribute__ ((packed)); } type3D __attribute__ ((packed));
void proj(vector4 list[], vertex2d plane[], vector4 origin[], u16 number, float factor); void proj(vector4 list[], vertex2d plane[], vector4 origin[],
u16 number, float factor);
void cube(model3d * model, vector4 * origin, u16 size); void cube(model3d * model, vector4 * origin, u16 size);
int load3ds(u8 * pointer, u32 size, model3d * model); int load3ds(u8 * pointer, u32 size, model3d * model);
void show3dmodel(model3d *model, matrix44 *transformation, vector4 origin[], float factor, type3D type); void show3dmodel(model3d * model, matrix44 * transformation,
vector4 origin[], float factor, type3D type);
/*******************************************************************************/ /*******************************************************************************/
/* Fichier 3DS */ /* Fichier 3DS */

View File

@ -39,7 +39,8 @@
#define SEG_NORMAL 0b00010000 /* Segment normal pile/data/code (0 pour système) */ #define SEG_NORMAL 0b00010000 /* Segment normal pile/data/code (0 pour système) */
typedef struct gdtdes { typedef struct gdtdes
{
u16 lim0_15; u16 lim0_15;
u16 base0_15; u16 base0_15;
u8 base16_23; u8 base16_23;
@ -49,12 +50,14 @@ typedef struct gdtdes {
u8 base24_31; u8 base24_31;
} gdtdes __attribute__ ((packed)); } gdtdes __attribute__ ((packed));
struct gdtr { struct gdtr
{
u16 limite; u16 limite;
u32 base; u32 base;
} __attribute__ ((packed)); } __attribute__ ((packed));
typedef struct tss { typedef struct tss
{
u16 prevtask, reserved00; u16 prevtask, reserved00;
u32 esp0; u32 esp0;
u16 ss0, reserved0; u16 ss0, reserved0;
@ -76,7 +79,8 @@ typedef struct tss {
void inittr(void); void inittr(void);
void initgdt(u32 offset); void initgdt(u32 offset);
void makegdtdes(u32 base, u32 limite, u8 acces, u8 flags, gdtdes *desc); void makegdtdes(u32 base, u32 limite, u8 acces, u8 flags,
gdtdes * desc);
u32 getdesbase(u16 sel); u32 getdesbase(u16 sel);
u8 getdestype(u16 sel); u8 getdestype(u16 sel);
u32 getdessize(u16 sel); u32 getdessize(u16 sel);

View File

@ -44,7 +44,8 @@
# define TIMER_MODE 0x43 /* port E/S pour le mode controle du timer */ # define TIMER_MODE 0x43 /* port E/S pour le mode controle du timer */
# define RATE_GENERATOR 0x34 /* générateur de fréquence */ # define RATE_GENERATOR 0x34 /* générateur de fréquence */
# define SQUARE_WAVE 0x36 /* générateur d'onde carrée */ # define SQUARE_WAVE 0x36 /* générateur d'onde carrée */
#define TIMER_FREQ 1193180 /* fréquence pour timer dans un PC ou AT */ # define TIMER_FREQ 1193180
/* fréquence pour timer dans un PC ou AT */
# define HZ 100 /* Fréquence d'horloge (ajutste logiciellement sur IBM-PC) */ # define HZ 100 /* Fréquence d'horloge (ajutste logiciellement sur IBM-PC) */
# define getESP(mem) ({ \ # define getESP(mem) ({ \
@ -210,7 +211,8 @@ lors d'un iret en mode kernel:
/* save pile */ /* save pile */
typedef struct regs { typedef struct regs
{
u64 efer; u64 efer;
u32 dr7; u32 dr7;
u32 dr6; u32 dr6;
@ -241,7 +243,8 @@ typedef struct regs {
} regs __attribute__ ((packed)); } regs __attribute__ ((packed));
/* exception pile depuis code kernel*/ /* exception pile depuis code kernel*/
typedef struct exception_stack { typedef struct exception_stack
{
u32 error_code; u32 error_code;
u32 eip; u32 eip;
u32 cs; u32 cs;
@ -249,14 +252,16 @@ typedef struct exception_stack {
} exception_stack __attribute__ ((packed)); } exception_stack __attribute__ ((packed));
/* sans code erreur depuis code kernel*/ /* sans code erreur depuis code kernel*/
typedef struct exception_stack_noerror { typedef struct exception_stack_noerror
{
u32 eip; u32 eip;
u32 cs; u32 cs;
u32 eflags; u32 eflags;
} exception_stack_noerror __attribute__ ((packed)); } exception_stack_noerror __attribute__ ((packed));
/* exception pile depuis code user */ /* exception pile depuis code user */
typedef struct exception_stack_user { typedef struct exception_stack_user
{
u32 error_code; u32 error_code;
u32 eip; u32 eip;
u32 cs; u32 cs;
@ -266,7 +271,8 @@ typedef struct exception_stack_user {
} exception_stack_user __attribute__ ((packed)); } exception_stack_user __attribute__ ((packed));
/* sans code erreu depuis code user */ /* sans code erreu depuis code user */
typedef struct exception_stack_noerror_user { typedef struct exception_stack_noerror_user
{
u32 eip; u32 eip;
u32 cs; u32 cs;
u32 eflags; u32 eflags;
@ -276,7 +282,8 @@ typedef struct exception_stack_noerror_user {
/* descripteur de segment */ /* descripteur de segment */
typedef struct idtdes { typedef struct idtdes
{
u16 offset0_15; u16 offset0_15;
u16 select; u16 select;
u16 type; u16 type;
@ -284,7 +291,8 @@ typedef struct idtdes {
} idtdes __attribute__ ((packed)); } idtdes __attribute__ ((packed));
struct idtr { struct idtr
{
u16 limite; u16 limite;
u32 base; u32 base;
} __attribute__ ((packed)); } __attribute__ ((packed));
@ -299,4 +307,3 @@ struct idtr {
void disableirq(u8 irq); void disableirq(u8 irq);
void cpuerror(const u8 * src, const regs * stack); void cpuerror(const u8 * src, const regs * stack);
#endif #endif

View File

@ -25,6 +25,7 @@ u32 rand(void);
void randomize(void); void randomize(void);
u8 log2(u64 n); u8 log2(u64 n);
u8 log10(u64 n); u8 log10(u64 n);
unsigned long long __udivdi3 (unsigned long long num, unsigned long long den); unsigned long long __udivdi3(unsigned long long num,
unsigned long long den);
unsigned long long __umoddi3(unsigned long long n, unsigned long long d); unsigned long long __umoddi3(unsigned long long n, unsigned long long d);
u32 pow(u32 a, u8 n); u32 pow(u32 a, u8 n);

View File

@ -5,9 +5,12 @@
#ifndef MATRIX #ifndef MATRIX
# define MATRIX # define MATRIX
typedef struct vector4{ typedef struct vector4
union { {
struct { union
{
struct
{
float x; float x;
float y; float y;
float z; float z;
@ -17,9 +20,12 @@ typedef struct vector4{
}; };
} vector4 __attribute__ ((packed)); } vector4 __attribute__ ((packed));
typedef struct matrix44{ typedef struct matrix44
union { {
struct { union
{
struct
{
vector4 V[4]; vector4 V[4];
}; };
float v[16]; float v[16];
@ -44,14 +50,16 @@ float vector4_dotproduct(vector4 v1, vector4 v2);
float vector4_norm(vector4 src); float vector4_norm(vector4 src);
float vector4_distance(vector4 v1, vector4 v2); float vector4_distance(vector4 v1, vector4 v2);
int vector4_isequals(vector4 v1, vector4 v2); int vector4_isequals(vector4 v1, vector4 v2);
void vector4_planenormal(vector4 v1, vector4 v2, vector4 v3, vector4 *dst); void vector4_planenormal(vector4 v1, vector4 v2, vector4 v3,
vector4 * dst);
void matrix44_homogen(matrix44 * matrix); void matrix44_homogen(matrix44 * matrix);
void matrix44_empty(matrix44 * matrix); void matrix44_empty(matrix44 * matrix);
void matrix44_scaling(vector4 v, matrix44 * dst); void matrix44_scaling(vector4 v, matrix44 * dst);
void matrix44_translation(vector4 v, matrix44 * dst); void matrix44_translation(vector4 v, matrix44 * dst);
void matrix44_scale(matrix44 * dst, float factor); void matrix44_scale(matrix44 * dst, float factor);
void matrix44_scale_translation(vector4 scale, vector4 translation, matrix44 *dst); void matrix44_scale_translation(vector4 scale, vector4 translation,
matrix44 * dst);
void matrix44_rotation_x(float angle, matrix44 * dst); void matrix44_rotation_x(float angle, matrix44 * dst);
void matrix44_rotation_y(float angle, matrix44 * dst); void matrix44_rotation_y(float angle, matrix44 * dst);
void matrix44_rotation_z(float angle, matrix44 * dst); void matrix44_rotation_z(float angle, matrix44 * dst);
@ -59,18 +67,15 @@ void matrix44_rotation(vector4 axis, float angle, matrix44 *dst);
void matrix44_multiply(matrix44 * m1, matrix44 * m2, matrix44 * dst); void matrix44_multiply(matrix44 * m1, matrix44 * m2, matrix44 * dst);
void matrix44_transform(matrix44 * matrix, vector4 * dst); void matrix44_transform(matrix44 * matrix, vector4 * dst);
float matrix44_determinant(matrix44 * matrix); float matrix44_determinant(matrix44 * matrix);
float todeterminant(float a1, float a2, float a3, float b1, float b2, float b3, float c1, float c2, float c3); float todeterminant(float a1, float a2, float a3, float b1, float b2,
float b3, float c1, float c2, float c3);
void matrix44_adjoint(matrix44 * matrix); void matrix44_adjoint(matrix44 * matrix);
void matrix44_show(matrix44 * matrix); void matrix44_show(matrix44 * matrix);
void matrix44_invert(matrix44 * matrix); void matrix44_invert(matrix44 * matrix);
void matrix44_transpose(matrix44 * matrix); void matrix44_transpose(matrix44 * matrix);
void matrix44_lookat(vector4 eye, vector4 dst, vector4 up, matrix44 *matrix); void matrix44_lookat(vector4 eye, vector4 dst, vector4 up,
matrix44 * matrix);
int matrix44_isequals(matrix44 * m1, matrix44 * m2); int matrix44_isequals(matrix44 * m1, matrix44 * m2);
float *toarray(matrix44 * m); float *toarray(matrix44 * m);
#endif #endif

View File

@ -12,20 +12,27 @@
# define TOPT(addr) ((addr) & 0x003FF000) >> 12 # define TOPT(addr) ((addr) & 0x003FF000) >> 12
# define TOPG(addr) (addr) & 0x00000FFF # define TOPG(addr) (addr) & 0x00000FFF
#define PAGESIZE 4096 /* Taille d'une page */ # define PAGESIZE 4096
#define PAGENUMBER 1024 /* Nombre de pages */ /* Taille d'une page */
# define PAGENUMBER 1024
/* Nombre de pages */
# define KERNELSIZE PAGESIZE*PAGENUMBER*2 /* 2 pages de 4mo en identity mapping */ # define KERNELSIZE PAGESIZE*PAGENUMBER*2 /* 2 pages de 4mo en identity mapping */
# define IDT_ADDR 0x00000000 /* adresse de la IDT */ # define IDT_ADDR 0x00000000 /* adresse de la IDT */
# define GDT_ADDR 0x00000800 /* adresse de la GDT */ # define GDT_ADDR 0x00000800 /* adresse de la GDT */
#define KERNEL_PD_ADDR 0x00001000 /* adresse de la page directory */ # define KERNEL_PD_ADDR 0x00001000
#define KERNEL_STACK_ADDR 0x0009FFFF /* adresse de la pile du kernel */ /* adresse de la page directory */
#define KERNEL_CODE_ADDR 0x00100000 /* adresse du code du noyau */ # define KERNEL_STACK_ADDR 0x0009FFFF
/* adresse de la pile du kernel */
# define KERNEL_CODE_ADDR 0x00100000
/* adresse du code du noyau */
# define KERNEL_PAGES 0x00800000 /* adresse des pages */ # define KERNEL_PAGES 0x00800000 /* adresse des pages */
# define KERNEL_HEAP 0x10000000 /* adresse du heap */ # define KERNEL_HEAP 0x10000000 /* adresse du heap */
# define VESA_FBMEM 0x38000000 /* adresse du framebuffer VESA */ # define VESA_FBMEM 0x38000000 /* adresse du framebuffer VESA */
#define USER_CODE 0x40000000 /* adresse du code utilisateur */ # define USER_CODE 0x40000000
#define USER_STACK 0xE0000000 /* adresse de la pile utilisateur */ /* adresse du code utilisateur */
# define USER_STACK 0xE0000000
/* adresse de la pile utilisateur */
/* limites de la mémoire 32 bits */ /* limites de la mémoire 32 bits */
# define MAXMEMSIZE 0x100000000 # define MAXMEMSIZE 0x100000000
@ -60,13 +67,15 @@
asm volatile ("mov %[memaddr], %%eax; mov %%eax, %%cr3"::[memaddr] "m" (addr) ); asm volatile ("mov %[memaddr], %%eax; mov %%eax, %%cr3"::[memaddr] "m" (addr) );
/* Malloc, pour l'attribution de mémoire en heap */ /* Malloc, pour l'attribution de mémoire en heap */
typedef struct tmalloc { typedef struct tmalloc
{
u32 size:31; u32 size:31;
u32 used:1; u32 used:1;
} __attribute__ ((packed)) tmalloc; } __attribute__ ((packed)) tmalloc;
/* Page, pour la gestion de la mémoire virtuelle */ /* Page, pour la gestion de la mémoire virtuelle */
typedef struct page { typedef struct page
{
u8 *vaddr; u8 *vaddr;
u8 *paddr; u8 *paddr;
TAILQ_ENTRY(page) tailq; TAILQ_ENTRY(page) tailq;
@ -75,13 +84,15 @@ typedef struct page {
typedef TAILQ_HEAD(page_s, page) page_t; typedef TAILQ_HEAD(page_s, page) page_t;
/* Page directory, pour la gestion de la mémoire virtuelle */ /* Page directory, pour la gestion de la mémoire virtuelle */
typedef struct pd { typedef struct pd
{
page *addr; page *addr;
page_t page_head; page_t page_head;
} __attribute__ ((packed)) pd; } __attribute__ ((packed)) pd;
/* vaddrrange, pour la gestion des pages de la mémoire virtuelle */ /* vaddrrange, pour la gestion des pages de la mémoire virtuelle */
typedef struct vrange { typedef struct vrange
{
u8 *vaddrlow; u8 *vaddrlow;
u8 *vaddrhigh; u8 *vaddrhigh;
TAILQ_ENTRY(vrange) tailq; TAILQ_ENTRY(vrange) tailq;
@ -113,7 +124,8 @@ void virtual_page_free(u8* vaddr);
u8 *virtual_to_physical(u8 * vaddr); u8 *virtual_to_physical(u8 * vaddr);
void virtual_pd_page_remove(u8 * vaddr); void virtual_pd_page_remove(u8 * vaddr);
void virtual_pd_page_add(pd * dst, u8 * vaddr, u8 * paddr, u32 flags); void virtual_pd_page_add(pd * dst, u8 * vaddr, u8 * paddr, u32 flags);
void virtual_range_use(pd *dst, u8 *vaddr, u8 *paddr, u64 len, u32 flags); void virtual_range_use(pd * dst, u8 * vaddr, u8 * paddr, u64 len,
u32 flags);
void virtual_range_free(pd * dst, u8 * vaddr, u64 len); void virtual_range_free(pd * dst, u8 * vaddr, u64 len);
void virtual_range_new(pd * dst, u8 * vaddr, u64 len, u32 flags); void virtual_range_new(pd * dst, u8 * vaddr, u64 len, u32 flags);
void malloc_init(void); void malloc_init(void);

View File

@ -4,7 +4,8 @@
typedef struct pciclass { typedef struct pciclass
{
u16 number; u16 number;
u8 *name; u8 *name;
} pciclass __attribute__ ((packed)); } pciclass __attribute__ ((packed));
@ -26,9 +27,12 @@ typedef struct pcidev
} pcidev __attribute__ ((packed)); } pcidev __attribute__ ((packed));
typedef struct pcidevmini { typedef struct pcidevmini
union { {
struct { union
{
struct
{
u16 vendor_id; u16 vendor_id;
u16 device_id; u16 device_id;
}; };
@ -36,9 +40,11 @@ typedef struct pcidevmini {
}; };
} pcidevmini __attribute__ ((packed)); } pcidevmini __attribute__ ((packed));
u16 pciConfigReadWord(const u8 bus, const u8 dev, const u8 function, const u8 offset); u16 pciConfigReadWord(const u8 bus, const u8 dev, const u8 function,
const u8 offset);
void scanPCImini(void); void scanPCImini(void);
pcidevmini getPCImininfo(const u8 bus, const u8 dev, const u8 function); pcidevmini getPCImininfo(const u8 bus, const u8 dev, const u8 function);
bool getPCInfo(pcidev *device, const u8 bus, const u8 dev, const u8 function); bool getPCInfo(pcidev * device, const u8 bus, const u8 dev,
const u8 function);
void scanPCI(void); void scanPCI(void);
u8 *pcigetclassname(const pcidev * device); u8 *pcigetclassname(const pcidev * device);

View File

@ -88,7 +88,8 @@
#define ELFOSABI_COS2000 16 //COS2000 #define ELFOSABI_COS2000 16 //COS2000
/* ELF header */ /* ELF header */
typedef struct elf32 { typedef struct elf32
{
u8 e_ident[EI_NIDENT]; u8 e_ident[EI_NIDENT];
u16 e_type; u16 e_type;
u16 e_machine; u16 e_machine;
@ -105,7 +106,8 @@ typedef struct elf32 {
u16 e_shstrndx; u16 e_shstrndx;
} elf32; } elf32;
typedef struct elf32p{ typedef struct elf32p
{
u32 p_type; u32 p_type;
u32 p_offset; u32 p_offset;
u8 *p_vaddr; u8 *p_vaddr;
@ -117,13 +119,15 @@ typedef struct elf32p{
} elf32p; } elf32p;
typedef struct stackdef { typedef struct stackdef
{
u32 esp0; u32 esp0;
u16 ss0; u16 ss0;
} stackdef __attribute__ ((packed)); } stackdef __attribute__ ((packed));
typedef struct process { typedef struct process
{
u32 pid; u32 pid;
bool kernel; bool kernel;
regs dump; regs dump;

View File

@ -108,7 +108,8 @@
*/ */
# ifdef QUEUE_MACRO_DEBUG # ifdef QUEUE_MACRO_DEBUG
/* Store the last 2 places the queue element or head was altered */ /* Store the last 2 places the queue element or head was altered */
struct qm_trace { struct qm_trace
{
unsigned long lastline; unsigned long lastline;
unsigned long prevline; unsigned long prevline;
const char *lastfile; const char *lastfile;
@ -141,7 +142,8 @@ struct qm_trace {
# define TRACEBUF # define TRACEBUF
# define TRACEBUF_INITIALIZER # define TRACEBUF_INITIALIZER
# define TRASHIT(x) # define TRASHIT(x)
#endif /* QUEUE_MACRO_DEBUG */ # endif
/* QUEUE_MACRO_DEBUG */
/* /*
* Singly-linked List declarations. * Singly-linked List declarations.
@ -401,7 +403,8 @@ struct { \
# define QMD_LIST_CHECK_HEAD(head, field) # define QMD_LIST_CHECK_HEAD(head, field)
# define QMD_LIST_CHECK_NEXT(elm, field) # define QMD_LIST_CHECK_NEXT(elm, field)
# define QMD_LIST_CHECK_PREV(elm, field) # define QMD_LIST_CHECK_PREV(elm, field)
#endif /* (_KERNEL && INVARIANTS) */ # endif
/* (_KERNEL && INVARIANTS) */
# define LIST_EMPTY(head) ((head)->lh_first == NULL) # define LIST_EMPTY(head) ((head)->lh_first == NULL)
@ -537,7 +540,8 @@ struct { \
# define QMD_TAILQ_CHECK_TAIL(head, headname) # define QMD_TAILQ_CHECK_TAIL(head, headname)
# define QMD_TAILQ_CHECK_NEXT(elm, field) # define QMD_TAILQ_CHECK_NEXT(elm, field)
# define QMD_TAILQ_CHECK_PREV(elm, field) # define QMD_TAILQ_CHECK_PREV(elm, field)
#endif /* (_KERNEL && INVARIANTS) */ # endif
/* (_KERNEL && INVARIANTS) */
# define TAILQ_CONCAT(head1, head2, field) do { \ # define TAILQ_CONCAT(head1, head2, field) do { \
if (!TAILQ_EMPTY(head2)) { \ if (!TAILQ_EMPTY(head2)) { \

View File

@ -5,8 +5,7 @@ typedef struct command
{ {
u8 name[64]; u8 name[64];
u8 params[64]; u8 params[64];
int (*function)() int (*function) ()} command __attribute__ ((packed));
} command __attribute__ ((packed));
int rebootnow(); int rebootnow();
int test2d(); int test2d();

View File

@ -1,3 +1,4 @@
/*******************************************************************************/ /*******************************************************************************/
/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */ /* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
/* */extern restart; /* */
extern restart;

View File

@ -13,7 +13,8 @@ u8 VESA_setvideo_mode (u8 mode);
u8 *VESA_getvideo_drivername(void); u8 *VESA_getvideo_drivername(void);
u8 *VESA_getvideo_capabilities(void); u8 *VESA_getvideo_capabilities(void);
videoinfos *VESA_getvideo_info(void); videoinfos *VESA_getvideo_info(void);
u32 VESA_mem_to_video (void *src,u32 dst, u32 size, bool increment_src); u32 VESA_mem_to_video(void *src, u32 dst, u32 size,
bool increment_src);
u32 VESA_video_to_mem(u32 src, void *dst, u32 size); u32 VESA_video_to_mem(u32 src, void *dst, u32 size);
u32 VESA_video_to_video(u32 src, u32 dst, u32 size); u32 VESA_video_to_video(u32 src, u32 dst, u32 size);
void VESA_wait_vretrace(void); void VESA_wait_vretrace(void);
@ -22,8 +23,7 @@ void VESA_page_set (u8 page);
void VESA_page_show(u8 page); void VESA_page_show(u8 page);
void VESA_dummy(); void VESA_dummy();
static videofonction vesafonctions = static videofonction vesafonctions = {
{
&VESA_remap_memory, &VESA_remap_memory,
&VESA_detect_hardware, &VESA_detect_hardware,
&VESA_setvideo_mode, &VESA_setvideo_mode,

View File

@ -23,11 +23,13 @@
#define PLANESIZE 0x10000 #define PLANESIZE 0x10000
/* Registres VGA */ /* Registres VGA */
typedef struct misc_regs { typedef struct misc_regs
{
u8 Miscellaneous_Output_Register; u8 Miscellaneous_Output_Register;
} misc_regs __attribute__ ((packed)); } misc_regs __attribute__ ((packed));
typedef struct sequencer_regs { typedef struct sequencer_regs
{
u8 Reset_Register; u8 Reset_Register;
u8 Clocking_Mode_Register; u8 Clocking_Mode_Register;
u8 Map_Mask_Register; u8 Map_Mask_Register;
@ -35,7 +37,8 @@ typedef struct sequencer_regs {
u8 Sequencer_Memory_Mode_Register; u8 Sequencer_Memory_Mode_Register;
} sequencer_regs __attribute__ ((packed)); } sequencer_regs __attribute__ ((packed));
typedef struct crtc_regs { typedef struct crtc_regs
{
u8 Horizontal_Total_Register; u8 Horizontal_Total_Register;
u8 End_Horizontal_Display_Register; u8 End_Horizontal_Display_Register;
u8 Start_Horizontal_Blanking_Register; u8 Start_Horizontal_Blanking_Register;
@ -63,7 +66,8 @@ typedef struct crtc_regs {
u8 Line_Compare_Register; u8 Line_Compare_Register;
} crtc_regs __attribute__ ((packed)); } crtc_regs __attribute__ ((packed));
typedef struct graphics_regs { typedef struct graphics_regs
{
u8 Set_Reset_Register; u8 Set_Reset_Register;
u8 Enable_Set_Reset_Register; u8 Enable_Set_Reset_Register;
u8 Color_Compare_Register; u8 Color_Compare_Register;
@ -75,7 +79,8 @@ typedef struct graphics_regs {
u8 Bit_Mask_Register; u8 Bit_Mask_Register;
} graphics_regs __attribute__ ((packed)); } graphics_regs __attribute__ ((packed));
typedef struct attributs_regs { typedef struct attributs_regs
{
u8 Palette_Registers[16]; u8 Palette_Registers[16];
u8 Attribute_Mode_Control_Register; u8 Attribute_Mode_Control_Register;
u8 Overscan_Color_Register; u8 Overscan_Color_Register;
@ -84,7 +89,8 @@ typedef struct attributs_regs {
u8 Color_Select_Register; u8 Color_Select_Register;
} attributs_regs __attribute__ ((packed)); } attributs_regs __attribute__ ((packed));
typedef struct vgamode { typedef struct vgamode
{
misc_regs misc; misc_regs misc;
sequencer_regs sequencer; sequencer_regs sequencer;
crtc_regs ctrc; crtc_regs ctrc;
@ -116,8 +122,7 @@ void VGA_font2_set (u8 num);
void VGA_blink_enable(void); void VGA_blink_enable(void);
void VGA_blink_disable(void); void VGA_blink_disable(void);
static videofonction vgafonctions = static videofonction vgafonctions = {
{
&VGA_remap_memory, &VGA_remap_memory,
&VGA_detect_hardware, &VGA_detect_hardware,
&VGA_setvideo_mode, &VGA_setvideo_mode,

View File

@ -10,18 +10,21 @@
# define MAXDRIVERS 10 # define MAXDRIVERS 10
# define MAXFONTS 10 # define MAXFONTS 10
typedef struct vertex2d{ typedef struct vertex2d
{
s16 x; s16 x;
s16 y; s16 y;
} vertex2d __attribute__ ((packed)); } vertex2d __attribute__ ((packed));
typedef struct rgbcolor { typedef struct rgbcolor
{
u8 R; u8 R;
u8 G; u8 G;
u8 B; u8 B;
} rgbcolor __attribute__ ((packed)); } rgbcolor __attribute__ ((packed));
typedef struct videoinfos { typedef struct videoinfos
{
u8 currentmode; u8 currentmode;
u16 currentwidth; u16 currentwidth;
u16 currentheight; u16 currentheight;
@ -41,7 +44,8 @@ typedef struct videoinfos {
u32 baseaddress; u32 baseaddress;
} videoinfos __attribute__ ((packed)); } videoinfos __attribute__ ((packed));
typedef struct videofonction { typedef struct videofonction
{
void (*remap_memory) (); void (*remap_memory) ();
u8 *(*detect_hardware) (); u8 *(*detect_hardware) ();
u8(*setvideo_mode) (); u8(*setvideo_mode) ();
@ -66,19 +70,22 @@ typedef struct videofonction {
void (*blink_disable) (); void (*blink_disable) ();
} videofonction __attribute__ ((packed)); } videofonction __attribute__ ((packed));
typedef struct drivers { typedef struct drivers
{
u8 *nom; u8 *nom;
videofonction *pointer; videofonction *pointer;
} drivers __attribute__ ((packed)); } drivers __attribute__ ((packed));
typedef struct font { typedef struct font
{
u8 nom[8]; u8 nom[8];
u8 *pointer; u8 *pointer;
u8 width; u8 width;
u8 height; u8 height;
} font __attribute__ ((packed)); } font __attribute__ ((packed));
typedef struct capabilities { typedef struct capabilities
{
u8 modenumber; u8 modenumber;
u16 width; u16 width;
u16 height; u16 height;
@ -87,7 +94,8 @@ typedef struct capabilities {
u8 refresh; u8 refresh;
} capabilities __attribute__ ((packed)); } capabilities __attribute__ ((packed));
typedef struct console { typedef struct console
{
u8 attrib; u8 attrib;
s16 cursX; s16 cursX;
s16 cursY; s16 cursY;
@ -115,7 +123,8 @@ void changemode(u8 mode);
u32 egatorgb(u8 ega); u32 egatorgb(u8 ega);
u8 egatovga(u8 ega); u8 egatovga(u8 ega);
void v_line(vertex2d * A, vertex2d * B, u32 color); void v_line(vertex2d * A, vertex2d * B, u32 color);
void trianglefilled(vertex2d *A, vertex2d *B, vertex2d *C, u32 color); void trianglefilled(vertex2d * A, vertex2d * B, vertex2d * C,
u32 color);
void triangle(vertex2d * A, vertex2d * B, vertex2d * C, u32 color); void triangle(vertex2d * A, vertex2d * B, vertex2d * C, u32 color);
/* Fonctions de console */ /* Fonctions de console */
@ -134,13 +143,15 @@ u32 sprintf(u8 *variable, const u8 *string, ...);
u32 snprintf(u8 * variable, u32 maxsize, const u8 * string, ...); u32 snprintf(u8 * variable, u32 maxsize, const u8 * string, ...);
u32 vprintf(const u8 * string, va_list args); u32 vprintf(const u8 * string, va_list args);
u32 vsprintf(u8 * variable, const u8 * string, va_list args); u32 vsprintf(u8 * variable, const u8 * string, va_list args);
u32 vsnprintf(u8 *variable, u32 maxsize, const u8 *string, va_list args); u32 vsnprintf(u8 * variable, u32 maxsize, const u8 * string,
va_list args);
u8 *itoa(u64 num, u8 * str, u8 base, u64 dim, u8 achar); u8 *itoa(u64 num, u8 * str, u8 base, u64 dim, u8 achar);
u8 *sitoa(u64 num, u8 * str, u64 dim); u8 *sitoa(u64 num, u8 * str, u64 dim);
u8 *rtoadouble(double num, u8 * str, u8 precisioni, u8 precisionf); u8 *rtoadouble(double num, u8 * str, u8 precisioni, u8 precisionf);
u8 *rtoasingle(float num, u8 * str, u8 precisioni, u8 precisionf); u8 *rtoasingle(float num, u8 * str, u8 precisioni, u8 precisionf);
u32 format(const u8 * string, va_list args, u32 maxsize, u32 (*fonction)(u8* src, u8** dest, u32 len), u8* dest); u32 format(const u8 * string, va_list args, u32 maxsize,
u32(*fonction) (u8 * src, u8 ** dest, u32 len), u8 * dest);
/* Fonction pour gérer le pilote */ /* Fonction pour gérer le pilote */
void initdriver(); void initdriver();

51342
lib/3D/man.c

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -8,12 +8,17 @@
/*******************************************************************************/ /*******************************************************************************/
/* Crée une projection simple pour test */ /* Crée une projection simple pour test */
void proj(vector4 list[], vertex2d plane[], vector4 origin[], u16 number, float factor) void proj(vector4 list[], vertex2d plane[], vector4 origin[], u16 number,
float factor)
{ {
for (u32 i = 0; i < number; i++) for (u32 i = 0; i < number; i++)
{ {
plane[i].x=(int)((list[i].x*factor)/(list[i].z+origin->z)+origin->x); plane[i].x =
plane[i].y=(int)((list[i].y*factor)/(list[i].z+origin->z)+origin->y); (int) ((list[i].x * factor) /
(list[i].z + origin->z) + origin->x);
plane[i].y =
(int) ((list[i].y * factor) /
(list[i].z + origin->z) + origin->y);
} }
} }
@ -99,7 +104,8 @@ void cube(model3d *model, vector4 *origin, u16 size)
/*******************************************************************************/ /*******************************************************************************/
/* Affiche un modèle 3D */ /* Affiche un modèle 3D */
void show3dmodel(model3d *model, matrix44 *transformation, vector4 origin[], float factor, type3D type) void show3dmodel(model3d * model, matrix44 * transformation,
vector4 origin[], float factor, type3D type)
{ {
u16 i; u16 i;
vertex2d *plane = 0x00250000; vertex2d *plane = 0x00250000;
@ -108,17 +114,26 @@ void show3dmodel(model3d *model, matrix44 *transformation, vector4 origin[], flo
matrix44_transform(transformation, &model->vertexlist[i]); matrix44_transform(transformation, &model->vertexlist[i]);
} }
proj(model->vertexlist, plane, origin, model->vertexnb, factor); proj(model->vertexlist, plane, origin, model->vertexnb, factor);
switch (type) { switch (type)
{
case TYPE3D_POINTS: case TYPE3D_POINTS:
for(i=0;i<model->vertexnb;i++) { for (i = 0; i < model->vertexnb; i++)
{
v_writepxl(&plane[i], egatorgb(4)); v_writepxl(&plane[i], egatorgb(4));
} }
break; break;
case TYPE3D_LINES: case TYPE3D_LINES:
for(i=0;i<model->facenb;i++) { for (i = 0; i < model->facenb; i++)
v_line(&plane[model->facelist[i].V1], &plane[model->facelist[i].V2], egatorgb(4)); {
v_line(&plane[model->facelist[i].V1], &plane[model->facelist[i].V3], egatorgb(4)); v_line(&plane[model->facelist[i].V1],
v_line(&plane[model->facelist[i].V2], &plane[model->facelist[i].V3], egatorgb(4)); &plane[model->facelist[i].V2],
egatorgb(4));
v_line(&plane[model->facelist[i].V1],
&plane[model->facelist[i].V3],
egatorgb(4));
v_line(&plane[model->facelist[i].V2],
&plane[model->facelist[i].V3],
egatorgb(4));
} }
break; break;
case TYPE3D_FACES: case TYPE3D_FACES:
@ -143,7 +158,8 @@ int load3ds(u8 *pointer,u32 size, model3d *model)
u16 *listunsigned; u16 *listunsigned;
dsState state = DS_READ_CHUNK_ID; dsState state = DS_READ_CHUNK_ID;
bool dsfile = false; bool dsfile = false;
while(ptr-pointer<size) { while (ptr - pointer < size)
{
switch (state) switch (state)
{ {
case DS_READ_CHUNK_ID: case DS_READ_CHUNK_ID:
@ -180,7 +196,8 @@ int load3ds(u8 *pointer,u32 size, model3d *model)
state = DS_READ_MATRIX; state = DS_READ_MATRIX;
break; break;
default: default:
if (!dsfile) return 1; if (!dsfile)
return 1;
ptr += (chunk_size - 6); ptr += (chunk_size - 6);
state = DS_READ_CHUNK_ID; state = DS_READ_CHUNK_ID;
break; break;
@ -204,9 +221,12 @@ int load3ds(u8 *pointer,u32 size, model3d *model)
model->vertexlist = 0x00300000; model->vertexlist = 0x00300000;
while (i < model->vertexnb) while (i < model->vertexnb)
{ {
model->vertexlist[i].x=*(listfloat++); model->vertexlist[i].x =
model->vertexlist[i].y=*(listfloat++); *(listfloat++);
model->vertexlist[i].z=*(listfloat++); model->vertexlist[i].y =
*(listfloat++);
model->vertexlist[i].z =
*(listfloat++);
model->vertexlist[i++].w = 1.0; model->vertexlist[i++].w = 1.0;
} }
ptr = listfloat; ptr = listfloat;
@ -223,9 +243,12 @@ int load3ds(u8 *pointer,u32 size, model3d *model)
model->facelist = 0x00400000; model->facelist = 0x00400000;
while (i < model->facenb) while (i < model->facenb)
{ {
model->facelist[i].V1=*(listunsigned++); model->facelist[i].V1 =
model->facelist[i].V2=*(listunsigned++); *(listunsigned++);
model->facelist[i++].V3=*(listunsigned++); model->facelist[i].V2 =
*(listunsigned++);
model->facelist[i++].V3 =
*(listunsigned++);
listunsigned++; listunsigned++;
} }
ptr = listunsigned; ptr = listunsigned;
@ -236,9 +259,12 @@ int load3ds(u8 *pointer,u32 size, model3d *model)
listfloat = ptr; listfloat = ptr;
while (i < 4) while (i < 4)
{ {
model->view.V[i].x=*(listfloat++); model->view.V[i].x =
model->view.V[i].y=*(listfloat++); *(listfloat++);
model->view.V[i].z=*(listfloat++); model->view.V[i].y =
*(listfloat++);
model->view.V[i].z =
*(listfloat++);
model->view.V[i++].w = 0.0f; model->view.V[i++].w = 0.0f;
} }
model->view.V[3].w = 1.0f; model->view.V[3].w = 1.0f;
@ -252,4 +278,3 @@ int load3ds(u8 *pointer,u32 size, model3d *model)
} }
} }

View File

@ -163,9 +163,12 @@ static pciclass crypto[] = {
static pciclass dasp[] = { static pciclass dasp[] = {
{0x00, "Data Acquisition and Signal Processing Controller, DPIO"}, {0x00, "Data Acquisition and Signal Processing Controller, DPIO"},
{ 0x01, "Data Acquisition and Signal Processing Controller, Performance Counter" }, {0x01,
{ 0x10, "Data Acquisition and Signal Processing Controller, Communications Synchronization" }, "Data Acquisition and Signal Processing Controller, Performance Counter"},
{ 0x20, "Data Acquisition and Signal Processing Controller, Management Card" }, {0x10,
"Data Acquisition and Signal Processing Controller, Communications Synchronization"},
{0x20,
"Data Acquisition and Signal Processing Controller, Management Card"},
{0x80, "Data Acquisition and Signal Processing Controller, Other"}, {0x80, "Data Acquisition and Signal Processing Controller, Other"},
{0, NULL} {0, NULL}
}; };
@ -191,4 +194,3 @@ static pciclass *classcodes[] = {
dasp, dasp,
[255] = NULL [255] = NULL
}; };

View File

@ -4,192 +4,379 @@ Programme de test compilé en mode USER avec SYSCALL, le binaire est intégré a
#include "types.h" #include "types.h"
u8 programs_test[] = { u8 programs_test[] = {
0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00, 0x00, 0xe4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x20, 0x00, 0x02, 0x00, 0x28, 0x00, 0x00,
0x0c, 0x00, 0x09, 0x00, 0x01, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00, 0x00, 0xe4, 0x06, 0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0xa0, 0x00, 0x00, 0x00, 0x00,
0xa0, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x20, 0x00, 0x02, 0x00, 0x28,
0x51, 0xe5, 0x74, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x01, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x8d, 0x4c, 0x24, 0x04, 0x00,
0x83, 0xe4, 0xf0, 0xff, 0x71, 0xfc, 0x55, 0x89, 0xe5, 0x51, 0x83, 0xec, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0xa0, 0x00, 0x00,
0x04, 0xe8, 0x0a, 0x00, 0x00, 0x00, 0x90, 0x83, 0xc4, 0x04, 0x59, 0x5d, 0x00,
0x8d, 0x61, 0xfc, 0xc3, 0x55, 0x89, 0xe5, 0x83, 0xec, 0x10, 0xb8, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x89, 0xe1, 0xba, 0x34, 0x00, 0x00, 0x40, 0x0f, 0x34, 0x00,
0x89, 0x45, 0xfc, 0x90, 0xc9, 0xc3, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x51, 0xe5, 0x74, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x7a, 0x52, 0x00, 0x01, 0x7c, 0x08, 0x01, 0x00,
0x1b, 0x0c, 0x04, 0x04, 0x88, 0x01, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1c, 0x00, 0x00, 0x00, 0xa4, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00,
0x00, 0x44, 0x0c, 0x01, 0x00, 0x47, 0x10, 0x05, 0x02, 0x75, 0x00, 0x43, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x8d, 0x4c, 0x24,
0x0f, 0x03, 0x75, 0x7c, 0x06, 0x4d, 0xc1, 0x0c, 0x01, 0x00, 0x41, 0xc5, 0x04,
0x43, 0x0c, 0x04, 0x04, 0x1c, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x83, 0xe4, 0xf0, 0xff, 0x71, 0xfc, 0x55, 0x89, 0xe5, 0x51, 0x83,
0x98, 0xff, 0xff, 0xff, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x41, 0x0e, 0x08, 0xec,
0x85, 0x02, 0x42, 0x0d, 0x05, 0x56, 0xc5, 0x0c, 0x04, 0x04, 0x00, 0x00, 0x04, 0xe8, 0x0a, 0x00, 0x00, 0x00, 0x90, 0x83, 0xc4, 0x04, 0x59,
0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x5d,
0x86, 0x00, 0x00, 0x00, 0x0c, 0x38, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x8d, 0x61, 0xfc, 0xc3, 0x55, 0x89, 0xe5, 0x83, 0xec, 0x10, 0xb8,
0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x01, 0x06, 0x33, 0x00, 0x00, 0x00, 0x02, 0x02, 0x05, 0x3f, 0x00, 0x00, 0x00, 0x89, 0xe1, 0xba, 0x34, 0x00, 0x00, 0x40, 0x0f,
0x00, 0x00, 0x00, 0x03, 0x04, 0x05, 0x69, 0x6e, 0x74, 0x00, 0x02, 0x08, 0x34,
0x05, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x05, 0x05, 0x00, 0x00, 0x00, 0x89, 0x45, 0xfc, 0x90, 0xc9, 0xc3, 0x00, 0x00, 0x14, 0x00, 0x00,
0x02, 0x01, 0x06, 0x2c, 0x00, 0x00, 0x00, 0x02, 0x01, 0x08, 0x2a, 0x00, 0x00,
0x00, 0x00, 0x02, 0x02, 0x07, 0x49, 0x00, 0x00, 0x00, 0x02, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7a, 0x52, 0x00, 0x01, 0x7c, 0x08,
0x18, 0x00, 0x00, 0x00, 0x02, 0x08, 0x07, 0x13, 0x00, 0x00, 0x00, 0x02, 0x01,
0x04, 0x07, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x1b, 0x0c, 0x04, 0x04, 0x88, 0x01, 0x00, 0x00, 0x28, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x01, 0x9c, 0x00, 0x00,
0xa7, 0x00, 0x00, 0x00, 0x04, 0x00, 0x42, 0x00, 0x00, 0x00, 0x04, 0x01, 0x1c, 0x00, 0x00, 0x00, 0xa4, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00,
0xe9, 0x00, 0x00, 0x00, 0x0c, 0x57, 0x01, 0x00, 0x00, 0x67, 0x01, 0x00, 0x00,
0x00, 0x20, 0x00, 0x00, 0x40, 0x1a, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x44, 0x0c, 0x01, 0x00, 0x47, 0x10, 0x05, 0x02, 0x75, 0x00,
0x00, 0x02, 0x01, 0x06, 0x33, 0x00, 0x00, 0x00, 0x02, 0x02, 0x05, 0x3f, 0x43,
0x00, 0x00, 0x00, 0x03, 0x04, 0x05, 0x69, 0x6e, 0x74, 0x00, 0x02, 0x08, 0x0f, 0x03, 0x75, 0x7c, 0x06, 0x4d, 0xc1, 0x0c, 0x01, 0x00, 0x41,
0x05, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x05, 0x05, 0x00, 0x00, 0x00, 0xc5,
0x02, 0x01, 0x06, 0x2c, 0x00, 0x00, 0x00, 0x02, 0x01, 0x08, 0x2a, 0x00, 0x43, 0x0c, 0x04, 0x04, 0x1c, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00,
0x00, 0x00, 0x02, 0x02, 0x07, 0x49, 0x00, 0x00, 0x00, 0x02, 0x04, 0x07, 0x00,
0x18, 0x00, 0x00, 0x00, 0x02, 0x08, 0x07, 0x13, 0x00, 0x00, 0x00, 0x04, 0x98, 0xff, 0xff, 0xff, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x41, 0x0e,
0x75, 0x33, 0x32, 0x00, 0x02, 0x1d, 0x76, 0x00, 0x00, 0x00, 0x02, 0x04, 0x08,
0x07, 0x1d, 0x00, 0x00, 0x00, 0x05, 0x5e, 0x01, 0x00, 0x00, 0x01, 0x09, 0x85, 0x02, 0x42, 0x0d, 0x05, 0x56, 0xc5, 0x0c, 0x04, 0x04, 0x00,
0x6b, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x1a, 0x00, 0x00, 0x00, 0x00,
0x01, 0x9c, 0x06, 0x26, 0x00, 0x00, 0x40, 0x11, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
0x5f, 0x76, 0x00, 0x01, 0x0b, 0x6b, 0x00, 0x00, 0x00, 0x02, 0x91, 0x74, 0x01,
0x00, 0x00, 0x00, 0x01, 0x11, 0x01, 0x25, 0x0e, 0x13, 0x0b, 0x03, 0x0e, 0x86, 0x00, 0x00, 0x00, 0x0c, 0x38, 0x00, 0x00, 0x00, 0x5c, 0x00,
0x1b, 0x0e, 0x11, 0x01, 0x12, 0x06, 0x10, 0x17, 0x00, 0x00, 0x02, 0x24, 0x00,
0x00, 0x0b, 0x0b, 0x3e, 0x0b, 0x03, 0x0e, 0x00, 0x00, 0x03, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0b, 0x0b, 0x3e, 0x0b, 0x03, 0x08, 0x00, 0x00, 0x04, 0x2e, 0x00, 0x3f, 0x00,
0x19, 0x03, 0x0e, 0x3a, 0x0b, 0x3b, 0x0b, 0x27, 0x19, 0x11, 0x01, 0x12, 0x00, 0x02, 0x01, 0x06, 0x33, 0x00, 0x00, 0x00, 0x02, 0x02, 0x05,
0x06, 0x40, 0x18, 0x96, 0x42, 0x19, 0x00, 0x00, 0x00, 0x01, 0x11, 0x01, 0x3f,
0x25, 0x0e, 0x13, 0x0b, 0x03, 0x0e, 0x1b, 0x0e, 0x11, 0x01, 0x12, 0x06, 0x00, 0x00, 0x00, 0x03, 0x04, 0x05, 0x69, 0x6e, 0x74, 0x00, 0x02,
0x10, 0x17, 0x00, 0x00, 0x02, 0x24, 0x00, 0x0b, 0x0b, 0x3e, 0x0b, 0x03, 0x08,
0x0e, 0x00, 0x00, 0x03, 0x24, 0x00, 0x0b, 0x0b, 0x3e, 0x0b, 0x03, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x05, 0x05, 0x00, 0x00,
0x00, 0x00, 0x04, 0x16, 0x00, 0x03, 0x08, 0x3a, 0x0b, 0x3b, 0x0b, 0x49, 0x00,
0x13, 0x00, 0x00, 0x05, 0x2e, 0x01, 0x3f, 0x19, 0x03, 0x0e, 0x3a, 0x0b, 0x02, 0x01, 0x06, 0x2c, 0x00, 0x00, 0x00, 0x02, 0x01, 0x08, 0x2a,
0x3b, 0x0b, 0x27, 0x19, 0x49, 0x13, 0x11, 0x01, 0x12, 0x06, 0x40, 0x18, 0x00,
0x97, 0x42, 0x19, 0x00, 0x00, 0x06, 0x0b, 0x01, 0x11, 0x01, 0x12, 0x06, 0x00, 0x00, 0x02, 0x02, 0x07, 0x49, 0x00, 0x00, 0x00, 0x02, 0x04,
0x00, 0x00, 0x07, 0x34, 0x00, 0x03, 0x08, 0x3a, 0x0b, 0x3b, 0x0b, 0x49, 0x07,
0x13, 0x02, 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x08, 0x07, 0x13, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x07, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x0e, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x84, 0x00, 0x00, 0x00, 0x01,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x1a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x01, 0x9c,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00,
0x00, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfb, 0x0e, 0xa7, 0x00, 0x00, 0x00, 0x04, 0x00, 0x42, 0x00, 0x00, 0x00, 0x04,
0x0d, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
0x01, 0x00, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x0c, 0x57, 0x01, 0x00, 0x00, 0x67, 0x01,
0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x40, 0x1a, 0x08, 0x13, 0x59, 0x00,
0x02, 0x0a, 0x00, 0x01, 0x01, 0x4b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x33, 0x00, 0x20, 0x00, 0x00, 0x40, 0x1a, 0x00, 0x00, 0x00, 0x37, 0x00,
0x00, 0x00, 0x00, 0x01, 0x01, 0xfb, 0x0e, 0x0d, 0x00, 0x01, 0x01, 0x01, 0x00,
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x2e, 0x2e, 0x2f, 0x69, 0x00, 0x02, 0x01, 0x06, 0x33, 0x00, 0x00, 0x00, 0x02, 0x02, 0x05,
0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x00, 0x00, 0x6c, 0x69, 0x62, 0x63, 0x3f,
0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x00, 0x00, 0x00, 0x03, 0x04, 0x05, 0x69, 0x6e, 0x74, 0x00, 0x02,
0x68, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x20, 0x00, 0x00, 0x08,
0x40, 0x03, 0x09, 0x01, 0x67, 0x08, 0x13, 0x02, 0x03, 0x00, 0x01, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x05, 0x05, 0x00, 0x00,
0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x00,
0x74, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x02, 0x01, 0x06, 0x2c, 0x00, 0x00, 0x00, 0x02, 0x01, 0x08, 0x2a,
0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x00,
0x64, 0x20, 0x69, 0x6e, 0x74, 0x00, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x00, 0x00, 0x02, 0x02, 0x07, 0x49, 0x00, 0x00, 0x00, 0x02, 0x04,
0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x00, 0x74, 0x65, 0x73, 0x74, 0x07,
0x2e, 0x63, 0x00, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x18, 0x00, 0x00, 0x00, 0x02, 0x08, 0x07, 0x13, 0x00, 0x00, 0x00,
0x00, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x04,
0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x00, 0x2f, 0x68, 0x6f, 0x6d, 0x75, 0x33, 0x32, 0x00, 0x02, 0x1d, 0x76, 0x00, 0x00, 0x00, 0x02,
0x65, 0x2f, 0x68, 0x6f, 0x72, 0x64, 0x65, 0x2f, 0x42, 0x75, 0x72, 0x65, 0x04,
0x61, 0x75, 0x2f, 0x50, 0x45, 0x52, 0x53, 0x4f, 0x2f, 0x63, 0x6f, 0x73, 0x07, 0x1d, 0x00, 0x00, 0x00, 0x05, 0x5e, 0x01, 0x00, 0x00, 0x01,
0x32, 0x30, 0x30, 0x30, 0x2f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x09,
0x73, 0x00, 0x47, 0x4e, 0x55, 0x20, 0x43, 0x31, 0x31, 0x20, 0x35, 0x2e, 0x6b, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x1a, 0x00, 0x00,
0x34, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x31, 0x36, 0x30, 0x36, 0x30, 0x39, 0x00,
0x20, 0x2d, 0x6d, 0x33, 0x32, 0x20, 0x2d, 0x6d, 0x74, 0x75, 0x6e, 0x65, 0x01, 0x9c, 0x06, 0x26, 0x00, 0x00, 0x40, 0x11, 0x00, 0x00, 0x00,
0x3d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x20, 0x2d, 0x6d, 0x61, 0x07,
0x72, 0x63, 0x68, 0x3d, 0x69, 0x36, 0x38, 0x36, 0x20, 0x2d, 0x67, 0x20, 0x5f, 0x76, 0x00, 0x01, 0x0b, 0x6b, 0x00, 0x00, 0x00, 0x02, 0x91,
0x2d, 0x4f, 0x30, 0x20, 0x2d, 0x66, 0x66, 0x72, 0x65, 0x65, 0x73, 0x74, 0x74,
0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x2d, 0x66, 0x6e, 0x6f, 0x2d, 0x00, 0x00, 0x00, 0x01, 0x11, 0x01, 0x25, 0x0e, 0x13, 0x0b, 0x03,
0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x20, 0x2d, 0x66, 0x6e, 0x6f, 0x0e,
0x2d, 0x70, 0x69, 0x65, 0x00, 0x47, 0x4e, 0x55, 0x20, 0x43, 0x31, 0x31, 0x1b, 0x0e, 0x11, 0x01, 0x12, 0x06, 0x10, 0x17, 0x00, 0x00, 0x02,
0x20, 0x35, 0x2e, 0x34, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x31, 0x36, 0x30, 0x24,
0x36, 0x30, 0x39, 0x20, 0x2d, 0x46, 0x65, 0x6c, 0x66, 0x2d, 0x69, 0x33, 0x00, 0x0b, 0x0b, 0x3e, 0x0b, 0x03, 0x0e, 0x00, 0x00, 0x03, 0x24,
0x38, 0x36, 0x20, 0x2d, 0x6d, 0x33, 0x32, 0x20, 0x2d, 0x6d, 0x74, 0x75, 0x00,
0x6e, 0x65, 0x3d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x20, 0x2d, 0x0b, 0x0b, 0x3e, 0x0b, 0x03, 0x08, 0x00, 0x00, 0x04, 0x2e, 0x00,
0x6d, 0x61, 0x72, 0x63, 0x68, 0x3d, 0x69, 0x36, 0x38, 0x36, 0x20, 0x2d, 0x3f,
0x67, 0x20, 0x2d, 0x4f, 0x30, 0x20, 0x2d, 0x66, 0x66, 0x72, 0x65, 0x65, 0x19, 0x03, 0x0e, 0x3a, 0x0b, 0x3b, 0x0b, 0x27, 0x19, 0x11, 0x01,
0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x2d, 0x66, 0x6e, 0x12,
0x6f, 0x2d, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x20, 0x2d, 0x66, 0x06, 0x40, 0x18, 0x96, 0x42, 0x19, 0x00, 0x00, 0x00, 0x01, 0x11,
0x6e, 0x6f, 0x2d, 0x70, 0x69, 0x65, 0x00, 0x6c, 0x69, 0x62, 0x63, 0x2e, 0x01,
0x63, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x70, 0x69, 0x00, 0x2f, 0x25, 0x0e, 0x13, 0x0b, 0x03, 0x0e, 0x1b, 0x0e, 0x11, 0x01, 0x12,
0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x68, 0x6f, 0x72, 0x64, 0x65, 0x2f, 0x42, 0x06,
0x75, 0x72, 0x65, 0x61, 0x75, 0x2f, 0x50, 0x45, 0x52, 0x53, 0x4f, 0x2f, 0x10, 0x17, 0x00, 0x00, 0x02, 0x24, 0x00, 0x0b, 0x0b, 0x3e, 0x0b,
0x63, 0x6f, 0x73, 0x32, 0x30, 0x30, 0x30, 0x2f, 0x70, 0x72, 0x6f, 0x67, 0x03,
0x72, 0x61, 0x6d, 0x73, 0x2f, 0x6c, 0x69, 0x62, 0x00, 0x47, 0x43, 0x43, 0x0e, 0x00, 0x00, 0x03, 0x24, 0x00, 0x0b, 0x0b, 0x3e, 0x0b, 0x03,
0x3a, 0x20, 0x28, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x20, 0x35, 0x2e, 0x08,
0x34, 0x2e, 0x30, 0x2d, 0x36, 0x75, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x31, 0x00, 0x00, 0x04, 0x16, 0x00, 0x03, 0x08, 0x3a, 0x0b, 0x3b, 0x0b,
0x7e, 0x31, 0x36, 0x2e, 0x30, 0x34, 0x2e, 0x31, 0x30, 0x29, 0x20, 0x35, 0x49,
0x2e, 0x34, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x31, 0x36, 0x30, 0x36, 0x30, 0x13, 0x00, 0x00, 0x05, 0x2e, 0x01, 0x3f, 0x19, 0x03, 0x0e, 0x3a,
0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x0b, 0x27, 0x19, 0x49, 0x13, 0x11, 0x01, 0x12, 0x06, 0x40,
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x18,
0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x97, 0x42, 0x19, 0x00, 0x00, 0x06, 0x0b, 0x01, 0x11, 0x01, 0x12,
0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x34, 0x00, 0x03, 0x08, 0x3a, 0x0b, 0x3b, 0x0b,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x49,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x02, 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x02,
0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf1, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x84, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf1, 0xff, 0x00,
0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x1a,
0x12, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00,
0x1a, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x00, 0x74, 0x65, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33,
0x74, 0x2e, 0x63, 0x00, 0x6c, 0x69, 0x62, 0x63, 0x2e, 0x63, 0x00, 0x6d, 0x00,
0x61, 0x69, 0x6e, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x70, 0x69, 0x00, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfb,
0x00, 0x00, 0x2e, 0x73, 0x79, 0x6d, 0x74, 0x61, 0x62, 0x00, 0x2e, 0x73, 0x0e,
0x74, 0x72, 0x74, 0x61, 0x62, 0x00, 0x2e, 0x73, 0x68, 0x73, 0x74, 0x72, 0x0d, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
0x74, 0x61, 0x62, 0x00, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x2e, 0x65, 0x00,
0x68, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x00, 0x2e, 0x64, 0x65, 0x62, 0x01, 0x00, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x63, 0x00, 0x00, 0x00,
0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x00, 0x2e, 0x64, 0x65, 0x62, 0x00,
0x75, 0x67, 0x5f, 0x61, 0x62, 0x62, 0x72, 0x65, 0x76, 0x00, 0x2e, 0x64, 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x40, 0x1a, 0x08, 0x13,
0x65, 0x62, 0x75, 0x67, 0x5f, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x59,
0x00, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x02, 0x0a, 0x00, 0x01, 0x01, 0x4b, 0x00, 0x00, 0x00, 0x02, 0x00,
0x00, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x00, 0x33,
0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfb, 0x0e, 0x0d, 0x00, 0x01, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x2e, 0x2e, 0x2f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69,
0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x00, 0x00, 0x6c, 0x69, 0x62,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x74, 0x00, 0x00, 0x00, 0x63,
0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x2e,
0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x40, 0x68, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x20, 0x00,
0xb0, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x09, 0x01, 0x67, 0x08, 0x13, 0x02, 0x03, 0x00, 0x01,
0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x2f, 0x01, 0x00, 0x00, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x69,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6e,
0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x6c, 0x6f, 0x6e, 0x67,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x02, 0x00, 0x00, 0x20,
0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x65,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x00, 0x75, 0x6e, 0x73, 0x69, 0x67,
0xee, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x00, 0x74, 0x65, 0x73,
0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74,
0x00, 0x00, 0x00, 0x00, 0x2e, 0x03, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x2e, 0x63, 0x00, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x69, 0x6e,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x74,
0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x75, 0x6e, 0x73, 0x69,
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x03, 0x00, 0x00, 0x67,
0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x00, 0x2f, 0x68, 0x6f,
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x6d,
0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x2f, 0x68, 0x6f, 0x72, 0x64, 0x65, 0x2f, 0x42, 0x75, 0x72,
0x49, 0x05, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x61, 0x75, 0x2f, 0x50, 0x45, 0x52, 0x53, 0x4f, 0x2f, 0x63, 0x6f,
0x11, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73,
0x00, 0x00, 0x00, 0x00, 0x6d, 0x06, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x32, 0x30, 0x30, 0x30, 0x2f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6d,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x73, 0x00, 0x47, 0x4e, 0x55, 0x20, 0x43, 0x31, 0x31, 0x20, 0x35,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x2e,
0xd0, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x34, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x31, 0x36, 0x30, 0x36, 0x30,
0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x6d, 0x33, 0x32, 0x20, 0x2d, 0x6d, 0x74, 0x75, 0x6e,
0x50, 0x06, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x3d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x20, 0x2d, 0x6d,
0x61,
0x72, 0x63, 0x68, 0x3d, 0x69, 0x36, 0x38, 0x36, 0x20, 0x2d, 0x67,
0x20,
0x2d, 0x4f, 0x30, 0x20, 0x2d, 0x66, 0x66, 0x72, 0x65, 0x65, 0x73,
0x74,
0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x2d, 0x66, 0x6e, 0x6f,
0x2d,
0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x20, 0x2d, 0x66, 0x6e,
0x6f,
0x2d, 0x70, 0x69, 0x65, 0x00, 0x47, 0x4e, 0x55, 0x20, 0x43, 0x31,
0x31,
0x20, 0x35, 0x2e, 0x34, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x31, 0x36,
0x30,
0x36, 0x30, 0x39, 0x20, 0x2d, 0x46, 0x65, 0x6c, 0x66, 0x2d, 0x69,
0x33,
0x38, 0x36, 0x20, 0x2d, 0x6d, 0x33, 0x32, 0x20, 0x2d, 0x6d, 0x74,
0x75,
0x6e, 0x65, 0x3d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x20,
0x2d,
0x6d, 0x61, 0x72, 0x63, 0x68, 0x3d, 0x69, 0x36, 0x38, 0x36, 0x20,
0x2d,
0x67, 0x20, 0x2d, 0x4f, 0x30, 0x20, 0x2d, 0x66, 0x66, 0x72, 0x65,
0x65,
0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x2d, 0x66,
0x6e,
0x6f, 0x2d, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x20, 0x2d,
0x66,
0x6e, 0x6f, 0x2d, 0x70, 0x69, 0x65, 0x00, 0x6c, 0x69, 0x62, 0x63,
0x2e,
0x63, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x70, 0x69, 0x00,
0x2f,
0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x68, 0x6f, 0x72, 0x64, 0x65, 0x2f,
0x42,
0x75, 0x72, 0x65, 0x61, 0x75, 0x2f, 0x50, 0x45, 0x52, 0x53, 0x4f,
0x2f,
0x63, 0x6f, 0x73, 0x32, 0x30, 0x30, 0x30, 0x2f, 0x70, 0x72, 0x6f,
0x67,
0x72, 0x61, 0x6d, 0x73, 0x2f, 0x6c, 0x69, 0x62, 0x00, 0x47, 0x43,
0x43,
0x3a, 0x20, 0x28, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x20, 0x35,
0x2e,
0x34, 0x2e, 0x30, 0x2d, 0x36, 0x75, 0x62, 0x75, 0x6e, 0x74, 0x75,
0x31,
0x7e, 0x31, 0x36, 0x2e, 0x30, 0x34, 0x2e, 0x31, 0x30, 0x29, 0x20,
0x35,
0x2e, 0x34, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x31, 0x36, 0x30, 0x36,
0x30,
0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01,
0x00,
0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
0x00,
0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf1, 0xff, 0x08, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf1,
0xff,
0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00,
0x00,
0x12, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
0x40,
0x1a, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x00, 0x74, 0x65,
0x73,
0x74, 0x2e, 0x63, 0x00, 0x6c, 0x69, 0x62, 0x63, 0x2e, 0x63, 0x00,
0x6d,
0x61, 0x69, 0x6e, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x70,
0x69,
0x00, 0x00, 0x2e, 0x73, 0x79, 0x6d, 0x74, 0x61, 0x62, 0x00, 0x2e,
0x73,
0x74, 0x72, 0x74, 0x61, 0x62, 0x00, 0x2e, 0x73, 0x68, 0x73, 0x74,
0x72,
0x74, 0x61, 0x62, 0x00, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x2e,
0x65,
0x68, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x00, 0x2e, 0x64, 0x65,
0x62,
0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x00, 0x2e, 0x64, 0x65,
0x62,
0x75, 0x67, 0x5f, 0x61, 0x62, 0x62, 0x72, 0x65, 0x76, 0x00, 0x2e,
0x64,
0x65, 0x62, 0x75, 0x67, 0x5f, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x65,
0x73,
0x00, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x6c, 0x69, 0x6e,
0x65,
0x00, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x73, 0x74, 0x72,
0x00,
0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x74, 0x00, 0x00,
0x00,
0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00,
0x00,
0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00,
0x40,
0xb0, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x2f, 0x01, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x02, 0x00,
0x00,
0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00,
0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0xee, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x2e, 0x03, 0x00, 0x00, 0x86, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00,
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x03, 0x00,
0x00,
0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00,
0x00,
0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x49, 0x05, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00,
0x11, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x6d, 0x06, 0x00, 0x00, 0x74, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x00,
0x00,
0xd0, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00,
0x00,
0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
0x00,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x50, 0x06, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00
}; };
unsigned int programs_test_len = 2244; unsigned int programs_test_len = 2244;

View File

@ -3,9 +3,9 @@
/* */ /* */
/* Police de caract鑽e fine 8x16 */ /* Police de caract鑽e fine 8x16 */
static u8 font8x16[4096] = static u8 font8x16[4096] = {
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD, 0x99, 0x81, 0x7E, 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD, 0x99, 0x81, 0x7E,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -22,21 +22,29 @@ static u8 font8x16[4096] =
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF,
0xFF, 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00,
0x00, 0x0F, 0x07, 0x0D, 0x19, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00, 0xFF, 0xFF,
0xFF, 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF,
0xFF, 0x00, 0x00,
0x00,
0x00, 0x0F, 0x07, 0x0D, 0x19, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x30, 0x70, 0xF0, 0xE0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C, 0xE7, 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x63, 0x67, 0xE7, 0xE6,
0xC0, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C, 0xE7, 0x3C, 0xDB, 0x18, 0x18,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x40, 0x60, 0x70, 0x7C, 0x7F, 0x7C, 0x70, 0x60, 0x40, 0x00, 0x00, 0x40, 0x60, 0x70, 0x7C, 0x7F, 0x7C, 0x70, 0x60, 0x40,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -53,21 +61,29 @@ static u8 font8x16[4096] =
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x3C, 0x00, 0x00, 0x18, 0x3C,
0x7E, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x18, 0x00, 0x00, 0x18,
0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x0C, 0x06, 0x7F, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x7F, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x3E, 0x3E, 0x7F, 0x7F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0C, 0x06, 0x7F, 0x06, 0x0C, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x7F, 0x30, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x7F, 0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x3E, 0x3E, 0x7F, 0x7F, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7F, 0x7F, 0x3E, 0x3E, 0x1C, 0x1C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x3E, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -84,21 +100,29 @@ static u8 font8x16[4096] =
0x00, 0x00, 0x61, 0x91, 0x92, 0x00, 0x00, 0x61, 0x91, 0x92,
0x64, 0x08, 0x10, 0x26, 0x49, 0x89, 0x86, 0x00, 0x00, 0x00, 0x00, 0x64, 0x08, 0x10, 0x26, 0x49, 0x89, 0x86, 0x00, 0x00, 0x00, 0x00,
0x00, 0x70, 0x88, 0x88, 0x00, 0x70, 0x88, 0x88,
0x88, 0x50, 0x60, 0x91, 0x8A, 0x84, 0x4A, 0x31, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x60, 0x91, 0x8A, 0x84, 0x4A, 0x31, 0x00, 0x00, 0x00,
0x00,
0x00, 0x18, 0x18, 0x00, 0x18, 0x18,
0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x06,
0x18, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00,
0x00,
0x60, 0x18, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x10, 0x92, 0x54, 0x38, 0xFE, 0x38, 0x54, 0x92, 0x10, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x10, 0x00, 0x06,
0x18, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x18, 0x06, 0x00,
0x00, 0x00, 0x00,
0x00,
0x60, 0x18, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x18, 0x60,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x10, 0x92, 0x54, 0x38, 0xFE, 0x38, 0x54, 0x92, 0x10,
0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0x18, 0x10,
0x20, 0x00, 0x00, 0x20, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
@ -115,21 +139,29 @@ static u8 font8x16[4096] =
0x00, 0x02, 0x06, 0x0A, 0x12, 0x00, 0x02, 0x06, 0x0A, 0x12,
0x22, 0x42, 0x82, 0xFF, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x22, 0x42, 0x82, 0xFF, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x80,
0x80, 0xFC, 0x02, 0x01, 0x01, 0x81, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFC, 0x02, 0x01, 0x01, 0x81, 0x42, 0x3C, 0x00, 0x00, 0x00,
0x00,
0x00, 0x3C, 0x42, 0x00, 0x3C, 0x42,
0x81, 0x80, 0xBC, 0xC2, 0x81, 0x81, 0x81, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x81, 0x80, 0xBC, 0xC2, 0x81, 0x81, 0x81, 0x42, 0x3C, 0x00, 0x00,
0x00, 0xFF,
0x81, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
0x00,
0x3C, 0x42, 0x81, 0x81, 0x42, 0x3C, 0x42, 0x81, 0x81, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3C, 0x42, 0x81, 0x81, 0x43, 0x3D, 0x01, 0x01, 0x81, 0x42, 0x3C, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x10, 0x00, 0xFF,
0x81, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
0x00, 0x00, 0x00,
0x00,
0x3C, 0x42, 0x81, 0x81, 0x42, 0x3C, 0x42, 0x81, 0x81, 0x42, 0x3C,
0x00, 0x00, 0x00, 0x00,
0x00, 0x3C, 0x42, 0x81, 0x81, 0x43, 0x3D, 0x01, 0x01, 0x81, 0x42,
0x3C, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18,
0x18, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18,
0x18, 0x10,
0x20, 0x00, 0x00, 0x20, 0x00, 0x00,
0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x04,
0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -146,21 +178,29 @@ static u8 font8x16[4096] =
0x00, 0x3C, 0x42, 0x81, 0x81, 0x00, 0x3C, 0x42, 0x81, 0x81,
0x80, 0x80, 0x80, 0x80, 0x81, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x81, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFC, 0x42, 0x41, 0x00, 0xFC, 0x42, 0x41,
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0xFC, 0x00, 0x00, 0x00,
0x00,
0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80,
0x80, 0x80, 0x80, 0xFC, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xFC, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x00, 0x00,
0x00, 0xFF,
0x80, 0x80, 0x80, 0x80, 0xFC, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00,
0x3C, 0x42, 0x81, 0x81, 0x80, 0x9F, 0x81, 0x81, 0x81, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x00, 0x00, 0x00,
0x00,
0x00, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00, 0xFF,
0x80, 0x80, 0x80, 0x80, 0xFC, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x81, 0x82, 0x84, 0x88, 0x90, 0xE0, 0x90, 0x88, 0x84, 0x82, 0x81, 0x00,
0x3C, 0x42, 0x81, 0x81, 0x80, 0x9F, 0x81, 0x81, 0x81, 0x42, 0x3C,
0x00, 0x00, 0x00, 0x00,
0x00, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81,
0x81, 0x00, 0x00, 0x00,
0x00,
0x00, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x38, 0x00, 0x00,
0x00, 0x00,
0x00, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, 0x44,
0x38, 0x00,
0x00, 0x00, 0x00,
0x00, 0x81, 0x82, 0x84, 0x88, 0x90, 0xE0, 0x90, 0x88, 0x84, 0x82,
0x81,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
@ -177,21 +217,29 @@ static u8 font8x16[4096] =
0x00, 0xFC, 0x82, 0x81, 0x81, 0x00, 0xFC, 0x82, 0x81, 0x81,
0x82, 0xFC, 0x90, 0x88, 0x84, 0x82, 0x81, 0x00, 0x00, 0x00, 0x00, 0x82, 0xFC, 0x90, 0x88, 0x84, 0x82, 0x81, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3C, 0x42, 0x81, 0x00, 0x3C, 0x42, 0x81,
0x80, 0x40, 0x3C, 0x02, 0x01, 0x81, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x3C, 0x02, 0x01, 0x81, 0x42, 0x3C, 0x00, 0x00, 0x00,
0x00,
0x00, 0xFE, 0x92, 0x00, 0xFE, 0x92,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,
0x00, 0x81,
0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00,
0x81, 0x81, 0x81, 0x81, 0x81, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x99, 0x99, 0xA5, 0xA5, 0x42, 0x00, 0x00, 0x00,
0x00,
0x00, 0x81, 0x81, 0x81, 0x42, 0x24, 0x18, 0x24, 0x42, 0x81, 0x81, 0x81, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x82, 0x82, 0x82, 0x82, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x81,
0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x42, 0x3C, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x01, 0x01, 0x02, 0x04, 0x18, 0x20, 0x40, 0x80, 0x80, 0xFF, 0x00,
0x81, 0x81, 0x81, 0x81, 0x81, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00,
0x00, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x99, 0x99, 0xA5, 0xA5,
0x42, 0x00, 0x00, 0x00,
0x00,
0x00, 0x81, 0x81, 0x81, 0x42, 0x24, 0x18, 0x24, 0x42, 0x81, 0x81,
0x81, 0x00, 0x00,
0x00, 0x00,
0x00, 0x82, 0x82, 0x82, 0x82, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10,
0x10, 0x00,
0x00, 0x00, 0x00,
0x00, 0xFF, 0x01, 0x01, 0x02, 0x04, 0x18, 0x20, 0x40, 0x80, 0x80,
0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7E, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
0x7E, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
@ -208,21 +256,29 @@ static u8 font8x16[4096] =
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7C, 0x02, 0x02, 0x7E, 0x82, 0x82, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x02, 0x02, 0x7E, 0x82, 0x82, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80,
0x80, 0xBC, 0xC2, 0x81, 0x81, 0x81, 0xC2, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x80, 0xBC, 0xC2, 0x81, 0x81, 0x81, 0xC2, 0xBC, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3C, 0x42, 0x80, 0x80, 0x80, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x80, 0x80, 0x80, 0x42, 0x3C, 0x00, 0x00,
0x00, 0x01,
0x01, 0x01, 0x01, 0x3D, 0x43, 0x81, 0x81, 0x81, 0x43, 0x3D, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x81, 0xFF, 0x80, 0x40, 0x3E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0E, 0x11, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x43, 0x81, 0x81, 0x43, 0x3D, 0x01, 0x02, 0x7C,
0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x80, 0x80, 0x80, 0xBC, 0xC2, 0x81, 0x81, 0x81, 0x81, 0x81, 0x00, 0x00, 0x01,
0x01, 0x01, 0x01, 0x3D, 0x43, 0x81, 0x81, 0x81, 0x43, 0x3D, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x08, 0x08, 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x81, 0xFF, 0x80, 0x40, 0x3E,
0x00, 0x00, 0x00, 0x00,
0x00, 0x0E, 0x11, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x43, 0x81, 0x81, 0x43, 0x3D,
0x01, 0x02, 0x7C,
0x00, 0x00,
0x00, 0x80, 0x80, 0x80, 0x80, 0xBC, 0xC2, 0x81, 0x81, 0x81, 0x81,
0x81, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x08, 0x08, 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08,
0x3E,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x02, 0x02, 0x00, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02,
0x82, 0x44, 0x38, 0x00, 0x00, 0x82, 0x44, 0x38, 0x00, 0x00,
@ -239,21 +295,29 @@ static u8 font8x16[4096] =
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xBC, 0xC2, 0x81, 0x81, 0x81, 0xC2, 0xBC, 0x80, 0x80, 0x00, 0x00, 0xBC, 0xC2, 0x81, 0x81, 0x81, 0xC2, 0xBC, 0x80, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3D, 0x43, 0x81, 0x81, 0x81, 0x43, 0x3D, 0x01, 0x01, 0x00, 0x00, 0x00, 0x3D, 0x43, 0x81, 0x81, 0x81, 0x43, 0x3D, 0x01, 0x01, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0xBE, 0xC1, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x7E, 0x81, 0x80, 0x7E, 0x01, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00,
0x10,
0x10, 0x10, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x11, 0x0E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x81, 0x81, 0x81, 0x81, 0x43, 0x3D, 0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x81, 0x81, 0x81, 0x42, 0x24, 0x18, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x92, 0x92, 0x92, 0xAA, 0x44, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x24, 0x18, 0x24, 0x42, 0x81, 0x00, 0x00, 0xBE, 0xC1, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x7E, 0x81, 0x80, 0x7E, 0x01, 0x81, 0x7E, 0x00,
0x00, 0x00, 0x00,
0x10,
0x10, 0x10, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x11, 0x0E,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x81, 0x81, 0x81, 0x81, 0x43,
0x3D, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x81, 0x81, 0x81, 0x42, 0x24,
0x18, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x92, 0x92, 0x92, 0xAA,
0x44, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x24, 0x18, 0x24, 0x42,
0x81,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x81, 0x81, 0x81, 0x43, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x81, 0x81, 0x81, 0x43, 0x3D,
0x01, 0x02, 0x7C, 0x00, 0x00, 0x01, 0x02, 0x7C, 0x00, 0x00,
@ -270,21 +334,29 @@ static u8 font8x16[4096] =
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08,
0x1C, 0x36, 0x63, 0x63, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x36, 0x63, 0x63, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1E, 0x33, 0x00, 0x00, 0x1E, 0x33,
0x61, 0x60, 0x60, 0x61, 0x33, 0x1E, 0x06, 0x03, 0x3E, 0x00, 0x00, 0x00, 0x61, 0x60, 0x60, 0x61, 0x33, 0x1E, 0x06, 0x03, 0x3E, 0x00, 0x00,
0x00,
0x00, 0x00, 0x66, 0x00, 0x00, 0x66,
0x66, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3B, 0x00, 0x00, 0x00,
0x00, 0x06,
0x0C, 0x18, 0x00, 0x3E, 0x63, 0x7F, 0x60, 0x63, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x08, 0x1C, 0x36, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x66, 0x66, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x30, 0x18, 0x0C, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x1C, 0x36, 0x1C, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00, 0x00, 0x00, 0x06,
0x0C, 0x18, 0x00, 0x3E, 0x63, 0x7F, 0x60, 0x63, 0x3E, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x60, 0x66, 0x3C, 0x0C, 0x06, 0x3C, 0x00,
0x08, 0x1C, 0x36, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x66, 0x66, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3B,
0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x30, 0x18, 0x0C, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3B,
0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x1C, 0x36, 0x1C, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3B,
0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x60, 0x66, 0x3C, 0x0C, 0x06,
0x3C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x08, 0x1C, 0x36, 0x00, 0x3E, 0x63, 0x7F, 0x60, 0x63, 0x3E, 0x00, 0x08, 0x1C, 0x36, 0x00, 0x3E, 0x63, 0x7F, 0x60, 0x63, 0x3E,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -301,21 +373,29 @@ static u8 font8x16[4096] =
0x00, 0x63, 0x63, 0x08, 0x1C, 0x00, 0x63, 0x63, 0x08, 0x1C,
0x36, 0x63, 0x63, 0x7F, 0x63, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x63, 0x63, 0x7F, 0x63, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1C, 0x36, 0x1C, 0x00, 0x1C, 0x36, 0x1C, 0x00,
0x1C, 0x36, 0x63, 0x63, 0x7F, 0x63, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x36, 0x63, 0x63, 0x7F, 0x63, 0x63, 0x00, 0x00, 0x00, 0x00,
0x00,
0x0C, 0x18, 0x30, 0x0C, 0x18, 0x30,
0x00, 0x7F, 0x33, 0x30, 0x3E, 0x30, 0x33, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x33, 0x30, 0x3E, 0x30, 0x33, 0x7F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x6E, 0x3B, 0x1B, 0x7E, 0xD8, 0xDC, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x1F, 0x36, 0x66, 0x66, 0x7F, 0x66, 0x66, 0x66, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x08, 0x1C, 0x36, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x3E, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x63, 0x63, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x3E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x30, 0x18, 0x0C, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x3B, 0x1B, 0x7E, 0xD8, 0xDC, 0x77, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x3C, 0x66, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3B, 0x00, 0x00,
0x00, 0x1F, 0x36, 0x66, 0x66, 0x7F, 0x66, 0x66, 0x66, 0x67, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x08, 0x1C, 0x36, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x3E,
0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x63, 0x63, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x3E,
0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x30, 0x18, 0x0C, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x3E,
0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x18, 0x3C, 0x66, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3B,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x30, 0x18, 0x0C, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3B, 0x00, 0x30, 0x18, 0x0C, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3B,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -332,21 +412,29 @@ static u8 font8x16[4096] =
0x00, 0x00, 0xC3, 0x66, 0x3C, 0x00, 0x00, 0xC3, 0x66, 0x3C,
0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFC, 0x66, 0x66, 0x00, 0xFC, 0x66, 0x66,
0x7C, 0x62, 0x66, 0x6F, 0x66, 0x66, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x62, 0x66, 0x6F, 0x66, 0x66, 0xF3, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x0E, 0x1B, 0x00, 0x0E, 0x1B,
0x18, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x18, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x18, 0xD8, 0x70, 0x00,
0x00, 0x0C,
0x18, 0x30, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0C, 0x18, 0x30, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x3E, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x0C, 0x18, 0x30, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3B, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3B, 0x6E, 0x00, 0x6E, 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00, 0x0C,
0x18, 0x30, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3B, 0x6E, 0x00, 0x63, 0x73, 0x7B, 0x7F, 0x6F, 0x67, 0x63, 0x63, 0x00, 0x00,
0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x0C, 0x18, 0x30, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x3E,
0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x0C, 0x18, 0x30, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3B,
0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x3B, 0x6E, 0x00, 0x6E, 0x33, 0x33, 0x33, 0x33, 0x33,
0x00, 0x00,
0x00, 0x00, 0x00,
0x3B, 0x6E, 0x00, 0x63, 0x73, 0x7B, 0x7F, 0x6F, 0x67, 0x63, 0x63,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -363,21 +451,29 @@ static u8 font8x16[4096] =
0x00, 0x60, 0xE0, 0x63, 0x66, 0x00, 0x60, 0xE0, 0x63, 0x66,
0x6C, 0x18, 0x33, 0x67, 0xCF, 0x1F, 0x03, 0x03, 0x00, 0x00, 0x00, 0x6C, 0x18, 0x33, 0x67, 0xCF, 0x1F, 0x03, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18,
0x00, 0x18, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x1B, 0x36, 0x6C, 0x36, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x6C, 0x36, 0x1B, 0x36, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x11,
0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x00, 0x00,
0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x00,
0x00, 0x00,
0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0x00, 0x00, 0x00,
0x00, 0x1B, 0x36, 0x6C, 0x36, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
0x00, 0x00, 0x6C, 0x36, 0x1B, 0x36, 0x6C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00,
0x11,
0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
0x11, 0x44, 0x00, 0x00,
0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
0xAA, 0x55, 0xAA, 0x00,
0x00,
0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD,
0x77, 0xDD, 0x77,
0x00, 0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18,
0x18, 0x00, 0x00, 0x18, 0x00, 0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18,
0x18,
0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x00, 0x00,
@ -394,21 +490,29 @@ static u8 font8x16[4096] =
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x18,
0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x00, 0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18,
0x18, 0x18,
0x18, 0x00, 0x00, 0x18, 0x00, 0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
0x18,
0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -425,21 +529,29 @@ static u8 font8x16[4096] =
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00,
0x36, 0x36, 0x36,
0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x36,
0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36,
0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00,
0x36,
0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x00, 0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18,
0x18, 0x18,
0x18, 0x00, 0x00, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36,
0x36,
0x36, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00, 0x00,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -456,21 +568,29 @@ static u8 font8x16[4096] =
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00,
0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xF0,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x00,
0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x6E, 0x6C, 0x6C, 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x00, 0x00,
0xF0,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
0xF0, 0xF0, 0x00, 0x00,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x0F, 0x0F, 0x0F, 0x00,
0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3E, 0x63, 0x7E, 0x63, 0x63, 0x7E, 0x60, 0x60, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x6E, 0x6C, 0x6C, 0x6E, 0x3B,
0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3E, 0x63, 0x7E, 0x63, 0x63, 0x7E, 0x60,
0x60,
0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7F, 0x63, 0x63, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x7F, 0x63, 0x63, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -487,21 +607,29 @@ static u8 font8x16[4096] =
0x00, 0x00, 0x7E, 0x18, 0x3C, 0x00, 0x00, 0x7E, 0x18, 0x3C,
0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1C, 0x36, 0x00, 0x00, 0x1C, 0x36,
0x63, 0x63, 0x7F, 0x63, 0x63, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x63, 0x7F, 0x63, 0x63, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x1C, 0x00, 0x00, 0x1C,
0x36, 0x63, 0x63, 0x63, 0x36, 0x36, 0x36, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x63, 0x63, 0x63, 0x36, 0x36, 0x36, 0x77, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x1E, 0x30, 0x18, 0x0C, 0x3E, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x06, 0x7E, 0xDB, 0xDB, 0xF3, 0x7E, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C, 0x3E, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x06, 0x7E, 0xDB, 0xDB, 0xF3, 0x7E, 0x60, 0xC0,
0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x30, 0x1C,
0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x00, 0xFF, 0x00, 0x00, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x00, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -518,22 +646,28 @@ static u8 font8x16[4096] =
0x00, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x3B,
0x6E, 0x00, 0x3B, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x3B, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x6C, 0x6C, 0x00, 0x38, 0x6C, 0x6C,
0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00,
0x00,
0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x70, 0xD8, 0x30, 0x60, 0xC8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xD8, 0x30, 0x60, 0xC8, 0xF8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00
}; };

View File

@ -3,9 +3,9 @@
/* */ /* */
/* Police de caract鑽e fine 8x8 */ /* Police de caract鑽e fine 8x8 */
static u8 font8x8[2048] = static u8 font8x8[2048] = {
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x81, 0xA5,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81,
0xBD, 0x99, 0x81, 0x7E, 0xBD, 0x99, 0x81, 0x7E,
0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E, 0x6C, 0xFE, 0xFE, 0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E, 0x6C, 0xFE, 0xFE,
0xFE, 0x7C, 0x38, 0x10, 0x00, 0xFE, 0x7C, 0x38, 0x10, 0x00,
@ -22,21 +22,29 @@ static u8 font8x8[2048] =
0x7F, 0x63, 0x7F, 0x63, 0x63, 0x7F, 0x63, 0x7F, 0x63, 0x63,
0x67, 0xE6, 0xC0, 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99, 0x67, 0xE6, 0xC0, 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99,
0x80, 0xE0, 0xF8, 0xFE, 0x80, 0xE0, 0xF8, 0xFE,
0xF8, 0xE0, 0x80, 0x00, 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00, 0xF8, 0xE0, 0x80, 0x00, 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02,
0x00,
0x18, 0x3C, 0x7E, 0x18, 0x3C, 0x7E,
0x18, 0x18, 0x7E, 0x3C, 0x18, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00,
0x66, 0x00,
0x7F, 0xDB, 0x7F, 0xDB,
0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00, 0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0xCC, 0x78, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00, 0x3E, 0x63, 0x38, 0x6C, 0x6C,
0x38, 0xCC, 0x78,
0x00, 0x00,
0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00, 0x18, 0x3C, 0x7E, 0x18,
0x7E, 0x3C, 0x18, 0xFF,
0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18,
0x18, 0x7E, 0x3C, 0x18,
0x00, 0x00,
0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x30, 0x60,
0xFE, 0x60, 0x30,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF, 0x66, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x24, 0x66,
0xFF, 0x66,
0x24, 0x00, 0x00, 0x24, 0x00, 0x00,
0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7E, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF,
0x7E,
0x3C, 0x18, 0x00, 0x00, 0x3C, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40,
0x40, 0x40, 0x00, 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, 0x00,
@ -53,21 +61,29 @@ static u8 font8x8[2048] =
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x60, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x60, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0x60, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x60, 0x60, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
0x70, 0x88, 0x98,
0xA8, 0xC8, 0x88, 0x70, 0x00, 0x40, 0xC0, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00,
0x70, 0x88,
0x08, 0x10, 0x20, 0x40, 0xF8, 0x00, 0x70, 0x88, 0x08, 0x10, 0x08, 0x88, 0x70, 0x00,
0x08,
0x18, 0x28, 0x48, 0xFC, 0x08, 0x08, 0x00, 0xF8, 0x80, 0x80, 0xF0, 0x08, 0x88, 0x70, 0x00,
0x20, 0x40, 0x80, 0xF0, 0x88, 0x88, 0x70, 0x00, 0xF8, 0x08, 0x10, 0x20, 0x40, 0x40, 0x40,
0x00, 0x00,
0x70, 0x88, 0x88, 0x70, 0x88, 0x88, 0x70, 0x00, 0x70, 0x88, 0x88, 0x78, 0x08, 0x08, 0x70, 0x88, 0x98,
0xA8, 0xC8, 0x88, 0x70, 0x00, 0x40, 0xC0, 0x40, 0x40, 0x40, 0x40,
0xE0, 0x00,
0x70, 0x88,
0x08, 0x10, 0x20, 0x40, 0xF8, 0x00, 0x70, 0x88, 0x08, 0x10, 0x08,
0x88, 0x70, 0x00,
0x08,
0x18, 0x28, 0x48, 0xFC, 0x08, 0x08, 0x00, 0xF8, 0x80, 0x80, 0xF0,
0x08, 0x88, 0x70, 0x00,
0x20, 0x40, 0x80, 0xF0, 0x88, 0x88, 0x70, 0x00, 0xF8, 0x08, 0x10,
0x20, 0x40, 0x40, 0x40,
0x00,
0x70, 0x88, 0x88, 0x70, 0x88, 0x88, 0x70, 0x00, 0x70, 0x88, 0x88,
0x78, 0x08, 0x08,
0x70, 0x00, 0x70, 0x00,
0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60,
0x60, 0x00,
0x60, 0x60, 0x20, 0x60, 0x60, 0x20,
0x10, 0x20, 0x40, 0x80, 0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x10, 0x20, 0x40, 0x80, 0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0xF8,
0x00,
0xF8, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00,
0x80, 0x40, 0x20, 0x10, 0x20, 0x40, 0x80, 0x00, 0x78, 0x84, 0x04, 0x80, 0x40, 0x20, 0x10, 0x20, 0x40, 0x80, 0x00, 0x78, 0x84, 0x04,
0x08, 0x10, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x00,
@ -84,21 +100,29 @@ static u8 font8x8[2048] =
0x38, 0x10, 0x10, 0x10, 0x10, 0x38, 0x10, 0x10, 0x10, 0x10,
0x90, 0x60, 0x00, 0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88, 0x00, 0x90, 0x60, 0x00, 0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88, 0x00,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0xF8, 0x00, 0x82, 0xC6, 0xAA, 0x92, 0x82, 0x82, 0x82, 0x00, 0x80, 0x80, 0xF8, 0x00, 0x82, 0xC6, 0xAA, 0x92, 0x82, 0x82, 0x82,
0x84, 0xC4, 0xA4,
0x94, 0x8C, 0x84, 0x84, 0x00, 0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00,
0xF0, 0x88,
0x88, 0xF0, 0x80, 0x80, 0x80, 0x00, 0x70, 0x88, 0x88, 0x88, 0xA8, 0x90, 0x68, 0x00,
0xF0,
0x88, 0x88, 0xF0, 0xA0, 0x90, 0x88, 0x00, 0x70, 0x88, 0x80, 0x70, 0x08, 0x88, 0x70, 0x00,
0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70,
0x00, 0x00,
0x88, 0x88, 0x88, 0x50, 0x50, 0x20, 0x20, 0x00, 0x82, 0x82, 0x82, 0x82, 0x92, 0x92, 0x84, 0xC4, 0xA4,
0x94, 0x8C, 0x84, 0x84, 0x00, 0x70, 0x88, 0x88, 0x88, 0x88, 0x88,
0x70, 0x00,
0xF0, 0x88,
0x88, 0xF0, 0x80, 0x80, 0x80, 0x00, 0x70, 0x88, 0x88, 0x88, 0xA8,
0x90, 0x68, 0x00,
0xF0,
0x88, 0x88, 0xF0, 0xA0, 0x90, 0x88, 0x00, 0x70, 0x88, 0x80, 0x70,
0x08, 0x88, 0x70, 0x00,
0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x88, 0x88, 0x88,
0x88, 0x88, 0x88, 0x70,
0x00,
0x88, 0x88, 0x88, 0x50, 0x50, 0x20, 0x20, 0x00, 0x82, 0x82, 0x82,
0x82, 0x92, 0x92,
0x6C, 0x00, 0x6C, 0x00,
0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, 0x00, 0x88, 0x88, 0x88, 0x50, 0x20, 0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, 0x00, 0x88, 0x88, 0x88,
0x50, 0x20,
0x20, 0x20, 0x00, 0x20, 0x20, 0x00,
0xF8, 0x08, 0x10, 0x20, 0x40, 0x80, 0xF8, 0x00, 0xE0, 0x80, 0x80, 0x80, 0xF8, 0x08, 0x10, 0x20, 0x40, 0x80, 0xF8, 0x00, 0xE0, 0x80, 0x80,
0x80,
0x80, 0x80, 0xE0, 0x00, 0x80, 0x80, 0xE0, 0x00,
0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0xE0, 0x20, 0x20, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0xE0, 0x20, 0x20,
0x20, 0x20, 0x20, 0xE0, 0x00, 0x20, 0x20, 0x20, 0xE0, 0x00,
@ -115,21 +139,29 @@ static u8 font8x8[2048] =
0x80, 0x80, 0xB0, 0xC8, 0x88, 0x80, 0x80, 0xB0, 0xC8, 0x88,
0x88, 0x88, 0x00, 0x20, 0x00, 0x60, 0x20, 0x20, 0x20, 0x70, 0x00, 0x88, 0x88, 0x00, 0x20, 0x00, 0x60, 0x20, 0x20, 0x20, 0x70, 0x00,
0x10, 0x00, 0x30, 0x10, 0x10, 0x00, 0x30, 0x10,
0x10, 0x10, 0x90, 0x60, 0x80, 0x80, 0x88, 0x90, 0xA0, 0xD0, 0x88, 0x00, 0x10, 0x10, 0x90, 0x60, 0x80, 0x80, 0x88, 0x90, 0xA0, 0xD0, 0x88,
0x00,
0xC0, 0x40, 0x40, 0xC0, 0x40, 0x40,
0x40, 0x40, 0x40, 0xE0, 0x00, 0x00, 0x00, 0xEC, 0x92, 0x92, 0x92, 0x92, 0x00, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00, 0x00, 0xEC, 0x92, 0x92, 0x92,
0x92, 0x00,
0x00, 0x00, 0x00, 0x00,
0xB0, 0xC8, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x70, 0x88, 0x88, 0x88, 0x70, 0x00, 0xB0, 0xC8, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x70, 0x88, 0x88,
0x88, 0x70, 0x00,
0x00, 0x00,
0x00, 0xB0, 0xC8, 0xC8, 0xB0, 0x80, 0x80, 0x00, 0x00, 0x68, 0x98, 0x98, 0x68, 0x08, 0x08, 0x00, 0xB0, 0xC8, 0xC8, 0xB0, 0x80, 0x80, 0x00, 0x00, 0x68, 0x98,
0x98, 0x68, 0x08, 0x08,
0x00, 0x00, 0xB0, 0xC8, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x78, 0x80, 0x70, 0x08, 0xF0, 0x00, 0x00, 0xB0, 0xC8, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x78,
0x80, 0x70, 0x08, 0xF0,
0x00, 0x00,
0x40, 0x40, 0xE0, 0x40, 0x40, 0x50, 0x20, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x98, 0x40, 0x40, 0xE0, 0x40, 0x40, 0x50, 0x20, 0x00, 0x00, 0x00, 0x88,
0x88, 0x88, 0x98,
0x68, 0x00, 0x68, 0x00,
0x00, 0x00, 0x88, 0x88, 0x88, 0x50, 0x20, 0x00, 0x00, 0x00, 0x82, 0x82, 0x92, 0x00, 0x00, 0x88, 0x88, 0x88, 0x50, 0x20, 0x00, 0x00, 0x00, 0x82,
0x82, 0x92,
0x92, 0x6C, 0x00, 0x92, 0x6C, 0x00,
0x00, 0x00, 0x88, 0x50, 0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x50, 0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x88,
0x88,
0x98, 0x68, 0x08, 0x70, 0x98, 0x68, 0x08, 0x70,
0x00, 0x00, 0xF8, 0x10, 0x20, 0x40, 0xF8, 0x00, 0x10, 0x20, 0x20, 0x00, 0x00, 0xF8, 0x10, 0x20, 0x40, 0xF8, 0x00, 0x10, 0x20, 0x20,
0x40, 0x20, 0x20, 0x10, 0x00, 0x40, 0x20, 0x20, 0x10, 0x00,
@ -146,21 +178,29 @@ static u8 font8x8[2048] =
0x48, 0x30, 0x00, 0x78, 0x0C, 0x48, 0x30, 0x00, 0x78, 0x0C,
0x7C, 0xCC, 0x76, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x10, 0x08, 0x30, 0x7C, 0xCC, 0x76, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x10, 0x08, 0x30,
0x30, 0x48, 0x84, 0x78, 0x30, 0x48, 0x84, 0x78,
0xCC, 0xFC, 0xC0, 0x78, 0x00, 0x48, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, 0x48, 0x00, 0x78, 0xCC, 0xFC, 0xC0,
0x78,
0x30, 0x08, 0x00, 0x30, 0x08, 0x00,
0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, 0x48, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, 0x48, 0x00, 0x30, 0x30, 0x30,
0x30, 0x30,
0x30, 0x48, 0x30, 0x48,
0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x60, 0x10, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x60, 0x10, 0x00, 0x30, 0x30,
0x30, 0x30, 0x30,
0x48, 0x48,
0x00, 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0x30, 0x48, 0x30, 0x48, 0x84, 0xFC, 0x84, 0x84, 0x00, 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0x30, 0x48, 0x30, 0x48,
0x84, 0xFC, 0x84, 0x84,
0x18, 0x20, 0x00, 0xF8, 0x80, 0xF0, 0x80, 0xF8, 0x00, 0x00, 0x00, 0x66, 0x19, 0x77, 0x88, 0x18, 0x20, 0x00, 0xF8, 0x80, 0xF0, 0x80, 0xF8, 0x00, 0x00, 0x00,
0x66, 0x19, 0x77, 0x88,
0x77, 0x77,
0x00, 0x00, 0x00, 0x0F, 0x14, 0x3E, 0x44, 0x87, 0x30, 0x48, 0x84, 0x78, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x3E, 0x44, 0x87, 0x30, 0x48, 0x84,
0x78, 0xCC, 0xCC,
0xCC, 0x78, 0xCC, 0x78,
0x00, 0x48, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x60, 0x10, 0x00, 0x78, 0xCC, 0x00, 0x48, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x60, 0x10, 0x00,
0x78, 0xCC,
0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78,
0x30, 0x48, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x60, 0x10, 0x00, 0xCC, 0x30, 0x48, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x60, 0x10, 0x00,
0xCC,
0xCC, 0xCC, 0xCC, 0x76, 0xCC, 0xCC, 0xCC, 0x76,
0x48, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8, 0x44, 0x00, 0x38, 0x48, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8, 0x44, 0x00, 0x38,
0x6C, 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x38,
@ -177,21 +217,29 @@ static u8 font8x8[2048] =
0x80, 0x78, 0x04, 0xF8, 0xCC, 0x80, 0x78, 0x04, 0xF8, 0xCC,
0xCC, 0xCC, 0xCC, 0x80, 0x7E, 0x01, 0xC6, 0xE6, 0xD6, 0xCE, 0xC6, 0xCC, 0xCC, 0xCC, 0x80, 0x7E, 0x01, 0xC6, 0xE6, 0xD6, 0xCE, 0xC6,
0x00, 0x78, 0x0C, 0x7C, 0x00, 0x78, 0x0C, 0x7C,
0xCC, 0x76, 0x00, 0xFE, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0xFC, 0xCC, 0x76, 0x00, 0xFE, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
0xFC,
0x00, 0x00, 0x18, 0x00, 0x00, 0x18,
0x18, 0x30, 0x60, 0x66, 0x3C, 0xFF, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x66, 0x3C, 0xFF, 0x80, 0x80, 0x80, 0x00, 0x00,
0x00, 0x00,
0xFF, 0x01, 0xFF, 0x01,
0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC4, 0x48, 0x50, 0x26, 0x49, 0x82, 0x07, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC4, 0x48, 0x50, 0x26,
0x49, 0x82, 0x07,
0x40, 0x40,
0xC4, 0x48, 0x50, 0x26, 0x4A, 0x9F, 0x02, 0x00, 0x30, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xC4, 0x48, 0x50, 0x26, 0x4A, 0x9F, 0x02, 0x00, 0x30, 0x00, 0x30,
0x30, 0x30, 0x30, 0x30,
0x00, 0x12, 0x24, 0x48, 0x90, 0x48, 0x24, 0x12, 0x00, 0x48, 0x24, 0x12, 0x09, 0x12, 0x24, 0x00, 0x12, 0x24, 0x48, 0x90, 0x48, 0x24, 0x12, 0x00, 0x48, 0x24,
0x12, 0x09, 0x12, 0x24,
0x48, 0x48,
0x49, 0x00, 0x92, 0x00, 0x49, 0x00, 0x92, 0x00, 0x6D, 0x00, 0xB6, 0x00, 0x6D, 0x00, 0x49, 0x00, 0x92, 0x00, 0x49, 0x00, 0x92, 0x00, 0x6D, 0x00, 0xB6,
0x00, 0x6D, 0x00,
0xB6, 0x00, 0xB6, 0x00,
0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0x10, 0x10, 0x10, 0x10, 0x10, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0x10, 0x10, 0x10,
0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0xF0,
0x10, 0xF0, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x10,
0x28, 0x28, 0x28, 0x28, 0xE8, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0xE8, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00,
0x00, 0xF8, 0x28, 0x28, 0x28, 0x00, 0xF8, 0x28, 0x28, 0x28,
@ -208,21 +256,29 @@ static u8 font8x8[2048] =
0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10,
0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x1F, 0x10, 0x1F, 0x10, 0x10, 0x28, 0x28, 0x28, 0x28, 0x3F, 0x28, 0x28, 0x28, 0x1F, 0x10, 0x1F, 0x10, 0x10, 0x28, 0x28, 0x28, 0x28, 0x3F, 0x28,
0x28, 0x28, 0x28, 0x28,
0x28, 0x2F, 0x20, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x20, 0x2F, 0x28, 0x28, 0x28, 0x28,
0x28, 0x2F, 0x20, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x20,
0x2F, 0x28, 0x28,
0x28, 0x28,
0x28, 0x28, 0xEF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xEF, 0x28, 0x28, 0x28, 0x28, 0xEF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0x00, 0xEF, 0x28, 0x28,
0x28, 0x28, 0x28, 0x2F, 0x20, 0x2F, 0x28, 0x28, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x28, 0x28, 0x28, 0x2F, 0x20, 0x2F, 0x28, 0x28, 0x00, 0x00, 0x00,
0xFF, 0x00, 0xFF, 0x00,
0x00, 0x00,
0x28, 0x28, 0x28, 0xEF, 0x00, 0xEF, 0x28, 0x28, 0x10, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x28, 0x28, 0x28, 0xEF, 0x00, 0xEF, 0x28, 0x28, 0x10, 0x10, 0x10,
0xFF, 0x00, 0xFF,
0x00, 0x00, 0x00, 0x00,
0x28, 0x28, 0x28, 0x28, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x28, 0x28, 0x28, 0x28, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0x00,
0xFF, 0x10, 0x10, 0xFF, 0x10, 0x10,
0x00, 0x00, 0x00, 0x00, 0xFF, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
0x28,
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00,
0x10, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1F, 0x10, 0x1F, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x10, 0x10,
@ -239,21 +295,29 @@ static u8 font8x8[2048] =
0x00, 0x00, 0x00, 0x02, 0x34, 0x00, 0x00, 0x00, 0x02, 0x34,
0x4C, 0x4C, 0x32, 0x00, 0x5C, 0x22, 0x22, 0x3C, 0x44, 0x44, 0x78, 0x4C, 0x4C, 0x32, 0x00, 0x5C, 0x22, 0x22, 0x3C, 0x44, 0x44, 0x78,
0x7E, 0x42, 0x42, 0x40, 0x7E, 0x42, 0x42, 0x40,
0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x02, 0x7C, 0xA8, 0x28, 0x28, 0x44, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x02, 0x7C, 0xA8, 0x28, 0x28,
0x44,
0x00, 0x7E, 0x61, 0x00, 0x7E, 0x61,
0x30, 0x18, 0x08, 0x10, 0x20, 0x00, 0x00, 0x08, 0x7F, 0x88, 0x88, 0x88, 0x70, 0x30, 0x18, 0x08, 0x10, 0x20, 0x00, 0x00, 0x08, 0x7F, 0x88, 0x88,
0x88, 0x70,
0x00, 0x00, 0x00, 0x00,
0x00, 0x22, 0x44, 0x44, 0x7A, 0x80, 0x00, 0x00, 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x00, 0x22, 0x44, 0x44, 0x7A, 0x80, 0x00, 0x00, 0x00, 0x7C, 0x10,
0x10, 0x10, 0x10,
0x00, 0x00,
0x1C, 0x08, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x38, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x1C, 0x08, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x38, 0x44,
0x44, 0x7C, 0x44, 0x44,
0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0x66, 0x24, 0x66, 0x0C, 0x10, 0x08, 0x1C, 0x22, 0x22, 0x22, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0x66, 0x24, 0x66, 0x0C, 0x10, 0x08,
0x1C, 0x22, 0x22, 0x22,
0x1C, 0x1C,
0x00, 0x00, 0x00, 0x00, 0x6C, 0x92, 0x92, 0x6C, 0x00, 0x01, 0x1A, 0x26, 0x2A, 0x32, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x92, 0x92, 0x6C, 0x00, 0x01, 0x1A,
0x26, 0x2A, 0x32,
0x2C, 0x40, 0x2C, 0x40,
0x00, 0x18, 0x20, 0x20, 0x30, 0x20, 0x20, 0x18, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x00, 0x18, 0x20, 0x20, 0x30, 0x20, 0x20, 0x18, 0x00, 0x3C, 0x42,
0x42, 0x42,
0x42, 0x42, 0x42, 0x42, 0x42, 0x42,
0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x08, 0x3E, 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x08,
0x3E,
0x08, 0x08, 0x00, 0x3E, 0x08, 0x08, 0x00, 0x3E,
0x00, 0x10, 0x08, 0x04, 0x08, 0x10, 0x00, 0x3E, 0x00, 0x04, 0x08, 0x00, 0x10, 0x08, 0x04, 0x08, 0x10, 0x00, 0x3E, 0x00, 0x04, 0x08,
0x10, 0x08, 0x04, 0x00, 0x3E, 0x10, 0x08, 0x04, 0x00, 0x3E,
@ -270,5 +334,3 @@ static u8 font8x8[2048] =
0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x3E,
0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}; };

View File

@ -27,7 +27,8 @@ static vgamode modes[] = {
0x4F, 0x0D, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x0D, 0x0E, 0x00, 0x00, 0x00, 0x00,
0x9C, 0x0E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3, 0xFF}, 0x9C, 0x0E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3, 0xFF},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0xFF},
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A,
0x3B,
0x3C, 0x3D, 0x3E, 0x3F, 0x3C, 0x3D, 0x3E, 0x3F,
0x0C, 0x00, 0x0F, 0x08, 0x00}}, 0x0C, 0x00, 0x0F, 0x08, 0x00}},
@ -38,7 +39,8 @@ static vgamode modes[] = {
0x47, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x47, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
0x9C, 0x8E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3, 0xFF}, 0x9C, 0x8E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3, 0xFF},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0xFF},
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A,
0x3B,
0x3C, 0x3D, 0x3E, 0x3F, 0x3C, 0x3D, 0x3E, 0x3F,
0x0C, 0x00, 0x0F, 0x00, 0x00}}, 0x0C, 0x00, 0x0F, 0x00, 0x00}},
@ -49,7 +51,8 @@ static vgamode modes[] = {
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xEA, 0x0C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3, 0xFF}, 0xEA, 0x0C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3, 0xFF},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x3A, 0x3B, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x3A,
0x3B,
0x3C, 0x3D, 0x3E, 0x3F, 0x3C, 0x3D, 0x3E, 0x3F,
0x01, 0x00, 0x0F, 0x00, 0x00}}, 0x01, 0x00, 0x0F, 0x00, 0x00}},
@ -60,7 +63,8 @@ static vgamode modes[] = {
0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x9C, 0x0E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xA3, 0xFF}, 0x9C, 0x0E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xA3, 0xFF},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x02, 0x00, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x02, 0x00, 0xFF},
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x3A, 0x3B, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x3A,
0x3B,
0x3C, 0x3D, 0x3E, 0x3F, 0x3C, 0x3D, 0x3E, 0x3F,
0x01, 0x00, 0x03, 0x00, 0x00}}, 0x01, 0x00, 0x03, 0x00, 0x00}},
@ -71,7 +75,8 @@ static vgamode modes[] = {
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xE9, 0x8B, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3, 0xFF}, 0xE9, 0x8B, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3, 0xFF},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x3A, 0x3B, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x3A,
0x3B,
0x3C, 0x3D, 0x3E, 0x3F, 0x3C, 0x3D, 0x3E, 0x3F,
0x01, 0x00, 0x0F, 0x00, 0x00}}, 0x01, 0x00, 0x0F, 0x00, 0x00}},
@ -82,7 +87,8 @@ static vgamode modes[] = {
0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x9C, 0x0E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3, 0xFF}, 0x9C, 0x0E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3, 0xFF},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF},
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x0C, 0x0D, 0x0E, 0x0F,
0x41, 0x00, 0x0F, 0x00, 0x00}}, 0x41, 0x00, 0x0F, 0x00, 0x00}},
@ -93,7 +99,8 @@ static vgamode modes[] = {
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xE3, 0xFF}, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xE3, 0xFF},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF},
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x0C, 0x0D, 0x0E, 0x0F,
0x41, 0x00, 0x0F, 0x00, 0x00}}, 0x41, 0x00, 0x0F, 0x00, 0x00}},
@ -104,7 +111,8 @@ static vgamode modes[] = {
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xEA, 0xAC, 0xDF, 0x28, 0x00, 0xE7, 0x06, 0xE3, 0xFF}, 0xEA, 0xAC, 0xDF, 0x28, 0x00, 0xE7, 0x06, 0xE3, 0xFF},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF},
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x0C, 0x0D, 0x0E, 0x0F,
0x41, 0x00, 0x0F, 0x00, 0x00}}, 0x41, 0x00, 0x0F, 0x00, 0x00}},
@ -115,7 +123,8 @@ static vgamode modes[] = {
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xEA, 0xAC, 0xDF, 0x2D, 0x00, 0xE7, 0x06, 0xE3, 0xFF}, 0xEA, 0xAC, 0xDF, 0x2D, 0x00, 0xE7, 0x06, 0xE3, 0xFF},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF},
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x0C, 0x0D, 0x0E, 0x0F,
0x41, 0x00, 0x0F, 0x00, 0x00}}, 0x41, 0x00, 0x0F, 0x00, 0x00}},
}; };

142
lib/cpu.c
View File

@ -56,7 +56,8 @@ void cpuid(u32 op, u32 * eax, u32 * ebx, u32 * ecx, u32 * edx)
u8 getcpuinfos(cpuinfo * proc) u8 getcpuinfos(cpuinfo * proc)
{ {
u32 i, maxfunction, maxextended, unused, regeax, regebx, regecx, regedx; u32 i, maxfunction, maxextended, unused, regeax, regebx,
regecx, regedx;
bool *boolean; bool *boolean;
if (!cansetflag(0x00040000)) if (!cansetflag(0x00040000))
@ -68,7 +69,8 @@ u8 getcpuinfos(cpuinfo * proc)
maxfunction &= 0xffff; maxfunction &= 0xffff;
cpuid(0x80000000, &maxextended, &unused, &unused, &unused); cpuid(0x80000000, &maxextended, &unused, &unused, &unused);
maxextended &= 0xffff; maxextended &= 0xffff;
if (maxfunction >= 1) { if (maxfunction >= 1)
{
cpuid(1, &regeax, &regebx, &regecx, &regedx); cpuid(1, &regeax, &regebx, &regecx, &regedx);
proc->stepping = (regeax & 0x0000000F); proc->stepping = (regeax & 0x0000000F);
proc->models = ((regeax >> 4) & 0x0000000F); proc->models = ((regeax >> 4) & 0x0000000F);
@ -93,7 +95,8 @@ u8 getcpuinfos(cpuinfo * proc)
proc->sse42 = ((regecx >> 20) & 0x00000001); proc->sse42 = ((regecx >> 20) & 0x00000001);
proc->apic2 = ((regecx >> 21) & 0x00000001); proc->apic2 = ((regecx >> 21) & 0x00000001);
} }
if (maxextended >= 1) { if (maxextended >= 1)
{
cpuid(0x80000001, &regeax, &regebx, &regecx, &regedx); cpuid(0x80000001, &regeax, &regebx, &regecx, &regedx);
proc->mmx2 = ((regedx >> 22) & 0x00000001); proc->mmx2 = ((regedx >> 22) & 0x00000001);
proc->apic = ((regedx >> 9) & 0x00000001); proc->apic = ((regedx >> 9) & 0x00000001);
@ -104,22 +107,29 @@ u8 getcpuinfos(cpuinfo * proc)
proc->msr = ((regedx >> 5) & 0x00000001); proc->msr = ((regedx >> 5) & 0x00000001);
proc->sse4a = ((regecx >> 6) & 0x00000001); proc->sse4a = ((regecx >> 6) & 0x00000001);
} }
if (maxextended >= 4) { if (maxextended >= 4)
{
int i; int i;
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++)
{
cpuid(0x80000002 + i, &regeax, &regebx, &regecx, cpuid(0x80000002 + i, &regeax, &regebx, &regecx,
&regedx); &regedx);
memcpy(&regeax, &proc->detectedname[0 + i * 16], 4, 1); memcpy(&regeax, &proc->detectedname[0 + i * 16], 4,
memcpy(&regebx, &proc->detectedname[4 + i * 16], 4, 1); 1);
memcpy(&regecx, &proc->detectedname[8 + i * 16], 4, 1); memcpy(&regebx, &proc->detectedname[4 + i * 16], 4,
memcpy(&regedx, &proc->detectedname[12 + i * 16], 4, 1); 1);
memcpy(&regecx, &proc->detectedname[8 + i * 16], 4,
1);
memcpy(&regedx, &proc->detectedname[12 + i * 16],
4, 1);
} }
} }
boolean = &proc->mmx; boolean = &proc->mmx;
i = 0; i = 0;
proc->techs[0] = '\000'; proc->techs[0] = '\000';
for (i = 0; i < sizeof(msg); i++) for (i = 0; i < sizeof(msg); i++)
if (*(boolean++) == 1) { if (*(boolean++) == 1)
{
strcat(msg[i], &proc->techs); strcat(msg[i], &proc->techs);
strcat(space, &proc->techs); strcat(space, &proc->techs);
} }
@ -132,10 +142,12 @@ u8 getcpuinfos(cpuinfo * proc)
void show_lightcpu(regs * stack) void show_lightcpu(regs * stack)
{ {
u32 i; u32 i;
printf("\33[0mEAX=%Y EBX=%Y ECX=%Y EDX=%Y\r\n", stack->eax, stack->ebx, stack->ecx, stack->edx); printf("\33[0mEAX=%Y EBX=%Y ECX=%Y EDX=%Y\r\n", stack->eax,
printf("ESI=%Y EDI=%Y ESP=%Y EBP=%Y\r\n", stack->esi, stack->edi, stack->esp, stack->ebp); stack->ebx, stack->ecx, stack->edx);
printf("EIP=%Y EFL=%Y [%c%c%c%c%c%c%c%c%c]\r\n", stack->eip, stack->eflags, printf("ESI=%Y EDI=%Y ESP=%Y EBP=%Y\r\n", stack->esi, stack->edi,
(stack->eflags & (1 <<11)) ? 'O':'-', stack->esp, stack->ebp);
printf("EIP=%Y EFL=%Y [%c%c%c%c%c%c%c%c%c]\r\n", stack->eip,
stack->eflags, (stack->eflags & (1 << 11)) ? 'O' : '-',
(stack->eflags & (1 << 10)) ? 'D' : '-', (stack->eflags & (1 << 10)) ? 'D' : '-',
(stack->eflags & (1 << 9)) ? 'I' : '-', (stack->eflags & (1 << 9)) ? 'I' : '-',
(stack->eflags & (1 << 8)) ? 'T' : '-', (stack->eflags & (1 << 8)) ? 'T' : '-',
@ -144,20 +156,27 @@ void show_lightcpu(regs *stack)
(stack->eflags & (1 << 4)) ? 'A' : '-', (stack->eflags & (1 << 4)) ? 'A' : '-',
(stack->eflags & (1 << 2)) ? 'P' : '-', (stack->eflags & (1 << 2)) ? 'P' : '-',
(stack->eflags & (1 << 0)) ? 'C' : '-'); (stack->eflags & (1 << 0)) ? 'C' : '-');
printf("CS =%hY DS =%hY SS =%hY ES =%hY FS =%hY GS =%hY\r\n",stack->cs,stack->ds,stack->ss,stack->es,stack->fs,stack->gs); printf("CS =%hY DS =%hY SS =%hY ES =%hY FS =%hY GS =%hY\r\n",
printf("CR0=%Y CR2=%Y CR3=%Y CR4=%Y\r\n\r\n\r\n",stack->cr0,stack->cr2,stack->cr3,stack->cr4); stack->cs, stack->ds, stack->ss, stack->es, stack->fs,
stack->gs);
printf("CR0=%Y CR2=%Y CR3=%Y CR4=%Y\r\n\r\n\r\n", stack->cr0,
stack->cr2, stack->cr3, stack->cr4);
u8 *size; u8 *size;
u8 *pointer; u8 *pointer;
for(i=20;i<50;i++) { for (i = 20; i < 50; i++)
{
pointer = stack->eip - i; pointer = stack->eip - i;
size = pointer; size = pointer;
size += 50; size += 50;
while(pointer<size) { while (pointer < size)
{
pointer += disasm(pointer, NULL, false); pointer += disasm(pointer, NULL, false);
if (pointer==stack->eip) break; if (pointer == stack->eip)
break;
} }
if (pointer==stack->eip) break; if (pointer == stack->eip)
break;
} }
if (pointer == stack->eip) if (pointer == stack->eip)
pointer = stack->eip - i; pointer = stack->eip - i;
@ -180,11 +199,15 @@ void show_lightcpu(regs *stack)
else else
{ {
i = 0; i = 0;
for (u32 *pointer = stack->esp; pointer < KERNEL_STACK_ADDR; pointer ++) { for (u32 * pointer = stack->esp;
if (i>0 && i % 10 == 0) print("\033[10A"); pointer < KERNEL_STACK_ADDR; pointer++)
{
if (i > 0 && i % 10 == 0)
print("\033[10A");
if (i >= 10) if (i >= 10)
print("\033[25C"); print("\033[25C");
printf("+%d:%Y - %Y\r\n", i++, pointer, (u32)(*pointer)); printf("+%d:%Y - %Y\r\n", i++, pointer,
(u32) (*pointer));
} }
for (u32 j = 0; j < 10 - (i % 10); j++) for (u32 j = 0; j < 10 - (i % 10); j++)
print("\033[01B"); print("\033[01B");
@ -196,10 +219,12 @@ void show_lightcpu(regs *stack)
void show_cpu(regs * stack) void show_cpu(regs * stack)
{ {
printf("EAX=%Y EBX=%Y ECX=%Y EDX=%Y\r\n", stack->eax, stack->ebx, stack->ecx, stack->edx); printf("EAX=%Y EBX=%Y ECX=%Y EDX=%Y\r\n", stack->eax, stack->ebx,
printf("ESI=%Y EDI=%Y ESP=%Y EBP=%Y\r\n", stack->esi, stack->edi, stack->esp, stack->ebp); stack->ecx, stack->edx);
printf("EIP=%Y EFL=%Y [%c%c%c%c%c%c%c%c%c]\r\n", stack->eip, stack->eflags, printf("ESI=%Y EDI=%Y ESP=%Y EBP=%Y\r\n", stack->esi, stack->edi,
(stack->eflags & (1 <<11)) ? 'O':'-', stack->esp, stack->ebp);
printf("EIP=%Y EFL=%Y [%c%c%c%c%c%c%c%c%c]\r\n", stack->eip,
stack->eflags, (stack->eflags & (1 << 11)) ? 'O' : '-',
(stack->eflags & (1 << 10)) ? 'D' : '-', (stack->eflags & (1 << 10)) ? 'D' : '-',
(stack->eflags & (1 << 9)) ? 'I' : '-', (stack->eflags & (1 << 9)) ? 'I' : '-',
(stack->eflags & (1 << 8)) ? 'T' : '-', (stack->eflags & (1 << 8)) ? 'T' : '-',
@ -208,23 +233,58 @@ void show_cpu(regs *stack)
(stack->eflags & (1 << 4)) ? 'A' : '-', (stack->eflags & (1 << 4)) ? 'A' : '-',
(stack->eflags & (1 << 2)) ? 'P' : '-', (stack->eflags & (1 << 2)) ? 'P' : '-',
(stack->eflags & (1 << 0)) ? 'C' : '-'); (stack->eflags & (1 << 0)) ? 'C' : '-');
printf("CS =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n",stack->cs,getdesbase(stack->cs),getdeslimit(stack->cs),getdesdpl(stack->cs),getdestype(stack->cs),getdessize(stack->cs),getdesbit3(stack->cs),getdesbit2(stack->cs),getdesbit1(stack->cs),getdesalign(stack->cs)); printf("CS =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n", stack->cs,
printf("DS =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n",stack->ds,getdesbase(stack->ds),getdeslimit(stack->ds),getdesdpl(stack->ds),getdestype(stack->ds),getdessize(stack->ds),getdesbit3(stack->ds),getdesbit2(stack->ds),getdesbit1(stack->ds),getdesalign(stack->ds)); getdesbase(stack->cs), getdeslimit(stack->cs),
printf("SS =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n",stack->ss,getdesbase(stack->ss),getdeslimit(stack->ss),getdesdpl(stack->ss),getdestype(stack->ss),getdessize(stack->ss),getdesbit3(stack->ss),getdesbit2(stack->ss),getdesbit1(stack->ss),getdesalign(stack->ss)); getdesdpl(stack->cs), getdestype(stack->cs),
printf("ES =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n",stack->es,getdesbase(stack->es),getdeslimit(stack->es),getdesdpl(stack->es),getdestype(stack->es),getdessize(stack->es),getdesbit3(stack->es),getdesbit2(stack->es),getdesbit1(stack->es),getdesalign(stack->es)); getdessize(stack->cs), getdesbit3(stack->cs),
printf("FS =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n",stack->fs,getdesbase(stack->fs),getdeslimit(stack->fs),getdesdpl(stack->fs),getdestype(stack->fs),getdessize(stack->fs),getdesbit3(stack->fs),getdesbit2(stack->fs),getdesbit1(stack->fs),getdesalign(stack->fs)); getdesbit2(stack->cs), getdesbit1(stack->cs),
printf("GS =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n",stack->gs,getdesbase(stack->gs),getdeslimit(stack->gs),getdesdpl(stack->gs),getdestype(stack->gs),getdessize(stack->gs),getdesbit3(stack->gs),getdesbit2(stack->gs),getdesbit1(stack->gs),getdesalign(stack->gs)); getdesalign(stack->cs));
printf("DS =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n", stack->ds,
getdesbase(stack->ds), getdeslimit(stack->ds),
getdesdpl(stack->ds), getdestype(stack->ds),
getdessize(stack->ds), getdesbit3(stack->ds),
getdesbit2(stack->ds), getdesbit1(stack->ds),
getdesalign(stack->ds));
printf("SS =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n", stack->ss,
getdesbase(stack->ss), getdeslimit(stack->ss),
getdesdpl(stack->ss), getdestype(stack->ss),
getdessize(stack->ss), getdesbit3(stack->ss),
getdesbit2(stack->ss), getdesbit1(stack->ss),
getdesalign(stack->ss));
printf("ES =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n", stack->es,
getdesbase(stack->es), getdeslimit(stack->es),
getdesdpl(stack->es), getdestype(stack->es),
getdessize(stack->es), getdesbit3(stack->es),
getdesbit2(stack->es), getdesbit1(stack->es),
getdesalign(stack->es));
printf("FS =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n", stack->fs,
getdesbase(stack->fs), getdeslimit(stack->fs),
getdesdpl(stack->fs), getdestype(stack->fs),
getdessize(stack->fs), getdesbit3(stack->fs),
getdesbit2(stack->fs), getdesbit1(stack->fs),
getdesalign(stack->fs));
printf("GS =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n", stack->gs,
getdesbase(stack->gs), getdeslimit(stack->gs),
getdesdpl(stack->gs), getdestype(stack->gs),
getdessize(stack->gs), getdesbit3(stack->gs),
getdesbit2(stack->gs), getdesbit1(stack->gs),
getdesalign(stack->gs));
u32 tss; u32 tss;
str(tss); str(tss);
printf("TR =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n",stack->gs,getdesbase(tss),getdeslimit(tss),getdesdpl(tss),getdestype(tss),getdessize(tss),getdesbit3(tss),getdesbit2(tss),getdesbit1(tss),getdesalign(tss)); printf("TR =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\r\n", stack->gs,
getdesbase(tss), getdeslimit(tss), getdesdpl(tss),
getdestype(tss), getdessize(tss), getdesbit3(tss),
getdesbit2(tss), getdesbit1(tss), getdesalign(tss));
struct gdtr gdtreg; struct gdtr gdtreg;
sgdt(&gdtreg); sgdt(&gdtreg);
printf("GDT= %Y %Y\r\n", gdtreg.base, gdtreg.limite); printf("GDT= %Y %Y\r\n", gdtreg.base, gdtreg.limite);
struct idtr idtreg; struct idtr idtreg;
sidt(&idtreg); sidt(&idtreg);
printf("IDT= %Y %Y\r\n", idtreg.base, idtreg.limite); printf("IDT= %Y %Y\r\n", idtreg.base, idtreg.limite);
printf("CR0=%Y CR2=%Y CR3=%Y CR4=%Y\r\n",stack->cr0,stack->cr2,stack->cr3,stack->cr4); printf("CR0=%Y CR2=%Y CR3=%Y CR4=%Y\r\n", stack->cr0, stack->cr2,
printf("DR0=%Y DR1=%Y DR2=%Y DR3=%Y\r\n",stack->dr0,stack->dr1,stack->dr2,stack->dr3); stack->cr3, stack->cr4);
printf("DR0=%Y DR1=%Y DR2=%Y DR3=%Y\r\n", stack->dr0, stack->dr1,
stack->dr2, stack->dr3);
printf("DR6=%Y DR7=%Y\r\n", stack->dr6, stack->dr7); printf("DR6=%Y DR7=%Y\r\n", stack->dr6, stack->dr7);
printf("EFER=%lY\r\n", stack->efer); printf("EFER=%lY\r\n", stack->efer);
printf("STACK\r\n"); printf("STACK\r\n");
@ -233,11 +293,15 @@ void show_cpu(regs *stack)
else else
{ {
u32 i = 0; u32 i = 0;
for (u32 *pointer = stack->esp; pointer < KERNEL_STACK_ADDR; pointer ++) { for (u32 * pointer = stack->esp;
if (i>0 && i % 10 == 0) print("\033[10A"); pointer < KERNEL_STACK_ADDR; pointer++)
{
if (i > 0 && i % 10 == 0)
print("\033[10A");
if (i >= 10) if (i >= 10)
print("\033[25C"); print("\033[25C");
printf("+%d:%Y - %Y\r\n", i++, pointer, (u32)(*pointer)); printf("+%d:%Y - %Y\r\n", i++, pointer,
(u32) (*pointer));
} }
for (u32 j = 0; j < 10 - (i % 10); j++) for (u32 j = 0; j < 10 - (i % 10); j++)
print("\033[01B"); print("\033[01B");

File diff suppressed because it is too large Load Diff

View File

@ -90,7 +90,8 @@ u32 getdesbase(u16 sel)
{ {
gdtdes *entry = GDT_ADDR; gdtdes *entry = GDT_ADDR;
u8 index = sel / sizeof(gdtdes); u8 index = sel / sizeof(gdtdes);
return (entry[index].base0_15+(entry[index].base16_23<<16)+(entry[index].base24_31<<24)); return (entry[index].base0_15 + (entry[index].base16_23 << 16) +
(entry[index].base24_31 << 24));
} }
/*******************************************************************************/ /*******************************************************************************/
@ -110,7 +111,7 @@ u32 getdesdpl(u16 sel)
{ {
gdtdes *entry = GDT_ADDR; gdtdes *entry = GDT_ADDR;
u8 index = sel / sizeof(gdtdes); u8 index = sel / sizeof(gdtdes);
return (entry[index].acces>>5 & 0b11); return (entry[index].acces >> 5 & 0x03);
} }
/*******************************************************************************/ /*******************************************************************************/
@ -120,10 +121,13 @@ u8 getdestype(u16 sel)
{ {
gdtdes *entry = GDT_ADDR; gdtdes *entry = GDT_ADDR;
u8 index = sel / sizeof(gdtdes); u8 index = sel / sizeof(gdtdes);
if (((entry[index].acces & 0b10100) == 0) && ((entry[index].acces & 0b01000) > 0) && ((entry[index].acces & 0b0001) > 0) && ((entry[index].flags & 0b0110) == 0)) if (((entry[index].acces & 0x14) == 0)
&& ((entry[index].acces & 0x08) > 0)
&& ((entry[index].acces & 0x01) > 0)
&& ((entry[index].flags & 0x06) == 0))
return 'T'; return 'T';
else else
return (((entry[index].acces & 0b1000) > 0) ? 'C' : 'D'); return (((entry[index].acces & 0x08) > 0) ? 'C' : 'D');
} }
/*******************************************************************************/ /*******************************************************************************/
@ -133,10 +137,13 @@ u8 getdesbit1(u16 sel)
{ {
gdtdes *entry = GDT_ADDR; gdtdes *entry = GDT_ADDR;
u8 index = sel / sizeof(gdtdes); u8 index = sel / sizeof(gdtdes);
if (((entry[index].acces & 0b10100) == 0) && ((entry[index].acces & 0b01000) > 0) && ((entry[index].acces & 0b0001) > 0) && ((entry[index].flags & 0b0110) == 0)) if (((entry[index].acces & 0x14) == 0)
return (((entry[index].acces & 0b10) > 0) ? 'B' : '-'); && ((entry[index].acces & 0x08) > 0)
&& ((entry[index].acces & 0x01) > 0)
&& ((entry[index].flags & 0x06) == 0))
return (((entry[index].acces & 0x04) > 0) ? 'B' : '-');
else else
return (((entry[index].acces & 0b1) > 0) ? 'A' : '-'); return (((entry[index].acces & 0x01) > 0) ? 'A' : '-');
} }
/*******************************************************************************/ /*******************************************************************************/
@ -146,12 +153,15 @@ u8 getdesbit2(u16 sel)
{ {
gdtdes *entry = GDT_ADDR; gdtdes *entry = GDT_ADDR;
u8 index = sel / sizeof(gdtdes); u8 index = sel / sizeof(gdtdes);
if (((entry[index].acces & 0b10100) == 0) && ((entry[index].acces & 0b01000) > 0) && ((entry[index].acces & 0b0001) > 0) && ((entry[index].flags & 0b0110) == 0)) if (((entry[index].acces & 0x20) == 0)
return (((entry[index].flags & 0b1) > 0) ? 'U' : '-'); && ((entry[index].acces & 0x08) > 0)
else if ((entry[index].acces & 0b1000) > 0) && ((entry[index].acces & 0x01) > 0)
return (((entry[index].acces & 0b10) > 0) ? 'R' : '-'); && ((entry[index].flags & 0x06) == 0))
return (((entry[index].flags & 0x01) > 0) ? 'U' : '-');
else if ((entry[index].acces & 0x8) > 0)
return (((entry[index].acces & 0x02) > 0) ? 'R' : '-');
else else
return (((entry[index].acces & 0b10) > 0) ? 'W' : 'R'); return (((entry[index].acces & 0x02) > 0) ? 'W' : 'R');
} }
/*******************************************************************************/ /*******************************************************************************/
@ -161,10 +171,10 @@ u8 getdesbit3(u16 sel)
{ {
gdtdes *entry = GDT_ADDR; gdtdes *entry = GDT_ADDR;
u8 index = sel / sizeof(gdtdes); u8 index = sel / sizeof(gdtdes);
if ((entry[index].acces & 0b1000) > 0) if ((entry[index].acces & 0x08) > 0)
return (((entry[index].acces & 0b100) > 0) ? 'C' : '-'); return (((entry[index].acces & 0x04) > 0) ? 'C' : '-');
else else
return (((entry[index].acces & 0b100) > 0) ? 'D' : 'U'); return (((entry[index].acces & 0x04) > 0) ? 'D' : 'U');
} }
/*******************************************************************************/ /*******************************************************************************/
@ -174,7 +184,7 @@ u16 getdesalign(u16 sel)
{ {
gdtdes *entry = GDT_ADDR; gdtdes *entry = GDT_ADDR;
u8 index = sel / sizeof(gdtdes); u8 index = sel / sizeof(gdtdes);
return (((entry[index].flags & 0b1000) > 0) ? 4096: 1); return (((entry[index].flags & 0x08) > 0) ? 4096 : 1);
} }
/*******************************************************************************/ /*******************************************************************************/
@ -184,7 +194,7 @@ bool isdesvalid(u16 sel)
{ {
gdtdes *entry = GDT_ADDR; gdtdes *entry = GDT_ADDR;
u8 index = sel / sizeof(gdtdes); u8 index = sel / sizeof(gdtdes);
return ((entry[index].acces & 0b10000000) > 0); return ((entry[index].acces & 0x80) > 0);
} }
/*******************************************************************************/ /*******************************************************************************/
@ -194,10 +204,13 @@ u32 getdessize(u16 sel)
{ {
gdtdes *entry = GDT_ADDR; gdtdes *entry = GDT_ADDR;
u8 index = sel / sizeof(gdtdes); u8 index = sel / sizeof(gdtdes);
if (((entry[index].acces & 0b10100) == 0) && ((entry[index].acces & 0b01000) > 0) && ((entry[index].acces & 0b0001) > 0) && ((entry[index].flags & 0b0110) == 0)) if (((entry[index].acces & 0x14) == 0)
&& ((entry[index].acces & 0x08) > 0)
&& ((entry[index].acces & 0x01) > 0)
&& ((entry[index].flags & 0x06) == 0))
return 32; return 32;
else else
return (((entry[index].flags & 0b1000) > 0) ? 32 : 16); return (((entry[index].flags & 0x08) > 0) ? 32 : 16);
} }
/*******************************************************************************/ /*******************************************************************************/
/* Créé un descripteur GDT */ /* Créé un descripteur GDT */

View File

@ -148,7 +148,8 @@ void putidt(u32 offset, u16 select, u16 type, u16 index)
void cpuerror(const u8 * src, const regs * stack) void cpuerror(const u8 * src, const regs * stack)
{ {
printf("\033[31m*** ERREUR CPU : %s *** \r\n", src); printf("\033[31m*** ERREUR CPU : %s *** \r\n", src);
if (stack!=NULL) show_cpu(stack); if (stack != NULL)
show_cpu(stack);
print("<Appuyer une touche pour continuer>\033[0m\r\n"); print("<Appuyer une touche pour continuer>\033[0m\r\n");
sti(); sti();
waitascii(); waitascii();
@ -210,7 +211,9 @@ void exception1()
u8 ascii = waitascii(); u8 ascii = waitascii();
cli(); cli();
if (ascii == 'P' || ascii == 'p') if (ascii == 'P' || ascii == 'p')
setdebugreg(0,current->eip+disasm(current->eip, NULL, false), DBG_EXEC); setdebugreg(0,
current->eip + disasm(current->eip, NULL,
false), DBG_EXEC);
else if (ascii == 'D' || ascii == 'd') else if (ascii == 'D' || ascii == 'd')
setdebugreg(0, 0, DBG_CLEAR); setdebugreg(0, 0, DBG_CLEAR);
else if (ascii == 'C' || ascii == 'c') else if (ascii == 'C' || ascii == 'c')
@ -406,15 +409,25 @@ void exception13()
cpuerror("#GP General protection fault (GPF)", dump); cpuerror("#GP General protection fault (GPF)", dump);
} }
static u8 ex14_errors1[]="Supervisory process tried to read a non-present page entry"; static u8 ex14_errors1[] =
static u8 ex14_errors2[]="Supervisory process tried to read a page and caused a protection fault"; "Supervisory process tried to read a non-present page entry";
static u8 ex14_errors3[]="Supervisory process tried to write to a non-present page entry"; static u8 ex14_errors2[] =
static u8 ex14_errors4[]="Supervisory process tried to write a page and caused a protection fault"; "Supervisory process tried to read a page and caused a protection fault";
static u8 ex14_errors5[]="User process tried to read a non-present page entry"; static u8 ex14_errors3[] =
static u8 ex14_errors6[]="User process tried to read a page and caused a protection fault"; "Supervisory process tried to write to a non-present page entry";
static u8 ex14_errors7[]="User process tried to write to a non-present page entry"; static u8 ex14_errors4[] =
static u8 ex14_errors8[]="User process tried to write a page and caused a protection fault"; "Supervisory process tried to write a page and caused a protection fault";
static u8 *ex14_errors[]={&ex14_errors1,&ex14_errors2,&ex14_errors3,&ex14_errors4,&ex14_errors5,&ex14_errors6,&ex14_errors7,&ex14_errors8}; static u8 ex14_errors5[] =
"User process tried to read a non-present page entry";
static u8 ex14_errors6[] =
"User process tried to read a page and caused a protection fault";
static u8 ex14_errors7[] =
"User process tried to write to a non-present page entry";
static u8 ex14_errors8[] =
"User process tried to write a page and caused a protection fault";
static u8 *ex14_errors[] =
{ &ex14_errors1, &ex14_errors2, &ex14_errors3, &ex14_errors4,
&ex14_errors5, &ex14_errors6, &ex14_errors7, &ex14_errors8 };
void exception14() void exception14()
{ {
@ -430,10 +443,15 @@ void exception14()
dump->eip = current->eip; dump->eip = current->eip;
if (dump->cr2 >= USER_CODE && dump->cr2 < USER_STACK) if (dump->cr2 >= USER_CODE && dump->cr2 < USER_STACK)
{ {
virtual_range_new(getcurrentprocess()->pdd, (u8 *) (dump->cr2 & 0xFFFFF000), PAGESIZE, PAGE_ALL); virtual_range_new(getcurrentprocess()->pdd,
(u8 *) (dump->cr2 & 0xFFFFF000),
PAGESIZE, PAGE_ALL);
} }
else { else
printf("Page fault - %s at adress %Y cs:eip - %Y:%Y\r\n",ex14_errors[current->error_code & 0xF],dump->cr2,dump->cs,dump->eip); {
printf("Page fault - %s at adress %Y cs:eip - %Y:%Y\r\n",
ex14_errors[current->error_code & 0xF], dump->cr2,
dump->cs, dump->eip);
cpuerror("#PGF Page fault", dump); cpuerror("#PGF Page fault", dump);
} }
restdebugcpu(); restdebugcpu();
@ -743,49 +761,90 @@ void irq15()
void initidt(void) void initidt(void)
{ {
u16 i; u16 i;
putidt((u32) exception0, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 0); putidt((u32) exception0, SEL_KERNEL_CODE,
putidt((u32) exception1, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 1); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 0);
putidt((u32) exception2, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 2); putidt((u32) exception1, SEL_KERNEL_CODE,
putidt((u32) exception3, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 3); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 1);
putidt((u32) exception4, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 4); putidt((u32) exception2, SEL_KERNEL_CODE,
putidt((u32) exception5, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 5); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 2);
putidt((u32) exception6, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 6); putidt((u32) exception3, SEL_KERNEL_CODE,
putidt((u32) exception7, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 7); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 3);
putidt((u32) exception8, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 8); putidt((u32) exception4, SEL_KERNEL_CODE,
putidt((u32) exception9, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 9); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 4);
putidt((u32) exception10, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 10); putidt((u32) exception5, SEL_KERNEL_CODE,
putidt((u32) exception11, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 11); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 5);
putidt((u32) exception12, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 12); putidt((u32) exception6, SEL_KERNEL_CODE,
putidt((u32) exception13, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 13); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 6);
putidt((u32) exception14, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 14); putidt((u32) exception7, SEL_KERNEL_CODE,
putidt((u32) exception15, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 15); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 7);
putidt((u32) exception16, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 16); putidt((u32) exception8, SEL_KERNEL_CODE,
putidt((u32) exception17, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 17); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 8);
putidt((u32) exception18, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 18); putidt((u32) exception9, SEL_KERNEL_CODE,
for (i = 19; i < 32; i++) { ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 9);
putidt((u32) interruption, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING3 | TRAPGATE, i); putidt((u32) exception10, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 10);
putidt((u32) exception11, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 11);
putidt((u32) exception12, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 12);
putidt((u32) exception13, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 13);
putidt((u32) exception14, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 14);
putidt((u32) exception15, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 15);
putidt((u32) exception16, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 16);
putidt((u32) exception17, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 17);
putidt((u32) exception18, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 18);
for (i = 19; i < 32; i++)
{
putidt((u32) interruption, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING3 | TRAPGATE, i);
} }
putidt((u32) irq0, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 32); putidt((u32) irq0, SEL_KERNEL_CODE,
putidt((u32) irq1, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 33); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 32);
putidt((u32) irq2, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 34); putidt((u32) irq1, SEL_KERNEL_CODE,
putidt((u32) irq3, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 35); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 33);
putidt((u32) irq4, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 36); putidt((u32) irq2, SEL_KERNEL_CODE,
putidt((u32) irq5, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 37); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 34);
putidt((u32) irq6, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 38); putidt((u32) irq3, SEL_KERNEL_CODE,
putidt((u32) irq7, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 39); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 35);
for (i = 40; i < 96; i++) { putidt((u32) irq4, SEL_KERNEL_CODE,
putidt((u32) interruption, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING3 | TRAPGATE, i); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 36);
putidt((u32) irq5, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 37);
putidt((u32) irq6, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 38);
putidt((u32) irq7, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 39);
for (i = 40; i < 96; i++)
{
putidt((u32) interruption, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING3 | TRAPGATE, i);
} }
putidt((u32) irq8, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 96); putidt((u32) irq8, SEL_KERNEL_CODE,
putidt((u32) irq9, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 97); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 96);
putidt((u32) irq10, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 98); putidt((u32) irq9, SEL_KERNEL_CODE,
putidt((u32) irq11, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 99); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 97);
putidt((u32) irq12, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 100); putidt((u32) irq10, SEL_KERNEL_CODE,
putidt((u32) irq13, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 101); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 98);
putidt((u32) irq14, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 102); putidt((u32) irq11, SEL_KERNEL_CODE,
putidt((u32) irq15, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 103); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 99);
for (i = 104; i < IDT_SIZE; i++) { putidt((u32) irq12, SEL_KERNEL_CODE,
putidt((u32) interruption, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | TRAPGATE, i); ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 100);
putidt((u32) irq13, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 101);
putidt((u32) irq14, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 102);
putidt((u32) irq15, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 103);
for (i = 104; i < IDT_SIZE; i++)
{
putidt((u32) interruption, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | TRAPGATE, i);
} }
/* initialise le registre idt */ /* initialise le registre idt */
idtreg.limite = IDT_SIZE * sizeof(idtdes); idtreg.limite = IDT_SIZE * sizeof(idtdes);

View File

@ -103,12 +103,16 @@ u8 *getstring(u8 * temp)
u8 maxwidth = strlen(temp); u8 maxwidth = strlen(temp);
u8 *pointer = temp; u8 *pointer = temp;
u8 ascii = 0; u8 ascii = 0;
while (ascii != '\r') { while (ascii != '\r')
{
ascii = waitascii(); ascii = waitascii();
if (ascii == '\b' && pointer > temp) { if (ascii == '\b' && pointer > temp)
{
pointer--; pointer--;
putchar(ascii); putchar(ascii);
} else if (ascii > 31 && pointer <= temp + 80) { }
else if (ascii > 31 && pointer <= temp + 80)
{
*pointer++ = ascii; *pointer++ = ascii;
putchar(ascii); putchar(ascii);
} }
@ -136,7 +140,8 @@ void outkbd(u8 port, u8 data)
u8 state; u8 state;
/* timeout */ /* timeout */
for (timeout = 500000L; timeout != 0; timeout--) { for (timeout = 500000L; timeout != 0; timeout--)
{
state = inb(0x64); state = inb(0x64);
/* vide le buffer du 8042 */ /* vide le buffer du 8042 */
if ((state & 0x02) == 0) if ((state & 0x02) == 0)
@ -154,13 +159,16 @@ void reboot(void)
u8 temp; u8 temp;
cli(); cli();
/* vide le 8042 */ /* vide le 8042 */
do { do
{
temp = inb(0x64); temp = inb(0x64);
if ((temp & 0x01) != 0) { if ((temp & 0x01) != 0)
{
(void) inb(0x60); (void) inb(0x60);
continue; continue;
} }
} while ((temp & 0x02) != 0); }
while ((temp & 0x02) != 0);
/* active le reset CPU */ /* active le reset CPU */
outb(0x64, 0xFE); outb(0x64, 0xFE);
while (1) while (1)
@ -185,13 +193,16 @@ unsigned convert(u32 keypressed)
breakcode = 1; breakcode = 1;
key = (keypressed & 0x7F); key = (keypressed & 0x7F);
/* Mise a jour des flags lors du relachement de touches de controle */ /* Mise a jour des flags lors du relachement de touches de controle */
if (breakcode) { if (breakcode)
if (key == SCAN_ALT) { {
if (key == SCAN_ALT)
{
kbdstatus &= ~STATUS_ALT; kbdstatus &= ~STATUS_ALT;
/* si ALT GR (E01D) alors activer aussi control */ /* si ALT GR (E01D) alors activer aussi control */
if (bufferscan[lastscan] == 0xE0) if (bufferscan[lastscan] == 0xE0)
kbdstatus &= ~STATUS_CTRL; kbdstatus &= ~STATUS_CTRL;
} else if (key == SCAN_CTRL) }
else if (key == SCAN_CTRL)
kbdstatus &= ~STATUS_CTRL; kbdstatus &= ~STATUS_CTRL;
else if (key == SCAN_LEFTSHIFT || key == SCAN_RIGHTSHIFT) else if (key == SCAN_LEFTSHIFT || key == SCAN_RIGHTSHIFT)
kbdstatus &= ~STATUS_SHIFT; kbdstatus &= ~STATUS_SHIFT;
@ -199,41 +210,54 @@ unsigned convert(u32 keypressed)
return 0; return 0;
} }
/* Mise a jour des flags lors de l'appuie de touches de controle */ /* Mise a jour des flags lors de l'appuie de touches de controle */
if (key == SCAN_ALT) { if (key == SCAN_ALT)
{
kbdstatus |= STATUS_ALT; kbdstatus |= STATUS_ALT;
/* si ALT GR (E01D) alors desactiver aussi control */ /* si ALT GR (E01D) alors desactiver aussi control */
if (bufferscan[lastscan] == 0xE0) if (bufferscan[lastscan] == 0xE0)
kbdstatus |= STATUS_CTRL; kbdstatus |= STATUS_CTRL;
return 0; return 0;
} else if (key == SCAN_CTRL) { }
else if (key == SCAN_CTRL)
{
kbdstatus |= STATUS_CTRL; kbdstatus |= STATUS_CTRL;
return 0; return 0;
} else if (key == SCAN_LEFTSHIFT || key == SCAN_RIGHTSHIFT) { }
else if (key == SCAN_LEFTSHIFT || key == SCAN_RIGHTSHIFT)
{
kbdstatus |= STATUS_SHIFT; kbdstatus |= STATUS_SHIFT;
return 0; return 0;
} }
else if ((key >= SCAN_F1) && (key <= SCAN_F8)) { else if ((key >= SCAN_F1) && (key <= SCAN_F8))
{
changevc(key - SCAN_F1); changevc(key - SCAN_F1);
} }
else if (key == SCAN_F9) { else if (key == SCAN_F9)
{
regs dump; regs dump;
show_cpu(&dump); show_cpu(&dump);
} }
else if (key == SCAN_F10) { else if (key == SCAN_F10)
{
apply_nextvideomode(); apply_nextvideomode();
} }
/* Scroll Lock, Num Lock, and Caps Lock mise a jour des leds */ /* Scroll Lock, Num Lock, and Caps Lock mise a jour des leds */
else if (key == SCAN_SCROLLLOCK) { else if (key == SCAN_SCROLLLOCK)
{
kbdstatus ^= STATUS_SCRL; kbdstatus ^= STATUS_SCRL;
goto LEDS; goto LEDS;
} else if (key == SCAN_NUMLOCK) { }
else if (key == SCAN_NUMLOCK)
{
kbdstatus ^= STATUS_NUM; kbdstatus ^= STATUS_NUM;
goto LEDS; goto LEDS;
} else if (key == SCAN_CAPSLOCK) { }
else if (key == SCAN_CAPSLOCK)
{
kbdstatus ^= STATUS_CAPS; kbdstatus ^= STATUS_CAPS;
LEDS: LEDS:
outkbd(0x60, 0xED); /* "mise a jour des LEDS */ outkbd(0x60, 0xED); /* "mise a jour des LEDS */
@ -248,8 +272,9 @@ unsigned convert(u32 keypressed)
return 0; return 0;
} }
/* Appuie de CRTL + ALT + SUPR ? */ /* Appuie de CRTL + ALT + SUPR ? */
if ((kbdstatus & STATUS_CTRL) && (kbdstatus & STATUS_ALT) && if ((kbdstatus & STATUS_CTRL) && (kbdstatus & STATUS_ALT)
(key == 73)) { && (key == 73))
{
print("redemarrage du systeme"); print("redemarrage du systeme");
reboot(); reboot();
} }
@ -296,14 +321,17 @@ unsigned convert(u32 keypressed)
if (key == 0x4f) if (key == 0x4f)
return 0x19; return 0x19;
return 0x00; return 0x00;
} else { }
else
{
/* detecte les SCANCODES invalides */ /* detecte les SCANCODES invalides */
if (key >= sizeof(set1_normal) / sizeof(set1_normal[0])) if (key >= sizeof(set1_normal) / sizeof(set1_normal[0]))
return 0; return 0;
/* converti le scancode en code ASCII en fonction du statut*/ /* converti le scancode en code ASCII en fonction du statut*/
if (kbdstatus & STATUS_SHIFT || kbdstatus & STATUS_CAPS) if (kbdstatus & STATUS_SHIFT || kbdstatus & STATUS_CAPS)
temp = set1_shift[key]; temp = set1_shift[key];
else if ((kbdstatus & STATUS_ALT) && (kbdstatus & STATUS_CTRL)) else if ((kbdstatus & STATUS_ALT)
&& (kbdstatus & STATUS_CTRL))
temp = set1_altgr[key]; temp = set1_altgr[key];
else if (kbdstatus & STATUS_CTRL) else if (kbdstatus & STATUS_CTRL)
temp = set1_ctrl[key]; temp = set1_ctrl[key];
@ -332,7 +360,8 @@ void keyboard(void)
while ((inb(0x64) & 1) == 0); while ((inb(0x64) & 1) == 0);
scancode = inb(0x60); scancode = inb(0x60);
ascii = convert(scancode); ascii = convert(scancode);
if (ascii != 0) { if (ascii != 0)
{
ptrascii++; ptrascii++;
if (ptrascii == 255) if (ptrascii == 255)
ptrascii == 0; ptrascii == 0;

View File

@ -8,25 +8,21 @@
/*******************************************************************************/ /*******************************************************************************/
/* Arithmétique 64 bits */ /* Arithmétique 64 bits */
unsigned long long __udivdi3 (unsigned long long num, unsigned long long den) unsigned long long __udivdi3(unsigned long long num,
unsigned long long den)
{ {
unsigned long long quot, qbit; unsigned long long quot, qbit;
quot = 0; quot = 0;
qbit = 1; qbit = 1;
if (den == 0) if (den == 0)
{ {
return 0; return 0;
} }
while ((long long) den >= 0) while ((long long) den >= 0)
{ {
den <<= 1; den <<= 1;
qbit <<= 1; qbit <<= 1;
} }
while (qbit) while (qbit)
{ {
if (den <= num) if (den <= num)
@ -37,9 +33,7 @@ unsigned long long __udivdi3 (unsigned long long num, unsigned long long den)
den >>= 1; den >>= 1;
qbit >>= 1; qbit >>= 1;
} }
return quot; return quot;
} }
unsigned long long __umoddi3(unsigned long long n, unsigned long long d) unsigned long long __umoddi3(unsigned long long n, unsigned long long d)
@ -50,29 +44,45 @@ unsigned long long __umoddi3 (unsigned long long n, unsigned long long d)
/******************************************************************************/ /******************************************************************************/
/* Fonctions qui retournent le sinus et cosinus */ /* Fonctions qui retournent le sinus et cosinus */
double cos(double x){ double cos(double x)
{
if (x < 0.0) if (x < 0.0)
x = -x; x = -x;
while (M_PI < x) while (M_PI < x)
x -= M_2_PI; x -= M_2_PI;
double result=1.0 - (x*x/2.0)*( 1.0 - (x*x/12.0) * ( 1.0 - (x*x/30.0) * (1.0 - x*x/56.0 ))); double result =
1.0 - (x * x / 2.0) * (1.0 -
(x * x / 12.0) * (1.0 -
(x * x / 30.0) *
(1.0 -
x * x / 56.0)));
return result; return result;
} }
double sin(double x){ double sin(double x)
{
return cos(x - M_PI_2); return cos(x - M_PI_2);
} }
float cosf(float x){ float cosf(float x)
{
if (x < 0.0f) if (x < 0.0f)
x = -x; x = -x;
while (M_PI < x) while (M_PI < x)
x -= M_2_PI; x -= M_2_PI;
float result=1.0f - (x*x/2.0f)*( 1.0f - (x*x/12.0f) * ( 1.0f - (x*x/30.0f) * (1.0f - x*x/56.0f ))); float result =
1.0f - (x * x / 2.0f) * (1.0f -
(x * x / 12.0f) * (1.0f -
(x * x /
30.0f) *
(1.0f -
x * x /
56.0f)));
return result; return result;
} }
float sinf(float x){ float sinf(float x)
{
return cosf(x - M_PI_2); return cosf(x - M_PI_2);
} }
@ -94,7 +104,6 @@ double fabs(double n)
float sqrtf(float n) float sqrtf(float n)
{ {
float x = n; float x = n;
float y = 1; float y = 1;
double e = 0.000001; double e = 0.000001;
@ -108,7 +117,6 @@ float sqrtf(float n)
double sqrt(double n) double sqrt(double n)
{ {
double x = n; double x = n;
double y = 1; double y = 1;
double e = 0.000001; double e = 0.000001;
@ -136,9 +144,11 @@ double rsqrt(double n)
/******************************************************************************/ /******************************************************************************/
/* Fonction qui retourne la puissance n de a */ /* Fonction qui retourne la puissance n de a */
u32 pow(u32 a, u8 n) { u32 pow(u32 a, u8 n)
{
u32 r = 1; u32 r = 1;
while (n > 0) { while (n > 0)
{
if (n & 1) if (n & 1)
r *= a; r *= a;
a *= a; a *= a;
@ -152,22 +162,18 @@ u32 pow(u32 a, u8 n) {
u8 log2(u64 n) u8 log2(u64 n)
{ {
if (n == 0) if (n == 0)
return 0; return 0;
int logValue = -1; int logValue = -1;
while (n)
while (n) { {
logValue++; logValue++;
n >>= 1; n >>= 1;
} }
return logValue + 1; return logValue + 1;
} }
/******************************************************************************/ /******************************************************************************/
@ -176,15 +182,22 @@ return logValue + 1;
u8 log10(u64 n) u8 log10(u64 n)
{ {
return (n >= 10000000000000000000u) ? 19 : (n >= 100000000000000000u) ? 18 : return (n >= 10000000000000000000u) ? 19 : (n >=
(n >= 100000000000000000u) ? 17 : (n >= 10000000000000000u) ? 16 : 100000000000000000u) ?
(n >= 1000000000000000u) ? 15 : (n >= 100000000000000u) ? 14 : 18 : (n >= 100000000000000000u) ? 17 : (n >=
(n >= 10000000000000u) ? 13 : (n >= 1000000000000u) ? 12 : 10000000000000000u)
(n >= 100000000000u) ? 11 : (n >= 10000000000u) ? 10 : ? 16 : (n >= 1000000000000000u) ? 15 : (n >=
(n >= 1000000000u) ? 9 : (n >= 100000000u) ? 8 : 100000000000000u) ?
(n >= 10000000u) ? 7 : (n >= 1000000u) ? 6 : 14 : (n >= 10000000000000u) ? 13 : (n >=
(n >= 100000u) ? 5 : (n >= 10000u) ? 4 : 1000000000000u) ? 12
(n >= 1000u) ? 3 : (n >= 100u) ? 2 : (n >= 10u) ? 1u : 0u; : (n >= 100000000000u) ? 11 : (n >=
10000000000u) ? 10 : (n >=
1000000000u)
? 9 : (n >= 100000000u) ? 8 : (n >= 10000000u) ? 7 : (n >=
1000000u)
? 6 : (n >= 100000u) ? 5 : (n >= 10000u) ? 4 : (n >=
1000u) ? 3
: (n >= 100u) ? 2 : (n >= 10u) ? 1u : 0u;
} }
@ -194,13 +207,11 @@ return (n >= 10000000000000000000u) ? 19 : (n >= 100000000000000000u) ? 18 :
u32 abs(int x) u32 abs(int x)
{ {
if (x < 0) if (x < 0)
x = -x; x = -x;
return (u32) x; return (u32) x;
} }
/******************************************************************************/ /******************************************************************************/
@ -208,12 +219,9 @@ return (u32) x;
static u32 seed = 0x12341234; static u32 seed = 0x12341234;
void randomize(void) void randomize(void)
{ {
seed = gettimer(); seed = gettimer();
} }
@ -237,7 +245,6 @@ result <<= 10;
result ^= (unsigned int) (next / 65536) % 1024; result ^= (unsigned int) (next / 65536) % 1024;
seed = next; seed = next;
return result; return result;
} }
/******************************************************************************/ /******************************************************************************/

View File

@ -10,7 +10,8 @@
void vector4_show(vector4 src) void vector4_show(vector4 src)
{ {
printf("vecteur: X=%f Y=%f Z=%f W=%f \r\n", src.x, src.y, src.z, src.w); printf("vecteur: X=%f Y=%f Z=%f W=%f \r\n", src.x, src.y, src.z,
src.w);
} }
/*******************************************************************************/ /*******************************************************************************/
@ -165,9 +166,7 @@ void vector4_rotate_z(vector4 *dst, float angle)
float vector4_len(vector4 src) float vector4_len(vector4 src)
{ {
return sqrtf((src.x * src.x) + return sqrtf((src.x * src.x) + (src.y * src.y) + (src.z * src.z));
(src.y * src.y) +
(src.z * src.z));
} }
/*******************************************************************************/ /*******************************************************************************/
@ -183,9 +182,7 @@ float vector4_dotproduct(vector4 v1, vector4 v2)
float vector4_norm(vector4 src) float vector4_norm(vector4 src)
{ {
return sqrtf((src.x * src.x) + return sqrtf((src.x * src.x) + (src.y * src.y) + (src.z * src.z));
(src.y * src.y) +
(src.z * src.z));
} }
/*******************************************************************************/ /*******************************************************************************/
@ -193,8 +190,7 @@ float vector4_norm(vector4 src)
float vector4_distance(vector4 v1, vector4 v2) float vector4_distance(vector4 v1, vector4 v2)
{ {
return sqrt(pow(v2.x - v1.x, 2) + return sqrt(pow(v2.x - v1.x, 2) + pow(v2.y - v1.y, 2) +
pow(v2.y - v1.y, 2) +
pow(v2.z - v1.z, 2)); pow(v2.z - v1.z, 2));
} }
@ -280,7 +276,8 @@ void matrix44_scale(matrix44 *dst, float factor)
/*******************************************************************************/ /*******************************************************************************/
/* Créé une matrice de redimensionnement et de déplacement */ /* Créé une matrice de redimensionnement et de déplacement */
void matrix44_scale_translation(vector4 scale, vector4 translation, matrix44 *dst) void matrix44_scale_translation(vector4 scale, vector4 translation,
matrix44 * dst)
{ {
matrix44_homogen(dst); matrix44_homogen(dst);
dst->V[0].x = scale.x; dst->V[0].x = scale.x;
@ -379,37 +376,53 @@ void matrix44_rotation(vector4 axis, float angle, matrix44 *dst)
void matrix44_multiply(matrix44 * m1, matrix44 * m2, matrix44 * dst) void matrix44_multiply(matrix44 * m1, matrix44 * m2, matrix44 * dst)
{ {
dst->V[0].x = (m1->V[0].x * m2->V[0].x + m1->V[0].y * m2->V[1].x + dst->V[0].x =
(m1->V[0].x * m2->V[0].x + m1->V[0].y * m2->V[1].x +
m1->V[0].z * m2->V[2].x + m1->V[0].w * m2->V[3].x); m1->V[0].z * m2->V[2].x + m1->V[0].w * m2->V[3].x);
dst->V[0].y = (m1->V[0].x * m2->V[0].y + m1->V[0].y * m2->V[1].y + dst->V[0].y =
(m1->V[0].x * m2->V[0].y + m1->V[0].y * m2->V[1].y +
m1->V[0].z * m2->V[2].y + m1->V[0].w * m2->V[3].y); m1->V[0].z * m2->V[2].y + m1->V[0].w * m2->V[3].y);
dst->V[0].z = (m1->V[0].x * m2->V[0].z + m1->V[0].y * m2->V[1].z + dst->V[0].z =
(m1->V[0].x * m2->V[0].z + m1->V[0].y * m2->V[1].z +
m1->V[0].z * m2->V[2].z + m1->V[0].w * m2->V[3].z); m1->V[0].z * m2->V[2].z + m1->V[0].w * m2->V[3].z);
dst->V[0].w = (m1->V[0].x * m2->V[0].w + m1->V[0].y * m2->V[1].w + dst->V[0].w =
(m1->V[0].x * m2->V[0].w + m1->V[0].y * m2->V[1].w +
m1->V[0].z * m2->V[2].w + m1->V[0].w * m2->V[3].w); m1->V[0].z * m2->V[2].w + m1->V[0].w * m2->V[3].w);
dst->V[1].x = (m1->V[1].x * m2->V[0].x + m1->V[1].y * m2->V[1].x + dst->V[1].x =
(m1->V[1].x * m2->V[0].x + m1->V[1].y * m2->V[1].x +
m1->V[1].z * m2->V[2].x + m1->V[1].w * m2->V[3].x); m1->V[1].z * m2->V[2].x + m1->V[1].w * m2->V[3].x);
dst->V[1].y = (m1->V[1].x * m2->V[0].y + m1->V[1].y * m2->V[1].y + dst->V[1].y =
(m1->V[1].x * m2->V[0].y + m1->V[1].y * m2->V[1].y +
m1->V[1].z * m2->V[2].y + m1->V[1].w * m2->V[3].y); m1->V[1].z * m2->V[2].y + m1->V[1].w * m2->V[3].y);
dst->V[1].z = (m1->V[1].x * m2->V[0].z + m1->V[1].y * m2->V[1].z + dst->V[1].z =
(m1->V[1].x * m2->V[0].z + m1->V[1].y * m2->V[1].z +
m1->V[1].z * m2->V[2].z + m1->V[1].w * m2->V[3].z); m1->V[1].z * m2->V[2].z + m1->V[1].w * m2->V[3].z);
dst->V[1].w = (m1->V[1].x * m2->V[0].w + m1->V[1].y * m2->V[1].w + dst->V[1].w =
(m1->V[1].x * m2->V[0].w + m1->V[1].y * m2->V[1].w +
m1->V[1].z * m2->V[2].w + m1->V[1].w * m2->V[3].w); m1->V[1].z * m2->V[2].w + m1->V[1].w * m2->V[3].w);
dst->V[2].x = (m1->V[2].x * m2->V[0].x + m1->V[2].y * m2->V[1].x + dst->V[2].x =
(m1->V[2].x * m2->V[0].x + m1->V[2].y * m2->V[1].x +
m1->V[2].z * m2->V[2].x + m1->V[2].w * m2->V[3].x); m1->V[2].z * m2->V[2].x + m1->V[2].w * m2->V[3].x);
dst->V[2].y = (m1->V[2].x * m2->V[0].y + m1->V[2].y * m2->V[1].y + dst->V[2].y =
(m1->V[2].x * m2->V[0].y + m1->V[2].y * m2->V[1].y +
m1->V[2].z * m2->V[2].y + m1->V[2].w * m2->V[3].y); m1->V[2].z * m2->V[2].y + m1->V[2].w * m2->V[3].y);
dst->V[2].z = (m1->V[2].x * m2->V[0].z + m1->V[2].y * m2->V[1].z + dst->V[2].z =
(m1->V[2].x * m2->V[0].z + m1->V[2].y * m2->V[1].z +
m1->V[2].z * m2->V[2].z + m1->V[2].w * m2->V[3].z); m1->V[2].z * m2->V[2].z + m1->V[2].w * m2->V[3].z);
dst->V[2].w = (m1->V[2].x * m2->V[0].w + m1->V[2].y * m2->V[1].w + dst->V[2].w =
(m1->V[2].x * m2->V[0].w + m1->V[2].y * m2->V[1].w +
m1->V[2].z * m2->V[2].w + m1->V[2].w * m2->V[3].w); m1->V[2].z * m2->V[2].w + m1->V[2].w * m2->V[3].w);
dst->V[3].x = (m1->V[3].x * m2->V[0].x + m1->V[3].y * m2->V[1].x + dst->V[3].x =
(m1->V[3].x * m2->V[0].x + m1->V[3].y * m2->V[1].x +
m1->V[3].z * m2->V[2].x + m1->V[3].w * m2->V[3].x); m1->V[3].z * m2->V[2].x + m1->V[3].w * m2->V[3].x);
dst->V[3].y = (m1->V[3].x * m2->V[0].y + m1->V[3].y * m2->V[1].y + dst->V[3].y =
(m1->V[3].x * m2->V[0].y + m1->V[3].y * m2->V[1].y +
m1->V[3].z * m2->V[2].y + m1->V[3].w * m2->V[3].y); m1->V[3].z * m2->V[2].y + m1->V[3].w * m2->V[3].y);
dst->V[3].z = (m1->V[3].x * m2->V[0].z + m1->V[3].y * m2->V[1].z + dst->V[3].z =
(m1->V[3].x * m2->V[0].z + m1->V[3].y * m2->V[1].z +
m1->V[3].z * m2->V[2].z + m1->V[3].w * m2->V[3].z); m1->V[3].z * m2->V[2].z + m1->V[3].w * m2->V[3].z);
dst->V[3].w = (m1->V[3].x * m2->V[0].w + m1->V[3].y * m2->V[1].w + dst->V[3].w =
(m1->V[3].x * m2->V[0].w + m1->V[3].y * m2->V[1].w +
m1->V[3].z * m2->V[2].w + m1->V[3].w * m2->V[3].w); m1->V[3].z * m2->V[2].w + m1->V[3].w * m2->V[3].w);
} }
@ -423,10 +436,14 @@ void matrix44_transform(matrix44 *matrix, vector4 *dst)
origin.y = dst->y; origin.y = dst->y;
origin.z = dst->z; origin.z = dst->z;
origin.w = dst->w; origin.w = dst->w;
dst->x = origin.x * matrix->V[0].x + origin.y * matrix->V[1].x + origin.z * matrix->V[2].x + origin.w * matrix->V[3].x; dst->x = origin.x * matrix->V[0].x + origin.y * matrix->V[1].x +
dst->y = origin.x * matrix->V[0].y + origin.y * matrix->V[1].y + origin.z * matrix->V[2].y + origin.w * matrix->V[3].y; origin.z * matrix->V[2].x + origin.w * matrix->V[3].x;
dst->z = origin.x * matrix->V[0].z + origin.y * matrix->V[1].z + origin.z * matrix->V[2].z + origin.w * matrix->V[3].z; dst->y = origin.x * matrix->V[0].y + origin.y * matrix->V[1].y +
dst->w = origin.x * matrix->V[0].w + origin.y * matrix->V[1].w + origin.z * matrix->V[2].w + origin.w * matrix->V[3].w; origin.z * matrix->V[2].y + origin.w * matrix->V[3].y;
dst->z = origin.x * matrix->V[0].z + origin.y * matrix->V[1].z +
origin.z * matrix->V[2].z + origin.w * matrix->V[3].z;
dst->w = origin.x * matrix->V[0].w + origin.y * matrix->V[1].w +
origin.z * matrix->V[2].w + origin.w * matrix->V[3].w;
} }
/*******************************************************************************/ /*******************************************************************************/
@ -435,24 +452,35 @@ void matrix44_transform(matrix44 *matrix, vector4 *dst)
float matrix44_determinant(matrix44 * matrix) float matrix44_determinant(matrix44 * matrix)
{ {
float a, b, c, d; float a, b, c, d;
a = matrix->V[0].x * todeterminant(matrix->V[1].y, matrix->V[2].y, matrix->V[3].y, a = matrix->V[0].x * todeterminant(matrix->V[1].y, matrix->V[2].y,
matrix->V[1].z, matrix->V[2].z, matrix->V[3].z, matrix->V[3].y, matrix->V[1].z,
matrix->V[1].w, matrix->V[2].w, matrix->V[3].w); matrix->V[2].z, matrix->V[3].z,
b = matrix->V[0].y * todeterminant(matrix->V[1].x, matrix->V[2].x, matrix->V[3].x, matrix->V[1].w, matrix->V[2].w,
matrix->V[1].z, matrix->V[2].z, matrix->V[3].z, matrix->V[3].w);
matrix->V[1].w, matrix->V[2].w, matrix->V[3].w); b = matrix->V[0].y * todeterminant(matrix->V[1].x, matrix->V[2].x,
c = matrix->V[0].z * todeterminant(matrix->V[1].x, matrix->V[2].x, matrix->V[3].x, matrix->V[3].x, matrix->V[1].z,
matrix->V[1].y, matrix->V[2].y, matrix->V[3].y, matrix->V[2].z, matrix->V[3].z,
matrix->V[1].w, matrix->V[2].w, matrix->V[3].w); matrix->V[1].w, matrix->V[2].w,
d = matrix->V[0].w * todeterminant(matrix->V[1].x, matrix->V[2].x, matrix->V[3].x, matrix->V[3].w);
matrix->V[1].y, matrix->V[2].y, matrix->V[3].y, c = matrix->V[0].z * todeterminant(matrix->V[1].x, matrix->V[2].x,
matrix->V[1].z, matrix->V[2].z, matrix->V[3].z); matrix->V[3].x, matrix->V[1].y,
matrix->V[2].y, matrix->V[3].y,
matrix->V[1].w, matrix->V[2].w,
matrix->V[3].w);
d = matrix->V[0].w * todeterminant(matrix->V[1].x, matrix->V[2].x,
matrix->V[3].x, matrix->V[1].y,
matrix->V[2].y, matrix->V[3].y,
matrix->V[1].z, matrix->V[2].z,
matrix->V[3].z);
return a - b + c - d; return a - b + c - d;
} }
float todeterminant(float a1, float a2, float a3, float b1, float b2, float b3, float c1, float c2, float c3) float todeterminant(float a1, float a2, float a3, float b1, float b2,
float b3, float c1, float c2, float c3)
{ {
return (a1 * ((b2 * c3) - (b3 * c2))) - (b1 * ((a2 * c3) - (a3 * c2))) + (c1 * ((a2 * b3) - (a3 * b2))); return (a1 * ((b2 * c3) - (b3 * c2))) -
(b1 * ((a2 * c3) - (a3 * c2))) +
(c1 * ((a2 * b3) - (a3 * b2)));
} }
/*******************************************************************************/ /*******************************************************************************/
@ -460,7 +488,8 @@ float todeterminant(float a1, float a2, float a3, float b1, float b2, float b3,
void matrix44_adjoint(matrix44 * matrix) void matrix44_adjoint(matrix44 * matrix)
{ {
float a1, a2, a3, a4, b1, b2, b3, b4, c1, c2, c3, c4, d1, d2, d3, d4; float a1, a2, a3, a4, b1, b2, b3, b4, c1, c2, c3, c4, d1, d2, d3,
d4;
a1 = matrix->V[0].x; a1 = matrix->V[0].x;
b1 = matrix->V[0].y; b1 = matrix->V[0].y;
c1 = matrix->V[0].z; c1 = matrix->V[0].z;
@ -482,23 +511,31 @@ void matrix44_adjoint(matrix44 *matrix)
d4 = matrix->V[3].w; d4 = matrix->V[3].w;
matrix->V[0].x = todeterminant(b2, b3, b4, c2, c3, c4, d2, d3, d4); matrix->V[0].x = todeterminant(b2, b3, b4, c2, c3, c4, d2, d3, d4);
matrix->V[1].x = -todeterminant(a2, a3, a4, c2, c3, c4, d2, d3, d4); matrix->V[1].x =
-todeterminant(a2, a3, a4, c2, c3, c4, d2, d3, d4);
matrix->V[2].x = todeterminant(a2, a3, a4, b2, b3, b4, d2, d3, d4); matrix->V[2].x = todeterminant(a2, a3, a4, b2, b3, b4, d2, d3, d4);
matrix->V[3].x = -todeterminant(a2, a3, a4, b2, b3, b4, c2, c3, c4); matrix->V[3].x =
-todeterminant(a2, a3, a4, b2, b3, b4, c2, c3, c4);
matrix->V[0].y = -todeterminant(b1, b3, b4, c1, c3, c4, d1, d3, d4); matrix->V[0].y =
-todeterminant(b1, b3, b4, c1, c3, c4, d1, d3, d4);
matrix->V[1].y = todeterminant(a1, a3, a4, c1, c3, c4, d1, d3, d4); matrix->V[1].y = todeterminant(a1, a3, a4, c1, c3, c4, d1, d3, d4);
matrix->V[2].y = -todeterminant(a1, a3, a4, b1, b3, b4, d1, d3, d4); matrix->V[2].y =
-todeterminant(a1, a3, a4, b1, b3, b4, d1, d3, d4);
matrix->V[3].y = todeterminant(a1, a3, a4, b1, b3, b4, c1, c3, c4); matrix->V[3].y = todeterminant(a1, a3, a4, b1, b3, b4, c1, c3, c4);
matrix->V[0].z = todeterminant(b1, b2, b4, c1, c2, c4, d1, d2, d4); matrix->V[0].z = todeterminant(b1, b2, b4, c1, c2, c4, d1, d2, d4);
matrix->V[1].z = -todeterminant(a1, a2, a4, c1, c2, c4, d1, d2, d4); matrix->V[1].z =
-todeterminant(a1, a2, a4, c1, c2, c4, d1, d2, d4);
matrix->V[2].z = todeterminant(a1, a2, a4, b1, b2, b4, d1, d2, d4); matrix->V[2].z = todeterminant(a1, a2, a4, b1, b2, b4, d1, d2, d4);
matrix->V[3].z = -todeterminant(a1, a2, a4, b1, b2, b4, c1, c2, c4); matrix->V[3].z =
-todeterminant(a1, a2, a4, b1, b2, b4, c1, c2, c4);
matrix->V[0].w = -todeterminant(b1, b2, b3, c1, c2, c3, d1, d2, d3); matrix->V[0].w =
-todeterminant(b1, b2, b3, c1, c2, c3, d1, d2, d3);
matrix->V[1].w = todeterminant(a1, a2, a3, c1, c2, c3, d1, d2, d3); matrix->V[1].w = todeterminant(a1, a2, a3, c1, c2, c3, d1, d2, d3);
matrix->V[2].w = -todeterminant(a1, a2, a3, b1, b2, b3, d1, d2, d3); matrix->V[2].w =
-todeterminant(a1, a2, a3, b1, b2, b3, d1, d2, d3);
matrix->V[3].w = todeterminant(a1, a2, a3, b1, b2, b3, c1, c2, c3); matrix->V[3].w = todeterminant(a1, a2, a3, b1, b2, b3, c1, c2, c3);
} }
@ -507,9 +544,12 @@ void matrix44_adjoint(matrix44 *matrix)
void matrix44_show(matrix44 * matrix) void matrix44_show(matrix44 * matrix)
{ {
printf("Matrice: X=%f Y=%f Z=%f W=%f \r\n", matrix->V[0].x, matrix->V[1].y, matrix->V[2].z, matrix->V[3].w); printf("Matrice: X=%f Y=%f Z=%f W=%f \r\n", matrix->V[0].x,
printf(" X=%f Y=%f Z=%f W=%f \r\n", matrix->V[0].x, matrix->V[1].y, matrix->V[2].z, matrix->V[3].w); matrix->V[1].y, matrix->V[2].z, matrix->V[3].w);
printf(" X=%f Y=%f Z=%f W=%f \r\n", matrix->V[0].x, matrix->V[1].y, matrix->V[2].z, matrix->V[3].w); printf(" X=%f Y=%f Z=%f W=%f \r\n", matrix->V[0].x,
matrix->V[1].y, matrix->V[2].z, matrix->V[3].w);
printf(" X=%f Y=%f Z=%f W=%f \r\n", matrix->V[0].x,
matrix->V[1].y, matrix->V[2].z, matrix->V[3].w);
} }
/*******************************************************************************/ /*******************************************************************************/
@ -564,7 +604,8 @@ void matrix44_transpose(matrix44 *matrix)
/*******************************************************************************/ /*******************************************************************************/
/* Crée une matrice de camera */ /* Crée une matrice de camera */
void matrix44_lookat(vector4 eye, vector4 dst, vector4 up, matrix44 *matrix) void matrix44_lookat(vector4 eye, vector4 dst, vector4 up,
matrix44 * matrix)
{ {
vector4 xaxis, yaxis, zaxis, negeye; vector4 xaxis, yaxis, zaxis, negeye;
vector4_sub(dst, eye, &zaxis); vector4_sub(dst, eye, &zaxis);
@ -597,8 +638,10 @@ void matrix44_lookat(vector4 eye, vector4 dst, vector4 up, matrix44 *matrix)
int matrix44_isequals(matrix44 * m1, matrix44 * m2) int matrix44_isequals(matrix44 * m1, matrix44 * m2)
{ {
return vector4_isequals(m1->V[0], m2->V[0]) && vector4_isequals(m1->V[1], m2->V[1]) && return vector4_isequals(m1->V[0], m2->V[0])
vector4_isequals(m1->V[2], m2->V[2]) && vector4_isequals(m1->V[3], m2->V[3]); && vector4_isequals(m1->V[1], m2->V[1])
&& vector4_isequals(m1->V[2], m2->V[2])
&& vector4_isequals(m1->V[3], m2->V[3]);
} }
/*******************************************************************************/ /*******************************************************************************/

View File

@ -48,7 +48,8 @@ u32 getmallocnb(void)
u32 realsize = 0; u32 realsize = 0;
tmalloc *chunk; tmalloc *chunk;
chunk = KERNEL_HEAP; chunk = KERNEL_HEAP;
while (chunk < (tmalloc *) kernelcurrentheap) { while (chunk < (tmalloc *) kernelcurrentheap)
{
realsize++; realsize++;
chunk = (tmalloc *) ((u8 *) chunk + chunk->size); chunk = (tmalloc *) ((u8 *) chunk + chunk->size);
} }
@ -64,7 +65,8 @@ u32 getmallocused(void)
u32 realsize = 0; u32 realsize = 0;
tmalloc *chunk; tmalloc *chunk;
chunk = KERNEL_HEAP; chunk = KERNEL_HEAP;
while (chunk < (tmalloc *) kernelcurrentheap) { while (chunk < (tmalloc *) kernelcurrentheap)
{
if (chunk->used) if (chunk->used)
realsize += chunk->size; realsize += chunk->size;
chunk = (tmalloc *) ((u8 *) chunk + chunk->size); chunk = (tmalloc *) ((u8 *) chunk + chunk->size);
@ -80,7 +82,8 @@ u32 getmallocfree(void)
u32 realsize = 0; u32 realsize = 0;
tmalloc *chunk; tmalloc *chunk;
chunk = KERNEL_HEAP; chunk = KERNEL_HEAP;
while (chunk < (tmalloc *) kernelcurrentheap) { while (chunk < (tmalloc *) kernelcurrentheap)
{
if (!chunk->used) if (!chunk->used)
realsize += chunk->size; realsize += chunk->size;
chunk = (tmalloc *) ((u8 *) chunk + chunk->size); chunk = (tmalloc *) ((u8 *) chunk + chunk->size);
@ -107,18 +110,24 @@ void *vmalloc(u32 size)
if (realsize < MALLOC_MINIMUM) if (realsize < MALLOC_MINIMUM)
realsize = MALLOC_MINIMUM; realsize = MALLOC_MINIMUM;
chunk = KERNEL_HEAP; chunk = KERNEL_HEAP;
while (chunk->used || chunk->size < realsize) { while (chunk->used || chunk->size < realsize)
{
if (chunk->size == 0) if (chunk->size == 0)
panic(sprintf("Element du heap %x defectueux avec une taille nulle (heap %x) !",chunk, kernelcurrentheap)); panic(sprintf
("Element du heap %x defectueux avec une taille nulle (heap %x) !",
chunk, kernelcurrentheap));
chunk = (tmalloc *) ((u8 *) chunk + chunk->size); chunk = (tmalloc *) ((u8 *) chunk + chunk->size);
if (chunk == (tmalloc *) kernelcurrentheap) if (chunk == (tmalloc *) kernelcurrentheap)
mallocpage(realsize); mallocpage(realsize);
else if (chunk > (tmalloc *) kernelcurrentheap) else if (chunk > (tmalloc *) kernelcurrentheap)
panic (sprintf("Element du heap %x depassant la limite %x !",chunk, kernelcurrentheap)); panic(sprintf
("Element du heap %x depassant la limite %x !",
chunk, kernelcurrentheap));
} }
if (chunk->size - realsize < MALLOC_MINIMUM) if (chunk->size - realsize < MALLOC_MINIMUM)
chunk->used = 1; chunk->used = 1;
else { else
{
new = (tmalloc *) ((u8 *) chunk + realsize); new = (tmalloc *) ((u8 *) chunk + realsize);
new->size = chunk->size - realsize; new->size = chunk->size - realsize;
new->used = 0; new->used = 0;
@ -136,7 +145,8 @@ void vfree(void *vaddr)
tmalloc *chunk, *new; tmalloc *chunk, *new;
chunk = (tmalloc *) (vaddr - sizeof(tmalloc)); chunk = (tmalloc *) (vaddr - sizeof(tmalloc));
chunk->used = 0; chunk->used = 0;
while ((new = (tmalloc *)((u8 *) chunk + chunk->size)) && new < (tmalloc *) kernelcurrentheap && new->used == 0) while ((new = (tmalloc *) ((u8 *) chunk + chunk->size))
&& new < (tmalloc *) kernelcurrentheap && new->used == 0)
chunk->size += new->size; chunk->size += new->size;
} }
@ -148,8 +158,12 @@ u64 physical_getmemorysize()
u64 maxaddr = 0; u64 maxaddr = 0;
struct multiboot_tag_mmap *tag = getgrubinfo_mem(); struct multiboot_tag_mmap *tag = getgrubinfo_mem();
multiboot_memory_map_t *mmap; multiboot_memory_map_t *mmap;
for (mmap = ((struct multiboot_tag_mmap *) tag)->entries;(u8 *) mmap < (u8 *) tag + tag->size; mmap = (multiboot_memory_map_t *) for (mmap = ((struct multiboot_tag_mmap *) tag)->entries;
((unsigned long) mmap + ((struct multiboot_tag_mmap *) tag)->entry_size)) (u8 *) mmap < (u8 *) tag + tag->size;
mmap =
(multiboot_memory_map_t *) ((unsigned long) mmap +
((struct multiboot_tag_mmap *)
tag)->entry_size))
if ((mmap->addr + mmap->len > maxaddr) && mmap->type == 1) if ((mmap->addr + mmap->len > maxaddr) && mmap->type == 1)
maxaddr = mmap->addr + mmap->len; maxaddr = mmap->addr + mmap->len;
if (maxaddr >= MAXMEMSIZE) if (maxaddr >= MAXMEMSIZE)
@ -180,7 +194,7 @@ void physical_range_use(u64 addr,u64 len)
{ {
u32 nbpage = TOPAGE(len); u32 nbpage = TOPAGE(len);
u32 pagesrc = TOPAGE(addr); u32 pagesrc = TOPAGE(addr);
if (len & 0b1111111111 > 0) if (len & 0x3FF > 0)
nbpage++; nbpage++;
if (addr >= MAXMEMSIZE) if (addr >= MAXMEMSIZE)
return; return;
@ -197,7 +211,7 @@ void physical_range_free(u64 addr,u64 len)
{ {
u32 nbpage = TOPAGE(len); u32 nbpage = TOPAGE(len);
u32 pagesrc = TOPAGE(addr); u32 pagesrc = TOPAGE(addr);
if (len & 0b1111111111 > 0) if (len & 0x3FF > 0)
nbpage++; nbpage++;
if (addr >= MAXMEMSIZE) if (addr >= MAXMEMSIZE)
return; return;
@ -218,7 +232,8 @@ u8* physical_page_getfree(void)
for (byte = 0; byte < sizeof(bitmap); byte++) for (byte = 0; byte < sizeof(bitmap); byte++)
if (bitmap[byte] != 0xFF) if (bitmap[byte] != 0xFF)
for (bit = 0; bit < 8; bit++) for (bit = 0; bit < 8; bit++)
if (!(bitmap[byte] & (1 << bit))) { if (!(bitmap[byte] & (1 << bit)))
{
page = 8 * byte + bit; page = 8 * byte + bit;
physical_page_use(page); physical_page_use(page);
return (u8 *) (page * PAGESIZE); return (u8 *) (page * PAGESIZE);
@ -251,8 +266,12 @@ void physical_init(void)
bitmap[page] = 0xFF; bitmap[page] = 0xFF;
struct multiboot_tag_mmap *tag = getgrubinfo_mem(); struct multiboot_tag_mmap *tag = getgrubinfo_mem();
multiboot_memory_map_t *mmap; multiboot_memory_map_t *mmap;
for (mmap = ((struct multiboot_tag_mmap *) tag)->entries;(u8 *) mmap < (u8 *) tag + tag->size; mmap = (multiboot_memory_map_t *) for (mmap = ((struct multiboot_tag_mmap *) tag)->entries;
((unsigned long) mmap + ((struct multiboot_tag_mmap *) tag)->entry_size)) (u8 *) mmap < (u8 *) tag + tag->size;
mmap =
(multiboot_memory_map_t *) ((unsigned long) mmap +
((struct multiboot_tag_mmap *)
tag)->entry_size))
if (mmap->type == 1) if (mmap->type == 1)
physical_range_free(mmap->addr, mmap->len); physical_range_free(mmap->addr, mmap->len);
else else
@ -276,7 +295,8 @@ page *virtual_page_getfree(void)
vpages = TAILQ_FIRST(&vrange_head); vpages = TAILQ_FIRST(&vrange_head);
vaddr = vpages->vaddrlow; vaddr = vpages->vaddrlow;
vpages->vaddrlow += PAGESIZE; vpages->vaddrlow += PAGESIZE;
if (vpages->vaddrlow == vpages->vaddrhigh) { if (vpages->vaddrlow == vpages->vaddrhigh)
{
TAILQ_REMOVE(&vrange_head, vpages, tailq); TAILQ_REMOVE(&vrange_head, vpages, tailq);
vfree(vpages); vfree(vpages);
} }
@ -303,7 +323,8 @@ pd *virtual_pd_create()
pdir[i] = pd0[i]; pdir[i] = pd0[i];
for (i = 256; i < 1023; i++) for (i = 256; i < 1023; i++)
pdir[i] = 0; pdir[i] = 0;
pdir[1023] = ((u32) new->addr->paddr | (PAGE_PRESENT | PAGE_WRITE)); pdir[1023] =
((u32) new->addr->paddr | (PAGE_PRESENT | PAGE_WRITE));
TAILQ_INIT(&new->page_head); TAILQ_INIT(&new->page_head);
return new; return new;
} }
@ -319,19 +340,24 @@ void virtual_pd_page_add(pd *dst, u8* vaddr, u8 * paddr, u32 flags)
page *pg; page *pg;
int i; int i;
if (dst == NULL) if (dst == NULL)
if (vaddr > (u8 *) USER_CODE) { if (vaddr > (u8 *) USER_CODE)
{
print("ERREUR: Adresse %X n'est pas dans l'espace noyau !\n", vaddr); print("ERREUR: Adresse %X n'est pas dans l'espace noyau !\n", vaddr);
return; return;
} }
pdir = (u32 *) (0xFFFFF000 | (((u32) vaddr & 0xFFC00000) >> 20)); pdir = (u32 *) (0xFFFFF000 | (((u32) vaddr & 0xFFC00000) >> 20));
if ((*pdir & PAGE_PRESENT) == 0) { if ((*pdir & PAGE_PRESENT) == 0)
{
if (dst == NULL) if (dst == NULL)
panic(sprintf("Page table introuvable pour l'adresse %x !\r\n", vaddr)); panic(sprintf
("Page table introuvable pour l'adresse %x !\r\n",
vaddr));
pg = virtual_page_getfree(); pg = virtual_page_getfree();
pt = (u32 *) pg->vaddr; pt = (u32 *) pg->vaddr;
for (i = 1; i < 1024; i++) for (i = 1; i < 1024; i++)
pt[i] = 0; pt[i] = 0;
*pdir = (u32) pg->paddr | (PAGE_PRESENT | PAGE_WRITE | flags); *pdir = (u32) pg->
paddr | (PAGE_PRESENT | PAGE_WRITE | flags);
if (dst) if (dst)
TAILQ_INSERT_TAIL(&dst->page_head, pg, tailq); TAILQ_INSERT_TAIL(&dst->page_head, pg, tailq);
} }
@ -346,8 +372,10 @@ void virtual_pd_page_add(pd *dst, u8* vaddr, u8 * paddr, u32 flags)
void virtual_pd_page_remove(u8 * vaddr) void virtual_pd_page_remove(u8 * vaddr)
{ {
u32 *ptable; u32 *ptable;
if (virtual_to_physical(vaddr)) { if (virtual_to_physical(vaddr))
ptable = (u32 *) (0xFFC00000 | (((u32) vaddr & 0xFFFFF000) >> 10)); {
ptable = (u32 *) (0xFFC00000 |
(((u32) vaddr & 0xFFFFF000) >> 10));
*ptable = (*ptable & (~PAGE_PRESENT)); *ptable = (*ptable & (~PAGE_PRESENT));
asm("invlpg %0"::"m"(vaddr)); asm("invlpg %0"::"m"(vaddr));
} }
@ -363,10 +391,13 @@ u8* virtual_to_physical(u8 *vaddr)
u32 *ptable; u32 *ptable;
pdir = (u32 *) (0xFFFFF000 | (((u32) vaddr & 0xFFC00000) >> 20)); pdir = (u32 *) (0xFFFFF000 | (((u32) vaddr & 0xFFC00000) >> 20));
if ((*pdir & PAGE_PRESENT)) { if ((*pdir & PAGE_PRESENT))
ptable = (u32 *) (0xFFC00000 | (((u32) vaddr & 0xFFFFF000) >> 10)); {
ptable = (u32 *) (0xFFC00000 |
(((u32) vaddr & 0xFFFFF000) >> 10));
if ((*ptable & PAGE_PRESENT)) if ((*ptable & PAGE_PRESENT))
return (u8 *) ((*ptable & 0xFFFFF000) + (TOPG((u32) vaddr))); return (u8 *) ((*ptable & 0xFFFFF000) +
(TOPG((u32) vaddr)));
} }
return 0; return 0;
} }
@ -374,17 +405,20 @@ u8* virtual_to_physical(u8 *vaddr)
/*******************************************************************************/ /*******************************************************************************/
/* Détermine une plage virtuelle de mémoire comme étant mappé aux adresses physiques spécifiées GENERIQUE*/ /* Détermine une plage virtuelle de mémoire comme étant mappé aux adresses physiques spécifiées GENERIQUE*/
void virtual_range_use(pd *dst, u8 *vaddr, u8 *paddr, u64 len, u32 flags) void virtual_range_use(pd * dst, u8 * vaddr, u8 * paddr, u64 len,
u32 flags)
{ {
u64 i; u64 i;
u32 realen = len / PAGESIZE; u32 realen = len / PAGESIZE;
page *pg; page *pg;
if (len%PAGESIZE!=0) realen++; if (len % PAGESIZE != 0)
realen++;
for (i = 0; i < realen; i++) for (i = 0; i < realen; i++)
{ {
if (dst == NULL) if (dst == NULL)
{ {
virtual_pd_page_add(dst, vaddr+i*PAGESIZE, paddr+i*PAGESIZE, flags); virtual_pd_page_add(dst, vaddr + i * PAGESIZE,
paddr + i * PAGESIZE, flags);
} }
else else
{ {
@ -392,7 +426,8 @@ void virtual_range_use(pd *dst, u8 *vaddr, u8 *paddr, u64 len, u32 flags)
pg->paddr = paddr + i * PAGESIZE; pg->paddr = paddr + i * PAGESIZE;
pg->vaddr = vaddr + i * PAGESIZE; pg->vaddr = vaddr + i * PAGESIZE;
TAILQ_INSERT_TAIL(&dst->page_head, pg, tailq); TAILQ_INSERT_TAIL(&dst->page_head, pg, tailq);
virtual_pd_page_add(dst, pg->vaddr, pg->paddr, flags); virtual_pd_page_add(dst, pg->vaddr, pg->paddr,
flags);
} }
} }
} }
@ -404,7 +439,8 @@ void virtual_range_free(pd *dst, u8 *vaddr, u64 len)
{ {
u64 i; u64 i;
u32 realen = len / PAGESIZE; u32 realen = len / PAGESIZE;
if (len%PAGESIZE!=0) realen++; if (len % PAGESIZE != 0)
realen++;
for (i = 0; i < realen; i++) for (i = 0; i < realen; i++)
{ {
virtual_pd_page_remove(vaddr + i * PAGESIZE); virtual_pd_page_remove(vaddr + i * PAGESIZE);
@ -420,12 +456,15 @@ void virtual_range_new(pd *dst, u8 *vaddr, u64 len, u32 flags)
u64 i; u64 i;
u32 realen = len / PAGESIZE; u32 realen = len / PAGESIZE;
page *pg; page *pg;
if (len%PAGESIZE!=0) realen++; if (len % PAGESIZE != 0)
realen++;
for (i = 0; i < realen; i++) for (i = 0; i < realen; i++)
{ {
if (dst == NULL) if (dst == NULL)
{ {
virtual_pd_page_add(dst, vaddr+i*PAGESIZE, physical_page_getfree(), flags); virtual_pd_page_add(dst, vaddr + i * PAGESIZE,
physical_page_getfree(),
flags);
} }
else else
{ {
@ -433,7 +472,8 @@ void virtual_range_new(pd *dst, u8 *vaddr, u64 len, u32 flags)
pg->paddr = physical_page_getfree(); pg->paddr = physical_page_getfree();
pg->vaddr = vaddr + i * PAGESIZE; pg->vaddr = vaddr + i * PAGESIZE;
TAILQ_INSERT_TAIL(&dst->page_head, pg, tailq); TAILQ_INSERT_TAIL(&dst->page_head, pg, tailq);
virtual_pd_page_add(dst, pg->vaddr, pg->paddr, flags); virtual_pd_page_add(dst, pg->vaddr, pg->paddr,
flags);
} }
} }
} }
@ -478,8 +518,8 @@ u32 virtual_getpagesfree()
{ {
vrange *next; vrange *next;
u32 realsize = 0; u32 realsize = 0;
TAILQ_FOREACH(next, &vrange_head, tailq) TAILQ_FOREACH(next, &vrange_head, tailq) realsize +=
realsize+=(next->vaddrhigh - next->vaddrlow)/PAGESIZE; (next->vaddrhigh - next->vaddrlow) / PAGESIZE;
return realsize; return realsize;
} }
@ -494,28 +534,35 @@ void virtual_page_free(u8 *vaddr)
paddr = virtual_to_physical(vaddr); paddr = virtual_to_physical(vaddr);
if (paddr) if (paddr)
physical_page_free(TOPAGE((u32) paddr)); physical_page_free(TOPAGE((u32) paddr));
else { else
printf("Aucune page associee a l'adresse virtuelle %x\n", vaddr); {
printf("Aucune page associee a l'adresse virtuelle %x\n",
vaddr);
return; return;
} }
virtual_pd_page_remove(vaddr); virtual_pd_page_remove(vaddr);
TAILQ_FOREACH(next, &vrange_head, tailq) { TAILQ_FOREACH(next, &vrange_head, tailq)
{
if (next->vaddrlow > vaddr) if (next->vaddrlow > vaddr)
break; break;
} }
prev = TAILQ_PREV(next, vrange_s, tailq); prev = TAILQ_PREV(next, vrange_s, tailq);
if (prev->vaddrhigh == vaddr) { if (prev->vaddrhigh == vaddr)
{
prev->vaddrhigh += PAGESIZE; prev->vaddrhigh += PAGESIZE;
if (prev->vaddrhigh == next->vaddrlow) { if (prev->vaddrhigh == next->vaddrlow)
{
prev->vaddrhigh = next->vaddrhigh; prev->vaddrhigh = next->vaddrhigh;
TAILQ_REMOVE(&vrange_head, next, tailq); TAILQ_REMOVE(&vrange_head, next, tailq);
vfree(next); vfree(next);
} }
} }
else if (next->vaddrlow == vaddr + PAGESIZE) { else if (next->vaddrlow == vaddr + PAGESIZE)
{
next->vaddrlow = vaddr; next->vaddrlow = vaddr;
} }
else if (next->vaddrlow > vaddr + PAGESIZE) { else if (next->vaddrlow > vaddr + PAGESIZE)
{
new = (vrange *) vmalloc(sizeof(vrange)); new = (vrange *) vmalloc(sizeof(vrange));
new->vaddrlow = vaddr; new->vaddrlow = vaddr;
new->vaddrhigh = vaddr + PAGESIZE; new->vaddrhigh = vaddr + PAGESIZE;
@ -532,7 +579,8 @@ void virtual_page_free(u8 *vaddr)
void virtual_pd_destroy(pd * dst) void virtual_pd_destroy(pd * dst)
{ {
page *pg; page *pg;
TAILQ_FOREACH(pg, &dst->page_head, tailq) { TAILQ_FOREACH(pg, &dst->page_head, tailq)
{
virtual_page_free(pg->vaddr); virtual_page_free(pg->vaddr);
TAILQ_REMOVE(&dst->page_head, pg, tailq); TAILQ_REMOVE(&dst->page_head, pg, tailq);
vfree(pg); vfree(pg);
@ -549,7 +597,8 @@ void malloc_init(void)
{ {
tmalloc *chunk; tmalloc *chunk;
chunk = (tmalloc *) KERNEL_HEAP; chunk = (tmalloc *) KERNEL_HEAP;
virtual_pd_page_add(NULL, KERNEL_HEAP, physical_page_getfree(), PAGE_NOFLAG); virtual_pd_page_add(NULL, KERNEL_HEAP, physical_page_getfree(),
PAGE_NOFLAG);
kernelcurrentheap = KERNEL_HEAP + PAGESIZE; kernelcurrentheap = KERNEL_HEAP + PAGESIZE;
chunk->size = PAGESIZE; chunk->size = PAGESIZE;
chunk->used = 0; chunk->used = 0;
@ -581,8 +630,8 @@ void identity_init(void)
pd0[0] = ((u32) pg0 | (PAGE_PRESENT | PAGE_WRITE | PAGE_4MB)); pd0[0] = ((u32) pg0 | (PAGE_PRESENT | PAGE_WRITE | PAGE_4MB));
pd0[1] = ((u32) pg1 | (PAGE_PRESENT | PAGE_WRITE | PAGE_4MB)); pd0[1] = ((u32) pg1 | (PAGE_PRESENT | PAGE_WRITE | PAGE_4MB));
for (i = 2; i < 1023; i++) for (i = 2; i < 1023; i++)
pd0[i] = pd0[i] = ((u32) pg1 +
((u32) pg1 + PAGESIZE * i) | (PAGE_PRESENT | PAGE_WRITE); PAGESIZE * i) | (PAGE_PRESENT | PAGE_WRITE);
pd0[1023] = ((u32) pd0 | (PAGE_PRESENT | PAGE_WRITE)); pd0[1023] = ((u32) pd0 | (PAGE_PRESENT | PAGE_WRITE));
} }
@ -619,8 +668,10 @@ void initpaging(void)
void memset(void *dst, u8 val, u32 count, u32 size) void memset(void *dst, u8 val, u32 count, u32 size)
{ {
u8 *d = (u8 *) dst; u8 *d = (u8 *) dst;
if (size>0) size--; if (size > 0)
for (; count != 0; count--) { size--;
for (; count != 0; count--)
{
*(d++) = val; *(d++) = val;
d += size; d += size;
} }
@ -633,8 +684,10 @@ void memcpy(void *src, void *dst, u32 count, u32 size)
{ {
u8 *s = (u8 *) src; u8 *s = (u8 *) src;
u8 *d = (u8 *) dst; u8 *d = (u8 *) dst;
if (size>0) size--; if (size > 0)
for (; count != 0; count--) { size--;
for (; count != 0; count--)
{
*(d++) = *(s++); *(d++) = *(s++);
d += size; d += size;
} }
@ -647,8 +700,10 @@ u32 memcmp(void *src, void *dst, u32 count, u32 size)
{ {
u8 *s = (u8 *) src; u8 *s = (u8 *) src;
u8 *d = (u8 *) dst; u8 *d = (u8 *) dst;
if (size>0) size--; if (size > 0)
for (; count != 0; count--) { size--;
for (; count != 0; count--)
{
if (*(s++) != *(d++)) if (*(s++) != *(d++))
return *d - *s; return *d - *s;
s += size; s += size;

View File

@ -72,8 +72,10 @@ void mouse(void)
u8 mbyte = inb(0x60); u8 mbyte = inb(0x60);
s8 changex, changey; s8 changex, changey;
if (mousereplies > 0) { if (mousereplies > 0)
if (mbyte == 0xFA) { {
if (mbyte == 0xFA)
{
mousereplies--; mousereplies--;
goto endofint; goto endofint;
} }
@ -83,34 +85,47 @@ void mouse(void)
mpacket[bytepos] = mbyte; mpacket[bytepos] = mbyte;
bytepos++; bytepos++;
if (bytepos == 3) { if (bytepos == 3)
{
bytepos = 0; bytepos = 0;
if (mpacket[1] == 0) { if (mpacket[1] == 0)
{
changex = 0; changex = 0;
} else {
changex = (mpacket[0] & 0x10) ?
mpacket[1] - 256 : mpacket[1];
} }
if (mpacket[2] == 0) { else
{
changex =
(mpacket[0] & 0x10) ? mpacket[1] -
256 : mpacket[1];
}
if (mpacket[2] == 0)
{
changey = 0; changey = 0;
} else { }
changey = -((mpacket[0] & 0x20) ? else
mpacket[2] - 256 : mpacket[2]); {
changey =
-((mpacket[0] & 0x20) ? mpacket[2] -
256 : mpacket[2]);
} }
mousex += (changex << speed); mousex += (changex << speed);
mousey += (changey << speed); mousey += (changey << speed);
if (mousex < 0) { if (mousex < 0)
{
mousex = 0; mousex = 0;
} }
if (mousex >= 65535) { if (mousex >= 65535)
{
mousex = 65535; mousex = 65535;
} }
if (mousey < 0) { if (mousey < 0)
{
mousey = 0; mousey = 0;
} }
if (mousey >= 65535) { if (mousey >= 65535)
{
mousey = 65535; mousey = 65535;
} }
videoinfos *info = getvideo_info(); videoinfos *info = getvideo_info();

View File

@ -23,8 +23,11 @@ struct multiboot_tag *tag;
unsigned size = *(unsigned *) infobloc; unsigned size = *(unsigned *) infobloc;
for (tag = (struct multiboot_tag *) (infobloc + 8); for (tag = (struct multiboot_tag *) (infobloc + 8);
tag->type != MULTIBOOT_TAG_TYPE_END; tag->type != MULTIBOOT_TAG_TYPE_END;
tag = (struct multiboot_tag *) ((u8 *) tag + ((tag->size + 7) & ~7))) tag =
if (tag->type==type) return tag; (struct multiboot_tag *) ((u8 *) tag +
((tag->size + 7) & ~7)))
if (tag->type == type)
return tag;
} }
/*******************************************************************************/ /*******************************************************************************/
@ -32,7 +35,8 @@ for (tag = (struct multiboot_tag *) (infobloc + 8);
u8 *getgrubinfo_cmdline(void) u8 *getgrubinfo_cmdline(void)
{ {
struct multiboot_tag_string *tag=getgrubinfo(MULTIBOOT_TAG_TYPE_CMDLINE); struct multiboot_tag_string *tag =
getgrubinfo(MULTIBOOT_TAG_TYPE_CMDLINE);
return tag->string; return tag->string;
} }
@ -41,7 +45,8 @@ u8 *getgrubinfo_cmdline(void)
u32 getgrubinfo_ram(void) u32 getgrubinfo_ram(void)
{ {
struct multiboot_tag_basic_meminfo *tag=getgrubinfo(MULTIBOOT_TAG_TYPE_BASIC_MEMINFO); struct multiboot_tag_basic_meminfo *tag =
getgrubinfo(MULTIBOOT_TAG_TYPE_BASIC_MEMINFO);
return tag->mem_upper; return tag->mem_upper;
} }
@ -50,7 +55,8 @@ u32 getgrubinfo_ram(void)
struct multiboot_tag_mmap *getgrubinfo_mem(void) struct multiboot_tag_mmap *getgrubinfo_mem(void)
{ {
struct multiboot_tag_mmap *tag=getgrubinfo(MULTIBOOT_TAG_TYPE_MMAP); struct multiboot_tag_mmap *tag =
getgrubinfo(MULTIBOOT_TAG_TYPE_MMAP);
return tag; return tag;
} }
@ -59,7 +65,8 @@ struct multiboot_tag_mmap *getgrubinfo_mem(void)
struct multiboot_tag_framebuffer *getgrubinfo_fb(void) struct multiboot_tag_framebuffer *getgrubinfo_fb(void)
{ {
struct multiboot_tag_framebuffer *tag=getgrubinfo(MULTIBOOT_TAG_TYPE_FRAMEBUFFER); struct multiboot_tag_framebuffer *tag =
getgrubinfo(MULTIBOOT_TAG_TYPE_FRAMEBUFFER);
return tag; return tag;
} }
@ -70,55 +77,59 @@ void getgrubinfo_all(void)
{ {
struct multiboot_tag *tag; struct multiboot_tag *tag;
u32 size = *(unsigned *) infobloc; u32 size = *(unsigned *) infobloc;
if (infobloc & 7) print("Attention : Bloc non aligne..."); if (infobloc & 7)
print("Attention : Bloc non aligne...");
printf(" Taille :% 4u\r\n", (u32) size); printf(" Taille :% 4u\r\n", (u32) size);
for (tag = (struct multiboot_tag *) (infobloc + 8); for (tag = (struct multiboot_tag *) (infobloc + 8);
tag->type != MULTIBOOT_TAG_TYPE_END; tag->type != MULTIBOOT_TAG_TYPE_END;
tag = (struct multiboot_tag *) ((u8 *) tag + ((tag->size + 7) & ~7))) tag =
(struct multiboot_tag *) ((u8 *) tag +
((tag->size + 7) & ~7)))
{ {
printf ("--- Tag % hu, Taille % hu\r\n", tag->type, tag->size); printf("--- Tag % hu, Taille % hu\r\n", tag->type,
tag->size);
switch (tag->type) switch (tag->type)
{ {
case MULTIBOOT_TAG_TYPE_CMDLINE: case MULTIBOOT_TAG_TYPE_CMDLINE:
printf(" Ligne de lancement : %s\r\n", printf(" Ligne de lancement : %s\r\n",
((struct multiboot_tag_string *) tag)->string); ((struct multiboot_tag_string *)
tag)->string);
break; break;
case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME: case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME:
printf(" Chargeur de boot : %s\r\n", printf(" Chargeur de boot : %s\r\n",
((struct multiboot_tag_string *) tag)->string); ((struct multiboot_tag_string *)
tag)->string);
break; break;
case MULTIBOOT_TAG_TYPE_MODULE: case MULTIBOOT_TAG_TYPE_MODULE:
printf (" Module %X-%X. Command line %s\r\n", printf(" Module %X-%X. Command line %s\r\n", ((struct multiboot_tag_module *) tag)->mod_start, ((struct multiboot_tag_module *) tag)->mod_end, ((struct multiboot_tag_module *) tag)->cmdline);
((struct multiboot_tag_module *) tag)->mod_start,
((struct multiboot_tag_module *) tag)->mod_end,
((struct multiboot_tag_module *) tag)->cmdline);
break; break;
case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO: case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO:
printf (" Memoire basse : %H, memoire haute = %lH\r\n", printf(" Memoire basse : %H, memoire haute = %lH\r\n", ((struct multiboot_tag_basic_meminfo *) tag)->mem_lower << 10, ((u64) ((struct multiboot_tag_basic_meminfo *) tag)->mem_upper) << 10);
((struct multiboot_tag_basic_meminfo *) tag)->mem_lower<<10,
((u64)((struct multiboot_tag_basic_meminfo *) tag)->mem_upper)<<10);
break; break;
case MULTIBOOT_TAG_TYPE_BOOTDEV: case MULTIBOOT_TAG_TYPE_BOOTDEV:
printf (" Peripherique de demarrage : %Y,%u,%u\r\n\r\n", printf(" Peripherique de demarrage : %Y,%u,%u\r\n\r\n", ((struct multiboot_tag_bootdev *) tag)->biosdev, ((struct multiboot_tag_bootdev *) tag)->slice, ((struct multiboot_tag_bootdev *) tag)->part);
((struct multiboot_tag_bootdev *) tag)->biosdev,
((struct multiboot_tag_bootdev *) tag)->slice,
((struct multiboot_tag_bootdev *) tag)->part);
break; break;
case MULTIBOOT_TAG_TYPE_MMAP: case MULTIBOOT_TAG_TYPE_MMAP:
{ {
multiboot_memory_map_t *mmap; multiboot_memory_map_t *mmap;
printf("*** Plan de memoire ***\r\n"); printf("*** Plan de memoire ***\r\n");
for (mmap = ((struct multiboot_tag_mmap *) tag)->entries;(u8 *) mmap < (u8 *) tag + tag->size; mmap = (multiboot_memory_map_t *) for (mmap =
((unsigned long) mmap + ((struct multiboot_tag_mmap *) tag)->entry_size)) ((struct multiboot_tag_mmap *) tag)->
printf (" adresse: %lY, taille:%lY, type:%Y\r\n", entries;
(u64) (mmap->addr), (u8 *) mmap < (u8 *) tag + tag->size;
(u64) (mmap->len), mmap =
(u32) (mmap->type)); (multiboot_memory_map_t
*) ((unsigned long) mmap +
((struct multiboot_tag_mmap *)
tag)->entry_size))
printf(" adresse: %lY, taille:%lY, type:%Y\r\n", (u64) (mmap->addr), (u64) (mmap->len), (u32) (mmap->type));
break; break;
} }
case MULTIBOOT_TAG_TYPE_FRAMEBUFFER: case MULTIBOOT_TAG_TYPE_FRAMEBUFFER:
{ {
struct multiboot_tag_framebuffer *tagfb = (struct multiboot_tag_framebuffer *) tag; struct multiboot_tag_framebuffer *tagfb =
(struct multiboot_tag_framebuffer
*) tag;
printf(" Framebuffer, resolution %d*%d*%d adresse: %X, ", tagfb->common.framebuffer_width, tagfb->common.framebuffer_height, tagfb->common.framebuffer_bpp, tagfb->common.framebuffer_addr); printf(" Framebuffer, resolution %d*%d*%d adresse: %X, ", tagfb->common.framebuffer_width, tagfb->common.framebuffer_height, tagfb->common.framebuffer_bpp, tagfb->common.framebuffer_addr);
switch (tagfb->common.framebuffer_type) switch (tagfb->common.framebuffer_type)
{ {
@ -136,7 +147,9 @@ for (tag = (struct multiboot_tag *) (infobloc + 8);
} }
case MULTIBOOT_TAG_TYPE_VBE: case MULTIBOOT_TAG_TYPE_VBE:
{ {
struct multiboot_tag_vbe *tagvbe = (struct multiboot_tag_framebuffer *) tag; struct multiboot_tag_vbe *tagvbe =
(struct multiboot_tag_framebuffer
*) tag;
printf(" VBE 2.0, mode %Y, adresse %hY:%hY-%hY\r\n", tagvbe->vbe_mode, tagvbe->vbe_interface_seg, tagvbe->vbe_interface_off, tagvbe->vbe_interface_len); printf(" VBE 2.0, mode %Y, adresse %hY:%hY-%hY\r\n", tagvbe->vbe_mode, tagvbe->vbe_interface_seg, tagvbe->vbe_interface_off, tagvbe->vbe_interface_len);
} }
} }

View File

@ -17,18 +17,23 @@
u8 *pcigetclassname(const pcidev * device) u8 *pcigetclassname(const pcidev * device)
{ {
pciclass *class = NULL; pciclass *class = NULL;
if ( device == NULL ) { if (device == NULL)
{
return NULL; return NULL;
} }
if ( device->base_class == 0xff ) { if (device->base_class == 0xff)
{
return "Unassigned class"; return "Unassigned class";
} }
class = classcodes[device->base_class]; class = classcodes[device->base_class];
if (!class) { if (!class)
{
return "Unknowned class"; return "Unknowned class";
} }
while (class->name != NULL) { while (class->name != NULL)
if (class->number == device->sub_class) { {
if (class->number == device->sub_class)
{
return class->name; return class->name;
} }
class++; class++;
@ -43,8 +48,11 @@ u8 * pcigetclassname( const pcidev *device)
pcidevmini getPCImininfo(const u8 bus, const u8 dev, const u8 function) pcidevmini getPCImininfo(const u8 bus, const u8 dev, const u8 function)
{ {
pcidevmini result; pcidevmini result;
if ((result.vendor_id = pciConfigReadWord(bus,dev,function,0x0)) != 0xFFFF) { if ((result.vendor_id =
result.device_id = pciConfigReadWord(bus,dev,function,0x2); pciConfigReadWord(bus, dev, function, 0x0)) != 0xFFFF)
{
result.device_id =
pciConfigReadWord(bus, dev, function, 0x2);
} }
return result; return result;
} }
@ -52,14 +60,19 @@ pcidevmini getPCImininfo(const u8 bus, const u8 dev, const u8 function)
/*******************************************************************************/ /*******************************************************************************/
/* Récupère toutes les informations du periphérique PCI donnée */ /* Récupère toutes les informations du periphérique PCI donnée */
bool getPCInfo(pcidev *device, const u8 bus, const u8 dev, const u8 function) bool getPCInfo(pcidev * device, const u8 bus, const u8 dev,
const u8 function)
{ {
if ((device->vendor_id = pciConfigReadWord(bus,dev,function,0x0)) != 0xFFFF) if ((device->vendor_id =
pciConfigReadWord(bus, dev, function, 0x0)) != 0xFFFF)
{ {
u16 temp; u16 temp;
device->device_id = pciConfigReadWord(bus,dev,function,0x2); device->device_id =
device->command = pciConfigReadWord(bus,dev,function,0x4); pciConfigReadWord(bus, dev, function, 0x2);
device->status = pciConfigReadWord(bus,dev,function,0x6); device->command =
pciConfigReadWord(bus, dev, function, 0x4);
device->status =
pciConfigReadWord(bus, dev, function, 0x6);
temp = pciConfigReadWord(bus, dev, function, 0x8); temp = pciConfigReadWord(bus, dev, function, 0x8);
device->revision_id = temp & 0xFF; device->revision_id = temp & 0xFF;
device->interface = temp >> 8; device->interface = temp >> 8;
@ -81,10 +94,13 @@ bool getPCInfo(pcidev *device, const u8 bus, const u8 dev, const u8 function)
/*******************************************************************************/ /*******************************************************************************/
/* Récupère les informations sur le periphérique PCI donnée */ /* Récupère les informations sur le periphérique PCI donnée */
u16 pciConfigReadWord(const u8 bus, const u8 dev, const u8 function, const u8 offset) u16 pciConfigReadWord(const u8 bus, const u8 dev, const u8 function,
const u8 offset)
{ {
u16 tmp = 0; u16 tmp = 0;
u32 addr = (0x80000000|(bus << 16)|(dev << 11)|(function << 8)|(offset & 0xFC)); u32 addr =
(0x80000000 | (bus << 16) | (dev << 11) | (function << 8) |
(offset & 0xFC));
outd(0xCF8, addr); outd(0xCF8, addr);
tmp = (u16) ((ind(0xCFC) >> ((offset & 2) * 8)) & 0xffff); tmp = (u16) ((ind(0xCFC) >> ((offset & 2) * 8)) & 0xffff);
return tmp; return tmp;
@ -99,9 +115,11 @@ void scanPCImini(void)
pcidevmini result; pcidevmini result;
for (bus = 0; bus < MAX_BUS_SCAN; ++bus) for (bus = 0; bus < MAX_BUS_SCAN; ++bus)
for (device = 0; device < MAX_DEVICE_SCAN; ++device) for (device = 0; device < MAX_DEVICE_SCAN; ++device)
for (function=0; function<MAX_FUNCTION_SCAN; ++function) for (function = 0; function < MAX_FUNCTION_SCAN;
++function)
{ {
result = getPCImininfo(bus,device,function); result = getPCImininfo(bus, device,
function);
if (result.vendor_id != 0xFFFF) if (result.vendor_id != 0xFFFF)
printf("Bus:%hx Dev:%hx Func:%hx %hx:%hx\r\n", bus, device, function, result.vendor_id, result.device_id); printf("Bus:%hx Dev:%hx Func:%hx %hx:%hx\r\n", bus, device, function, result.vendor_id, result.device_id);
} }
@ -118,11 +136,12 @@ void scanPCI(void)
pcidev result; pcidev result;
for (bus = 0; bus < MAX_BUS_SCAN; ++bus) for (bus = 0; bus < MAX_BUS_SCAN; ++bus)
for (device = 0; device < MAX_DEVICE_SCAN; ++device) for (device = 0; device < MAX_DEVICE_SCAN; ++device)
for (function=0; function<MAX_FUNCTION_SCAN; ++function) for (function = 0; function < MAX_FUNCTION_SCAN;
if (getPCInfo(&result,bus,device,function)) ++function)
if (getPCInfo
(&result, bus, device, function))
printf("Bus:%hx Dev:%hx Func:%hx %hx:%hx ->%s\r\n", bus, device, function, result.vendor_id, result.device_id, pcigetclassname(&result)); printf("Bus:%hx Dev:%hx Func:%hx %hx:%hx ->%s\r\n", bus, device, function, result.vendor_id, result.device_id, pcigetclassname(&result));
return; return;
} }
/*******************************************************************************/ /*******************************************************************************/

View File

@ -18,7 +18,9 @@ static u8 elf_errors3[]="ELF non LSB";
static u8 elf_errors4[] = "ELF mauvaise version"; static u8 elf_errors4[] = "ELF mauvaise version";
static u8 elf_errors5[] = "ELF pour OS ne correspondant pas"; static u8 elf_errors5[] = "ELF pour OS ne correspondant pas";
static u8 elf_errors6[] = "Mauvais type de machine"; static u8 elf_errors6[] = "Mauvais type de machine";
static u8 *elf_errors[]={&elf_errors1,&elf_errors2,&elf_errors3,&elf_errors4,&elf_errors5,&elf_errors6}; static u8 *elf_errors[] =
{ &elf_errors1, &elf_errors2, &elf_errors3, &elf_errors4,
&elf_errors5, &elf_errors6 };
/*******************************************************************************/ /*******************************************************************************/
/* Vérifie la signature ELF /* Vérifie la signature ELF
@ -33,14 +35,17 @@ static u8 *elf_errors[]={&elf_errors1,&elf_errors2,&elf_errors3,&elf_errors4,&el
u32 elf_test(u8 * src) u32 elf_test(u8 * src)
{ {
elf32 *header = (elf32 *) src; elf32 *header = (elf32 *) src;
if (header->e_ident[EI_MAG0] == ELFMAG0 && header->e_ident[EI_MAG1] == ELFMAG1 if (header->e_ident[EI_MAG0] == ELFMAG0
&& header->e_ident[EI_MAG2] == ELFMAG2 && header->e_ident[EI_MAG3] == ELFMAG3) && header->e_ident[EI_MAG1] == ELFMAG1
&& header->e_ident[EI_MAG2] == ELFMAG2
&& header->e_ident[EI_MAG3] == ELFMAG3)
{ {
if (header->e_ident[EI_CLASS] != ELFCLASS32) if (header->e_ident[EI_CLASS] != ELFCLASS32)
return 2; return 2;
if (header->e_ident[EI_DATA] != ELFDATA2LSB) if (header->e_ident[EI_DATA] != ELFDATA2LSB)
return 3; return 3;
if (header->e_ident[EI_VERSION]!=EV_CURRENT || header->e_version!=EV_CURRENT) if (header->e_ident[EI_VERSION] != EV_CURRENT
|| header->e_version != EV_CURRENT)
return 4; return 4;
if (header->e_ident[EI_OSABI] != ELFOSABI_COS2000) if (header->e_ident[EI_OSABI] != ELFOSABI_COS2000)
return 5; return 5;
@ -67,33 +72,44 @@ u32 elf_load(u8 *src, u32 pid)
header = (elf32 *) src; header = (elf32 *) src;
program = (elf32p *) (src + header->e_phoff); program = (elf32p *) (src + header->e_phoff);
code = elf_test(src); code = elf_test(src);
if (code!=0) { if (code != 0)
printf("Erreur de chargement ELF, %s !\r\n",elf_errors[code-1]); {
printf("Erreur de chargement ELF, %s !\r\n",
elf_errors[code - 1]);
return NULL; return NULL;
} }
for (i = 0; i < header->e_phnum; i++, program++) { for (i = 0; i < header->e_phnum; i++, program++)
if (program->p_type == PT_LOAD) { {
if (program->p_type == PT_LOAD)
{
v_begin = program->p_vaddr; v_begin = program->p_vaddr;
v_end = program->p_vaddr + program->p_memsz; v_end = program->p_vaddr + program->p_memsz;
if (v_begin < USER_CODE) { if (v_begin < USER_CODE)
{
printf("Ne peut charger l'executable en desssous de l'adresse %X\r\n", USER_CODE); printf("Ne peut charger l'executable en desssous de l'adresse %X\r\n", USER_CODE);
return 0; return 0;
} }
if (v_end > USER_STACK) { if (v_end > USER_STACK)
{
printf("Ne peut charger l'executable au desssus de l'adresse %X\r\n", USER_STACK); printf("Ne peut charger l'executable au desssus de l'adresse %X\r\n", USER_STACK);
return 0; return 0;
} }
if (program->p_flags == PF_X + PF_R) { if (program->p_flags == PF_X + PF_R)
{
processes[pid].exec_low = (u8 *) v_begin; processes[pid].exec_low = (u8 *) v_begin;
processes[pid].exec_high = (u8 *) v_end; processes[pid].exec_high = (u8 *) v_end;
} }
if (program->p_flags == PF_W + PF_R) { if (program->p_flags == PF_W + PF_R)
{
processes[pid].bss_low = (u8 *) v_begin; processes[pid].bss_low = (u8 *) v_begin;
processes[pid].bss_high = (u8 *) v_end; processes[pid].bss_high = (u8 *) v_end;
} }
memcpy((u8 *) (src + program->p_offset),(u8 *) v_begin , program->p_filesz,0); memcpy((u8 *) (src + program->p_offset),
(u8 *) v_begin, program->p_filesz, 0);
if (program->p_memsz > program->p_filesz) if (program->p_memsz > program->p_filesz)
for (i = program->p_filesz, ptr = (u8 *) program->p_vaddr; i < program->p_memsz; i++) for (i = program->p_filesz, ptr =
(u8 *) program->p_vaddr;
i < program->p_memsz; i++)
ptr[i] = 0; ptr[i] = 0;
} }
} }
@ -104,10 +120,12 @@ u32 elf_load(u8 *src, u32 pid)
/*******************************************************************************/ /*******************************************************************************/
/* Initialise la liste des processus */ /* Initialise la liste des processus */
void task_init() { void task_init()
{
u32 i = 0; u32 i = 0;
processes = (process *) vmalloc(sizeof(process) * MAXNUMPROCESS); processes = (process *) vmalloc(sizeof(process) * MAXNUMPROCESS);
while (i++ < MAXNUMPROCESS) { while (i++ < MAXNUMPROCESS)
{
processes[i].pid = NULL; processes[i].pid = NULL;
processes[i].status = STATUS_FREE; processes[i].status = STATUS_FREE;
} }
@ -142,12 +160,14 @@ u32 task_getfreePID ()
{ {
u32 i = lastpid; u32 i = lastpid;
u32 parsed = 0; u32 parsed = 0;
while (processes[++i].status != STATUS_FREE && ++parsed < MAXNUMPROCESS) while (processes[++i].status != STATUS_FREE
&& ++parsed < MAXNUMPROCESS)
{ {
if (i >= MAXNUMPROCESS) if (i >= MAXNUMPROCESS)
i = 0; i = 0;
} }
if (parsed>MAXNUMPROCESS) { if (parsed > MAXNUMPROCESS)
{
printf("PANIC: plus d'emplacement disponible pour un novueau processus\n"); printf("PANIC: plus d'emplacement disponible pour un novueau processus\n");
return NULL; return NULL;
} }
@ -211,7 +231,8 @@ u32 task_create(u8 *code,bool kerneltask)
if (kerneltask) if (kerneltask)
{ {
processes[pid].dump.ss = SEL_KERNEL_STACK; processes[pid].dump.ss = SEL_KERNEL_STACK;
processes[pid].dump.esp = (u32) kstack->vaddr + PAGESIZE - 16; processes[pid].dump.esp =
(u32) kstack->vaddr + PAGESIZE - 16;
processes[pid].dump.eflags = 0x0; processes[pid].dump.eflags = 0x0;
processes[pid].dump.cs = SEL_KERNEL_CODE; processes[pid].dump.cs = SEL_KERNEL_CODE;
processes[pid].dump.eip = elf_load(code, pid); processes[pid].dump.eip = elf_load(code, pid);
@ -250,9 +271,11 @@ u32 task_create(u8 *code,bool kerneltask)
processes[pid].dump.es = SEL_USER_DATA | RPL_RING3; processes[pid].dump.es = SEL_USER_DATA | RPL_RING3;
processes[pid].dump.fs = SEL_USER_DATA | RPL_RING3; processes[pid].dump.fs = SEL_USER_DATA | RPL_RING3;
processes[pid].dump.gs = SEL_USER_DATA | RPL_RING3; processes[pid].dump.gs = SEL_USER_DATA | RPL_RING3;
processes[pid].dump.cr3 = (u32) processes[pid].pdd->addr->paddr; processes[pid].dump.cr3 =
(u32) processes[pid].pdd->addr->paddr;
processes[pid].kstack.ss0 = SEL_KERNEL_STACK; processes[pid].kstack.ss0 = SEL_KERNEL_STACK;
processes[pid].kstack.esp0 = (u32) kstack->vaddr + PAGESIZE - 16; processes[pid].kstack.esp0 =
(u32) kstack->vaddr + PAGESIZE - 16;
processes[pid].dump.eax = 0; processes[pid].dump.eax = 0;
processes[pid].dump.ecx = 0; processes[pid].dump.ecx = 0;
processes[pid].dump.edx = 0; processes[pid].dump.edx = 0;

View File

@ -57,7 +57,8 @@ void shell()
static u8 item[] = " \000"; static u8 item[] = " \000";
int i; int i;
bool found; bool found;
while (true) { while (true)
{
print("\r\n# "); print("\r\n# ");
getstring(&field); getstring(&field);
print("\r\n"); print("\r\n");
@ -66,8 +67,11 @@ void shell()
strgetitem(&field, &item, ' ', 0); strgetitem(&field, &item, ' ', 0);
strtolower(&item); strtolower(&item);
found = false; found = false;
for (i = 0; i < sizeof(commands)/sizeof(commands[0]); i++) { for (i = 0; i < sizeof(commands) / sizeof(commands[0]);
if (strcmp(&item, &commands[i].name) == 0) { i++)
{
if (strcmp(&item, &commands[i].name) == 0)
{
(*commands[i].function) (&field); (*commands[i].function) (&field);
found = true; found = true;
break; break;
@ -172,7 +176,8 @@ int logo()
int help() int help()
{ {
print("Commandes disponibles :\r\n\r\n"); print("Commandes disponibles :\r\n\r\n");
for(u32 i=0;i<sizeof(commands)/sizeof(commands[0]);i++) { for (u32 i = 0; i < sizeof(commands) / sizeof(commands[0]); i++)
{
printf("%s \r\n", &commands[i].name); printf("%s \r\n", &commands[i].name);
} }
return 0; return 0;
@ -193,7 +198,8 @@ int bpset(u8* commandline)
} }
strgetitem(commandline, &arg, ' ', 1); strgetitem(commandline, &arg, ' ', 1);
numero = strtoint(&arg); numero = strtoint(&arg);
if (numero>3) { if (numero > 3)
{
print("numero incorrect"); print("numero incorrect");
return; return;
} }
@ -227,7 +233,8 @@ int bpclr(u8* commandline)
} }
strgetitem(commandline, &arg, ' ', 1); strgetitem(commandline, &arg, ' ', 1);
numero = strtoint(&arg); numero = strtoint(&arg);
if (numero>3) { if (numero > 3)
{
print("numero incorrect"); print("numero incorrect");
return; return;
} }
@ -283,11 +290,13 @@ int view(u8* commandline)
size = strtoint(&arg); size = strtoint(&arg);
if (strgetnbitems(commandline, ' ') < 4) if (strgetnbitems(commandline, ' ') < 4)
format = 'b'; format = 'b';
else { else
{
strgetitem(commandline, &arg, ' ', 3); strgetitem(commandline, &arg, ' ', 3);
format = arg[0]; format = arg[0];
} }
switch (format) { switch (format)
{
case 'c': case 'c':
pointerb = address; pointerb = address;
nbligne = 12; nbligne = 12;
@ -312,11 +321,13 @@ int view(u8* commandline)
} }
printf("Adresse %Y - % hhu", address, size); printf("Adresse %Y - % hhu", address, size);
for (u32 i = 0; i < size; i++) for (u32 i = 0; i < size; i++)
switch (format) { switch (format)
{
case 'c': case 'c':
if (i % nbligne == 0) if (i % nbligne == 0)
printf("\r\n:%Y - ", pointerb); printf("\r\n:%Y - ", pointerb);
printf("%hhY \33[40C%c\33[41D",*(pointerb),*(pointerb++)); printf("%hhY \33[40C%c\33[41D",
*(pointerb), *(pointerb++));
break; break;
case 'b': case 'b':
if (i % nbligne == 0) if (i % nbligne == 0)
@ -402,11 +413,13 @@ int err(u8* commandline)
asm("mov $0x666, %ax; ltr %ax"); asm("mov $0x666, %ax; ltr %ax");
break; break;
case 14: case 14:
if (random(0, 100)>50) { if (random(0, 100) > 50)
{
print("Creation d'une erreur de page en ecriture !\r\n"); print("Creation d'une erreur de page en ecriture !\r\n");
asm("movl $0x66666666,(0xE0000000)"); asm("movl $0x66666666,(0xE0000000)");
} }
else { else
{
print("Creation d'une erreur de page en lecture !\r\n"); print("Creation d'une erreur de page en lecture !\r\n");
asm("movl (0xD0000000),%eax"); asm("movl (0xD0000000),%eax");
} }
@ -491,14 +504,16 @@ int rebootnow()
int test3d() int test3d()
{ {
videoinfos *vinfo = getvideo_info(); videoinfos *vinfo = getvideo_info();
if (!vinfo->isgraphic) { if (!vinfo->isgraphic)
{
print("Mode graphique necessaire afin de lancer ce programme\r\n"); print("Mode graphique necessaire afin de lancer ce programme\r\n");
return 1; return 1;
} }
model3d model; model3d model;
float factor = 100.0f; float factor = 100.0f;
type3D type = TYPE3D_POINTS; type3D type = TYPE3D_POINTS;
matrix44 rotatex,rotatey,rotatez,mrotatex,mrotatey,mrotatez,identity; matrix44 rotatex, rotatey, rotatez, mrotatex, mrotatey, mrotatez,
identity;
matrix44_homogen(&identity); matrix44_homogen(&identity);
matrix44_rotation_x(0.1f, &rotatex); matrix44_rotation_x(0.1f, &rotatex);
matrix44_rotation_y(0.1f, &rotatey); matrix44_rotation_y(0.1f, &rotatey);
@ -520,7 +535,8 @@ int test3d()
clearscreen(); clearscreen();
show3dmodel(&model, transformation, &origin, factor, type); show3dmodel(&model, transformation, &origin, factor, type);
achar = waitascii(); achar = waitascii();
switch(achar) { switch (achar)
{
case '1': case '1':
load3ds(&man, sizeof(man), &model); load3ds(&man, sizeof(man), &model);
break; break;
@ -552,7 +568,8 @@ int test3d()
factor += 10.0; factor += 10.0;
break; break;
case '*': case '*':
switch(type) { switch (type)
{
case TYPE3D_POINTS: case TYPE3D_POINTS:
type = TYPE3D_LINES; type = TYPE3D_LINES;
break; break;
@ -573,14 +590,16 @@ int test3d()
int test2d() int test2d()
{ {
videoinfos *vinfo = getvideo_info(); videoinfos *vinfo = getvideo_info();
if (!vinfo->isgraphic) { if (!vinfo->isgraphic)
{
print("Mode graphique necessaire afin de lancer ce programme\r\n"); print("Mode graphique necessaire afin de lancer ce programme\r\n");
return 1; return 1;
} }
struct vertex2d a, b, c; struct vertex2d a, b, c;
randomize(); randomize();
u32 color; u32 color;
for (int i = 0; i < 2000; i++) { for (int i = 0; i < 2000; i++)
{
a.x = random(0, vinfo->currentwidth); a.x = random(0, vinfo->currentwidth);
a.y = random(0, vinfo->currentheight); a.y = random(0, vinfo->currentheight);
b.x = random(0, vinfo->currentwidth); b.x = random(0, vinfo->currentwidth);
@ -594,7 +613,8 @@ int test2d()
v_line(&a, &b, color); v_line(&a, &b, color);
} }
waitascii(); waitascii();
for (int i = 0; i < 2000; i++) { for (int i = 0; i < 2000; i++)
{
a.x = random(0, vinfo->currentwidth); a.x = random(0, vinfo->currentwidth);
a.y = random(0, vinfo->currentheight); a.y = random(0, vinfo->currentheight);
b.x = random(0, vinfo->currentwidth); b.x = random(0, vinfo->currentwidth);
@ -622,13 +642,15 @@ int showidt()
idtdes *desc; idtdes *desc;
struct idtr idtreg; struct idtr idtreg;
sidt(&idtreg); sidt(&idtreg);
printf("Information sur l'IDT\r\nAdresse:%X Limite:%hX\r\n", idtreg.base, printf("Information sur l'IDT\r\nAdresse:%X Limite:%hX\r\n",
(u32) idtreg.limite); idtreg.base, (u32) idtreg.limite);
desc = idtreg.base; desc = idtreg.base;
for (index = 0; index < idtreg.limite / sizeof(idtdes); index++) { for (index = 0; index < idtreg.limite / sizeof(idtdes); index++)
{
u32 select = desc[index].select; u32 select = desc[index].select;
u32 offset = u32 offset =
desc[index].offset0_15 + (desc[index].offset16_31 << 16); desc[index].offset0_15 +
(desc[index].offset16_31 << 16);
u32 type = desc[index].type & 0x0F00; u32 type = desc[index].type & 0x0F00;
u8 *typestr1, *typestr2; u8 *typestr1, *typestr2;
if (i >= 32 & i <= 39) if (i >= 32 & i <= 39)
@ -651,9 +673,11 @@ int showidt()
typestr2 = "LDTDES"; typestr2 = "LDTDES";
else else
print("inconnu"); print("inconnu");
printf("%s % hu %hY:%Y - %s\r\n", typestr1, i++, select, offset, typestr2); printf("%s % hu %hY:%Y - %s\r\n", typestr1, i++, select,
offset, typestr2);
if (i % 32 == 0) { if (i % 32 == 0)
{
print("\r\n<Appuyez sur une touche>\r\n"); print("\r\n<Appuyez sur une touche>\r\n");
waitascii(); waitascii();
} }
@ -669,8 +693,10 @@ int showgdt()
u32 index; u32 index;
struct gdtr gdtreg; struct gdtr gdtreg;
sgdt(&gdtreg); sgdt(&gdtreg);
printf("Information sur la GDT\r\nAdresse:%X Limite:%hX\r\n", gdtreg.base, gdtreg.limite); printf("Information sur la GDT\r\nAdresse:%X Limite:%hX\r\n",
for (index = 0; index < gdtreg.limite ; index+=sizeof(gdtdes)) { gdtreg.base, gdtreg.limite);
for (index = 0; index < gdtreg.limite; index += sizeof(gdtdes))
{
if (!isdesvalid(index)) if (!isdesvalid(index))
printf("\033[31m"); printf("\033[31m");
printf("SEL =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\033[0m\r\n", index, getdesbase(index), getdeslimit(index), getdesdpl(index), getdestype(index), getdessize(index), getdesbit3(index), getdesbit2(index), getdesbit1(index), getdesalign(index)); printf("SEL =%hY %Y %Y DPL=%d %cS%d [%c%c%c] %h ub\033[0m\r\n", index, getdesbase(index), getdeslimit(index), getdesdpl(index), getdestype(index), getdessize(index), getdesbit3(index), getdesbit2(index), getdesbit1(index), getdesalign(index));
@ -687,10 +713,7 @@ int detectcpu()
u8 noproc[] = "\033[31mInconnu\033[0m\000"; u8 noproc[] = "\033[31mInconnu\033[0m\000";
strcpy(&noproc, &cpu.detectedname); strcpy(&noproc, &cpu.detectedname);
getcpuinfos(&cpu); getcpuinfos(&cpu);
printf printf("\r\nDetection du processeur\r\033[1m Revision \t:%d\r Modele \t:%d\r Famille \t:%d\r Nom cpuid\t:%s\rJeux d'instruction\t:%s\033[0m\r\n\000", cpu.stepping, cpu.models, cpu.family, &cpu.detectedname, &cpu.techs);
("\r\nDetection du processeur\r\033[1m Revision \t:%d\r Modele \t:%d\r Famille \t:%d\r Nom cpuid\t:%s\rJeux d'instruction\t:%s\033[0m\r\n\000",
cpu.stepping, cpu.models, cpu.family, &cpu.detectedname,
&cpu.techs);
return 0; return 0;
} }

View File

@ -9,7 +9,8 @@
s8 strcmp(const u8 * src, const u8 * dest) s8 strcmp(const u8 * src, const u8 * dest)
{ {
register s8 result; register s8 result;
do { do
{
if ((result = *src - *dest++) != 0) if ((result = *src - *dest++) != 0)
break; break;
} }
@ -66,7 +67,8 @@ u8 *strcpy(const u8 * src, u8 * dest)
u8 *strncpy(const u8 * src, u8 * dest, u32 count) u8 *strncpy(const u8 * src, u8 * dest, u32 count)
{ {
u8 *temp = dest; u8 *temp = dest;
while (count) { while (count)
{
if ((*temp = *src) != 0) if ((*temp = *src) != 0)
src++; src++;
temp++; temp++;
@ -92,7 +94,8 @@ u8 *strcat(const u8 * src, u8 * dest)
void strtolower(u8 * src) void strtolower(u8 * src)
{ {
while (*src != 0) { while (*src != 0)
{
if ((*src >= 'A') && (*src <= 'Z')) if ((*src >= 'A') && (*src <= 'Z'))
*src = *src + 'a' - 'A'; *src = *src + 'a' - 'A';
src++; src++;
@ -104,7 +107,8 @@ void strtolower(u8 * src)
void strtoupper(u8 * src) void strtoupper(u8 * src)
{ {
while (*src != 0) { while (*src != 0)
{
if ((*src >= 'a') && (*src <= 'z')) if ((*src >= 'a') && (*src <= 'z'))
*src = *src - ('a' - 'A'); *src = *src - ('a' - 'A');
src++; src++;
@ -116,7 +120,8 @@ void strtoupper(u8 * src)
void strinvertcase(u8 * src) void strinvertcase(u8 * src)
{ {
while (*src != 0) { while (*src != 0)
{
if ((*src >= 'A') && (*src <= 'Z')) if ((*src >= 'A') && (*src <= 'Z'))
*src = *src + 'a' - 'A'; *src = *src + 'a' - 'A';
else if ((*src >= 'a') && (*src <= 'z')) else if ((*src >= 'a') && (*src <= 'z'))
@ -132,7 +137,8 @@ void stronecase(u8 * src)
{ {
if ((*src >= 'a') && (*src <= 'z')) if ((*src >= 'a') && (*src <= 'z'))
*src = *src - ('a' - 'A'); *src = *src - ('a' - 'A');
while (*src != 0) { while (*src != 0)
{
src++; src++;
if ((*src >= 'A') && (*src <= 'Z')) if ((*src >= 'A') && (*src <= 'Z'))
*src = *src + 'a' - 'A'; *src = *src + 'a' - 'A';
@ -153,7 +159,8 @@ void strsetlen(u8 * src, u32 size)
void strinvert(u8 * src) void strinvert(u8 * src)
{ {
u8 *dst = src + strlen(src) - 1; u8 *dst = src + strlen(src) - 1;
while (src < dst) { while (src < dst)
{
u8 char1 = *dst; u8 char1 = *dst;
u8 char2 = *src; u8 char2 = *src;
*dst = char2; *dst = char2;
@ -169,7 +176,8 @@ void strinvert(u8 * src)
void strreplace(u8 * src, u8 search, u8 replaced) void strreplace(u8 * src, u8 search, u8 replaced)
{ {
u8 *pos = strchr(src, search); u8 *pos = strchr(src, search);
while (pos != 0) { while (pos != 0)
{
*pos = replaced; *pos = replaced;
pos = strchr(src, search); pos = strchr(src, search);
} }
@ -217,7 +225,8 @@ void strdelete(u8 * src, u32 index, u32 size)
{ {
u32 i; u32 i;
u32 realsize = strlen(src) - index - size; u32 realsize = strlen(src) - index - size;
for (i = 0; (*(src + index + size + i) != 0) && (i < realsize); i++) for (i = 0; (*(src + index + size + i) != 0) && (i < realsize);
i++)
*(src + index + i) = *(src + index + size + i); *(src + index + i) = *(src + index + size + i);
*(src + index + i) = '\000'; *(src + index + i) = '\000';
} }
@ -243,9 +252,11 @@ void strinsert(u8 * src, u8 * dest, u32 index)
void strcompressdelimiter(u8 * src, u8 delim) void strcompressdelimiter(u8 * src, u8 delim)
{ {
u8 *pos = strchr(src, delim); u8 *pos = strchr(src, delim);
while (pos != 0) { while (pos != 0)
{
u8 i; u8 i;
for (i = 0; (*(pos + i) != 0) && (*(pos + i) == delim); i++) ; for (i = 0; (*(pos + i) != 0) && (*(pos + i) == delim);
i++);
if (i > 1) if (i > 1)
strdelete(pos, 1, i - 1); strdelete(pos, 1, i - 1);
pos = strchr(pos + 1, delim); pos = strchr(pos + 1, delim);
@ -289,7 +300,8 @@ u32 strgetnbitems(u8 * src, u8 delim)
return 0; return 0;
number++; number++;
u8 *pos = strchr(src, delim); u8 *pos = strchr(src, delim);
while (pos != 0) { while (pos != 0)
{
pos = strchr(pos + 1, delim); pos = strchr(pos + 1, delim);
number++; number++;
} }
@ -307,7 +319,8 @@ u8 strgetminbase(u8 * src)
u8 *dst = &temp; u8 *dst = &temp;
strtoupper(strcpy(src, &temp)); strtoupper(strcpy(src, &temp));
u8 max = 0; u8 max = 0;
while (*dst != 0) { while (*dst != 0)
{
u32 result = strchrpos(&base, *dst++); u32 result = strchrpos(&base, *dst++);
if (result == 0) if (result == 0)
return 0; return 0;
@ -337,19 +350,25 @@ u8 strgetbase(u8 * src)
{ {
u8 temp[] = " \000"; u8 temp[] = " \000";
strleft(src, &temp, 2); strleft(src, &temp, 2);
if (strcmp(&temp, &hexa) == 0) { if (strcmp(&temp, &hexa) == 0)
{
declaredbase = 16; declaredbase = 16;
u8 size = strlen(src); u8 size = strlen(src);
strright(src, &temp, size - 2); strright(src, &temp, size - 2);
minbase = strgetminbase(&temp); minbase = strgetminbase(&temp);
} else { }
else
{
strright(src, &temp, 1); strright(src, &temp, 1);
declaredbase = basesnum[strchrpos(&bases, temp[0])]; declaredbase = basesnum[strchrpos(&bases, temp[0])];
if (declaredbase > 0) { if (declaredbase > 0)
{
u8 size = strlen(src); u8 size = strlen(src);
strleft(src, &temp, size - 1); strleft(src, &temp, size - 1);
minbase = strgetminbase(&temp); minbase = strgetminbase(&temp);
} else { }
else
{
minbase = strgetminbase(src); minbase = strgetminbase(src);
declaredbase = minbase; declaredbase = minbase;
} }
@ -379,7 +398,8 @@ u32 strtoint(u8 * src)
while (*temp == 0 || *temp == 'b' || *temp == 'o' || *temp == 'd' while (*temp == 0 || *temp == 'b' || *temp == 'o' || *temp == 'd'
|| *temp == 'h') || *temp == 'h')
temp--; temp--;
while (src + shorter <= temp) { while (src + shorter <= temp)
{
u8 achar = *temp--; u8 achar = *temp--;
if ((achar >= 'a') && (achar <= 'z')) if ((achar >= 'a') && (achar <= 'z'))
achar = achar - ('a' - 'A'); achar = achar - ('a' - 'A');

View File

@ -29,7 +29,8 @@ char ctype[] = {
CT_UP, CT_UP, CT_UP, CT_UP, CT_UP, CT_UP, CT_UP, CT_UP,
/* 'X' */ CT_UP, CT_UP, CT_UP, CT_PUN, /* 'X' */ CT_UP, CT_UP, CT_UP, CT_PUN,
CT_PUN, CT_PUN, CT_PUN, CT_PUN, CT_PUN, CT_PUN, CT_PUN, CT_PUN,
/* '`' */ CT_PUN, CT_LOW | CT_HEX, CT_LOW | CT_HEX, CT_LOW | CT_HEX, /* '`' */ CT_PUN, CT_LOW | CT_HEX, CT_LOW | CT_HEX,
CT_LOW | CT_HEX,
CT_LOW | CT_HEX, CT_LOW | CT_HEX, CT_LOW | CT_HEX, CT_LOW, CT_LOW | CT_HEX, CT_LOW | CT_HEX, CT_LOW | CT_HEX, CT_LOW,
/* h' */ CT_LOW, CT_LOW, CT_LOW, CT_LOW, /* h' */ CT_LOW, CT_LOW, CT_LOW, CT_LOW,
CT_LOW, CT_LOW, CT_LOW, CT_LOW, CT_LOW, CT_LOW, CT_LOW, CT_LOW,

View File

@ -17,7 +17,8 @@ static capabilities vesacapabilities[] = {
/*******************************************************************************/ /*******************************************************************************/
/* Deplace l'adresse virtuelle en mode paginee */ /* Deplace l'adresse virtuelle en mode paginee */
void VESA_remap_memory(u32 vaddr) { void VESA_remap_memory(u32 vaddr)
{
struct multiboot_tag_framebuffer *tagfb = getgrubinfo_fb(); struct multiboot_tag_framebuffer *tagfb = getgrubinfo_fb();
u32 len = infos.pagesize * 2; u32 len = infos.pagesize * 2;
u32 paddr = tagfb->common.framebuffer_addr; u32 paddr = tagfb->common.framebuffer_addr;
@ -28,19 +29,24 @@ void VESA_remap_memory(u32 vaddr) {
/*******************************************************************************/ /*******************************************************************************/
/* Detecte si le hardware est disponible, return NULL ou pointeur sur le type de pilote */ /* Detecte si le hardware est disponible, return NULL ou pointeur sur le type de pilote */
u8 *VESA_detect_hardware(void) { u8 *VESA_detect_hardware(void)
{
struct multiboot_tag_framebuffer *tagfb = getgrubinfo_fb(); struct multiboot_tag_framebuffer *tagfb = getgrubinfo_fb();
switch (tagfb->common.framebuffer_type) switch (tagfb->common.framebuffer_type)
{ {
case MULTIBOOT_FRAMEBUFFER_TYPE_RGB: case MULTIBOOT_FRAMEBUFFER_TYPE_RGB:
vesacapabilities[0].modenumber = 0x0; vesacapabilities[0].modenumber = 0x0;
vesacapabilities[0].width=tagfb->common.framebuffer_width; vesacapabilities[0].width =
vesacapabilities[0].height=tagfb->common.framebuffer_height; tagfb->common.framebuffer_width;
vesacapabilities[0].height =
tagfb->common.framebuffer_height;
vesacapabilities[0].graphic = true; vesacapabilities[0].graphic = true;
vesacapabilities[0].depth=tagfb->common.framebuffer_bpp; vesacapabilities[0].depth =
tagfb->common.framebuffer_bpp;
vesacapabilities[0].refresh = 0x0; vesacapabilities[0].refresh = 0x0;
infos.baseaddress = tagfb->common.framebuffer_addr; infos.baseaddress = tagfb->common.framebuffer_addr;
infos.currentpitch=tagfb->common.framebuffer_pitch; infos.currentpitch =
tagfb->common.framebuffer_pitch;
return "LEGACY"; return "LEGACY";
break; break;
default: default:
@ -60,7 +66,8 @@ static u8 realsize;
u8 VESA_setvideo_mode(u8 mode) u8 VESA_setvideo_mode(u8 mode)
{ {
if (mode>0) return 1; if (mode > 0)
return 1;
infos.currentmode = mode; infos.currentmode = mode;
infos.currentwidth = vesacapabilities[0].width; infos.currentwidth = vesacapabilities[0].width;
infos.currentheight = vesacapabilities[0].height; infos.currentheight = vesacapabilities[0].height;
@ -81,28 +88,35 @@ u8 VESA_setvideo_mode(u8 mode)
/*******************************************************************************/ /*******************************************************************************/
/* Renvoie le nom du driver */ /* Renvoie le nom du driver */
u8 *VESA_getvideo_drivername (void) { u8 *VESA_getvideo_drivername(void)
{
return "VESA"; return "VESA";
} }
/*******************************************************************************/ /*******************************************************************************/
/* Renvoie un pointeur sur la structure des capacités graphiques */ /* Renvoie un pointeur sur la structure des capacités graphiques */
u8 *VESA_getvideo_capabilities (void) { u8 *VESA_getvideo_capabilities(void)
{
return vesacapabilities; return vesacapabilities;
} }
/*******************************************************************************/ /*******************************************************************************/
/* Renvoie un pointeur sur l'état courant de la carte */ /* Renvoie un pointeur sur l'état courant de la carte */
videoinfos *VESA_getvideo_info (void) { videoinfos *VESA_getvideo_info(void)
{
return &infos; return &infos;
} }
/*******************************************************************************/ /*******************************************************************************/
/* Effecture un mouvement de la mémoire centrale vers la mémoire video (linéarisée) */ /* Effecture un mouvement de la mémoire centrale vers la mémoire video (linéarisée) */
u32 VESA_mem_to_video (void *src,u32 dst, u32 size, bool increment_src) { u32 VESA_mem_to_video(void *src, u32 dst, u32 size, bool increment_src)
u32 realdst=infos.baseaddress + infos.currentactivepage * infos.pagesize+dst; {
switch (infos.currentdepth) { u32 realdst =
infos.baseaddress +
infos.currentactivepage * infos.pagesize + dst;
switch (infos.currentdepth)
{
case 32: case 32:
if (!increment_src) if (!increment_src)
{ {
@ -128,9 +142,14 @@ u32 VESA_video_to_mem (u32 src,void *dst, u32 size)
/* Effecture un mouvement de la mémoire video (linéarisé) vers la mémoire vidéo (linéarisée) */ /* Effecture un mouvement de la mémoire video (linéarisé) vers la mémoire vidéo (linéarisée) */
u32 VESA_video_to_video(u32 src, u32 dst, u32 size) u32 VESA_video_to_video(u32 src, u32 dst, u32 size)
{ {
u32 realsrc=infos.baseaddress + infos.currentactivepage * infos.pagesize+src; u32 realsrc =
u32 realdst=infos.baseaddress + infos.currentactivepage * infos.pagesize+dst; infos.baseaddress +
switch (infos.currentdepth) { infos.currentactivepage * infos.pagesize + src;
u32 realdst =
infos.baseaddress +
infos.currentactivepage * infos.pagesize + dst;
switch (infos.currentdepth)
{
case 32: case 32:
movsd(realsrc, realdst, size >> 2); movsd(realsrc, realdst, size >> 2);
break; break;
@ -176,4 +195,3 @@ void VESA_wait_hretrace(void)
{ {
while ((inb(STATE) & 1) == 0); while ((inb(STATE) & 1) == 0);
} }

136
lib/vga.c
View File

@ -13,13 +13,16 @@ static videoinfos infos;
/*******************************************************************************/ /*******************************************************************************/
/* Deplace l'adresse virtuelle en mode paginee */ /* Deplace l'adresse virtuelle en mode paginee */
void VGA_remap_memory(u32 vaddr) { void VGA_remap_memory(u32 vaddr)
virtual_range_use_kernel(vaddr, GRPHSCREEN, ENDOFVMEM-GRPHSCREEN, PAGE_NOFLAG); {
virtual_range_use_kernel(vaddr, GRPHSCREEN, ENDOFVMEM - GRPHSCREEN,
PAGE_NOFLAG);
} }
/*******************************************************************************/ /*******************************************************************************/
/* Detecte si le hardware est disponible, return NULL ou pointeur sur le type de pilote */ /* Detecte si le hardware est disponible, return NULL ou pointeur sur le type de pilote */
u8 *VGA_detect_hardware(void) { u8 *VGA_detect_hardware(void)
{
return "LEGACY"; return "LEGACY";
} }
@ -33,7 +36,8 @@ u32 getbase(void)
base = inb(GRAPHICS + 1); base = inb(GRAPHICS + 1);
base >>= 2; base >>= 2;
base &= 3; base &= 3;
switch (base) { switch (base)
{
case 0: case 0:
case 1: case 1:
base = 0xA0000; base = 0xA0000;
@ -58,9 +62,12 @@ static u8 realsize;
u8 VGA_setvideo_mode(u8 mode) u8 VGA_setvideo_mode(u8 mode)
{ {
u32 index = 0; u32 index = 0;
while(vgacapabilities[index].modenumber!=0xFF) { while (vgacapabilities[index].modenumber != 0xFF)
if (vgacapabilities[index].modenumber==mode) { {
infos.currentmode=vgacapabilities[index].modenumber; if (vgacapabilities[index].modenumber == mode)
{
infos.currentmode =
vgacapabilities[index].modenumber;
break; break;
} }
index++; index++;
@ -79,8 +86,10 @@ u8 VGA_setvideo_mode(u8 mode)
infos.isgraphic = vgacapabilities[index].graphic; infos.isgraphic = vgacapabilities[index].graphic;
infos.isblinking = false; infos.isblinking = false;
infos.iscursorvisible = false; infos.iscursorvisible = false;
if (infos.isgraphic) { if (infos.isgraphic)
switch (infos.currentdepth) { {
switch (infos.currentdepth)
{
case 1: case 1:
/* mode N&B */ /* mode N&B */
infos.currentpitch = infos.currentwidth; infos.currentpitch = infos.currentwidth;
@ -88,7 +97,8 @@ u8 VGA_setvideo_mode(u8 mode)
break; break;
case 2: case 2:
/* mode 4 couleurs */ /* mode 4 couleurs */
infos.currentpitch = (infos.currentwidth << 1); infos.currentpitch =
(infos.currentwidth << 1);
realsize = 2; realsize = 2;
break; break;
case 4: case 4:
@ -98,13 +108,19 @@ u8 VGA_setvideo_mode(u8 mode)
break; break;
case 8: case 8:
/* mode 256 couleurs */ /* mode 256 couleurs */
if (modes[index].sequencer.Sequencer_Memory_Mode_Register == 0x0E) { if (modes[index].sequencer.
Sequencer_Memory_Mode_Register == 0x0E)
{
/* mode chainé (plus rapide mais limité en mémoire) */ /* mode chainé (plus rapide mais limité en mémoire) */
infos.currentpitch = infos.currentwidth; infos.currentpitch =
infos.currentwidth;
realsize = 8; realsize = 8;
} else { }
else
{
/* mode non chainé */ /* mode non chainé */
infos.currentpitch = infos.currentwidth >> 2; infos.currentpitch =
infos.currentwidth >> 2;
realsize = 9; realsize = 9;
} }
break; break;
@ -113,13 +129,16 @@ u8 VGA_setvideo_mode(u8 mode)
} }
infos.pagesize = infos.currentheight * infos.currentpitch; infos.pagesize = infos.currentheight * infos.currentpitch;
} }
else { else
{
infos.currentpitch = infos.currentwidth * 2; infos.currentpitch = infos.currentwidth * 2;
infos.pagesize = infos.currentheight * infos.currentpitch; infos.pagesize = infos.currentheight * infos.currentpitch;
realsize = 0; realsize = 0;
} }
infos.pagesnumber = (PLANESIZE / infos.pagesize); infos.pagesnumber = (PLANESIZE / infos.pagesize);
infos.baseaddress=(modes[index].ctrc.Cursor_Location_High_Register << 8) + modes[index].ctrc.Cursor_Location_Low_Register + getbase(); infos.baseaddress =
(modes[index].ctrc.Cursor_Location_High_Register << 8) +
modes[index].ctrc.Cursor_Location_Low_Register + getbase();
/* Initialise les registre "divers" */ /* Initialise les registre "divers" */
outb(MISC_WRITE, modes[index].misc); outb(MISC_WRITE, modes[index].misc);
/* Initialise les registre d'etat */ /* Initialise les registre d'etat */
@ -145,27 +164,33 @@ u8 VGA_setvideo_mode(u8 mode)
/*******************************************************************************/ /*******************************************************************************/
/* Renvoie le nom du driver */ /* Renvoie le nom du driver */
u8 *VGA_getvideo_drivername (void) { u8 *VGA_getvideo_drivername(void)
{
return "VGA"; return "VGA";
} }
/*******************************************************************************/ /*******************************************************************************/
/* Renvoie un pointeur sur la structure des capacités graphiques */ /* Renvoie un pointeur sur la structure des capacités graphiques */
u8 *VGA_getvideo_capabilities (void) { u8 *VGA_getvideo_capabilities(void)
{
return vgacapabilities; return vgacapabilities;
} }
/*******************************************************************************/ /*******************************************************************************/
/* Renvoie un pointeur sur l'état courant de la carte */ /* Renvoie un pointeur sur l'état courant de la carte */
videoinfos *VGA_getvideo_info (void) { videoinfos *VGA_getvideo_info(void)
{
return &infos; return &infos;
} }
/*******************************************************************************/ /*******************************************************************************/
/* Effecture un mouvement de la mémoire centrale vers la mémoire video (linéarisée) */ /* Effecture un mouvement de la mémoire centrale vers la mémoire video (linéarisée) */
u32 VGA_mem_to_video (void *src,u32 dst, u32 size, bool increment_src) { u32 VGA_mem_to_video(void *src, u32 dst, u32 size, bool increment_src)
u32 realdst=infos.baseaddress + infos.currentactivepage * infos.pagesize+dst; {
u32 realdst =
infos.baseaddress +
infos.currentactivepage * infos.pagesize + dst;
switch (realsize) switch (realsize)
{ {
case 0: case 0:
@ -194,13 +219,17 @@ u32 VGA_mem_to_video (void *src,u32 dst, u32 size, bool increment_src) {
u8 tmp = (u8) (src); u8 tmp = (u8) (src);
if (size % 4 == 0) if (size % 4 == 0)
{ {
u32 pattern = tmp + (tmp<<8) + (tmp<<16) + (tmp<<24); u32 pattern =
stosd(pattern,realdst,(size>>2)); tmp + (tmp << 8) +
(tmp << 16) + (tmp << 24);
stosd(pattern, realdst,
(size >> 2));
} }
else if (size % 2 == 0) else if (size % 2 == 0)
{ {
u32 pattern = tmp + (tmp << 8); u32 pattern = tmp + (tmp << 8);
stosw(pattern,realdst,(size>>1)); stosw(pattern, realdst,
(size >> 1));
} }
else else
{ {
@ -208,7 +237,8 @@ u32 VGA_mem_to_video (void *src,u32 dst, u32 size, bool increment_src) {
stosb(pattern, realdst, size); stosb(pattern, realdst, size);
} }
} }
else { else
{
if (size % 4 == 0) if (size % 4 == 0)
{ {
movsd(src, realdst, size >> 2); movsd(src, realdst, size >> 2);
@ -235,7 +265,9 @@ u32 VGA_mem_to_video (void *src,u32 dst, u32 size, bool increment_src) {
/* Effecture un mouvement de la mémoire video (linéarisée) vers la mémoire centrale*/ /* Effecture un mouvement de la mémoire video (linéarisée) vers la mémoire centrale*/
u32 VGA_video_to_mem(u32 src, void *dst, u32 size) u32 VGA_video_to_mem(u32 src, void *dst, u32 size)
{ {
u32 realsrc=infos.baseaddress + infos.currentactivepage * infos.pagesize+src; u32 realsrc =
infos.baseaddress +
infos.currentactivepage * infos.pagesize + src;
switch (realsize) switch (realsize)
{ {
case 0: case 0:
@ -265,7 +297,9 @@ u32 VGA_video_to_mem (u32 src,void *dst, u32 size)
/* Effecture un mouvement de la mémoire video (linéarisé) vers la mémoire vidéo (linéarisée) */ /* Effecture un mouvement de la mémoire video (linéarisé) vers la mémoire vidéo (linéarisée) */
u32 VGA_video_to_video(u32 src, u32 dst, u32 size) u32 VGA_video_to_video(u32 src, u32 dst, u32 size)
{ {
u32 base=infos.baseaddress + infos.currentactivepage * infos.pagesize; u32 base =
infos.baseaddress +
infos.currentactivepage * infos.pagesize;
u32 realsrc = base + src; u32 realsrc = base + src;
u32 realdst = base + dst; u32 realdst = base + dst;
switch (realsize) switch (realsize)
@ -316,7 +350,8 @@ void VGA_page_set(u8 page)
void VGA_page_show(u8 page) void VGA_page_show(u8 page)
{ {
if (page < infos.pagesnumber) { if (page < infos.pagesnumber)
{
u16 addr; u16 addr;
addr = page * infos.pagesize / 2; addr = page * infos.pagesize / 2;
outb(CCRT, 0x0C); outb(CCRT, 0x0C);
@ -334,7 +369,8 @@ static splitY=0;
void VGA_page_split(u16 y) void VGA_page_split(u16 y)
{ {
if (y!=0) { if (y != 0)
{
u16 addr; u16 addr;
if (!infos.isgraphic) if (!infos.isgraphic)
addr = (y << 3); addr = (y << 3);
@ -393,7 +429,8 @@ void VGA_wait_hretrace(void)
void VGA_cursor_enable(void) void VGA_cursor_enable(void)
{ {
if (!infos.isgraphic) { if (!infos.isgraphic)
{
u8 curs; u8 curs;
/* active le curseur hardware */ /* active le curseur hardware */
outb(CCRT, 10); outb(CCRT, 10);
@ -408,7 +445,8 @@ void VGA_cursor_enable(void)
void VGA_cursor_disable(void) void VGA_cursor_disable(void)
{ {
if (!infos.isgraphic) { if (!infos.isgraphic)
{
u8 curs; u8 curs;
/* Desactive le curseur hardware */ /* Desactive le curseur hardware */
outb(CCRT, 10); outb(CCRT, 10);
@ -439,10 +477,12 @@ void useplane(u8 plan)
void VGA_cursor_set(u16 x, u16 y) void VGA_cursor_set(u16 x, u16 y)
{ {
if (!infos.isgraphic) { if (!infos.isgraphic)
{
u16 pos; u16 pos;
if (splitY == 0) if (splitY == 0)
pos = (infos.currentshowedpage * infos.pagesize / 2 + x + y * infos.currentwidth); pos = (infos.currentshowedpage * infos.pagesize /
2 + x + y * infos.currentwidth);
else else
pos = (x + y * infos.currentwidth); pos = (x + y * infos.currentwidth);
outb(CCRT, 0x0F); outb(CCRT, 0x0F);
@ -470,7 +510,8 @@ u32 VGA_font_load(u8 * def, u8 size, u8 font)
if (font < 4) if (font < 4)
base = (u8 *) (getbase() + (font << 14)); base = (u8 *) (getbase() + (font << 14));
else else
base = (u8 *) (getbase() + ((((font - 4) << 1) + 1) << 13)); base = (u8 *) (getbase() +
((((font - 4) << 1) + 1) << 13));
/* sauve les anciens registres */ /* sauve les anciens registres */
outb(SEQUENCER, 2); outb(SEQUENCER, 2);
oldregs[0] = inb(SEQUENCER + 1); oldregs[0] = inb(SEQUENCER + 1);
@ -490,7 +531,8 @@ u32 VGA_font_load(u8 * def, u8 size, u8 font)
outb(GRAPHICS + 1, oldregs[4] & ~0x02); outb(GRAPHICS + 1, oldregs[4] & ~0x02);
/* utilisation du plan N°2 */ /* utilisation du plan N°2 */
useplane(2); useplane(2);
for (i = 0; i < 256; i++) { for (i = 0; i < 256; i++)
{
memcpy(def, base + i * 32, size, 1); memcpy(def, base + i * 32, size, 1);
def += size; def += size;
} }
@ -512,7 +554,8 @@ u32 VGA_font_load(u8 * def, u8 size, u8 font)
void VGA_font1_set(u8 num) void VGA_font1_set(u8 num)
{ {
if (!infos.isgraphic) { if (!infos.isgraphic)
{
num &= 0x07; num &= 0x07;
outb(SEQUENCER, 3); outb(SEQUENCER, 3);
outb(SEQUENCER + 1, outb(SEQUENCER + 1,
@ -527,7 +570,8 @@ void VGA_font1_set(u8 num)
void VGA_font2_set(u8 num) void VGA_font2_set(u8 num)
{ {
if (!infos.isgraphic) { if (!infos.isgraphic)
{
num &= 0x07; num &= 0x07;
outb(SEQUENCER, 3); outb(SEQUENCER, 3);
outb(SEQUENCER + 1, outb(SEQUENCER + 1,
@ -542,7 +586,8 @@ void VGA_font2_set(u8 num)
void VGA_blink_enable(void) void VGA_blink_enable(void)
{ {
if (!infos.isgraphic) { if (!infos.isgraphic)
{
outb(CCRT, 0x10); outb(CCRT, 0x10);
outb(CCRT + 1, (inb(SEQUENCER + 1) | 0x04)); outb(CCRT + 1, (inb(SEQUENCER + 1) | 0x04));
infos.isblinking = true; infos.isblinking = true;
@ -554,7 +599,8 @@ void VGA_blink_enable(void)
void VGA_blink_disable(void) void VGA_blink_disable(void)
{ {
if (!infos.isgraphic) { if (!infos.isgraphic)
{
outb(CCRT, 0x10); outb(CCRT, 0x10);
outb(CCRT + 1, (inb(SEQUENCER + 1) & ~0x04)); outb(CCRT + 1, (inb(SEQUENCER + 1) & ~0x04));
infos.isblinking = false; infos.isblinking = false;
@ -568,7 +614,8 @@ vers le registre sp
void outreg(u16 port, u8 * src, u16 num) void outreg(u16 port, u8 * src, u16 num)
{ {
int i; int i;
for (i = 0; i < num; i++) { for (i = 0; i < num; i++)
{
outb(port, i); outb(port, i);
outb(port + 1, *src++); outb(port + 1, *src++);
} }
@ -581,7 +628,8 @@ vers le registre sp
void outregsame(u16 port, u8 * src, u16 num) void outregsame(u16 port, u8 * src, u16 num)
{ {
int i; int i;
for (i = 0; i < num; i++) { for (i = 0; i < num; i++)
{
inb(port); inb(port);
outb(port, i); outb(port, i);
outb(port, *src++); outb(port, *src++);
@ -595,7 +643,8 @@ vers portion de m
void inreg(u16 port, u8 * src, u16 num) void inreg(u16 port, u8 * src, u16 num)
{ {
int i; int i;
for (i = 0; i < num; i++) { for (i = 0; i < num; i++)
{
outb(port, i); outb(port, i);
*src++ = inb(port + 1); *src++ = inb(port + 1);
} }
@ -608,7 +657,8 @@ vers portion de m
void inregsame(u16 port, u8 * src, u16 num) void inregsame(u16 port, u8 * src, u16 num)
{ {
int i; int i;
for (i = 0; i < num; i++) { for (i = 0; i < num; i++)
{
inb(port); inb(port);
outb(port, i); outb(port, i);
*src++ = inb(port); *src++ = inb(port);

File diff suppressed because it is too large Load Diff

View File

@ -19,7 +19,7 @@ harddisk: final/harddisk.img.final
uefi: final/harddiskuefi.img.final uefi: final/harddiskuefi.img.final
install: install:
(sudo apt-get install nasm gcc qemu fusefat fuseext2 cgdb ovmf bsdmainutils tar bsdmainutils indent binutils bochs bochs-x bochsbios) (sudo apt-get install nasm gcc qemu fusefat fuseext2 cgdb ovmf bsdmainutils tar bsdmainutils indent binutils bochs bochs-x bochsbios dos2unix)
togit: togit:
make -C system togit make -C system togit

View File

@ -41,4 +41,3 @@
1:" : "=a" (_v) : "a" (syscall), "b" (arg1), "S" (arg2), "D" (arg3) : "ecx","edx","memory"); \ 1:" : "=a" (_v) : "a" (syscall), "b" (arg1), "S" (arg2), "D" (arg3) : "ecx","edx","memory"); \
_v; \ _v; \
}) })

View File

@ -46,7 +46,8 @@ void error()
int main(u32 magic, u32 addr) int main(u32 magic, u32 addr)
{ {
cli(); cli();
if (magic == MULTIBOOT2_BOOTLOADER_MAGIC) initmultiboot(addr); if (magic == MULTIBOOT2_BOOTLOADER_MAGIC)
initmultiboot(addr);
initdriver(); initdriver();
registerdriver(&vgafonctions); registerdriver(&vgafonctions);
registerdriver(&vesafonctions); registerdriver(&vesafonctions);
@ -83,17 +84,20 @@ int main(u32 magic, u32 addr)
ok(); ok();
print(" -Installation du handler timer (IRQ 0)"); print(" -Installation du handler timer (IRQ 0)");
setidt((u32) timer, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 32); setidt((u32) timer, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 32);
enableirq(0); enableirq(0);
ok(); ok();
print(" -Installation du handler clavier (IRQ 1)"); print(" -Installation du handler clavier (IRQ 1)");
setidt((u32) keyboard, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 33); setidt((u32) keyboard, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 33);
enableirq(1); enableirq(1);
ok(); ok();
print(" -Installation du handler souris (IRQ12+Cascade IRQ2)"); print(" -Installation du handler souris (IRQ12+Cascade IRQ2)");
setidt((u32) mouse, SEL_KERNEL_CODE, ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 100); setidt((u32) mouse, SEL_KERNEL_CODE,
ENTRY_PRESENT | ENTRY_RING0 | INTGATE, 100);
enableirq(2); enableirq(2);
enableirq(12); enableirq(12);
if (initmouse() != 1) if (initmouse() != 1)