From 07f73c2fb9f9c11a729d23eadd95e55e6f23c02a Mon Sep 17 00:00:00 2001
From: mjbudd77 <mjbudd77@gmail.com>
Date: Thu, 19 Aug 2021 18:46:02 -0400
Subject: [PATCH] First cut at implementing instruction step back function
 using trace logger data.

---
 src/drivers/Qt/ConsoleDebugger.cpp |  8 ++++-
 src/drivers/Qt/TraceLogger.cpp     | 53 ++++++++++++++++++++++++++++++
 src/drivers/Qt/TraceLogger.h       |  2 ++
 3 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/src/drivers/Qt/ConsoleDebugger.cpp b/src/drivers/Qt/ConsoleDebugger.cpp
index c2136cff..900d8f6e 100644
--- a/src/drivers/Qt/ConsoleDebugger.cpp
+++ b/src/drivers/Qt/ConsoleDebugger.cpp
@@ -207,6 +207,9 @@ ConsoleDebugger::ConsoleDebugger(QWidget *parent)
 	       pcColorAct->connectColor( &asmView->pcBgColor);
 
 	connect( this, SIGNAL(rejected(void)), this, SLOT(deleteLater(void)));
+
+	// Start Trace Logger for Step Back Function 
+	FCEUD_TraceLoggerStart();
 }
 //----------------------------------------------------------------------------
 ConsoleDebugger::~ConsoleDebugger(void)
@@ -2750,7 +2753,10 @@ void ConsoleDebugger::debugStepBackCB(void)
 {
 	if (FCEUI_EmulationPaused()) 
 	{
-
+		fceuWrapperLock();
+		FCEUD_TraceLoggerBackUpInstruction();
+		updateWindowData();
+		fceuWrapperUnLock();
 	}
 }
 //----------------------------------------------------------------------------
diff --git a/src/drivers/Qt/TraceLogger.cpp b/src/drivers/Qt/TraceLogger.cpp
index 4c4d1c1a..b4b5807d 100644
--- a/src/drivers/Qt/TraceLogger.cpp
+++ b/src/drivers/Qt/TraceLogger.cpp
@@ -1191,6 +1191,19 @@ static void pushMsgToLogBuffer(const char *msg)
 	pushToLogBuffer(rec);
 }
 //----------------------------------------------------
+int FCEUD_TraceLoggerStart(void)
+{
+	if ( !logging )
+	{
+		if (recBufMax == 0)
+		{
+			initTraceLogBuffer(1000000);
+		}
+		logging = 1;
+	}
+	return logging;
+}
+//----------------------------------------------------
 int FCEUD_TraceLoggerRunning(void)
 {
 	return logging;
@@ -2459,3 +2472,43 @@ void TraceLogDiskThread_t::run(void)
 	emit finished();
 }
 //----------------------------------------------------
+//---  Trace Logger BackUp (Undo) Instruction
+//----------------------------------------------------
+static int undoInstruction( traceRecord_t &rec )
+{
+	// TODO Undo memory writes
+	//printf("BackUp (Undo) Instruction\n");
+	X.PC = rec.cpu.PC;
+	X.A  = rec.cpu.A;
+	X.X  = rec.cpu.X;
+	X.Y  = rec.cpu.Y;
+	X.S  = rec.cpu.S;
+	X.P  = rec.cpu.P;
+
+	return 0;
+}
+//----------------------------------------------------
+int FCEUD_TraceLoggerBackUpInstruction(void)
+{
+	int ret, idx;
+
+	if ( recBufNum <= 0 )
+	{
+		return -1;
+	}
+	idx = recBufHead - 1;
+
+	if ( idx < 0 )
+	{
+		idx += recBufMax;
+	}
+	ret = undoInstruction( recBuf[idx] );
+
+	if ( ret == 0 )
+	{
+		recBufNum--;
+		recBufHead = idx;
+	}
+	return ret;
+}
+//----------------------------------------------------
diff --git a/src/drivers/Qt/TraceLogger.h b/src/drivers/Qt/TraceLogger.h
index ad1bfed4..25d35df7 100644
--- a/src/drivers/Qt/TraceLogger.h
+++ b/src/drivers/Qt/TraceLogger.h
@@ -226,4 +226,6 @@ int initTraceLogBuffer(int maxRecs);
 
 void openTraceLoggerWindow(QWidget *parent);
 
+int FCEUD_TraceLoggerStart(void);
 int FCEUD_TraceLoggerRunning(void);
+int FCEUD_TraceLoggerBackUpInstruction(void);