winedos / Improve int1a handler

Jukka Heinonen jhei at iki.fi
Tue Jul 15 11:37:17 CDT 2003


This patch makes UFO almost work. Only one unexplained crash left
before it works...




Changelog:
  Make int1a BIOS ticks be equal to BIOS segment ticks.
  Fix bugs in int1a subfunctions.




Index: dlls/winedos/int1a.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/int1a.c,v
retrieving revision 1.2
diff -u -r1.2 int1a.c
--- dlls/winedos/int1a.c	1 Apr 2003 00:12:50 -0000	1.2
+++ dlls/winedos/int1a.c	15 Jul 2003 16:25:00 -0000
@@ -19,106 +19,110 @@
  */
 
 #include "config.h"
-#include "wine/port.h"
-
-#include <time.h>
-#ifdef HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-#include <stdlib.h>
-#include "winternl.h"
 #include "miscemu.h"
 #include "wine/debug.h"
+#include "dosexe.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(int);
 
-#define        BCD_TO_BIN(x) ((x&15) + (x>>4)*10)
+#define BCD_TO_BIN(x) ((x&15) + (x>>4)*10)
 #define BIN_TO_BCD(x) ((x%10) + ((x/10)<<4))
 
 
 /**********************************************************************
- *         INT1A_GetTicksSinceMidnight
+ *         DOSVM_Int1aHandler
  *
- * Return number of clock ticks since midnight.
- */
-DWORD INT1A_GetTicksSinceMidnight(void)
-{
-    LARGE_INTEGER time;
-    TIME_FIELDS tf;
-
-    NtQuerySystemTime( &time );
-    RtlSystemTimeToLocalTime( &time, &time );
-    RtlTimeToTimeFields( &time, &tf );
-    return ((tf.Hour * 3600 + tf.Minute * 60 + tf.Second) * 18206 / 1000 +
-            tf.Milliseconds * 1000 / 54927);
-}
-
-
-/**********************************************************************
- *         DOSVM_Int1aHandler (WINEDOS16.126)
- *
- * Handler for int 1ah
- *     0x00 - 0x07 - date and time
- *     0x?? - 0x?? - Microsoft Real Time Compression Interface
+ * Handler for int 1ah.
  */
 void WINAPI DOSVM_Int1aHandler( CONTEXT86 *context )
 {
-    time_t ltime;
-    DWORD ticks;
-    struct tm *bdtime;
-
     switch(AH_reg(context))
     {
-       case 0x00:
-            ticks = INT1A_GetTicksSinceMidnight();
-            SET_CX( context, HIWORD(ticks) );
-            SET_DX( context, LOWORD(ticks) );
-            SET_AX( context, 0 );  /* No midnight rollover */
-            TRACE("int1a: AH=00 -- ticks=%ld\n", ticks);
-            break;
-
-       case 0x02:
-               ltime = time(NULL);
-               bdtime = localtime(&ltime);
-
-               SET_CX( context, (BIN_TO_BCD(bdtime->tm_hour)<<8) |
-                                  BIN_TO_BCD(bdtime->tm_min) );
-               SET_DX( context, (BIN_TO_BCD(bdtime->tm_sec)<<8) );
-
-       case 0x04:
-               ltime = time(NULL);
-               bdtime = localtime(&ltime);
-               SET_CX( context, (BIN_TO_BCD(bdtime->tm_year/100)<<8) |
-                                  BIN_TO_BCD((bdtime->tm_year-1900)%100) );
-               SET_DX( context, (BIN_TO_BCD(bdtime->tm_mon)<<8) |
-                                  BIN_TO_BCD(bdtime->tm_mday) );
-               break;
-
-               /* setting the time,date or RTC is not allow -EB */
-       case 0x01:
-               /* set system time */
-       case 0x03:
-               /* set RTC time */
-       case 0x05:
-               /* set RTC date */
-       case 0x06:
-               /* set ALARM */
-       case 0x07:
-               /* cancel ALARM */
-               break;
-
-        case 0xb0: /* Microsoft Real Time Compression */
-                switch AL_reg(context)
-                {
-                    case 0x01:
-                        /* not present */
-                        break;
-                    default:
-                        INT_BARF(context, 0x1a);
-                }
-                break;
+    case 0x00: /* GET SYSTEM TIME */
+        {
+            BIOSDATA *data = BIOS_DATA;
+            SET_CX( context, HIWORD(data->Ticks) );
+            SET_DX( context, LOWORD(data->Ticks) );
+            SET_AL( context, 0 ); /* FIXME: midnight flag is unsupported */
+            TRACE( "GET SYSTEM TIME - ticks=%ld\n", data->Ticks );
+        }
+        break;
+
+    case 0x01: /* SET SYSTEM TIME */
+        FIXME( "SET SYSTEM TIME - not allowed\n" );
+        break;
+
+    case 0x02: /* GET REAL-TIME CLOCK TIME */
+        TRACE( "GET REAL-TIME CLOCK TIME\n" );
+        {
+            SYSTEMTIME systime;
+            GetLocalTime( &systime );
+            SET_CH( context, BIN_TO_BCD(systime.wHour) );
+            SET_CL( context, BIN_TO_BCD(systime.wMinute) );
+            SET_DH( context, BIN_TO_BCD(systime.wSecond) );
+            SET_DL( context, 0 ); /* FIXME: assume no daylight saving */
+            RESET_CFLAG(context);
+        }
+        break;
+
+    case 0x03: /* SET REAL-TIME CLOCK TIME */
+        FIXME( "SET REAL-TIME CLOCK TIME - not allowed\n" );
+        break;
+
+    case 0x04: /* GET REAL-TIME CLOCK DATE */
+        TRACE( "GET REAL-TIME CLOCK DATE\n" );
+        {
+            SYSTEMTIME systime;
+            GetLocalTime( &systime );
+            SET_CH( context, BIN_TO_BCD(systime.wYear / 100) );
+            SET_CL( context, BIN_TO_BCD(systime.wYear % 100) );
+            SET_DH( context, BIN_TO_BCD(systime.wMonth) );
+            SET_DL( context, BIN_TO_BCD(systime.wDay) );
+            RESET_CFLAG(context);
+        }
+        break;
+
+    case 0x05: /* SET REAL-TIME CLOCK DATE */
+        FIXME( "SET REAL-TIME CLOCK DATE - not allowed\n" );
+        break;
+
+    case 0x06: /* SET ALARM */
+        FIXME( "SET ALARM - unimplemented\n" );
+        break;
+
+    case 0x07: /* CANCEL ALARM */
+        FIXME( "CANCEL ALARM - unimplemented\n" );
+        break;
+
+    case 0x08: /* SET RTC ACTIVATED POWER ON MODE */
+    case 0x09: /* READ RTC ALARM TIME AND STATUS */
+    case 0x0a: /* READ SYSTEM-TIMER DAY COUNTER */
+    case 0x0b: /* SET SYSTEM-TIMER DAY COUNTER */
+    case 0x0c: /* SET RTC DATE/TIME ACTIVATED POWER-ON MODE */
+    case 0x0d: /* RESET RTC DATE/TIME ACTIVATED POWER-ON MODE */
+    case 0x0e: /* GET RTC DATE/TIME ALARM AND STATUS */
+    case 0x0f: /* INITIALIZE REAL-TIME CLOCK */
+        INT_BARF( context, 0x1a );
+        break;
+
+    case 0xb0:
+        if (CX_reg(context) == 0x4d52 && 
+            DX_reg(context) == 0x4349 && 
+            AL_reg(context) == 0x01)
+        {
+            /*
+             * Microsoft Real-Time Compression Interface (MRCI).
+             * Ignoring this call indicates MRCI is not supported.
+             */
+            TRACE( "Microsoft Real-Time Compression Interface - not supported\n" );
+        }
+        else
+        {
+            INT_BARF(context, 0x1a);
+        }
+        break;
 
-       default:
-               INT_BARF( context, 0x1a );
+    default:
+        INT_BARF( context, 0x1a );
     }
 }




-- 
Jukka Heinonen <http://www.iki.fi/jhei/>



More information about the wine-patches mailing list