diff options
author | Oxore <oxore@protonmail.com> | 2022-10-03 00:31:53 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2022-10-03 00:31:53 +0300 |
commit | 872d2c2766536a372af5d1048bed7514078f9d31 (patch) | |
tree | 7d4071d664214d500d1be710add46b1f7486c350 /vdp.cpp | |
parent | 897c498b543f88d9b97f39e7a8f3aa691d11cc37 (diff) |
Impl vblank irq
Diffstat (limited to 'vdp.cpp')
-rw-r--r-- | vdp.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
@@ -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 = {}; |