Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

614 rindas
11 KiB

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