# HG changeset patch # User Patrice Mandin # Date 1076753547 0 # Node ID 0b9b4bf3c1e70bfd203897320945ed96256faac2 # Parent 1318a8b87f489fa1c69c70d5df26737bcfa49632 Important crash fix: system vectors for mouse/joystick were not restored diff -r 1318a8b87f48 -r 0b9b4bf3c1e7 src/video/ataricommon/SDL_xbiosevents.c --- 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 #include #include + #include #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); diff -r 1318a8b87f48 -r 0b9b4bf3c1e7 src/video/ataricommon/SDL_xbiosinterrupt.S --- 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 - diff -r 1318a8b87f48 -r 0b9b4bf3c1e7 src/video/ataricommon/SDL_xbiosinterrupt_s.h --- 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);