SDL-1.2: atari: add Atari_UnhookXbra()

From ca07d02b1f202964ca7663dcd8f191530e16438d Mon Sep 17 00:00:00 2001
From: Miro Kropacek <[EMAIL REDACTED]>
Date: Sun, 21 Apr 2019 17:08:57 +0200
Subject: [PATCH] atari: add Atari_UnhookXbra()

---
 src/video/ataricommon/SDL_atarixbra.c   | 65 +++++++++++++++++++++++++
 src/video/ataricommon/SDL_atarixbra_c.h | 52 ++++++++++++++++++++
 2 files changed, 117 insertions(+)
 create mode 100644 src/video/ataricommon/SDL_atarixbra.c
 create mode 100644 src/video/ataricommon/SDL_atarixbra_c.h

diff --git a/src/video/ataricommon/SDL_atarixbra.c b/src/video/ataricommon/SDL_atarixbra.c
new file mode 100644
index 00000000..ee575d1c
--- /dev/null
+++ b/src/video/ataricommon/SDL_atarixbra.c
@@ -0,0 +1,65 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2012 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library 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
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/*
+ *	XBRA protocol
+ *
+ *	Miro Kropacek
+ */
+
+#include <mint/osbind.h>
+
+#include "SDL_atarixbra_c.h"
+
+/* Functions */
+
+XbraHandler Atari_UnhookXbra(Uint16 vecnum, Uint32 app_id, XbraHandler handler)
+{
+	XBRA *rx;
+	XbraHandler vecadr, *stepadr, ret = NULL;
+
+	vecadr = Setexc(vecnum, VEC_INQUIRE);
+	rx = (XBRA*)((Uint32)vecadr - sizeof(XBRA));
+
+	/* Special Case: Vector to remove is first in chain. */
+	if(rx->xbra_id == XBRA_ID && rx->app_id == app_id && vecadr == handler)
+	{
+		return Setexc(vecnum, rx->oldvec);
+	}
+
+	stepadr = &rx->oldvec;
+	rx = (XBRA*)((Uint32)rx->oldvec - sizeof(XBRA));
+	while(rx->xbra_id == XBRA_ID)
+	{
+		if(rx->app_id == app_id && *stepadr == handler)
+		{
+			*stepadr = ret = rx->oldvec;
+			break;
+		}
+
+		stepadr = &rx->oldvec;
+		rx = (XBRA*)((Uint32)rx->oldvec - sizeof(XBRA));
+	}
+
+	return ret;
+}
diff --git a/src/video/ataricommon/SDL_atarixbra_c.h b/src/video/ataricommon/SDL_atarixbra_c.h
new file mode 100644
index 00000000..e1eb7c8d
--- /dev/null
+++ b/src/video/ataricommon/SDL_atarixbra_c.h
@@ -0,0 +1,52 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2012 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library 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
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/*
+ *	XBRA protocol
+ *
+ *	Miro Kropacek
+ */
+
+#ifndef _SDL_ATARI_XBRA_H_
+#define _SDL_ATARI_XBRA_H_
+
+#include "SDL_stdinc.h"
+
+typedef void (*XbraHandler) (void);
+
+typedef struct xbra
+{
+	Uint32		xbra_id;
+	Uint32		app_id;
+	XbraHandler	oldvec;
+} XBRA;
+
+/* Const */
+
+#define XBRA_ID	0x58425241UL /* 'XBRA' */
+
+/* Functions */
+
+extern XbraHandler Atari_UnhookXbra(Uint16 vecnum, Uint32 app_id, XbraHandler handler);
+
+#endif /* _SDL_ATARI_XBRA_H_ */