; fast mouse driver by
; Laokoon/NG
; 22 iii mcmxcviii

 Org $9000

baze EQU $d407
col0 EQU $02c0
siz0 EQU $d008
poz0 EQU $d000
gtcs EQU $026f
dmas EQU $022f
pmct EQU $d01d
stvb EQU $e45c
tmc2 EQU $021a
ptln EQU $c642
dzoy EQU $d300

pm   EQU $a000-$400

start:
     JSR clr
     JSR opm

     LDA #0
     STA 82
     LDX <txt1  ;Inscriptions
     LDY >txt1
     JSR ptln
     LDX <txt2
     LDY >txt2
     JSR ptln
     LDX <txt3
     LDY >txt3
     JSR ptln

     LDY <put   ;Set TIMER 2
     LDX >put
     LDA #9
     JSR stvb

     LDA del
     STA tmc2

     LDA #$ff
     STA 764
     LDA #100
     STA my

loop:
     JSR mous  ;Main loop
     LDA 764
     CMP #$ff
     BEQ loop

     LDX #0    ;Exit
     STX tmc2
     DEX
     STX 764
     JMP cpm

; Main procedure of driver
mous:
     LDA dzoy
     AND #$f0
     TAY
     EOR pms
     BNE *+3
     RTS

     TAX
     STY pms


hor: BPL n7

     TYA
     BPL l0

     AND #%00100000
     BEQ l1
     LDA rsx
     ADC cix
     STA rsx
     BCC l1-3
     INC mx
     JMP ver
l1:  LDA rsx
     SBC cix
     STA rsx
     BCS l1-3
     DEC mx
     JMP ver

l0:  AND #%00100000
     BEQ l2
     LDA rsx
     SBC cix
     STA rsx
     BCS ver
     DEC mx
     JMP ver
l2:  LDA rsx
     ADC cix
     STA rsx
     BCC ver
     INC mx
     JMP ver

n7:  AND #%00100000
     BEQ ver

     TYA
     AND #%00100000
     BEQ l3

     TYA
     BPL l4
     LDA rsx
     SBC cix
     STA rsx
     BCS ver
     DEC mx
     JMP ver
l4:  LDA rsx
     ADC cix
     STA rsx
     BCC ver
     INC mx
     JMP ver

l3:  TYA
     BPL l5
     LDA rsx
     ADC cix
     STA rsx
     BCC ver
     INC mx
     JMP ver
l5:  LDA rsx
     SBC cix
     STA rsx
     BCS ver
     DEC mx

ver: TXA
     AND #%01000000
     BEQ n6

     TYA
     AND #%01000000
     BEQ l6

     TYA
     AND #%00010000
     BEQ l7
     LDA rsy
     ADC ciy
     STA rsy
     BCC l7-3
     INC my
     JMP kon
l7:  LDA rsy
     SBC ciy
     STA rsy
     BCS l7-3
     DEC my
     JMP kon

l6:  TYA
     AND #%00010000
     BEQ l8
     LDA rsy
     SBC ciy
     STA rsy
     BCS kon
     DEC my
     JMP kon
l8:  LDA rsy
     ADC ciy
     STA rsy
     BCC kon
     INC my
     JMP kon

n6:  TXA
     AND #%00010000
     BEQ kon

     TYA
     AND #%00010000
     BEQ l9

     TYA
     AND #%01000000
     BEQ l10
     LDA rsy
     SBC ciy
     STA rsy
     BCS kon
     DEC my
     JMP kon
l10: LDA rsy
     ADC ciy
     STA rsy
     BCC kon
     INC my
     JMP kon

l9:  TYA
     AND #%01000000
     BEQ l11
     LDA rsy
     ADC ciy
     STA rsy
     BCC kon
     INC my
     JMP kon
l11: LDA rsy
     SBC ciy
     STA rsy
     BCS kon
     DEC my

kon: RTS

; Drawing cursor procedure
; Placed on TIMER 2
put: LDA oy
     STA _0+1
     LDX #7
     LDA #0
_0:  STA pm,X
     DEX
     BPL _0

     LDA my
     STA _1+1
     LDX #7
c0:  LDA kt,X
_1:  STA pm,X
     DEX
     BPL c0

     LDA my
     STA oy
     LDA mx
     STA poz0
     LDA del
     STA tmc2
     RTS

; Initialization P/MG
opm: LDA >pm
     STA baze
     LDA #$f
     STA col0
     LDA #0
     STA siz0
     LDA #1
     STA gtcs
     LDA #%00111010
     STA dmas
     LDA #2
     STA pmct
     RTS

; Turn off P/MG
cpm: LDA #0
     STA poz0
     STA pmct
     LDA #%00100010
     STA dmas
     RTS

; Clear all memory for sprite
clr: LDX #0
     TXA
cl0: STA pm,X
     DEX
     BNE cl0
     RTS

;parameters
mx   DB B(100) ;horizontal position
my   DB B(100) ;vertical position
del  DB B(1)   ;How many frames is the cursor drawn ?
cix  DB B($ff) ;x scale
ciy  DB B($ff) ;y scale

; working variables
pms  DB B(0) ;secondary mouse pointer
oy   DB B(0) ;old horisontal position
rsx  DB B(0) ;x residual
rsy  DB B(0) ;y residual

txt1  DB C'Fast Mouse Driver by Laokoon/NG',B(155)
txt2  DB C'Connect an AMIGA mouse to second port...',B(155)
txt3  DB C'Press key to leave...',B(155)

; Datas for sprite
kt   DB B(%10000000)
     DB B(%01100000)
     DB B(%01111000)
     DB B(%00111110)
     DB B(%00111100)
     DB B(%00011100)
     DB B(%00010010)
     DB B(%00000001)
End start
