aboutsummaryrefslogtreecommitdiff
path: root/src/timer.c
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2023-06-01 23:51:05 +0100
committerJuan J. Martinez <jjm@usebox.net>2023-06-01 23:51:05 +0100
commit74daa7b891486fdd92cce0c67d076e29b93aeb1c (patch)
tree97ce20fb058a798c0d6c48250301fd56f6d9eba5 /src/timer.c
parentafc7ea1e4f667c16100677a3fe6d9b27278a8635 (diff)
downloadgold-mine-run-74daa7b891486fdd92cce0c67d076e29b93aeb1c.tar.gz
gold-mine-run-74daa7b891486fdd92cce0c67d076e29b93aeb1c.zip
Add timer to count ticks
Diffstat (limited to 'src/timer.c')
-rw-r--r--src/timer.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/timer.c b/src/timer.c
new file mode 100644
index 0000000..73675dc
--- /dev/null
+++ b/src/timer.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <go32.h>
+#include <dpmi.h>
+
+/* updates 18.2 times per second by default */
+volatile uint32_t ticks = 0;
+
+static _go32_dpmi_seginfo old_handler, new_handler;
+
+static void timer_handler()
+{
+ ticks++;
+}
+
+void timer_init()
+{
+ _go32_dpmi_get_protected_mode_interrupt_vector(0x1c, &old_handler);
+ new_handler.pm_offset = (unsigned long)timer_handler;
+ new_handler.pm_selector = _go32_my_cs();
+ _go32_dpmi_chain_protected_mode_interrupt_vector(0x1c, &new_handler);
+}
+
+void timer_free()
+{
+ if (_go32_dpmi_set_protected_mode_interrupt_vector(0x1c, &old_handler) == -1)
+ fprintf(stderr, "Failed to free the timer :(\n");
+}