Autor Tema: Dudas en Ensamblador  (Leído 166806 veces)

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #225 en: Julio 19, 2015, 22:03:24 »
Buff!!, he estado probando la rutina y me hace una cosa muy rara,..la rutina inicial la he incluido segun me la has puesto y la llamo cada vez que Kabura se mueve, tanto sea a derecha o izquierda y arriba o abajo (ascienda o descienda en un salto)..ya tengo hecha la rutina de muerte de Kabura que es llamada cuando la colision existe e incluida en la Etiqueta COLISION que tu ponias en la rutina.

Partamos de la base de que Kabura se encuentra en el centro de la pantalla (como siempre es, ya que kabura en realidad no se mueve, lo que se mueve es el scroll y los enemigos),...bueno pues lo compilo y lo llamo como digo en los movimientos de Kabura,..¿y que ocurre?

Pues que Kabura estando en el centro de la pantalla,...MUERE AUTOMATICAMENTE!!, no lo entiendo ya que no a colisionado con ningun enemigo ya que estos empiezan a aproximarse a él tanto a derecha como a izquierda desde los extremos de la pantalla.

Creo que voy a dejarlo por hoy porque me esta saliendo humo de la cabeza!!,..al final esto no va a ser tan facil como parece,..tendre que probar la utilizacion de ORA a ver si doy con ello, pero ya lo hare mañana o pasado que tendre la cabeza mas despejada,..a veces te estas dando contra un muro uno y otra vez y llega otro dia por la mañana recien levantado y das con ello de repente..

Pero me llama mucho la atencion que Kabura muera directamente sin que ningun sprite enemigo haya contactado con sus piernas (sprite #1) utilizando tu rutina....

Bueno, en cualquier caso gracias y seguire dandole...

Esto es una lucha constante,..me quedo con una frase Magistral que dijiste Maniako que mentaba algo así: "El autodidacta hace una cosa cien veces mal para hacerla una bien" y que verdad es,..como digo esto es una lucha!!

  Os dejo.



Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #226 en: Julio 19, 2015, 22:22:55 »
...PERO NO CON CUAL.

Si en el registro de colisión tenemos únicamente dos bits a 1, entonces sí sabemos que sólo hay dos sprites colisionando y con cual lo hacen, el problema es cuando hay varios bits activados.

Me explico?

Como el agua, yo lo he interpretado mal. Me hierve la cabeza con este calor  ::).

Entonces con un AND (los sprites que me interesen) ya hace la funcion pero sin averiguar realmente cual esta chocando con cual.

Creo que la mejor manera es por las coordenadas. Así te dejas un margen y eliminas esa sensación de "pero si no me ha tocado" que entregan las colisiones por $D01F.
Si es que parece que te matan antes de que te toquen si no han refrescado en pantalla la nueva posición del sprite  ;D
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #227 en: Julio 19, 2015, 22:43:41 »
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.

Código: [Seleccionar]
                ;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
« última modificación: Julio 20, 2015, 00:07:44 por Maniako »
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #228 en: Julio 19, 2015, 22:50:15 »
Por cierto, utilisima esa página Easy 6502 http://skilldrick.github.io/easy6502/

Puedes ver a que banderas afectan las instrucciones sin tener que ir haciendo miniprogramas.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #229 en: Julio 19, 2015, 23:20:16 »
 He estado probando viendo la pagina ( menos mal que el virus me ha dejado acceder al enlace desde el foro) y la verdad es que pinta muy bien, por desgracia cuando ensamblo y ejecuto, no hace nada,..imagino que sera por el virus que tengo, que de hecho no puedo ni utilizar el Crome.

 a ver si soluciono esto el mes que viene formateando porque no puedo seguir así.

  chao

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #230 en: Julio 20, 2015, 00:07:10 »
...
Entonces con un AND (los sprites que me interesen) ya hace la funcion pero sin averiguar realmente cual esta chocando con cual.
...

Exacto, si sólo tienes dos bits del registro activos por lógica vas a saber que dos sprites colisionan, pero si tienes más de dos bits ahí ya no puedes discriminar.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #231 en: Julio 20, 2015, 00:12:23 »
...
Pues que Kabura estando en el centro de la pantalla,...MUERE AUTOMATICAMENTE!!, no lo entiendo ya que no a colisionado con ningun enemigo ya que estos empiezan a aproximarse a él tanto a derecha como a izquierda desde los extremos de la pantalla.
...

El código lo puse de memoria, prueba con el salto BCS (Branch on Carry Set) en vez de BCC

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #232 en: Julio 20, 2015, 08:39:57 »
Kabura es un Emo con tendencias suicidas.
Pedazo de argumento para un vieojuego  ;D
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #233 en: Julio 20, 2015, 22:17:19 »
Por fin lo he resuelto. Mover los 8 sprites a la vez permitiendo que sobrepasen la barrera de los 255 activando el MSB correspondiente a cada sprite.

Dejo el listado y el prg para que lo probeis si os apetece.
Para mover los sprites, hay que ir dando impulsos en la dirección deseada (der o izq). Podria poner un bucle como freno y "liberar" el movimiento de los sprites , pero para probar como pasan la barrera de los 255 es suficiente.

El primer carácter en 1024, indica el valor de la posición X del sprite que se mueva en ese momento.
El segundo carácter 1023 , indica el valor del registro X .El Sprite que se acaba de procesar.
El tercero indica el del registro Y que será el doble del registro X para actuar sobre las posiciones X de todos los sprites. Que lio  ;)

¿Se puede pulir mas o hacer mas pequeño? , en eso estoy.

Espero que os sea útil para aprender tal y como lo han sido para mi otros listados que los foreros tan amablemente han colgado por aquí.


Código: [Seleccionar]
                ;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 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 $4000               ;Guardo Acu en $4000 para no perderlo. Una variable cualquiera ;)
                txa                          ;Acu obtiene el valor de X
                rol                           ;Lo multiplico por 2
                tay                          ;Le doy el nuevo valor al registro Y para posprites
                lda $4000               ;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 7 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
« última modificación: Julio 20, 2015, 22:18:55 por Maniako »
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #234 en: Julio 21, 2015, 13:45:13 »
Es interesante el enfoque que le da cada uno!!!

Yo también estoy haciendo mi propia versión, a ver que sale, pero es que no tengo casi nada de tiempo :(
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #235 en: Julio 21, 2015, 17:05:47 »
Deseando estoy de ver el tuyo y el de cualquier otro forero . :)

Tiempo... descubrí hace ya mucho tiempo en una galaxia muy, muy lejana que me basta con 4 o 6 horas de sueño (o menos si tengo insomnio).

Mi rutina puede mover los 8 a la vez con un bucle o simplemente poner en el registro X el valor del sprite a mover y gestionar su MSB.

Por eso el ensamblador es elegante y bello, puedes hacer lo mismo de 1000 maneras distintas, aunque a mi personalmente, contra más rápido y corto mejor.

 
« última modificación: Julio 21, 2015, 17:14:23 por Maniako »
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #236 en: Julio 21, 2015, 22:55:18 »
Algo curioso que me pasa, que no se bien porqué.

Código: [Seleccionar]
loop
lda $D010
eor #%00000001
sta $D010
jmp loop

Este bucle simplemente lee el registro de > 255 y actualiza el estado del sprite 0 poniendolo > 255.

Pero el resultado es un parpadeo del sprite en ambos lados, izquierdo y derecho, como si en vez de asignarle el estado, estuviera alternando entre uno y otro... :?

Adjunto el ejecutable asi lo veis en marcha.
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #237 en: Julio 21, 2015, 23:28:56 »
Algo curioso que me pasa, que no se bien porqué.

Código: [Seleccionar]
loop
lda $D010
eor #%00000001
sta $D010
jmp loop

Este bucle simplemente lee el registro de > 255 y actualiza el estado del sprite 0 poniendolo > 255.

Pero el resultado es un parpadeo del sprite en ambos lados, izquierdo y derecho, como si en vez de asignarle el estado, estuviera alternando entre uno y otro... :?

Adjunto el ejecutable asi lo veis en marcha.

Mejor si pones todo el código.  No veo el por qué hace eso.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #238 en: Julio 21, 2015, 23:34:33 »
No hay más código, antes simplemente muestro los sprites. Todo lo demás lo he comentado.

A ver si hago una limpieza así lo puedo poner aquí y lo podeis comprobar vosotros mismos.
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Dudas en Ensamblador
« Respuesta #239 en: Julio 21, 2015, 23:42:40 »
@jozepzin:

Estas haciendo un `eor` en vez de un `ora`.
`eor` significa "Exlusive Or": https://es.wikipedia.org/wiki/Disyunci%C3%B3n_exclusiva