]> git.sur5r.net Git - cc65/commitdiff
Adjusted driver to the recent kernel interface change (code rearrange ment necessary...
authorol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 27 Sep 2009 23:26:41 +0000 (23:26 +0000)
committerol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 27 Sep 2009 23:26:41 +0000 (23:26 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@4251 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/apple2/apple2-stdmou.s

index 0cedfcac4e475b5372242dc1048af9cd91164ebc..65d84a81a692d2c565a0351e4cc4db510045ffe4 100644 (file)
@@ -39,7 +39,8 @@ status                := $0778
        .addr   UNINSTALL
        .addr   HIDE
        .addr   SHOW
-       .addr   BOX
+       .addr   SETBOX
+       .addr   GETBOX
        .addr   MOVE
        .addr   BUTTONS
        .addr   POS
@@ -60,6 +61,7 @@ CMOVEY: jmp   $0000                   ; Move the cursor to Y coord
 
        .bss
 
+box:   .tag    MOUSE_BOX
 info:  .tag    MOUSE_INFO
 slot:  .res    1
 visible:.res   1
@@ -80,6 +82,11 @@ values: .byte        $38             ; Fixed
 
 size   = * - values
 
+inibox:        .word     0             ; MinX
+       .word     0             ; MinY
+       .word   279             ; MaxX
+       .word   191             ; MaxY
+
 ; ------------------------------------------------------------------------
 
        .data
@@ -135,9 +142,13 @@ next:      inc     ptr1+1
        sta     xparam+1
        sta     jump+2
 
+       ; Disable interrupts now because setting the slot number makes 
+       ; the IRQ handler (maybe called due to some non-mouse IRQ) try
+       ; calling the firmware which isn't correctly set up yet
+       sei
+
        ; Convert to and save slot number
        and     #$0F
-       sei
        sta     slot
 
        ; Convert to and patch I/O register index
@@ -164,22 +175,9 @@ next:      inc     ptr1+1
        jsr     firmware
 
        ; Set initial mouse clamps
-       lda     #<279
-       ldx     #>279
-       sta     pos2_lo
-       stx     pos2_hi
-       lda     #$00            ; Set x clamps
-       sta     pos1_lo
-       sta     pos1_hi
-       ldx     #CLAMPMOUSE
-       jsr     firmware
-       lda     #<191
-       ldx     #>191
-       sta     pos2_lo
-       stx     pos2_hi
-       lda     #$01            ; Set y clamps
-       ldx     #CLAMPMOUSE
-       jsr     firmware
+       lda     #<inibox
+       ldx     #>inibox
+       jsr     SETBOX
 
        ; Set initial mouse position
        ldx     slot
@@ -220,74 +218,69 @@ UNINSTALL:
        ldx     #SETMOUSE
        bne     common          ; Branch always
 
-; HIDE: Is called to hide the mouse cursor. The mouse kernel manages a
-; counter for calls to show/hide, and the driver entry point is only called
-; if the mouse is currently visible and should get hidden. For most drivers,
-; no special action is required        besides hiding the mouse cursor.
-; No return code required.
-HIDE:
-       dec     visible
-       sei
-       jsr     CHIDE
-       cli
-       rts
-
-; SHOW:        Is called to show the mouse cursor. The mouse kernel manages a
-; counter for calls to show/hide, and the driver entry point is        only called
-; if the mouse is currently hidden and should become visible. For most drivers,
-; no special action is required        besides enabling the mouse cursor.
-; No return code required.
-SHOW:
-       inc     visible
-       rts
-
-; BOX: Set the mouse bounding box. The parameters are passed as        they come from
-; the C        program, that is, maxy in A/X and the other parameters on the stack.
-; The C        wrapper will remove the parameters from the stack when the driver
-; routine returns.
+; SETBOX: Set the mouse bounding box. The parameters are passed as they come
+; from the C program, that is, a pointer to a mouse_box struct in A/X.
 ; No checks are done if the mouse is currently inside the box, this is the job
 ; of the caller. It is not necessary to validate the parameters, trust the
 ; caller and save some code here. No return code required.
-BOX:
-       ; Apple II Mouse TechNote #1, Interrupt Environment with the Mouse:
-       ; "Disable interrupts before placing position information in the screen holes."
-       sei
-
-       ; Set high clamp
-       sta     pos2_lo
-       txa
-
-       ldx     #$01            ; Set y clamps
-       ldy     #$00            ; Start at top of stack
+SETBOX:
+       sta     ptr1
+       stx     ptr1+1
+        
+       ; Set x clamps
+       ldx     #$00
+       ldy     #MOUSE_BOX::MINX
        jsr     :+
+       
+       ; Set y clamps
+       ldx     #$01
+       ldy     #MOUSE_BOX::MINY
 
-       ldx     #$00            ; Set x clamps
-       ldy     #$00            ; Start at top of stack
+       ; Apple II Mouse TechNote #1, Interrupt Environment with the Mouse:
+       ; "Disable interrupts before placing position information in the
+       ;  screen holes."
+:      sei
 
-       ; Set high clamp
-       lda     (sp),y
-       iny
-       sei
-       sta     pos2_lo
-       lda     (sp),y
+       ; Set low clamp
+       lda     (ptr1),y
+       sta     box,y
+       sta     pos1_lo
        iny
-:      sta     pos2_hi
+       lda     (ptr1),y
+       sta     box,y   
+       sta     pos1_hi
 
-       ; Skip one parameter
+       ; Skip one word
        iny
        iny
 
-       ; Set low clamp
-       lda     (sp),y
+       ; Set high clamp
        iny
-       sta     pos1_lo
-       lda     (sp),y
-       sta     pos1_hi
+       lda     (ptr1),y
+       sta     box,y   
+       sta     pos2_lo
+       iny
+       lda     (ptr1),y
+       sta     box,y   
+       sta     pos2_hi
 
        txa
        ldx     #CLAMPMOUSE
        bne     common          ; Branch always
 
+; GETBOX: Return the mouse bounding box. The parameters are passed as they
+; come from the C program, that is, a pointer to a mouse_box struct in A/X.
+GETBOX:
+       sta     ptr1
+       stx     ptr1+1
+
+       ldy     #.sizeof(MOUSE_BOX)-1
+:      lda     box,y
+       sta     (ptr1),y
+       dey
+       bpl     :-
+       rts
+
 ; MOVE: Move the mouse to a new position. The position is passed as it comes
 ; from the C program, that is: x on the stack and y in A/X. The C wrapper will
 ; remove the parameter from the stack on return.
@@ -319,6 +312,27 @@ MOVE:
        ldx     #POSMOUSE
        bne     common          ; Branch always
 
+; HIDE: Is called to hide the mouse cursor. The mouse kernel manages a
+; counter for calls to show/hide, and the driver entry point is only called
+; if the mouse is currently visible and should get hidden. For most drivers,
+; no special action is required        besides hiding the mouse cursor.
+; No return code required.
+HIDE:
+       dec     visible
+       sei
+       jsr     CHIDE
+       cli
+       rts
+
+; SHOW:        Is called to show the mouse cursor. The mouse kernel manages a
+; counter for calls to show/hide, and the driver entry point is        only called
+; if the mouse is currently hidden and should become visible. For most drivers,
+; no special action is required        besides enabling the mouse cursor.
+; No return code required.
+SHOW:
+       inc     visible
+       rts
+
 ; BUTTONS: Return the button mask in A/X.
 BUTTONS:
        lda     info + MOUSE_INFO::BUTTONS
@@ -328,19 +342,16 @@ BUTTONS:
 ; POS: Return the mouse position in the MOUSE_POS struct pointed to by ptr1.
 ; No return code required.
 POS:
-       ldx     #.sizeof(MOUSE_POS)-1
+       ldy     #.sizeof(MOUSE_POS)-1
        bne     copy            ; Branch always
 
 ; INFO: Returns mouse position and current button mask in the MOUSE_INFO
 ; struct pointed to by ptr1. No return code required.
 INFO:
-       ldx     #.sizeof(MOUSE_INFO)-1
-copy:  txa
-       tay
-       sei
-:      lda     info,x
+       ldy     #.sizeof(MOUSE_INFO)-1
+copy:  sei
+:      lda     info,y
        sta     (ptr1),y
-       dex
        dey
        bpl     :-
        cli