From: George Wright Date: Tue, 10 Dec 2024 07:24:41 +0000 (-0800) Subject: More logging improvements X-Git-Url: http://git.gwright.org.uk/?a=commitdiff_plain;h=98335ae51c1368d2301bf04edb1d7aa061b6b36c;p=WindEmu.git More logging improvements --- diff --git a/WindCore/WindCore.pro b/WindCore/WindCore.pro index db3af5a..8df8efc 100644 --- a/WindCore/WindCore.pro +++ b/WindCore/WindCore.pro @@ -31,6 +31,7 @@ SOURCES += \ etna.cpp \ decoder.c \ decoder-arm.c \ + logger.cpp \ windermere.cpp \ sa1100.cpp \ sa1100/asic14.cpp \ @@ -63,6 +64,7 @@ HEADERS += \ common.h \ windermere.h \ sa1100.h \ + logger.h \ sa1100/asic14.h \ sa1100/gpio_controller.h \ sa1100/interrupt_controller.h \ diff --git a/WindCore/logger.cpp b/WindCore/logger.cpp new file mode 100644 index 0000000..7fa0389 --- /dev/null +++ b/WindCore/logger.cpp @@ -0,0 +1,20 @@ +#include "logger.h" + +static uint64_t sEventNumber = 0; + +uint64_t getNextEventNumber() { + return sEventNumber++; +} + +uint64_t getEventNumber() { + return sEventNumber; +} + +static uint32_t sCurrentPC = 0; + +void setPC(uint32_t pc) { + sCurrentPC = pc; +} +uint32_t getPC() { + return sCurrentPC; +} \ No newline at end of file diff --git a/WindCore/logger.h b/WindCore/logger.h new file mode 100644 index 0000000..6887925 --- /dev/null +++ b/WindCore/logger.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +uint64_t getNextEventNumber(); +uint64_t getEventNumber(); + +void setPC(uint32_t); +uint32_t getPC(); + +#define LOG_REG_W(name, addr, value) \ + printf("%llu: (%08x) [W] %s [%08x] <= %08x\n", getNextEventNumber(), getPC(), name, addr, value) + +#define LOG_REG_R(name, addr, value) \ + printf("%llu: (%08x) [R] %s [%08x] => %08x\n", getNextEventNumber(), getPC(), name, addr, value) diff --git a/WindCore/sa1100.cpp b/WindCore/sa1100.cpp index ebbbc2a..287db68 100644 --- a/WindCore/sa1100.cpp +++ b/WindCore/sa1100.cpp @@ -964,6 +964,7 @@ bool Emulator::executeUntil(int64_t cycles) { } while (!asleep && passedCycles < cycles) { + setPC(getGPR(15) - 0x8); if (passedCycles >= nextTickAt) { // increment RTCDIV if ((pwrsr & 0x3F) == 0x3F) { diff --git a/WindCore/sa1100/os_timer.cpp b/WindCore/sa1100/os_timer.cpp index 19331b4..f21f86e 100644 --- a/WindCore/sa1100/os_timer.cpp +++ b/WindCore/sa1100/os_timer.cpp @@ -94,7 +94,7 @@ namespace SA1100 { return m_OSMR[3]; case OSCR: - LOG_REG_R("OSTimer OSCR", address, m_OSCR); + //LOG_REG_R("OSTimer OSCR", address, m_OSCR); return m_OSCR; case OSSR: @@ -118,26 +118,34 @@ namespace SA1100 { void OsTimer::put_data(uint32_t const address, uint32_t const value) { switch (address) { - case OSMR0: + case OSMR0: { LOG_REG_W("OSTimer OSMR0", address, value); + auto delta = value - m_OSCR; + printf("OSTimer 0 set to %d ticks (%fms)\n", delta, delta / 3686.400f); m_OSMR[0] = value; break; - - case OSMR1: + } + case OSMR1: { LOG_REG_W("OSTimer OSMR1", address, value); + auto delta = value - m_OSCR; + printf("OSTimer 1 set to %d ticks (%fms)\n", delta, delta / 3686.400f); m_OSMR[1] = value; break; - - case OSMR2: + } + case OSMR2: { LOG_REG_W("OSTimer OSMR2", address, value); + auto delta = value - m_OSCR; + printf("OSTimer 2 set to %d ticks (%fms)\n", delta, delta / 3686.400f); m_OSMR[2] = value; break; - - case OSMR3: + } + case OSMR3: { LOG_REG_W("OSTimer OSMR3", address, value); + auto delta = value - m_OSCR; + printf("OSTimer 3 set to %d ticks (%fms)\n", delta, delta / 3686.400f); m_OSMR[3] = value; break; - + } case OSCR: LOG_REG_W("OSTimer OSCR", address, value); m_OSCR = value;