winedos: Always run the BIOS tick timer.
diff --git a/dlls/kernel32/dosmem.c b/dlls/kernel32/dosmem.c
index f162139..d8ea03b 100644
--- a/dlls/kernel32/dosmem.c
+++ b/dlls/kernel32/dosmem.c
@@ -115,7 +115,6 @@
                 GET_ADDR(outport);
                 GET_ADDR(EmulateInterruptPM);
                 GET_ADDR(CallBuiltinHandler);
-                GET_ADDR(BiosTick);
 #undef GET_ADDR
             }
             RtlRemoveVectoredExceptionHandler( dosmem_handler );
diff --git a/dlls/kernel32/instr.c b/dlls/kernel32/instr.c
index 7fdc4cd..7f5ddc4 100644
--- a/dlls/kernel32/instr.c
+++ b/dlls/kernel32/instr.c
@@ -106,13 +106,6 @@
 {
     if (*sel == 0x40)
     {
-        static WORD sys_timer = 0;
-        if (!sys_timer)
-        {
-            if (!winedos.BiosTick) load_winedos();
-            if (winedos.BiosTick)
-                sys_timer = CreateSystemTimer( 55, winedos.BiosTick );
-        }
         *sel = DOSMEM_BiosDataSeg;
         return TRUE;
     }
diff --git a/dlls/kernel32/kernel_private.h b/dlls/kernel32/kernel_private.h
index 386bab2..a65d93f 100644
--- a/dlls/kernel32/kernel_private.h
+++ b/dlls/kernel32/kernel_private.h
@@ -137,7 +137,6 @@
     void (WINAPI *CallBuiltinHandler)( CONTEXT86 *context, BYTE intnum );
     DWORD (WINAPI *inport)( int port, int size );
     void (WINAPI *outport)( int port, int size, DWORD val );
-    void (* BiosTick)(WORD timer);
 } winedos;
 
 /* returns directory handle for named objects */
diff --git a/dlls/winedos/dosmem.c b/dlls/winedos/dosmem.c
index d453da3..06823f8 100644
--- a/dlls/winedos/dosmem.c
+++ b/dlls/winedos/dosmem.c
@@ -224,10 +224,25 @@
  *
  * Increment the BIOS tick counter. Called by timer signal handler.
  */
-void BiosTick( WORD timer )
+static void CALLBACK BiosTick( LPVOID arg, DWORD low, DWORD high )
 {
-    BIOSDATA *pBiosData = DOSVM_BiosData();
-    if (pBiosData) pBiosData->Ticks++;
+    BIOSDATA *pBiosData = arg;
+    pBiosData->Ticks++;
+}
+
+/***********************************************************************
+ *           timer_thread
+ */
+static DWORD CALLBACK timer_thread( void *arg )
+{
+    LARGE_INTEGER when;
+    HANDLE timer;
+
+    if (!(timer = CreateWaitableTimerA( NULL, FALSE, NULL ))) return 0;
+
+    when.u.LowPart = when.u.HighPart = 0;
+    SetWaitableTimer( timer, &when, 55 /* actually 54.925 */, BiosTick, arg, FALSE );
+    for (;;) SleepEx( INFINITE, TRUE );
 }
 
 /***********************************************************************
@@ -488,6 +503,8 @@
      * Set DOS memory base and initialize conventional memory.
      */
     DOSMEM_InitMemory(DOSMEM_dosmem + reserve);
+
+    CloseHandle( CreateThread( NULL, 0, timer_thread, DOSVM_BiosData(), 0, NULL ));
     return TRUE;
 }
 
diff --git a/dlls/winedos/winedos.spec b/dlls/winedos/winedos.spec
index 98f9048..6847874 100644
--- a/dlls/winedos/winedos.spec
+++ b/dlls/winedos/winedos.spec
@@ -11,6 +11,3 @@
 @ cdecl FreeDosBlock(ptr) DOSMEM_FreeBlock
 @ cdecl AllocDosBlock(long ptr) DOSMEM_AllocBlock
 @ cdecl ResizeDosBlock(ptr long long) DOSMEM_ResizeBlock
-
-# BIOS functions
-@ cdecl BiosTick(long)