]> git.sur5r.net Git - cc65/blob - libsrc/mouse/mouse-kernel.s
Working on the mouse stuff
[cc65] / libsrc / mouse / mouse-kernel.s
1 ;
2 ; Ullrich von Bassewitz, 2003-12-28
3 ;
4 ; Common functions of the mouse driver API.
5 ;
6
7         .import         return0
8         .importzp       ptr1
9         .condes         mouse_irq, 2            ; Export as IRQ handler
10
11         .include        "mouse-kernel.inc"
12
13
14
15 ;----------------------------------------------------------------------------
16 ; Variables
17
18
19 .bss
20 _mouse_drv:     .res    2               ; Pointer to driver
21
22 _mouse_hidden:  .res    1               ; Mouse visibility flag
23
24 ; Jump table for the driver functions.
25 .data
26 mouse_vectors:
27 mouse_install:  jmp     return0
28 mouse_uninstall:jmp     return0
29 mouse_hide:     jmp     return0
30 mouse_show:     jmp     return0
31 mouse_box:      jmp     return0
32 mouse_move:     jmp     return0
33 mouse_buttons:  jmp     return0
34 mouse_pos:      jmp     return0
35 mouse_info:     jmp     return0
36 mouse_ioctl:    jmp     return0
37 mouse_irq:      .byte   $60, $00, $00   ; RTS plus two dummy bytes
38
39 ; Driver header signature
40 .rodata
41 mouse_sig:      .byte   $6d, $6f, $75, MOUSE_API_VERSION    ; "mou", version
42
43
44 ;----------------------------------------------------------------------------
45 ; unsigned char __fastcall__ mouse_install (void* driver);
46 ; /* Install an already loaded driver. Returns an error code. */
47
48
49
50 _mouse_install:
51         sta     _mouse_drv
52         sta     ptr1
53         stx     _mouse_drv+1
54         stx     ptr1+1
55
56 ; Check the driver signature
57
58         ldy     #.sizeof(mouse_sig)-1
59 @L0:    lda     (ptr1),y
60         cmp     mouse_sig,y
61         bne     inv_drv
62         dey
63         bpl     @L0
64
65 ; Reset flags
66
67         lda     #1
68         sta     _mouse_hidden
69
70 ; Copy the jump vectors
71
72         ldy     #MOUSE_HDR::JUMPTAB
73         ldx     #0
74 @L1:    inx                             ; Skip the JMP opcode
75         jsr     copy                    ; Copy one byte
76         jsr     copy                    ; Copy one byte
77         cpy     #(MOUSE_HDR::JUMPTAB + .sizeof(MOUSE_HDR::JUMPTAB))
78         bne     @L1
79
80         jsr     mouse_install           ; Call driver install routine
81
82         ldy     mouse_irq+2             ; Check high byte of IRQ vector
83         beq     @L2                     ; Jump if vector invalid
84         ldy     #$4C                    ; Jump opcode
85         sty     mouse_irq               ; Activate IRQ routine
86 @L2:    rts
87
88 ; Driver signature invalid
89
90 inv_drv:
91         lda     #MOUSE_ERR_INV_DRIVER
92         ldx     #0
93         rts
94
95 ; Copy one byte from the jump vectors
96
97 copy:   lda     (ptr1),y
98         sta     mouse_vectors,x
99         iny
100         inx
101         rts
102
103 ;----------------------------------------------------------------------------
104 ; unsigned char __fastcall__ mouse_uninstall (void);
105 ; /* Uninstall the currently loaded driver. Returns an error code. */
106
107 _mouse_uninstall:
108         jsr     mouse_uninstall         ; Call driver routine
109
110         lda     #$60                    ; RTS opcode
111         sta     mouse_irq               ; Disable IRQ entry point
112
113 mouse_clear_ptr:                        ; External entry point
114         lda     #0
115         sta     _mouse_drv
116         sta     _mouse_drv+1            ; Clear the driver pointer
117
118         tax
119         rts                             ; Return zero
120