Usa EOR en vez de ORA.
Prueba los efectos de cada uno en esta página:
http://skilldrick.github.io/easy6502/Con este pequeño ejemplo:
lda #$00 ;Valor de $D010 yo he puesto ninguno.
eor #$02 ;Sprite 1 activar o desactivarlo.
sta $0400 ;Por poner algo XD
rts
Tienes en el lado derecho los resultados, el valor del ACU X e Y , estados de banderas, etc
En vez de tratar de controlar todo, deberías tratar de dejarlo trabajar mas naturalmente.
Tal y como lo haces, cuando X=0, saltará por si solo un pixel ya que lo pones automáticamente a #$FF dando un salto de doble pixel.
Si no dejas que los sprites pasen de largo por los marcos y aparezcan por el otro lado, el sistema que te he puesto funciona bien y sin tantos líos.
Para comprobar los limites, con preguntar si el bit del sprite que deseas está activado o no , que no pase de cierto limite de X.
Si no está activado, que no sea menor de XX (dirección izquierda).
si está activado, que no sea mayor de XX (dirección derecha).
Una explicación.
SUMAR
Si X=#$FF y le sumas #$01, se activa el desbordamiento CARRY flag (seria X=256, pero como no puede ser, pasa a 0 y activa el carry.
Cuando eso pase, activas el bit que le corresponda en el MSB $D010 y sin tocar ni ajustar nada, ya tienes el sprite justo en el pixel que deseas. Antes de cambiar $D010, desactiva el Carry con CLC.
RESTAR
Antes debes activa el CARRY flag con SEC para las restas (SBC) . Si X=#$00 y le restas #$01. Si la bandera de CARRY está a cero (desbordamiento del carry negativo XD) , desactiva el bit del sprite deseado en el MSB $D010.
Si el Carry está activado, es que no ha habido desbordamiento y no tienes que hacer nada, solo limpiarlo con CLC antes de continuar con el programa.
Creo que lo he explicado correctamente. Si en algo me he equivocado, corregidme porfa.