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