summaryrefslogtreecommitdiff
path: root/libc/msdos/time.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/msdos/time.c')
-rw-r--r--libc/msdos/time.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/libc/msdos/time.c b/libc/msdos/time.c
new file mode 100644
index 0000000..0a66da8
--- /dev/null
+++ b/libc/msdos/time.c
@@ -0,0 +1,63 @@
+
+#include <time.h>
+
+static int mdays[13] = { 0,31,31+28,31+28+31,31+28+31+30,
+ 31+28+31+30+31,31+28+31+30+31+30,31+28+31+30+31+30+31,
+ 31+28+31+30+31+30+31+31,31+28+31+30+31+30+31+31+30,
+ 31+28+31+30+31+30+31+31+30+31,31+28+31+30+31+30+31+31+30+31+30,
+ 365 };
+
+#define SECSPERHOUR (60*60)
+#define SECSPERDAY (SECSPERHOUR*24L)
+
+/****************************************
+ * Return the number of seconds that have elapsed since the start
+ * of 1970.
+ * Input:
+ * timer pointer to where to store result (or NULL)
+ * Output:
+ * *timer = result (unless timer == NULL)
+ * Returns:
+ * time
+ */
+
+static long get_time(ah)
+{
+#asm
+#if !__FIST_ARG_IN_AX__
+ mov bx,sp
+ mov ax,[bx+2]
+#endif
+ mov ah,al
+ int $21
+ mov ax,dx
+ mov dx,cx
+#endasm
+}
+
+time_t time(timer)
+time_t *timer;
+{
+ unsigned day,month,year;
+ long rv;
+ time_t t;
+
+ rv = get_time(0x2C);
+ rv >>= 8; t = (rv & 0xFF);
+ rv >>= 8; t += (rv & 0xFF)*60;
+ rv >>= 8; t += (rv & 0xFF)*3600;
+
+ rv = get_time(0x2A);
+ day = (rv & 0xFF);
+ rv >>= 8; month = (rv & 0xFF) -1;
+ rv >>= 8; year = (rv & 0xFFFF) - 1970;
+
+ if (month <= 1 || year & 3) /* if before Feb or not a leap year */
+ day--; /* don't add day for leap year */
+ day += mdays[month]; /* day in year */
+ day += (year + 3) >> 2; /* add a day for each leap year */
+ t += ((year * 365L) + day) * SECSPERDAY;
+ if (timer)
+ *timer = t;
+ return t;
+}