]> localhost Git - WindEmu.git/commitdiff
Bodge in a UART logger
authorGeorge Wright <gw@gwright.org.uk>
Thu, 5 Dec 2024 03:43:14 +0000 (19:43 -0800)
committerGeorge Wright <gw@gwright.org.uk>
Thu, 5 Dec 2024 03:43:14 +0000 (19:43 -0800)
WindCore/arm710.h
WindCore/sa1100.cpp
WindCore/sa1100/serial_3.h
WindCore/sa1100/uart.cpp
WindCore/sa1100/uart.h
WindQt/mainwindow.cpp
WindQt/mainwindow.ui

index 21d01ef93f122f17d97fb5520700fdd5c631ce62..72fab7d38404fcba8dd66aba442549eb21feb876 100644 (file)
@@ -1,5 +1,6 @@
 #pragma once
 #include <stdint.h>
+#include <functional>
 #include <optional>
 #include <variant>
 
@@ -118,10 +119,12 @@ public:
        }
 
        void setLogger(std::function<void(const char *)> newLogger) { logger = newLogger; }
+       void setSerialOutput(std::function<void(const char *)> newSerialOutput) { serialOutput = newSerialOutput; }
        uint32_t lastPcExecuted() const { return pcHistory[(pcHistoryIndex - 1) % PcHistoryCount].addr; }
 public:
        void log(const char *format, ...);
        void logPcHistory();
+       std::function<void(const char *)> serialOutput;
 private:
        std::function<void(const char *)> logger;
 
index 3e204ac4f7fae03332825d929e4be02e5e4b3460..6de60c610d34cf7e8e5bacfecbed1a257b62675a 100644 (file)
@@ -9,7 +9,7 @@ Emulator::Emulator() : EmuBase(true) {
     osTimer = new OsTimer();
        lcdController = new LCDController();
        gpioController = new GPIOController();
-       serial3 = new Serial3();
+       serial3 = new Serial3(serialOutput);
        resetController = new ResetController();
        intController = new IntController(lcdController, osTimer, gpioController, serial3);
        powerManager = new PowerManager();
index d25d5d1090c3dbf8e4d53f4e66d0d10a17f3c970..8335bede5be789863139ef49718ca308e20bcdb4 100644 (file)
@@ -34,7 +34,7 @@ class Serial3 {
     
   public:
     // Access
-    
+    Serial3(std::function<void(const char *)>& output) : m_UART(output) {}
     Uart const & get_UART() const { return m_UART; };
     
     inline void reset() { m_UART.reset(); }
index 66ab4b4670a87c1b09992d3f6bd64d9d53e52dc4..eb75e792a349e664d1a0d19e20b99e77d38563c5 100644 (file)
@@ -25,6 +25,44 @@ namespace SA1100
     // Becuase of using fifo[0], fifo has to reside in a consecutive memory blocks.
     // This is why I use std::vector rather than std::deque for m_tx_fifo.
     // reinterpret_cast<SerialConsole *>(mp_output_device)->put_char_to_serial_console(m_tx_fifo);
+    std::string output;
+
+      for (std::vector<uint8_t>::iterator iter = m_tx_fifo.begin();
+           iter != m_tx_fifo.end();
+           ++iter)
+      {
+        if ((*iter) & 0x80)
+        {
+          (*iter) = 0x20;
+        }
+      }
+      
+      if (0xd == m_tx_fifo.back())
+      {
+        output.append(reinterpret_cast<char const *>(&(m_tx_fifo[0])), m_tx_fifo.size());
+        
+        m_need_append_more = true;
+      }
+      else
+      {
+        if (true == m_need_append_more)
+        {
+          output.append(reinterpret_cast<char const *>(&(m_tx_fifo[0])), m_tx_fifo.size());
+          
+          m_need_append_more = false;
+        }
+        else
+        {
+          if (false == output.empty())
+          {
+            m_output(output.c_str());
+          }
+          
+          std::string lala = std::string(reinterpret_cast<char const *>(&(m_tx_fifo[0])), m_tx_fifo.size());
+          m_output(lala.c_str());
+        }
+      }
+
   }
 
   inline void Uart::rx_data() {
@@ -34,7 +72,7 @@ namespace SA1100
     // reinterpret_cast<SerialConsole *>(mp_output_device)->get_char_from_serial_console();
   }
   
-  Uart::Uart() {
+  Uart::Uart(std::function<void(const char *)>& output) : m_output(output) {
     init_register();
   }
   
index 8a83cd8a3c36e5d9073dc94a155da4ad3b4b7aeb..e6d3f9e2ebc3d91354bcab9184cdf468f2b29c7d 100644 (file)
@@ -21,7 +21,7 @@
 #include <cassert>
 #include <deque>
 #include <vector>
-
+#include <functional>
 #include <stdint.h>
 
 namespace SA1100
@@ -95,7 +95,9 @@ class Uart {
     // thus I use std::vector here.
     std::vector<uint8_t> m_tx_fifo;
     std::deque<uint8_t> m_rx_fifo;
-    
+    bool m_need_append_more = false;
+    std::function<void(const char *)>& m_output;
+
     // :NOTE: Wei 2004-Mar-22:
     //
     // For now, this mp_output_device is only used in Uart<Serial_3> to output to SerialConsole.
@@ -118,7 +120,7 @@ class Uart {
     void rx_data();
     
   public:
-    Uart();
+    Uart(std::function<void(const char *)>& output);
     void reset();
     
     inline void register_output_device(void * const output_device) {
index 3176ea113e35b8363cc68e7272d1e3f8259a100e..f016f4b8b45b72cabdadfdbdf8ebc2f9353d76c2 100644 (file)
@@ -19,6 +19,13 @@ MainWindow::MainWindow(EmuBase *emu, QWidget *parent) :
                ui->logView->appendPlainText(fullStr);
        });
 
+       emu->setSerialOutput([&](const char *str) {
+               QString string(str);
+               ui->serialConsole->moveCursor(QTextCursor::End);
+               ui->serialConsole->insertPlainText(str);
+               ui->serialConsole->moveCursor(QTextCursor::End);
+       });
+
     timer = new QTimer(this);
     timer->setInterval(1000/64);
     connect(timer, SIGNAL(timeout()), SLOT(execTimer()));
index d176e06a791d1e6a7742b0b0f0e168840bd48460..4bb46405b63816d20228c3989b384881e1d5efdd 100644 (file)
   </property>
   <widget class="QWidget" name="centralWidget">
    <layout class="QGridLayout" name="gridLayout">
+    <item row="0" column="0" colspan="6">
+     <widget class="QLabel" name="screen">
+      <property name="focusPolicy">
+       <enum>Qt::ClickFocus</enum>
+      </property>
+      <property name="text">
+       <string/>
+      </property>
+     </widget>
+    </item>
+    <item row="1" column="3">
+     <widget class="QPushButton" name="startButton">
+      <property name="text">
+       <string>Start</string>
+      </property>
+     </widget>
+    </item>
+    <item row="1" column="2">
+     <spacer name="horizontalSpacer">
+      <property name="orientation">
+       <enum>Qt::Horizontal</enum>
+      </property>
+      <property name="sizeHint" stdset="0">
+       <size>
+        <width>40</width>
+        <height>20</height>
+       </size>
+      </property>
+     </spacer>
+    </item>
+    <item row="3" column="0" colspan="5">
+     <widget class="QLabel" name="regsLabel">
+      <property name="font">
+       <font/>
+      </property>
+      <property name="text">
+       <string/>
+      </property>
+     </widget>
+    </item>
+    <item row="2" column="4">
+     <widget class="QPushButton" name="stepTickButton">
+      <property name="text">
+       <string>Step (Tick)</string>
+      </property>
+     </widget>
+    </item>
+    <item row="1" column="4">
+     <widget class="QPushButton" name="stopButton">
+      <property name="enabled">
+       <bool>false</bool>
+      </property>
+      <property name="text">
+       <string>Stop</string>
+      </property>
+     </widget>
+    </item>
     <item row="1" column="0">
      <widget class="QLabel" name="cycleCounter">
       <property name="text">
       </property>
      </widget>
     </item>
+    <item row="2" column="3">
+     <widget class="QPushButton" name="stepInsnButton">
+      <property name="text">
+       <string>Step (Insn)</string>
+      </property>
+     </widget>
+    </item>
+    <item row="5" column="0" colspan="5">
+     <widget class="QPlainTextEdit" name="logView"/>
+    </item>
     <item row="4" column="0" colspan="5">
      <widget class="QTabWidget" name="tabWidget">
       <property name="currentIndex">
-       <number>2</number>
+       <number>3</number>
       </property>
       <widget class="QWidget" name="tab">
        <attribute name="title">
         <item row="4" column="0" colspan="13">
          <widget class="QLabel" name="memoryViewLabel">
           <property name="font">
-           <font>
-            <family>Courier New</family>
-           </font>
+           <font/>
           </property>
           <property name="text">
            <string>TextLabel</string>
         <item>
          <widget class="QLabel" name="codeLabel">
           <property name="font">
-           <font>
-            <family>Courier New</family>
-           </font>
+           <font/>
           </property>
           <property name="text">
            <string>TextLabel</string>
         </item>
        </layout>
       </widget>
+      <widget class="QWidget" name="tab_4">
+       <attribute name="title">
+        <string>UART</string>
+       </attribute>
+       <layout class="QHBoxLayout" name="horizontalLayout">
+        <item>
+         <widget class="QTextEdit" name="serialConsole"/>
+        </item>
+       </layout>
+      </widget>
      </widget>
     </item>
-    <item row="3" column="0" colspan="5">
-     <widget class="QLabel" name="regsLabel">
-      <property name="font">
-       <font>
-        <family>Courier New</family>
-       </font>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-     </widget>
-    </item>
-    <item row="1" column="3">
-     <widget class="QPushButton" name="startButton">
-      <property name="text">
-       <string>Start</string>
-      </property>
-     </widget>
-    </item>
-    <item row="2" column="4">
-     <widget class="QPushButton" name="stepTickButton">
-      <property name="text">
-       <string>Step (Tick)</string>
-      </property>
-     </widget>
-    </item>
-    <item row="0" column="0" colspan="6">
-     <widget class="QLabel" name="screen">
-      <property name="focusPolicy">
-       <enum>Qt::ClickFocus</enum>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-     </widget>
-    </item>
-    <item row="2" column="3">
-     <widget class="QPushButton" name="stepInsnButton">
-      <property name="text">
-       <string>Step (Insn)</string>
-      </property>
-     </widget>
-    </item>
-    <item row="1" column="2">
-     <spacer name="horizontalSpacer">
-      <property name="orientation">
-       <enum>Qt::Horizontal</enum>
-      </property>
-      <property name="sizeHint" stdset="0">
-       <size>
-        <width>40</width>
-        <height>20</height>
-       </size>
-      </property>
-     </spacer>
-    </item>
-    <item row="1" column="4">
-     <widget class="QPushButton" name="stopButton">
-      <property name="enabled">
-       <bool>false</bool>
-      </property>
-      <property name="text">
-       <string>Stop</string>
-      </property>
-     </widget>
-    </item>
-    <item row="5" column="0" colspan="5">
-     <widget class="QPlainTextEdit" name="logView"/>
-    </item>
    </layout>
   </widget>
  </widget>