From 535e5052a30761c0b42531b1448501b1163f86d8 Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Thu, 28 May 2020 04:00:28 +0900 Subject: [PATCH] [VM][FMTOWNS][TIMER] Add 16bit read/write freerun counter and interval timer. --- source/src/vm/fmtowns/timer.cpp | 28 ++++++++++++++++++++++++++++ source/src/vm/fmtowns/timer.h | 4 ++++ 2 files changed, 32 insertions(+) diff --git a/source/src/vm/fmtowns/timer.cpp b/source/src/vm/fmtowns/timer.cpp index 641e8612b..6e6f3c753 100644 --- a/source/src/vm/fmtowns/timer.cpp +++ b/source/src/vm/fmtowns/timer.cpp @@ -41,6 +41,19 @@ void TIMER::reset() } do_interval(); } +void TIMER::write_io16(uint32_t addr, uint32_t data) +{ + switch(addr & 0xfffe) { + case 0x006a: // Interval control + interval_us.w = data; + do_interval(); + break; + default: + write_io8(addr, data); + break; + } +} + void TIMER::write_io8(uint32_t addr, uint32_t data) { switch(addr) { @@ -107,6 +120,21 @@ void TIMER::do_interval(void) } } } + +uint32_t TIMER::read_io16(uint32_t addr) +{ + switch(addr & 0xfffe) { + case 0x0026: + free_run_counter = (uint16_t)get_passed_usec(0); + return free_run_counter & 0xffff; + break; + case 0x006a: // Interval control + return interval_us.w; + break; + } + return read_io8(addr); +} + uint32_t TIMER::read_io8(uint32_t addr) { switch(addr) { diff --git a/source/src/vm/fmtowns/timer.h b/source/src/vm/fmtowns/timer.h index d496fb37b..a6e6a581a 100644 --- a/source/src/vm/fmtowns/timer.h +++ b/source/src/vm/fmtowns/timer.h @@ -62,7 +62,11 @@ public: virtual void event_callback(int id, int err); void __FASTCALL write_io8(uint32_t addr, uint32_t data); + void __FASTCALL write_io16(uint32_t addr, uint32_t data); + uint32_t __FASTCALL read_io8(uint32_t addr); + uint32_t __FASTCALL read_io16(uint32_t addr); + void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask); bool process_state(FILEIO* state_fio, bool loading); -- 2.11.0