Retomando el tema principal.
Aquí esta mi código retocado con lo aprendido. Como se puede observar, aplicando EOR ya no necesito dos rutinas para conectar o desconectar el byte deseado del MSB.
Es un poco mas corto pero no lo que me gustaria. Tratare de acortarlo mas enfocandolo de otra manera.
Es lo bueno del ensamblador.
No pongo el PRG por que funciona exactamente igual que el otro, solo que es un poquiiiito mas pequeño .
;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 #255
sta $d015 ;Conecto sprites
ldy #00
loopsa sta 2040,y ;Pos mem sprite 0 2040-2047 sprite 0 al 7
iny
cpy #08
bne loopsa
ldy #00
ldx #00
loopsb lda corspritesx,x ;Leo coordenadas sprites (solo el 0 para las pruebas)
sta posprites,y ;Posiciones coord X
iny
iny
inx
cpx #8
bne loopsb
ldy #00
ldx #00
loopsc lda corspritesy,x
sta posprites+1,y
iny
iny
inx
cpx #8
bne loopsc
lda #00
sta msb
;Empieza el programa en si
;Para mover los sprites , hay que ir dandole pulsos en la direccion que se quiera.
;Si no lo hago así, se mueven demasiado deprisa ;) . Un bucle lo arreglaria, pero no quieroooo.
loop ldx#00 ; X controlara los sprites que se usen. Para el ejemplo serán los 8 (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 msbOnoff ;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 msbonOff ;Carry desactivado <0 Desconecto MSB
jmp cont ;Si carry sigue activado, seguimos
msbOnoff 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
eor valbmsb,x ;Conecto o desconecto el byt de la variable segun el sprite en curso.
sta msb ;Guarda el nuevo valor con el sprite activado/desactivado su MSB
tya ;Recupero Acu de Y
jmp cont ;Sigo con el programa
cont clc
pha ;Guardo Acu en la pila para no perderlo. Una veriable cualquiera ;)
txa ;Acu obtiene el valor de X
rol ;Lo multiplico por 2
tay ;Le doy el nuevo valor a Y para posprites
pla ;Recupero Acu antes guardado
sta corspritesx,x ;Guardar posicion sprite X
sta posprites,y ;Guardar coordenada sprite X
sta $0400 ;Control visual para ver la coordenada X del sprite
stx $0401 ;Control visual para ver el valor del registro X
sty $0402 ;Control visual para ver el valor del registro Y
inx ;Pasemos al siguiente Sprite.
cpx #08 ;Estoy ya en el último Sprite?
bne loopjoy1 ;=NO. Sigo con el bucle de muestreo
jmp loop ;=SI. Repetimos ciclo desde cero
*=$3000
;Las 8 coordenadas de los sprites almacenadas aqui
corspritesx byte $fe,$fe,$fe,$fe,$fe,$fe,$fe,$fe
corspritesy byte $50,$60,$70,$80,$90,$a0,$b0,$c0
valbmsb byte $01,$02,$04,$08,$10,$20,$40,$80 ;Byte MSB a conectar o desconectar segun se necesite