nes-proj/platform/c64/ctk/ctk-mouse-1351.S

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
;---------------------------------------------------------------------