Aqui esta algo mas claro y mejorado. El primero era "en bruto".
Esto es un vicio, al principio me ha resultado duro empezar, pero insistiendo me empieza a resultar mas fácil y no hablemos de divertido o satisfactorio.
Ahora falta probar si funciona con los 8 sprites que de seguro que no sin luchar mas.
;CMB prg studio
; 10 SYS (4096)
*=$801
BYTE $0E, $08, $0A, $00, $9E, $20, $28, $34, $30, $39, $36, $29, $00, $00, $00
ciapra=$DC00 ; Joy2
msb=$D010 ;MSB >255
posprites=$D000 ;Coordenadas sprites D000-D00F
sprena=$D015 ;Sprites visibles o no
Posmemspr=$07f8 ;64*x Posicion memoria sprites 2040
*=$1000
;Conectando sprites:
lda #1
sta $d015 ;Conecto sprite 1
lda#255
sta 2040 ;Pos mem sprite 0 2040-2047 sprite 0 al 7
lda corspritesx ;Leo coordenadas sprites (solo el 0 para las pruebas)
sta posprites ;Posiciones coord X
lda corspritesy
sta posprites+1 ;Posiciones coord Y
lda #00
sta msb
loop ldx#00 ; X controlara los sprites que se usen 0-7
; Lectura Joystick puerto2 y decidir que hacer.
loopjoy1 lda ciapra ;Leer posicion joystick
cmp #127 ;Si no esta en el centro
bne loopjoy1 ;Sigo en el bucle hasta que lo sueltes
loopjoy2 lda ciapra ;Leer posicion joystick
cmp #119 ;Valor derecha
beq der ;Si o es, pues a mover hacia la derecha
cmp #123 ;Valor izquierda
beq izq ;Si lo es, pues a mover izquierda
jmp loopjoy2 ;Cualquier otra cosa, a esperar a las dos posibles direcciones.
;En un juego se controlaria la coordenada actual y si estuviera en sus limites se impediria
;la funcion de la direccion correspondiente.
;En este caso, se tendria que tener en cuenta si su MSB esta activado o no.
der lda corspritesx,x ;
clc ;Cary a 0
adc #01 ;Sumo 1 a la coordenada X
bcs msbOn ;Acarreo activado >255 conecto MSB
jmp cont ;Si no se a activado seguimos.
izq lda corspritesx,x ;
sec ;Carry a 1 para restas
sbc #01 ;Resto 1 a la coordenada X
bcc msbOff ;Carry desactivado <0 Desconecto MSB
jmp cont ;Si carry sigue activado, seguimos
msbOn tay ;Guardo Acu en Y (contiene el alor de la coordenada x aun sin guardar)
lda msb ;Carga Acu con el valor actual de MSB
clc ;Carry 0
adc valbmsb,x ;Le suma el valor de la variable segun el sprite en curso (activado en MSB)
sta msb ;Guarda el nuevo valor con el sprite activado su MSB
tya ;Recupero Acu de Y
jmp cont ;Sigo con el programa
msbOff tay ;Guardo Acu de Y
lda msb ;Carga Acu con el valor actual de MSB
sec ;Activar Carry para restas =1
sbc valbmsb,x ;Resto el valor de la variable segun el sprite en curso (activado en MSB)
sta msb ;Guarda el nuevo valor con el sprite desactivado su MSB
tya ;Recupero Acu de Y
jmp cont ; seguimos
cont clc ;Carry=0
sta corspritesx,x ;Guardar posicion sprite X
sta posprites,x ;Guardar coordenada sprite X
sta$0400 ;Control para ver la coordenada X del sprite
jmp loopjoy1
;Faltaria incrementar X tantas veces como sprite usemos y al llegar al numero deseado, vuelta a cero
*=$3000
;Las 7 coordenadas de los sprites almacenadas aqui
corspritesx byte $f0,$00,$00,$00,$00,$00,$00,$00
corspritesy byte $60,$00,$00,$00,$00,$00,$00,$00
valbmsb byte $01,$02,$04,$08,$10,$20,$40,$80 ;Byte MSB a conectar o desconectar segun se necesite