;/*****************************************************************************/
;/*                                                                           */
;/*                            mouse-kernel.inc                               */
;/*                                                                           */
;/*                                Mouse API                                  */
;/*                                                                           */
;/*                                                                           */
;/*                                                                           */
;/* (C) 2003-2009, Ullrich von Bassewitz                                      */
;/*                Roemerstrasse 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.                                                          */
;/*                                                                           */
;/*****************************************************************************/




;------------------------------------------------------------------------------
; Error codes

.enum
        MOUSE_ERR_OK                    ; No error
        MOUSE_ERR_NO_DRIVER             ; No driver available
        MOUSE_ERR_CANNOT_LOAD           ; Error loading driver
        MOUSE_ERR_INV_DRIVER            ; Invalid driver
        MOUSE_ERR_NO_DEVICE             ; Mouse hardware not found
        MOUSE_ERR_INV_IOCTL             ; Invalid ioctl code

        MOUSE_ERR_COUNT                 ; Special: Number of error codes
.endenum

;------------------------------------------------------------------------------
; The driver header

.struct MOUSE_HDR
        ID              .byte   3       ; Contains 0x6D, 0x6F, 0x75 ("mou")
        VERSION         .byte   1       ; Interface version
        LIBREF          .addr           ; Library reference
        JUMPTAB         .struct
            INSTALL     .addr
            UNINSTALL   .addr
            HIDE        .addr
            SHOW        .addr
            SETBOX      .addr
            GETBOX      .addr
            MOVE        .addr
            BUTTONS     .addr
            POS         .addr
            INFO        .addr
            IOCTL       .addr
            IRQ         .addr
        .endstruct
        FLAGS           .byte           ; Mouse driver flags
        CALLBACKS .struct               ; Jump instructions
                        .byte           ; JMP opcode
            CHIDE       .addr           ; Jump address
                        .byte
            CSHOW       .addr
                        .byte
            CPREP       .addr
                        .byte
            CDRAW       .addr
                        .byte
            CMOVEX      .addr
                        .byte
            CMOVEY      .addr
        .endstruct
.endstruct

;------------------------------------------------------------------------------
; The mouse callback structure

.struct MOUSE_CALLBACKS
        HIDE    .addr                   ; Hide the mouse cursor
        SHOW    .addr                   ; Show the mouse cursor
        PREP    .addr                   ; Prepare to move the mouse cursor
        DRAW    .addr                   ; Draw the mouse cursor
        MOVEX   .addr                   ; Move the mouse cursor to X coord
        MOVEY   .addr                   ; Move the mouse cursor to Y coord
.endstruct

;------------------------------------------------------------------------------
; The mouse API version, stored in MOUSE_HDR::VERSION

MOUSE_API_VERSION       = $05

;------------------------------------------------------------------------------
; Bitmapped mouse driver flags, stored in MOUSE_HDR::FLAGS.
; Note: If neither of MOUSE_FLAG_XXX_IRQ is set, no interrupts are supplied
; to the driver. If one of the bits is set, the interrupt vector MUST be
; valid.
; Beware: Some of the bits are tested using the BIT instruction, so do not
; change the values without checking the code!

MOUSE_FLAG_EARLY_IRQ    = $40           ; Enable IRQ *before* calling INSTALL
MOUSE_FLAG_LATE_IRQ     = $80           ; Enable IRQ *after* calling INSTALL

;------------------------------------------------------------------------------
; Mouse button definitions

MOUSE_BTN_LEFT          = $10
MOUSE_BTN_RIGHT         = $01

;------------------------------------------------------------------------------
; Structures used to return data from the mouse driver

.struct MOUSE_POS
        XCOORD  .word
        YCOORD  .word
.endstruct

.struct MOUSE_INFO
        POS     .tag    MOUSE_POS
        BUTTONS .byte
.endstruct

.struct MOUSE_BOX
        MINX    .word
        MINY    .word
        MAXX    .word
        MAXY    .word
.endstruct

;------------------------------------------------------------------------------
; Variables

        .global _mouse_drv              ; Pointer to driver
        .global _mouse_hidden           ; Counter, 0 = mouse is visible

;------------------------------------------------------------------------------
; C callable functions

        .global _mouse_load_driver
        .global _mouse_unload
        .global _mouse_install
        .global _mouse_uninstall
        .global _mouse_geterrormsg
        .global _mouse_hide
        .global _mouse_show
        .global _mouse_setbox
        .global _mouse_getbox
        .global _mouse_move
        .global _mouse_buttons
        .global _mouse_pos
        .global _mouse_info
        .global _mouse_ioctl

        .global _mouse_clear_ptr

;------------------------------------------------------------------------------
; Driver entry points (asm callable)

        .global mouse_install
        .global mouse_uninstall
        .global mouse_hide
        .global mouse_show
        .global mouse_setbox
        .global mouse_getbox
        .global mouse_move
        .global mouse_buttons
        .global mouse_pos
        .global mouse_info
        .global mouse_ioctl