symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_rtc.py
changeset 1 2fb8b9db1c86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_rtc.py	Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,53 @@
+import qemu
+
+class syborg_timer(qemu.devclass):
+  REG_ID            = 0
+  REG_LATCH         = 1
+  REG_DATA_LOW      = 2
+  REG_DATA_HIGH     = 3
+
+  def create(self):
+    self.data = 0
+    self.offset = qemu.start_time() * 1000000 - qemu.get_clock()
+
+  def read_reg(self, offset):
+    offset >>= 2
+    if offset == self.REG_ID:
+      return 0xc51d0004
+    elif offset == self.REG_DATA_LOW:
+      return self.data & 0xffffffff
+    elif offset == self.REG_DATA_HIGH:
+      return (self.data >> 32) & 0xffffffff
+    return 0
+
+  def write_reg(self, offset, value):
+    offset >>= 2
+    if offset == self.REG_LATCH:
+      now = qemu.get_clock()
+      if value >= 4:
+        self.offset = self.data - now
+      else:
+        self.data = now + self.offset
+        while value:
+          self.data /= 1000
+          value -= 1;
+    elif offset == self.REG_DATA_LOW:
+      self.data = (self.data & ~0xffffffff) | value
+    elif offset == self.REG_DATA_HIGH:
+      self.data = (self.data & 0xffffffff) | (value << 32)
+
+  def save(self, f):
+    f.put_s64(self.offset)
+    f.put_u64(self.data)
+
+  def load(self, f):
+    self.offset = f.get_s64()
+    self.data = f.get_u64()
+
+  # Device class properties
+  regions = [qemu.ioregion(0x1000, readl=read_reg, writel=write_reg)]
+  irqs = 0
+  name = "syborg,rtc"
+  properties = {}
+
+qemu.register_device(syborg_timer)