diff options
author | Juan J. Martinez <jjm@usebox.net> | 2023-06-01 23:51:05 +0100 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2023-06-01 23:51:05 +0100 |
commit | 74daa7b891486fdd92cce0c67d076e29b93aeb1c (patch) | |
tree | 97ce20fb058a798c0d6c48250301fd56f6d9eba5 | |
parent | afc7ea1e4f667c16100677a3fe6d9b27278a8635 (diff) | |
download | gold-mine-run-74daa7b891486fdd92cce0c67d076e29b93aeb1c.tar.gz gold-mine-run-74daa7b891486fdd92cce0c67d076e29b93aeb1c.zip |
Add timer to count ticks
-rw-r--r-- | src/main.c | 12 | ||||
-rw-r--r-- | src/timer.c | 28 | ||||
-rw-r--r-- | src/timer.h | 9 |
3 files changed, 48 insertions, 1 deletions
@@ -2,14 +2,22 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <crt0.h> #include <conio.h> -#include "data.h" +#include "timer.h" #include "vga.h" +#include "data.h" + +/* disable paging because our int handlers are written in C */ +int _crt0_startup_flags = _CRT0_FLAG_LOCK_MEMORY; int main(int argc, char *argv[]) { + timer_init(); + atexit(timer_free); + /* set VGA 320x200, 256 col */ set_mode(0x13); @@ -36,5 +44,7 @@ int main(int argc, char *argv[]) set_mode(3); close_framebuffer(); + printf("tick is %li\n", ticks); + return 0; } 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"); +} diff --git a/src/timer.h b/src/timer.h new file mode 100644 index 0000000..22ef6d2 --- /dev/null +++ b/src/timer.h @@ -0,0 +1,9 @@ +#ifndef _TIMER_H +#define _TIMER_H + +extern volatile uint32_t ticks; + +void timer_init(); +void timer_free(); + +#endif /* _TIMER_H */ |