]> git.sur5r.net Git - cc65/commitdiff
- always use page 6 for P/M mouse cursor
authorChristian Groessler <chris@groessler.org>
Fri, 11 Apr 2014 21:46:53 +0000 (23:46 +0200)
committerChristian Groessler <chris@groessler.org>
Fri, 11 Apr 2014 21:51:49 +0000 (23:51 +0200)
- make cursor character of text mode callback configurable
- change default cursor character of text mode callback from 'plus' to 'diamond'
- set P/M callback as default

libsrc/atari/mcbdefault.s
libsrc/atari/mcbpm-shape.s [new file with mode: 0644]
libsrc/atari/mcbpm.s
libsrc/atari/mcbtxtchar-char.s [new file with mode: 0644]
libsrc/atari/mcbtxtchar.s [new file with mode: 0644]

index ac5056cf90f0f42840fe75e3c67680e0953ae278..75a7c74bc1896b30081ef8f5333039be331b5130 100644 (file)
@@ -1,126 +1,8 @@
 ;
-; Default mouse callbacks for the Ataris
+; This file defines the default mouse callback
 ;
-; Christian Groessler, 03.01.2014
-;
-; derived from Apple2 version by
-; Oliver Schmidt, 22.09.2005
-;
-; All functions in this module should be interrupt safe, because they may
-; be called from an interrupt handler
-;
-
-        .export         _mouse_def_callbacks
-        .importzp       tmp4
-        .import         mul40,loc_tmp
-
-        .include        "atari.inc"
-
-; ------------------------------------------------------------------------
-
-        .bss
-
-backup: .res    1
-visible:.res    1
-
-; ------------------------------------------------------------------------
-
-        .segment        "EXTZP" : zeropage
-scrptr: .res    2
-
-; ------------------------------------------------------------------------
-
-
-        .rodata
-
-        ; Callback structure
-_mouse_def_callbacks:
-        .addr   hide
-        .addr   show
-        .addr   prep
-        .addr   draw
-        .addr   movex
-        .addr   movey
-
-; ------------------------------------------------------------------------
-
-        .data
-
-cursor = 11                     ; '+' screen code'
-
-; setcursor
-
-getcursor:
-column: ldy     #$00            ; Patched at runtime
-        lda     (scrptr),y
-        rts
-
-setcursor:
-column2:ldy     #$00            ; Patched at runtime
-        sta     (scrptr),y
-        rts
-
-; ------------------------------------------------------------------------
-
-        .code
-
-done:
-        rts
-
-; Hide the mouse cursor.
-hide:
-        dec     visible
-
-prep:
-        jsr     getcursor       ; Get character at cursor position
-        cmp     #cursor         ; "mouse" character
-        bne     overwr          ; no, probably program has overwritten it
-        lda     backup          ; 
-        jmp     setcursor       ; Draw character
-overwr: sta     backup
-        rts
-
-; Show the mouse cursor.
-show:
-        inc     visible
-
-draw:
-        lda     visible
-        beq     done
-        jsr     getcursor       ; Cursor visible at current position?
-        sta     backup          ; Save character at cursor position
-        lda     #cursor
-        jmp     setcursor       ; Draw cursor
-
 
-; Move the mouse cursor x position to the value in A/X.
-movex:
-        cpx     #1
-        ror     a
-        lsr     a               ; convert to character position
-        lsr     a
-        sta     column+1
-        sta     column2+1
-        rts
+.import _mouse_pm_callbacks
+.export _mouse_def_callbacks
 
-; Move the mouse cursor y position to the value in A/X.
-movey:
-        tax
-        ldy     tmp4            ; mul40 uses tmp4
-        lda     loc_tmp         ; and this local variable
-        pha
-        txa                     ; get parameter back
-        lsr     a               ; convert y position to character line
-        lsr     a
-        lsr     a
-        jsr     mul40
-        clc
-        adc     SAVMSC
-        sta     scrptr
-        txa
-        adc     SAVMSC+1
-        sta     scrptr+1
-        pla
-        sta     loc_tmp
-        sty     tmp4
-        rts
+_mouse_def_callbacks := _mouse_pm_callbacks
diff --git a/libsrc/atari/mcbpm-shape.s b/libsrc/atari/mcbpm-shape.s
new file mode 100644 (file)
index 0000000..baf8c00
--- /dev/null
@@ -0,0 +1,32 @@
+;
+; P/M mouse shape default definition
+;
+; Christian Groessler, 11.04.2014
+;
+; Note that the height of the mouse cursor must not exceed 32
+; lines, otherwise the display routines won't do The Right
+; Thing(tm).
+;
+
+        .export mouse_pm_bits
+        .export mouse_pm_height    : absolute
+        .export mouse_pm_hotspot_x : absolute
+        .export mouse_pm_hotspot_y : absolute
+
+
+        .data
+
+mouse_pm_bits:
+        .byte   %11110000
+        .byte   %11000000
+        .byte   %10100000
+        .byte   %10010000
+        .byte   %10001000
+        .byte   %00000100
+        .byte   %00000010
+
+mouse_pm_height = * - mouse_pm_bits
+
+; hot spot is upper left corner
+mouse_pm_hotspot_x = 0
+mouse_pm_hotspot_y = 0
index c7a350d056a41cae313529092ccac9d1640ed83a..b431ac414e59b3d14f49abd66a30436fd4740bf9 100644 (file)
@@ -1,42 +1,48 @@
 ;
 ; P/M mouse callbacks for the Ataris
 ;
-; Christian Groessler, 07.04.2014
+; Christian Groessler, 11.04.2014
 ;
 ; All functions in this module should be interrupt safe, because they may
 ; be called from an interrupt handler
 ;
 
         .include        "atari.inc"
-       .importzp       sp
+        .importzp       sp
+        .export         _mouse_pm_callbacks
         .constructor    pm_init,27
         .destructor     pm_down,7
-        .export         _mouse_pm_callbacks
+
+; get mouse shape data
+        .import mouse_pm_bits
+        .import mouse_pm_height
+        .import mouse_pm_hotspot_x
+        .import mouse_pm_hotspot_y
 
 
 ; P/M definitions. The first value can be changed to adjust the number
 ; of the P/M used for the mouse. All others depend on this value.
 ; Valid P/M numbers are 0 to 4. When 4 is used, the missiles are used
 ; as a player.
-MOUSE_PM_NUM    = 4                             ; P/M used for the mouse
-MOUSE_PM_BASE   = pm_base
+MOUSE_PM_NUM    = 2                             ; P/M used for the mouse
+MOUSE_PM_BASE   = pm_base                       ; ZP location pointing to the hw area used by the selected P/M
 
 .if MOUSE_PM_NUM = 4
-MOUSE_PM_RAW   = 0
-.macro set_mouse_x
-       ; assume CF = 0
-       sta     HPOSM3
-       adc     #2
-       sta     HPOSM2
-       adc     #2
-       sta     HPOSM1
-       adc     #2
-       sta     HPOSM0
+MOUSE_PM_RAW    = 0                             ; MOUSE_PM_RAW is the hardware P/M number for MOUSE_PM_NUM
+.macro  set_mouse_x
+        ; assume CF = 0
+        sta     HPOSM3
+        adc     #2
+        sta     HPOSM2
+        adc     #2
+        sta     HPOSM1
+        adc     #2
+        sta     HPOSM0
 .endmacro
 .else
-MOUSE_PM_RAW   = MOUSE_PM_NUM + 1
-.macro set_mouse_x
-       sta     HPOSP0 + MOUSE_PM_NUM
+MOUSE_PM_RAW    = MOUSE_PM_NUM + 1
+.macro  set_mouse_x
+        sta     HPOSP0 + MOUSE_PM_NUM
 .endmacro
 .endif
 
@@ -57,7 +63,8 @@ _mouse_pm_callbacks:
 
         .bss
 
-omy:    .res    1                       ; Old Mouse Y position
+omy:    .res    1                       ; old Mouse Y position
+colhlp: .res    1                       ; helper variable to set P/M color
 
 ; ------------------------------------------------------------------------
 
@@ -72,7 +79,7 @@ pm_base:.res    2
 ; Hide the mouse cursor.
 hide:   lda     #0
         sta     GRACTL
-       rts
+        rts
 
 ; Show the mouse cursor.
 show:
@@ -82,123 +89,105 @@ show:
         lda     #1
 .endif
         sta     GRACTL
-        ;rts
+        ;rts                            ; optimized out
 
 prep:
 draw:
         rts
 
 ; Move the mouse cursor x position to the value in A/X.
-movex: cpx     #1
-       ror     a
-       clc
-       adc     #48
-       set_mouse_x
-        rts
+movex:  cpx     #1
+        ror     a
+        clc
+        adc     #48
+        sbc     #<(mouse_pm_hotspot_x - 1)
+        set_mouse_x
+        jmp     update_colors
 
 ; Move the mouse cursor y position to the value in A/X.
 movey:  clc
-       adc     #32
-       pha
+        adc     #32
+        sbc     #<(mouse_pm_hotspot_y - 1)
+        pha
         lda     omy
         jsr     clr_pm                  ; remove player at old position
+        jsr     update_colors
         pla
         sta     omy
         ;jmp    set_pm                  ; put player to new position
+        ; fall thru
 
-; Set P/M data from 'mouse_bits'
+; Set P/M data from 'mouse_pm_bits'
 set_pm: tay
         ldx     #0
-set_l:  lda     mouse_bits,x
+set_l:  lda     mouse_pm_bits,x
         sta     (MOUSE_PM_BASE),y
         inx
         iny
-        cpx     #mouse_height
+        beq     set_end
+        cpx     #<mouse_pm_height
         bcc     set_l
-        rts
+set_end:rts
 
 ; Clear (zero) P/M data
-clr_pm: ldx     #mouse_height
+clr_pm: ldx     #<mouse_pm_height
         tay
         lda     #0
 clr_l:  sta     (MOUSE_PM_BASE),y
         iny
+        beq     clr_end
         dex
         bne     clr_l
-        rts
+clr_end:rts
 
 
-pm_down        = hide
+pm_down = hide
 
 
-; ------------------------------------------------------------------------
-
-       .segment "INIT"
-
-pm_init:lda    #0
-       sta     sp
-       sta     MOUSE_PM_BASE
-       lda     sp+1
-       and     #7                      ; offset within 2K
-       cmp     #3 + MOUSE_PM_RAW + 1   ; can we use it?
-       bcc     @decr                   ; no
-
-       lda     sp+1
-       and     #$F8
-@set:  adc     #3 + MOUSE_PM_RAW - 1   ; CF is set, so adding MOUSE_PM_RAW + 3
-       sta     MOUSE_PM_BASE+1
-       sta     sp+1
-       bne     @cont
-
-@decr: lda     sp+1
-       and     #$F8
-       sbc     #8 - 1                  ; CF is clear, subtracts 8
-       bcs     @set                    ; jump always
-
-@cont: lda     #0
-       tay
-@iniloo:sta    (MOUSE_PM_BASE),y
-       iny
-       bne     @iniloo
-
-       lda     MOUSE_PM_BASE+1
-       and     #$F8
-       sta     PMBASE
-
-        lda     #62
-        sta     SDMCTL
-
-        lda     #1 + 16
-        sta     GPRIOR
-
-        lda     #0
+; this assumes a GRAPHICS 0 screen
+update_colors:
+        lda     COLOR2                  ; get background color
+        and     #$F0
+        sta     colhlp
+        lda     COLOR1
+        and     #$0F
+        ora     colhlp
 
 .if MOUSE_PM_NUM = 4
-       sta     PCOLR0
-       sta     PCOLR1
-       sta     PCOLR2
-       sta     PCOLR3
-       sta     SIZEM
+        sta     PCOLR0
+        sta     PCOLR1
+        sta     PCOLR2
+        sta     PCOLR3
+        sta     SIZEM
 .else
         sta     PCOLR0 + MOUSE_PM_NUM
         sta     SIZEP0 + MOUSE_PM_NUM
 .endif
         rts
 
-
 ; ------------------------------------------------------------------------
 
-        .data
+        .segment "INIT"
 
-mouse_bits:
-        .byte   %11110000
-        .byte   %11000000
-        .byte   %10100000
-        .byte   %10010000
-        .byte   %10001000
-        .byte   %00000100
-        .byte   %00000010
-;       .byte   %00000000
+pm_init:lda     #0
+        sta     MOUSE_PM_BASE
+        ldx     #6                      ; page 6
+        stx     MOUSE_PM_BASE+1
+        tay
+@iniloo:sta     (MOUSE_PM_BASE),y
+        iny
+        bne     @iniloo
 
-mouse_height = * - mouse_bits
+.if 0   ; enable if not using page 6 for P/M data
+        lda     MOUSE_PM_BASE+1
+        and     #$F8
+.endif
+        sta     PMBASE
+
+        lda     #62
+        sta     SDMCTL
+
+        lda     #1 + 16
+        sta     GPRIOR
 
+        jmp     update_colors
diff --git a/libsrc/atari/mcbtxtchar-char.s b/libsrc/atari/mcbtxtchar-char.s
new file mode 100644 (file)
index 0000000..46462c1
--- /dev/null
@@ -0,0 +1,9 @@
+;
+; Default text mode mouse cursor character
+;
+; Christian Groessler, 11.04.2014
+;
+
+        .export mouse_txt_char : absolute
+
+mouse_txt_char = 96     ; 'diamond' screen code
diff --git a/libsrc/atari/mcbtxtchar.s b/libsrc/atari/mcbtxtchar.s
new file mode 100644 (file)
index 0000000..a80fe8f
--- /dev/null
@@ -0,0 +1,125 @@
+;
+; Text mode character mouse callbacks for the Ataris
+;
+; Christian Groessler, 03.01.2014
+;
+; derived from Apple2 version by
+; Oliver Schmidt, 22.09.2005
+;
+; All functions in this module should be interrupt safe, because they may
+; be called from an interrupt handler
+;
+
+        .export         _mouse_txt_callbacks
+        .importzp       tmp4
+        .import         mul40,loc_tmp
+        .import         mouse_txt_char          ; screen code of mouse cursor
+
+        .include        "atari.inc"
+
+; ------------------------------------------------------------------------
+
+        .bss
+
+backup: .res    1
+visible:.res    1
+
+; ------------------------------------------------------------------------
+
+        .segment        "EXTZP" : zeropage
+scrptr: .res    2
+
+; ------------------------------------------------------------------------
+
+
+        .rodata
+
+        ; Callback structure
+_mouse_txt_callbacks:
+        .addr   hide
+        .addr   show
+        .addr   prep
+        .addr   draw
+        .addr   movex
+        .addr   movey
+
+; ------------------------------------------------------------------------
+
+        .data
+
+; setcursor
+
+getcursor:
+column: ldy     #$00            ; Patched at runtime
+        lda     (scrptr),y
+        rts
+
+setcursor:
+column2:ldy     #$00            ; Patched at runtime
+        sta     (scrptr),y
+        rts
+
+; ------------------------------------------------------------------------
+
+        .code
+
+done:
+        rts
+
+; Hide the mouse cursor.
+hide:
+        dec     visible
+
+prep:
+        jsr     getcursor       ; Get character at cursor position
+        cmp     #<mouse_txt_char; "mouse" character
+        bne     overwr          ; no, probably program has overwritten it
+        lda     backup          ; 
+        jmp     setcursor       ; Draw character
+overwr: sta     backup
+        rts
+
+; Show the mouse cursor.
+show:
+        inc     visible
+
+draw:
+        lda     visible
+        beq     done
+        jsr     getcursor       ; Cursor visible at current position?
+        sta     backup          ; Save character at cursor position
+        lda     #<mouse_txt_char
+        jmp     setcursor       ; Draw cursor
+
+
+; Move the mouse cursor x position to the value in A/X.
+movex:
+        cpx     #1
+        ror     a
+        lsr     a               ; convert to character position
+        lsr     a
+        sta     column+1
+        sta     column2+1
+        rts
+
+; Move the mouse cursor y position to the value in A/X.
+movey:
+        tax
+        ldy     tmp4            ; mul40 uses tmp4
+        lda     loc_tmp         ; and this local variable
+        pha
+        txa                     ; get parameter back
+        lsr     a               ; convert y position to character line
+        lsr     a
+        lsr     a
+        jsr     mul40
+        clc
+        adc     SAVMSC
+        sta     scrptr
+        txa
+        adc     SAVMSC+1
+        sta     scrptr+1
+        pla
+        sta     loc_tmp
+        sty     tmp4
+        rts