Thanks for cleaning it up! It works just fine now. There was only one minor problem I found but it was an easy fix. The value in d1 was different then what your touch_chkvalue optimization was expecting, so it'd use incorrect routines for lower values, and used garbage pointers past the end of the list on higher ones. It was a simple fix though, I just added this line before it: Code: asr.w #1,d1 ;shift back to get the list pointer move.l TouchRoutines-4(pc,d1.w),-(sp) ; load routine rts ; run routine It does make the code ever so slightly slower, I suppose, but I'd much rather it happen here then in the collision detection code. Thanks for taking the time, it really helps.