Important crash fix: system vectors for mouse/joystick were not restored
authorPatrice Mandin <patmandin@gmail.com>
Sat, 14 Feb 2004 10:12:27 +0000
changeset 820 0b9b4bf3c1e7
parent 819 1318a8b87f48
child 821 30168104389f
Important crash fix: system vectors for mouse/joystick were not restored
src/video/ataricommon/SDL_xbiosevents.c
src/video/ataricommon/SDL_xbiosinterrupt.S
src/video/ataricommon/SDL_xbiosinterrupt_s.h
--- a/src/video/ataricommon/SDL_xbiosevents.c	Sat Feb 14 06:04:41 2004 +0000
+++ b/src/video/ataricommon/SDL_xbiosevents.c	Sat Feb 14 10:12:27 2004 +0000
@@ -31,8 +31,10 @@
  *	Patrice Mandin
  */
 
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+
 #include <mint/osbind.h>
 
 #include "SDL_events_c.h"
@@ -43,10 +45,13 @@
 
 int SDL_AtariXbios_enabled=0;
 
-static _KBDVECS *kbdvecs;		/* Pointer to access vectors */
-static _KBDVECS sys_kbdvecs;	/* Backup of system vectors */
+/* Local variables */
+
+static _KBDVECS *kbdvecs;		/* Pointer to access system vectors */
 static Uint16 atari_prevmouseb;	/* buttons */
 
+/* Functions */
+
 void SDL_AtariXbios_InstallVectors(int vectors_mask)
 {
 	void *oldpile;
@@ -64,10 +69,7 @@
 	/* Go to supervisor mode */
 	oldpile=(void *)Super(0);
 
-	/* Backup system vectors */
-	memcpy(&sys_kbdvecs, kbdvecs, sizeof(_KBDVECS));
-
-	/* Install our vector */
+	/* Install our vectors */
 	SDL_AtariXbios_Install(
 		kbdvecs,
 		(vectors_mask & ATARI_XBIOS_MOUSEEVENTS) ? SDL_AtariXbios_MouseVector : NULL,
@@ -84,11 +86,14 @@
 {
 	void *oldpile;
 
+	/* Read IKBD vectors base */
+	kbdvecs=Kbdvbase();
+
 	/* Go to supervisor mode */
 	oldpile=(void *)Super(NULL);
 
 	/* Reinstall system vector */
-	SDL_AtariXbios_Install(kbdvecs,sys_kbdvecs.mousevec,sys_kbdvecs.joyvec);
+	SDL_AtariXbios_Restore(kbdvecs);
 
 	/* Back to user mode */
 	Super(oldpile);
--- a/src/video/ataricommon/SDL_xbiosinterrupt.S	Sat Feb 14 06:04:41 2004 +0000
+++ b/src/video/ataricommon/SDL_xbiosinterrupt.S	Sat Feb 14 10:12:27 2004 +0000
@@ -34,6 +34,7 @@
 	.text
 
 	.globl	_SDL_AtariXbios_Install
+	.globl	_SDL_AtariXbios_Restore
 	.globl	_SDL_AtariXbios_MouseVector
 	.globl	_SDL_AtariXbios_JoystickVector
 
@@ -53,6 +54,7 @@
 
 	/* Save old mouse vector, set our routine */
 
+	clrl	oldmousevector
 	movel	sp@(8),d0
 	beqs	no_new_mouse_vector
 	movel	a0@(16),oldmousevector
@@ -61,6 +63,7 @@
 
 	/* Save old joystick vector, set our routine */
 
+	clrl	oldjoystickvector
 	movel	sp@(12),d0
 	beqs	no_new_joystick_vector
 	movel	a0@(24),oldjoystickvector
@@ -73,6 +76,35 @@
 
 	rts
 
+/*--- Vector restorer ---*/
+
+_SDL_AtariXbios_Restore:
+	movel	sp@(4),a0
+
+	/* Stop interrupts */
+
+	movew	#0x2700,sr
+
+	/* Restore mouse vector */
+
+	movel	oldmousevector,d0
+	beqs	no_restore_mouse
+	movel	d0,a0@(16)
+no_restore_mouse:
+
+	/* Restore joystick vector */
+
+	movel	oldjoystickvector,d0
+	beqs	no_restore_joystick
+	movel	d0,a0@(24)
+no_restore_joystick:
+
+	/* Restart interrupts */
+
+	movew	#0x2300,sr
+
+	rts
+
 /*--- Our mouse vector ---*/
 
 	.text
@@ -138,4 +170,3 @@
 	.data
 	.even
 	.comm	_SDL_AtariXbios_joystick,2*1
-
--- a/src/video/ataricommon/SDL_xbiosinterrupt_s.h	Sat Feb 14 06:04:41 2004 +0000
+++ b/src/video/ataricommon/SDL_xbiosinterrupt_s.h	Sat Feb 14 10:12:27 2004 +0000
@@ -48,6 +48,7 @@
 /* Functions */ 
 
 extern void SDL_AtariXbios_Install(_KBDVECS *kbdvecs,void *newmousevector,void *newjoystickvector);
+extern void SDL_AtariXbios_Restore(_KBDVECS *kbdvecs);
 extern void SDL_AtariXbios_MouseVector(void *buf);
 extern void SDL_AtariXbios_JoystickVector(void *buf);