From da91ec4d1b9cbc2376951dd685115babfc97c3d8 Mon Sep 17 00:00:00 2001 From: MadMaurice Date: Tue, 19 Sep 2023 23:20:42 +0200 Subject: [PATCH] timer - Start implementing timer --- Makeconf | 3 ++- timer/timer.cpp | 24 ++++++++++++++++++++++++ timer/timer.h | 17 +++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 timer/timer.cpp create mode 100644 timer/timer.h diff --git a/Makeconf b/Makeconf index 580c870..ae10550 100644 --- a/Makeconf +++ b/Makeconf @@ -1,6 +1,6 @@ TARGETS := libemu.a vgbc vgbc.test vgbc.inspect vgbc.gbdif vgbc.lcdtest -sfml_packages := sfml-graphics +sfml_packages := sfml-graphics sfml-system sfml_CXXFLAGS := $(shell pkg-config --cflags $(sfml_packages)) sfml_LDFLAGS := $(shell pkg-config --libs $(sfml_packages)) @@ -21,6 +21,7 @@ modules_libemu.a := memory/device.o \ lcd/lcd.o \ lcd/palette.o \ input/joypad.o \ + timer/timer.o \ modules_vgbc := main.o libemu.a verb_vgbc := link diff --git a/timer/timer.cpp b/timer/timer.cpp new file mode 100644 index 0000000..c1106d3 --- /dev/null +++ b/timer/timer.cpp @@ -0,0 +1,24 @@ +#include + +void TimerDiv::write8(u16 addr, u8 data) +{ + switch(addr) { + case 0x0000: // DIV + divClock.restart(); + break; + } +} + +u8 TimerDiv::read8(u16 addr) +{ + switch(addr) { + case 0x0000: // DIV + { + sf::Time elapsed = divClock.getElapsedTime(); + sf::Int64 regval = elapsed.asMicroseconds(); + return (regval * 16384 / 1000000) & 0xFF; + } + default: + return 0x00; + } +} diff --git a/timer/timer.h b/timer/timer.h new file mode 100644 index 0000000..9f20cc0 --- /dev/null +++ b/timer/timer.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include +#include +#include + +class TimerDiv : public Mem_device { +private: + sf::Clock divClock; + +public: + TimerDiv() = default; + + virtual void write8(u16 addr, u8 data); + virtual u8 read8(u16 addr); +};