diff --git a/include/2d.h b/include/2d.h index 7a2d3d7..235988f 100755 --- a/include/2d.h +++ b/include/2d.h @@ -1,3 +1,13 @@ #include "types.h" +typedef struct vertex2d{ + u32 x; + u32 y; +} vertex2d __attribute__ ((packed)); + + void line(u32 x1, u32 y1, u32 x2, u32 y2, u8 color); +void linev(vertex2d *A, vertex2d *B, u8 color); +void hline(u32 x1, u32 x2, u32 y, u8 color); +void trianglefilled(vertex2d *A, vertex2d *B, vertex2d *C, u8 color); +void triangle(vertex2d *A, vertex2d *B, vertex2d *C, u8 color); diff --git a/include/math.h b/include/math.h index 661e588..183f955 100755 --- a/include/math.h +++ b/include/math.h @@ -1,3 +1,6 @@ #define sgn(x) ((x<0)?-1:((x>0)?1:0)); u32 abs(int x); +random(u32 lower, u32 upper); +u32 rand(); +void randomize(); diff --git a/lib/2d.c b/lib/2d.c index 36576f5..42ed92e 100755 --- a/lib/2d.c +++ b/lib/2d.c @@ -8,6 +8,11 @@ /* Affiche une ligne entre les points spécifiés */ +void linev(vertex2d *A, vertex2d *B, u8 color) +{ + line(A->x,A->y,B->x,B->y,color); +} + void line(u32 x1, u32 y1, u32 x2, u32 y2, u8 color) { s32 dx, dy, sdx, sdy; @@ -49,3 +54,91 @@ void line(u32 x1, u32 y1, u32 x2, u32 y2, u8 color) } } } + +/******************************************************************************/ + +/* Affiche une ligne horizontale entre les points spécifiés */ + +void hline(u32 x1, u32 x2, u32 y, u8 color) { + if (x2>x1) + for(;x1<=x2;x1++) + writepxl(x1, y, color); + else + for(;x2<=x1;x2++) + writepxl(x2, y, color); +} + +/******************************************************************************/ + +/* Affiche un triangle rempli entre les points spécifiés */ + +void trianglefilled(vertex2d *AA, vertex2d *BB, vertex2d *CC, u8 color) { + vertex2d *A,*B,*C; + u32 a, b, y, last; + int dx1, dx2, dx3, dy1, dy2, dy3 , sa, sb; + A=AA; + B=BB; + C=CC; + if (AA->y > BB->y) { + A=BB; + B=AA; + } + if (BB->y > CC->y) { + C=BB; + B=CC; + } + if (AA->y > CC->y) { + C=AA; + A=CC; + } + if(A->y == C->y) { //meme ligne + a = b = A->x; + if(B->x < a) a = B->x; + else if(B->x > b) b = B->x; + if(C->x < a) a = C->x; + else if(C->x > b) b = C->x; + hline(a, b, A->y, color); + return; + } + dx1 = B->x - A->x; + dy1 = B->y - A->y; + dx2 = C->x - A->x; + dy2 = C->y - A->y; + dx3 = C->x - B->x; + dy3 = C->y - B->y; + sa = 0; + sb = 0; + + if(B->y == C->y) + last = B->y; + else + last = B->y-1; + + for(y=A->y; y<=last; y++) { + a = A->x + sa / dy1; + b = A->x + sb / dy2; + sa += dx1; + sb += dx2; + hline(a, b, y, color); + } + + sa = dx3 * (y - B->y); + sb = dx2 * (y - A->y); + for(; y<=C->y; y++) { + a = B->x + sa / dy3; + b = A->x + sb / dy2; + sa += dx3; + sb += dx2; + hline(a, b, y, color); + } +} + +/******************************************************************************/ + +/* Affiche un triangle entre les points spécifiés */ + +void triangle(vertex2d *AA, vertex2d *BB, vertex2d *CC, u8 color) { + line(AA->x,AA->y,BB->x,BB->y,color); + line(BB->x,BB->y,CC->x,CC->y,color); + line(CC->x,CC->y,AA->x,AA->y,color); +} diff --git a/lib/math.c b/lib/math.c index 02bda38..348b8d8 100755 --- a/lib/math.c +++ b/lib/math.c @@ -1,4 +1,5 @@ #include "types.h" +#include "timer.h" /******************************************************************************/ @@ -10,3 +11,48 @@ u32 abs(int x) { return (u32) x; } +/******************************************************************************/ + +/* Fonction qui initialise le générateur de nombre aléatoire */ + +static u32 seed=0x12341234; + +void randomize() { + seed=gettimer(); +} + +/******************************************************************************/ + +/* Fonction qui renvoie un nombre aléatoire */ + +u32 rand() +{ + u32 next = seed; + int result; + + next *= 1103515245; + next += 12345; + result = (unsigned int) (next / 65536) % 2048; + + next *= 1103515245; + next += 12345; + result <<= 10; + result ^= (unsigned int) (next / 65536) % 1024; + + next *= 1103515245; + next += 12345; + result <<= 10; + result ^= (unsigned int) (next / 65536) % 1024; + + seed = next; + + return result; +} + +/******************************************************************************/ + +/* Fonction qui renvoie un nombre aléatoire borné */ + +u32 random(u32 lower, u32 upper) { + return (rand() % (upper - lower + 1)) + lower; +} diff --git a/lib/timer.c b/lib/timer.c index ff9e218..7d274ff 100755 --- a/lib/timer.c +++ b/lib/timer.c @@ -9,6 +9,16 @@ static u8 curs[4] = { "-\\|/" }; static u8 curspos = 0; +static u32 time = 0; + +/******************************************************************************/ + +/* Récupère la valeur du timer */ + +u32 gettimer() { + return time; +} + /******************************************************************************/ /* Handler d'interruption de la souris IRQ 0 */ @@ -20,6 +30,7 @@ void timer() pushad(); showchar(0, 0, curs[curspos], 7); curspos = (curspos + 1) & 0x3; + time++; irqendmaster(); popad(); popf(); diff --git a/system/system.c b/system/system.c index 73a198a..a77660b 100755 --- a/system/system.c +++ b/system/system.c @@ -7,11 +7,9 @@ #include "asm.h" #include "cpu.h" #include "string.h" - +#include "2d.h" #include "ansi.c" -static cpuinfo cpu; -static u8 noproc[] = "\033[31mInconnu\033[0m\000"; static u8 warnmsg[] = "\033[99C\033[8D\033[37m\033[1m[ \033[36mNON\033[37m ]\033[0m\000"; static u8 okmsg[] = @@ -71,20 +69,13 @@ int main(void) warning(); else ok(); - - strcpy(&noproc, &cpu.detectedname); - getcpuinfos(&cpu); - - - printf - (" -Detection 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\000", - cpu.stepping, cpu.models, cpu.family, &cpu.detectedname, - - &cpu.techs); - ok(); - static u8 field[]=" \000"; + static u8 field[]=" \000"; static u8 item[]=" \000"; static u8 cmd_reboot[]="REBOOT\000"; + static u8 cmd_mode[]="MODE\000"; + static u8 cmd_clear[]="CLEAR\000"; + static u8 cmd_detectcpu[]="DETECTCPU\000"; + static u8 cmd_test2d[]="TEST2D\000"; while (true) { print("\r\n# "); getstring(&field); @@ -92,6 +83,36 @@ int main(void) strgetitem(&field, &item, ' ', 0); strtoupper(&item); if (strcmp(&item,&cmd_reboot)==0) reboot(); + if (strcmp(&item,&cmd_mode)==0) setvmode(0x84); + if (strcmp(&item,&cmd_clear)==0) fill(0x00); + if (strcmp(&item,&cmd_detectcpu)==0) detectcpu(); + if (strcmp(&item,&cmd_test2d)==0) test2d(); } - +} + +void test2d() { + setvmode(0x84); + fill(0x00); + struct vertex2d a,b,c; + randomize(); + for(int i=0;i<100;i++) + { + a.x=random(0, 800); + a.y=random(0, 600); + b.x=random(0, 800); + b.y=random(0, 600); + c.x=random(0, 800); + c.y=random(0, 600); + trianglefilled(&a,&b,&c,random(0, 16)); + triangle(&a,&b,&c,2); + } +} + +void detectcpu() +{ + cpuinfo cpu; + u8 noproc[] = "\033[31mInconnu\033[0m\000"; + strcpy(&noproc, &cpu.detectedname); + getcpuinfos(&cpu); + 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); }