Subversion Repositories Kolibri OS

Rev

Rev 4921 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #include <_ansi.h>
  2. #include <reent.h>
  3. #include <errno.h>
  4. #include <time.h>
  5. #include <sys/types.h>
  6. #include <sys/time.h>
  7.  
  8. #define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)
  9.  
  10. int
  11. _DEFUN (gettimeofday, (ptimeval, ptimezone),
  12.      struct timeval *ptimeval _AND
  13.      void *ptimezone)
  14. {
  15.     unsigned int xtmp;
  16.     struct   tm tmblk;
  17.  
  18.     if( ptimeval )
  19.     {
  20.         ptimeval->tv_usec = 0;
  21.  
  22.          __asm__ __volatile__("int $0x40":"=a"(xtmp):"0"(3));
  23.         tmblk.tm_sec = (xtmp>>16)&0xff;
  24.         tmblk.tm_min = (xtmp>>8)&0xff;
  25.         tmblk.tm_hour = xtmp&0xff;
  26.         BCD_TO_BIN(tmblk.tm_sec);
  27.         BCD_TO_BIN(tmblk.tm_min);
  28.         BCD_TO_BIN(tmblk.tm_hour);
  29.         __asm__ __volatile__("int $0x40":"=a"(xtmp):"0"(29));
  30.  
  31.         int bcd_day =  (xtmp >> 16);
  32.         int bcd_mon =  ((xtmp & 0xFF00) >> 8);
  33.         int bcd_year = (xtmp & 0xFF);
  34.  
  35.         tmblk.tm_mday = ((bcd_day & 0xF0)>>4)*10 + (bcd_day & 0x0F);
  36.         tmblk.tm_mon = ((bcd_mon & 0xF0)>>4)*10 + (bcd_mon & 0x0F) - 1;
  37.         tmblk.tm_year = ((bcd_year & 0xF0)>>4)*10 + (bcd_year & 0x0F) + 100;
  38.  
  39.         tmblk.tm_wday = tmblk.tm_yday = tmblk.tm_isdst = -1;
  40.         ptimeval->tv_sec = mktime(&tmblk);
  41.         return 0;
  42.     }
  43.     else
  44.     {
  45.         errno = EINVAL;
  46.         return -1;
  47.     };
  48.  
  49. }
  50.  
  51.