kerneltest/e32test/system/d_mstim.cia
changeset 9 96e5fb8b040d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/system/d_mstim.cia	Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+#include "plat_priv.h"
+#include "d_mstim.h"
+
+#if defined(__X86__)
+typedef TUint TCounter;
+TUint32* TickCountPtr;
+
+const TLinAddr NTimerQ_TimerAddress = (TLinAddr)&NTimerQ::TimerAddress;
+
+__NAKED__ TCounter TIMER()
+	{
+	asm("mov eax, [%a0]": :"i"(&TickCountPtr));
+	asm("pushfd");
+	asm("mov eax, [eax]");
+	asm("cli");
+	asm("shl eax, 16");
+	asm("mov al, 0x80");	// channel 2 latch cmd
+	asm("out 0x43, al");
+	asm("in al, 0x42");		// get ls byte
+	asm("mov ah, al");
+	asm("in al, 0x42");		// get ms byte
+	asm("xchg al, ah");
+	asm("popfd");
+	asm("ret");
+	}
+
+__NAKED__ void SetUpTimerChannel2()
+	{
+	asm("pushfd");
+	asm("cli");
+	asm("in al, 0x61");
+	asm("and al, 0xfc");	// disable speaker
+	asm("or al, 1");		// enable timer channel 2
+	asm("out 0x61, al");
+	asm("mov al, 0xb4");
+	asm("out 0x43, al");	// timer chan 2 mode 2
+	asm("mov al, 0");
+	asm("out 0x42, al");	// initial count 0 = free running
+	asm("out 0x42, al");
+	asm("popfd");
+	asm("call %a0": :"i"(NTimerQ_TimerAddress));
+	asm("lea eax, [eax+%0]": :"i"_FOFF(NTimerQ,iMsCount));
+	asm("mov [%a0], eax": :"i"(&TickCountPtr));
+	asm("ret");
+	}
+#endif