Changeset 4159
- Timestamp:
- 12/20/09 16:41:41 (3 years ago)
- Location:
- libcaca/trunk
- Files:
-
- 8 edited
-
build-kernel (modified) (1 diff)
-
kernel/drivers/processor.c (modified) (3 diffs)
-
kernel/drivers/processor.h (modified) (1 diff)
-
kernel/drivers/timer.c (modified) (2 diffs)
-
kernel/kernel.c (modified) (2 diffs)
-
kernel/kernel.h (modified) (1 diff)
-
kernel/klibc.c (modified) (29 diffs)
-
kernel/klibc.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcaca/trunk/build-kernel
r4155 r4159 10 10 LDFLAGS="-nostdlib -Wl,-N -Wl,-Ttext -Wl,100000" 11 11 12 ./configure --disable-slang --disable-ncurses --disable-win32 \13 --disable-conio --disable-x11 --disable-gl --disable-network \14 --enable-vga --disable-imlib2 --disable-doc \15 --host i38612 #./configure --disable-slang --disable-ncurses --disable-win32 \ 13 # --disable-conio --disable-x11 --disable-gl --disable-network \ 14 # --enable-vga --disable-imlib2 --disable-doc \ 15 # --host i386 16 16 17 17 # Compile cacademo, leave it as an object -
libcaca/trunk/kernel/drivers/processor.c
r4158 r4159 17 17 #include "kernel.h" 18 18 #include "klibc.h" 19 #include "drivers/timer.h" 19 20 #include "processor.h" 20 21 … … 50 51 processor_info->features = a; 51 52 53 processor_info->frequency = 0; 54 processor_info->frequency = processor_get_frequency(processor_info); 55 52 56 return 0; 57 } 58 59 u32 processor_get_frequency(struct processor_info * processor_info) 60 { 61 if (processor_info->frequency) 62 return processor_info->frequency; 63 u64 srdtsc64, erdtsc64; 64 u32 srdtsc_l, srdtsc_h; 65 u32 erdtsc_l, erdtsc_h; 66 67 rdtsc(srdtsc_l, srdtsc_h); /* Get RDTSC */ 68 sleep(2); /* Sleep for 2 seconds */ 69 rdtsc(erdtsc_l, erdtsc_h); /* Get RDTSC again */ 70 71 srdtsc64 = srdtsc_h; 72 srdtsc64 <<= 32; 73 srdtsc64 |= srdtsc_l; 74 erdtsc64 = erdtsc_h; 75 erdtsc64 <<= 32; 76 erdtsc64 |= erdtsc_l; 77 78 79 u32 diff = erdtsc64 - srdtsc64; /* Cycle count for 2 seconds */ 80 diff /= 2; /* Divide by 2 to get cycles per sec */ 81 return diff; 53 82 } 54 83 … … 57 86 printf("CPU%d\n", processor_info->id); 58 87 printf("Vendor ID : %s\n", processor_info->vendor); 88 if (processor_info->frequency > 1000000000) 89 { 90 printf("Frequency : ~%dGhz (or something like that)\n", 91 processor_info->frequency / 1000000000); 92 } 93 else if (processor_info->frequency > 1000000) 94 { 95 printf("Frequency : ~%dMhz (or something like that)\n", 96 processor_info->frequency / 1000000); 97 } 98 else if (processor_info->frequency > 1000) 99 { 100 printf("Frequency : ~%dKhz (or something like that)\n", 101 processor_info->frequency / 1000); 102 } 103 else 104 { 105 printf("Frequency : ~%dhz (you must be running Bochs)\n", 106 processor_info->frequency); 107 } 59 108 printf("Features : 0x%x\n", processor_info->features); 60 109 } -
libcaca/trunk/kernel/drivers/processor.h
r4158 r4159 93 93 char vendor[13]; 94 94 unsigned int features; 95 u32 frequency; 95 96 }; 96 97 97 98 98 99 int processor_get_info(struct processor_info *processor_info); 100 u32 processor_get_frequency(struct processor_info *processor_info); 99 101 void processor_print_info(struct processor_info *processor_info); -
libcaca/trunk/kernel/drivers/timer.c
r4158 r4159 1 /* 1 /* 2 2 * libcaca 3 3 * libcaca Colour ASCII-Art library … … 23 23 void timer_phase(int hz) 24 24 { 25 unsigned int divisor = 1193180 / hz; /* Calculate our divisor */ 26 /* 27 0x43 is the Mode/Command register 28 29 From 30 http://wiki.osdev.org/Programmable_Interval_Timer#Read_Back_Status_Byte 31 : Bits Usage 6 and 7 Select channel : 0 0 = Channel 0 0 1 = Channel 1 32 1 0 = Channel 2 1 1 = Read-back command (8254 only) 4 and 5 Access mode 33 : 0 0 = Latch count value command 0 1 = Access mode: lobyte only 1 0 = 34 Access mode: hibyte only 1 1 = Access mode: lobyte/hibyte 1 to 3 35 Operating mode : 0 0 0 = Mode 0 (interrupt on terminal count) 0 0 1 = 36 Mode 1 (hardware re-triggerable one-shot) 0 1 0 = Mode 2 (rate 37 generator) 0 1 1 = Mode 3 (square wave generator) 1 0 0 = Mode 4 38 (software triggered strobe) 1 0 1 = Mode 5 (hardware triggered strobe) 39 1 1 0 = Mode 2 (rate generator, same as 010b) 1 1 1 = Mode 3 (square 40 wave generator, same as 011b) 0 BCD/Binary mode: 0 = 16-bit binary, 1 = 41 four-digit BCD 42 25 unsigned int divisor = 1193180 / hz; /* Calculate our divisor */ 26 /* 27 0x43 is the Mode/Command register 28 29 From http://wiki.osdev.org/Programmable_Interval_Timer#Read_Back_Status_Byte : 30 Bits Usage 31 6 and 7 Select channel : 32 0 0 = Channel 0 33 0 1 = Channel 1 34 1 0 = Channel 2 35 1 1 = Read-back command (8254 only) 36 4 and 5 Access mode : 37 0 0 = Latch count value command 38 0 1 = Access mode: lobyte only 39 1 0 = Access mode: hibyte only 40 1 1 = Access mode: lobyte/hibyte 41 1 to 3 Operating mode : 42 0 0 0 = Mode 0 (interrupt on terminal count) 43 0 0 1 = Mode 1 (hardware re-triggerable one-shot) 44 0 1 0 = Mode 2 (rate generator) 45 0 1 1 = Mode 3 (square wave generator) 46 1 0 0 = Mode 4 (software triggered strobe) 47 1 0 1 = Mode 5 (hardware triggered strobe) 48 1 1 0 = Mode 2 (rate generator, same as 010b) 49 1 1 1 = Mode 3 (square wave generator, same as 011b) 50 0 BCD/Binary mode: 0 = 16-bit binary, 1 = four-digit BCD 51 43 52 */ 44 unsigned short command = 0 b00110110;53 unsigned short command = 0b00110110; 45 54 outb(0x43, command); 46 outb(0x40, divisor & 0xFF); /* Set low byte of divisor */47 outb(0x40, divisor >> 8); /* Set high byte of divisor */55 outb(0x40, divisor & 0xFF); /* Set low byte of divisor */ 56 outb(0x40, divisor >> 8); /* Set high byte of divisor */ 48 57 } -
libcaca/trunk/kernel/kernel.c
r4158 r4159 37 37 printf("_start at 0x%x\n", _start); 38 38 printf("kmain() at 0x%x\n", kmain); 39 printf("Types : char[%d] int[%d] long[%d] unsigned long long[%d]\n", sizeof(char), sizeof(int), sizeof(long), sizeof(unsigned long long)); 40 41 enable_interrupt(1); // Enable Keyboard Interrupt (IRQ1) 42 enable_interrupt(0); // Enable IRQ0 (timer) 43 enable_interrupt(13); 44 timer_phase(100); // Fire IRQ0 each 1/100s 45 39 46 40 47 processor_get_info(&processor_info); … … 44 51 floppy_print_info(&floppy_info); 45 52 46 enable_interrupt(1); // Enable Keyboard Interrupt (IRQ1)47 enable_interrupt(0); // Enable IRQ0 (timer)48 enable_interrupt(13);49 timer_phase(100); // Fire IRQ0 each 1/100s50 51 52 printf("Waiting 1s\n");53 sleep(1);54 printf("Waiting 2s\n");55 sleep(2);56 printf("Waiting 3s\n");57 sleep(3);58 printf("Ok\n");59 53 //caca_get_display_driver_list(); 60 54 printf("Entering kernel infinite loop.\n"); 61 55 62 56 while (1) -
libcaca/trunk/kernel/kernel.h
r4158 r4159 31 31 #define sti __asm__("sti"::) 32 32 33 #define rdtsc(low,high) \ 34 __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)) 33 35 34 36 -
libcaca/trunk/kernel/klibc.c
r4158 r4159 1 /* 1 /* 2 2 * libcaca 3 3 * libcaca Colour ASCII-Art library … … 36 36 37 37 /* Our memory mapping */ 38 static uint32_t *freemem = (uint32_t *) 0x00200000;38 static uint32_t *freemem = (uint32_t *) 0x00200000; 39 39 int kX = 0; 40 40 int kY = 0; … … 42 42 void scroll(void) 43 43 { 44 unsigned char* video, *tmp; 45 46 for(video=(unsigned char*)0xB8000 ; video<(unsigned char*)0xB8FA0 ; video++){ 47 tmp = (unsigned char*) (video+1*160); 48 49 if(tmp<(unsigned char*)0xB8FA0) 44 unsigned char *video, *tmp; 45 46 for (video = (unsigned char *)0xB8000; video < (unsigned char *)0xB8FA0; 47 video++) 48 { 49 tmp = (unsigned char *)(video + 1 * 160); 50 51 if (tmp < (unsigned char *)0xB8FA0) 50 52 *video = *tmp; 51 53 else 52 54 *video = 0; 53 } 54 55 kY-=1; 56 if(kY<0) 57 kY=0;} 55 } 56 57 kY -= 1; 58 if (kY < 0) 59 kY = 0; 60 } 58 61 59 62 void putcar(unsigned char c) 60 63 { 61 unsigned char* video; 62 63 if(c==10){ 64 kX=0; 65 kY++; 66 } 67 else{ 68 video = (unsigned char*) (0xB8000+2*kX+160*kY); 69 *video = c; 70 *(video+1) = 0x07; 71 72 kX++; 73 if(kX>79){ 74 kX = 0; 75 kY++; 76 } 77 if(kY >= 24) { 64 unsigned char *video; 65 66 if (c == 10) 67 { 68 kX = 0; 69 kY++; 70 } 71 else 72 { 73 video = (unsigned char *)(0xB8000 + 2 * kX + 160 * kY); 74 *video = c; 75 *(video + 1) = 0x07; 76 77 kX++; 78 if (kX > 79) 79 { 80 kX = 0; 81 kY++; 82 } 83 if (kY >= 24) 84 { 78 85 scroll(); 79 86 } … … 84 91 { 85 92 char const *ptr = str; 86 while(*ptr) { 87 putcar(*ptr++); 93 while (*ptr) 94 { 95 putcar(*ptr++); 88 96 } 89 97 } … … 94 102 kX = 0; 95 103 kY = 0; 96 for(y = 0; y < 25; y++) 97 for(x = 0; x < 80; x++) { 98 putcar(' '); 104 for (y = 0; y < 25; y++) 105 for (x = 0; x < 80; x++) 106 { 107 putcar(' '); 99 108 } 100 109 kX = 0; 101 kY = 0; 110 kY = 0; 102 111 } 103 112 … … 106 115 { 107 116 uint32_t *p = freemem; 108 if (!size)117 if (!size) 109 118 return NULL; 110 119 size = (size + 0x7) / 4; … … 123 132 uint32_t oldsize; 124 133 void *p; 125 126 if (!size)134 135 if (!size) 127 136 return NULL; 128 129 if (!ptr)137 138 if (!ptr) 130 139 oldsize = 0; 131 140 else 132 141 { 133 oldsize = ((uint32_t *) ptr)[-1];134 if (oldsize >= size)142 oldsize = ((uint32_t *) ptr)[-1]; 143 if (oldsize >= size) 135 144 return ptr; 136 145 } 137 146 138 147 p = malloc(size); 139 148 memcpy(p, ptr, oldsize); … … 169 178 int abs(int j) 170 179 { 171 if (j < 0)180 if (j < 0) 172 181 return -j; 173 182 return j; … … 177 186 { 178 187 /* FIXME: reboot? */ 179 while (1);180 } 181 182 int atexit(void (*function) (void))188 while (1); 189 } 190 191 int atexit(void (*function) (void)) 183 192 { 184 193 /* FIXME: register function */ … … 190 199 { 191 200 uint8_t *ptr = s; 192 193 while (n--)201 202 while (n--) 194 203 *ptr++ = c; 195 204 196 205 return s; 197 206 } … … 201 210 uint8_t *destptr = dest; 202 211 uint8_t const *srcptr = src; 203 204 while (n--)212 213 while (n--) 205 214 *destptr++ = *srcptr++; 206 215 207 216 return dest; 208 217 } … … 218 227 { 219 228 int len = 0; 220 221 while (*s++)229 230 while (*s++) 222 231 len++; 223 232 224 233 return len; 225 234 } … … 227 236 int strcmp(const char *s1, const char *s2) 228 237 { 229 while (*s1 && *s1 == *s2)238 while (*s1 && *s1 == *s2) 230 239 { 231 240 s1++; 232 241 s2++; 233 242 } 234 243 235 244 return (int)*s1 - (int)*s2; 236 245 } … … 238 247 int strcasecmp(const char *s1, const char *s2) 239 248 { 240 while (*s1 && *s2 && UPPER(*s1) == UPPER(*s2))249 while (*s1 && *s2 && UPPER(*s1) == UPPER(*s2)) 241 250 { 242 251 s1++; 243 252 s2++; 244 253 } 245 254 246 255 return (int)UPPER(*s1) - (int)UPPER(*s2); 247 256 } … … 250 259 { 251 260 uint8_t const *s1 = _s1, *s2 = _s2; 252 253 while (n--)254 { 255 if (*s1 != *s2)261 262 while (n--) 263 { 264 if (*s1 != *s2) 256 265 return (int)*s1 - (int)*s2; 257 266 s1++; … … 265 274 char *new; 266 275 unsigned int len = strlen(s); 267 276 268 277 new = malloc(len + 1); 269 278 memcpy(new, s, len + 1); 270 279 271 280 return new; 272 281 } … … 275 284 { 276 285 do 277 if (*s == c)278 return (char *)(intptr_t) s;279 while (*s++);280 286 if (*s == c) 287 return (char *)(intptr_t) s; 288 while (*s++); 289 281 290 return NULL; 282 291 } … … 296 305 } 297 306 298 int feof(FILE * stream)299 { 300 /* FIXME */ 301 return 0; 302 } 303 304 char *fgets(char *s, int size, FILE * stream)307 int feof(FILE * stream) 308 { 309 /* FIXME */ 310 return 0; 311 } 312 313 char *fgets(char *s, int size, FILE * stream) 305 314 { 306 315 /* FIXME */ … … 308 317 } 309 318 310 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE * stream)311 { 312 return 0; 313 } 314 315 int fclose(FILE * fp)319 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE * stream) 320 { 321 return 0; 322 } 323 324 int fclose(FILE * fp) 316 325 { 317 326 /* FIXME */ … … 325 334 args_list args; 326 335 args_start(args, fmt); 327 336 328 337 char *s; 329 338 int ptr = 0; 330 339 int i = 0; 331 332 for (; fmt[i]; ++i) { 333 if ((fmt[i]!='%') && (fmt[i]!='\\')) { 340 341 for (; fmt[i]; ++i) 342 { 343 if ((fmt[i] != '%') && (fmt[i] != '\\')) 344 { 334 345 str[ptr++] = fmt[i]; 335 346 continue; 336 } else if (fmt[i] == '\\') { 337 switch (fmt[++i]) { 338 case 'a': str[ptr++] = '\a'; break; 339 case 'b': str[ptr++] = '\b'; break; 340 case 't': str[ptr++] = '\t'; break; 341 case 'n': str[ptr++] = '\n'; break; 342 case 'r': str[ptr++] = '\r'; break; 343 case '\\':str[ptr++] = '\\'; break; 347 } 348 else if (fmt[i] == '\\') 349 { 350 switch (fmt[++i]) 351 { 352 case 'a': 353 str[ptr++] = '\a'; 354 break; 355 case 'b': 356 str[ptr++] = '\b'; 357 break; 358 case 't': 359 str[ptr++] = '\t'; 360 break; 361 case 'n': 362 str[ptr++] = '\n'; 363 break; 364 case 'r': 365 str[ptr++] = '\r'; 366 break; 367 case '\\': 368 str[ptr++] = '\\'; 369 break; 344 370 } 345 371 continue; 346 372 } 347 348 switch (fmt[++i]) { 349 case 's': 350 s = (char *)args_next(args, char *); 351 while (*s) 352 str[ptr++] = *s++; 353 break; 354 case 'c': 355 str[ptr++] = (char)args_next(args, int); 356 break; 357 case 'p': 358 case 'x': 359 htoa((unsigned long)args_next(args, unsigned long), tmp); 360 memcpy(&str[ptr], tmp, strlen(tmp)); 361 ptr+=strlen(tmp); 362 break; 363 case 'd': 364 itoa((unsigned long)args_next(args, unsigned long), tmp); 365 memcpy(&str[ptr], tmp, strlen(tmp)); 366 ptr+=strlen(tmp); 367 break; 368 case '%': 369 str[ptr++] = '%'; 370 break; 371 default: 372 str[ptr++] = fmt[i]; 373 break; 374 } 375 } 376 373 374 switch (fmt[++i]) 375 { 376 case 's': 377 s = (char *)args_next(args, char *); 378 while (*s) 379 str[ptr++] = *s++; 380 break; 381 case 'c': 382 str[ptr++] = (char)args_next(args, int); 383 break; 384 case 'p': 385 case 'x': 386 htoa((unsigned long)args_next(args, unsigned long), tmp); 387 memcpy(&str[ptr], tmp, strlen(tmp)); 388 ptr += strlen(tmp); 389 break; 390 case 'd': 391 itoa((unsigned long)args_next(args, unsigned long), tmp); 392 memcpy(&str[ptr], tmp, strlen(tmp)); 393 ptr += strlen(tmp); 394 break; 395 case '%': 396 str[ptr++] = '%'; 397 break; 398 default: 399 str[ptr++] = fmt[i]; 400 break; 401 } 402 } 403 377 404 str[ptr] = '\0'; 378 405 args_end(args); 379 406 380 407 print(str); 381 382 return 0; 383 } 384 385 int fprintf(FILE * stream, const char *format, ...)386 { 387 /* FIXME */ 388 return 0; 389 } 390 391 int fflush(FILE * stream)408 409 return 0; 410 } 411 412 int fprintf(FILE * stream, const char *format, ...) 413 { 414 /* FIXME */ 415 return 0; 416 } 417 418 int fflush(FILE * stream) 392 419 { 393 420 /* FIXME */ … … 400 427 args_list args; 401 428 args_start(args, fmt); 402 429 403 430 char *s; 404 431 int ptr = 0; 405 432 int i = 0; 406 407 for (; fmt[i]; ++i) { 408 if ((fmt[i]!='%') && (fmt[i]!='\\')) { 433 434 for (; fmt[i]; ++i) 435 { 436 if ((fmt[i] != '%') && (fmt[i] != '\\')) 437 { 409 438 str[ptr++] = fmt[i]; 410 439 continue; 411 } else if (fmt[i] == '\\') { 412 switch (fmt[++i]) { 413 case 'a': str[ptr++] = '\a'; break; 414 case 'b': str[ptr++] = '\b'; break; 415 case 't': str[ptr++] = '\t'; break; 416 case 'n': str[ptr++] = '\n'; break; 417 case 'r': str[ptr++] = '\r'; break; 418 case '\\':str[ptr++] = '\\'; break; 440 } 441 else if (fmt[i] == '\\') 442 { 443 switch (fmt[++i]) 444 { 445 case 'a': 446 str[ptr++] = '\a'; 447 break; 448 case 'b': 449 str[ptr++] = '\b'; 450 break; 451 case 't': 452 str[ptr++] = '\t'; 453 break; 454 case 'n': 455 str[ptr++] = '\n'; 456 break; 457 case 'r': 458 str[ptr++] = '\r'; 459 break; 460 case '\\': 461 str[ptr++] = '\\'; 462 break; 419 463 } 420 464 continue; 421 465 } 422 423 switch (fmt[++i]) { 424 case 's': 425 s = (char *)args_next(args, char *); 426 while (*s) 427 str[ptr++] = *s++; 428 break; 429 case 'c': 430 str[ptr++] = (char)args_next(args, int); 431 break; 432 case 'p': 433 case 'x': 434 htoa((unsigned long)args_next(args, unsigned long), tmp); 435 memcpy(&str[ptr], tmp, strlen(tmp)); 436 ptr+=strlen(tmp); 437 break; 438 case 'd': 439 itoa((unsigned long)args_next(args, unsigned long), tmp); 440 memcpy(&str[ptr], tmp, strlen(tmp)); 441 ptr+=strlen(tmp); 442 break; 443 case '%': 444 str[ptr++] = '%'; 445 break; 446 default: 447 str[ptr++] = fmt[i]; 448 break; 466 467 switch (fmt[++i]) 468 { 469 case 's': 470 s = (char *)args_next(args, char *); 471 while (*s) 472 str[ptr++] = *s++; 473 break; 474 case 'c': 475 str[ptr++] = (char)args_next(args, int); 476 break; 477 case 'p': 478 case 'x': 479 htoa((unsigned long)args_next(args, unsigned long), tmp); 480 memcpy(&str[ptr], tmp, strlen(tmp)); 481 ptr += strlen(tmp); 482 break; 483 case 'd': 484 itoa((unsigned long)args_next(args, unsigned long), tmp); 485 memcpy(&str[ptr], tmp, strlen(tmp)); 486 ptr += strlen(tmp); 487 break; 488 case '%': 489 str[ptr++] = '%'; 490 break; 491 default: 492 str[ptr++] = fmt[i]; 493 break; 449 494 } 450 495 } … … 465 510 void usleep(unsigned long usec) 466 511 { 467 u32 start = ticks; 468 signed int diff = 0; 469 470 while(1) { 512 u32 start = ticks; 513 signed int diff = 0; 514 515 while (1) 516 { 471 517 diff = (signed int)(ticks - start); 472 if(diff >= (signed int)(usec/20)) break; 473 } 474 } 475 476 void sleep(unsigned long sec) 477 { 478 usleep(sec*1000); 479 } 480 481 /* time.h functions */ 482 u64 rdtsc() { 483 u64 x; 484 __asm__ volatile ("rdtsc" : "=A" (x)); 485 return x; 486 } 518 if (diff >= (signed int)(usec / 20)) 519 break; 520 } 521 } 522 523 void sleep(unsigned long sec) 524 { 525 usleep(sec * 1000); 526 } 527 487 528 488 529 int gettimeofday(struct timeval *tv, struct timezone *tz) … … 490 531 static int usec = 0; 491 532 static int sec = 0; 492 533 493 534 /* FIXME */ 494 535 usec += 10000; 495 if (usec > 1000000)536 if (usec > 1000000) 496 537 { 497 538 sec++; 498 539 usec -= 1000000; 499 540 } 500 541 501 542 tv->tv_sec = sec; 502 543 tv->tv_usec = usec; 503 544 504 545 return 0; 505 546 } … … 510 551 double ret = 0.0; 511 552 #ifdef HAVE_FSIN_FCOS 512 asm volatile ("fcos" : "=t" (ret) : "0"(x));553 asm volatile ("fcos":"=t" (ret):"0"(x)); 513 554 #else 514 555 double x2; … … 516 557 double fact = 1.0; 517 558 int i; 518 559 519 560 x = x - ((double)(int)(x / (2 * M_PI))) * (2 * M_PI); 520 561 x2 = x * x; 521 562 522 563 /* cos(x) = 1/0! - x^2/2! + x^4/4! - x^6/6! ... */ 523 for (i = 0; i < 10; i++)564 for (i = 0; i < 10; i++) 524 565 { 525 566 ret += num / fact; 526 num *= - x2;567 num *= -x2; 527 568 fact *= (2 * i + 1) * (2 * i + 2); 528 569 } … … 535 576 double ret = 0.0; 536 577 #ifdef HAVE_FSIN_FCOS 537 asm volatile ("fsin" : "=t" (ret) : "0"(x));578 asm volatile ("fsin":"=t" (ret):"0"(x)); 538 579 #else 539 580 double x2; … … 541 582 double fact = 1.0; 542 583 int i; 543 584 544 585 x = x - ((double)(int)(x / (2 * M_PI))) * (2 * M_PI); 545 586 x2 = x * x; 546 587 num = x; 547 588 548 589 /* sin(x) = x/1! - x^3/3! + x^5/5! - x^7/7! ... */ 549 for (i = 0; i < 10; i++)590 for (i = 0; i < 10; i++) 550 591 { 551 592 ret += num / fact; 552 num *= - x2;593 num *= -x2; 553 594 fact *= (2 * i + 2) * (2 * i + 3); 554 595 } … … 561 602 double ret = x; 562 603 int i; 563 604 564 605 /* This is Newton's method */ 565 for (i = 0; i < 10; i++)606 for (i = 0; i < 10; i++) 566 607 ret = (ret * ret + x) / (ret * 2.0); 567 608 568 609 return ret; 569 610 } 570 611 571 612 572 /* reverse: reverse string s in place */613 /* reverse: reverse string s in place */ 573 614 void reverse(char s[]) 574 615 { 575 616 int i, j; 576 617 char c; 577 578 for (i = 0, j = strlen(s)-1; i<j; i++, j--) { 618 619 for (i = 0, j = strlen(s) - 1; i < j; i++, j--) 620 { 579 621 c = s[i]; 580 622 s[i] = s[j]; … … 588 630 { 589 631 int i, sign; 590 591 if ((sign = n) < 0) /* record sign */592 n = -n; /* make n positive */632 633 if ((sign = n) < 0) /* record sign */ 634 n = -n; /* make n positive */ 593 635 i = 0; 594 do { /* generate digits in reverse order */ 595 s[i++] = n % 10 + '0'; /* get next digit */ 596 } while ((n /= 10) > 0); /* delete it */ 636 do 637 { /* generate digits in reverse order */ 638 s[i++] = n % 10 + '0'; /* get next digit */ 639 } 640 while ((n /= 10) > 0); /* delete it */ 597 641 if (sign < 0) 598 642 s[i++] = '-'; 599 643 s[i] = '\0'; 600 644 reverse(s); 601 } 602 603 void htoa(unsigned int value, char s[]) { 645 } 646 647 void htoa(unsigned int value, char s[]) 648 { 604 649 int i = 8; 605 650 int ptr = 0; 606 while (i-- > 0) { 607 s[ptr++] = "0123456789abcdef"[(value>>(i*4))&0xf]; 651 while (i-- > 0) 652 { 653 s[ptr++] = "0123456789abcdef"[(value >> (i * 4)) & 0xf]; 608 654 } 609 655 s[ptr] = 0; -
libcaca/trunk/kernel/klibc.h
r4158 r4159 42 42 typedef unsigned short u16; 43 43 typedef unsigned int u32; 44 typedef unsigned long intu64;44 typedef unsigned long long u64; 45 45 46 46 #ifndef size_t … … 124 124 125 125 /* time.h functions */ 126 u64 rdtsc(void);127 126 int gettimeofday(struct timeval *tv, struct timezone *tz); 128 127 int time(void *);
Note: See TracChangeset
for help on using the changeset viewer.
