From aa217e45356bd7eab34b56a84b364f9f8151fb4b Mon Sep 17 00:00:00 2001 From: cuz Date: Mon, 5 Jun 2006 16:59:29 +0000 Subject: [PATCH] Rewrote the xxx_load routines for the drivers in assembler to save some space. git-svn-id: svn://svn.cc65.org/cc65/trunk@3756 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/joystick/.cvsignore | 1 - libsrc/joystick/Makefile | 3 +- libsrc/joystick/joy_load.c | 99 ----------------------------- libsrc/joystick/joy_load.s | 121 ++++++++++++++++++++++++++++++++++++ libsrc/mouse/.cvsignore | 1 - libsrc/mouse/Makefile | 3 +- libsrc/mouse/mouse_load.c | 101 ------------------------------ libsrc/mouse/mouse_load.s | 123 +++++++++++++++++++++++++++++++++++++ libsrc/serial/.cvsignore | 1 - libsrc/serial/Makefile | 3 +- libsrc/serial/ser_load.c | 119 ----------------------------------- libsrc/serial/ser_load.s | 121 ++++++++++++++++++++++++++++++++++++ 12 files changed, 371 insertions(+), 325 deletions(-) delete mode 100644 libsrc/joystick/joy_load.c create mode 100644 libsrc/joystick/joy_load.s delete mode 100644 libsrc/mouse/mouse_load.c create mode 100644 libsrc/mouse/mouse_load.s delete mode 100644 libsrc/serial/ser_load.c create mode 100644 libsrc/serial/ser_load.s diff --git a/libsrc/joystick/.cvsignore b/libsrc/joystick/.cvsignore index 3b18bbb05..e69de29bb 100644 --- a/libsrc/joystick/.cvsignore +++ b/libsrc/joystick/.cvsignore @@ -1 +0,0 @@ -joy_load.s diff --git a/libsrc/joystick/Makefile b/libsrc/joystick/Makefile index e1099a5e7..bc59422b0 100644 --- a/libsrc/joystick/Makefile +++ b/libsrc/joystick/Makefile @@ -29,11 +29,12 @@ CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include #-------------------------------------------------------------------------- # Object files -C_OBJS = joy_load.o +C_OBJS = S_OBJS = joy-kernel.o \ joy_read.o \ joy_count.o \ + joy_load.o \ joy_unload.o #-------------------------------------------------------------------------- diff --git a/libsrc/joystick/joy_load.c b/libsrc/joystick/joy_load.c deleted file mode 100644 index c234d439e..000000000 --- a/libsrc/joystick/joy_load.c +++ /dev/null @@ -1,99 +0,0 @@ -/*****************************************************************************/ -/* */ -/* joy_load.c */ -/* */ -/* Loader module for joystick drivers */ -/* */ -/* */ -/* */ -/* (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 */ -/* warranty. In no event will the authors be held liable for any damages */ -/* arising from the use of this software. */ -/* */ -/* Permission is granted to anyone to use this software for any purpose, */ -/* including commercial applications, and to alter it and redistribute it */ -/* freely, subject to the following restrictions: */ -/* */ -/* 1. The origin of this software must not be misrepresented; you must not */ -/* claim that you wrote the original software. If you use this software */ -/* in a product, an acknowledgment in the product documentation would be */ -/* appreciated but is not required. */ -/* 2. Altered source versions must be plainly marked as such, and must not */ -/* be misrepresented as being the original software. */ -/* 3. This notice may not be removed or altered from any source */ -/* distribution. */ -/* */ -/*****************************************************************************/ - - - -#include -#include -#include -#include -#include - - - -/* 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 */ -{ - static struct mod_ctrl ctrl = { - read /* Read from disk */ - }; - unsigned char Res; - - /* Check if we do already have a driver loaded. If so, remove it. */ - if (joy_drv != 0) { - joy_uninstall (); - } - - /* Now open the file */ - ctrl.callerdata = open (name, O_RDONLY); - if (ctrl.callerdata >= 0) { - - /* Load the module */ - Res = mod_load (&ctrl); - - /* Close the input file */ - close (ctrl.callerdata); - - /* Check the return code */ - if (Res == MLOAD_OK) { - - /* Check the driver signature, install the driver */ - 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; - } - } - - /* Error loading the driver */ - return JOY_ERR_CANNOT_LOAD; -} - - - diff --git a/libsrc/joystick/joy_load.s b/libsrc/joystick/joy_load.s new file mode 100644 index 000000000..7115f5d07 --- /dev/null +++ b/libsrc/joystick/joy_load.s @@ -0,0 +1,121 @@ +; +; Ullrich von Bassewitz, 2006-06-05 +; +; unsigned char __fastcall__ joy_load_driver (const char* driver); +; /* Load and install a joystick driver. Return an error code. */ + + + .include "joy-kernel.inc" + .include "joy-error.inc" + .include "modload.inc" + .include "fcntl.inc" + + .import pushax + .import pusha0 + .import incsp2 + .import _open + .import _read + .import _close + + + +;---------------------------------------------------------------------------- +; Variables + +.data + +ctrl: .addr _read + .res 2 ; CALLERDATA + .res 2 ; MODULE + .res 2 ; MODULE_SIZE + .res 2 ; MODULE_ID + +;---------------------------------------------------------------------------- +; Code + +.code + +.proc _joy_load_driver + +; Save name on the C stack. We will need it later as parameter passed to open() + + jsr pushax + +; Check if we do already have a driver loaded. If so, remove it. + + lda _joy_drv + ora _joy_drv+1 + beq @L1 + jsr _joy_uninstall + +; Open the file. The name parameter is already on stack and will get removed +; by open(). +; ctrl.callerdata = open (name, O_RDONLY); + +@L1: lda #= 0) { + + txa + bmi @L3 + +; /* Load the module */ +; Res = mod_load (&ctrl); + + lda #ctrl + jsr _mod_load + pha + +; /* Close the input file */ +; close (ctrl.callerdata); + + lda ctrl + MOD_CTRL::CALLERDATA + ldx ctrl + MOD_CTRL::CALLERDATA+1 + jsr _close + +; /* Check the return code */ +; if (Res == MLOAD_OK) { + + pla + bne @L3 + +; Check the driver signature, install the driver. c is already on stack and +; will get removed by joy_install(). +; Res = joy_install (ctrl.module); + + lda ctrl + MOD_CTRL::MODULE + ldx ctrl + MOD_CTRL::MODULE+1 + jsr _joy_install + +; If joy_install was successful, we're done + + tax + beq @L2 + +; The driver didn't install correctly. Remove it from memory and return the +; error code. + + pha ; Save the error code + lda _joy_drv + ldx _joy_drv+1 + jsr _mod_free ; Free the driver memory + jsr _joy_clear_ptr ; Clear joy_drv + pla ; Restore the error code + ldx #0 ; We must return an int +@L2: rts ; Done + +; Open or mod_load failed. Return an error code. + +@L3: lda #JOY_ERR_CANNOT_LOAD + rts + +.endproc + + diff --git a/libsrc/mouse/.cvsignore b/libsrc/mouse/.cvsignore index d8548c2a2..e69de29bb 100644 --- a/libsrc/mouse/.cvsignore +++ b/libsrc/mouse/.cvsignore @@ -1 +0,0 @@ -mouse_load.s diff --git a/libsrc/mouse/Makefile b/libsrc/mouse/Makefile index 7d32f4652..47841ab8f 100644 --- a/libsrc/mouse/Makefile +++ b/libsrc/mouse/Makefile @@ -29,7 +29,7 @@ CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include #-------------------------------------------------------------------------- # Object files -C_OBJS = mouse_load.o +C_OBJS = S_OBJS = mouse-kernel.o \ mouse_box.o \ @@ -38,6 +38,7 @@ S_OBJS = mouse-kernel.o \ mouse_hide.o \ mouse_info.o \ mouse_ioctl.o \ + mouse_load.o \ mouse_move.o \ mouse_pos.o \ mouse_show.o \ diff --git a/libsrc/mouse/mouse_load.c b/libsrc/mouse/mouse_load.c deleted file mode 100644 index bc15f26d4..000000000 --- a/libsrc/mouse/mouse_load.c +++ /dev/null @@ -1,101 +0,0 @@ -/*****************************************************************************/ -/* */ -/* mouse_load.c */ -/* */ -/* Loader for mouse drivers modules */ -/* */ -/* */ -/* */ -/* (C) 2002-2003 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ -/* */ -/* */ -/* This software is provided 'as-is', without any expressed or implied */ -/* warranty. In no event will the authors be held liable for any damages */ -/* arising from the use of this software. */ -/* */ -/* Permission is granted to anyone to use this software for any purpose, */ -/* including commercial applications, and to alter it and redistribute it */ -/* freely, subject to the following restrictions: */ -/* */ -/* 1. The origin of this software must not be misrepresented; you must not */ -/* claim that you wrote the original software. If you use this software */ -/* in a product, an acknowledgment in the product documentation would be */ -/* appreciated but is not required. */ -/* 2. Altered source versions must be plainly marked as such, and must not */ -/* be misrepresented as being the original software. */ -/* 3. This notice may not be removed or altered from any source */ -/* distribution. */ -/* */ -/*****************************************************************************/ - - - -#include -#include -#include -#include -#include -#include - - - -/* Use static local variables, since the module is not reentrant anyway */ -#pragma staticlocals (on); - - - -unsigned char __fastcall__ mouse_load_driver (const struct mouse_callbacks* c, - const char* name) -/* Load a mouse driver and return an error code */ -{ - static struct mod_ctrl ctrl = { - read /* Read from disk */ - }; - unsigned char Res; - - /* Check if we do already have a driver loaded. If so, remove it. */ - if (mouse_drv != 0) { - mouse_uninstall (); - } - - /* Now open the file */ - ctrl.callerdata = open (name, O_RDONLY); - if (ctrl.callerdata >= 0) { - - /* Load the module */ - Res = mod_load (&ctrl); - - /* Close the input file */ - close (ctrl.callerdata); - - /* Check the return code */ - if (Res == MLOAD_OK) { - - /* Check the driver signature, install the driver */ - Res = mouse_install (c, ctrl.module); - - /* If the driver did not install correctly, remove it from - * memory again. - */ - if (Res != MOUSE_ERR_OK) { - /* Do not call mouse_uninstall here, since the driver is not - * correctly installed. - */ - mod_free (mouse_drv); - mouse_clear_ptr (); - } - - /* Return the error code */ - return Res; - } - } - - /* Error loading the driver */ - return MOUSE_ERR_CANNOT_LOAD; -} - - - diff --git a/libsrc/mouse/mouse_load.s b/libsrc/mouse/mouse_load.s new file mode 100644 index 000000000..347250843 --- /dev/null +++ b/libsrc/mouse/mouse_load.s @@ -0,0 +1,123 @@ +; +; Ullrich von Bassewitz, 2006-06-05 +; +; unsigned char __fastcall__ mouse_load_driver (const struct mouse_callbacks* c, +; const char* name) +; /* Load a mouse driver and return an error code */ + + + .include "mouse-kernel.inc" + .include "modload.inc" + .include "fcntl.inc" + + .import pushax + .import pusha0 + .import incsp2 + .import _open + .import _read + .import _close + + + +;---------------------------------------------------------------------------- +; Variables + +.data + +ctrl: .addr _read + .res 2 ; CALLERDATA + .res 2 ; MODULE + .res 2 ; MODULE_SIZE + .res 2 ; MODULE_ID + +;---------------------------------------------------------------------------- +; Code + +.code + +.proc _mouse_load_driver + +; Save name on the C stack. We will need it later as parameter passed to open() + + jsr pushax + +; Check if we do already have a driver loaded. If so, remove it. + + lda _mouse_drv + ora _mouse_drv+1 + beq @L1 + jsr _mouse_uninstall + +; Open the file. The name parameter is already on stack and will get removed +; by open(). +; ctrl.callerdata = open (name, O_RDONLY); + +@L1: lda #= 0) { + + txa + bmi @L3 + +; /* Load the module */ +; Res = mod_load (&ctrl); + + lda #ctrl + jsr _mod_load + pha + +; /* Close the input file */ +; close (ctrl.callerdata); + + lda ctrl + MOD_CTRL::CALLERDATA + ldx ctrl + MOD_CTRL::CALLERDATA+1 + jsr _close + +; /* Check the return code */ +; if (Res == MLOAD_OK) { + + pla + bne @L3 + +; Check the driver signature, install the driver. c is already on stack and +; will get removed by mouse_install(). +; Res = mouse_install (c, ctrl.module); + + lda ctrl + MOD_CTRL::MODULE + ldx ctrl + MOD_CTRL::MODULE+1 + jsr _mouse_install + +; If mouse_install was successful, we're done + + tax + beq @L2 + +; The driver didn't install correctly. Remove it from memory and return the +; error code. + + pha ; Save the error code + lda _mouse_drv + ldx _mouse_drv+1 + jsr _mod_free ; Free the driver memory + jsr _mouse_clear_ptr ; Clear mouse_drv + pla ; Restore the error code + ldx #0 ; We must return an int +@L2: rts ; Done + +; Open or mod_load failed. Remove excess arguments from stack and return an +; error code. + +@L3: jsr incsp2 + lda #MOUSE_ERR_CANNOT_LOAD + rts + +.endproc + + diff --git a/libsrc/serial/.cvsignore b/libsrc/serial/.cvsignore index c81f22f08..e69de29bb 100644 --- a/libsrc/serial/.cvsignore +++ b/libsrc/serial/.cvsignore @@ -1 +0,0 @@ -ser_load.s diff --git a/libsrc/serial/Makefile b/libsrc/serial/Makefile index cef55eccf..51407e610 100644 --- a/libsrc/serial/Makefile +++ b/libsrc/serial/Makefile @@ -29,12 +29,13 @@ CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include #-------------------------------------------------------------------------- # Object files -C_OBJS = ser_load.o +C_OBJS = S_OBJS = ser-kernel.o \ ser_close.o \ ser_get.o \ ser_ioctl.o \ + ser_load.o \ ser_open.o \ ser_put.o \ ser_status.o \ diff --git a/libsrc/serial/ser_load.c b/libsrc/serial/ser_load.c deleted file mode 100644 index 11ca23a27..000000000 --- a/libsrc/serial/ser_load.c +++ /dev/null @@ -1,119 +0,0 @@ -/*****************************************************************************/ -/* */ -/* ser_load.c */ -/* */ -/* Loader module for serial drivers */ -/* */ -/* */ -/* */ -/* (C) 2003-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 */ -/* warranty. In no event will the authors be held liable for any damages */ -/* arising from the use of this software. */ -/* */ -/* Permission is granted to anyone to use this software for any purpose, */ -/* including commercial applications, and to alter it and redistribute it */ -/* freely, subject to the following restrictions: */ -/* */ -/* 1. The origin of this software must not be misrepresented; you must not */ -/* claim that you wrote the original software. If you use this software */ -/* in a product, an acknowledgment in the product documentation would be */ -/* appreciated but is not required. */ -/* 2. Altered source versions must be plainly marked as such, and must not */ -/* be misrepresented as being the original software. */ -/* 3. This notice may not be removed or altered from any source */ -/* distribution. */ -/* */ -/*****************************************************************************/ - - - -#include -#include -#include -#include -#include - - - -/*****************************************************************************/ -/* Data */ -/*****************************************************************************/ - - - -/* Pointer to serial driver, exported from ser-kernel.s */ -extern void* ser_drv; - -/* Function that clears the driver pointer (ser-kernel.s) */ -void ser_clear_ptr (void); - - - -/*****************************************************************************/ -/* Code */ -/*****************************************************************************/ - - - -/* Use static local variables, since the module is not reentrant anyway */ -#pragma staticlocals (on); - - - -unsigned char __fastcall__ ser_load_driver (const char* name) -/* Load a serial driver and return an error code */ -{ - static struct mod_ctrl ctrl = { - read /* Read from disk */ - }; - unsigned char Res; - - /* Check if we do already have a driver loaded. If so, remove it. */ - if (ser_drv != 0) { - ser_uninstall (); - } - - /* Now open the file */ - ctrl.callerdata = open (name, O_RDONLY); - if (ctrl.callerdata >= 0) { - - /* Load the module */ - Res = mod_load (&ctrl); - - /* Close the input file */ - close (ctrl.callerdata); - - /* Check the return code */ - if (Res == MLOAD_OK) { - - /* Check the driver signature, install the driver */ - Res = ser_install (ctrl.module); - - /* If the driver did not install correctly, remove it from - * memory again. - */ - if (Res != SER_ERR_OK) { - /* Do not call ser_uninstall here, since the driver is not - * correctly installed. - */ - mod_free (ser_drv); - ser_clear_ptr (); - } - - /* Return the error code */ - return Res; - } - } - - /* Error loading the driver */ - return SER_ERR_CANNOT_LOAD; -} - - - diff --git a/libsrc/serial/ser_load.s b/libsrc/serial/ser_load.s new file mode 100644 index 000000000..d711a74b1 --- /dev/null +++ b/libsrc/serial/ser_load.s @@ -0,0 +1,121 @@ +; +; Ullrich von Bassewitz, 2006-06-05 +; +; unsigned char __fastcall__ ser_load_driver (const char* name) +; /* Load a serial driver and return an error code */ + + + .include "ser-kernel.inc" + .include "ser-error.inc" + .include "modload.inc" + .include "fcntl.inc" + + .import pushax + .import pusha0 + .import incsp2 + .import _open + .import _read + .import _close + + + +;---------------------------------------------------------------------------- +; Variables + +.data + +ctrl: .addr _read + .res 2 ; CALLERDATA + .res 2 ; MODULE + .res 2 ; MODULE_SIZE + .res 2 ; MODULE_ID + +;---------------------------------------------------------------------------- +; Code + +.code + +.proc _ser_load_driver + +; Save name on the C stack. We will need it later as parameter passed to open() + + jsr pushax + +; Check if we do already have a driver loaded. If so, remove it. + + lda _ser_drv + ora _ser_drv+1 + beq @L1 + jsr _ser_uninstall + +; Open the file. The name parameter is already on stack and will get removed +; by open(). +; ctrl.callerdata = open (name, O_RDONLY); + +@L1: lda #= 0) { + + txa + bmi @L3 + +; /* Load the module */ +; Res = mod_load (&ctrl); + + lda #ctrl + jsr _mod_load + pha + +; /* Close the input file */ +; close (ctrl.callerdata); + + lda ctrl + MOD_CTRL::CALLERDATA + ldx ctrl + MOD_CTRL::CALLERDATA+1 + jsr _close + +; /* Check the return code */ +; if (Res == MLOAD_OK) { + + pla + bne @L3 + +; Check the driver signature, install the driver. c is already on stack and +; will get removed by ser_install(). +; Res = ser_install (ctrl.module); + + lda ctrl + MOD_CTRL::MODULE + ldx ctrl + MOD_CTRL::MODULE+1 + jsr _ser_install + +; If ser_install was successful, we're done + + tax + beq @L2 + +; The driver didn't install correctly. Remove it from memory and return the +; error code. + + pha ; Save the error code + lda _ser_drv + ldx _ser_drv+1 + jsr _mod_free ; Free the driver memory + jsr _ser_clear_ptr ; Clear ser_drv + pla ; Restore the error code + ldx #0 ; We must return an int +@L2: rts ; Done + +; Open or mod_load failed. Return an error code. + +@L3: lda #SER_ERR_CANNOT_LOAD + rts + +.endproc + +