No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

598 líneas
11 KiB

  1. #include "config.h"
  2. #include "caca_types.h"
  3. #include "klibc.h"
  4. #include "drivers/timer.h"
  5. #include "kernel.h"
  6. void htoa(unsigned int value, char s[]);
  7. #define IS_DIGIT(x) (x>='0' && x<='9')
  8. #define IS_ALPHA(x) (x>='A' && x<='z')
  9. #define IS_UPPER(x) (x>='A' && x<='Z')
  10. #define IS_LOWER(x) (x>='a' && x<='z')
  11. #define UPPER(x) (IS_LOWER(x)?(x+('A'-'a')):x)
  12. #define LOWER(x) (IS_UPPER(x)?(x-('a'-'A')):x)
  13. /* Our default seed for random number generator */
  14. static int seed = 0x68743284;
  15. /* Our memory mapping */
  16. static uint32_t *freemem = (uint32_t*) 0x00200000;
  17. int kX = 0;
  18. int kY = 0;
  19. void scroll(void)
  20. {
  21. unsigned char* video, *tmp;
  22. for(video=(unsigned char*)0xB8000 ; video<(unsigned char*)0xB8FA0 ; video++){
  23. tmp = (unsigned char*) (video+1*160);
  24. if(tmp<(unsigned char*)0xB8FA0)
  25. *video = *tmp;
  26. else
  27. *video = 0;
  28. }
  29. kY-=1;
  30. if(kY<0)
  31. kY=0;}
  32. void putcar(unsigned char c)
  33. {
  34. unsigned char* video;
  35. if(c==10){
  36. kX=0;
  37. kY++;
  38. }
  39. else{
  40. video = (unsigned char*) (0xB8000+2*kX+160*kY);
  41. *video = c;
  42. *(video+1) = 0x07;
  43. kX++;
  44. if(kX>79){
  45. kX = 0;
  46. kY++;
  47. }
  48. if(kY >= 24) {
  49. scroll();
  50. }
  51. }
  52. }
  53. void print(char *str)
  54. {
  55. char const *ptr = str;
  56. while(*ptr) {
  57. putcar(*ptr++);
  58. }
  59. }
  60. void clearscreen(void)
  61. {
  62. int x, y;
  63. kX = 0;
  64. kY = 0;
  65. for(y = 0; y < 25; y++)
  66. for(x = 0; x < 80; x++) {
  67. putcar(' ');
  68. }
  69. kX = 0;
  70. kY = 0;
  71. }
  72. /* stdlib.h functions */
  73. void *malloc(size_t size)
  74. {
  75. uint32_t *p = freemem;
  76. if(!size)
  77. return NULL;
  78. size = (size + 0x7) / 4;
  79. *p = size;
  80. freemem += size + 1;
  81. return p + 1;
  82. }
  83. void free(void *ptr)
  84. {
  85. return;
  86. }
  87. void *realloc(void *ptr, size_t size)
  88. {
  89. uint32_t oldsize;
  90. void *p;
  91. if(!size)
  92. return NULL;
  93. if(!ptr)
  94. oldsize = 0;
  95. else
  96. {
  97. oldsize = ((uint32_t *)ptr)[-1];
  98. if(oldsize >= size)
  99. return ptr;
  100. }
  101. p = malloc(size);
  102. memcpy(p, ptr, oldsize);
  103. return p;
  104. }
  105. char *getenv(const char *name)
  106. {
  107. return NULL;
  108. }
  109. int getpid(void)
  110. {
  111. return 0x1337;
  112. }
  113. void srand(unsigned int s)
  114. {
  115. seed = rand();
  116. }
  117. int time(void *dummy)
  118. {
  119. return rand();
  120. }
  121. int rand(void)
  122. {
  123. seed = (seed * 0x7f32ba17) ^ 0xf893a735;
  124. return seed % RAND_MAX;
  125. }
  126. int abs(int j)
  127. {
  128. if(j < 0)
  129. return -j;
  130. return j;
  131. }
  132. void exit(int status)
  133. {
  134. /* FIXME: reboot? */
  135. while(1);
  136. }
  137. int atexit(void (*function)(void))
  138. {
  139. /* FIXME: register function */
  140. return 0;
  141. }
  142. /* string.h functions */
  143. void *memset(void *s, int c, size_t n)
  144. {
  145. uint8_t *ptr = s;
  146. while(n--)
  147. *ptr++ = c;
  148. return s;
  149. }
  150. void *memcpy(void *dest, const void *src, size_t n)
  151. {
  152. uint8_t *destptr = dest;
  153. uint8_t const *srcptr = src;
  154. while(n--)
  155. *destptr++ = *srcptr++;
  156. return dest;
  157. }
  158. void *memmove(void *dest, const void *src, size_t n)
  159. {
  160. memcpy(freemem, src, n);
  161. memcpy(dest, freemem, n);
  162. return dest;
  163. }
  164. size_t strlen(const char *s)
  165. {
  166. int len = 0;
  167. while(*s++)
  168. len++;
  169. return len;
  170. }
  171. int strcmp(const char *s1, const char *s2)
  172. {
  173. while(*s1 && *s1 == *s2)
  174. {
  175. s1++;
  176. s2++;
  177. }
  178. return (int)*s1 - (int)*s2;
  179. }
  180. int strcasecmp(const char *s1, const char *s2)
  181. {
  182. while(*s1 && *s2 && UPPER(*s1) == UPPER(*s2))
  183. {
  184. s1++;
  185. s2++;
  186. }
  187. return (int)UPPER(*s1) - (int)UPPER(*s2);
  188. }
  189. int memcmp(const void *_s1, const void *_s2, size_t n)
  190. {
  191. uint8_t const *s1 = _s1, *s2 = _s2;
  192. while(n--)
  193. {
  194. if(*s1 != *s2)
  195. return (int)*s1 - (int)*s2;
  196. s1++;
  197. s2++;
  198. }
  199. return 0;
  200. }
  201. char *strdup(const char *s)
  202. {
  203. char *new;
  204. unsigned int len = strlen(s);
  205. new = malloc(len + 1);
  206. memcpy(new, s, len + 1);
  207. return new;
  208. }
  209. char *strchr(const char *s, int c)
  210. {
  211. do
  212. if(*s == c)
  213. return (char *)(intptr_t)s;
  214. while(*s++);
  215. return NULL;
  216. }
  217. /* stdarg.h functions */
  218. int vsnprintf(char *str, size_t size, const char *format, va_list ap)
  219. {
  220. /* FIXME */
  221. return 0;
  222. }
  223. /* stdio.h functions */
  224. FILE *fopen(const char *path, const char *mode)
  225. {
  226. /* FIXME */
  227. return NULL;
  228. }
  229. int feof(FILE *stream)
  230. {
  231. /* FIXME */
  232. return 0;
  233. }
  234. char *fgets(char *s, int size, FILE *stream)
  235. {
  236. /* FIXME */
  237. return NULL;
  238. }
  239. size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
  240. {
  241. return 0;
  242. }
  243. int fclose(FILE *fp)
  244. {
  245. /* FIXME */
  246. return 0;
  247. }
  248. int printf(const char *fmt, ...)
  249. {
  250. char str[200];
  251. char tmp[100];
  252. args_list args;
  253. args_start(args, fmt);
  254. char *s;
  255. int ptr = 0;
  256. int i = 0;
  257. for (; fmt[i]; ++i) {
  258. if ((fmt[i]!='%') && (fmt[i]!='\\')) {
  259. str[ptr++] = fmt[i];
  260. continue;
  261. } else if (fmt[i] == '\\') {
  262. switch (fmt[++i]) {
  263. case 'a': str[ptr++] = '\a'; break;
  264. case 'b': str[ptr++] = '\b'; break;
  265. case 't': str[ptr++] = '\t'; break;
  266. case 'n': str[ptr++] = '\n'; break;
  267. case 'r': str[ptr++] = '\r'; break;
  268. case '\\':str[ptr++] = '\\'; break;
  269. }
  270. continue;
  271. }
  272. switch (fmt[++i]) {
  273. case 's':
  274. s = (char *)args_next(args, char *);
  275. while (*s)
  276. str[ptr++] = *s++;
  277. break;
  278. case 'c':
  279. str[ptr++] = (char)args_next(args, int);
  280. break;
  281. case 'p':
  282. case 'x':
  283. htoa((unsigned long)args_next(args, unsigned long), tmp);
  284. memcpy(&str[ptr], tmp, strlen(tmp));
  285. ptr+=strlen(tmp);
  286. break;
  287. case 'd':
  288. itoa((unsigned long)args_next(args, unsigned long), tmp);
  289. memcpy(&str[ptr], tmp, strlen(tmp));
  290. ptr+=strlen(tmp);
  291. break;
  292. case '%':
  293. str[ptr++] = '%';
  294. break;
  295. default:
  296. str[ptr++] = fmt[i];
  297. break;
  298. }
  299. }
  300. str[ptr] = '\0';
  301. args_end(args);
  302. print(str);
  303. return 0;
  304. }
  305. int fprintf(FILE *stream, const char *format, ...)
  306. {
  307. /* FIXME */
  308. return 0;
  309. }
  310. int fflush(FILE *stream)
  311. {
  312. /* FIXME */
  313. return 0;
  314. }
  315. int sprintf(char *str, const char *fmt, ...)
  316. {
  317. char tmp[100];
  318. args_list args;
  319. args_start(args, fmt);
  320. char *s;
  321. int ptr = 0;
  322. int i = 0;
  323. for (; fmt[i]; ++i) {
  324. if ((fmt[i]!='%') && (fmt[i]!='\\')) {
  325. str[ptr++] = fmt[i];
  326. continue;
  327. } else if (fmt[i] == '\\') {
  328. switch (fmt[++i]) {
  329. case 'a': str[ptr++] = '\a'; break;
  330. case 'b': str[ptr++] = '\b'; break;
  331. case 't': str[ptr++] = '\t'; break;
  332. case 'n': str[ptr++] = '\n'; break;
  333. case 'r': str[ptr++] = '\r'; break;
  334. case '\\':str[ptr++] = '\\'; break;
  335. }
  336. continue;
  337. }
  338. switch (fmt[++i]) {
  339. case 's':
  340. s = (char *)args_next(args, char *);
  341. while (*s)
  342. str[ptr++] = *s++;
  343. break;
  344. case 'c':
  345. str[ptr++] = (char)args_next(args, int);
  346. break;
  347. case 'p':
  348. case 'x':
  349. htoa((unsigned long)args_next(args, unsigned long), tmp);
  350. memcpy(&str[ptr], tmp, strlen(tmp));
  351. ptr+=strlen(tmp);
  352. break;
  353. case 'd':
  354. itoa((unsigned long)args_next(args, unsigned long), tmp);
  355. memcpy(&str[ptr], tmp, strlen(tmp));
  356. ptr+=strlen(tmp);
  357. break;
  358. case '%':
  359. str[ptr++] = '%';
  360. break;
  361. default:
  362. str[ptr++] = fmt[i];
  363. break;
  364. }
  365. }
  366. str[ptr] = '\0';
  367. args_end(args);
  368. return 0;
  369. }
  370. int sscanf(const char *str, const char *format, ...)
  371. {
  372. /* FIXME */
  373. return 0;
  374. }
  375. /* unistd.h functions */
  376. void usleep(unsigned long usec)
  377. {
  378. u32 start = ticks;
  379. signed int diff = 0;
  380. while(1) {
  381. diff = (signed int)(ticks - start);
  382. if(diff >= (signed int)(usec/20)) break;
  383. }
  384. }
  385. void sleep(unsigned long sec)
  386. {
  387. usleep(sec*1000);
  388. }
  389. /* time.h functions */
  390. u64 rdtsc() {
  391. u64 x;
  392. __asm__ volatile ("rdtsc" : "=A" (x));
  393. return x;
  394. }
  395. int gettimeofday(struct timeval *tv, struct timezone *tz)
  396. {
  397. static int usec = 0;
  398. static int sec = 0;
  399. /* FIXME */
  400. usec += 10000;
  401. if(usec > 1000000)
  402. {
  403. sec++;
  404. usec -= 1000000;
  405. }
  406. tv->tv_sec = sec;
  407. tv->tv_usec = usec;
  408. return 0;
  409. }
  410. /* math.h functions */
  411. double cos(double x)
  412. {
  413. double ret = 0.0;
  414. #ifdef HAVE_FSIN_FCOS
  415. asm volatile("fcos" : "=t" (ret) : "0" (x));
  416. #else
  417. double x2;
  418. double num = 1.0;
  419. double fact = 1.0;
  420. int i;
  421. x = x - ((double)(int)(x / (2 * M_PI))) * (2 * M_PI);
  422. x2 = x * x;
  423. /* cos(x) = 1/0! - x^2/2! + x^4/4! - x^6/6! ... */
  424. for(i = 0; i < 10; i++)
  425. {
  426. ret += num / fact;
  427. num *= - x2;
  428. fact *= (2 * i + 1) * (2 * i + 2);
  429. }
  430. #endif
  431. return ret;
  432. }
  433. double sin(double x)
  434. {
  435. double ret = 0.0;
  436. #ifdef HAVE_FSIN_FCOS
  437. asm volatile("fsin" : "=t" (ret) : "0" (x));
  438. #else
  439. double x2;
  440. double num;
  441. double fact = 1.0;
  442. int i;
  443. x = x - ((double)(int)(x / (2 * M_PI))) * (2 * M_PI);
  444. x2 = x * x;
  445. num = x;
  446. /* sin(x) = x/1! - x^3/3! + x^5/5! - x^7/7! ... */
  447. for(i = 0; i < 10; i++)
  448. {
  449. ret += num / fact;
  450. num *= - x2;
  451. fact *= (2 * i + 2) * (2 * i + 3);
  452. }
  453. #endif
  454. return ret;
  455. }
  456. double sqrt(double x)
  457. {
  458. double ret = x;
  459. int i;
  460. /* This is Newton's method */
  461. for(i = 0; i < 10; i++)
  462. ret = (ret * ret + x) / (ret * 2.0);
  463. return ret;
  464. }
  465. /* reverse: reverse string s in place */
  466. void reverse(char s[])
  467. {
  468. int i, j;
  469. char c;
  470. for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
  471. c = s[i];
  472. s[i] = s[j];
  473. s[j] = c;
  474. }
  475. }
  476. /* itoa implementation, by Kernighan and Ritchie's The C Programming Language */
  477. void itoa(int n, char s[])
  478. {
  479. int i, sign;
  480. if ((sign = n) < 0) /* record sign */
  481. n = -n; /* make n positive */
  482. i = 0;
  483. do { /* generate digits in reverse order */
  484. s[i++] = n % 10 + '0'; /* get next digit */
  485. } while ((n /= 10) > 0); /* delete it */
  486. if (sign < 0)
  487. s[i++] = '-';
  488. s[i] = '\0';
  489. reverse(s);
  490. }
  491. void htoa(unsigned int value, char s[]) {
  492. int i = 8;
  493. int ptr = 0;
  494. while (i-- > 0) {
  495. s[ptr++] = "0123456789abcdef"[(value>>(i*4))&0xf];
  496. }
  497. s[ptr] = 0;
  498. }
  499. /* errno.h stuff */
  500. int errno = 0;