Release 960712
[wine/multimedia.git] / miscemu / int1a.c
blob501701035f19034f916d6252a934d79a1e591d68
1 #include <time.h>
2 #include <sys/time.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include "options.h"
6 #include "miscemu.h"
7 #include "stddebug.h"
8 /* #define DEBUG_INT */
9 #include "debug.h"
11 #define BCD_TO_BIN(x) ((x&15) + (x>>4)*10)
12 #define BIN_TO_BCD(x) ((x%10) + ((x/10)<<4))
15 /**********************************************************************
16 * INT1A_GetTicksSinceMidnight
18 * Return number of clock ticks since midnight.
20 DWORD INT1A_GetTicksSinceMidnight(void)
22 struct tm *bdtime;
23 struct timeval tvs;
24 time_t seconds;
26 /* This should give us the (approximately) correct
27 * 18.206 clock ticks per second since midnight.
29 gettimeofday( &tvs, NULL );
30 seconds = tvs.tv_sec;
31 bdtime = localtime( &seconds );
32 return (((bdtime->tm_hour * 3600 + bdtime->tm_min * 60 +
33 bdtime->tm_sec) * 18206) / 1000) +
34 (tvs.tv_usec / 54927);
38 /**********************************************************************
39 * INT_Int1aHandler
41 * Handler for int 1ah (date and time).
43 void INT_Int1aHandler( SIGCONTEXT *context )
45 time_t ltime;
46 DWORD ticks;
47 struct tm *bdtime;
49 switch(AH_reg(context))
51 case 0:
52 ticks = INT1A_GetTicksSinceMidnight();
53 CX_reg(context) = HIWORD(ticks);
54 DX_reg(context) = LOWORD(ticks);
55 AX_reg(context) = 0; /* No midnight rollover */
56 dprintf_int(stddeb,"int1a_00 // ticks=%ld\n", ticks);
57 break;
59 case 2:
60 ltime = time(NULL);
61 bdtime = localtime(&ltime);
63 CX_reg(context) = (BIN_TO_BCD(bdtime->tm_hour)<<8) |
64 BIN_TO_BCD(bdtime->tm_min);
65 DX_reg(context) = (BIN_TO_BCD(bdtime->tm_sec)<<8);
67 case 4:
68 ltime = time(NULL);
69 bdtime = localtime(&ltime);
70 CX_reg(context) = (BIN_TO_BCD(bdtime->tm_year/100)<<8) |
71 BIN_TO_BCD((bdtime->tm_year-1900)%100);
72 DX_reg(context) = (BIN_TO_BCD(bdtime->tm_mon)<<8) |
73 BIN_TO_BCD(bdtime->tm_mday);
74 break;
76 /* setting the time,date or RTC is not allow -EB */
77 case 1:
78 /* set system time */
79 case 3:
80 /* set RTC time */
81 case 5:
82 /* set RTC date */
83 case 6:
84 /* set ALARM */
85 case 7:
86 /* cancel ALARM */
87 break;
89 default:
90 INT_BARF( context, 0x1a );