]> localhost Git - WindEmu.git/commitdiff
More logging improvements
authorGeorge Wright <gw@gwright.org.uk>
Tue, 10 Dec 2024 07:24:41 +0000 (23:24 -0800)
committerGeorge Wright <gw@gwright.org.uk>
Tue, 10 Dec 2024 07:24:41 +0000 (23:24 -0800)
WindCore/WindCore.pro
WindCore/logger.cpp [new file with mode: 0644]
WindCore/logger.h [new file with mode: 0644]
WindCore/sa1100.cpp
WindCore/sa1100/os_timer.cpp

index db3af5a0638cc2e03df21c7fd132b6435b19763a..8df8efc480606ae31741d7da511975be88b255c4 100644 (file)
@@ -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 (file)
index 0000000..7fa0389
--- /dev/null
@@ -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 (file)
index 0000000..6887925
--- /dev/null
@@ -0,0 +1,16 @@
+#pragma once
+
+#include <stdio.h>
+#include <stdint.h>
+
+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)
index ebbbc2a836dee74badafafcd636582350f707001..287db682ddca3597279e34a29046c5800f6c0e53 100644 (file)
@@ -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) {
index 19331b40f4ca137a0b44afd3ba8ac175b070b78e..f21f86e8dcbdaa6fecc794922bcb9e571bbcc687 100644 (file)
@@ -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;