From: cuz Date: Sun, 28 Dec 2003 21:25:15 +0000 (+0000) Subject: New loadable mouse drivers X-Git-Tag: V2.12.0~967 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=30d99a4d569c1f53f1578ec9ff90974fbc98eb90;p=cc65 New loadable mouse drivers git-svn-id: svn://svn.cc65.org/cc65/trunk@2851 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/libsrc/mouse/.cvsignore b/libsrc/mouse/.cvsignore new file mode 100644 index 000000000..d8548c2a2 --- /dev/null +++ b/libsrc/mouse/.cvsignore @@ -0,0 +1 @@ +mouse_load.s diff --git a/libsrc/mouse/Makefile b/libsrc/mouse/Makefile new file mode 100644 index 000000000..71fb86e50 --- /dev/null +++ b/libsrc/mouse/Makefile @@ -0,0 +1,36 @@ +# +# Makefile for the mouse driver library +# + +.SUFFIXES: .o .s .c + +#-------------------------------------------------------------------------- +# Rules + +%.o: %.c + @$(CC) $(CFLAGS) $< + @$(AS) -g -o $@ $(AFLAGS) $(*).s + +%.o: %.s + @$(AS) -g -o $@ $(AFLAGS) $< + +#-------------------------------------------------------------------------- +# Object files + +C_OBJS = mouse_load.o + +S_OBJS = mouse-kernel.o + + +#-------------------------------------------------------------------------- +# Targets + +.PHONY: all clean zap + +all: $(C_OBJS) $(S_OBJS) + +clean: + @$(RM) *~ $(C_OBJS:.o=.s) $(C_OBJS) $(S_OBJS) + +zap: clean + diff --git a/libsrc/mouse/mouse-kernel.s b/libsrc/mouse/mouse-kernel.s new file mode 100644 index 000000000..e727d866f --- /dev/null +++ b/libsrc/mouse/mouse-kernel.s @@ -0,0 +1,101 @@ +; +; Ullrich von Bassewitz, 2003-12-28 +; +; Common functions of the mouse driver API. +; + + .import return0 + .importzp ptr1 + + .include "mouse-kernel.inc" + + + +;---------------------------------------------------------------------------- +; Variables + + +.bss +_mouse_drv: .res 2 ; Pointer to driver + +; Jump table for the driver functions. +.data +mouse_vectors: +mouse_install: jmp return0 +mouse_uninstall:jmp return0 +mouse_hide: jmp return0 +mouse_show: jmp return0 +mouse_box: jmp return0 +mouse_move: jmp return0 +mouse_buttons: jmp return0 +mouse_pos: jmp return0 +mouse_info: jmp return0 + +; Driver header signature +.rodata +mouse_sig: .byte $6d, $6f, $75, MOUSE_API_VERSION ; "mou", version + + +;---------------------------------------------------------------------------- +; unsigned char __fastcall__ mouse_install (void* driver); +; /* Install an already loaded driver. Returns an error code. */ + + + +_mouse_install: + sta _mouse_drv + sta ptr1 + stx _mouse_drv+1 + stx ptr1+1 + +; Check the driver signature + + ldy #.sizeof(mouse_sig)-1 +@L0: lda (ptr1),y + cmp mouse_sig,y + bne inv_drv + dey + bpl @L0 + +; Copy the jump vectors + + ldy #MOUSE_HDR::JUMPTAB + ldx #0 +@L1: inx ; Skip the JMP opcode + jsr copy ; Copy one byte + jsr copy ; Copy one byte + cpy #(MOUSE_HDR::JUMPTAB + .sizeof(MOUSE_HDR::JUMPTAB)) + bne @L1 + + jmp mouse_install ; Call driver install routine + +; Driver signature invalid + +inv_drv: + lda #MOUSE_ERR_INV_DRIVER + ldx #0 + rts + +; Copy one byte from the jump vectors + +copy: lda (ptr1),y + sta mouse_vectors,x + iny + inx + rts + +;---------------------------------------------------------------------------- +; unsigned char __fastcall__ mouse_uninstall (void); +; /* Uninstall the currently loaded driver. Returns an error code. */ + +_mouse_uninstall: + jsr mouse_uninstall ; Call driver routine + +mouse_clear_ptr: ; External entry point + lda #0 + sta _mouse_drv + sta _mouse_drv+1 ; Clear the driver pointer + + tax + rts ; Return zero + diff --git a/libsrc/mouse/mouse_load.c b/libsrc/mouse/mouse_load.c new file mode 100644 index 000000000..7fa114366 --- /dev/null +++ b/libsrc/mouse/mouse_load.c @@ -0,0 +1,82 @@ +/*****************************************************************************/ +/* */ +/* 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 + + + +unsigned char __fastcall__ mouse_load_driver (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 */ + return mouse_install (ctrl.module); + + } + } + + /* Error loading the driver */ + return MOUSE_ERR_CANNOT_LOAD; +} + + +