From 878dcf4aa791545130f824aa245ff19fc18263f8 Mon Sep 17 00:00:00 2001 From: cuz Date: Sun, 4 Jun 2006 10:15:18 +0000 Subject: [PATCH] Fixed a problem when loading joystick drivers: When an install error occurred, the driver wasn't removed from memory. git-svn-id: svn://svn.cc65.org/cc65/trunk@3752 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- asminc/joy-kernel.inc | 9 +++++---- include/joystick/joy-kernel.h | 19 +++++++++++++++---- libsrc/joystick/joy-kernel.s | 4 +--- libsrc/joystick/joy_load.c | 30 ++++++++++++++++++++++++------ 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/asminc/joy-kernel.inc b/asminc/joy-kernel.inc index 7f600ed1b..048517a68 100644 --- a/asminc/joy-kernel.inc +++ b/asminc/joy-kernel.inc @@ -6,10 +6,10 @@ ;/* */ ;/* */ ;/* */ -;/* (C) 2002 Ullrich von Bassewitz */ -;/* Wacholderweg 14 */ -;/* D-70597 Stuttgart */ -;/* EMail: uz@musoftware.de */ +;/* (C) 2002-2006, Ullrich von Bassewitz */ +;/* Römerstraße 52 */ +;/* D-70794 Filderstadt */ +;/* EMail: uz@cc65.org */ ;/* */ ;/* */ ;/* This software is provided 'as-is', without any expressed or implied */ @@ -80,4 +80,5 @@ JOY_API_VERSION = $01 .global _joy_count .global _joy_read + .global _joy_clear_ptr diff --git a/include/joystick/joy-kernel.h b/include/joystick/joy-kernel.h index 7c3d7f889..d57ad5dc7 100644 --- a/include/joystick/joy-kernel.h +++ b/include/joystick/joy-kernel.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2002-2004 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2002-2006, Ullrich von Bassewitz */ +/* Römerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -72,6 +72,17 @@ extern joy_drv_header* joy_drv; /* Pointer to driver */ +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +void joy_clear_ptr (void); +/* Clear the joy_drv pointer */ + + + /* End of joy-kernel.h */ #endif diff --git a/libsrc/joystick/joy-kernel.s b/libsrc/joystick/joy-kernel.s index 975166b7e..d863b9c3d 100644 --- a/libsrc/joystick/joy-kernel.s +++ b/libsrc/joystick/joy-kernel.s @@ -4,8 +4,6 @@ ; Common functions of the joystick API. ; - .export joy_clear_ptr - .importzp ptr1 .interruptor joy_irq ; Export as IRQ handler @@ -117,7 +115,7 @@ _joy_uninstall: jsr joy_uninstall ; Call the driver routine -joy_clear_ptr: ; External entry point +_joy_clear_ptr: ; External entry point lda #0 sta _joy_drv sta _joy_drv+1 ; Clear the driver pointer diff --git a/libsrc/joystick/joy_load.c b/libsrc/joystick/joy_load.c index bd32c2997..c234d439e 100644 --- a/libsrc/joystick/joy_load.c +++ b/libsrc/joystick/joy_load.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2002-2003 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2002-2006, Ullrich von Bassewitz */ +/* Römerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -41,6 +41,11 @@ +/* Use static local variables, since the module is not reentrant anyway */ +#pragma staticlocals (on); + + + unsigned char __fastcall__ joy_load_driver (const char* name) /* Load a joystick driver and return an error code */ { @@ -68,8 +73,21 @@ unsigned char __fastcall__ joy_load_driver (const char* name) if (Res == MLOAD_OK) { /* Check the driver signature, install the driver */ - return joy_install (ctrl.module); - + Res = joy_install (ctrl.module); + + /* If the driver did not install correctly, remove it from + * memory again. + */ + if (Res != JOY_ERR_OK) { + /* Do not call mouse_uninstall here, since the driver is not + * correctly installed. + */ + mod_free (joy_drv); + joy_clear_ptr (); + } + + /* Return the error code */ + return Res; } } -- 2.39.5