From 74daa7b891486fdd92cce0c67d076e29b93aeb1c Mon Sep 17 00:00:00 2001 From: "Juan J. Martinez" Date: Thu, 1 Jun 2023 23:51:05 +0100 Subject: Add timer to count ticks --- src/main.c | 12 +++++++++++- src/timer.c | 28 ++++++++++++++++++++++++++++ src/timer.h | 9 +++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/timer.c create mode 100644 src/timer.h diff --git a/src/main.c b/src/main.c index 2b01d3f..d83c18b 100644 --- a/src/main.c +++ b/src/main.c @@ -2,14 +2,22 @@ #include #include #include +#include #include -#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 +#include +#include +#include + +/* 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 */ -- cgit v1.2.3