150 lines
4.5 KiB
ArmAsm
150 lines
4.5 KiB
ArmAsm
|
|
||
|
;---------------------------------------------------------------------
|
||
|
;; The 1351 mouse code was taken from the CC65 libraries,
|
||
|
;; written by Ullrich von Bassewitz
|
||
|
;---------------------------------------------------------------------
|
||
|
|
||
|
.macpack generic
|
||
|
|
||
|
.import _ctk_mouse_joyx, _ctk_mouse_joyy
|
||
|
.import _ctk_mouse_firebutton
|
||
|
.export _ctk_mouse_1351
|
||
|
;---------------------------------------------------------------------
|
||
|
.bss
|
||
|
OldValue: .res 1 ; Temp for MoveCheck routine
|
||
|
NewValue: .res 1 ; Temp for MoveCheck routine
|
||
|
YCorr: .res 1 ; Correction for Y coordinate
|
||
|
|
||
|
OldPotX: .res 1 ; Old hw counter values
|
||
|
OldPotY: .res 1
|
||
|
|
||
|
SID_ADConv1 = $D419
|
||
|
SID_ADConv2 = $D41A
|
||
|
CIA1_PRA = $DC00
|
||
|
CIA1_PRB = $DC01
|
||
|
CIA1_DDRB = $DC03
|
||
|
|
||
|
|
||
|
;---------------------------------------------------------------------
|
||
|
.data
|
||
|
XMin: .word 0 ; X1 value of bounding box
|
||
|
YMin: .word 0 ; Y1 value of bounding box
|
||
|
XMax: .word 319 ; X2 value of bounding box
|
||
|
YMax: .word 199 ; Y2 value of bounding box
|
||
|
|
||
|
;---------------------------------------------------------------------
|
||
|
.code
|
||
|
|
||
|
;---------------------------------------------------------------------
|
||
|
;---------------------------------------------------------------------
|
||
|
;; Most of the mouse code is taken from the CC65 libraries written by
|
||
|
;; Ullrich von Bassewitz
|
||
|
MoveCheck:
|
||
|
sty OldValue
|
||
|
sta NewValue
|
||
|
ldx #$00
|
||
|
|
||
|
sub OldValue ; a = mod64 (new - old)
|
||
|
and #%01111111
|
||
|
cmp #%01000000 ; if (a > 0)
|
||
|
bcs @L1 ;
|
||
|
lsr a ; a /= 2;
|
||
|
beq @L2 ; if (a != 0)
|
||
|
ldy NewValue ; y = NewValue
|
||
|
rts ; return
|
||
|
|
||
|
@L1: ora #%11000000 ; else or in high order bits
|
||
|
cmp #$FF ; if (a != -1)
|
||
|
beq @L2
|
||
|
sec
|
||
|
ror a ; a /= 2
|
||
|
dex ; high byte = -1 (X = $FF)
|
||
|
ldy NewValue
|
||
|
rts
|
||
|
|
||
|
@L2: txa ; A = $00
|
||
|
rts
|
||
|
|
||
|
;---------------------------------------------------------------------
|
||
|
_ctk_mouse_1351:
|
||
|
lda SID_ADConv1 ; Get mouse X movement
|
||
|
ldy OldPotX
|
||
|
jsr MoveCheck ; Calculate movement vector
|
||
|
sty OldPotX
|
||
|
|
||
|
; Calculate the new X coordinate (--> a/y)
|
||
|
|
||
|
add _ctk_mouse_joyx
|
||
|
tay ; Remember low byte
|
||
|
txa
|
||
|
adc _ctk_mouse_joyx+1
|
||
|
tax
|
||
|
|
||
|
; Limit the X coordinate to the bounding box
|
||
|
|
||
|
cpy XMin
|
||
|
sbc XMin+1
|
||
|
bpl @L1
|
||
|
ldy XMin
|
||
|
ldx XMin+1
|
||
|
jmp @L2
|
||
|
@L1: txa
|
||
|
|
||
|
cpy XMax
|
||
|
sbc XMax+1
|
||
|
bmi @L2
|
||
|
ldy XMax
|
||
|
ldx XMax+1
|
||
|
@L2: sty _ctk_mouse_joyx
|
||
|
stx _ctk_mouse_joyx+1
|
||
|
; Calculate the Y movement vector
|
||
|
|
||
|
lda SID_ADConv2 ; Get mouse Y movement
|
||
|
ldy OldPotY
|
||
|
jsr MoveCheck ; Calculate movement
|
||
|
sty OldPotY
|
||
|
|
||
|
; Calculate the new Y coordinate (--> a/y)
|
||
|
|
||
|
sta OldValue
|
||
|
lda _ctk_mouse_joyy
|
||
|
sub OldValue
|
||
|
tay
|
||
|
stx OldValue
|
||
|
lda _ctk_mouse_joyy+1
|
||
|
sbc OldValue
|
||
|
tax
|
||
|
|
||
|
cpy YMin
|
||
|
sbc YMin+1
|
||
|
bpl @L3
|
||
|
ldy YMin
|
||
|
ldx YMin+1
|
||
|
jmp @L4
|
||
|
@L3: txa
|
||
|
|
||
|
cpy YMax
|
||
|
sbc YMax+1
|
||
|
bmi @L4
|
||
|
ldy YMax
|
||
|
ldx YMax+1
|
||
|
@L4: sty _ctk_mouse_joyy
|
||
|
stx _ctk_mouse_joyy+1
|
||
|
|
||
|
;; Get mouse button
|
||
|
lda #$7F
|
||
|
sta CIA1_PRA
|
||
|
lda CIA1_PRB ; Read joystick #0
|
||
|
ldx #0
|
||
|
and #$1F
|
||
|
eor #$1F
|
||
|
|
||
|
ora _ctk_mouse_firebutton
|
||
|
sta _ctk_mouse_firebutton
|
||
|
|
||
|
lda #0
|
||
|
sta CIA1_PRA
|
||
|
sta CIA1_DDRB
|
||
|
rts
|
||
|
;---------------------------------------------------------------------
|