summaryrefslogtreecommitdiff
path: root/vdp.cpp
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2022-10-03 00:31:53 +0300
committerOxore <oxore@protonmail.com>2022-10-03 00:31:53 +0300
commit872d2c2766536a372af5d1048bed7514078f9d31 (patch)
tree7d4071d664214d500d1be710add46b1f7486c350 /vdp.cpp
parent897c498b543f88d9b97f39e7a8f3aa691d11cc37 (diff)
Impl vblank irq
Diffstat (limited to 'vdp.cpp')
-rw-r--r--vdp.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/vdp.cpp b/vdp.cpp
index 74b9f65..e497bdf 100644
--- a/vdp.cpp
+++ b/vdp.cpp
@@ -2,6 +2,7 @@
*/
#include "vdp.hpp"
+#include "musashi-m68k/m68k.h"
#include <cstring>
#include <cstdio>
@@ -75,6 +76,36 @@ void VDP::Write(const uint32_t offset, const enum bitness bitness, const uint32_
}
}
+#define MODESET2_DISP_MASK (1)
+#define MODESET2_DISP_SHIFT (6)
+#define MODESET2_DISP_EXTRACT(reg) \
+ (((reg) & (MODESET2_DISP_MASK << MODESET2_DISP_SHIFT)) >> MODESET2_DISP_SHIFT)
+
+#define MODESET2_IE0_MASK (1)
+#define MODESET2_IE0_SHIFT (5)
+#define MODESET2_IE0_EXTRACT(reg) \
+ (((reg) & (MODESET2_IE0_MASK << MODESET2_IE0_SHIFT)) >> MODESET2_IE0_SHIFT)
+
+bool VDP::Scanline()
+{
+ const uint16_t mode_set_2 = _reg[static_cast<size_t>(RegID::kModeSet2)];
+ if (!MODESET2_DISP_EXTRACT(mode_set_2)) {
+ return true;
+ }
+ _lines_counter++;
+ const uint16_t lines_per_screen = _status.pal_mode ? kLinesPerScreenPAL : kLinesPerScreenNTSC;
+ if (_lines_counter >= lines_per_screen) {
+ _lines_counter = 0;
+ if (MODESET2_IE0_EXTRACT(mode_set_2)) {
+ m68k_set_irq(6);
+ _status.vblank = true;
+ return true;
+ }
+ }
+ _status.vblank = false;
+ return false;
+}
+
void VDP::Reset()
{
_status = {};