mirror of
https://github.com/cc65/cc65.git
synced 2024-12-23 19:29:37 +00:00
119 lines
2.8 KiB
ArmAsm
119 lines
2.8 KiB
ArmAsm
;
|
|
; 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
|
|
.importzp 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:
|
|
ldy tmp4 ; mul40 uses tmp4, save in Y
|
|
lsr a ; convert y position to character line
|
|
lsr a
|
|
lsr a
|
|
jsr _mul40 ; carry is cleared by _mul40
|
|
adc SAVMSC
|
|
sta scrptr
|
|
txa
|
|
adc SAVMSC+1
|
|
sta scrptr+1
|
|
sty tmp4 ; restore tmp4
|
|
rts
|