This is original code from my game. Driver for amiga and ST mouse. You must call this procedure all the time. After every long break you must call the init procedure. (Because the synchronization....) Main proc: lda $d300 lsr @ lsr @ lsr @ lsr @ pha and #10 (#3 in ST) ; there you check left-right move ldy #3 l1 cmp htab,y beq l2 dey bne l1 l2 tya clc adc #1 and #3 cmp xind bne l3 sty xind dec xcur l3 tya sec sbc #1 and #3 cmp xind bne l4 sty xind inc xcur l4 pla and #5 (#12 in ST) and there is routine for up-down. The same as left-right but: xind is translated to yind xcur to ycur htab to vtab Init proc: there you are only check actual mouse position lda $d300 lsr @ lsr @ lsr @ lsr @ pha and #10 (#3 in ST) ldy #3 i1 cmp htab,y beq i2 dey bne i1 i2 sty xind pla and #5 (#12 in ST) ldy #3 i3 cmp vtab,y beq i4 dey bne i3 i4 sty yind simpe,isn't it? So, for now only left tables: htab: Amiga: 0,2,10,8 ST: 0,2,3,1 vtab: Amiga: 0,1,5,4 ST: 0,8,12,4 I hope it will works. As I know, Vblank interrupt is fast enough, so after it, you needn't call the init proc.