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

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #210 en: Julio 19, 2015, 14:44:47 »
No sé si ya conocéis pero hay este sitio con un simulador de 6502: Easy 6502

Lo estuve probando y es GENIAL!!! super práctico para probar pequeños códigos.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #211 en: Julio 19, 2015, 14:58:39 »
  Maniako, me acabo de dar cuenta de una cosa revisando el listado CONSTANTES,..el que te he mandado esta "capado", es decir, no esta completo, le faltan todas las constantes relacionadas con el Sonido, Timers y mas cosas..

  Como son cosas que yo todavia no he utilizado, hacia una copia y todas las constantes que no utilizaba las borraba para economizar bytes al ser cargadas,...no veas si me ha costado encontrar el listado completo, lo tenia practicamente escondido en un reducto pero lo he encontrado,..aqui te lo mando completo y guardalo como oro en paño, te lo adjunto en la respuesta,...lleva el nombre de HARDWARE para que no se te equivoque con el otro.

oooooh!!! . Como molaaaa!!!
Muchisimas gracias.

Estoy trabajando en una rutina que permita mover todos los sprites a la vez y haga que se activen o desactiven los bits del MSB que correspondan.



De momento esta por encima de mis capacidades, pero si quieres avanzar, lo mejor son los retos. ;)
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #212 en: Julio 19, 2015, 15:05:58 »
Estoy trabajando en una rutina que permita mover todos los sprites a la vez y haga que se activen o desactiven los bits del MSB que correspondan.

Yo también estoy tonteando con eso :D

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #213 en: Julio 19, 2015, 15:24:47 »
Estoy trabajando en una rutina que permita mover todos los sprites a la vez y haga que se activen o desactiven los bits del MSB que correspondan.
De momento esta por encima de mis capacidades


  Eso es muy bueno, pero fijate en un detalle,...yo aprendí esto recientemente gracias a Carlos, pero si te fijas en NINGUNO de mis anteriores proyectos lo habia utilizado, aparte porque no sabia, a la hora de la orginalidad y el diseño no es una cuestion fundamental (aunque siempre es bueno manerjase en la tecnica)

De momento esta por encima de mis capacidades, pero si quieres avanzar, lo mejor son los retos. 

 Tu lo has dicho!!,...en muchas ocasiones la mejor forma de mejorar y aprender es ponerse retos, tambien te digo una cosa, no malgaste la energia probando rutinas,..yo me plantearia un mini juego, sencillo, entretenido y original (para empezar) y todo el gasto de energia lo aprovecharía en ello,..

 Fijate por ejemplo que mi primer proyecto en ensamblador (laberinto) es mas sencillo que el mecanismo un chupete!!,..mostrar unos textos, una rutina de Joy (en encima aplica al mapa solo) y graficos montados con sprites expandidos,....eso sí,.mucha originalidad en el desarrollo del juego (aqui entraria la pericia del autor a la hora de Diseñar, Originalidad y tantos valores en un juego)

 A donde quiero ir: Ojala Tu y Riq antes de que termine el año nos sorprendais con algun proyecto (por sencillo que sea) en los Premios 2015,..sería la leche para la Escena y un gran salto.

  Chao

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #214 en: Julio 19, 2015, 16:00:15 »
 Asi a bote pronto se me ocurre lo siguiente a la hora de hacer un mini primer Proyecto:

  Supongamos un matamarcianos vertical,...si te manejas en la gestion de sprites a lo largo de toda la pantalla perfect, pero si no,..puedes colocar el marcador, contador de vidas y cualquier cosa mas en el lado derecho de la pantalla por encima de los 255 que no utilizas, con eso rellenas ese lado de la pantalla y te quitas mogollon de complicaciones en la gestion de los sprites en ese lado de pantalla

  Tu nave que está en la parte inferior de la pantalla sería el Sprite #0, el disparo de tu nave sería el sprite #1,...y te quedan 6 Sprites mas para los enemigos,...puedes emplear los sprites #2,#3,#4 y #5 para las naves enemigas que se mostraran en la parte superor de la pantalla y dejar los Sprites #6 y #7 para los disparos de las naves enemigas que se activarian llamandolos con una rutina con un JSR cuando las coordenadas X de tu nave coincidieran con la de las naves (sprites) enemigas que disparan,..lo que hace que el disparo enemigo practicamente te cae sobre la cabeza y supone que tengas que esquivarlo,..lo aderezas con una sencilla rutina a capon de deteccion de sprites (a falta del manejo de la colision de sprites) en la que cuando las coordenas tanto de tu nave como el del disparo (sprite) enemigo coinciden en X e Y  y luego otra que haga lo mismo con tu disparo sobre las naves enemigas y cuando coinciden llaman a otra rutina que genera la explosion y desaparicion del sprite en cuestion segun sea el caso,..luego una rutina sencila de contador de puntos (que si quieres te la paso)  y de numero o cambio de nivel y ya tienes un minijuego, que sera humilde y sencillo pero que es un gran salto para alguien que retoma el AS y no te digo nada para la Escena de lengua Hispana,..recuerda que la mejor forma de avanzar es plantearse proyectos (por pequeños que sean) y en cada nuevo proyecto daras un gran nuevo salto que repercutira en tu aprendizaje y en la calidad del producto.

  A mi es que me gusta mucho canalizar las energias que se emplean y  gastan en algo productivo para que el trabajo no se pierda y confluya en algo,..como tu has dicho, se aprende con los retos,.yo este juego me lo podria machacar en una semana de la forma que expongo (sin utilizar la superacion de la barrera de los 255 y haciendo las colisiones de sprites a capon), pero para alguien que retoma el ASM despues de años,..es un primer pero GRAN paso.

  Piensalo....

 
« última modificación: Julio 19, 2015, 16:04:52 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #215 en: Julio 19, 2015, 16:23:01 »
  Hoy se me terminan las Vacaciones de verano y mañana vuelvo al curro,...osea que volvereis a la "tranquilidad"..

  Lo que está claro es que conmigo no os aburris, eh!!?, cacho Perros!!

 

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #216 en: Julio 19, 2015, 18:27:50 »
Yo también estoy tonteando con eso :D

Yo ya lo tendría si no tubiera problemas con hacer un NOT en ensamblador.  :-\
O eso creo  ;D

LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #217 en: Julio 19, 2015, 18:40:16 »
Estoy trabajando en una rutina que permita mover todos los sprites a la vez y haga que se activen o desactiven los bits del MSB que correspondan.
De momento esta por encima de mis capacidades


  Eso es muy bueno, pero fijate en un detalle,...yo aprendí esto recientemente gracias a Carlos, pero si te fijas en NINGUNO de mis anteriores proyectos lo habia utilizado, aparte porque no sabia, a la hora de la orginalidad y el diseño no es una cuestion fundamental (aunque siempre es bueno manerjase en la tecnica)

De chavalin no tenia problemas con los sprites. Programaba con el monitor del FC3 y era una aventura, cualquier error, tenia que reescribir el programa completamente o ir desplazando bloques para hacer huecos.
Lo que me gustaria es ir optimizando rutinas que se pudieran usar en cualquier programa. Riq me enseño las macros y le vi mucha utilidad.

De momento esta por encima de mis capacidades, pero si quieres avanzar, lo mejor son los retos. 

 Tu lo has dicho!!,...en muchas ocasiones la mejor forma de mejorar y aprender es ponerse retos, tambien te digo una cosa, no malgaste la energia probando rutinas,..yo me plantearia un mini juego, sencillo, entretenido y original (para empezar) y todo el gasto de energia lo aprovecharía en ello,..

 Fijate por ejemplo que mi primer proyecto en ensamblador (laberinto) es mas sencillo que el mecanismo un chupete!!,..mostrar unos textos, una rutina de Joy (en encima aplica al mapa solo) y graficos montados con sprites expandidos,....eso sí,.mucha originalidad en el desarrollo del juego (aqui entraria la pericia del autor a la hora de Diseñar, Originalidad y tantos valores en un juego)

 A donde quiero ir: Ojala Tu y Riq antes de que termine el año nos sorprendais con algun proyecto (por sencillo que sea) en los Premios 2015,..sería la leche para la Escena y un gran salto.

  Chao

Cada vez que intento crear un miniproyecto , acabo probando un montón de minirutinas para practicar y pierdo el objetivo de vista. ::)

De momento estoy con el 3 en uno y un cepillo para arrancar el óxido de mis neuronas. Vete a saber si llegare lejos en esto o si me dejare los dientes con tanto tropiezo.
Ganas y voluntad no me faltan y si encima encuentro a personas que me orientan y pasan códigos donde resolver y estudiar las dudas que vayan saliendo, aun me emociono mas.

Asi a bote pronto se me ocurre lo siguiente a la hora de hacer un mini primer Proyecto:

  Supongamos un matamarcianos vertical,...si te manejas en la gestion de sprites a lo largo de toda la pantalla perfect, pero si no,..puedes colocar el marcador, contador de vidas y cualquier cosa mas en el lado derecho de la pantalla por encima de los 255 que no utilizas, con eso rellenas ese lado de la pantalla y te quitas mogollon de complicaciones en la gestion de los sprites en ese lado de pantalla

  Tu nave que está en la parte inferior de la pantalla sería el Sprite #0, el disparo de tu nave sería el sprite #1,...y te quedan 6 Sprites mas para los enemigos,...puedes emplear los sprites #2,#3,#4 y #5 para las naves enemigas que se mostraran en la parte superor de la pantalla y dejar los Sprites #6 y #7 para los disparos de las naves enemigas que se activarian llamandolos con una rutina con un JSR cuando las coordenadas X de tu nave coincidieran con la de las naves (sprites) enemigas que disparan,..lo que hace que el disparo enemigo practicamente te cae sobre la cabeza y supone que tengas que esquivarlo,..lo aderezas con una sencilla rutina a capon de deteccion de sprites (a falta del manejo de la colision de sprites) en la que cuando las coordenas tanto de tu nave como el del disparo (sprite) enemigo coinciden en X e Y  y luego otra que haga lo mismo con tu disparo sobre las naves enemigas y cuando coinciden llaman a otra rutina que genera la explosion y desaparicion del sprite en cuestion segun sea el caso,..luego una rutina sencila de contador de puntos (que si quieres te la paso)  y de numero o cambio de nivel y ya tienes un minijuego, que sera humilde y sencillo pero que es un gran salto para alguien que retoma el AS y no te digo nada para la Escena de lengua Hispana,..recuerda que la mejor forma de avanzar es plantearse proyectos (por pequeños que sean) y en cada nuevo proyecto daras un gran nuevo salto que repercutira en tu aprendizaje y en la calidad del producto.

  A mi es que me gusta mucho canalizar las energias que se emplean y  gastan en algo productivo para que el trabajo no se pierda y confluya en algo,..como tu has dicho, se aprende con los retos,.yo este juego me lo podria machacar en una semana de la forma que expongo (sin utilizar la superacion de la barrera de los 255 y haciendo las colisiones de sprites a capon), pero para alguien que retoma el ASM despues de años,..es un primer pero GRAN paso.

  Piensalo....

 

Por ideas no me quedo corto, pero soy de los que prefiere unos cimientos fuertes antes de levantar una casa. Si no, el problema es que no pararia de mejorar y mejorar cualquier cosa que haga y nunca jamas la acabaria. Me pasaba de joven , no veas ahora de cascarrabias con experiencia ;D
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 641
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #218 en: Julio 19, 2015, 18:43:07 »
...ya solo me queda lo de la colision de Sprites para ser minimamente completo.

  Gracias y nada, tú aparece cuando puedas, que cuando lo haces aportas y ayudas.
   

Gestionar la colisión entre sprites por hardware es sencillo, aunque también bastante limitado. Únicamente hay que leer el registro $d01e.

Por ejemplo, para saber si el registro 1 está entrando en colisión con algún otro:

Código: [Seleccionar]
lda $d01e ; leo el registro de colisiones sprite/sprite
lsr           ; desplazo el bit menos significativo
bcc COLISION
rts       ; no colisión
:COLISION
       

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #219 en: Julio 19, 2015, 20:04:28 »
Aqui lo que voy haciendo.
Joy 2 derecha e izquierda. Arriba en la pantalla aparece el valor de la coordenada X para comprobar la zona de cámbio de MSB (>255 o <255).
Ahora solo falta conectar los 8 sprites , incrementar X en 2 a cada bucle y ver como se porta.

Cualquier mejora no os corteis. Estoy encantado de recibir ayudas y mejorar. Las criticas también se aceptan , pero menos  ;D.


Código: [Seleccionar]
; 10 SYS (4096)
                                         ; Ensamblado en CMB prg studio
*=$801

        BYTE    $0E, $08, $0A, $00, $9E, $20, $28,  $34, $30, $39, $36, $29, $00, $00, $00

ciapra=$dc00 ;Joy2
msb=$D010       ;Dirección activar msb sprite actual
possprites=$d000 ;Dirección inicial coordenadas sprites
var1=$4000

*=$1000
;Conectando sprites
                lda #1
                sta $D015 ;Sprite 1 ON
                lda corsprites         ;X
                sta possprites         ;X
                lda corsprites+1       ;Y
                sta possprites+1       ;Y
                lda#00
                sta msb         ;MSB =0

loopjoy1        lda ciapra      ;Si joy pulsado, no pasa
                cmp #127
                bne loopjoy1
loopjoy2        lda ciapra      ;Vuelta a leer joy por 2
                cmp #119        ;Si lo pulsas avanza
                beq Derecha     
                cmp #123
                beq izquierda
                jmp loopjoy2

                ldx #00            ;variable tratar con sprites en orden secuencial

Derecha         
                lda corsprites,x
                clc             ;Flagcarry 0               
                adc #01
                bcs  activMSBder      ;Si Carry =1 msbonoff
;Desborda: Conectar msb del sprite que corresponda:
                sta corsprites,x
                jmp cont
               
izquierda       lda corsprites,x
                sec             ;Activo carry para la resta. Si se queda activo en que no desborda
                sbc #01
                bcc  activMSBizq      ;Si Carry =0 msbonoff
;Desborda: Conectar msb del sprite que corresponda:
                sta corsprites,x
                jmp cont

activMSBder     clc
                sta corsprites,x ;Guardo coordenada ya calculada
                lda msb  ;Cargar valor acual de msb
                adc msbonoff,x  ;
                sta msb         ;Guardar MSB sprite conectado
                jmp cont

activMSBizq     clc
                sta corsprites,x ;Guardo coordenada ya calculada
                lda msb          ;Cargar valor acual de msb
                sec
                sbc msbonoff,x 
                sta msb         ;Guardar MSB sprite desconectado
                jmp cont

cont            lda corsprites,x
                sta corsprites,x
                sta possprites,x ;Guardo la coordenada $3000,x
                sta $0400        ;Test mostrar caracter valor coordenada x en 1024
                jmp loopjoy1



*=$3000
corsprites byte $fa,$64,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;cord x e y
msbonoff    byte $01,$02,$04,$08,$10,$20,$40,$80 ;msb 1 2 4 8 16 32 64 128
« última modificación: Julio 19, 2015, 20:12:16 por Maniako »
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #220 en: Julio 19, 2015, 20:20:32 »
 Jolin Carlos, me desjas perplejo por la sencillez del asunto!!,... te expongo alguns pequeñas dudas que me quedan antes de probarlo....

1- ¿El personaje de Kabura utiliza los Sprites #0 y #1,...si quiero ver la colision del sprite #0 con algun otro simplemente tengo que quitar la linea del LSR?

lsr           ; desplazo el bit menos significativo

2- ¿A medida que quiero hacerlo con Sprites superiores, por ejemplo el #3, tendria que incluir dos lineas, es decir tres LSR, cada uno en una linea, quedando asi?

LSR
LSR
LSR

 3- ¿Hago dos rutinas y las llamo seguidamente cuando la deteccion de colision es para dos sprites #0 y #1 o lo meto todo en la misma rutina para asi evitar crear Ciclos inecesarios?

  Eso sí,..hoy no me acuesto sin probarla asi segun me la has dado, para el sprite #1 a ver que tal,..creare la rutina de muerte de Kabura (que ademas ya tengo los frames diseñados) que llera llamada en la colision del sprite #1 (que aunque sean las pieras de momento me vale para empezar a trastear)..

  Gracias!
« última modificación: Julio 19, 2015, 20:43:52 por R. INTERNATIONAL »

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 641
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #221 en: Julio 19, 2015, 21:10:18 »
Gestionar las colisiones de sprites por hardware es bastante limitado. Supongamos que el registro $d01e contiene:

01000101

Esto significa que los sprites #0, #2 y #6 están colisionando, pero no sabemos con cuales! Es decir, el #0 está en colisión pero podría estarlo con el #2, con el #6 o con ambos...


Cita de: R. INTERNATIONAL
Jolin Carlos, me desjas perplejo por la sencillez del asunto!!,... te expongo alguns pequeñas dudas que me quedan antes de probarlo....

1- ¿El personaje de Kabura utiliza los Sprites #0 y #1,...si quiero ver la colision del sprite #0 con algun otro simplemente tengo que quitar la linea del LSR?

lsr           ; desplazo el bit menos significativo

El código que puse chequea la colisión del sprite #0 (cuando puse 1 me refería al primero)

Cita de: R. INTERNATIONAL
2- ¿A medida que quiero hacerlo con Sprites superiores, por ejemplo el #3, tendria que incluir dos lineas, es decir tres LSR, cada uno en una linea, quedando asi?

LSR
LSR
LSR

Es una forma, también puedes hacerlo directamente con OR (ORA)

Cita de: R. INTERNATIONAL
3- ¿Hago dos rutinas y las llamo seguidamente cuando la deteccion de colision es para dos sprites #0 y #1 o lo meto todo en la misma rutina para asi evitar crear Ciclos inecesarios?

Eso ya depende mucho del código de tu juego, yo haría toda la detección de colisiones inmediatamente tras el movimiento de los sprites.




Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #222 en: Julio 19, 2015, 21:29:10 »
No acabo de pillar esto.
¿Como rotando el bit tantas veces como el sprite del cual deseo saber con cual colisiona averiguo con cual?.

Con tu ejemplo, si quiero saber si el sprite 2 choca con x...

Si tengo 01000101 y lo LSR...
aparece 00100010 si vuelvo a LRS...
aparece 00010001 ... no veo como lo reconoce.
Podria estar chocando con el 0 o con el 6 ... ainss...

Estoy hecho un lio.
« última modificación: Julio 19, 2015, 21:30:45 por Maniako »
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 641
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #223 en: Julio 19, 2015, 21:44:08 »
No acabo de pillar esto.
¿Como rotando el bit tantas veces como el sprite del cual deseo saber con cual colisiona averiguo con cual?.


Es lo que comenté, mediante la colisión de sprites por hardware podemos saber si un sprite está en colisión con otro, 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?

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #224 en: Julio 19, 2015, 22:03:10 »
Supongo que depende el caso, siempre que entre los que colisionan esté nuestro protagonista (por ejemplo), sabremos que lo ha tocado un enemigo, no sabemos cual pero si que es muerte!!

Pero tambien puede servir para optimizar recursos y ahorrar calculos se puede primero mirar si hay colision por hardware y luego comprobar via software los sprites que nos interesan.