From: Christian Groessler Date: Fri, 11 Apr 2014 21:46:53 +0000 (+0200) Subject: - always use page 6 for P/M mouse cursor X-Git-Tag: V2.15~76^2~2 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=526b440b2493629a36b3499fc51ea0df8ecf4ee2;p=cc65 - always use page 6 for P/M mouse cursor - 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 --- diff --git a/libsrc/atari/mcbdefault.s b/libsrc/atari/mcbdefault.s index ac5056cf9..75a7c74bc 100644 --- a/libsrc/atari/mcbdefault.s +++ b/libsrc/atari/mcbdefault.s @@ -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 index 000000000..baf8c0020 --- /dev/null +++ b/libsrc/atari/mcbpm-shape.s @@ -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 diff --git a/libsrc/atari/mcbpm.s b/libsrc/atari/mcbpm.s index c7a350d05..b431ac414 100644 --- a/libsrc/atari/mcbpm.s +++ b/libsrc/atari/mcbpm.s @@ -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 #