mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2024-11-26 23:55:40 +00:00
193 lines
4.7 KiB
C++
193 lines
4.7 KiB
C++
/**
|
|
** Supermodel
|
|
** A Sega Model 3 Arcade Emulator.
|
|
** Copyright 2011 Bart Trzynadlowski, Nik Henson
|
|
**
|
|
** This file is part of Supermodel.
|
|
**
|
|
** Supermodel is free software: you can redistribute it and/or modify it under
|
|
** the terms of the GNU General Public License as published by the Free
|
|
** Software Foundation, either version 3 of the License, or (at your option)
|
|
** any later version.
|
|
**
|
|
** Supermodel is distributed in the hope that it will be useful, but WITHOUT
|
|
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
** more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License along
|
|
** with Supermodel. If not, see <http://www.gnu.org/licenses/>.
|
|
**/
|
|
|
|
/*
|
|
* ConsoleDebugger.h
|
|
*/
|
|
|
|
#ifdef SUPERMODEL_DEBUGGER
|
|
#ifndef INCLUDED_CONSOLEDEBUGGER_H
|
|
#define INCLUDED_CONSOLEDEBUGGER_H
|
|
|
|
#include "Debugger.h"
|
|
#include "CodeAnalyser.h"
|
|
#include "Types.h"
|
|
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
|
|
#define NUM_LISTAUTOLABELS (sizeof(s_listAutoLabels) / sizeof(ELabelFlags))
|
|
|
|
namespace Debugger
|
|
{
|
|
class CCPUDebug;
|
|
class CException;
|
|
class CWatch;
|
|
class CBreakpoint;
|
|
class CRegister;
|
|
class CRegMonitor;
|
|
|
|
/*
|
|
* Base class for a console-based debugger.
|
|
* TODO - a lot of commands are not yet implemented/missing and the main loop is a big ugly mess :-) !
|
|
*/
|
|
class CConsoleDebugger : public CDebugger
|
|
{
|
|
private:
|
|
static ELabelFlags s_listAutoLabels[];
|
|
|
|
CCPUDebug *m_cpu;
|
|
|
|
bool m_nextFrame;
|
|
unsigned m_nextFrameCount;
|
|
|
|
UINT32 m_listDism;
|
|
UINT32 m_listMem;
|
|
|
|
bool m_analyseCode;
|
|
EFormat m_addrFmt;
|
|
EFormat m_portFmt;
|
|
EFormat m_dataFmt;
|
|
bool m_showLabels;
|
|
bool m_labelsOverAddr;
|
|
bool m_showOpCodes;
|
|
unsigned m_memBytesPerRow;
|
|
|
|
FILE *m_file;
|
|
|
|
protected:
|
|
void Read(char *str, size_t maxLen);
|
|
|
|
void Print(const char *fmtStr, ...);
|
|
|
|
void Error(const char *fmtStr, ...);
|
|
|
|
void PrintVL(const char *fmtStr, va_list vl);
|
|
|
|
void Flush();
|
|
|
|
bool CheckToken(const char *token, const char *simple, const char *full);
|
|
|
|
bool CheckToken(const char *token, const char *simple, const char *full, char *modifier, size_t modSize, const char *defaultMod);
|
|
|
|
void Truncate(char *dst, size_t maxLen, const char *src);
|
|
|
|
void UpperFirst(char *dst, const char *src);
|
|
|
|
void FormatOpCodes(char *str, int addr, int codesLen);
|
|
|
|
bool GetLabelText(char *str, int maxLen, UINT32 addr);
|
|
|
|
bool SetBoolConfig(const char *str, bool &cfg);
|
|
|
|
bool SetNumConfig(const char *str, unsigned &cfg);
|
|
|
|
const char *GetFmtConfig(EFormat fmt);
|
|
|
|
bool SetFmtConfig(const char *str, EFormat &cfg);
|
|
|
|
bool ParseAddress(const char *str, UINT32 *addr);
|
|
|
|
const char *GetDataSizeStr(unsigned dataSize, bool shortName);
|
|
|
|
bool ParseDataSize(const char *str, unsigned &dataSize);
|
|
|
|
bool ParseFormat(const char *str, EFormat &fmt);
|
|
|
|
bool ParseCPU(const char *str, CCPUDebug *&cpu);
|
|
|
|
bool ParseRegister(const char *str, CRegister *®);
|
|
|
|
void ListCPUs();
|
|
|
|
void ListRegisters();
|
|
|
|
void ListExceptions();
|
|
|
|
void ListInterrupts();
|
|
|
|
void ListIOs();
|
|
|
|
void ListRegions();
|
|
|
|
void ListLabels(bool customLabels, ELabelFlags autoLabelFlags);
|
|
|
|
void GetAllMemWatches(vector<CWatch*> &watches);
|
|
|
|
int GetIndexOfMemWatch(CWatch *watch);
|
|
|
|
void ListMemWatches();
|
|
|
|
void GetAllPortWatches(vector<CWatch*> &watches);
|
|
|
|
int GetIndexOfPortWatch(CWatch *watch);
|
|
|
|
void ListPortWatches();
|
|
|
|
void ListBreakpoints();
|
|
|
|
void ListMonitors();
|
|
|
|
UINT32 ListDisassembly(UINT32 start, UINT32 end, unsigned numInstrs);
|
|
|
|
UINT32 ListMemory(UINT32 start, UINT32 end, unsigned bytesPerRow);
|
|
|
|
virtual void ApplyConfig();
|
|
|
|
virtual void Attached();
|
|
|
|
virtual void Detaching();
|
|
|
|
virtual void AnalysisUpdated(CCodeAnalyser *analyser);
|
|
|
|
virtual void ExceptionTrapped(CException *ex);
|
|
|
|
virtual void InterruptTrapped(CInterrupt *ex);
|
|
|
|
virtual void MemWatchTriggered(CWatch *watch, UINT32 addr, unsigned dataSize, UINT64 data, bool isRead);
|
|
|
|
virtual void IOWatchTriggered(CWatch *watch, CIO *io, UINT64 data, bool isInput);
|
|
|
|
virtual void BreakpointReached(CBreakpoint *bp);
|
|
|
|
virtual void MonitorTriggered(CRegMonitor *regMon);
|
|
|
|
virtual void ExecutionHalted(CCPUDebug *cpu, EHaltReason reason);
|
|
|
|
virtual void WaitCommand(CCPUDebug *cpu);
|
|
|
|
virtual bool ProcessToken(const char *token, const char *cmd);
|
|
|
|
virtual void Log(CCPUDebug *cpu, const char *typeStr, const char *fmtStr, va_list vl);
|
|
|
|
public:
|
|
CConsoleDebugger();
|
|
|
|
void Attach();
|
|
|
|
void Detach();
|
|
|
|
virtual void Poll();
|
|
};
|
|
}
|
|
|
|
#endif // INCLUDED_CONSOLEDEBUGGER_H
|
|
#endif // SUPERMODEL_DEBUGGER
|