mirror of
https://github.com/holub/mame
synced 2025-05-24 23:05:32 +03:00

- non-device timer callbacks - machine state changing callbacks - configuration callbacks - per-screen VBLANK callbacks - DRC backend callbacks For the timer case only, I added wrappers for the old-style functions. Over time, drivers should switch to device timers instead, reducing the number of timers that are directly allocated through the scheduler.
149 lines
4.0 KiB
C
149 lines
4.0 KiB
C
/*********************************************************************
|
|
|
|
debugger.c
|
|
|
|
Front-end debugger interfaces.
|
|
|
|
Copyright Nicola Salmoria and the MAME Team.
|
|
Visit http://mamedev.org for licensing and usage restrictions.
|
|
|
|
*********************************************************************/
|
|
|
|
#include "emu.h"
|
|
#include "debugger.h"
|
|
#include "osdepend.h"
|
|
#include "debug/debugcpu.h"
|
|
#include "debug/debugcmd.h"
|
|
#include "debug/debugcon.h"
|
|
#include "debug/express.h"
|
|
#include "debug/debugvw.h"
|
|
#include "debugint/debugint.h"
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
TYPE DEFINITIONS
|
|
***************************************************************************/
|
|
|
|
typedef struct _machine_entry machine_entry;
|
|
struct _machine_entry
|
|
{
|
|
machine_entry * next;
|
|
running_machine * machine;
|
|
};
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
GLOBAL VARIABLES
|
|
***************************************************************************/
|
|
|
|
static machine_entry *machine_list;
|
|
static int atexit_registered;
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
FUNCTION PROTOTYPES
|
|
***************************************************************************/
|
|
|
|
static void debugger_exit(running_machine &machine);
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
CENTRAL INITIALIZATION POINT
|
|
***************************************************************************/
|
|
|
|
/*-------------------------------------------------
|
|
debugger_init - start up all subsections
|
|
-------------------------------------------------*/
|
|
|
|
void debugger_init(running_machine &machine)
|
|
{
|
|
/* only if debugging is enabled */
|
|
if (machine.debug_flags & DEBUG_FLAG_ENABLED)
|
|
{
|
|
machine_entry *entry;
|
|
|
|
/* initialize the submodules */
|
|
machine.m_debug_view = auto_alloc(machine, debug_view_manager(machine));
|
|
debug_cpu_init(machine);
|
|
debug_command_init(machine);
|
|
debug_console_init(machine);
|
|
|
|
/* always initialize the internal render debugger */
|
|
debugint_init(machine);
|
|
|
|
/* allocate a new entry for our global list */
|
|
machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(debugger_exit), &machine));
|
|
entry = global_alloc(machine_entry);
|
|
entry->next = machine_list;
|
|
entry->machine = &machine;
|
|
machine_list = entry;
|
|
|
|
/* register an atexit handler if we haven't yet */
|
|
if (!atexit_registered)
|
|
atexit(debugger_flush_all_traces_on_abnormal_exit);
|
|
atexit_registered = TRUE;
|
|
|
|
/* listen in on the errorlog */
|
|
machine.add_logerror_callback(debug_errorlog_write_line);
|
|
|
|
/* initialize osd debugger features */
|
|
machine.osd().init_debugger();
|
|
}
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------
|
|
debugger_refresh_display - redraw the current
|
|
video display
|
|
-------------------------------------------------*/
|
|
|
|
void debugger_refresh_display(running_machine &machine)
|
|
{
|
|
machine.video().frame_update(true);
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------
|
|
debugger_exit - remove ourself from the
|
|
global list of active machines for cleanup
|
|
-------------------------------------------------*/
|
|
|
|
static void debugger_exit(running_machine &machine)
|
|
{
|
|
machine_entry **entryptr;
|
|
|
|
/* remove this machine from the list; it came down cleanly */
|
|
for (entryptr = &machine_list; *entryptr != NULL; entryptr = &(*entryptr)->next)
|
|
if ((*entryptr)->machine == &machine)
|
|
{
|
|
machine_entry *deleteme = *entryptr;
|
|
*entryptr = deleteme->next;
|
|
global_free(deleteme);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------
|
|
debugger_flush_all_traces_on_abnormal_exit -
|
|
flush any traces in the event of an aborted
|
|
execution
|
|
-------------------------------------------------*/
|
|
|
|
void debugger_flush_all_traces_on_abnormal_exit(void)
|
|
{
|
|
/* clear out the machine list and flush traces on each one */
|
|
while (machine_list != NULL)
|
|
{
|
|
machine_entry *deleteme = machine_list;
|
|
debug_cpu_flush_traces(*deleteme->machine);
|
|
machine_list = deleteme->next;
|
|
global_free(deleteme);
|
|
}
|
|
}
|