diff --git a/include/interface/callbacks.hpp b/include/interface/callbacks.hpp
index a44370f..ff914a5 100644
--- a/include/interface/callbacks.hpp
+++ b/include/interface/callbacks.hpp
@@ -76,6 +76,11 @@ public:
  * Notify print event.
  */
 	virtual void console_print(const char* str) = 0;
+	
+/**
+ * Notify print event.
+ */
+	virtual void debug_dma(int trigger_addr, int source_addr, int dest_addr, int size, int mode, int dir, int fixed) = 0;
 };
 
 extern struct emucore_callbacks* ecore_callbacks;
diff --git a/include/lua/lua.hpp b/include/lua/lua.hpp
index 7003d33..276d0ca 100644
--- a/include/lua/lua.hpp
+++ b/include/lua/lua.hpp
@@ -52,6 +52,7 @@ struct lua_state
 	lua::state::callback_list* on_post_rewind;
 	lua::state::callback_list* on_set_rewind;
 	lua::state::callback_list* on_latch;
+	lua::state::callback_list* on_dma;
 
 	void callback_do_paint(struct lua::render_context* ctx, bool non_synthethic) throw();
 	void callback_do_video(struct lua::render_context* ctx, bool& kill_frame, uint32_t& hscl, uint32_t& vscl)
@@ -78,6 +79,7 @@ struct lua_state
 	bool callback_do_button(uint32_t port, uint32_t controller, uint32_t index, const char* type);
 	void callback_movie_lost(const char* what);
 	void callback_do_latch(std::list<std::string>& args);
+	void callback_do_dma(int trigger_addr, int source_addr, int dest_addr, int size, int mode, int dir, int fixed);
 	void run_startup_scripts();
 	void add_startup_script(const std::string& file);
 
diff --git a/src/core/mainloop.cpp b/src/core/mainloop.cpp
index 0406ed3..ba5bc86 100644
--- a/src/core/mainloop.cpp
+++ b/src/core/mainloop.cpp
@@ -314,6 +314,11 @@ public:
 	{
 		messages << str << std::flush;
 	}
+	
+	void debug_dma(int trigger_addr, int source_addr, int dest_addr, int size, int mode, int dir, int fixed)
+	{
+		CORE().lua2->callback_do_dma(trigger_addr, source_addr, dest_addr, size, mode, dir, fixed);
+	}
 };
 
 namespace
diff --git a/src/emulation/bsnes-legacy/core.cpp b/src/emulation/bsnes-legacy/core.cpp
index 48f63ad..6455e43 100644
--- a/src/emulation/bsnes-legacy/core.cpp
+++ b/src/emulation/bsnes-legacy/core.cpp
@@ -1080,6 +1080,11 @@ namespace
 	{
 		ecore_callbacks->console_print(str);
 	}
+	
+	void bsnes_debug_dma(int trigger_addr, int source_addr, int dest_addr, int size, int mode, int dir, int fixed)
+	{
+		ecore_callbacks->debug_dma(trigger_addr, source_addr, dest_addr, size, mode, dir, fixed);
+	}
 
 	void bsnes_debug_write2(uint8_t clazz, unsigned offset, uint8_t val)
 	{
@@ -1229,6 +1234,7 @@ namespace
 		}
 		void c_install_handler() {
 			SNES::cpu.debug_print = console_print;
+			SNES::cpu.debug_dma = bsnes_debug_dma;
 #ifdef BSNES_SUPPORTS_ADV_BREAKPOINTS
 			SNES::bus.debug_read = bsnes_debug_read;
 			SNES::bus.debug_write = bsnes_debug_write;
diff --git a/src/lua/lua.cpp b/src/lua/lua.cpp
index d4b5f20..d98c403 100644
--- a/src/lua/lua.cpp
+++ b/src/lua/lua.cpp
@@ -203,6 +203,7 @@ lua_state::lua_state(lua::state& _L, command::group& _command)
 	on_post_rewind = new lua::state::callback_list(L, "post_rewind", "on_post_rewind");
 	on_set_rewind = new lua::state::callback_list(L, "set_rewind", "on_set_rewind");
 	on_latch = new lua::state::callback_list(L, "latch", "on_latch");
+	on_dma = new lua::state::callback_list(L, "dma", "on_dma");
 }
 
 lua_state::~lua_state()
@@ -234,6 +235,7 @@ lua_state::~lua_state()
 	delete on_post_rewind;
 	delete on_set_rewind;
 	delete on_latch;
+	delete on_dma;
 }
 
 void lua_state::callback_do_paint(struct lua::render_context* ctx, bool non_synthetic) throw()
@@ -456,6 +458,18 @@ void lua_state::callback_movie_lost(const char* what)
 	run_callback(*on_movie_lost, std::string(what));
 }
 
+void lua_state::callback_do_dma(int trigger_addr, int source_addr, int dest_addr, int size, int mode, int dir, int fixed)
+{
+	run_callback(*on_dma, lua::state::numeric_tag(trigger_addr),
+							lua::state::numeric_tag(source_addr), 
+							lua::state::numeric_tag(dest_addr), 
+							lua::state::numeric_tag(size), 
+							lua::state::numeric_tag(mode), 
+							lua::state::numeric_tag(dir), 
+							lua::state::numeric_tag(fixed)
+						);
+}
+
 void lua_state::callback_do_latch(std::list<std::string>& args)
 {
 	run_callback(*on_latch, lua::state::vararg_tag(args));
