Commodore manía

Commodore 64 => Desarrollo => Ensamblador => Mensaje iniciado por: R. INTERNATIONAL en Enero 12, 2014, 22:57:22

Título: Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Enero 12, 2014, 22:57:22
Proximamente volcaré un batallón de dudas que tengo, agradezco mucho a la gente que tenga conocimientos en el tema, que esté atenta para así ayudarme en lo posible.

  Saludos!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Mayo 30, 2014, 00:48:49
  Esto es como una especie de botella que lanzo al mar a ver si alguien me puede dar un poco de luz,..aunque parezca que controlo no tengo ni papa idea y hay cosas basicas que todavia no controlo, por ejemplo:

 - Necesito que alguien me enseñe a ver como puedo superar con un sprite la barrera de los 254 puntos
 - De momento he montado decorados con chars en monocolor a maxima definicion, pero quiero montarlos en multicolor, no se que posicion de memoria tengo que utilizar para hacerlo asi, ni como configurar los colores, cualquier luz lo agradezco mucho, simplemente quiero cargar los chars en multicolor.
 - De momento la colisison de sprites la hago por hardware puro coordenada X/Y de sprite a sprite en un solo punto pero creo que esto se puede hacer mejor, necesito ayuda, por otro lado hay una posicion la $D01E (Sprite to sprite collision register) que no se que hace porque ni he probado ni experimentado, no se si me sirve de algo o no,..cualquier aclaracion es bienvenida.
 - (todavia no lo he probado) pero creo que seria capaz de mover un scroll de estrellas, asi todo cualquier introduccion en el mundo de mover decorados tambien es bienvenida.

     Creo que es suficiente,..gracias por la colaboracion.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Mayo 30, 2014, 00:52:21
  Se me olvido decir que utilizo el 64Tass para programar, cualquier explicacion lo mas entendible y aplicable a dicha politica lo agradezco mucho.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Mayo 30, 2014, 14:19:38
Lo de pasar con un sprite los 256 es muy facil, no estoy en el ordenador ahora pero luego te lo digo.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Mayo 31, 2014, 01:40:47
Si con los 254 puntos te refieres a las coordenadas horizontales, hay un registro que contiene el bit mas significativo de cada uno de los 8 sprites, al colocar el bit correspondiente a ese sprite a 1, las coordenadas cuentan desde 256 en adelante, en realidad es un numero de 9 bits y en ese registro esta el bit 8 de cada sprite. Cuando llegas a 255, para avanzar al siguiente pixel colocas a 1 el bit mas significativo en ese registro (el que aparece en el manual en la direccion 53264 ($D010): SPRITE X MSB REGISTER), y a 0 el byte de coordenada horizontal, y empiezas a contar desde ahi. Recuerda que ese bit mas significativo vale 256, eso se suma al byte de coordenada horizontal.
El registro de colision de sprites nunca lo use, pero tenia entendido que detecta que sprites se tocan, teniendo en cuenta que el color transparente no cuenta como parte del sprite, segun el manual se pone a 1 cada bit en la direccion 53278 ($D01E) segun los sprites que hayan colisionado, y se mantiene asi hasta que se lea ese registro. Tambien hay otro registro para la colision con el fondo, dice tambien el manual que si se usan sprites multicolor el color de fondo que se tiene en cuenta para las colisiones es diferente.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Junio 01, 2014, 17:06:25
  Esto es como una especie de botella que lanzo al mar a ver si alguien me puede dar un poco de luz,..aunque parezca que controlo no tengo ni papa idea y hay cosas basicas que todavia no controlo, por ejemplo:

 - Necesito que alguien me enseñe a ver como puedo superar con un sprite la barrera de los 254 puntos

http://www.devili.iki.fi/Computers/Commodore/C64/Programmers_Reference/Chapter_3/page_137.html (http://www.devili.iki.fi/Computers/Commodore/C64/Programmers_Reference/Chapter_3/page_137.html)

En esa página y las siguientes, te explica todo sobre como posicionar sprites en la coordenada X y la Y.

- De momento he montado decorados con chars en monocolor a maxima definicion, pero quiero montarlos en multicolor, no se que posicion de memoria tengo que utilizar para hacerlo asi, ni como configurar los colores, cualquier luz lo agradezco mucho, simplemente quiero cargar los chars en multicolor.

No acabo de entender la pregunta, de todas formas ahí te explica todo sobre los modos de video del C64:

http://www.devili.iki.fi/Computers/Commodore/C64/Programmers_Reference/Chapter_3/page_100.html#Graphics
 (http://www.devili.iki.fi/Computers/Commodore/C64/Programmers_Reference/Chapter_3/page_100.html#Graphics)

- De momento la colisison de sprites la hago por hardware puro coordenada X/Y de sprite a sprite en un solo punto pero creo que esto se puede hacer mejor, necesito ayuda, por otro lado hay una posicion la $D01E (Sprite to sprite collision register) que no se que hace porque ni he probado ni experimentado, no se si me sirve de algo o no,..cualquier aclaracion es bienvenida.
 - (todavia no lo he probado) pero creo que seria capaz de mover un scroll de estrellas, asi todo cualquier introduccion en el mundo de mover decorados tambien es bienvenida.

     Creo que es suficiente,..gracias por la colaboracion.
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Junio 02, 2014, 17:22:22
Bueno, ya que los auténticos gurus no se mojan  ;) voy a exponer mi ejemplo en ensamblador para la primera de las dudas, que creo que es lo que pedía el amigo Rulas, a ver si entre novatos nos ayudamos.
Aun no es perfecto pero funciona, ejecutalo con sys49152, mueve el joystick1 y el programa se para.
Ahora introduce NEW enter 1sys49175:goto1 enter y veras que el sprite flanquea sin problemas la barrera de los 255.
Esta en formato del CBM prg studio, no conozco el 64Tass, no creo que sea muy diferente.

Código: [Seleccionar]
*=$C000

v=53248

        lda #$01
        sta v+21 ;sprite 1 on
        lda #192
        sta 2040 ;puntero a sprite
        lda #$01
        sta v+39 ;color
        lda #100
        sta v   ;posicion x
        sta v+1 ;posicion y

loop      LDA $DC01  ;leemos joy1
          AND #$0F

          CMP #$0E  ;la cuatro direcciones arriba abajo izq der
          BEQ arr
          CMP #$0D
          BEQ abj
          CMP #$0B
          BEQ izq
          CMP #$07
          BEQ der
          JMP loop

arr       DEC $D001
          RTS
abj       INC $D001
          RTS
izq       DEC $D000
          jsr testx
          RTS
der       INC $D000
          jsr testx
          RTS

testx   lda $d000  ;testeamos la posicion X 255=derecha del tope 0=izquierda
        cmp #$ff
        beq x1
        cmp #$00
        beq x2
        rts

x2      lda #$01 ;msb on
        sta v+16
        rts
x1      lda #$0  ;msb off
        sta v+16
        rts

*=12288
; forma de sprite 1
 BYTE 255,127,0,193,97,0
 BYTE 193,97,0,255,127,0
 BYTE 192,97,0,192,97,0
 BYTE 192,97,0,192,97,0
 BYTE 0,0,0,0,255,127
 BYTE 0,192,97,0,192,97
 BYTE 0,199,127,0,193,97
 BYTE 0,255,97,0,0,0
 BYTE 225,0,0,241,0,0
 BYTE 217,0,0,205,0,0
 BYTE 199,0,0
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Junio 02, 2014, 19:47:13
Creo que es exactamente lo que Rulas necesitaba! yo estaba masticando una explicación en C, pero esto es mucho mejor!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 02, 2014, 23:00:34
  Buf!!!,..cuanta carnaza!!!,...muchisimas gracias a todos por vuestra atención,...ahora estoy un poco saturado de curro y el poco tiempo que me queda lo dedico en cuerpo y alma a terminar Xain, es por eso que alomejor estoy un poco ausente

  Pero os aseguro que vuestras enseñanzas no se pierden y seran aplicadas ya en el siguiente proyecto,..en cuanto pueda me pongo con ejercicios sencillos para ponerlas en practica.

  Mil Gracias y Al Hierro!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 02, 2014, 23:28:37
 Gracias Laddh por éste listado que has adjuntado, lo he estado observando y la verdad es que parece bueno, se trata de un breve listado completo para mostrar y mover un sprite en pantalla (yo todo eso ya lo tengo creado) pero es muy interesante los momentos clave en los que el programa hace lo que yo quiero aprender,..vamos que en cuanto tenga tiempo lo pruebo y te lo agradezco.

  Carlos con lo de los Chars me refiero a que en Xain he montado los decorados con chars en monocolor sin scroll, quiero aprender simplemente a mostrar los Chars de Multicolor (sin Scroll tambien), no se que posicion de memoria maneja eso ni si tengo que configurar algun color (como ocurre con los sprites) y como y donde...

  Chao!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 17, 2014, 23:11:51
  Ahora que estoy "libre" me voy a centrar mucho en éste hilo,..ya estoy preparando un ejercicio que  constantemente subire/adjuntare para ir poniendo en practica todos los conocimientos...

  (también ire adjuntando el listado), asi que Bieno y Manuel andaros pendientes porque es buen momento para aprender..todo ira muy explicadito,..cread una carpeta e id echando en ella bien organizadito todo lo que se muestre.

  Por cierto, Bieno, mandame por privado el correo de Sandro.

     Chao.
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Junio 18, 2014, 16:49:58
Hola Rulas, en cuanto a la tercera de las dudas, la de las colisiones sprite-sprite por hardware, he añadido al listado anterior una rutina col que verifica la colisión sprite0 con sprite1, incrementando el color del borde pantalla cuando esta se produce.

Código: [Seleccionar]
*=$C000

v=53248

        lda #$03
        sta v+21 ;sprite 0 y 1 on
        lda #192
        sta 2040 ;puntero a sprite 0
        lda #193
        sta 2041 ;puntero a sprite 1
        lda #$01
        sta v+39 ;color spr 0
        lda #$03
        sta v+40 ;color spr 1
        lda #100
        sta v   ;posicion x spr 0
        sta v+1 ;posicion y spr 0
        lda #200
        sta v+2 ;posicion x spr 1
        lda #150
        sta v+3 ;posicion y spr 1


loop      LDA $DC01  ;leemos joy1
          AND #$0F

          CMP #$0E  ;la cuatro direcciones arriba abajo izq der
          BEQ arr
          CMP #$0D
          BEQ abj
          CMP #$0B
          BEQ izq
          CMP #$07
          BEQ der
          JMP loop

arr       DEC $D001
          jsr col
          RTS
abj       INC $D001
          jsr col
          RTS
izq       DEC $D000
          jsr testx
          jsr col
          RTS
der       INC $D000
          jsr testx
          jsr col
          RTS

testx   lda $d000  ;testeamos la posicion X 255=derecha 0=izquierda
        cmp #$ff
        beq x1
        cmp #$00
        beq x2
        rts

x2      lda #$01 ;msb on
        sta v+16
        rts
x1      lda #$0  ;msb off
        sta v+16
        rts

col     lda v+30 ;testeamos si ha habido colisión entre spr0 y spr1 en v+30 ($d01e)
        and #3 
        cmp #3   
        beq borde
        rts

borde   inc $d020 ;cambia color borde pantalla
        rts

*=12288
; forma de sprite 1
 BYTE 255,127,0,193,97,0
 BYTE 193,97,0,255,127,0
 BYTE 192,97,0,192,97,0
 BYTE 192,97,0,192,97,0
 BYTE 0,0,0,0,255,127
 BYTE 0,192,97,0,192,97
 BYTE 0,199,127,0,193,97
 BYTE 0,255,97,0,0,0
 BYTE 225,0,0,241,0,0
 BYTE 217,0,0,205,0,0
 BYTE 199,0,0

*=12352
; sprite 2
 BYTE 0,0,0,0,0,0
 BYTE 0,0,0,0,0,0
 BYTE 0,0,0,3,0,192
 BYTE 6,255,96,4,0,32
 BYTE 2,255,64,2,129,64
 BYTE 2,189,64,2,165,64
 BYTE 2,165,64,2,189,64
 BYTE 2,129,64,2,255,64
 BYTE 4,0,32,6,255,96
 BYTE 3,0,192,0,0,0
 BYTE 0,0,0

Funciona como en el ejemplo anterior, cambiando el segundo sys
SYS49152
Mover joystick
NEW
1SYS49195:GOTO1
RUN

Aprovecho para agradecer tu petición, ya que gracias a ella estoy haciendo cosas con el C64 que nunca llegue a hacer, ni me imaginaba que las haría ahora.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 18, 2014, 22:58:23
  A mi tambien me ha pasado Laddh,..es una de las cosas por lo que me maravilla el ensamblador,..es como hablar del infitinito y de mil formas distintas de hacer una cosa (muy personal) pero siempre por un camino directo y rapido.

  Hablamos!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 18, 2014, 23:15:35
  Por cierto, antes de entrar en materia me molaria hablar de un asunto que siempre desde que escribo programas en compilador me ha llamado mucho la atencion...

  Me refiera a las normas, formas, manias, etc, etc de escritura personales cada uno, vereis por ejemplo varios casos:

  - Gente que ha programado en basic y que al pasar al ensamble se ven muchos detalles de escritura del basic,..esto ocurre por ejemplo en tu listado Laddh, con expresiones del tipo; v=53248 ó  sta v+40,...lo de asignar V y luego sumarle el numero me acuerdo que es muy de Basic.

  - Gente que tiene influencias de lenguaje C (suelen ser muy peculiares e imagino que tipicas del lenguaje),.suelen escribir en minusculas y cuando se usa softwear para pragramar al final el listado es una mezcla de C y de Ensamblador en su escritura,..Lobo es un ejemplo dentro de la gente con la que he trabajado.

  - Gente (que no se que influencias tendran),..que suelen crear su lista de constantes, con escrituras en sus listados super simples y sencillas y que siempre escriben en mayusculas y son maniaticos de los listados muy alineados,...Silicebit y Madonna Mark serian dos ejemplos dentro de la gente con la que he trabajado.

   Hablando ya de mi,..la persona que mas me ha enseñado y de la que mas he aprendido en el tema de como "hacer" las cosas (rutinas, subrutinas, etc) mi maestro a sido Lobo sin ninguna duda, pero sin embargo en la forma de escribir me encuadro en el tercer grupo de gente (mayusculas, constantes, sencillez, alineanismo,..),..

  corregidme si me he equivocado (que yo soy un amateur) en los encuadres de gente, pero es mas o menos lo que yo he visto o percibido y cualquier opinion de buen agrado es perfecta,..tambien lo digo para que cuando adjunte listado en éste hilo, vereis el tipo de escritura que tengo, que por cierto, os invito tambien a contar las manias, cosas, etc que cada uno pueda tener al hacer sus listados que siempre se aprende algo...

   Hasta Pronto Troncos!!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 18, 2014, 23:21:04

  Como se nota que Xain´D Sleena ya está terminado y ahora tengo mucho mas tiempo libre,...eh!?
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 18, 2014, 23:28:56
  Ah!!,..se me olvido nombrar a otro grupo de gente...

  - Gente que tiene influencias del espacio exterior y que no saben ni donde están, que programan en Zulú y escriben de abajo a arriba...Bieno es el mejor ejemplo dentro de la gente con la que he trabajado.
Título: Re:Dudas en Ensamblador
Publicado por: Bieno en Junio 19, 2014, 00:19:21
Perdido en el espacio !!!!!!!!!!!!
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Junio 19, 2014, 09:30:57
Sí, jeje, soy grupo Basic, de momento parto de un ejemplo basic y lo "traduzco" a ensamblador, supongo que a base de práctica acabare pensando en assembler. No se si te ha pasado, que por más que mires 100 listados, solo cuando creas, directo de tú cabeza es cuando en realidad aprendes.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Junio 19, 2014, 09:45:49
Aprovechando la conversación, con que ensamblador e interface (IDE) desarrolláis? Yo, cuando lo hacía..., con KickAss y Notepad++ pero si lo retomo me cambiaré al Relaunch64 probablemente.
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Junio 19, 2014, 09:48:13
Yo ahora estoy entregado al CBM prg Studio.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Junio 19, 2014, 12:39:10
Lo de escribir todo en mayusculas seria lo mas natural, al menos en Commodore, ya que asi se escribe por defecto, no creo que tenga que ver en particular con el BASIC. Tampoco lo de escribir V+algo, eso es practico porque en los manuales las direcciones de los chips de video, sonido o E/S pueden estar indicados como un numero de registro y no siempre como una direccion absoluta.
En los 80s cuando hice un poco de programacion en ensamblador, lo hacia con el ensamblador basico del Final Cartridge 2, que ensamblaba directo a memoria y no permitia tener un estilo porque se ensamblaba linea por linea. Para Commodore no volvi a hacer nada en asm hasta recientemente, ahi empece a usar ACME en Windows y ya aplique el estilo que uso en ensamblador para microcontroladores PIC desde 1993, la diferencia mas importante con como programo PICs es que para PIC escribo las instrucciones en minusculas y para 6502 las escribo en mayusculas. Lo demas es igual en ambos casos, constantes y "variables" en mayusculas, etiquetas de saltos y direcciones de memoria en general, en el estilo EstaEsUnaEtiqueta, y las columnas respetadas, usando en lo posible 8 caracteres para etiquetas, y tambien cuando sea necesario un comentario por linea.
Las etiquetas, constantes y variables las defino en ingles, por si necesito intercambiar codigo con otra persona, pero los comentarios estan siempre en español.
Va una rutina de ejemplo:

Código: [Seleccionar]
;///////////////////////////////////////////////////////////////////////////////////
; Rutina de reproduccion de sonido digitalizado (fonemas L M N RR)

Aux_Digi
AuxDLoop
LDX #$00
AuxDSync
LDA $D012 ; Espera a una linea par
AND #%00000001
BNE AuxDSync
ADSample
LDA WaveTable, X ; Lee la muestra actual (codigo automodificable)
ROR ; del nibble correspondiente (codigo automodificable)
ROL
ROR
ROL
CLC ; Ajusta el valor de la muestra (codigo automodificable)
ADC #$00
AND #$0F
ADVolume
LSR ; Ajusta el volumen del sonido (codigo automodificable)
LSR
CLC ; Ajusta offset del sonido (codigo automodificable)
ADC #$00
STA $D020 ; Cambia el color de borde segun la muestra
ORA #$10
STA SIDREG+24
LDA #$04
STA DIGITDLY
AuxDDelay
NOP ; Espera hasta caer en una linea de barrido impar
DEC DIGITDLY
BNE AuxDDelay
INX ; Pasa a la siguiente muestra
CPX SAMPLECNT ; Si no llegamos a SAMPLECNT muestras
BNE AuxDSync ; vuelve a AuxDSync
AuxDNext
DEC REPCOUNT ; Decrementa REPCOUNT (repeticiones del sonido)
BNE AuxDLoop ; si aun no llego a 0, vuelve a AuxDLoop
RTS ; Retorna

En este caso uso SIDREG+24 para controlar el volumen, porque en las hojas de datos del SID se explica todo por numero de registro, y por otro lado el dia que quiera controlar dos SID solo tendria que cambiar el valor de esa constante para acceder al segundo SID.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 19, 2014, 16:21:57
Guau Pasbytes!!,..una de las cosas que necesito o tengo que aprender son mini listados en ensamblador de efectos de sonido,..y eso es lo que me mandas, si tienes unos minimos conocimientos ya me enseñaras a como cambiando ciertos factores en el listado puedo hacer distintos sonidos

En cuanto tenga tiempo me veo el listado hablamos y seguro que me solventas algunas dudas que tengo,..que tambien tengo el listado de Laddh de colision de Sprites por ver...

La verdad es que voy a estar entretenido,..teniendo en cuenta que mañana se estrena Xain, os podeis imaginar como estoy, a ver si ya pasa y me pongo al estudiar vuestros listados, me da que éste hilo se va a poner calentito...

   Gracias!
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Junio 19, 2014, 19:01:17
Esa rutina sirve para reproducir audio digitalizado, no sirve mucho para juegos porque no hace otra cosa mientras se ejecuta, por lo que solo seria util cuando no hubiera movimiento en un juego, como al perder una vida, o en la pantalla de presentacion.
Tambien esta un poco limitada, porque esta pensada para sonidos repetitivos, de no mas de 255 muestras, porque es la rutina que usa mi sintetizador de voz para reproducir los fonemas, que suelen usar menos de 80 muestras, por eso se le puede indicar la cantidad de muestras, la cantidad de veces que se repite la onda, el volumen (100%, 50%, 25%, 12,5% o 6,25%) y el centrado de la onda (en que posicion queda con respecto a la mitad de volumen). La reproduccion se hace sincronizada con las lineas del video, por lo cual se emite de forma muy estable a 7812 Hz, con una resolucion de 4 bits.
Se puede tener dos sonidos distintos en una serie de bytes, un sonido en los nibbles altos y otro en los bajos, esto tambien hay que indicarselo a la rutina. Para que los tiempos se ejecucion sean lo mas parejos posibles independientemente del volumen, del centrado, o del nibble que se elija, y para ahorrar tiempo y simplificar la rutina, lo que se hace al llamar es "pokear" todos esos parametros, donde esta indicado como "codigo automodificable".
Luego buscare algun ejemplo de como llamarla para que se entienda mejor.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 23, 2014, 16:43:08
  Bueno, tras el estreno de Xain, ya estoy aquí,...he hecho un pequeño listado que muestra una nave sobre el espacio, la nave curiosamente es la de Xain´D Sleena,  con lo que parece la Pantalla de la Batalla en el Espacio que había entre planeta y planeta y a su vez es una continuación en cierto modo del juego, para la gente que no haya tenido bastante con el juego.

  Este listado lo voy a ir ampliando con las cosas que quiero aprender,..lo primero es ver el listado de Laddh en relación a superar con un sprite la barrera de los 255, aprendiendo del listado que mando al principio del hilo y luego voy a ver si soy capaz de crear un scroll de estrellas que se mueva segun se mueva la nave.

  He pensado otra cosa,..no suelo tener proyectos sin hacer y de todo ejercicio saco un juego, osea que ya vereis como de este saldra otro juego y mas con las ganas que tengo de hacer un juego de Naves (que no lo he hecho nunca),..con lo cual, en éste ejercicio podriamos aportar todos ideas independientemente de la ayuda que pueda tener en programacion...

  Me refiero a que no vendrian mal algun Tester, Ayudante de Programacion, Grafista (para hacer los Sprites ya que los de ahora de Xain son provisionales), Diseñadores o lo que sea...cualquier aportacion es bienvenida, yo me encargare de la programación (hasta donde sepa..) y todos los participantes serian reconocidos en los Creditos en el juego,..seria como una especie de juego de Commodore Mania, algo parecido a lo que ha intentado Bieno con el Castillo del Dragon.

   Os adjunto la preliminar del ejercicio en el correo, se muestra una nave y se controla,..en breve os mando una nueva actualizacion.

   Saludos!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 23, 2014, 21:31:18
 
  Os adjunto el programa con una nueva mejora,..ahora la Nave oscila verticalmente,..vamos a ver si hago que dispare...
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Junio 23, 2014, 21:37:06
Como primer sugerencia fácil, que funcionen las diagonales!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 23, 2014, 23:23:56
  Tienes toda la razón del mundo Jose,..pero es que no se hacerlo!!,..en breve adjunto el listado y veis la rutina que controla el Joy, a ver si alguien me puede decir que tengo que escribir nuevo para poder detectar las diagonales..

  De momento os adjunto una nueva actualizacion,..atencion porque la Nave,..ya dispara!!!

    Chao!!
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Junio 24, 2014, 04:42:38
A ver si ese disparo supera los 255!

Publica el código del joystick, en realidad es muy fácil, creo que estás fallando en que al detectar una dirección dejas de leer las siguientes.

Actualmente tu haces esto:
- Es arriba > mover nave arriba > ir al final
- Es derecha > mover nave derecha > ir al final
- Es abajo ... > ir al final
- Es izq... > ir al final
- Final

Tendrías que hacer algo asi:
- Es arriba > mover nave arriba
- Es derecha > mover nave derecha
- Es abajo ...
- Es izq...

Entonces, si es arriba mueve nave hacia arriba, luego comprueba si es hacia la derecha y si es la mueve, luego izq y luego abajo. De esa manera permites que se pulsen de forma simultanea varias direcciones.

La otra opción que tienes es preguntar por arriba+derecha y mover en diagonal, arriba+izquierda y mover en diagonal pero me parece que no es la mejor opción...
Título: Re:Dudas en Ensamblador
Publicado por: Zonacas en Junio 24, 2014, 09:54:22
Las diagonales hacia atrás (hacia la izquierda) si funcionan
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 24, 2014, 16:04:41
  Así es Zonacas, yo tambien me he dado cuenta...

 asi que los tiros van por donde decia Zanni,..en realidad yo siempre que hago una cosa, sigo chequeando la siguiente direccion, pero me he dado cuenta que cuando va hacia arriba tengo un salto al final,..por eso hacia la derecha no lo hace, hacia la izquierda si porque la siguiente direccion a chequear es fuego (final de rutina)

  en cuento tenga tiempo esta noche que salga de currar lo modifico a ver si le cojo el punto.

   Gracias.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Junio 25, 2014, 08:42:07
Para que no se diga que sólo critico y no aporto  ;D

Lo del control de los 255 pixels en la coordenada X:

Existe un registro para controlar la coordenada X por cada sprite hardware. Al ser 8 sprites, pues existen 8 registros ($D000, $D002, $D004, ...). Como cualquier registro del C64, están compuestos por un byte lo que significa 256 valores diferentes, hablando de coordenadas sólo podemos controlar la coordenada X desde 0 hasta 255 por lo que nos quedamos sin una parte de la pantalla por controlar. Para eso existe otro registro: $D010 que simula el octavo bit de cada uno de los 8 registros anteriores.

Cuando movemos un sprite hacia la derecha lo que estamos haciendo es incrementar el valor de ese registro, supongamos que estamos gestionando el sprite 0:

inc $d000    ; movemos un pixel el sprite 0 hacia la derecha

si queremos controlar el limite de los 255 lo que tenemos que hacer es comprobar el valor del registro antes (o después) de incrementarlo. Esto lo podemos hacer de varias formas, ahí entran las posibilidades del ensamblador y la pericia de cada programador.

La forma más evidentemente es comprobar si el valor del registro ya es 255 ($ff), esta es la forma que propuso Laddh en su código:

Código: [Seleccionar]
lda $d000  ;cargamos el valor de $D000 en el acumulador         
   cmp #$ff   ; lo comparamos con 255
   beq label   ; si el resultado es cero, es decir, los valores son iguales salto
   inc $d000  ; si no es 255, incremento la coordenada X

Hay otra forma más elegante de hacerlo y es la siguiente:

Código: [Seleccionar]
inc $d000   ; incremento la coordenada X
beq label    ; si el resultado es cero salto

Y en label es donde debo incrementar el bit más significativo (el octavo) del sprite correspondiente (en el caso del ejemplo el 0)

Código: [Seleccionar]
:label
lda $d010   ; cargo el registro que controla los octavos bits de la coordenada X
ora #%1000000 ; pongo el primer bit (sprite 0) a 1

Espero que se haya entendido.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 27, 2014, 00:03:48
Jolin,...Muchas Gracias, voy a verlo tranquilamente y te cuento,...que sepas que no te tengo reparo, que te aprecio mucho!!, perdona mi tardanza en contestar estoy un poco liado con el tema de pillarme un carro.

   Saludos!!

   
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 27, 2014, 01:27:48
 Veo que de todo esto sale un Juego, ya veras y vamos a Participar Todos.
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Junio 27, 2014, 08:30:31
Hola Carlos, con ese ORA #%10000000 estarías activando el XDerecha del sprite 7, no el sprite 0. Lo digo para que nadie que siga este hilo se lie.
Corrigeme sino es así, un saludo.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Junio 27, 2014, 09:15:12
Hola Carlos, con ese ORA #%10000000 estarías activando el XDerecha del sprite 7, no el sprite 0. Lo digo para que nadie que siga este hilo se lie.
Corrigeme sino es así, un saludo.

Tienes toda la razón estaba escribiendo de memoria, para activar el sprite 0 habría que hacer:

Código: [Seleccionar]
ora #%00000001
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Junio 27, 2014, 15:32:26
En general, para resolver dudas lo mejor es que esas dudas sean lo más concretas posibles, porque las explicaciones pueden ser demasiado genéricas o extensas sobre según que tema. Por ejemplo, para los modos de video se podría hacer casi un monográfico.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 28, 2014, 16:36:24
 He estado observando el listado Carlos y con perdon por la expresion,..si es mas sencillo que tirarse un pedo!!!

 Lo voy a probar en breve,...os agradezco mucho a ti y a Laddh la transmision de vuestros conocimientos os puedo asegurar que van a ser muy utilizados y me ayudan mucho a mejorar,..esto es justo lo que necesitaba, un buen equipo de Coder Assistants!!

   AL HIERRACO!!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 29, 2014, 16:12:51
he hecho un pequeño cambio y me funciona,..antes donde ponia:

:label
    lda $d010   ; cargo el registro que controla los octavos bits de la coordenada X
    ora #%1000000 ; pongo el primer bit (sprite 0) a 1

ahora pone:

label
   lda #%00000001
   sta $d010

  simplemente cargo el valor que activa el sprite 0 y lo aplico a $d010,..me he dado cuenta que al volver sobre tus pasos al llegar a 255 el sprite desaparecia pero lo he solucionado creando una rutina igual que bote a 0 el bit del sprite 0 y vuelve a las coordenadas por debajo de 255 y esto lo hace chequeandolo cuando se mueve a la izquierda.

  Os adjunto el ejercicio y veis como he superado la barrera de los 255,..Gracias!!!,..en breve os muestro el listado que teng que organizarlo un poco.

  Chao
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Junio 29, 2014, 16:43:18
he hecho un pequeño cambio y me funciona,..antes donde ponia:

:label
    lda $d010   ; cargo el registro que controla los octavos bits de la coordenada X
    ora #%1000000 ; pongo el primer bit (sprite 0) a 1

ahora pone:

label
   lda #%00000001
   sta $d010
...

No es buena idea, te funcionará mientras sólo uses el sprite 0 pero cuando tengas alguno mas estarás machacando lo que hay en los demás bits del registro $d010.

Prueba con lo siguiente y te debería funcionar igual, manteniendo inalterables el resto de bits de $d010:

Código: [Seleccionar]
lda $d010
ora #%00000001
sta $d010
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 29, 2014, 18:53:17
OK, lo pruebo y te cuento,..no se si en mi ensamblador en vez de ORA tengo que escribir OR....

Por otro lado ya he conseguido que funcionen todas las diagonales de la nave,..tengo una pregunta.

En Xain vereis que he montado los decorados mostrando Char en Monocolor, que tengo que hacer para mostrar un char en Multicolor?,..que siempre quedaran mas bonitos los decorados.

  Saludos.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Junio 29, 2014, 19:02:48
Pega los fragmentos de tu código donde estableces el modo de video y donde dibujas los chars y te explico.

PD: puede que me equivoque, pero los mnemónicos de las instrucciones deberían ser universales para cualquier ensamblador de 6510 por lo que te debe funcionar ORA.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 30, 2014, 11:18:17
En breve adjunto el listado....

  Volviendo al tema de los Chars en Multicolor,...como manejar scrolls y bancos de tiles y menos moverlos todavia no se,..quiero iniciarme convirtiendo el paquete de chars de 2 Kb que contiene las fuentes de letras,..

  Yo para los chars de las fuentes de letras utilizo el Cuneiform (que es el mismo que Lobo) y me va muy bien,...al ponerlo en multicolor veo que los colores se definen con:

- Color ram
- $D021
- $D022
- $D023

  Todavia no he probado a mostrar los textos en multicolor, tengo que probarlo, cargare el paquete de fuentes rediseñado, con los colores configurados, pero no se si tengo que tocar alguna posicicon de memoria para decirle al ordenador ya que no los tiene que mostrar en monocolor, sino en multicolor.

   Muchas Gracias Carlos!!
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Junio 30, 2014, 11:23:16
El registro que hay que tocar para multicolor es el bit 4 del $d016. Aquí un ejemplo:
Código: [Seleccionar]
*=$1000            ; SYS 4096

     LDA #$00      ; COLOR NEGRO
     STA $D020     ; BORDE DE LA PANTALLA
     STA $D021     ; FONDO DE LA PANTALLA
     LDA #$93      ; LIMPIA PANTALLA
     JSR $FFD2
     LDA #24       ; ACTIVA LOS BITS 3 Y 4
     STA $D018     ; PERMITE GENERAR LA NUEVA FUENTE DE LETRA EN $2000
     LDA #24
     STA $D016     ; MULTICOLOR Y 40 COLUMNAS
     LDA #2
     STA $D022     ; BACKGROUND COLOR 2
     LDA #7       
     STA $D023     ; BACKGROUND COLOR 3
     LDA #$40      ; LOS 4 PRIMEROS CARACTERES
     JSR $FFD2
     LDA #$41
     JSR $FFD2
     LDA #13       ; ENTER
     JSR $FFD2
     LDA #$42
     JSR $FFD2
     LDA #$43
     JSR $FFD2
LOOP JMP LOOP      ; BUCLE SIN FIN

*=$2000            ; DATOS PARA LOS NUEVOS 4 CARACTERES

     BYTE  129,37,21,29,93,85,85,85
     BYTE  66,72,84,116,117,85,85,85
     BYTE  87,87,85,21,8,8,40,0
     BYTE  213,213,85,84,32,32,40,0


Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Junio 30, 2014, 13:37:16
Rulas, te voy respondiendo en píldoras que sino me va a salir un tocho infumable.

Lo primero es establecer el modo de video, tu estas usando char hires y ahora debes establecer char multicolor, para eso hay que tocar los registros del VIC $d011 y $d016.

En $d011 debes poner el valor $1b, es el mismo valor que usas para establecer char hires:

Código: [Seleccionar]
lda $1b
sta $d011

Y en $d016 debes poner el valor $18, en char hires usarías el valor $8, la diferencia entre uno y otro es solamente activar un bit de ese registro:

Código: [Seleccionar]
lda $18
sta $d016
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 30, 2014, 14:53:44
  Por fin os adjunto el listado (yo lo abro con Notepad), he tardado un poco porque he puesto mogollon de explicaciones en lo que es  el Mainloop, para que Baron Ashler y Bieno lo entiendan muy bien, ya que me pedian algun listado sencillo con explicaciones.

  Normalmente al principio suelo cargar el archivo constantes que contiene la asignacion de constantes que yo utilizo, he anulado su carga ya que la he incluido en el listado para que su consulta sea mas rapida para Bieno y Baron y entiendan mejor las constantes

 Basicamente el bucle principal del juego llega hasta la linea 200,..a partir de ella estan las rutinas operativas que el juego utiliza. hay algunos cambios en relacion a la version anterior, ahora los sprites han sido cambiados graficamente por los de Caligula (la nave a cambiado), ha sido eliminado el fondo de estrellas

 El tema de superar la barrera de los 255 lo vereis en una subrutina que esta incluida en la rutina que controla Derecha e Izquierda.

   Saludos.

  Me pongo con lo de mostrar el banco de fuentes en modo multicolor y os cuento...
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 30, 2014, 14:55:51
 Se ve olvidad al ultima actualizacion para vice que os adjunto...
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 30, 2014, 19:01:51
He estado probando el tema de mostrar un char en multicolor y lo he conseguido,..he modificado las lineas que me dijiste Carlos y va bien:

LDA #$1B
STA $D011
LDA #$18
STA $D016

Los colores quedan configurados:

LDA #$00      
STA $D021     ; BACKGROUND COLOR 0  (FONDO DE PANTALLA)
LDA #$07         ; AMARILLO POR EJEMPLO
STA $D022     ; BACKGROUND COLOR 1
LDA #$08      ; NARANJA POR EJEMPLO
STA $D023     ; BACKGROUND COLOR 2

Hasta aqui todo bien, y se muestra en multicolor, pero no se como leches o en que posicion de memoria asigno el color del char, he prograbo todo pero nada

Os adjunto el listado vereis que la rutina que gestiona el modo texto esta entre las lineas 298-312

  Saludos
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 30, 2014, 19:03:08
El texto compilado quedaria y se mostraria el texto en color como se ve en el archivo que adjunto para vice,...el color del char no lo he configurado por ningun lado pero se me muestra en Azul por defecto,..supongamos que quiero que se vea en Blanco, no se como asignar el color del char.

   Chao
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Junio 30, 2014, 19:06:50
El modo multicolor es un poco menos directo que la asignación de los colores de fondo. Así que para poder tenerlo tienes que tomar en cuenta lo siguiente:

- En modo multicolor pierdes la mitad resolución horizontal, ya que se usan pares de bits para asignar los colores de los registros. Así tienes que los pares y sus asignaciones son de acuerdo a la siguiente tabla:

Par de Bits          Registro               Posición de Memoria
00                       Background 0      $D021
01                       Background 1      $D022
10                       Background 2      $D023
11                       Color de los 4      RAM de color
                           bits más bajos
                           de la memoria
                           de color.

Así como en modo Hires (modo normal de caracteres) tienes dos colores por cada carácter (el color de fondo y el de la memoria de color), en modo multicolor tienes a tu disposición 4 colores por cada carácter.

Sin embargo, tres de estos colores son comunes (de Background 0 al 2) ya que se asignan por los registros de memoria y el único independiente es el que se obtiene por la memoria de color.

Dame un poco de tiempo y más adelante te pondré un ejemplo de cómo queda el modo en ensamblador.

Saludos.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 30, 2014, 19:08:33
ahora que lo pienso, ¿a ver si es que me creo que dispongo de mas colores de los que son?,...¿de cuantos colores dispongo en modo Multicolor para un Char?

Me podriais explicar un poco las caracteristicas del Modo Texto Multicolor, que alomejor estoy dando palos de ciego, si no me equivoco la utilizacion de algunos colores esta limitada?

  Gracias.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Junio 30, 2014, 19:35:45
El modo multicolor tiene sus paranoias :D

Por cada caracter te permite elegir un color distinto, luego tienes el color del fondo y finalmente tienes dos colores que son comunes a todo el juego de caracteres, algo parecido a los Sprites y sus colores comunes a todos.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 30, 2014, 20:06:21
 Me falta saber como configuro un color distinto para cada caracter, el color de fondo y los dos comunes ya se configurarlos.

  Saludos!
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Junio 30, 2014, 20:12:05
Los colores comunes son dos registros (o uno)  tipo $D0NN, si nadie lo pone, luego me fijo y te digo. De todos modos si te fijas en alguna guía donde aparece qué es cada registro, te vas a dar cuenta fácil.
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Junio 30, 2014, 20:43:18
Me falta saber como configuro un color distinto para cada caracter, el color de fondo y los dos comunes ya se configurarlos.

  Saludos!

Ese color se asigna desde la memoria de color que tiene el carácter y se visualiza cuando el par de bits es 11.

Por ejemplo, digamos que tienes la letra A, cuya representación en la memoria de caracteres en binario es la siguiente:

00000000
00011000
00111100
01100110
01111110
01100110
01100110
00000000

En modo multicolor, el VIC ve la matriz así:

00 00 00 00
00 01 10 00
00 11 11 00
01 10 01 10
01 11 11 10
01 10 01 10
01 10 01 10
00 00 00 00

Tomando como referencia la tabla que escribí anteriormente los colores se asignarían así:

0000            0 - Background 0
0ae0            a - Background 1
0oo0            e - Background 2
aeae            1 - Memoria de color
aooe
aeae
aeae
0000


Saludos.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 30, 2014, 22:36:04
  Mientras se está dando un poco de luz acerca de como configurar el color de un char en modo Multicolor, como el diablo mata moscas cuando no sabe que hacer, le he hecho unos "adornos" al programa con las siguientes mejoras:

 - A espera de poder utilizar el color de char, he utilizado los dos que se y he mostrado las fuentes a dos colores,
 - Se ha Creado una mini Pantalla de Presentacion, desde la cual pulsando Fuego se accede al juego
 - En el Juego se muestra un Marcador Provisional
 - Tambien se muestra un fondo de estrellas

    Os lo adjunto en la respuesta, para darle cera en el Vice, los arreglos le dan "colorido".

  Saludos!
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Julio 04, 2014, 23:36:13
Bien, aquí está el ejemplo en ensamblador para configurar el modo multicolor de caracteres. Las definiciones de direcciones son para las condiciones de arranque, con la memoria de pantalla en $0400 (1024), la memoria de caracteres en $3000 (12288) y las definiciones de caracteres a partir de $C0A0 (49312)

Código: [Seleccionar]
c000  AD 0E DC    LDA $DC0E ;Accedemos a la memoria de caracteres
c003  29 FE       AND #$FE ;desconectando temporalmente interrupciones
c005  8D 0E DC    STA $DC0E ;y Kernal
c008  A5 01       LDA $01
c00a  29 FB       AND #$FB
c00c  85 01       STA $01
c00e  A0 00       LDY #$00 ;Hacemos una copia de los primeros 64 (512 bytes)
c010  A2 02       LDX #$02 ;caracteres desde $D000 a $3000
c012  F0 1E       BEQ $C032
c014  A9 00       LDA #$00
c016  85 FB       STA $FB
c018  A9 D0       LDA #$D0
c01a  85 FC       STA $FC
c01c  A9 00       LDA #$00
c01e  85 FD       STA $FD
c020  A9 30       LDA #$30
c022  85 FE       STA $FE
c024  B1 FB       LDA ($FB),Y
c026  91 FD       STA ($FD),Y
c028  C8          INY
c029  D0 F9       BNE $C024
c02b  E6 FC       INC $FC
c02d  E6 FE       INC $FE
c02f  CA          DEX
c030  D0 F2       BNE $C024
c032  A2 00       LDX #$00
c034  F0 08       BEQ $C03E
c036  B1 FB       LDA ($FB),Y
c038  91 FD       STA ($FD),Y
c03a  C8          INY
c03b  CA          DEX
c03c  D0 F8       BNE $C036
c03e  A5 01       LDA $01 ;Restauramos interrupciones y Kernal
c040  09 04       ORA #$04
c042  85 01       STA $01
c044  AD 0E DC    LDA $DC0E
c047  09 01       ORA #$01
c049  8D 0E DC    STA $DC0E
c04c  AD 18 D0    LDA $D018 ;Habilitamos la memoria de caracteres en
c04f  29 F0       AND #$F0 ;la dirección $3000
c051  09 0C       ORA #$0C
c053  8D 18 D0    STA $D018
Código: [Seleccionar]
c056  AD 16 D0    LDA $D016 ;Habilitamos modo multicolor
c059  09 10       ORA #$10
c05b  8D 16 D0    STA $D016
c05e  A9 00       LDA #$00 ;Color Background 0
c060  8D 21 D0    STA $D021
c063  A9 02       LDA #$02 ;Color Background 1
c065  8D 22 D0    STA $D022
c068  A9 07       LDA #$07 ;Color Background 2
c06a  8D 23 D0    STA $D023
c06d  A9 A0       LDA #$A0 ;Redefinimos los primeros 4 caracteres
c06f  85 FB       STA $FB ;del conjunto desde datos almacenados
c071  A9 C0       LDA #$C0 ;en la dirección $C0A0
c073  85 FC       STA $FC
c075  A9 00       LDA #$00
c077  85 FD       STA $FD
c079  A9 30       LDA #$30
c07b  85 FE       STA $FE
c07d  A0 00       LDY #$00
c07f  A2 20       LDX #$20
c081  B1 FB       LDA ($FB),Y
c083  91 FD       STA ($FD),Y
c085  C8          INY
c086  CA          DEX
c087  D0 F8       BNE $C081
c089  A9 00       LDA #$00
c08b  8D 00 04    STA $0400 ;Como ejemplo mostramos los caracteres
c08e  A9 01       LDA #$01 ;redefinidos en la dirección $0400
c090  8D 01 04    STA $0401 ;de la memoria de pantalla
c093  A9 02       LDA #$02
c095  8D 02 04    STA $0402
c098  A9 03       LDA #$03
c09a  8D 03 04    STA $0403
c09d  60          RTS
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 05, 2014, 22:53:44
   Buff!!!,..madre mia, se ve super interesante, dame un poco de tiempo para "digerirlo"...seguro que tendre alguna duda que te dire por aquí.

       Mil Gracias CPULoyal!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 06, 2014, 01:04:15
Por cierto: Laddh, Carlos, CPULoyal y cualquiera que quiera participar,...necesito que me mandeis a mi correo un Sprite en el que os representéis, diseñarlo con el Sprite Pad y será incluido en Caligula con la mayor brevedad posible en la Pantalla de Creditos como Coder Assistants

 Como ya se vio en los ultimos Proyectos (labyrinth y Xain) nos es licito acompañar a cada participante en la Pantalla de Creditos con el Nombre junto con una minima imagen conformada por un Sprite,..queremos seguir en ésta linea y aumentar el Equipo si cabe...

  Saludos!

  Sprites to: retrogamesystems(arrobo)gmal.com
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 06, 2014, 01:11:19
 Del tuyo Jose, me encargare Yo personalmente!!!,..ja,j,aj,aa,j

Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Julio 06, 2014, 19:34:28
Tras el cambio del modo de video, la siguiente píldora y antes de meternos en temas de personalizar el juego de caracteres, es la relativa a como funciona el modo char multicolor. Ya lo han adelantado de uno u otro modo Laddh y CPULoyal, pero vuelvo a repetir la explicación:

En modo char multicolor, disponemos de caracteres de 4 colores pero a costa de perder resolución horizontal respecto al modo char hires, esta pérdida de resolución provoca lo que se conoce como "píxeles ladrillo".

Es el modo más utilizado en el C64, no sabría aventurar un porcentaje pero casi todos los juegos usan el modo char multicolor para construir los escenarios.

Aunque podemos usar 4 colores por char, hay ciertas restricciones:

- Uno de los colores (el screen color o color de fondo 0) es compartido por todos los chars. Se controla con el registro $d021 y también existe en el modo char hires.
- Los colores de fondo 1 y 2, también son compartidos por todos los chars. Se controlan con los registros $d022 y $d023 y sólo se utilizan en éste modo de video (en char hires no existen).
- El 4 color o color del carácter, es especifico de cada char, es decir, cada char puede tener el suyo. Se controla con el valor respectivo en la memoria de color ($d000 en adelante).

Un ejemplo, el Bruce Lee:
(http://www.lemon64.com/games/screenshots/full/b/bruce_lee_02.gif)

Se aprecian claramente los píxeles ladrillo especialmente en las cimas nevadas de las montañas, el hipopótamo o las lámparas.

En cuanto a los valores de los registros $d021, $d022 y $d023 son 12, 2 y 1, es decir, gris, rojo y blanco respectivamente. Estos son los colores compartidos, el resto de colores presentes (gris oscuro, azul oscuro, azul claro y negro) son el color de cada char específico presente en la memoria de color.

Una característica muy interesante de éste modo es que se pueden combinar en la misma pantalla caracteres en modo char multicolor con caracteres en modo char hires.

(http://www.lemon64.com/games/screenshots/full/n/navy_seals_03.gif)

En esta pantalla del Navy Seals, la placa blanca con la flecha negra está en modo hires (se aprecia claramente que no son píxeles ladrillo) mientras que el resto del escenario es modo char multicolor. Seguro que hay ejemplos mejores, pero he puesto el primero que he recordado.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 06, 2014, 21:10:18
El modo multicolor/hires mola mucho, lástima que a costa de tener menos caracteres disponibles.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Julio 06, 2014, 23:40:14
El modo multicolor/hires mola mucho, lástima que a costa de tener menos caracteres disponibles.

Jose, es que eso no es así.
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Julio 07, 2014, 04:13:21
El modo multicolor/hires mola mucho, lástima que a costa de tener menos caracteres disponibles.

En hires mantienes resolución , pero solo puedes tener dos colores por carácter: Background común y memoria de color de caracteres.

En multicolor pierdes la mitad de la resolución horizontal, pero puedes usar cuatro colores por carácter. Tres comunes (Background 0, 1 y 2) y memoria de color de caracteres.

En estos dos modos puedes redefinir los 256 caracteres del conjunto de caracteres.

Donde solo tienes la cuarta parte de los caracteres disponibles para redefinir (64 caracteres), es en el modo extendido de color de fondo. Lo que ganas en este modo es la posibilidad de tener dos colores independientes por carácter y un color de fondo común. El primer color independiente es el de la memoria de color de caracteres y el segundo es otro de fondo adicional controlado por los dos bits más significativos del código de carácter.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 07, 2014, 23:01:11
 Gracias Carlos y CPULoyal por esas Super Explicaciones, Lobo sabe que desde que comence tengo mi libro de Felix Rodriguez de la Fuente, donde he ido tomando apuntes y el proximo capitulo de como hacer los chars en Multicolor, llevara mogollon de tus explicaciones...

  A ver si tengo un poco de tiempo, porque me habeis puesto muchos deberes de golpe!!

  Saludos.
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Julio 07, 2014, 23:59:15
Continúa planteando tus dudas. Trataré de resolverlas con claridad. Luego te enviaré el sprite que me pediste.

Saludos.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 08, 2014, 16:47:45
  El Sprite de Jose está quedando chulisimo!!,..antes de entrar en cuestiones Técnicas estoy avanzando un poco en cuestiones artísticas, si bien en todos mis proyectos la Pantalla/Secuencia de Créditos se mostraba al Final del Juego, ésta vez se va a mostrar al Principio cuando cargas el juego y solo se vera al principio la primera vez.

  En cuanto la tenga montada os la adjunto,  va a quedar muy bonita y no está cerrada, a mi lo que me mola es que seamos mas en relación a Xain, en vez de un Equipo ya somos Pandilla!!,.ja,j,ajajja
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 08, 2014, 17:07:08
  De todas formas yo tengo que agradeceros mogollon que éste hilo esté bastante activo y que despierte a muchos programadores que tienen conocimientos y que pueden transmitir,..yo quiero juntarme a la sombra de vosotros y de gente como Sandro (que tengo pendiente ponerte un correo y contactar contigo para que me ayudes),..yo incluso creo que lo Único que puede salvar al Commodore por encima del tiempo son los Programadores y la gente que quiera aprender...

  AL HIERRO!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 10, 2014, 16:00:02
 Necesito que Laddh, Carlos y CPULoyal me mandéis un sprite en el que os representéis.
 
   
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 10, 2014, 16:01:15
  Algo así como mi Icono en el Foro que esta veis a la izquierda, que es el Sprite que yo utilizo.
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Julio 11, 2014, 00:19:32
Pues no sé si el que acabo de agregar a mi perfil sea lo que quieres. Tengo el archivo generado por Sprite Pad por si lo necesitas.

Saludos.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 11, 2014, 09:10:08
 Mandame el archivo de sprite pad, si quieres adjuntamelo por aqui, gracias.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 12, 2014, 00:07:15
  Para que esteis entretenidos os adjunto la ultima actualización donde notareis lo siguiente:

- En construcción pero mejorada la Pantalla de Creditos al Inicio de la carga, han sido incluidos Zanni, Carlos, Ladhh y CPUloyal, aunque de éstos tres ultimos todavía falta la imagen...

- Falta por hacer una gran letrero del Titulo del juego en la Pantalla de presentacion utilizando Chars en modo multicolor

- En la pantalla de la nave ya se ve configurado como sera el juego, el cual consistira en eliminar un numero de enemigos para acceder a la siguiente fase, vereis que no existen los puntos, sino el eliminar naves enemigas y reducir el contador de enemigos...

- La ondulacion de la nave ha sido mas equilibrada modificando sus sprites y ahora se verá que su ondulacion es mas suave y equilibrada

- Mas adelante os contare, pero ya aviso que se me ha "encendido la lucecita" y ya tengo mas o menos perfilado el argumento y atencion porque va a haber grandes sorpresas en el desarrollo, no siendo solo un juego de naves...

   Saludos!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 12, 2014, 00:43:16
 En ésta ultima actualizacion que adjunto en ésta nueva respuesta ha sido recuperado por lo menos el bicolor en las fuentes,..asi todo ya se mostrar char en multicolor pero todavia no se como poder ponerle el color a cad char,..tengo que ponerme con las explicaciones que me disteis.

Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Julio 12, 2014, 02:25:17
Dime qué colores quieres usar, para ayudarte con el código. Recuerda que solo tienes uno por carácter además de los tres comunes que parece ya tienes listos.
Aprovecho el mensaje para adjuntarte el archivo del sprite.

Saludos

 
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Julio 12, 2014, 11:02:21
En ésta ultima actualizacion que adjunto en ésta nueva respuesta ha sido recuperado por lo menos el bicolor en las fuentes,..asi todo ya se mostrar char en multicolor pero todavia no se como poder ponerle el color a cad char,..tengo que ponerme con las explicaciones que me disteis.


Es sencillo, se trata de que uses la memoria de color o Color RAM.

La color RAM está situada en el rango: $d800-$dbe7 (55296-56295 en decimal) es decir, 1000 bytes en total que representan las 40 filas y 25 columnas de la pantalla (40x25 = 1000), aunque solo se utilizan los 4 primeros bits (nibbles) de cada byte al existir 16 colores en el c64. Cada color tiene su valor entre 0 y 15 (http://www.c64-wiki.com/index.php/Color (http://www.c64-wiki.com/index.php/Color)).

Los caracteres en pantalla se representan en la memoria de color de izquierda a derecha y de arriba abajo, de tal manera que el color del char de la esquina superior izquierda se establece en $d800, el siguiente en $d800 + 1 y así sucesivamente.

La memoria de color se usa en todos los modos de video, y al contrario que la memoria de pantalla o screen RAM (donde defines que char se muestra en cada posición de pantalla), la de color nunca se puede mover y siempre está situada en $d800.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 12, 2014, 16:19:35
  Gracias CPULoyal y Carlos por vuestra atención, de verdad!!,..ahora tengo un par de dias libres en el curro osea que le dare algo de caña al tema del multicolor, en breve dudas.

  Me pongo con tu sprite CPULoyal, gracias,...por cierto Carlos y Laddh espero vuestros sprites, también teneis la opcion de que los haga yo, pero de momento quiero consultaros...

  Una pequeña encuesta, viendo el perfil de la pantalla de creditos que opinais?
- Deberia mostrarse unicamente al principio de la carga del juego?
- O deberia mostrarse unicamente tras el final del Juego?

  La verdad es que no se que hacer,...si fuera la segunda tengo un plan B con una mini intro muy ambiental antes de comenzar la partida.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 12, 2014, 16:28:26
 CPULoyal he estado viendo el Sprite y es Perfecto!!,..me queda solo una duda, has utilizado como color de fondo el gris oscuro, en el juego va a ser utilizado como color de fondo el Negro, imagino que lo cambio y ya esta, porque sino quedaria una linea vertical al lado izquierdo de color gris oscuro que no quedaria bien.

  De hecho utilizando como color de fondo el negro, lo gano como color de fondo en el sprite e incluso me sobra un color,..yo me encargo de la configuracion de colores, en breve lo adjunto con el sprite incluido que tengo ganas de verlo montado, probable que haga provisionales de Ladhh y Carlos para ver el efecto optico.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 12, 2014, 16:31:21
A mi me gusta al principio, pero siempre que se pueda saltar!
Al final puedes mostrar una imagen/mensaje y volver a repetirlos, al terminar vas de nuevo al inicio del juego.
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Julio 12, 2014, 18:05:07
Uff! Una semanita de vacaciones y 2 páginas del hilo por leer...
Ahí va mi sprite, dibujar no es lo mio.
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Julio 12, 2014, 18:17:57
CPULoyal he estado viendo el Sprite y es Perfecto!!,..me queda solo una duda, has utilizado como color de fondo el gris oscuro, en el juego va a ser utilizado como color de fondo el Negro, imagino que lo cambio y ya esta, porque sino quedaria una linea vertical al lado izquierdo de color gris oscuro que no quedaria bien.

  De hecho utilizando como color de fondo el negro, lo gano como color de fondo en el sprite e incluso me sobra un color,..yo me encargo de la configuracion de colores, en breve lo adjunto con el sprite incluido que tengo ganas de verlo montado, probable que haga provisionales de Ladhh y Carlos para ver el efecto optico.

Ajusta los colores como mejor te convenga. Intenté usar solo los dos colores adicionales para darle forma, dejando sin cambiar los dos primeros. Si es necesario, retoca el sprite para eliminar esa banda negra de la que hablas.

Saludos
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 14, 2014, 11:03:20
OK CPULoyal, ya lo tengo hecho e incluido,....Laddh voy a hacer una intentona de meter el gato de tu avatar en un Sprite, te lo enseño y te quedas con el que mas te guste, el que has hecho tu o el que te haga yo.

   Saludos
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 14, 2014, 13:32:02
Joer, he estado toda la mañana intentando adaptar el gato del Avatar de Laddh a un sprite y es dificil, al final solo me han salido dos churros, no se si es que hoy no estoy inspirado...

Os adjunto la ultima version que tiene incluidos los sprites que me habeis mandado CPULoyal y Laddh.
 
 
 
 
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 14, 2014, 22:27:08
 Aqui os adjunto una nueva actualizacion, ahora en la pantalla de presentacion se muestra un titulo mas grande mostrado con Chars.
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Julio 15, 2014, 01:06:14
La versión más reciente va muy bien. Veo que ya tienes controlados los caracteres multicolores. Si quieres que te ayude también con las pruebas, déjamelo saber.
Por el momento, te puedo decir que al llevar el sprite de la nave al extremo derecho, el sprite del disparo se queda en la pantalla. Por la posición parece que en el límite de los 256 pixeles.

Saludos
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 15, 2014, 04:00:14
Varias cosas para revisar:
Donde dice Cover desing tiene que ser Cover design
Habria que poner limite al movimiento de la nave, que no se pueda pasar de cierto punto a izquierda y derecha
Si se avanza hacia la derecha se va la nave de la pantalla y vuelve a aparecer en la coordenada 256
Si se retrocede tambien se va de la pantalla y se vuelve a aparecer en la coordenada 255
Si se dispara despues de la coordenada 255, el disparo aparece desde la coordenada 0
Aparte de eso, y esto es una opinion personal, creo que seria mejor hacer el juego en español, no creo que vaya a tener tanto texto como para que no se entienda sin saber el idioma
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 15, 2014, 12:46:47
  como dices CPULoyal los caracteres en multicolor los tengo controlados pero todavia no se como darle color a cada uno, a ver si me pongo con ello (es que todavia no me he puesto) ya que he tenido un finde un poco liado.

  He estado mas con cuestiones artisticas como habreis visto,...todos los limites de pantalla y superacion de 255 por parte del disparo esta sin hacer...

   Saludos.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 15, 2014, 23:47:57
Aparte de eso, y esto es una opinion personal, creo que seria mejor hacer el juego en español, no creo que vaya a tener tanto texto como para que no se entienda sin saber el idioma

 Esto me ha gustado mucho, porque quiero que Caligula sea un juego sencillo y diferente, un aspecto diferencial es por ejemplo incluir la pantalla de creditos al Principio de la carga, cuando normalmente se hace al final del juego...

 Otro factor diferencial tambien podría ser el que comentas, como son pocos los letreros, hacerlo en la Lengua que nos une a todos (y de la que recibo explicaciones), la verdad es que la idea me ha gustado mucho,...y mas teniendo en cuenta que Labyrinth fue una ventura en Ingles y Xain tambien tiene un enfoque Ingles,..porque Caligula no en nuestra lengua!!!

  Gracias!!,...la has dado!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 16, 2014, 00:03:30
  He intentado adaptar el Icono que muestra Carlos en el Foro a un Sprites y bueno,...todavia está en construccion, ya sabeis que en un sprite un Pixel arriba o abajo o de un color u otro lo cambia todo, en cualquier caso os adjunto en ésta respuesta la ultima actualizacion con el Sprite de Carlos provisional, a ver que te/os parece.

  Solo me queda el de Laddh, en cuanto me venga la inspiracion,..tambien podreis apreciar que se ha puesto en marcha la Traduccion del Juego al Español, como apunto pastbytes, que de momento solo se ve en el Marcador.

  Bueno ya estais entretenidos...
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 16, 2014, 01:59:14
Rulas , mira mi avatar :-P
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 16, 2014, 15:54:44
  Gracias Jose, es un Honor!!!

    La verdad es que me ha quedado Bonito!!
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Julio 17, 2014, 00:06:25
  como dices CPULoyal los caracteres en multicolor los tengo controlados pero todavia no se como darle color a cada uno, a ver si me pongo con ello (es que todavia no me he puesto) ya que he tenido un finde un poco liado.

  He estado mas con cuestiones artisticas como habreis visto,...todos los limites de pantalla y superacion de 255 por parte del disparo esta sin hacer...

   Saludos.

Bueno, para darte otro empujoncito hacia la aplicación del 4º color te amplio el ejemplo que te puse la vez anterior.

Hay un detalle interesante en el uso de la memoria de color. Como te expliqué, el par de bits 11 en la definición de los caracteres indica que el color a usar será el asignado por la memoria de color a partir de la dirección fija para los 4 bancos de video $D800 (55296).

Ahora bien, la Commodore 64 tiene una paleta de 16 colores para video, y en los modos de hires puedes asignar cualquiera de ellos asignando el valor del 0 al 15, de acuerdo al valor elegido.

Sin embargo, en modo multicolor y solo cuando ya está configurado, la paleta de colores se reduce a los 8 primeros colores, pero usando los valores del 8 al 15, porque el bit 3 indica el modo hires para ese carácter en particular, usando la relación 1 a 1 de memoria de pantalla y memoria de color.

Puedes notarlo en el ciclo de prueba que puse. Es visible pese a que el retardo no es muy prolongado.

Saludos

Código: [Seleccionar]
00001  0000             *=$C000
00002  C000  AD 0E DC   BGNPRG     LDA $DC0E           ;ACCEDEMOS A LA MEMORIA DE CARACTERES
00003  C003  29 FE                 AND #$FE            ;DESCONECTANDO TEMPORALMENTE INTERRUPCIONES
00004  C005  8D 0E DC              STA $DC0E           ;Y KERNAL
00005  C008  A5 01                 LDA $01
00006  C00A  29 FB                 AND #$FB
00007  C00C  85 01                 STA $01
00008  C00E  A0 00      BGNCPY     LDY #$00            ;HACEMOS UNA COPIA DE LOS PRIMEROS 64 (512 BYTES)
00009  C010  A2 02                 LDX #$02            ;CARACTERES DESDE $D000 A $3000
00010  C012  F0 1E                 BEQ CPYRMNBY        ;EL REGISTRO X CONTIENE EL TOTAL DE PÁGINAS A
00011  C014  A9 00                 LDA #$00            ;COPIAR (CADA PÁGINA ES IGUAL A 256 BYTES)
00012  C016  85 FB                 STA $FB
00013  C018  A9 D0                 LDA #$D0
00014  C01A  85 FC                 STA $FC
00015  C01C  A9 00                 LDA #$00
00016  C01E  85 FD                 STA $FD
00017  C020  A9 30                 LDA #$30
00018  C022  85 FE                 STA $FE
00019  C024  B1 FB      KEEPCPY1   LDA ($FB),Y         ;CICLO DE COPIA EN BLOQUES DE 256 BYTES
00020  C026  91 FD                 STA ($FD),Y
00021  C028  C8                    INY
00022  C029  D0 F9                 BNE KEEPCPY1
00023  C02B  E6 FC                 INC $FC             ;PREPARAMOS LOS APUNTADORES A LA SIGUIENTE PÁGINA
00024  C02D  E6 FE                 INC $FE             ;Y COMPROBAMOS SI AÚN QUEDAN PÁGINAS POR COPIAR
00025  C02F  CA                    DEX
00026  C030  D0 F2                 BNE KEEPCPY1
00027  C032  A2 00      CPYRMNBY   LDX #$00            ;COPIAR LOS BYTES RESTANTES DE LA PÁGINA
00028  C034  F0 08                 BEQ CHRRTN          ;NUEVAMENTE EL REGISTRO X CONTIENE EL NÚMERO DE
00029  C036  B1 FB      KEEPCPY2   LDA ($FB),Y         ;BYTES FALTANTES
00030  C038  91 FD                 STA ($FD),Y
Código: [Seleccionar]
00031  C03A  C8                    INY
00032  C03B  CA                    DEX
00033  C03C  D0 F8                 BNE KEEPCPY2
00034  C03E  A5 01      CHRRTN     LDA $01             ;RESTAURAMOS INTERRUPCIONES Y KERNAL
00035  C040  09 04                 ORA #$04
00036  C042  85 01                 STA $01
00037  C044  AD 0E DC              LDA $DC0E
00038  C047  09 01                 ORA #$01
00039  C049  8D 0E DC              STA $DC0E
00040  C04C  AD 18 D0              LDA $D018           ;HABILITAMOS LA MEMORIA DE CARACTERES EN
00041  C04F  29 F0                 AND #$F0            ;LA DIRECCIÓN $3000
00042  C051  09 0C                 ORA #$0C
00043  C053  8D 18 D0              STA $D018
00044  C056  AD 16 D0              LDA $D016           ;HABILITAMOS MODO MULTICOLOR
00045  C059  09 10                 ORA #$10
00046  C05B  8D 16 D0              STA $D016
00047  C05E  A9 00                 LDA #$00            ;COLOR BACKGROUND 0
00048  C060  8D 21 D0              STA $D021
00049  C063  A9 02                 LDA #$02            ;COLOR BACKGROUND 1
00050  C065  8D 22 D0              STA $D022
00051  C068  A9 07                 LDA #$07            ;COLOR BACKGROUND 2
00052  C06A  8D 23 D0              STA $D023
00053  C06D  A9 BD                 LDA <CHRDEF         ;REDEFINIMOS LOS PRIMEROS 4 CARACTERES
00054  C06F  85 FB                 STA $FB             ;DEL CONJUNTO DESDE DATOS ALMACENADOS
00055  C071  A9 C0                 LDA >CHRDEF         ;EN LA DIRECCIÓN CHRDEF ($C0BD)
00056  C073  85 FC                 STA $FC
00057  C075  A9 00                 LDA #$00
00058  C077  85 FD                 STA $FD
00059  C079  A9 30                 LDA #$30
00060  C07B  85 FE                 STA $FE
Código: [Seleccionar]
00061  C07D  A0 00                 LDY #$00
00062  C07F  A2 20                 LDX #$20
00063  C081  B1 FB      KEEPCPY3   LDA ($FB),Y
00064  C083  91 FD                 STA ($FD),Y
00065  C085  C8                    INY
00066  C086  CA                    DEX
00067  C087  D0 F8                 BNE KEEPCPY3
00068  C089  A9 00                 LDA #$00
00069  C08B  8D 00 04              STA $0400           ;COMO EJEMPLO MOSTRAMOS LOS CARACTERES
00070  C08E  A9 01                 LDA #$01            ;REDEFINIDOS EN LA DIRECCIÓN $0400
00071  C090  8D 01 04              STA $0401           ;DE LA MEMORIA DE PANTALLA
00072  C093  A9 02                 LDA #$02
00073  C095  8D 02 04              STA $0402
00074  C098  A9 03                 LDA #$03
00075  C09A  8D 03 04              STA $0403
00076  C09D  A2 00                 LDX #$00            ;HACEMOS UNA PEQUEÑA RUTINA PARA CAMBIAR LOS
00077  C09F  A0 00                 LDY #$00            ;LOS COLORES DE LOS CARACTERES EN UN CICLO
00078  C0A1  A9 00                 LDA #$00            ;A LA MEMORIA $D800
00079  C0A3  8E 00 D8   CYCCLRS    STX $D800
00080  C0A6  E8                    INX
00081  C0A7  8E 01 D8              STX $D801
00082  C0AA  E8                    INX
00083  C0AB  8E 02 D8              STX $D802
00084  C0AE  E8                    INX
00085  C0AF  8E 03 D8              STX $D803
00086  C0B2  C8         LOOP1      INY                 ;INTRODUCIMOS UN RETRASO PARA VER EL CAMBIO
00087  C0B3  C0 FF                 CPY #$FF
00088  C0B5  D0 FB                 BNE LOOP1
00089  C0B7  A0 00                 LDY #$00
00090  C0B9  4C A3 C0              JMP CYCCLRS
00091  C0BC  60                    RTS
00092  C0BD  14 7D 7D   CHRDEF     BYTE    20,125,125,125,105,105,20,0
00093  C0C5  14 6D 6D              BYTE    20,109,109,109,109,109,109,20
00094  C0CD  14 69 69              BYTE    20,105,105,105,125,125,125,20
00095  C0D5  14 79 79              BYTE    20,121,121,121,121,121,121,20
00096  C0DD             
00097  C0DD
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 17, 2014, 15:42:09

    MADRE MIA!!!
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Julio 17, 2014, 16:45:55
Aclarando sobre el bit 3 en la memoria de color. Si el bit 3 tiene el valor de 1, entonces se interpreta que ese carácter está en modo multicolor. Ésto significa simplemente que tienes el valor de 8 de inicio, al cual le sumas el código de color que desea asignar, es decir, del 0 al 7.
Por otro lado, si el bit 3 tiene un valor de 0, entonces se interpreta que el carácter está en hires, pero de igual modo, solo puedes usar los primeros 7 colores, asignando los valores del 0 al 7.
¿Qué significa ésto? Significa que, en modo multicolor, puedes mezclar caracteres en hires y multicolor libremente. Claro que te obliga a definir tu conjunto de caracteres para usar esta característica, limitado a los dos primeros colores Background 0 y color de memoria carácter, en aquellos en hires.

Saludos.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 17, 2014, 17:03:27
Ese modo mixto es muy lindo!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 19, 2014, 00:11:22
 He tenido un ratito y he mejorado el Sprite de Bieno...os lo adjunto en la respuesta.
Título: Re:Dudas en Ensamblador
Publicado por: Bieno en Julio 19, 2014, 01:24:26
Mejor  :)
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 20, 2014, 00:41:45
 Os adjunto en ésta respuesta la ultima actualizacion en la que ya se ve en su totalidad la idea de Pastbytes y el juego ya está TOTALMENTE en Español, también he mejorado el Sprite de Carlos levemente y es restayrado el sprite que me mando Laddh.

   Saludos!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 21, 2014, 13:06:16
 Carlos, no se si te acordaras que en el tema de superar los 255 por un sprite nos quedamos en que modifique levemente una rutina que me distes:

:label
    lda $d010   ; cargo el registro que controla los octavos bits de la coordenada X
    ora #%1000000 ; pongo el primer bit (sprite 0) a 1

ahora pone:

label
   lda #%00000001
   sta $d010
...

No es buena idea, te funcionará mientras sólo uses el sprite 0 pero cuando tengas alguno mas estarás machacando lo que hay en los demás bits del registro $d010.

Prueba con lo siguiente y te debería funcionar igual, manteniendo inalterables el resto de bits de $d010:

lda $d010
ora #%00000001
sta $d010


 Pues ya he hecho la modificacion que me dijiste y funciona perpectamente y como dices no machaco los demas bits de los sprites restantes,..ahora me queda empezar a mostrar mas sprites y a gestionarlo en todos.

  Gracias.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 17, 2014, 12:47:59
  buenas,...estoy de vacaciones y voy a recuperar éste hilo,....me quede en el tema de los chars multicolor,..se mostrarlos pero todavia no se darle el color que quiero (color char) a cada uno,...voy a remontar el hilo y a empollarmelo de nuevo..

  Creo que simplemente me tengo que aclarar el tema que he visto en los listados de configurar los cuatro primeros chars o algo asi, que todavia no se como va la historia para que pueda controlar el color char a mi antojo.

   En breve consultas que quiero cerrar esto y ponerme con la colision de sprites.

  Una ultima cosa, a Caligula le he dado un gran meneo!!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 18, 2014, 08:55:25
A ver si me podeis ayudar, os cuento hasta donde se....yo tengo un programita de ejemplo,..en él cargo el paquete de fuentes (que ya he diseñado yo con el cuneiform) y que ya estan diseñadas en modo multicolor y cada char contiene algun pixel con char color.

   El paquete de fuentes son cargadas en el banco 0 entre las posiciones $0800 a la $1000,...el programa luego configura el modo texto y aplica los dos multicolor char:

 LDA #$12
   STA $D018
   LDA #$1B
   STA $D011
   LDA #$18
   STA $D016
   
   ; COLORES MULTICOLOR CHARS
   LDA #$07     ; AMARILLO      
        STA $D022     ; BACKGROUND COLOR 2
        LDA #$08    ; NARANJA   
        STA $D023     ; BACKGROUND COLOR 3

   Hasta aqui todo va bien,......ahora cargo el char "A" por ejemplo y lo cargo en la posicion de pantalla $0400 (arriba del todo a la izquierda del todo en la pantalla).....

         LDA #$01     ; LETRA A      
         STA $0400    ; POSICION DE PANTALLA

  El char (letra A) se me muestra en pantalla y en la posicion que yo quiero, pero el color Char me sale en azul (imagino que el color por defecto si no esta configurado),..me he fijado en listados anteriores de Laddh y CPULoyal, haceis algo que no se hacer,...es configurar los cuatro primeros caracteres..

  El caso y de forma sencilla, segun el listado que he mostrado, que me falta por poner simplemente para que la A salga con el color char que yo quiero,...simplemente es saber que lineas me falta,...no necesito un Macro listado!!

   Un saludo y mil gracias.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 18, 2014, 09:43:26
(https://scontent-a-mad.xx.fbcdn.net/hphotos-xfa1/v/t1.0-9/10703670_645566602226346_7787779025062858294_n.jpg?oh=788755832c6d3fddba9074f730256e92&oe=5487D2A4)

  Os adjunto una imagen del char por si acaso fuera necesario,...vereis que en el cuneiform los color char 2 y 3 (amarillo y naranja) se me muestran en el cuneiform sin problemas,...el color blanco seria el color char que todavia no se darle color y que en el cuneiform se me muestra en blanco y en el programita que os he mostrado al sacarla en pantalla lo hace en azul..

        LDA #$07     ; AMARILLO     
        STA $D022     ; BACKGROUND COLOR 2
        LDA #$08    ; NARANJA   
        STA $D023     ; BACKGROUND COLOR 3

  Si configuro el color que quiero segun las posiciones de memoria color, que en este caso al mostrarse en $0400 seria la $D800 si me pone el color que quiero, pero al no hacer la configuracion de los cuatro primeros chars (que no se como se hace) que hacias Laddh y CPULoyal en vuestros listados,.......el char se me convierte en monocolor y vuelve a la definicion de punto por punto (no ladrillado)

   Bueno un saludo.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Septiembre 18, 2014, 17:21:36
Rulas, has tocado los registros con los colores comunes pero te falta la parte de manipular la memoria de color: http://retroinvaders.com/commodoremania/foro/index.php/topic,1080.msg13177.html#msg13177 (http://retroinvaders.com/commodoremania/foro/index.php/topic,1080.msg13177.html#msg13177)
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Septiembre 18, 2014, 18:14:23
Como Carlos te ha referido, el color que te falta aplicar es el de la memoria de color. Lo usual, en cuanto a la asignación de memoria de color, es usar una tabla en la que almacenes los colores que usaras en la pantalla, si es que son muy variados, o bien cambiar el color solo en las partes de tu imagen que lo requieren. Puesto que cada pantalla es de 1000 caracteres (40x25), tienes que asignar otros tantos bytes a cada posición para el color.
Así que, digamos que tienes las siguientes premisas. La memoria de color se mantiene fija para todos los bancos, es decir; a partir de la dirección $D800 y  hasta $DBFF (sí, esos son 1024 bytes, pero solo se usan 1000). Por otro lado tu memoria de pantalla está en la posición por defecto, $0400.

Código: [Seleccionar]
BGNCPY      LDY #$00            ;HACEMOS UNA COPIA DESDE LA TABLA (4 PAGINAS)
                  LDX #$04            ;EL REGISTRO X CONTIENE EL TOTAL DE PÁGINAS A
                  BEQ CPYRMNBY    ;COPIAR (CADA PÁGINA ES IGUAL A 256 BYTES)
                  LDA <TBLCOLOR           
                  STA $FB
                  LDA >TBLCOLOR
                  STA $FC               ;LA DIRECCION DE LA MEMORIA DE COLOR INICIA EN $D800
                  LDA #$00
                  STA $FD
                  LDA #$D8
                  STA $FE
KEEPCPY1   LDA ($FB),Y         ;CICLO DE COPIA EN BLOQUES DE 256 BYTES
                  STA ($FD),Y
                  INY
                  BNE KEEPCPY1
                  INC $FC             ;PREPARAMOS LOS APUNTADORES A LA SIGUIENTE PÁGINA
                  INC $FE             ;Y COMPROBAMOS SI AÚN QUEDAN PÁGINAS POR COPIAR
                  DEX
                  BNE KEEPCPY1
CPYRMNBY  LDX #$00            ;COPIAR LOS BYTES RESTANTES DE LA PÁGINA
                  BEQ CHRRTN        ;NUEVAMENTE EL REGISTRO X CONTIENE EL NÚMERO DE
KEEPCPY2   LDA ($FB),Y         ;BYTES FALTANTES
                  STA ($FD),Y
                  INY
                  DEX
                  BNE KEEPCPY2
                  RTS
TBLCOLOR BYTE 00, 01, 02, 03, 04, 05, 06, 07, 08
                 BYTE ... (HASTA COMPLETAR LOS 1000 BYTES DE COLOR)

Opcionalmente, si quieres asignar un solo color, un código como el siguiente te ayudaría a hacerlo:

Código: [Seleccionar]
INITSCRN   LDX #$00    ; USAMOS X PARA LLENAR LAS 4 PÁGINAS DE LA MEMORIA DE COLOR
CLEAR       LDA#$01      ; EL ACUMULADOR ES EL COLOR QUE ASIGNAREMOS A CADA CARACTER
                 STA $D800,X 
                 STA $D900,X
                 STA $DA00,X
                 STA $DAE8,X
                 INX
                 BNE CLEAR
                 RTS           

Cualquiera de los métodos que uses requiere que planees la asignación de colores para simplificar el código o para que definas adecuadamente los valores de las tablas.

Saludos
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 18, 2014, 20:12:56
  todo el tema de la memoria de color me lo controlo, lo que no se porque no me muestra el color,..creo que tus listados me van a venir muy bien,...voy a cenar y los pruebo,..me queda una duda,..no entiendo bien la ultima linea...

TBLCOLOR  BYTE 00, 01, 02, 03, 04, 05, 06, 07, 08
                  BYTE ... (HASTA COMPLETAR LOS 1000 BYTES DE COLOR)

y dudo ya que yo tengo la posicion de memoria en $d800 si tengo que tambiar TBLCOLOR por $$d800,..por ejemplo en las lineas..

                  LDA <TBLCOLOR           
                  STA $FB
                  LDA >TBLCOLOR
                  STA $FC               ;LA DIRECCION DE LA MEMORIA DE COLOR INICIA EN $D800

  Poner...

                  LDA <$D800         
                  STA $FB
                  LDA >$D800
                  STA $FC               ;LA DIRECCION DE LA MEMORIA DE COLOR INICIA EN $D800

  me doy cuenta que aqui hay mucha chica en estas lineas....
                  LDA <TBLCOLOR           
                  STA $FB
                  LDA >TBLCOLOR
                  STA $FC               ;LA DIRECCION DE LA MEMORIA DE COLOR INICIA EN $D800
                  LDA #$00
                  STA $FD
                  LDA #$D8
                  STA $FE

  He imagino que el tema de copiar las paginas sera totalmente necesario.....???......

   Hablamos....
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 18, 2014, 22:14:49
 CPULoyal he estado probando con el listado y al compilarlo me dice que no defino CHRRTN,...he estado probando de todo pero al final no me funciona,...estoy un poco desesperado...

  Voy a comenzar de nuevo porque me estoy liando...Yo quiero mostrar dos letras A en las posiciones $0400 y $0403,..configuro el modo texto, asigno los colores 1 y 2 del modo multicolor char (amarillo y naranja),..aplico color Verde en las posiciones $D800 y $d8003 y luego muestro las letras A en las posiciones dichas que es arriba a la izquierda....aqui el sencillo listado:

Código: [Seleccionar]
; FIJA MODO TEXTO
LDA #$12
STA $D018
LDA #$1B
STA $D011
LDA #$08
STA $D016
; COLORES MULTICOLOR CHARS
        LDA #$07     ; AMARILLO     
        STA $D022    ; BACKGROUND COLOR 1
        LDA #$08    ; NARANJA   
        STA $D023    ; BACKGROUND COLOR 2
; DA COLOR VERDE A POSICIONES DONDE SE MUESTRA LETRA A
LDA #$05    ; COLOR VERDE     
        STA $D800   ; POSICION DE VIDEO COLOR
STA $D803   ; POSICION DE VIDEO COLOR
; MUESTRA DOS LETRAS A EN LAS POSICIONES ARRIBA IZQUIERDA
LDA #$01    ; LETRA A     
        STA $0400   ; POSICION DE PANTALLA
STA $0403   ; POSICION DE PANTALLA

  Si arranco esto, me muestra las letras pero al aplicarles el color me las convierte en modo multicolor con la definicion punto por punto, sin el efecto ladrillado, esto lo hace solo si le apllico el color tal y como esta en el lprograma....

   Lo que necesito saber es Que le incluyo o que lineas le incluyo a este programa para que me muestren en el char A que muestro en la pantalla en las posiciones $0400 y $0403 en color verde,...repito, es simplemente saber que lineas le tengo que agregar al programa para que eso ocurra....

  Aqui os adjunto un archivo prg para que veais lo que ocurre si lo compilais y como se muestran las letras A,..que nada tiene que ver con la foto del char que adjunte respuestas atras..
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 18, 2014, 22:53:06
 Si por ejemplo yo compilo ese listado eliminando las lineas que asignan el color en este caso en $D800 el caracter se me ve bien, lo unico que el color char aparece en azul...

  Aqui lo veis arrancando lo que os adjunto en el vice...

  Saludos
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Septiembre 19, 2014, 00:56:46
  todo el tema de la memoria de color me lo controlo, lo que no se porque no me muestra el color,..creo que tus listados me van a venir muy bien,...voy a cenar y los pruebo,..me queda una duda,..no entiendo bien la ultima linea...

TBLCOLOR  BYTE 00, 01, 02, 03, 04, 05, 06, 07, 08
                  BYTE ... (HASTA COMPLETAR LOS 1000 BYTES DE COLOR)

y dudo ya que yo tengo la posicion de memoria en $d800 si tengo que tambiar TBLCOLOR por $$d800,..por ejemplo en las lineas..

                  LDA <TBLCOLOR           
                  STA $FB
                  LDA >TBLCOLOR
                  STA $FC               ;LA DIRECCION DE LA MEMORIA DE COLOR INICIA EN $D800

  Poner...

                  LDA <$D800         
                  STA $FB
                  LDA >$D800
                  STA $FC               ;LA DIRECCION DE LA MEMORIA DE COLOR INICIA EN $D800

  me doy cuenta que aqui hay mucha chica en estas lineas....
                  LDA <TBLCOLOR           
                  STA $FB
                  LDA >TBLCOLOR
                  STA $FC               ;LA DIRECCION DE LA MEMORIA DE COLOR INICIA EN $D800
                  LDA #$00
                  STA $FD
                  LDA #$D8
                  STA $FE

  He imagino que el tema de copiar las paginas sera totalmente necesario.....???......

   Hablamos....

TBLCOLOR es la etiqueta para indicar la dirección del inicio de la tabla de color, en el ensamblador. La rutina que te puse copia desde la dirección que dinámicamente le asigna el ensamblador, hacia la dirección fija de la memoria de color, es decir; $D800.

Asi, el segmento de código, inicia en los apuntadores en $FB/$FC para origen y en $FD/$FE para destino.

Código: [Seleccionar]
                  LDA <TBLCOLOR           
                  STA $FB
                  LDA >TBLCOLOR
                  STA $FC               ;LA DIRECCION DE LA MEMORIA DE COLOR INICIA EN $D800
                  LDA #$00
                  STA $FD
                  LDA #$D8
                  STA $FE

La copia usa el modo indexado indirecto y la página cero como auxiliar para mover los bloques de datos.
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Septiembre 19, 2014, 00:58:09
CPULoyal he estado probando con el listado y al compilarlo me dice que no defino CHRRTN,...he estado probando de todo pero al final no me funciona,...estoy un poco desesperado...

elimina el BEQ CHRRTN, se me coló en el ejemplo y no lo necesitas.
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Septiembre 19, 2014, 01:03:18
Si por ejemplo yo compilo ese listado eliminando las lineas que asignan el color en este caso en $D800 el caracter se me ve bien, lo unico que el color char aparece en azul...

  Aqui lo veis arrancando lo que os adjunto en el vice...

  Saludos

En tu programa no hay ninguna asignación de la memoria de colores. Prueba a colocar antes del loop JMP $4827 el siguiente código:

Código: [Seleccionar]
         LDA #$01    ; Color blanco
         STA $D800  ; Primera posición de la memoria de color, asignada a la posición en pantalla $0400
         JMP $4827

Eso debe darte el efecto que buscas.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 19, 2014, 10:47:55
 Gracias, lo pruebo y te cuento...Jodo, ayer hasta casi las 4 de la mañana dandole cera a Caligula!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 19, 2014, 13:09:38
LLevo toda la mañana probando de todo, poniendo quitando lineas, valores, etc......al final para nada!!!!,..no entiendo que lleve  24 horas dedicado a sacar un puto color char en pantalla y no sea capaz,....estoy ahora mismo con la cabeza como un bombo y me sale humo de las orejas,..por no hablar del mosqueo que tengo....

  vuelvo a adjuntar el listado a ver si alguien le puede agregar las lineas necesarias para que se muestre el char color en pantalla,.....ya se que me habeis dicho Mil veces que no asigno los colores en las posiciones de memoria a partir de $d800 y ya he dicho Mil veces que si lo hago se me va a tomar por culo el multicolor y el efecto ladrillado,....

Código: [Seleccionar]
; FIJA MODO TEXTO
LDA #$12
STA $D018
LDA #$1B
STA $D011
LDA #$08
STA $D016
; COLORES MULTICOLOR CHARS
        LDA #$07     ; AMARILLO     
        STA $D022    ; BACKGROUND COLOR 1
        LDA #$08    ; NARANJA   
        STA $D023    ; BACKGROUND COLOR 2
; DA COLOR VERDE A POSICIONES DONDE SE MUESTRA LETRA A
LDA #$05    ; COLOR VERDE     
        STA $D800   ; POSICION DE VIDEO COLOR
STA $D803   ; POSICION DE VIDEO COLOR
; MUESTRA DOS LETRAS A EN LAS POSICIONES ARRIBA IZQUIERDA
LDA #$01    ; LETRA A     
        STA $0400   ; POSICION DE PANTALLA
STA $0403   ; POSICION DE PANTALLA
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Septiembre 19, 2014, 17:09:20
Calma, lo que estás haciendo está bien. De hecho, puedes notar que los dos caracteres que pones en tu ejemplo toman el color verde (5) cuando los colocas en pantalla. Lo que está ocurriendo es que al asignar el color, se muestran en modo hires.
Para depurar tu código necesito que me indiques la dirección donde reside tu conjunto redefinido. Me parece que es $2800, pero quiero estar seguro.
También, si es posible, pon el archivo de cuneiform donde redefiniste los caracteres para revisarlo.

Saludos
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 19, 2014, 20:05:04
Calma, lo que estás haciendo está bien. De hecho, puedes notar que los dos caracteres que pones en tu ejemplo toman el color verde (5) cuando los colocas en pantalla. Lo que está ocurriendo es que al asignar el color, se muestran en modo hires.

  Exacto!!!,....eso es lo que me esta desquiciando, como ya sabras es super desesperante no comer, no dormir durante un dia,..para nada!!

  Mandame un mail aqui y te mando todo de un batacazo,...que aqui me da problemas en el momento que adjunto mas de un archivo,....ya intente mandarlo.

      retrogamesystems   arrobo      gmail.com
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 19, 2014, 20:07:58
Ya voy a aprovechar para mandarte la ultima actualizacion de Caligula....vas a flipar con el salto que ha dado!!,...si consigo depurar el esqueleto hecho, puede resultar en un buen Proyecto.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Septiembre 19, 2014, 21:47:09
Calma, lo que estás haciendo está bien. De hecho, puedes notar que los dos caracteres que pones en tu ejemplo toman el color verde (5) cuando los colocas en pantalla. Lo que está ocurriendo es que al asignar el color, se muestran en modo hires.

  Exacto!!!,....eso es lo que me esta desquiciando, como ya sabras es super desesperante no comer, no dormir durante un dia,..para nada!!

  Mandame un mail aqui y te mando todo de un batacazo,...que aqui me da problemas en el momento que adjunto mas de un archivo,....ya intente mandarlo.

      retrogamesystems   arrobo      gmail.com

Rulas:

; DA COLOR VERDE A POSICIONES DONDE SE MUESTRA LETRA A
LDA #$0D    ; COLOR VERDE      <=== AQUI ESTA LA CLAVE
STA $D800   ; POSICION DE VIDEO COLOR
STA $D803   ; POSICION DE VIDEO COLOR

Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Septiembre 19, 2014, 23:40:58
Ampliando el comentario de Carlos. En modo multicolor tienes 8 colores para cada carácter, porque el bit 4 se usa como bandera entre modo hires/multicolor. Si el bit está a 0, entonces el carácter se interpreta como hires. si el bit está a 1, entonces es multicolor.
De tal modo que, en tu ejmplo, para asignar el color verde tienes que sumarle 8 al color para que aparezca en multicolor, por lo que tal y como Carlos te indicó se asigna 13 ($0D) a la memoria de color correspondiente.
Adicionalmente, te falta cambiar a multicolor. Tu pusiste:

Código: [Seleccionar]
$4871     LDA #$08
$4873     STA $D016

Para cambiar a multicolor, el valor correcto es:

Código: [Seleccionar]
$4871     LDA #$18
$4873     STA $D016

Con este y el cambio propuesto por Carlos, verás tu A en multicolor.

Saludos
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 20, 2014, 01:11:29
Bueno,...todos tranquilos....

  Con las tres simples lineas que ha puesto carlos.......FUNCIONA!!,...la explicacion tuya CPULoyal de sumarle 8 al valor del color ya ha sido el remate,..ahora entiendo lo de hacerme mis tablas de color...
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 22, 2014, 20:11:43
  Bueno Troncos en breve nos ponemos con la Colision de Sprites,...de momento la hago a "capon", es decir, tienen que coincidir la X e Y exacta de mi Sprite con la X e Y del Sprite que quiero comparar....como os podeis imaginar es funcional pero no aceptable en un juego...

  En dos semanas de Vacaciones le he dado un meneo a Caligula que no me lo creo ni yo,..ya he incluido a CPULoyal en el hilo privado con las ultimas actualizaciones del Proyecto,..Carlos mandame un correo porque me gustaria incluirte en el Hilo/s

  Como digo lo proximo que quiero aprender es a gestionar la colision de sprites,..hay una posicion de memoria que gestiona algo de esto pero que desconozco como funciona,..se trata de la:

   $D01E      ; SPRITE TO SPRITE COLLISION REGISTER

  Se abre el debate,....no se si os habeis fijado que el archivo Constantes que yo cargo en todo programa contiene un listado de Etiquetas muy fidedizno al que os encontrareis en cualquier libro minimamente serio de programacion en ensamblador,..eso es asi para que el lenguaje de etiquetas sea lo mas standar para todos posibles..

    Saludos y AL HIERRO!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 25, 2014, 22:58:06
  Comentaros un asunto, que me vais a echar la bronca,...son de estas cosas que Carlos se sorprendera (ja,ja,jaj) en el sentido de como avanzo tanto por un lado y luego estoy tan primitivo por otro,..os cuento:

  Yo cuando monto un texto, lo monto digamos "a capon", quiero decir,..que cargo el en acumulador el valor de la letra segun el archivo de chars por defecto o cargado y luego lo aplico a la posicion de pantalla,..por ejemplo, por ejemplo (y para los no entendidos),..quiero mostrar la letra A en la posicion de pantalla arriba mas a la izquierda:

  LDA #$01         ; CARGO LETRA A
  STA $0400        ; APLICO A POSICION DE PANTALLA EN MEMORIA

  He estado consultado libros y listados en Bombjack/Commodore y veo que cargan algunos textos simplemente con .BYTE o .TEXT (atencion porque en el 64Tass se necesita el "." primero) y escriben el texto seguido y lo muestra

  Esto me llama mucho la atencion,.porque imaginaros el derroche de Bytes que yo hago,..el ahorro seria tan inimaginable que no me entra en la cabeza,...tambien pensad del despilfarro de Bytes que yo puedo hacer en textos largos o cortos muy numerosos (labyrinth)...

  Tengo que mirar este tema pero cualquier luz en relacion a mostrar un texto o textos con un gasto minimo (no lo que hago yo) de bytes lo agradezco mucho,...tras dos semanas de vacaciones le he metido un salto a Caligula (por cierto CPULoyal, Carlos, Baron, Zanni y Bieno no me habeis dicho nada todavia de la ultima actualizacion que os mande por privado) pero como imaginareis cuando creas rutinas nuevas y cosas nuevas derrochas bytes a tutiplen y ahora estoy de relectura del listado y estudio y te das cuenta de muchas cosas, entre otras, luego creas nuevas subrutinas y lo simplificas todo de la leche,..que decir tiene que el ahorro de bytes es super importante!!

  Lo dicho, cualquier luz en relacion a lo de mostrar un texto con no mucho gasto de bytes,...me hace Capitan.

  Bueno os dejo....
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 25, 2014, 23:04:29
 La verdad es que CPULoyal y Carlos os estais ganando vuestra presencia como "Asistentes de Programación"...
 
   Gracias!!
Título: Re:Dudas en Ensamblador
Publicado por: Portiella en Septiembre 25, 2014, 23:44:06
Con .BYTE o .TEXT lo que estás definiendo es un texto o byte que después debe ser copiado a la pantalla.

El ensamblador guardará ese texto en una zona de memoria "Datos", tu debes montar un bucle que copie byte a byte a la memoria de la pantalla.

No recuerdo las instrucciones porque hace 25 años que no programa el 6510
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Septiembre 27, 2014, 10:06:19
... 
  He estado consultado libros y listados en Bombjack/Commodore y veo que cargan algunos textos simplemente con .BYTE o .TEXT (atencion porque en el 64Tass se necesita el "." primero) y escriben el texto seguido y lo muestra
...

.byte, .text y demás son los llamados pseudo-ops (pseudo operandos) no son instrucciones del procesador propiamente dichas. Se suelen usar para definir tablas, por ejemplo el pseudo-op .byte coge lo que pones a continuación y lo convierte en una lista de bytes:

.byte 25, $fc = $19 $fc

Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Septiembre 28, 2014, 15:47:56
Como te explicaron, los comandos byte y text son pseudo-opcodes que solo son interpretados por el ensamblador (de acuerdo a sus propias reglas y como tal, no consistente entre diferentes ensambladores) y que no forman parte del conjunto de instrucciones del 6510. Son ayudas para simplificar la entrada de datos al momento de programar.
Byte  simplemente indica que lo que sigue a continuación no debe ser interpretado como código, sino como datos.
Por otro lado, text es usado para indicar que lo que sigue a continuación debe ser interpretado por ensamblador como códigos de pantalla, porque como recordarás, en las Commodore los caracteres dichos valores no son los que corresponden a los valores ASCII. Por ejemplo, la A no redefinida tiene un valor ASCII 65 y un valor 1 en código de pantalla.
Así, al usarlos en tu programa lo que defines son tablas que, como tales, deben ser leidas en un bucle y el auxilio de otro registro índice. Ahí sí estas ahorrando memoria con las LDA secuenciales.


Saludos

P.D. El disco duro de mi máquina Güindoze con todos su 250 GB, en el cual tenía todas mis aplicaciones y herramientas de trabajo decidió irse por la libre.
Me he pasado los últimos días rescatando datos, pero entre que todavía no he comprado otro disco al cual trasferirlos y que esta semana recien entré a un nuevo trabajo, no he tenido oportunidad de contestarte.
Mientras tanto, me monté en otro disco duro más pequeño el Linux y apenas estoy terminando de configurarlo para volverlo Commodore VICE ;D Así que durante la siguiente semana te responderé con mis comentarios al avance de Calígula.
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Septiembre 28, 2014, 21:10:01
Hay 2 formas típicas de imprimir en pantalla, la primera es la usual de caracter a caracter con un contador que has de saber de antemano:
Código: [Seleccionar]
* = $1000  
  LDX #0
BUCLE LDA TEXTO,X
  JSR $FFD2
  INX
  CPX #13 ;total caracteres
  BNE BUCLE
  RTS
TEXTO .TEXT "HOLA A TODOS."

Y la otra es llamando a la subrutina $AB1E que imprime una cadena acabada con un byte 0

Código: [Seleccionar]
* = $1000  
    LDA #<CADENA
  LDY #>CADENA
  JSR $AB1E
  RTS
CADENA .TEXT "HOLA A TODOS!!!"
  .BYTE $00
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 01, 2014, 00:52:06
Buff!!,..perdonad mi ausencia, estaba de Claustro con Caligula y como ya he vuelto de Vaaciones mis tiempos se han vuelto a reducir mucho,..dadme un pelín de tiempo para digerir las respuestas, lo que esta claro es que tengo que hacer algo porque la forma en la que muestro los textos actualmente es desmesurada en el gasto de bytes,..me acuerdo que Lobo me dijo que era inimaginable aunque me vendria bien para saber como se monta algo ladrillo a ladrillo...

  Saludos FERREOS!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 01, 2014, 22:22:54
 
   (https://scontent-a-mad.xx.fbcdn.net/hphotos-xpf1/v/t1.0-9/10354941_652870021496004_5553930861455251816_n.jpg?oh=24625d78d5433d825a3df6edd5c67135&oe=54B0D19B)

   Dicen que todo Genio tiene sus rarezas..os muestro una Foto curiosa en la que se ve el Monitor del PC desde el que Desarrollo y en la Pared y como consulta rapida un listado de Etiquetas Standar de las principales posiciones de memoria, un listado de las poco mas de 40 instrucciones del 6502, un mapa de 4 Bank de memoria y un mapa de la memoria de pantalla...
   
  Pensareis que estoy zumbado!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 01, 2014, 22:24:16

   No se que calidad tendra una vez subida, pero la foto que está tirada con un buen movil os puedo asegurar que empiezo a ampliar, ampliar y ampliar y hasta leo las letras,..increible!!
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Octubre 01, 2014, 22:56:31
¡Te has montado un buen espacio de trabajo! El Calígula está quedando muy bien.
Título: Re:Dudas en Ensamblador
Publicado por: CPULoyal en Octubre 01, 2014, 23:31:25
Lo mejor es la botella al entre la bocina y la lámpara  :P
Recuerda. Si manejas no tomas y si tomas... ¡Invita!  ;D

Saludos
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Octubre 02, 2014, 08:25:50
Eso si que es una consulta rápida!
Título: Re:Dudas en Ensamblador
Publicado por: Jeff en Octubre 02, 2014, 09:09:00
R Tape Loading error
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 06, 2014, 10:32:13
 Buenas Troncos,...quiero ponerme con la gestion de superacion de barrera de 255 en pantalla y con la colision de sprites ya a cañon!!,..comienzo con lo primero.

  Lo cual se hacer pero tengo que aprender a gestionar el movimiento y comportamiento de todos los sprites independendientemente de donde se encuentren,...para entendernos vamos a llamar a la zona de pantalla de 0 a 255 "zona 1" y de 255 hasta el final "Zona 2"

  Imagino que creando una sencilla rutina que gestino cada sprite no habra pobrema,..en el foro se me enseño a entrar en la Zona 2 utilizando OR...una pregunta:

  Puedo hacerlo, comparando no con numero binario todos los bits de $D010 con OR,....sino simplemente el bit (sprite) que yo quiero chequear,.es decir:.....cargo el valor del bit Sprite X (el que sea), lo comparo con AND,..me dira si esta apagado o encendido (si en ese momento esta en la zona1 o zona2), si por ejemplo el sprite esta lo mas a la izquierda posible y comienza a moverse a la derecha, cuando llega a 255 y tras comparar con AND/BNE en que zona esta (que sera la 1 y el bit sera 0), entonces el bit se pone a 1 para que pueda seguir movimiendose por la zona 2 (esto si lo haria con un OR) y con esto no afectaria a los demas sprites tampoco..

  Haciendo unas ocho rutinas de este tipo (o la que sea) podria incluirlas (llamarlas) en los movimientos de todos los sprites y ellas solas gestionarian el paso de una zona a otra de cada sprites,...es solo una pregunta, no se como lo veis, asi todo tengo que probarlo.

   Gracias.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 06, 2014, 14:15:30
 Estoy pensando en como hare las rutinas que gestionen esto, muchas veces antes de hacer algo estoy reflexionando mentalmente a ver como lo hago y de la forma mas sencilla (ya que el ensamblador ofrece esa posibilidad)....una dudilla suponiendo éste ejemplo:

 Tengo el sprite 0 a la izquierda del todo de la lpantalla (en la Zona 1 por debajo de los 255) y comienzo a moverlo (INC ...) tras moverlo llamo a la rutina que gestiona el asunto para el sprite 0, que podria ser asi

    LDA SP0X                 ; CARGA EL VALOR DE $D000,  X DE SPRITE 0
    CMP #$FF                 ; LO COMPARA CON 255
    BEQ OPERA              ; SI ES IGUAL OPERA LO QUE QUERAMOS QUE SERA QUE SUPERE LA BARRERA
    RTS                          ; REGRESA Y CONTINUA CURSO DE JUEGO

OPERA
    LDA $D010
    ORA #%00000001   ; COMPARA Y SI ES 0 PONE 1 CON LOGICA ORA
    STA $D010               ; APLICA A $D010, SPRITE 0 YA ESTA EN ZONA 2
    RTS                          ; REGRESA          

  En la rutina OPERA tengo una pequeña duda,...tambien podria escribir esto?, utilizando el AND:
 
    LDA SP0X                 ; CARGA EL VALOR DE $D000,  X DE SPRITE 0
   CMP #$FF                 ; LO COMPARA CON 255
    BEQ OPERA              ; SI ES IGUAL OPERA LO QUE QUERAMOS QUE SERA QUE SUPERE LA BARRERA
    RTS                          ; REGRESA Y CONTINUA CURSO DE JUEGO
 
OPERA
    LDA $D010      
    AND #1                    ; COMPARA CON EL BIT QUE GESTIONA EL SPRITE 0 EN $D010
    BNE SUPERA             ; SI ES CERO ESTA EN ZONA 1 Y HA LLEGADO AL TOPE, MANDA A SUPERA
    RTS
 
SUPERA
    LDA #$01                 ; CARGA VALOR 1
    STA $D010               ; APLICA A $D010, SPRITE 0 YA ESTA EN ZONA 2
    RTS 

  Asi todo a ver si me pongo y en cuanto tenga rutinas ya hechas en serio las muestro aqui...saludos.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 06, 2014, 14:32:51
  Pensareis que para que quiero utilizar el AND,..pero no se que me pasa que cuando hago el sentido contrario de izquirda a derecha (de zona 2 a zona 1),..cuando el sprite 0 pasa a la zona 1 me arrastra a todos los demas, no se porque,..no se si el secreto esta en la Logica que todavia no utilizo...EOR..

  Seguire contando...
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Octubre 06, 2014, 17:39:49
Primero deberias entender bien como es que funciona encender y apagar bits.
La operacion OR se usa generalmente para acumular unos, es decir para activar bits sin alterar los demas, por eso si queremos activar el bit 2 y tenemos que el registro contiene 11110000, haciendo 11110000 OR 00000100 nos daria 11110100 porque en cada bit donde haya 1 o 2 unos el resultado sera 1, solo sera 0 si el bit es 0 en ambos bytes.
Si el registro tuviera en su lugar el valor 11111111, haciendo OR 00000100 daria 11111111 porque en el bit 2 hay dos unos y por lo tanto no se altera.
Para apagar un bit lo que se usa es AND, que deja intacto todo lo que tenga un 1 en la mascara, si tenemos un valor en el registro y queremos poner a 0 los bits 0 a 3, hariamos registro AND 11110000, si registro contiene por ejemplo el valor 10101010, lo que quedaria es 10100000. Para apagar un bit determinado, entonces, harias una mascara con el bit correspondiente, por ejemplo si queremos apagar el bit 2 la mascara seria 00000100, si queremos activar el bit usariamos OR y esa mascara tal como esta, pero con AND debemos primero invertirla, quedando como 11111011, esto al aplicarle AND dejaria intactos todos los bits (porque AND de un valor X con 1 siempre da el mismo valor X) excepto el bit 2, que esta a 0.
Lo de comparar con 255 no sirve en todos los casos, porque no necesariamente vas a avanzar de a 1 pixel, podrias estar incrementando a distintas velocidades y darse el caso de que fuera 254 y luego avance 2 pixeles, en cuyo caso no detectarias que tiene que pasar a la otra zona. Si lo quieres simplificar, lo mejor va a ser que hagas 2 rutinas por sprite, una para avanzar un pixel, otra para retroceder un pixel, y asi por cada sprite. Te limitarias a moverte siempre de a un pixel a la vez, pero en la rutina ya te encargarias de incrementar o decrementar 1 en el registro correspondiente, si el incremento activa la bandera carry sabes que pasaste de 255 a 0, y entonces activas con OR el bit correspondiente. Lo mismo cuando pasas de 0 a 255 restando 1, creo que te tiene que activar la bandera de negativo (ahora no recuerdo cual se activa), y antes de hacer algo tendrias que chequear si el bit de ese sprite era 1 para saber si pasaste de la zona superior a la normal. De paso en esas rutinas agregas los chequeos para que el sprite se mantenga dentro de la pantalla, y en el juego seria facil de usar porque solo llamarias a dos rutinas por sprite.
Mas adelante una optimizacion podria ser meter todas las rutinas en una sola, y decirle a la rutina que es lo que quieres hacer cargando un valor en el acumulador, por ejemplo, cargando el numero de sprite en A, de 0 a 7, y usando por ejemplo el bit 7 para indicar si se quiere avanzar o retroceder un pixel.
La operacion OR exclusivo sirve generalmente para invertir el estado de bits especificos, o para hacer una comparacion de igualdad entre dos valores.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 06, 2014, 21:53:54
  Mil gracias!!,...me pongo con ello.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 08, 2014, 00:42:33
 ......
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 16, 2014, 23:13:16
  Bieno, sabes que tengo pendiente contactar con Sandro por privado, pero también sabes que ultimamente estoy muy liado, si hablas con el comentale el tema y dile que si tiene algun momento, que le eche una ojeada a este Hilo, yo se lo agradeceré mogollón!! y espero aprender también mucho de él.
 
 
Título: Re:Dudas en Ensamblador
Publicado por: Bieno en Octubre 16, 2014, 23:14:43
Se lo comento, a ver que tal y como de liado está. Le paso tu mail
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Noviembre 26, 2014, 21:51:17
  Una pregunta tonta,...estoy utilizando para la lectura del Joystick la posicion CIAPRB ($DC01) y creo que es el Puerto 1,...pero me mola mas que vaya en el Puerto 2 y quiero hacer la lectura en ese puerto,..para que eso esa así, ¿tendria que leer CIAPRA ($DC00)?

  Saludos
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Noviembre 27, 2014, 00:09:33
Yo diría que para el Joy2 es igual todo pero en la otra dirección.
Título: Re:Dudas en Ensamblador
Publicado por: Portiella en Noviembre 27, 2014, 16:50:52
http://codebase64.org/doku.php?id=base:joystick_input_handling (http://codebase64.org/doku.php?id=base:joystick_input_handling)

$dc00 puerto 2
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Noviembre 28, 2014, 09:44:13
  Me quedo la pagina en Favoritos, muy interesante, hace tiempo la conocia pero la tenia extraviada, la veré tranquilamente.

  En esta pagina, ¿explica algo de la colision de Sprites?,..si es asi si me pasas el enlace tambien te lo agradezco mucho.

   Saludos.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Noviembre 28, 2014, 16:35:45
  Me quedo la pagina en Favoritos, muy interesante, hace tiempo la conocia pero la tenia extraviada, la veré tranquilamente.

  En esta pagina, ¿explica algo de la colision de Sprites?,..si es asi si me pasas el enlace tambien te lo agradezco mucho.

   Saludos.

Esa página es, sencillamente, la biblia. Sobre lo que preguntas: http://codebase64.org/doku.php?id=base:sprites (http://codebase64.org/doku.php?id=base:sprites)
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Noviembre 28, 2014, 23:18:00
 Buff,.la pagina está Bestial! (también he estado consultado temas de SID, Efectos y Melodías),..a ver si tengo tiempo porque ahora tengo una temporada muy apretada de curro y me falta tiempo,.en cualquier caso me agrada saber que te tengo "cerca" ante cualquier duda...

  Gracias y Hablamos...
 
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Abril 25, 2015, 23:04:59

   Remonto éste Hilo ya que me han salido y me saldran muchas dudas y preguntas en relacion a la Ensamblacion y al manejo del Hierro (el 6502) y que quiero aplicar a mi nuevo Proyecto que se estrenará en 2016,...

  Tengo una primera duda,...quiero aprender el manejo de nuevas rutinas, pero creo que es mejor practicarlas en mini Ejercicios (mini juegos), no?.... y cuando las meneje pasarlas al gran proyecto, aparte de ésta forma también son mas apreciables para todo el mundo e incluso explicativas,..

   Agradezco mogollon como siempre a que toda persona que tenga conocimientos participe en este hilo que me ayuda como siempre a mejorar,..Carlos, Marcos, Laddh, Jeff, Alakran, Portiella, CPULoyal, pastbytes,etc, etc, etc...

  No me enrollo mas que no tengo tiempo...Hasta pronto!
   
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Abril 25, 2015, 23:26:02
   De momento ya he puesto en practica lo de la funcionalidad en $DC00 y ya todo lo que haga funcionará en el Puerto 2.

 
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Abril 25, 2015, 23:35:52
El puerto 2 suele ser lo normal, mejor así!
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Abril 28, 2015, 02:33:16
Yo no soy muy fan de las demos e intros, pero me parece que en este caso incluso un mini juego te puede desviar de lo que quieres probar. Por ejemplo, si se te ocurre probar una rutina para generar mas de 8 sprites en pantalla, o para leer mejor el joystick, o lo que fuera, un mini juego podria servir, pero al hacer un juego por mas pequeño que sea, hay que pensar en una historia y otros detalles que hacen perder tiempo que se podria dedicar al juego principal o a mejorar lo que pretendes probar.
En un caso asi, me parece que pensar en una demo, o mejor en una intro que de paso serviria para el futuro juego, podria ser mas util, ya que ahi no hay reglas y no hay mucha participacion del usuario, puedes probar cualquier efecto que se te ocurra.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Abril 28, 2015, 03:04:53
Cierto, no es mala idea. Aunque Rulas luego se las arregla para convertir la intro en un minijuego :P me acuerdo del AT&AT de Star Wars.
Título: Re:Dudas en Ensamblador
Publicado por: Jeff en Abril 28, 2015, 08:50:19
R Tape Loading error
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Abril 30, 2015, 23:42:43
Por ejemplo, si se te ocurre probar una rutina para generar mas de 8 sprites en pantalla, o para leer mejor el joystick, o lo que fuera, un mini juego podria servir, pero al hacer un juego por mas pequeño que sea, hay que pensar en una historia y otros detalles que hacen perder tiempo que se podria dedicar al juego principal o a mejorar lo que pretendes probar.

  Indudablemente tienes razon y eso es lo que me da miedo,..que haces un ejercicio para probar rutinas y al final te pierdes en hacer un mini proyecto que luego te desvia del original y te hace perder mucho tiempo, a espensas de mas opiniones me tiro por la tuya,..una cosa es un ejercicio y otra un mini o gran proyecto..

  Estoy trabajando en algo gordo, no me importa el tiempo que tarde pero sé que necesito nuevos conocimientos para dar un gran salto,..voy a cerrar algun asunto en relacion a ello como son construccion de graficos sprites y decorados (que es en lo que estoy liado ahora) y a comenzar un primer ejercicio que se centre solo en lo que quiero aprender y que luego trasladaré al Master y que me suponga un nuevo salto...

  Lo que está claro es que hasta la fecha he sido muy ordenado (quitando el lunar de La Carretera) en el tema de iniciar/cerrar un proyecto y no quiero "perderme" en minis,...gracias por el aporte pastbytes

  Hablamos
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Abril 30, 2015, 23:48:23
  Por cierto ando buscando desesperadamente listados en ensamblador de mini rutinas que creen Efectos o mini melodias en Ensamblador,..cualquiera que se me pueda pasar para experimentar lo agradezco mucho...

 

 
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Mayo 01, 2015, 09:10:08
No hay ninguna en codebase64?
http://codebase64.org/doku.php (http://codebase64.org/doku.php)
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Mayo 03, 2015, 21:49:14
  Por cierto ando buscando desesperadamente listados en ensamblador de mini rutinas que creen Efectos o mini melodias en Ensamblador,..cualquiera que se me pueda pasar para experimentar lo agradezco mucho...

No es más fácil reproducir un sid sin mas o estás buscando otra cosa?
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Mayo 04, 2015, 13:11:52
 Tambien tienes razon Carlos,...reproducciendo un sid (llamandole) cuando quiera tambien me podria servir,..voy a practicar con una mini rutina y os cuento.

    Chao
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Mayo 04, 2015, 18:23:43
Reproducir un sid es sencillo en cuanto a código (asociarlo a una raster y poco mas). Cualquier duda por aquí.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Mayo 06, 2015, 23:27:32
Hace tiempo se enlazo a unos Listados Fermhg muy interesantes con rutinas muy buenas para aprender,..contiene una de un efecto de sonido...

   ; ESTA ES LA CABECERA QUE SIEMPRE PONGO EN TODO PROGRAMA QUE
   ; CREA LINEA EN BASIC Y LLAMA A CODIGO MAQUINA
*=$0801         
   .WORD   NEXT,10   
   .NULL   $9E,^START
NEXT   .WORD   0
   START            
   ; Y AQUI ESTA LA RUTINA DE LA QUE HABLO
   LDA #$00
   STA $D011   
BUCLE   
   LDA #$00   
   STA $D418   
   LDA #$0F
   STA $D418   
   JMP BUCLE

 La he compilado y la adjunto en esta respuesta para probar en el Vice,...el sonido la verdad es que no es lo mio y estoy descubriendolo,..el control de voz va desde $D400 A $D414 y el control de filtros va de $D415 A $D418,...imagino que utiilizando alguna posicion de memoria mas o trasteando, utilizando esta rutina como base se pueden conseguir algunos efectos y resultados interesantes,...cualquier cosa, prueba o idea se agradece mucho....

Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Mayo 07, 2015, 23:17:42
  Buff!,..ahora lo que queda de semana y parte de la siguiente estoy muy cargado de curro, pero preparaos que en cuanto esté mas liberado, tengo un batallon de dudas con muchas rutinillas...

   Saludos.
Título: Re:Dudas en Ensamblador
Publicado por: Zonacas en Mayo 08, 2015, 07:57:48
Molaría tener un curso de Ensamblador "completo" en Español, con una base sobre ensamblador para principiantes y luego varios ejemplos de rutinas para ser usar en videojuegos , la más utilizadas para tratamiento de imagenes , movimiento, colisiones, sonido, música etc

el de lobogris que es el que yo seguía se quedo en el capitulo 5.3 :(
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Mayo 08, 2015, 12:46:30
Lobogris está missing... :-S
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Mayo 28, 2015, 23:12:17
  Acabo de cerrar una primera Fase de montaje sobre el nuevo Proyecto que me ando,..(Pronto Demo por privado para ayegados),..el Proyecto actualmente se me ha ido de madre con 30 Kb,...ahora voy a hacer un paron importante en el que mi principal objetivo es comedir el despelote de Bytes que supone aprender y crear cosas nuevas y economizar al maximo las rutinas,..de hecho no se ni como acabará esto ya que tengo que economizar un huevazo si quiero seguir...

  Pronto un batallon de dudas nuevas y de mejoramiento futuro, andaros pendientes y como siempre mil gracias por vuestra ayuda...

  Una perlita que suelto,...en el bank2 existen un banco de datos por defecto de los Character Memory (rom image) que no utilizo y que seria fundamental para mi eliminar (si se puede) ya que no lo utilizo ya que yo eso lo trabajo con el mismo banco de datos en el Bank0 y que si pudiera liberar de espacio seria la Hostia,..creo que Sandro en sus juegos consigue liberarlo pero no se como se hace,..a ver si Sandro o quien sea me puede ayudar en éste sentido...

  Toda la economizacion y reducion es poca,...en esta foto podeis localizar la zona a la que os aludo...

  (https://scontent-mad1-1.xx.fbcdn.net/hphotos-xtf1/v/t1.0-9/11351465_785094771606861_7340899866482186316_n.jpg?_nc_eui=AWhejauo1la1gin34vnAoaaXhI3QJSMz9Np4gg&oh=5aec36a272b192b9720fc2a0f75b85ee&oe=55EE7430)

  Hasta pronto
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Mayo 28, 2015, 23:27:43
  Molaría tener un curso de Ensamblador "completo" en Español, con una base sobre ensamblador para principiantes y luego varios ejemplos de rutinas para ser usar en videojuegos , la más utilizadas para tratamiento de imagenes , movimiento, colisiones, sonido, música etc

  Dicho con todos mis respetos Zonacas,.."no te ahoges en un charcho",..tienes esto en Commodore Plus que nos llevo un trabajo a Bieno y a mí, para poder comenzar en Ensamblador,.aqui el enlace y por desgracia olvidate de Lobo,..nadie mas que yo desea que algun dia vuelva...

  http://www.commodoreplus.org/search/label/tutoriales (http://www.commodoreplus.org/search/label/tutoriales)

  Saludos
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Mayo 30, 2015, 12:52:07
...
  Una perlita que suelto,...en el bank2 existen un banco de datos por defecto de los Character Memory (rom image) que no utilizo y que seria fundamental para mi eliminar (si se puede) ya que no lo utilizo ya que yo eso lo trabajo con el mismo banco de datos en el Bank0 y que si pudiera liberar de espacio seria la Hostia,..creo que Sandro en sus juegos consigue liberarlo pero no se como se hace,..a ver si Sandro o quien sea me puede ayudar en éste sentido...

  Toda la economizacion y reducion es poca,...en esta foto podeis localizar la zona a la que os aludo...
...  Hasta pronto


Lo que buscas está aquí: http://codebase64.org/doku.php?id=base:memory_management (http://codebase64.org/doku.php?id=base:memory_management)

La character memory que tu dices del bank 2 ($9000-$a000) no la puedes eliminar, pero sí la puedes usar sin ningún problema para almacenar código o datos (nunca datos de video que serán interpretados por el VIC como caracteres o sprites).

Lo que sí puedes eliminar es el Basic y el Kernal.
Título: Re:Dudas en Ensamblador
Publicado por: Zonacas en Junio 04, 2015, 11:47:26
  Molaría tener un curso de Ensamblador "completo" en Español, con una base sobre ensamblador para principiantes y luego varios ejemplos de rutinas para ser usar en videojuegos , la más utilizadas para tratamiento de imagenes , movimiento, colisiones, sonido, música etc

  Dicho con todos mis respetos Zonacas,.."no te ahoges en un charcho",..tienes esto en Commodore Plus que nos llevo un trabajo a Bieno y a mí, para poder comenzar en Ensamblador,.aqui el enlace y por desgracia olvidate de Lobo,..nadie mas que yo desea que algun dia vuelva...

  http://www.commodoreplus.org/search/label/tutoriales (http://www.commodoreplus.org/search/label/tutoriales)

  Saludos

Gracias por el enlace

Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Junio 29, 2015, 09:53:33
  Bueno ya estoy de vacaciones osea que me vereis mas activo por aqui y sobre todo por éste hilo,..como os conte para crear texto los hacia cargando letra por letra en el acumulador el texto y eso me suponia un gasto de bytes tremendo...

Código: [Seleccionar]
*=$0801 ; INICIA PROGRAMA EN ESA POSICION
.WORD NEXT,10 ; CREA LINEA EN BASIC E INICIA CODIGO MAQUINA
.NULL $9E,^START ; "SYS START" (START=INIT M.C.)
NEXT .WORD 0 ; FIN BASIC
START ;SEI HABILITA INTERRUPCIONES (SEI, DESABILITA)

; RUTINA ESCRIBIR TEXTO
LDX #0
BUCLE
LDA TEXTO,X ; CARGA A CON EL VALOR DEL TEXTO Y SIGUIENTES
JSR $FFD2 ; SALTA A RUTINA EN ROM SACA A PANTALLA CARACTER ASCII
INX ; INCREMENTA EL VALOR DE X
CPX #13 ; COMPARA VALOR DE X CON 13 QUE ES FINAL DE TEXTO
BNE BUCLE ; SI NO ES ASI VUELVE AL BUCLE
FIN
JMP FIN

TEXTO .TEXT"HOLA A TODOS."

   He estado probando esta rutina que os adjunto y me funciona perfecta,..solo me falta por saber como hago para que el texto aparezca en el punto que yo quiero en pantalla, vamos la posicion de memoria de pantalla que yo elija

   Haciendo los textos asi, por cadenas de caracteres el ahorro va a ser bestial,..ahora estoy en plan de reducir el listado al maximo..

  Me contais y saludos.
   
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Junio 29, 2015, 12:38:44
Creo recordar que habian un par de pokes para esto.
Tengo una libreta con pokes útiles anotados. Lo miraré cuando llegue a casa.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Junio 29, 2015, 16:10:29
Según parece hay que ubicar el cursor donde se quiere imprimir.

Quizás esto sirva (no lo he probado)

Código: [Seleccionar]
1000 poke 780,0
1010 poke 781,row
1020 poke 782,col
1030 sys 65520
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Junio 29, 2015, 16:37:21
Según parece hay que ubicar el cursor donde se quiere imprimir.

Quizás esto sirva (no lo he probado)

Código: [Seleccionar]
1000 poke 780,0
1010 poke 781,row
1020 poke 782,col
1030 sys 65520

Eso funciona incluso sin el 780,0. Probado en VICE.
Pero creo que tengo algo mas sencillo por casa. Lo buscare
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Junio 29, 2015, 20:58:23
No era lo que creia.

POKE 214,x

Pone el cursor en la linea x pero no sirve para los print.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Junio 29, 2015, 21:23:54
Esta manera es algo mas corta y sin bucles que te ralenticen el programa.

Código: [Seleccionar]
         *= $1000   /Inicio codigo  sys4096

         ldx #$00  /Lobyte direccion del texto
         stx $22    /Almacenado
         ldx #$50 /Hibyte
         stx $23   /Almacenado
         lda #$0A /Cantidad de caracteres a mostrar
         jsr $ab24 / Rutina mostrar texto
         rts            /Salir a basic

         *= $5000     /Zona de memoria donde almacenar el texto.
        .text "hola majos"
-----------------------------------------------------------
turbo macro pro v1.2            by style
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Junio 30, 2015, 04:43:28
A esta altura deberias haberte leido las rutinas del kernal, ya que ahi esta todo el sistema operativo, las rutinas para leer y grabar en dispositivos como impresoras y disketeras, tambien la impresion en pantalla, la lectura del teclado, y lo interesante es que esas rutinas son compatibles con otros modelos de Commodore, estan en las mismas direcciones en todos los modelos.
No tengo ahora a mano el manual pero creo que para esa rutina habia por lo menos una que permite colocar el cursor en la fila y columna que elijas, y otra que te devuelve la fila y columna actual.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 01, 2015, 00:46:59
  Mañana voy a salir del Claustro y le voy a incluir a la pantalla un Limpiado y colores de fondo negros a ver donde me muestra el texto y a partir de ahi a ver que le incluyo a la rutina para que me muestre el texto donde yo quiero...

  Que conste que yo ya se mostrar cualquier char en cualquier punto de la pantalla que yo quiero pero ahora creo que estamos hablando de una cadena de chars (caracteres) la historia es donde posicionar el inicio de la cadena, supongo,...yo pregunto porque no se como hacerlo y cualquier resolucion es bienvenida,...mañana hablamos...

 Chao.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 01, 2015, 00:49:09
A esta altura deberias haberte leido las rutinas del kernal, ya que ahi esta todo el sistema operativo,

  No se si las tendre o no o si las habré leido o no,..ya sabeis que soy un desastre, en cualquier caso si me las puedes adjuntar por aquí,.nunca vienen mal...

  Saludos
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 01, 2015, 02:00:20
Lo decia porque sigues un camino un tanto inusual, te has salteado algunos pasos en tu incursion en la programacion en ensamblador, normalmente lo primero que se aprende despues de las instrucciones del 6502 son las rutinas de la ROM, lo que vendria a ser la "BIOS" del C64.
En la mayoria de los ordenadores el uso es similar, se definen dispositivos asignandoles un numero, algunos son de entrada, otros de salida y otros de entrada/salida, un ejemplo de dispositivo de entrada es el teclado, de salida la pantalla, y de entrada/salida todo lo que tiene que ver con el almacenamiento. En los Commodore (PET, C16, Plus/4, C128, C64, etc.) se usa la rutina OPEN para abrir un canal hacia un dispositivo (que puede ser el teclado o la pantalla tambien), y luego hay rutinas para enviar o recibir un byte, dependiendo del dispositivo del cual se trate, se requerira llamar a otras rutinas antes de OPEN, por ejemplo si es un dispositivo de E/S hay que llamar a una rutina para especificar el nombre del archivo. Si se quiere enviar un comando a la disketera, como por ejemplo para formatear un diskette, se usa la cadena de comandos como si fuera el nombre de archivo.
Usando el numero de dispositivo de la pantalla se puede imprimir con esas mismas rutinas genericas, pero la que usaste es una rutina que enmascara todo eso y va directamente a la pantalla, aunque por debajo use las genericas.
Lo bueno de las rutinas genericas es que aprendiendo como usarlas luego haces de todo con casi el mismo codigo, solo cambiando la forma en que las usas.
Hice una busqueda rapida y aqui sale algo de las rutinas, un poco resumido:
https://www.c64-wiki.com/index.php/Kernal
Aqui detalla un poco mas el uso de cada rutina:
http://sta.c64.org/cbm64krnfunc.html
En el caso especifico de la posicion del cursor (la rutina que usaste, CHROUT, que tiene el vector de entrada en $FFD2 en todos los modelos de Commodore, imprime en la posicion actual del cursor), se ajusta o se lee usando la rutina PLOT:
PLOT   $FFF0   65520   Set or retrieve cursor location
https://www.c64-wiki.com/index.php/PLOT
Lo que no recuerdo es que registro contiene la fila y cual la columna, en esos dos sitios dice exactamente lo contrario en cada uno, ese ultimo que puse dice que X contiene la fila e Y la columna, el otro dice lo contrario, y me parece mas logico, X: columna, Y: fila.
"$FFF0   PLOT. Save or restore cursor position.
Input: Carry: 0 = Restore from input, 1 = Save to output; X = Cursor column (if Carry = 0); Y = Cursor row (if Carry = 0).
Output: X = Cursor column (if Carry = 1); Y = Cursor row (if Carry = 1).
Used registers: X, Y.
Real address: $E50A."
Justo antes de llamar a PLOT necesitas ajustar el valor de CARRY, en eso coinciden los dos sitios, si CARRY=0, al llamar a la rutina lees la posicion actual del cursor, que se carga en X e Y, si CARRY=1, necesitas cargar X e Y previamente con columnas y filas validas, y al llamar a PLOT deberia cambiarse la posicion del cursor usado por CHROUT.
Estuve buscando y no los encontre escaneados, pero puede ser que esten en alguna parte, si los encuentras te recomiendo estos libros, no son muy extensos pero tienen buena informacion, solo tengo el ultimo, el primero debe ser mas interesante en tu caso porque trata de graficos y sonido. En este tema de retrocomputacion se hablo de estos libros: http://www.retrocomputacion.com/e107_plugins/forum/forum_viewtopic.php?34771
Fijate que trae una tabla (la segunda foto que aparece) donde se explica bien el uso de cada rutina de la ROM.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 01, 2015, 09:19:17
Es lo quiene no saber. Tienes un problema y lo solucionas como puedes, no como dereria ser.

Si yo os contara las peripecias que hacia con el monitor del FC3 y el desconocimiento... seguro que me excomulgabais  ;D

Me gusta la explicación, me la apunto para probar. Tengo ganas de volver a programar con mi pequeñajo.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 03, 2015, 10:05:34
  Atencion,...he visto esta rutina que  creo que puede darnos con la solucion de mostrar un texto en el punto de pantalla que queremos,...no la he probado pero pinta bien,...luego os cuento,..aqui la dejo para que la vayais echando un vistazo:

Código: [Seleccionar]
* = $1000 ; SYS 4096.
  LDX #$01 ; Carga X con #$01, que corresponde a la línea 1.
  LDY #$0A ; Carga el Y #$0A, que corresponde a la columna 10.
  JSR $E50C ; Salta a la subrutina en ROM $E50C, que sitúa el cursor en las coordenadas dadas en los valores de X e Y.
  LDA #<CADENA ; Carga A con el byte bajo de la posición donde empieza el texto.
  LDY #>CADENA ; Carga Y con el byte alto de la posición donde empieza el texto.
  JSR $AB1E ; Salta a la subrutina en ROM $AB1E, que imprime una cadena de caracteres.
  RTS ; Retorna al BASIC.
CADENA .TEXT "HOLA A TODOS!!!" ; Texto.
  .BYTE $00
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 03, 2015, 13:11:59
   Bueno, asunto solucionado,...he probado la rutina y va perfecta, ahora ya se colocar el texto donde yo quiero simplemente modificando estas dos lineas donde defino Fila y Columna...

     
Código: [Seleccionar]
        LDX #$01 ; Carga X con #$01, que corresponde a la línea 1.
  LDY #$0A ; Carga el Y #$0A, que corresponde a la columna 10.

   Ahora estoy en plan de reducir el listado como sea ya que se me habia ido a 33 Kb derrochando como un loco,...de hecho en un primer repaso he conseguido reducir el listado en 3 Kb (3000 Bytes, es es mucho en ensamblador),...haciendo simplemente esto que cuento....

  Utilizo muchos bucles para mostrar, dar, quitar, etc, etc colores, chars, lo que sea,...antes hacia un bucle para cada cosa situando el acumulador fuera del bucle que opera en ese momento,...asi:

   
Código: [Seleccionar]
;
        LDA #$A0          ; CARGA PRIMER CHAR DE ASFALTO SEGUNDO ANDEN
LDX #0 ; CARGA VALOR
BUCLE434          ; INICIO DE BUCLE
LDA #$A0         ; PRIMER CHAR DE ASFALTO SEGUNDO ANDEN
STA $590,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $5B8,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
INX
CPX #40 ; TOPE DE ESPACIO
BNE BUCLE434 ; SI NO ES IGUAL VUELVE A BUCLE

        CONTINUA.....

  Si incluyo el acumulador dentro del bucle antes de la posicion de memoria a la que actuara,...me encuentro que puedo meter muchos acumuladores y en un mismo bucle poner char, colores, lo que quiera, economizando rutinas completas de bucles (que antes hacia para cada cosa) por un tubo y la reduccion de bytes es tremenda...aqui como queda la misma rutina ampliandola para que haga mas cosas utilizando solo un bucle...

       
Código: [Seleccionar]
LDX #0 ; CARGA VALOR
BUCLE434 ; INICIO DE BUCLE
LDA #$A0 ; PRIMER CHAR DE ASFALTO SEGUNDO ANDEN
STA $590,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $5B8,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
LDA #$E8 ; PRIMER CHAR DE BORDILLO LEJANO
STA $5E0,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
LDA #$70 ; PRIMER CHAR PARED MURO FONDO ESTACION
STA $608,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $630,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $4F0,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $518,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $540,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $568,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
LDA #$C0 ; PRIMER CHAR SUELO DE RAILES
STA $658,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $6D0,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
LDA #$94 ; PRIMER CHAR RAILES TREN
STA $680,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $6A8,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $6F8,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
INX
CPX #40 ; TOPE DE ESPACIO
BNE BUCLE434 ; SI NO ES IGUAL VUELVE A BUCLE

        CONTINUA.....

  Como os conte yo para montar los textos hacia letra por letra en el acumulador y eso me gasta mogollo n de bytes,...fijaros que forma mas brusca de hacerlos por ejemplo para poner la palabra "final" a partir de la posicion $5EC...

     
Código: [Seleccionar]
        JSR FF ; F
STA $5EC ; VIDEO MEMORY
JSR II ; I
STA $5ED ; VIDEO MEMORY
JSR NN ; N
STA $5EE ; VIDEO MEMORY
JSR AA ; A
STA $5EF ; VIDEO MEMORY
JSR LL ; L
STA $5F0 ; VIDEO MEMORY

  JSR II, JSR AA, etc, etc, son subrutinas en las que se carga el valor del caracter),...pero como veis es tortuorio hacer un texto y su derroche,...el utilizar la rutina que hablabamos de poder un texto con una cadena de caracteres y en la posicion que uno quiera era muy importante para mi y un nuevo paso que tenia que mejorar y que creo que me puede suponer otros 3 Kb de ahorro, ya que os podeis imaginar el despelote de bytes que de esa forma consume los textos de un juego o en el momento que tenga muchos textos....

  Todo eso ahora lo soluciono y reduzco de un plumazo con la rutina que nos traia a cuentas...

   
Código: [Seleccionar]
        LDX #$01              ;CARGA LINEA EN X
  LDY #$0A              ; CARGA COLUMNA EN Y
  JSR $E50C
  LDA #<CADENA
  LDY #>CADENA
  JSR $AB1E
  CONTINUA...

CADENA .TEXT "HOLA A TODOS!!!"
  .BYTE $00

   Saludos
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 03, 2015, 16:30:35
$E50C seguramente es la misma rutina que puse al final, no mire el desensamblado de la ROM pero probablemente esta entrando directo saltandose la parte en que chequea el valor de CARRY para decidir si lees o ajustas la posicion del cursor, porque la entrada original es $E50A. La entrada correcta (para que sea compatible con todos los modelos de Commodore) seria $FFF0, pero como esta ROM no tiene una rutina para imprimir un cadena, y estas usando una del BASIC, no tiene mucho sentido mantener compatibilidad, ya que el BASIC difiere en los distintos modelos.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 03, 2015, 20:51:37
Me encanta este hilo.

Es la primera vez que veo competiciones entre hombres hechos y derechos sobre quién la tiene más corta pero funcional  (la rutina mal pensados).

Esto es lo que me gusta y lo que más me hacia/hace disfrutar, el aprender ensamblador y a usar la ROM para aprovechar los recursos de nuestros cacharrillos al máximo .

Estoy usando CBM prg Studio y me parece excelente y muy simple de usar. Puñaladas por usarlo a:
nostoy@gmail.com (http://nostoy@gmail.com).  ;D

Muchisimas gracias por colgar estas rutinas (por mi no pareis  ;) ).
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 03, 2015, 20:53:55
Qué bello es el ensamblador!
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 03, 2015, 21:11:18
Bello y elegante.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 04, 2015, 11:48:36
 me acabo de dar cuenta de una cosa,...en el set de char que estoy trabajando he cambiado de lugar las ultimas 5 letras del abecedario y la relacion de numeros,.....mal hecho!, tengo que restaurarlos a su posicion porque sino el ordenador me mostrara en pantalla caracteres distintos a los movidos..

 y encima a ver como organizo el set porque para mover esos char a su sitio voy a tener que liar una de la leche porque en el set ya no entra ni una mosca y encima muchos de los chars son corelativos,...

  Algo que aprendo y que no me vuelve a pasar.."Modifica el set de char se quieres pero no toques las posiciones de memoria deletras y los numeros"
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 04, 2015, 18:44:47
¿No habian 6 posiciones donde poder colocar los caracteres progamables?.

Muevelos a otra zona y cambia la dirección de memoria ¿53272?.
A no ser que tu programa ocupe toda la memoria del Commodore...  :o
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 04, 2015, 20:47:09
 Ya lo he solucionado, al final solo he tenido que restaurar las cinco ultimas letras del abecedario que no ha sido mucha movida, los numeros se quedan donde estan sin problemas...

 Proximamente me quiero liar con la colision de sprites y gestion de sprites por encima de la barrera de los 255 (ya se postrarlo pero quiero saber gestionar varios en movimiento superandola tanto en un sentido como en otro)

  Hablamos.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 17, 2015, 12:42:57
  Salgo del Claustro a ver si alguien me puede ayudar que me estoy volviendo loco con esto,..os cuento:

     En el proximo proyecto he empezado a mover Scrolls por primera vez, es verdad que lo hago de una forma sencilla y primitiva pero bueno,..estoy empezando con ésta tecnica,..ya los tengo construidos, mostrados y se mueven y todo va bien,..pero la tecnica que he usado me ha supuesto un despelote de bytes tremendo que pienso que tiene que haber alguna forma de economizar, por mas que prueblo bucles no doy con la solucion...

   El Scroll se forma por una cadena de 4 o 6 chars que se repite,...cuando llega al ultimo de la cadena el programa refresca la secuencia y vuelve al primero y el efecto queda bien, lo que hago es incrementar el valor (char) asignado en una posicion de memoria y muestra el siguiente, haciendo esto en cadena se mueven todos en toda la pantalla...

  Supongamos una linea de pantalla cualquiera de char de la pantalla, por ejemplo la que va desde la posicion $680 a la posicion $6A7,...primero creo un bucle que montara en cadenas de cuatro repitiendose y la linea queda completa....creo el otro bucle que hara que cuando se llega al char 4 vuelva al uno en todos los ciclos quedando asi (todo esto por ejemplo moviendonos hacia la derecha) supongamos que el primer char de la cadena tiene el valor $A0 y el ultimo char el valor $A3, con lo cual el "hierro" cuando detecta que ha llegado al char $A3 lo restaura al $A0 y el listado al final queda asi:

 
Código: [Seleccionar]
                LDA $680             ;LEE LA POSICION INICIAL
CMP #$A3            ; COMPRUEBA SI ES EL ULTIMO CHAR DE LA CADENA
BEQ JMPRUE2       ; SI ES ASI RESTAURA AL PRIMERA CHAR
JSR SCRODER3     ; AHORA MUEVE (CAMBIA/INCREMENTA) EL VALOR (CHAR) EN MEMORIA

JMPRUE2                              ; RESTAURA/REFRESCA LA CADENA DE CHAR
                LDA #$A0             ; CARGA PRIMER CHAR
                STA $680             ; APLICA EN LA PRIMERA POSICION DE MEMORIA EN PANTALLA
                LDA #$A1             ; CARGA SEGUNDO CHAR
                STA $681             ; APLICA EN LA SEGUNDA POSICION DE MEMORIA EN PANTALLA
                LDA #$A2             ; CARGA TERCER CHAR
                STA $682             ; APLICA EN LA TERCERA POSICION DE MEMORIA EN PANTALLA
                LDA #$A3             ; CARGA CUARTO CHAR
                STA $683            ; APLICA EN LA CUARTA POSICION DE MEMORIA EN PANTALLA
                                            ; REALMENTE ESTO ES UN BUCLE QUE MONTA CADENAS DE CUATRO CHARS
                                            ; EN TODA LA LINEA, PERO SOLO PONGO CUATRO PARA QUE SE VEA

SCRODER3
                INC $680
INC $681
INC $682
INC $683
INC $684
INC $685
INC $686
INC $687
INC $688
INC $689
INC $68A
INC $68B
INC $68C
INC $68D
INC $68E
INC $68F
INC $690
INC $691
INC $692
INC $693
INC $694
INC $695
INC $696
INC $697
INC $698
INC $699
INC $69A
INC $69B
INC $69C
INC $69D
INC $69E
INC $69F
INC $6A0
INC $6A1
INC $6A2
INC $6A3
INC $6A4
INC $6A5
INC $6A6
INC $6A7
RTS


    Como podreis apreciar la rutina contenida en SCRODER3 me supone un despilfarro de bytes del copon, pues esto sumarselo a la mayoria de las lineas de pantalla y encima no solo hacia a la derecha con la instruccion INC,...sino también hacia la izquierda cuando lo hago con el DEC,.....vamos,...Barra libre de bytes para todos, que invito yo!!

   A ver si alguien me puede ayudar a encontrar la forma de economizar todo esto porque seguro que la hay, lo que pasa es que no se...gracias..

   
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 17, 2015, 12:56:40
 Otra cuestion que voy tirando para que la vayais analizando,...supongamos que tengo un sprite #0 en el centro de la pantalla (independientemente de la coordenada Y) y luego tengo otro sprite #1 (el 1 por ejemplo) a la izquierda del central y tengo otro sprite #2 (que puede ser el 2) a la derecha del central a unos cuantos puntos de coordenada alejados del central...

 Lo que quiero hacer es que cuando el ordenador lea la posicion X de los sprites #1 y #2 el ordenador sepa/reconozca si el sprite que chequea se encuentra a la izquierda o a la derecha del central,...no lo he probado pero asi a bote pronto quizas se me ocurre esta rutina.

   SP0X     ; VALOR DE COORDENADA X EN SPRITE #0
   SP1X     ; VALOR DE COORDENADA X EN SPRITE #1
   SP2X     ; VALOR DE COORDENADA X EN SPRITE #2

                ; POR EJEMPLO CON EL SPRITE #1

   LDA SP1X             ; CARGA VALOR DE COORDENADA DE SPRITE #1
   CMP #<SP0X       ; CHEQUEA SI EL VALOR DE X EN SPRITE #1 ES MENOR QUE EL VALOR
                               ; DEL SPRITE #0
   BEQ  HACE           ; SI ES ASI HARÁ LO QUE YO QUIERO
   RTS

HACE
    ; AQUI RUTINA QUE HACE LO QUE YO QUIERA QUE ES DESPLAZARLO HACIA LA IZQUIERDA O LA
    ; DERECHA SEGUN POSICION DE JOY, PERO BUENO, ESE ES OTRO TEMA.

   Ya os digo que todo esto esta sin probar, el secreto tiene que estar en la linea...

   CMP #<SP0X       ; CHEQUEA SI EL VALOR DE X EN SPRITE #1 ES MENOR QUE EL VALOR

   ya os contare, aunque si sabeis algo o esta mal hecha me viene bien cualquier ayuda

    Como siempre, mil gracias, me vuelvo al claustro y ....

    AL HIERRO!!

   (Jose, a ver si para el 2020 tienes un huequito (en vez de cambiar respuestas innecesariamente de hilos en las que concuerdan) y me haces el favor de lo del grafico de Los Premios, gracias.)



   
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 17, 2015, 13:37:50
     En el proximo proyecto he empezado a mover Scrolls por primera vez, es verdad que lo hago de una forma sencilla y primitiva pero bueno,..estoy empezando con ésta tecnica,..ya los tengo construidos, mostrados y se mueven y todo va bien,..pero la tecnica que he usado me ha supuesto un despelote de bytes tremendo que pienso que tiene que haber alguna forma de economizar, por mas que prueblo bucles no doy con la solucion...
No me puse a analizar demasiado el codigo pero interpreto que estas experimentando con scroll por hard, y que cada 8 puntos, o 4 o lo que convenga, haces scroll de caracteres, o que directamente lo haces de a caracter, es decir 8 puntos (o 4 en multicolor) a la vez.
No se si se puede compactar mucho el codigo, pero me parece limitado, porque no tienes libertad para imprimir lo que quieras, al usar INC o DEC necesitas tener la definicion de los caracteres contiguos en memoria. Lo ideal seria que pudieras imprimir la linea que fuera con cualquier combinacion de caracteres y tener una rutina generica para hacer scroll.
Simplificando un poco la cosa, si tuvieras una linea de 5 caracteres y sus posiciones de memoria fueran A, B, C, D y E, imprimirias la linea de 5 caracteres con lo que se te ocurra, y luego en cada paso del scroll harias:

Leer A y guardarlo en una "variable" X
Leer B y escribirlo en A
Leer C y escribirlo en B
Leer D y escribirlo en C
Leer E y escribirlo en D
Leer X y escribirlo en E

Eso se podria generalizar para cualquier linea usando algun puntero o indice, primero se guardaria el contenido de la posicion actual de memoria, que deberia ser el primer caracter de la linea, luego se haria un bucle que repitiera N-1 veces (N es el ancho de la pantalla en caracteres) el proceso de leer la siguiente direccion de memoria y guardarla en la actual, para luego incrementar el indice apuntando al siguiente caracter. Por ultimo, habria que volver e leer el primer caracter guardado, y colocarlo en la direccion de memoria actual, que a esta altura deberia ser el caracter mas a la derecha de la linea. A esa rutina solo tendrias que darle como parametro la direccion inicial de la linea, y cargar el indice, por ejemplo el registro X, a 0. Tambien deberias reservarle un byte de memoria para guardar temporalmente el primer caracter.
La misma rutina despues se puede usar para el scroll por pixel, pero en ese caso deberias trabajar en 38 columnas, para eliminar el parpadeo en los bordes.
   
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 17, 2015, 13:49:33
Lo que quiero hacer es que cuando el ordenador lea la posicion X de los sprites #1 y #2 el ordenador sepa/reconozca si el sprite que chequea se encuentra a la izquierda o a la derecha del central,...
En ensamblador las comparaciones hacen una resta entre dos parametros, creo que en 6502 era A y el parametro que se especifique, una direccion o una constante, no recuerdo ahora cual es el orden de la resta, pero uno determina cual es mayor chequeando las banderas de cero, carry, y negativo, lo que determina si son iguales o uno es mayor que el otro.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 17, 2015, 15:39:42
No me puse a analizar demasiado el codigo pero interpreto que estas experimentando con scroll por hard, y que cada 8 puntos, o 4 o lo que convenga, haces scroll de caracteres, o que directamente lo haces de a caracter, es decir 8 puntos (o 4 en multicolor) a la vez.

   Asi es Pastbytes,...no lo has podido decir mejor...

No se si se puede compactar mucho el codigo, pero me parece limitado, porque no tienes libertad para imprimir lo que quieras, al usar INC o DEC

   Me he dado cuenta de esto y tambien lo veo así,..mi mente no solo procesa rutinas cuando programo,..sino cuando trabajo, cocino, etc (y ya no se si cuando duermo) y dentro de mi humilde experiencia y conocimientos no le veo mucha salida de ahorrro de bytes con ésta tecnica.

necesitas tener la definicion de los caracteres contiguos en memoria. Lo ideal seria que pudieras imprimir la linea que fuera con cualquier combinacion de caracteres y tener una rutina generica para hacer scroll.
Simplificando un poco la cosa, si tuvieras una linea de 5 caracteres y sus posiciones de memoria fueran A, B, C, D y E, imprimirias la linea de 5 caracteres con lo que se te ocurra, y luego en cada paso del scroll harias:

Leer A y guardarlo en una "variable" X
Leer B y escribirlo en A
Leer C y escribirlo en B
Leer D y escribirlo en C
Leer E y escribirlo en D
Leer X y escribirlo en E


  Tengo que reconocer que esto es muy interesante y me da luz para futuras tecnicas,..segun lo que me cuentas lo que haces es cambiar el valor de un char a otro char,..yo lo que he estado haciendo es cambiar en un mismo char el valor....es otra forma de tantas que nos ofrece el idioma universal que es el ensamblador (una misma cosa se puede hacer de 1000 formas distintas)

  En cualquier caso te agradezco mucho la ayuda (eso es lo importante) y no como otro/s....

 O.T: (Dirigido a los nuevos usuarios Argentinos y a los de la Espena (perdon Escena) Espáñola)... Yo no soy mas que un "simple" Carnicero, que disfrutó lo indisfrutable en su epoca con las Arcades en los recreativos y con el Commodore luego en Casa,...os podeis imaginar lo que me ha costado y me esta costando avanzar en Programacion en ensamblador, que yo de informatica no se ni papa,..de hecho no se ni como en tan poco tiempo humildemente he podido avanzar tanto: MKII, Impire, Robot Nation, Laberinto, Xain y lo proximo...debe de ser el corazon que le lpongo a esto...

  Lo que me toca la polla (y no pienso consentir, aviso)  y sinceramente ya uno se cansa es de tanto superprogramador tipo Siliceb_it o Madon _na que luego te dejan tirado (de boca todo mucho) o tipo Sand_ro que rechaza una solicitud de ayuda por privado y que te remite a este hilo y que al final ni privado ni hilo,...no hay nada!!! y luego encima vuelven con el rabo entre las piernas defraudados por la Mojoneria twinera y sus colaboradores, que ya lo avise yo que era un camino equivocado (que por mi se puede ir a la tumba con sus secretos en programacion),...por no hablar ya de Mamandurrios tipo confundadores del foro (y ya sabeis de quien hablo) que buscan la anelada tranquilidad del principio del foro y que criticaban la incorporacion de nuevos usuarios en el foro (como mi querido amigo...apuntate a reichi que te has equivocado de sitio o mejor dicho los tiempos han cambiado) o por no hablar de los muertos que se dedican todo el dia perdiendo el dia en foros y blogs abanderandose el nombre de Commodore como si fuera suyo...por no hablar de los gurus del foro en programacion que llevo 5 años en el foro y todavia estoy esperando un minimo proyecto (otros que tal bailan)...

  La Escena Española es la "EsPena" Española,...que luego ni hacen caso a cualquier proyecto que se presenta aqui (y no hablo por mi y no digo nombres de autores porque de esto ya se va dando cuenta la peña nueva desarrolladora) pero esoi sí que luego "abrazan la farola" a la escena internacional (tampoco digo nombres) y que por si fuera poco, cuando a uno (con sus humildes conocimientos pero impresionante corazon) le cruzifican en CSDb no tiene ni los minimos peles de salir a defender el Desarrollo actual en España,......son unos mamandurrios y abrazafarolas!!!

   Sinceramente.....YA ESTA BIEN!!!

  Tenemos que reinventar todo esto o vamos de culo,...no van a quedar al final mas que cuatro frikis blogeros y foreros y esto se acabara el dia que mueran...

  Eso si,...bienvenida toda la Savia nueva que ha venido desde Argentina (que yo adoro) y todos los nuevos usuarios que le dan nueva vida a la escena en lengua Castellana ( no como mi "colega" que salta criticando tanto nuevo usuario,..manda cojones con lo que ha costado levantar esto),..porque lo que es aqui en España es vergonzoso!!

   He dicho......

   Volvamos a lo que nos ocupa que es el Ensamblador y el Commodore en el Siglo XXI!,..pero nada de paja por favor,..solo gente de verdad!!

   Ya veo que la he liado,.pero bueno, me da igual,..perdidos al rio!!,..ja,j,aj,aja,aj

   
   



 
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 17, 2015, 15:49:46
  Buff!!,...volviendo a leer la respuesta lo siento por la Espena Española,..pero veo que mi colega en vez de 200 veces os va a mandar que escribaís 5000 veces en la Pizarra..."Raul es Polemico"...(la madre que me pario),..aj,aj,aj,aj,ajja
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 18, 2015, 00:00:09
 Bueno, vamos a comenzar la danza,....hay dos cosas que tengo que manejar si o si, es la gestion de sprites por encima de 255 y gestion de colision de sprites,..vamos con la primera:

  En esta respuesta os adjunto dos archivos, uno es un ejecutable en el Vice del Programa y otro es el listado en .asm para que lo veais y podais modificar si quereis en vuestro editor de texto (yo utilizo Notepad++)

  He creado un mini listado/programa que muestra tres sprites en pantalla,..podremos controlar el Sprite Flecha con nuestro Joystick de izquierda a derecha, vereis que cambia el grafico de la flecha segun la direccion...

  con este ejercicio voy a intentar dominar minimamente la gestion de varios sprites en movimiento por encima y debajo de la barrera de los 255,....ahora mismo esta preliminar y mañana empezamos a experimentar....id cargando el programa en el Vice y viendo el listado y nos ponemos con ello...os adjunto los dos archivos en la respuesta.

  Como veis ya se mostrarlo y cambiarlo de la barrera de 255, me falta practicar la gestion en movimiento,..ahora estoy cansado y lo dejo,..mañana seguimos.

   chao
Título: Re:Dudas en Ensamblador
Publicado por: Jeff en Julio 18, 2015, 00:51:36
R Tape Loading error
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 18, 2015, 00:53:56
  Atencion al archivo Texto.asm que adjunto en la respuesta anterior porque puece venir muy  bien como Matriz a gente que no sepa nada de ensamblador y quiera iniciarse en dicho mundo,...solo tiene que abrir dicho archivo y simplemente modificando el listado podra hacer sus primeros pinitos, encima el listado contiene y muestra lo siguiente:

- Inicio de Programa y configuracion a Codigo Maquina
- Carga de Set de Chars
- Carga de Set de Sprites
- Gestion de rutina de Joystick
- Configuracion y muestra de Sprites en pantalla
- Carga de Set de Constantes basicas y standars internacionales de posiciones de memoria necesarias para luego utilizar en nuestros listados

 Luego ya esta en nosotros cambiar el Set de Sprites con Spritepad o el Set de Chars con Charpad (yo utilizo Cuneiform (recomendado por Lobo Gris y que es la leche)) y modificarlos a nuestro gusto o incluirles nuestras creaciones graficas..

 Osea que lo dicho,..la gente que no sepa pero que algun dia quiera dar el salto al ensamblador que se guarde este listado como oro en paño porque ahora que lo pienso les puede ser una herramienta muy buena y sencilla para iniciarse...
   
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 18, 2015, 00:57:06
Cuando superas la barrera 255, hay algún momento en que aparezcan por el otro extremo?

  No, no saldra por el otro lado,...se dara con el tipico tope tanto a derecha como izquierda en la pantalla,..que se ejecuta llamando a la subrutina que lo aplica y ejecuta,..buena pregunta!, con esto contesto a la segunda observacion,...los limites deben de ser configurados para que el personaje siempre sea visible....

Título: Re:Dudas en Ensamblador
Publicado por: Jeff en Julio 18, 2015, 01:08:43
R Tape Loading error
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 18, 2015, 01:19:07
   Me ha faltado mandaros los Set de Chars, Sprites y Constantes para que los veais y los modifiqueis si quereis,..es interesante ver el archivo Constantes (yo lo veo con el notepad) para familiarizarse con el Standar internacional basico de posiciones de memoria....vereis que dichas constantes son las que encontrareis en cualquier libro de programacion de commodore,..no es un archivo hecho por mi sino un estandar que hay en la red,...imprimido es parte de los papeles que tengo chincheteados en la pared como consulta rapida...

  Recordad (dicho mas que nada para la gente que se inicia en ensamblador que todo debe de estar en la misma carpeta junto con el Compilador) a la hora de ensamblarlo desde el Simbolo del Sistema.

 Os adjunto los archivos en ésta respuesta...

   Chao
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 18, 2015, 01:24:01
Otra cosa, que no tiene que ver con sprites. Yo he perdido la costumbre de los diagramas de flujo. Los que tenemos el asm oxidado miramos los listados con cara de búho sin entender nada.
Tengo un día que agarrar algún listado y hacer su diagrama y viceversa para entrenar


  Me ha llamado la atención esto en relacion a los diagramas de flujo,...se lo que son...

     pero no los utilizo!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 18, 2015, 01:36:56
  Ahora que lo pienso si todos los Desarrolladores o gente que se Inicia se basara en el estandar que he adjuntado de constantes que es el internacional y el que vereis en cualquier libro de programacion en ensamblador para commodore todos nos entenderiamos mejor y avanzariamos mucho mas rapido,...porque si cada uno le pone su nombre particular a las posiciones de memoria basicas operativas esto es una torre de babel!!

  Asi que todos a familiarizarse con dicho listado,...yo antes de sabermelo ya de memoria de tantas horas y horas lo que hacia era no llamarlo con un .include sino que lo copiaba y pegaba al principio del programa y asi lo podia consultar en cualquier momento,...(es un truco al principio).

  vuevlo a adjuntar el archivo en cuestion para comodidad de la gente que lo quiera tener a mano sin necesidad de remontar respuestas..

  Chao
 
 
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 18, 2015, 01:50:07
Si no te quieres complicar la vida con las coordenadas, y puedes sacrificar un poco de suavidad en el movimiento, podrias usar en los sprites coordenadas de pixel doble, ya que por lo general los juegos suelen usar el modo multicolor de 160 puntos.
Lo que tendrias que hacer es guardar las coordenadas X de cada sprite en una posicion de memoria, y periodicamente actualizar eso en los registros del VIC, previamente multiplicando por 2 estas coordenadas. Para esto, usas la instruccion ASL, que corre a la izquierda los bits del parametro, en este caso la "variable" donde guardas la coordenada X del sprite. Esta instruccion, a diferencia de ROL, coloca automaticamente un 0 en el bit 0 (ROL coloca ahi el valor de carry), y el bit 7 que se pierde se copia a carry, por lo que despues deberias colocar el valor de carry en el bit mas significativo de la coordenada X en el registro correspondiente del VIC para ese sprite.
De esta manera al mover el sprite incrementarias 1 pixel, pero al actualizar a traves de esa rutina se incrementarian 2, internamente tu manejarias coordenadas de 0 a 159, pero en la pantalla manejarias de 0 a 319, avanzando de a 2 puntos.
Solo tendrias que tener en cuenta que para leer las coordenadas X desde el VIC deberias dividir por 2 si quieres obtenerlas tambien en un rango de 0 a 159, esto lo harias con la instruccion ROR, que rota el parametro hacia la derecha, colocando en el bit 7 el valor de carry, y el bit 0 perdido en carry, por lo que primero deberias leer el bit mas significativo de la coordenada X de ese sprite desde el VIC, y colocar este valor en carry, luego usar ROR con el registro de coordenada X de ese sprite (para dividirlo por 2 incorporando carry en el bit 7), y en carry te quedaria el bit 0 que ya no te importa.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 18, 2015, 01:57:29
 Copio y pego el listado para que sea visible de un plumazo...
Código: [Seleccionar]
[code]
; ****************************************************
;    EJERCICIO GESTION DE SPRITES EN TODA LA PANTALLA
; ****************************************************

.INCLUDE "CONSTANTES.ASM"
*=$0801 ; INICIA PROGRAMA EN ESA POSICION
.WORD NEXT,1                  ; CREA LINEA EN BASIC E INICIA CODIGO MAQUINA
.NULL $9E,^START           ; "SYS START" (START=INIT M.C.)
NEXT .WORD 0 ; FIN BASIC
; LOAD SPRITES                ; CARGA SPRITES
*=$2000 ; CARGA SPRITES POSICION 49152 BANK0
.BINARY SPRITES.BIN
FRAMES .BYTE 0 ; VIDEO FRAMES COUNTER
FRAMES2 .BYTE 0 ; VIDEO FRAMES COUNTER
*=FONTS_END ; CARGA PAQUETE DE FUENTES POSICION AL FINAL DE PROGRAMA
; START
START ; HABILITA INTERRUPCIONES (SEI, DESABILITA)

VICCHIP
LDA VMCSB ; VIC-II CHIP MEMORY CONTROL REGISTER
AND #$F1
ORA #$0A
STA VMCSB ; VIC-II CHIP MEMORY CONTROL REGISTER

; COLOR NEGRO A PANTALLA Y BORDE
LDA #$00 ; NEGRO
STA EXTCOL ; BORDER COLOR
LDA #$00 ; GRIS MEDIO
STA BGCOL0 ; BACKGROUND COLOR 0

; RUTINA QUE LIMPIA PANTALLA
LDX #0                 ; CARGA VALOR
LDA #$00       ; SIMBOLO ESPACIO SEGUN EL SET DE CHAR CARGADO Y MODIFICADO
BUCLE1                       ; INICIO DE BUCLE
STA $0400,X                  ; APLICA A POSICION DE COLOR MAS ESPACIO
STA $04FF,X                  ; APLICA A POSICION DE COLOR MAS ESPACIO
STA $05FE,X                  ; APLICA A POSICION DE COLOR MAS ESPACIO
STA $06FD,X                  ; APLICA A POSICION DE COLOR MAS ESPACIO
INX                            ; INCREMENTA ESPACIO
CPX #25                 ; TOPE DE ESPACIO
BNE BUCLE1                 ; SI NO ES IGUAL VUELVE A BUCLE

; ACTIVA MODO MULTICOLOR EN TODOS LOS SPRITES
LDA #$FF ; CARGA MAXIMO VALOR
STA SPMC ; SPRITE MULTICOLOR REGISTERS

; PREPARA PARAMETROS SPRITES 1,2 Y 3 Y MUESTRA EN PANTALLA
; PUNTEROS DE GRAFICO
LDA #$80 ; BLOQUE GRAFICO
STA POINSP0 ; PUNTERO SPRITE #0
LDA #$81 ; BLOQUE GRAFICO
STA POINSP1 ; PUNTERO SPRITE #1
LDA #$82 ; BLOQUE GRAFICO
STA POINSP2 ; PUNTERO SPRITE #0
; COORDENADAS SPRITES 0 Y 1
LDA #150 ; CARGA VALOR 50 COORDENADAS DE XAIN
STA SP0X ; APLICA A X SPRITE 0
LDA #80 ; CARGA VALOR 50 COORDENADAS DE XAIN
STA SP1X ; APLICA A X SPRITE 0
LDA #200 ; CARGA VALOR 50 COORDENADAS DE XAIN
STA SP0Y ; APLICA A Y SPRITE 0
STA SP1Y ; APLICA A Y SPRITE 0
STA SP2Y ; APLICA A Y SPRITE 0
; COORDENADAS SPRITE 2
LDA $D010
ORA #%00000100                 ; CARGA VALOR SPRITE 2 ENCENDIDO
STA $D010 ; APLICA A $D010, POR ENCIMA DE 255

LDA #30 ; CARGA VALOR 50 COORDENADAS DE XAIN
; ATENCION PORQUE SOLO ES 30 YA QUE SE MOSTRARA POR ENCIMA
; DE LA BARRERA DE 255 COMO SE VE MAS ADELANTE
STA SP2X ; APLICA A Y SPRITE 0
; COLOR DE SPRITES
LDA #$01 ; COLOR BLANCO
STA SP0COL ; APLICA A COLOR SPRITE 0
STA SP1COL ; APLICA A COLOR SPRITE 0
STA SP2COL ; APLICA A COLOR SPRITE 0

;ACTIVA TODOS LOS SPRITES
LDA #$FF ; CARGA MAXIMO VALOR Y ACTIVARA TODOS LOS SPRITES
STA SPENA ; APLICA A LA POSICION DE MEMORIA $DO15 QUE LO ACOMETE

; COMIENZA RUTINA QUE GESTIONA JOYSTICK EN PUERTO 2 Y QUE NOS PERMITIRA
; GESTIONAR EL MOVIMIENTO DEL SPRITE 0 QUE SERA EL NUESTRO
MENUJOY

DERECHA
LDA CIAPRA ; CARGA POSICION DE JOY EN PUERTO 2
AND #8 ; COMPARA CON EL BIT QUE CONTROLA DERECHA
BNE IZQUIERDA ; SI NO SE HA PULSADO MANDA A IZQUIERDA
LDA #$80 ; BLOQUE GRAFICO FLECHA A LA DERECHA
STA POINSP0 ; PUNTERO SPRITE #0
INC SP0X ; SI SE HA PULSADO MUEVE EN UN PUNTO EL SPRITE 0 A LA DERECHA
JSR RETARDO ; RUTINA QUE CONTIENE BUCLE QUE CREA RETARDO DE TIEMPO

IZQUIERDA
LDA CIAPRA ; CARGA POSICION DE JOY EN PUERTO 2
AND #4 ; COMPARA CON EL BIT QUE CONTROLA IZQUIERDA
BNE FINAL ; SI NO SE A PULSADO MANDA A ARRIBA
LDA #$83 ; BLOQUE GRAFICO FLECHA A LA IZQUIERDA
STA POINSP0 ; PUNTERO SPRITE #0
DEC SP0X ; SI SE HA PULSADO MUEVE EN UN PUNTO EL SPRITE 0 A LA IZQUIERDA
JSR RETARDO ; RUTINA QUE CONTIENE BUCLE QUE CREA RETARDO DE TIEMPO

FINAL
JMP MENUJOY ; RETORNA AL INICIO DE BUCLE QUE GESTIONA JOYSTICIK

RETARDO
LDX #$FF
CICL ; PRIMER BUCLE
DEX
BNE CICL
LDX #$FF
CICL2 ; SEGUNDO BUCLE
DEX
BNE CICL2
CICL3 ; SEGUNDO BUCLE
DEX
BNE CICL3
RTS


; DATA: FUENTES LETRAS
*=$4000
CHARS
.BINARY "FONTS.BIN" ; BANCO DE CARACTERES
FONTS_END
[/code]
Título: Re:Dudas en Ensamblador
Publicado por: Jeff en Julio 18, 2015, 11:21:49
R Tape Loading error
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 18, 2015, 11:44:44
   GESTION DE SPRITE A LO LARGO DE TODA LA PANTALLA

 Bueno, ya está hecho y esto funciona perfecto,...ahora el sprite de la flecha (el #0 que controlamos con el Joystick) recorre toda la pantalla a sus anchas a nuestro gusto, voy a explicar como sencillamente lo he hecho para que la gente que se inicia lo sepa hacer sin problemas...

  En el listado concretamente en la rutina que gestiona los parametros Derecha e Izquierda de Joystick justo antes de incrementar o decrementar la coordenada X del sprite #0 llamo a una rutina (con el tipico JSR) que sera la que gestione que el sprite #0 este por encima o por debajo de la barrera de los 255,
,...si la rutina de Joy tuviera tambien las posiciones Arriba y Abajo no habria hecho falta incluirla antes de incrementar o decrementar el valor de Y ya que el tema de la superacion de la barrera de 255 solo aplica a la coordenada X,....dicha rutina la he llamado CHECXSP0 (chequea X en Sprite 0) y ha sido incluida en la rutina de Joy a derecha e izquierda de esta forma:

Código: [Seleccionar]
MENUJOY

DERECHA
LDA CIAPRA ; CARGA POSICION DE JOY EN PUERTO 2
AND #8 ; COMPARA CON EL BIT QUE CONTROLA DERECHA
BNE IZQUIERDA ; SI NO SE HA PULSADO MANDA A IZQUIERDA
LDA #$80 ; BLOQUE GRAFICO FLECHA A LA DERECHA
STA POINSP0 ; PUNTERO SPRITE #0
JSR CHECXSP0 ; RUTINA QUE GESTIONA SUPERACION 255 EN SPRITE #0
INC SP0X ; SI SE HA PULSADO MUEVE EN UN PUNTO EL SPRITE 0 A LA DERECHA
JSR RETARDO ; RUTINA QUE CONTIENE BUCLE QUE CREA RETARDO DE TIEMPO

IZQUIERDA
LDA CIAPRA ; CARGA POSICION DE JOY EN PUERTO 2
AND #4 ; COMPARA CON EL BIT QUE CONTROLA IZQUIERDA
BNE FINAL ; SI NO SE A PULSADO MANDA A FINAL Y VUELVE AL BUCLE
LDA #$83 ; BLOQUE GRAFICO FLECHA A LA IZQUIERDA
STA POINSP0 ; PUNTERO SPRITE #0
JSR CHECXSP0 ; RUTINA QUE GESTIONA SUPERACION 255 EN SPRITE #0
DEC SP0X ; SI SE HA PULSADO MUEVE EN UN PUNTO EL SPRITE 0 A LA IZQUIERDA
JSR RETARDO ; RUTINA QUE CONTIENE BUCLE QUE CREA RETARDO DE TIEMPO

FINAL
JMP MENUJOY ; RETORNA AL INICIO DE BUCLE QUE GESTIONA JOYSTICIK

   Creo que se aprecia claramente la inclusion de JSR CHECXSP0 en la rutina de Joy, pero vamos a ver ahora mas detenidamente que hace dicha rutina...antes de nada es importante explicar para la gente que se inicia el conocer las Logicas que nos ofrece el ordenador y que seran muy importantes conocer para utilizar la que sea segun lo que queramos hacer,...las pongo aqui para que se vayan familizarizando:

AND 1-1 >1   "AMBOS"
        1-0 >0
        0-1 >0
        0-0 >0

OR  1-1 > 1  " UNO O AMBOS"
       1-0 > 1
       0-1 > 1
       0-0 > 0

EOR 1-1 > 0  "UNO U OTRO PERO NO AMBOS"
       1-0 > 1
        0-1 > 1
        0-0 > 0

  Estas logicas lo que siempre hacen es comparar dos bits segun esten encendidos (valor1) o apagados (valor 0) y simplemente dependiendo de la Logica que utlicemos obtendremos un resultados u otro, si analizamos las logicas veremos que es muy sencillo entenderlas y en consecuencia utilizarlas,...explicado esto vamos a ver que hacia la rutina CHECXSP0....

Código: [Seleccionar]
CHECXSP0 ; RUTINA QUE GESTIONA SUPERACION 255 EN SPRITE #0
LDA SP0X ; CARGA EL VALOR DE X DE SPRITE #0 POSICION $D000
CMP #$FF ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION 255
BEQ ENCIMA ; SI ES 255 MANDA A SUBRUTINA ENCIMA
CMP #$00 ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION 0
BEQ DEBAJO ; SI ES 0 MANDA A SUBRUTINA DEBAJO

RTS ; RETORNA A LA RUTINA DE JOY E INCREMENTARA O DECREMENTARA
; X SEGUN EL PUNTO DONDE RETORNE EN MAINJOY, MENU JOYSTICK

  Que como veis es sencillisima,...simplemente cargara el valor de la coordenada X (SP0X...$D000) y chequeara si ha llegado al valor 255 (entonces tiene que superar la barrera de los 255 y moverse por encima de ella) o si es 0 (entonces no tiene que superar la barrera de los 255 y quedará por debajo de ella),....segun tenga un valor u otro, el programa lo mandara o otra subrutina que verdaderamente gestionara el salto a un lado u otro de la barrera....supongamos que ha llegado a 255 entonces se le manda a la subrutina ENCIMA  (por encima de la barrera) dicha rutina tiene este sencillo listado:

Código: [Seleccionar]
ENCIMA
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
ORA #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
LDA #00 ; CARGA VALOR CERO PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; ENCIMA DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 255 POR ENCIMA DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
RTS


   Lo primero que hace es cargar el valor de MSIGX (posicion $D010, que es la que activa desactiva la superacion o no de la barrera, en dicha posicion cada bit (de los 8 que tiene) controlará un sprites, recordad que la cuenta de sprites #0, #1, #3, etc, etc,....en el byte que estamos usando se hara de derecha a izquierda,..es decir con el bit de la derecha del todo controlaremos el sprite #0

      LDA MSIGX         ; CARGA POSICION $D010 QUE GESTION LA SUPERACION

  supongamos que el sprite se encuentra por debajo de la barrera de los 255, con lo cual el valor en MSIGX es el siguiente: #%00000000,...el valor de la derecha del todo es 0, luego nuestro sprite no supera la barrera,....ahora queremos que la supere para ello tendremos que encender el bit correspondiente, con lo que quedaria asi: #%00000001,...pero claro queremos actuar solo sobre ese bit y ese sprite,..aqui es donde viene la utilizacion de las Logicas, en este caso la que mejor nos va es ORA y hacemos la comparacion (la hace la rutina en esta linea)...

  ORA #%00000001      ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA

 Voy a explicar mas detenido que es lo que hace la logica,..compara los valores de MSIGX con otro valor para que salga el resultado que nosotros queremos,..aqui la comparacion:

    VALORES CONTENIDOS EN MSIGX      00000000     (esto es aleatorio ya que pueden ser cualquiera)
    VALORES QUE ASIGNAMOS A ORA      00000001     (activamos bit para gracias a ORA obtener resultado)
    RESULTADO FINAL DE COMPARAR       00000001    (siempre quedara por encima de la barrera de 255)

  Ahora nuestro Sprite ya esta por encima de la barrera de 255,...ahora solo nos queda ajustar una cosa,...al superar el sprite la barrera de los 255, resulta que el valor 255 de la coordenada X no aplica ya que al moverse por encima de la barrera con dicho el sprite no aparece en pantalla,..lo unico que tenemos que hacer cuando superamos la barrera es aplicarle el valor 0 a la coordenada X ya que ahora esta por encima y asi es contiguo su paso de un lado a otro cuando la supera, eso se hace en estas lineas finales....

   
Código: [Seleccionar]
LDA #00 ; CARGA VALOR CERO PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; ENCIMA DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 255 POR ENCIMA DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA

  Ahora vamos a ver que hace la segunda parte de la rutina,..cuando desde CHECXSP0 se le mandaba a la subrutina DEBAJO,...dicha subrutina gestionara que el Sprite #0 que en ese momento se encuentra por encima de la barrera de 255 haga lo contrario que antes, es decir, que se situe por debajo de dicha barrera,...aqui teneis la rutina que es muy parecida a la anterior cuando hacia que la superase

Código: [Seleccionar]
DEBAJO
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
EOR #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
LDA #255 ; CARGA VALOR 255 PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; DEBAJO DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 0 POR DEBAJO DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
RTS

  Solo hay dos cosas reseñable y explicables en dicha rutina,...lo primero que ahora el valor de X del sprite #0 que carga es 0 y eso lo hacia en CHECXSP0 en estas lineas...

Código: [Seleccionar]
CMP #$00 ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION o
BEQ DEBAJO ; SI ES 0 MANDA A SUBRUTINA NOSUPERA

,..¿y porque 0?,...bueno os cuento, en realidad como el sprite llevara un TOPE de pantalla por el lado izquierdo que sera en la coordenada 30 de X,..esto hara que el sprite nunca llegue al valor 0 cuando este por debajo de la barrera y en su lado mas proximo a la izquierda de la pantalla,..como mucho descenderá al valor 30,..esto es como una especie de trampita, ya que hara que nos indique que SOLO cuando el sprite ha llegado al valor 0 se encuentra por encima de la barrera, con lo cual ya sabemos que hacer,..el reconocimiento de coordenada lo hace como veis en las primera lineas en CHECXSP0 si es 0 mandara a DEBAJO

  Y atencion porque aqui viene el kit de la cuestion,..antes utlizamos la Logica ORA,..pero ahora lo que queremos es que el bit que controla nuestro sprites, este donde este, tras la comparacion nos de como resultado 0 para que de esa forma se ponga por debajo de la barrera,...es por eso que utilizaremos EOR (comparacion "uno u otro pero no ambos",..supongamos que el sprite esta por encima de la barrera y su valor en MSIGX en su bit correspondiente es 1 (encendido),.para hacer que sea 0 utilizaremos EOR con el siguiente valor y haremos la comparacion

 ALORES CONTENIDOS EN MSIGX      00000001    (esto es aleatorio ya que pueden ser cualquiera)
VALORES QUE ASIGNAMOS A EOR      00000001     (activamos bit para gracias a EOR obtener resultado)RESULTADO FINAL DE COMPARAR       00000000   (siempre quedara por debajo de la barrera de 255)

 en la rutina esto se hace asi:

Código: [Seleccionar]
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
EOR #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION

  Ahora solo nos queda calibrar el valor de X en el sprite para que el salto de un lado a otro de la barrera sea suave,...antes metiamos el valor 0,..ahora metemos el valor 255 que es mas proximo al limite de la barrera una vez superada,..lo hace aqui.

Código: [Seleccionar]
LDA #00 ; CARGA VALOR CERO PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; ENCIMA DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 255 POR ENCIMA DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA


  Y....YA ESTA!!!,...nuestro sprite se pone por encima o por debajo de la barrera de los 255 a nuestro antojo y corretea como "pedro por su casa",...perdonadme el ladrillo pero ya puestos he hecho una explicacion para que quede como consulta para la gente que se inicia en esto y no sabe como hacerlo,..con tanta letra parece complicado, pero es mas sencillo que tirarse un pedo (y perdonen la expresion) una vez entendido,..vuelvo a poner la rutina completa para que vean lo sencilla que es,..recordemos que es una rutina que llamaremos con CHECXSP0 y a la que llamaremos con JSR justo antes de incrementar o decrementar el valor de la coordenada X del sprite #0 en este caso..

Código: [Seleccionar]
CHECXSP0 ; RUTINA QUE GESTIONA SUPERACION 255 EN SPRITE #0
LDA SP0X ; CARGA EL VALOR DE X DE SPRITE #0 POSICION $D000
CMP #$FF ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION 255
BEQ ENCIMA ; SI ES 255 MANDA A SUBRUTINA ENCIMA
CMP #$00 ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION 0
BEQ DEBAJO ; SI ES 0 MANDA A SUBRUTINA DEBAJO

RTS ; RETORNA A LA RUTINA DE JOY E INCREMENTARA O DECREMENTARA
; X SEGUN EL PUNTO DONDE RETORNE EN MAINJOY, MENU JOYSTICK
ENCIMA
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
ORA #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
LDA #00 ; CARGA VALOR CERO PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; ENCIMA DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 255 POR ENCIMA DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
RTS

DEBAJO
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
EOR #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
LDA #255 ; CARGA VALOR 255 PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; DEBAJO DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 0 POR DEBAJO DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
RTS

   Podreis apreciar que la rutina completa en sí no es nada,...abultan mas las explicaciones que otra cosa, los he estado contado y la rutina completa no consume mas que 153 bytes..

   Bueno troncos os dejo que ya está bien,..ojala sea de ayuda a la gente que comienza ésta explicacion,..agregada la rutina al listado y compilado queda de la lforma que veis cargando el archivo que os adjunto en esta respuesta en el vice...

  Proximo capitulo: poniendole topes de pantalla a derecha e izquierda para que nuestro sprite no se salga de la pantalla y desaparezca de la vista..

   Chao

P.D: Este mini ladrillo explicativo esta hecho para gente que se quiera iniciar en el ensamblador, pero va especialmente dedicado a gente como Maniako que demuestra un impetu, ganas y corazon por aprender ensamblador dentro de sus limitaciones y que es de lo mas encomiable,....gente como tu, motiva!!



Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 18, 2015, 12:15:25
 Con ésta explicacion simplemente he querido demostrar como "deberían" de ser las cosas,...si muchos de los gurus en programacion que habitan en la "Espena" Española en Commodore hicieran lo que yo ( en vez de llenarseles la bocaza o viniendo con aires de superioridad para luego dejar tirada a la gente que quiere aprender y comienza con ganas o simplemente ignorandoles cuando se les pide ayuda),..compartieran sus conocimientos y sobre todo los explicaran sencillamente de cara a la gente que se inicia,..os aseguro que en cuestion de un año se recogerian unos resultados tan positivos como inimaginables,..porque para recoger hay que sembrar,....pero no,..mejor nos guardamos nuestros conocimientos como un tesoro como si se tratara de un lingote de oro y nos los llevamos a la tumba..

 Yo humildemente hago lo que puedo porque no sea así y me encanta transmitir mis humildes conocimientos con los demas a medida que voy aprendiendo, lo que está claro es que en los ultimos 5 años ya he aguantado bastantes tonterias y niñerias y ya no paso mas....

  Chao
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 18, 2015, 20:16:31
Entre los listados comentados , los consejos sobre "los sprites coordenadas de pixel doble" y lo del "estandar  de constantes internacional ", en un solo dia he aprendido lo que en una vida no consegui  :o

Son buenos consejos para como dice R.International unificar esfuerzos y volverlo todo mas simple para los que empezamos (o intentamos continuar) con el ensamblador.

Muchisimas gracias por todo.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Julio 19, 2015, 03:00:26
Templemos ánimos.

Creo que a todos los del foro, por propia lógica, nos interesa que nuestra afición por el C64 continúe lo más activa posible, pero no siempre se puede contribuir de la forma que nos gustaría.

Sin ir más lejos últimamente apenas participo, principalmente por motivos laborales, aunque no dejo de visitarlo siempre que puedo.

Además para cuatro gatos que somos, no estamos para perder más unidades.  ;D
Título: Re:Dudas en Ensamblador
Publicado por: riq en Julio 19, 2015, 05:38:31
Templemos ánimos.

+1
Título: Re:Dudas en Ensamblador
Publicado por: Iapetus en Julio 19, 2015, 10:58:09
No sé si ya conocéis pero hay este sitio con un simulador de 6502: Easy 6502 (http://skilldrick.github.io/easy6502/)

(También podéis bajar el programa para usar en vuestro ordenador sin usar internet: JavaScript 6502 assembler and simulator (https://github.com/skilldrick/6502js) (Para usar el simulador basta pinchar en el fichero html).)

El sitio está en inglés pero uno no necesita saber ese idioma para usa el simulador de 6502, se puede probar código. Es muy bueno por ejemplo cuando se está aprendiendo cosas como las banderitas de estado; para ver como son afectadas por ciertos mnemónicos.

La pantallita esa en memoria está en las posiciones $0200 a $05FF.

Un pequeño programilla que he creado ayer para probar la cosa:

Citar
lda #$00
ldy #$00
mas:
sta $0200,y
sta $0300,y
sta $0400,y
sta $0500,y
tax
inx
txa
dey
bne mas
rts


Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 19, 2015, 11:39:58
 Yo la verdad Carlos es que a ti te estoy muy agradecido, gracias a tí aprendí lo de la superacion de la Barrera de los 255 y a poner el Texto en modo multicolor y a luego aplicar el color char,..que no es poco y supuso un salto en mi aprendizaje,...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.
   
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 19, 2015, 12:08:50
  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.

  Tambien lo pongo aqui para que la gente lo vea de un plumazo por si acaso a ver que le parece...

Código: [Seleccionar]
; $0000-$0001 6510 ON-CHIP I/O PORT

D6510 = $0000 ; 6510 ON-CHIP I/O DATA DIRECTION REGISTER
R6510 = $0001

; $D000-$D02E VIC-II CHIP REGISTERS

; $D000-$D010 SPRITE HORIZONTAL AND VERTICAL POSITION REGISTERS

SP0X = $D000 ; SPRITE 0 HORIZONTAL POSITION
SP0Y = $D001 ; SPRITE 0 VERTICAL   POSITION
SP1X = $D002 ; SPRITE 1 HORIZONTAL POSITION
SP1Y = $D003 ; SPRITE 1 VERTICAL   POSITION
SP2X = $D004 ; SPRITE 2 HORIZONTAL POSITION
SP2Y = $D005 ; SPRITE 2 VERTICAL   POSITION
SP3X = $D006 ; SPRITE 3 HORIZONTAL POSITION
SP3Y = $D007 ; SPRITE 3 VERTICAL   POSITION
SP4X = $D008 ; SPRITE 4 HORIZONTAL POSITION
SP4Y = $D009 ; SPRITE 4 VERTICAL   POSITION
SP5X = $D00A ; SPRITE 5 HORIZONTAL POSITION
SP5Y = $D00B ; SPRITE 5 VERTICAL   POSITION
SP6X = $D00C ; SPRITE 6 HORIZONTAL POSITION
SP6Y = $D00D ; SPRITE 6 VERTICAL   POSITION
SP7X = $D00E ; SPRITE 7 HORIZONTAL POSITION
SP7Y = $D00F ; SPRITE 7 VERTICAL   POSITION
MSIGX = $D010 ; MSB'S OF SPRITES 0-7 HORIZONTAL POSITIONS

; $D011-$D012 SCROLL & RASTER

SCROLY = $D011 ; VERTICAL FINE SCROLLING AND CONTROL REGISTER
RASTER = $D012 ; READ CURRENT RASTER SCAN LINE/WRITE LINE TO COMPARE
; FOR RASTER IRQ

; $D013-$D014 LIGHT PEN REGISTERS

LPENX = $D013 ; LIGHT PEN HORIZONTAL POSITION
LPENY = $D014 ; LIGHT PEN VERTICAL   POSITION

;

SPENA = $D015 ; SPRITE ENABLE REGISTER
SCROLX = $D016 ; HORIZONTAL FINE SCROLLING AND CONTROL REGISTER
YXPAND = $D017 ; SPRITE VERTICAL EXPANSION REGISTER
VMCSB = $D018 ; VIC-II CHIP MEMORY CONTROL REGISTER
VICIRQ = $D019 ; VIC INTERRUPT FLAG REGISTER
IRQMSK = $D01A ; IRQ MASK REGISTER
SPBGPR = $D01B ; SPRITE TO FOREGROUND DISPLAY PRIORITY REGISTER
SPMC = $D01C ; SPRITE MULTICOLOR REGISTERS
XXPAND = $D01D ; SPRITE HORIZONTAL EXPANSION REGISTER

; $D01E-$D01F SPRITE COLLISION DETECTION REGISTERS

SPSPCL = $D01E ; SPRITE TO SPRITE COLLISION REGISTER
SPBGCL = $D01F ; SPRITE TO FOREGROUND COLLISION REGISTER

; $D020-$D026 VIC-II COLOR REGISTER

EXTCOL = $D020 ; BORDER COLOR REGISTER
BGCOL0 = $D021 ; BACKGROUND COLOR 0
BGCOL1 = $D022 ; BACKGROUND COLOR 1
BGCOL2 = $D023 ; BACKGROUND COLOR 2
BGCOL3 = $D024 ; BACKGROUND COLOR 3
SPMC0 = $D025 ; SPRITE MULTICOLOR REGISTER 0
SPMC1 = $D026 ; SPRITE MULTICOLOR REGISTER 1

; $D027-$D02E SPRITE COLOR REGISTERS

SP0COL = $D027 ; SPRITE 0 COLOR REGISTER
SP1COL = $D028 ; SPRITE 1 COLOR REGISTER
SP2COL = $D029 ; SPRITE 2 COLOR REGISTER
SP3COL = $D02A ; SPRITE 3 COLOR REGISTER
SP4COL = $D02B ; SPRITE 4 COLOR REGISTER
SP5COL = $D02C ; SPRITE 5 COLOR REGISTER
SP6COL = $D02D ; SPRITE 6 COLOR REGISTER
SP7COL = $D02E ; SPRITE 7 COLOR REGISTER

; $D02F-$D03F NOT CONNECTED

; $D040-$D3FF VIC-II REGISTER IMAGES

;
; SOUND INTERFACE DEVICE (SID) REGISTERS
;

; $D400-$D414 VOICE CONTROLS

FRELO1 = $D400 ; VOICE 1 FREQUENCY CONTROL (LOW BYTE)
FREHI1 = $D401 ; VOICE 1 FREQUENCY CONTROL (HIGH BYTE)
PWLO1 = $D402 ; VOICE 1 PULSE WAVEFORM WIDTH (LOW BYTE)
PWHI1 = $D403 ; VOICE 1 PULSE WAVEFORM WIDTH (HIGH BYTE)
VCREG1 = $D404 ; VOICE 1 CONTROL REGISTER
ATDCY1 = $D405 ; VOICE 1 ATTACK/DECAY REGISTER
SUREL1 = $D406 ; VOICE 1 SUSTAIN/RELEASE CONTROL REGISTER

FRELO2 = $D407 ; VOICE 2 FREQUENCY CONTROL (LOW BYTE)
FREHI2 = $D408 ; VOICE 2 FREQUENCY CONTROL (HIGH BYTE)
PWLO2 = $D409 ; VOICE 2 PULSE WAVEFORM WIDTH (LOW BYTE)
PWHI2 = $D40A ; VOICE 2 PULSE WAVEFORM WIDTH (HIGH BYTE)
VCREG2 = $D40B ; VOICE 2 CONTROL REGISTER
ATDCY2 = $D40C ; VOICE 2 ATTACK/DECAY REGISTER
SUREL2 = $D40D ; VOICE 2 SUSTAIN/RELEASE CONTROL REGISTER

FRELO3 = $D40E ; VOICE 3 FREQUENCY CONTROL (LOW BYTE)
FREHI3 = $D40F ; VOICE 3 FREQUENCY CONTROL (HIGH BYTE)
PWLO3 = $D410 ; VOICE 3 PULSE WAVEFORM WIDTH (LOW BYTE)
PWHI3 = $D411 ; VOICE 3 PULSE WAVEFORM WIDTH (HIGH BYTE)
VCREG3 = $D412 ; VOICE 3 CONTROL REGISTER
ATDCY3 = $D413 ; VOICE 3 ATTACK/DECAY REGISTER
SUREL3 = $D414 ; VOICE 3 SUSTAIN/RELEASE CONTROL REGISTER

; $D415-$D418 FILTER CONTROLS

CUTLO = $D415 ; FILTER CUTOFF FREQUENCY (LOW BYTE)
CUTHI = $D416 ; FILTER CUTORR FREQUENCY (HIGH BYTE)
RESON = $D417 ; FILTER RESONANCE CONTROL REGISTER
SIGVOL = $D418 ; VOLUME AND FILTER SELECT REGISTER

; $D419-$D41A GAME PADDLE INPUTS

POTX = $D419 ; READ GAME PADDLE 1 (OR 3) POSITION
POTY = $D41A ; READ GAME PADDLE 2 (OR 4) POSITION

RANDOM = $D41B ; READ OSCILLATOR 3/RANDOM NUMBER GENERATOR
ENV3 = $D41C ; ENVELOPE GENERATOR 3 OUTPUT

; $D41D-$D41F NOT CONNECTED

; $D420-$D7FF SID REGISTER IMAGES

; $D800-$DBFF COLOR RAM

; $DC00-$DC0F CIA #1

CIAPRA = $DC00 ; DATA PORT REGISTER A
CIAPRB = $DC01 ; DATA PORT REGISTER B
CIDDRA = $DC02 ; DATA DIRECTION REGISTER A
CIDDRB = $DC03 ; DATA DIRECTION REGISTER B

TIMALO = $DC04 ; TIMER A (LOW BYTE)
TIMAHI = $DC05 ; TIMER A (HIGH BYTE)
TIMBLO = $DC06 ; TIMER B (LOW BYTE)
TIMBHI = $DC07 ; TIMER B (HIGH BYTE)

TODTEN = $DC08 ; TIME OF DAY CLOCK TENTHS OF SECONDS
TODSEC = $DC09 ; TIME OF DAY CLOCK SECONDS
TODMIN = $DC0A ; TIME OF DAY CLOCK MINUTES
TODHRS = $DC0B ; TIME OF DAY CLOCK HOURS

CIASDR = $DC0C ; SERIAL DATA PORT
CIAICR = $DC0D ; INTERRUPT CONTROL REGISTER
CIACRA = $DC0E ; CONTROL REGISTER A
CIACRB = $DC0F ; CONTROL REGISTER B

; $DC10-$DCFF CIA #1 REGISTER IMAGES

; $DD00-$DD0F CIA #2

CI2PRA = $DD00 ; DATA PORT REGISTER A
CI2PRB = $DD01 ; DATA PORT REGISTER B
C2DDRA = $DD02 ; DATA DIRECTION REGISTER A
C2DDRB = $DD03 ; DATA DIRECTION REGISTER B

TI2ALO = $DD04 ; TIMER A (LOW BYTE)
TI2AHI = $DD05 ; TIMER A (HIGH BYTE)
TI2BLO = $DD06 ; TIMER B (LOW BYTE)
TI2BHI = $DD07 ; TIMER B (HIGH BYTE)

TO2TEN = $DD08 ; TIME OF DAY CLOCK TENTHS OF SECONDS
TO2SEC = $DD09 ; TIME OF DAY CLOCK SECONDS
TO2MIN = $DD0A ; TIME OF DAY CLOCK MINUTES
TO2HRS = $DD0B ; TIME OF DAY CLOCK HOURS

CI2SDR = $DD0C ; SERIAL DATA PORT
CI2ICR = $DD0D ; INTERRUPT CONTROL REGISTER
CI2CRA = $DD0E ; CONTROL REGISTER A
CI2CRB = $DD0F ; CONTROL REGISTER B

; $DD10-$DDFF CIA #2 REGISTER IMAGES

  Saludos
 
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 19, 2015, 14:44:47
No sé si ya conocéis pero hay este sitio con un simulador de 6502: Easy 6502 (http://skilldrick.github.io/easy6502/)

Lo estuve probando y es GENIAL!!! super práctico para probar pequeños códigos.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako 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. ;)
Título: Re:Dudas en Ensamblador
Publicado por: josepzin 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
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL 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
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL 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....

 
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL 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!!

 
Título: Re:Dudas en Ensamblador
Publicado por: Maniako 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

Título: Re:Dudas en Ensamblador
Publicado por: Maniako 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
Título: Re:Dudas en Ensamblador
Publicado por: Carlos 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
       
Título: Re:Dudas en Ensamblador
Publicado por: Maniako 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
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL 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!
Título: Re:Dudas en Ensamblador
Publicado por: Carlos 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.



Título: Re:Dudas en Ensamblador
Publicado por: Maniako 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.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos 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?
Título: Re:Dudas en Ensamblador
Publicado por: josepzin 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.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL 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.


Título: Re:Dudas en Ensamblador
Publicado por: Maniako 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
Título: Re:Dudas en Ensamblador
Publicado por: Maniako 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
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 19, 2015, 22:50:15
Por cierto, utilisima esa página Easy 6502 http://skilldrick.github.io/easy6502/ (http://skilldrick.github.io/easy6502/)

Puedes ver a que banderas afectan las instrucciones sin tener que ir haciendo miniprogramas.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL 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
Título: Re:Dudas en Ensamblador
Publicado por: Carlos 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.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos 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
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 20, 2015, 08:39:57
Kabura es un Emo con tendencias suicidas.
Pedazo de argumento para un vieojuego  ;D
Título: Re:Dudas en Ensamblador
Publicado por: Maniako 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
Título: Re:Dudas en Ensamblador
Publicado por: josepzin 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 :(
Título: Re:Dudas en Ensamblador
Publicado por: Maniako 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.

 
Título: Re:Dudas en Ensamblador
Publicado por: josepzin 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.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako 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.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin 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.
Título: Re:Dudas en Ensamblador
Publicado por: riq 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
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 21, 2015, 23:43:25
Listo, aquí está. Mas simple que el mecanismo de un botijo :P

Código: [Seleccionar]
*= $c000 ; sys 49152
!to "test.prg", cbm

;activa todos los sprites
LDA #$FF
STA $D015

; posicion
LDA #60
STA $D000
STA $D001

; color
LDA #$01
STA $D027

loop
lda $d010 ;Carga Acu con el valor actual de MSB
eor #%00000001
sta $d010
JMP loop

Supongo que será porque hay que sincronizar con el barrido o es que el VIC es un procesador cuantico, al leer el valor lo estas modificando :P
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 21, 2015, 23:44:22
@jozepzin:

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

Coñio... que es esa tontería... un tiro en los webs...
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 21, 2015, 23:47:59
Lo he probado con ORA y funciona bien. Gracisimas.

Ahora pruebo el mismo código pero en vez de poner ORA pongo ADC, que es lo que usa el Maniako en su ejemplo.
Y vuelta al parpadeo!

Citar
loop
   lda $d010
   clc
   adc #%00000001
   sta $d010
   JMP loop
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 21, 2015, 23:49:25
Este es el codigo de Maniako:

Código: [Seleccionar]
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
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 21, 2015, 23:52:01
Igual en esto del ADC el error es que al estar ya activo es logico que haya parpadeo, ya que 0001 se convierte en 0010.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 21, 2015, 23:55:29
Riq tiene razón. Yo también estoy pez.

Para estas cosas, siempre hago programas como este para verlo en acción.

Código: [Seleccionar]
; 10 SYS (4096)

*=$801

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

*=$1000

               
        lda #0
        sta$0400
loop       lda $0400
       
        eor #%00000001
        sta $0400
        jmp loop

Con ORA todo OK.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 22, 2015, 00:00:17
El código lo puse de memoria, prueba con el salto BCS (Branch on Carry Set) en vez de BCC

   Hi Carlos!!

  En cierto modo has "dado con la tecla" ya que la cosa parece que ha mejorado y ahora colisiona cuando debe pero de una forma muy extraña, el cambio a BCS a sido muy mejorativo pero no completo, imagino que habrá que hacer mas depuraciones...

  Ya he vuelto al curro y ya me vuelve a faltar tiempo,..el cual tiempo cuento lo tenga te voy a mandar el listado por correo privado (desde el movil porque estoy capado de PC) para que le eches un vistazo en las rutinas a y el ejecutable actual,....ya lo veras sin prisas que sé que también te falta tiempo...

  Cuando veas el Ejecutable actual en el Vice vas a alucinar con las mejoras en relacion a la Demo que te mostré (Saltas, Disparas, Matas, se muestran todos los enemigos existentes, mueren a tus impactos, funciona el marcador, secuencias de explosion,etc, etc),...como te digo sin prisas, de hecho a ver si tengo un hueco para mandartelo que yo también ando un poco apretado con el curro..

  Y como simpre mil gracias y...

   AL HIERRO!!

 
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 22, 2015, 00:01:56
ADC suma al acu la dirección donde apunto en mi programa (un bite en concreto ya definido al final del listado).

Como solo se suma una vez el bit que deseo activar , no se va alterando su valor a cada ciclo.

Si quieres activar el MSB (>255) del sprite 0, sumas 1 a $D010 (si D010 contiene 0 ) y obtienes 1 (MSB activado para sprite 0).

Si vuelves a sumarle 1 (otra vez activar el sprite 0) obtienes 2, con lo cual conectas el sprite 1 y desconectas el 0.

Si vas sumandole 1 a saco, conectas y desconectas los sprites continuamente.

Por cierto, si vas a sumar  , antes pon CLC Clear Carry Flag , si el Carry está activado, los resultados no serán los que deseas ;)
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 22, 2015, 01:22:04
El caso es que el ADC sirve para activar y no volver a tocar el registro, pero en la lógica de mi versión no me sirve hacerlo de esa manera. Igual lo estoy planteando como haría un juego en la actualidad y no es así como se debería hacer en el 64. Pero bueno, me divierto un rato :P

¿Hay alguna instrucción que invierta valores? me refiero a por ejemplo %0001 lo convierta en %1110
He mirado el listado de instrucciones y parece que no, pero como me lié con el EOR/ORA igual tambien se me está escapando eso.
Título: Re:Dudas en Ensamblador
Publicado por: riq en Julio 22, 2015, 02:32:21
¿Hay alguna instrucción que invierta valores? me refiero a por ejemplo %0001 lo convierta en %1110
He mirado el listado de instrucciones y parece que no, pero como me lié con el EOR/ORA igual tambien se me está escapando eso.

"EOR #$ff" hace exacamente eso.

Código: [Seleccionar]
   lda #%00000001
   eor #%11111111      ; ahora A = %11111110

   lda #%00001111
   eor #%11111111      ; ahora A = %11110000
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 22, 2015, 08:49:16
 EOR invierte bit's?.

Si Acu= 10110101
EOR #$01
Acu=10110100 ?.

Mi código aun mas corto en 3,2,1...
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 22, 2015, 10:25:56
La funcion XOR es igual que OR pero da 0 si ambas entradas son iguales, por eso es OR exclusivo, porque funciona como OR pero solo una entrada puede estar en 1 para dar 1.
Lo interesante de esta pequeña diferencia, es que si miramos la tabla, da 1 si las dos entradas son distintas (solo hay un 1 en cualquiera de las entradas, y la otra es 0), y da 0 si las dos entradas son iguales, ya que si las dos eran 0 ya daba 0 (por ser OR), y ahora por ser exclusivo, si ambas son 1 tambien da 0.
Por esta razon XOR sirve para dos aplicaciones muy utiles, la primera es la comparacion exacta de dos valores, si cada uno de los bits correspondientes de cada parametro son iguales, el resultado sera 0, si alguno de los bits son distintos, por ejemplo el bit 0 de un parametro es 0 y el bit 0 del otro es 1, va a dar 1 como una OR normal, y esto da un resultado general distinto de 0. En resumen, que si se hace XOR entre dos bytes, solo da 0 si son iguales, si da distinto de 0 es que los dos bytes tienen algun bit diferente.
La otra aplicacion que es mas util, es que invierte solo los bits que estan a 1 en uno de los parametros, por eso para invertir todo un byte hay que hacer XOR con $FF, si hacemos XOR con $00 no se altera nada. La funcion XOR es muy utilizada para simular sprites en maquinas como los Spectrum, donde se usan graficos monocromaticos, ya que invierte solo los bits a los que se haga XOR con 1, lo que se suele hacer es dibujar un "sprite" sobre el bitmap de pantalla aplicando XOR entre el sprite y la pantalla. El resultado de esto es que el sprite aparece pintado en negro si el fondo era blanco, y en blanco si el fondo era negro. Justo antes de volver a redibujarlo en otras coordenadas, se vuelve a aplicar XOR en la pantalla en el mismo lugar, y la pantalla vuelve a quedar como antes, invirtiendo los puntos correspondientes del sprite (los puntos del sprite que vendrian a ser "transparentes" estarian a 0, y no afectarian para nada al bitmap al aplicarle XOR). Tambien puede verse este efecto en sistemas como el Workbench de Amiga y otros sistemas graficos de los 80s, cuando se muestra el recuadro que simboliza el borde de una ventana, al mover la ventana a otra posicion, solo que en Amiga se hace XOR con los colores, pero se puede apreciar que el color cambia segun lo que haya en el fondo.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 22, 2015, 11:00:05
Pastbytes... ¿estas casado?.
Puedo dejar a mi mujer por tus conocimientos  ;)

Mas claro agua. Por eso los "sprites" de un Z80 parece que tengan un campo de fuerza cuadriculado.

Agradecido por la educadora lección.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 22, 2015, 11:12:07
Bueno, no es el Z80 el problema, sino no tener sprites, en MSX no pasa eso, en un Amstrad CPC o incluso en un PC con una VGA clasica (o Hercules/CGA/EGA) se tienen que usar esos trucos, aunque es mas efectivo en graficos monocromaticos. Lo del borde que les agregan es para que se destaquen mas sobre el fondo, usen o no XOR, desventajas que tiene el no usar mas de 2 colores para los graficos.
Ahora que recuerdo, XOR tambien se uso en varios sistemas operativos graficos para mostrar el puntero, cuando no era comun tener un sprite para eso (que si tiene el Amiga por ejemplo). Ahora no me acuerdo si Windows 3.1 o los primeros MacOS, o ambos, hacian eso, que parte del puntero cambiaba a blanco o negro segun lo que hubiera en esos puntos en la pantalla.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 22, 2015, 11:44:26
Pastbytes, no te vayas por la tangente y responde la pregunta de Maniako.. :-P
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 22, 2015, 11:54:52
No pude encontrar un ejemplo de XOR en los punteros del raton, no recuerdo ahora en que sistema lo habia visto pero al parecer no era Windows 3.x ni MacOS, sin embargo el efecto era mas comun de lo que recordaba, se usaba para invertir los iconos seleccionados, cuando los iconos solian ser en blanco y negro (como en GEOS, o GEM Desktop del Atari ST), o para invertir una opcion de menu seleccionada. Lo que ganaban con eso era no tener que almacenar dos imagenes en memoria, y un poco de velocidad al evitar la transferencia de una imagen a la pantalla, ya que aplicaban XOR directamente en la VRAM.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 22, 2015, 12:16:44
Aca encontre el efecto XOR al que me referia, en juegos no es tan usado porque no siempre queda bien, es una tecnica usada cuando hay serias limitaciones de memoria y proceso, ademas de falta de colores.
El articulo esta en ingles pero de paso parece interesante, explica esa y otras tecnicas, y las imagenes son bastante claras:
http://stevewetherill.com/blog/2014/09/17/heartland-for-zx-spectrum/
En la parte donde dice XOR Technique se ve la imagen de un "sprite" con la mitad del fondo en blanco y la otra en negro, y el personaje siempre se ve bien.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 22, 2015, 12:56:39
"EOR #$ff" hace exacamente eso.

Código: [Seleccionar]
   lda #%00000001
   eor #%11111111      ; ahora A = %11111110

   lda #%00001111
   eor #%11111111      ; ahora A = %11110000


Sabía que lo tenía enfrente de la nariz... gracias.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 22, 2015, 12:57:37
Mi código aun mas corto en 3,2,1...

Claro! para eso mismo lo quería usar yo :D
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 22, 2015, 12:59:32
Aca encontre el efecto XOR al que me referia, en juegos no es tan usado porque no siempre queda bien, es una tecnica usada cuando hay serias limitaciones de memoria y proceso, ademas de falta de colores.
El articulo esta en ingles pero de paso parece interesante, explica esa y otras tecnicas, y las imagenes son bastante claras:
http://stevewetherill.com/blog/2014/09/17/heartland-for-zx-spectrum/
En la parte donde dice XOR Technique se ve la imagen de un "sprite" con la mitad del fondo en blanco y la otra en negro, y el personaje siempre se ve bien.

Para que el efecto quede bien hay que usar máscaras y sincronizar con el barrido, sino el efecto es bastante inmundo :P

Me recuerda a los juegos de la primera época del PC-XT, sprites monocolores que parpadeaban sobre el fondo... lloraba pensando en mis sprites de C64 a color :'(
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 22, 2015, 14:13:40
¿Hay alguna convención a la hora de escribir código en ensamblador?

Son muy útiles, aunque luego cada uno tiene sus gustos personales, no es mala idea seguir unos lineamientos generales.

Por ejemplo mayusculas o minusculas en labels, constantes (o etiquetas con direcciones de memoria), usar guion bajo, poner los labels en una linea distinta o en la misma del código. Usar ":" al declarar label.
Etc, etc.

Para PHP+Codeigniter yo usé una guía que me resultó muy útil, supongo que para esto debería haber algo.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 22, 2015, 14:31:44
En este mismo hilo, por el final de la primera pagina, se hablo de ese tema de los estilos para escribir en asm.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 22, 2015, 14:39:27
Gracias, lo he releido.

Debo decir que me resulta bastante antinatural escribir las instrucciones en mayusculas, lo veo bien en C64 pero en notepad-loquesea no, basicamente porque por defecto se escribe en minusculas.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 22, 2015, 14:52:36
Yo las escribo como salen en las hojas de datos oficiales, las del 6502 salen en mayusculas, lo mismo que las del Z80, las de los microcontroladores PIC salen en minusculas, y asi las escribo.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Julio 22, 2015, 16:54:56
¿Hay alguna convención a la hora de escribir código en ensamblador?
...

Respuesta corta: No
Título: Re:Dudas en Ensamblador
Publicado por: riq en Julio 22, 2015, 19:46:16
Como dijo Carlos, no lo hay.  Mi consejo es que seas consistente. Usa la convención que quieras, pero no mezcles convenciones dentro de un mismo archivo... (y mejor aun, no mezcles dentro de un mismo proyecto).

Actualizo:
A veces ciertos ensambladores tienen sus propias sugerencias. Por ejemplo, en ACME se estila utilizar la extensión ".a" para los archivos. En ca65, se suele usar la ".s". En KickAssembler se utiliza la ".asm"... pero son solo conveciones. Que indentación usar, si usar mayúsculas o minusculas, si usar CamelCase o underscore_case, es usa cuestion de gustos.
Y esto es válido para otros lenguajes también como C++, C, etc...
Por ahora el único lenguaje que conozco que tiene una guia oficial de como programalo es Python: https://www.python.org/dev/peps/pep-0008/
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 22, 2015, 22:29:35
Debo decir que me resulta bastante antinatural escribir las instrucciones en mayusculas, lo veo bien en C64 pero en notepad-loquesea no, basicamente porque por defecto se escribe en minusculas.

  Estas flipando Jose?,..a mi me parece mas antinatural escribir en minusculas,...el Commodore te muestra las letras en mayusculas por defecto y yo en el Notepad lo hago asi (en mayusculas) al igual que en la Maquina Original.

  basicamente porque por defecto se escribe en minusculas

  Pero eso donde lo pone?,...seran en los lenguajes C estos en los que te manejas....

  Para terminar pongo dos ejemplos: gente como Silicebit o Madonna (de los que he aprendido mucho) programan en Mayusculas y creo que estamos hablando de dos programadores de primera!!!,..,,que pasa que esta gente es gilipollas y no sabe lo que se hace?,...ja,j,aj,aj,ja
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 22, 2015, 22:35:09
Passbytes:
No te mates buscando el ejemplo. Tengo máquinas (pockets PC) con pantalla LCD bicolor y se aprecia lo que comentas.

Citar
    Mi código aun mas corto en 3,2,1...


Claro! para eso mismo lo quería usar yo :D

Ahí esta el por qué he usado ADC para activar o desactivar el MSB.

Estoy encantado con las clases que estoy recibiendo. Tengo material para practicar durante todo el fin de semana.

Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 22, 2015, 22:42:23
¿Hay alguna convención a la hora de escribir código en ensamblador?

Caray!!
Ya me lo leeré, aunque para mi mientras esté claro y bién comentado, me da igual mayúsculas como minúsculas.

Passbytes:

El link sobre EOR, OR y demás es superinteresante. Lastima que con el inglés me va a costar comprenderlo al 100% y google translator es un cachondo con las traducciones y me desconcentra con las burradas que traduce de vez en cuando.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 23, 2015, 23:06:49
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 .

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 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
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 23, 2015, 23:19:36
Parece bastante compacto.

Yo al principio intenté optimizar lo más que podía pero inevitablemente no puedo dejar de pensar en "usos genericos" y siempre termino agregando cosas que quitan optimización pero permite un uso más general.

Así que ya metí tablas para colores, punteros, expandido x, y, color, límite de espacio de movimiento, librería para leer joystick, librería para sprites, etc... siempre termino liandome :P

Así va mas o menos el invento (con el joy2 se puede mover por "toda" la pantalla)
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 23, 2015, 23:40:20
Lo único raro hasta ahora es que al ir para arriba va más rápido de lo normal... :?
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 23, 2015, 23:49:20
Cuantos sprites en pantalla XD.

Si que es cierto que sube al doble de velocidad  :o. 
Cuelga el código a ver qué es.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 24, 2015, 00:36:38
Esta es la subrutina que va para arriba:

Código: [Seleccionar]
joy_up:
ldx #$00 ; seleccionar el sprite del personaje

lda #$40 ; validar que no supere límite asignado
cmp SPRITES_Y, x
bcs joy_up_end

lda SPRITES_Y, x ; decrementar coordenada Y
clc
sbc #$01
sta SPRITES_Y, x
joy_up_end:
rts

Pensé que podría tratarse del CLC pero lo cambié a SEI y es lo mismo...
Título: Re:Dudas en Ensamblador
Publicado por: riq en Julio 24, 2015, 01:19:08
Cambialo por SEC (no SEI).

Mejor aún... hace:

Código: [Seleccionar]
; Usa "dec", en vez de "sbc #$01"
        dec SPRITES_Y,x

; y borra todo este codigo
        lda SPRITES_Y, x ; decrementar coordenada Y
clc
sbc #$01
sta SPRITES_Y, x
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 24, 2015, 01:58:20
:O

Qué manera de quitar código :D

Para incrementar un sprite por más de 1 pixel había pensado en hacer un loop, asi puedo ir validando pixel a pixel que no supere ciertos rangos.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 24, 2015, 02:14:16
Todo esto esta muy bien como experimento, pero en la vida real uno no siempre avanza un sprite 1 punto a la vez, los juegos se hacen sincronizados con los 50hz de la pantalla, no se dibuja cada paso intermedio sino que cuando se va a mostrar la pantalla se dibuja todo donde debe aparecer. Por lo tanto las coordenadas de los sprites se almacenan en "variables" propias, no en los registros del VIC, y logicamente las coordenadas X usan 9 bits (dos bytes por cada sprite, o un byte por sprite mas otro byte para los MSB de los 8 sprites, tal como usa el VIC). Si tenemos un Pacman y el sprite tiene que salir por un lado y entrar por el otro, o si tenemos un juego donde el personaje entra en una puerta y sale en otro lado de la pantalla, cruzando la barrera de los 255 puntos, no podemos hacer un bucle para avanzar de una coordenada a otra solo para no complicarse la vida con coordenadas de 9 bits, ya que no sobra tiempo de proceso para eso.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 24, 2015, 02:16:36
Totalmente de acuerdo. Asi lo estoy haciendo yo.

Lo que decía es que si quiero incrementar de a 4 (por ejemplo), puedo hacer un pequeño loop en donde se incrementa de a 1 y a la vez se valida que no supere ciertos limites, ya sea una coordenada o un muro.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 24, 2015, 02:25:39
Hice dos tablas, una es SPRITES_X_LO y la otra SPRITES_X_HI, donde voy actualizando las coordenadas y luego al final en un bucle actualizo todos los sprites con todos sus atributos, color, x, y, puntero, ampliaciones, etc.
Es optimizable obviamente pero para hacer algo genérico creo que está bien.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 24, 2015, 02:29:54
Es suma de numeros de 9 bits, se suma 4 y se chequea carry para saber si el resultado es mayor a 255, no hace falta hacer eso 4 veces cuando se puede hacer el mismo codigo solo una vez. El valor de carry es lo que va al bit 9 de la coordenada del sprite. En algun momento va a haber que enfrentar el problema, muchas cosas requieren hacer operaciones matematicas con mas de 8 bits, por ejemplo el puntaje de un juego.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 24, 2015, 08:25:36
Entonces lo mejor es usar coordenadas de 0 a 255 pero moviendo dos pixels como recomendaron algunos posts atrás.
Si el numero es positivo <128 MSB off, si es negativo >127 MSB on.

Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 24, 2015, 09:32:10
Es una solucion posible, pero lo ideal es hacer una rutina donde se le pase como parametros que sprite se quiere mover, y un byte conteniendo la distancia a mover, expresada como un numero con signo, lo que permitiria con la misma rutina mover un sprite en la coordenada X un numero de puntos arbitrario entre -128 y 127. Despues se podria implementar de forma separada una rutina que haga el chequeo de limites para corregir las coordenadas si el numero dio negativo o excedio los 344 puntos que me parece que es el maximo permitido por el VIC.
Pero el codigo no es mucho mas complejo que lo que ya se esta haciendo, por ejemplo si el sprite esta en la coordenada 250 y queremos avanzar 10 puntos a la derecha, se sumaria 250+10, esto daria como resultado 260, que excede el valor 255, representado en binario 260 = 100000100, que es un valor de 9 bits, el bit 8 (el noveno) queda en carry, los otros 8 bits quedan como resultado, que en decimal seria 00000100 = 4. El bit 8, que queda en carry despues de la suma, vale 256 (2^8), por lo que el resultado de la suma es justamente 256 + 4 = 260. Ese valor que queda en carry debemos colocarlo en el bit mas significativo de la coordenada X de ese sprite para que no se pierda, y el resultado (el valor 4) directamente en el registro de coordenada X del sprite.
En definitiva, el sprite antes tenia en X el valor 250, representado como 250 en la coordenada X y 0 en el MSB de la coordenada X, y luego de sumarle 10, pasaria a tener el valor 4 en X, y 1 en el MSB de la coordenada X. No es una cosa rara, simplemente es un numero de 9 bits, y se coloca el bit 8 de cada sprite en un unico registro, pero siempre tenemos que tomarlo como un numero de 9 bits al que se le puede sumar o restar cualquier numero. Hay que tener en cuenta que la suma de dos numeros de 8 bits puede dar como maximo un resultado de 9 bits, 255+255 = 510 = 1 11111110 en binario, esto es, carry = 1, y resultado igual a 11111110 = 254. No es mas que un numero de 9 (o 16 bits si se quiere redondear a bytes enteros) dividido en dos partes, pero el bit 8 siempre vale 256, en el ejemplo, 256+254 = 510.
Para restar coordenadas ya es un poco mas complejo, pero el codigo no es mucho mas largo, solo hay que pensarlo un poco mas.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 24, 2015, 11:19:29
Para restar solo hay que activar el Acarreo antes de la operación, si sigue activo no hay desbordamiento.
Si se desactiva, hay desbordamiento.

¿A esto te refieres?.

Lo del MSB (Most Significant Byte) lo entiendo. La cosa está en encontrar una manera aún mas simple , casi mecánica de hacer mover sprites (esto es fácil) activando o desctivando el MSB (ya es otro cantar) sin mucho código. Aunque no sé como aún.

Trabajare en ello este fin de semana, algo tengo pensado y solo falta comprobar si se puede pasar al mundo real.
 
Eso es lo que me encantaba de programar, una vez funciona lo que buscabas, ¿como lo hago más pequeño o simple? .
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 26, 2015, 16:46:30
Bueno.
Aquí está el primer borrador de lo extraido de las enseñanzas de Pastbytes.

Solo manejo un sprite pero basta para comprobar el funcionamiento de la rutina.
Esta muy comentado todo, pero si necesitais alguna aclaración no hay problema.
No estaré al nivel de algunos cuando se explican (de 10) pero lo intentaré  ;)

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
temporal =$4000

*=$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------------------------------------------------------
inicio 
        lda ciapra              ;Joy2 en registro Y
        sec                     ;Activar CARRY. Necesario antes de restar.
        sbc #111                ;Resto 111 para que pueda usar los sumadores de movimiento
        tay                     ;Y=Acu. El registro Y leera el valor a sumar de la coordenada X del sprite
        ldx #$00                ;registro X .El valor del sprite a mover 0-7.
        lda corspritesx,x        ;Lectura de cordenadas X
        clc                     ;CARRY a 0 para la suma
        adc direccion,y         ;Sumar el valor de la dirección a la coordenada X
        sta temporal            ;Guardo nuevo valor coordenada X
        bcs test2               ;Si está el carry activado , posible MSB der...
       
;CARRY desactivado Posible MSB izq
test1   clc                     ;Carry a cero
        lda direccion,y         ;Lee el sumador (direccion)
        bmi msbonoff            ;Si es negativo (fd) pasa a rotar el bit MSB
        jmp cont                ;Si no, a seguir con el programa.

;CARRY activado Posible MSBder
test2   clc                     ;Carry a 0
        lda direccion,y         ;Lee el sumador (direccion)
        bpl msbonoff            ;Si es positivo (03) pasa a rotar el bit MSB
        jmp cont                ;Si no, a seguir con el programa

msbonoff
        lda msb                 ;Actual valor de MSB al ACU
        EOR valbmsb,x            ;Activar o desactivar el bit correspondiente
        sta msb

cont    lda temporal            ;Recupero el ACU
        sta posprites,x          ;Muevo sprite coordenada X
        sta corspritesx,x       ;Guardo coordenada actualizada

;Bucle de freno------------------------------------------------------------
        ldx #$ff
bucle1  ldy #$10
bucle2  dey
        bne bucle2
        dex
        bne bucle1
;Fin bucle de freno--------------------------------------------------------
        jmp inicio

;Fin del programa---------------------------------------------------------------
*=$3000
;Las 8 coordenadas de los sprites almacenadas aqui
corspritesx byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
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

;Joy Arriba=126- ABAJO=125- DERECHA=119 - IZQUIERDA=123 - DISPARO=111
;disparo 111-111=0
;DER 119-111=8
;IZQ 123-111=12
;ABA 125-111=14
;ARR 126-111=15
;              Dis                             der             izq     aba arr nada
direccion byte $00,$00,$00,$00,$00,$00,$00,$00,$03,$00,$00,$00,$fd,$00,$00,$00,$00,$00,$00,$00
;               0   1   2   3   4   5   6   7   8   9   10  11  12  13  15  15  16  17  18  19   
;Puedes borrar arriba y abajo para las pruebas.

;Intento de explicar su funcionamiento:

;Uso el valor directo del joystick para ahorrarme los comparadores de direccón.
;Disparo=111. Derecha=119. Izquierda=123. Abajo=125. Arriba=126. Nada=127
;Le resto 111 que es el mínimo (valor del disparo aunque no lo uso) y me da la dirección
;donde leer el valor a sumar para mover el sprite. Si pulsais disparo el funcionamiento puede
;volverse inestable al leer en cualquier lado de la memoria (valor aleatorio)

;Tened en cuenta que cuando sumas valores, al llegar a 255 y volver a sumar, se desborda el byte y
;este vuelve a su
;"inicio"" activando el flag CARRY. De esto me aprovecho para tratar de acortar el programa.

;Si A=255 y le sumo 1, da como resultado un 0 con el CARRY activado.
;Si le sumo a 255 (coordenada X actual) un 3, da 2 con CARRY activado.
;Luego solo comparo si el valor que se ha sumado a la coordenada es de signo POSITIVO
;y si lo es, activo el MSB

;Para izquierda casi lo mismo pero un poco mas lioso . Si le sumo a 3(coordenada actual) el valor 253,
;da como resultado 00 con carry activado (lo cual indica que no hemos cruzado al otro lado)

;En cambio, si a 2 (coordenada actual)le sumo 253, da como resultado 255 Con CARRY desactivado y aqui
;está el meollo de la cuestión. Esta vez si que hemos cruzado al otro lado y hay que activar
;el MSB del sprite en cuestión.
;Cuando no desborda, compruebo si el valor sumado es de signo NEGATIVO y si es así, cambio el MSB
;Es un poco lioso , lo se. Pero muy útil cuando se domina.

;Ocupo algo mas de memoria a base de coordenadas, pero con esto se consigue un programa
;que se ejecuta mas rápido (o eso creo) al ir eliminando comparadores.

;Este es el borrador, ¿se puede acortar aun mas?. Lo intentare XD.

;Tabla para tratar de aclarar la resta de las coordenadas:
;Coordenadas X       SUM
;            0    +  253 = 253   CARRY descativado
;            1    +  253 = 254   CARRY desactivado
;            2    +  253 = 255   CARRY desactivado
;            3    +  253 = 00    CARRY activado
;            4    +  253 = 01    CARRY activado
;            .........
;            251  +  253 = 248   CARRy activado
;            252  +  253 = 249   CARRY activado
;            253  +  253 = 250   CARRY activado   
;            254  +  253 = 251   CARRY activado
;            255  +  253 = 252   CARRY activado
;
; En movimientos decrecientes (izquierda), el flag CARRy siempre se activa
;pero no cruzamos al otro lado .
;Cuando no se activa, es cuando cruzamos al otro lado y hay que tocar al MSB del sprite en cuestión

;Gracias a PASTBYTES por sus aclaraciones y orientaciones. 
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 27, 2015, 03:45:10
No está mal lo de tener valores negativos. Por ahora no lo voy a probar pero me imagino que así debería ser.

Llegado el momento miraré tu código.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Julio 27, 2015, 03:49:51
Creo que intentaré hacer un minijuego (que conociendome no se quedará en mini y a ver si lo termino :P)

Pero antes tengo que definir un poco más lo del CSDb_ES
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 27, 2015, 05:04:08
Bueno.
Aquí está el primer borrador de lo extraido de las enseñanzas de Pastbytes.

Solo manejo un sprite pero basta para comprobar el funcionamiento de la rutina.
Esta muy comentado todo, pero si necesitais alguna aclaración no hay problema.
No estaré al nivel de algunos cuando se explican (de 10) pero lo intentaré  ;)

Estoy con unos dias bastante complicados con el trabajo asi que no pude participar mucho ultimamente, entro y leo todos los dias pero en lo que respecta a codigo no me queda mucho tiempo para analizarlo o escribirlo. Cuando me libere un poco de trabajo atrasado podre colaborar un poco mas, porque en el ensamblador de 6502 estoy un poco oxidado, si tengo que escribir una rutina aunque sea corta siempre tengo que recurrir a los manuales y eso es lo que me toma tiempo. Yo por lo general para resolver un problema pienso en asm generico y luego segun con que procesador tenga que implementarlo, miro los manuales de esa plataforma para ver como "renderizar las ideas" a ese procesador/plataforma especificos.
Mientras tanto, como para experimentar un poco mas, podrias hacer que si mantienes presionado el disparo del joystick avances o retrocedas a distinta velocidad, por ejemplo al doble, la mitad, o lo que se te ocurra, como para probar la flexibilidad del codigo.  ;)
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 27, 2015, 08:04:53
Creo que intentaré hacer un minijuego (que conociendome no se quedará en mini y a ver si lo termino :P)

Pero antes tengo que definir un poco más lo del CSDb_ES

Eso, eso!!! Tu a trabajar en CSDB.es  ;)
Yo voy haciendo de todo. Traslado muebles, estudio electrónica, programo con el C64 e intento conseguir material para CSDB... y entre semana trabajo...  ::)

No sé de donde saco el tiempo.  ;D
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 27, 2015, 08:10:06
Estoy con unos dias bastante complicados con el trabajo asi que no pude participar mucho ultimamente, entro y leo todos los dias pero en lo que respecta a codigo no me queda mucho tiempo para analizarlo o escribirlo. Cuando me libere un poco de trabajo atrasado podre colaborar un poco mas, porque en el ensamblador de 6502 estoy un poco oxidado, si tengo que escribir una rutina aunque sea corta siempre tengo que recurrir a los manuales y eso es lo que me toma tiempo. Yo por lo general para resolver un problema pienso en asm generico y luego segun con que procesador tenga que implementarlo, miro los manuales de esa plataforma para ver como "renderizar las ideas" a ese procesador/plataforma especificos.
Mientras tanto, como para experimentar un poco mas, podrias hacer que si mantienes presionado el disparo del joystick avances o retrocedas a distinta velocidad, por ejemplo al doble, la mitad, o lo que se te ocurra, como para probar la flexibilidad del codigo.  ;)

Ensamblador "generico"... a duras penas voy asimilando el de Commodore  ;D

Esto se hace por pasión y diversión. Para nada te lo tomes como una obligación el examinarnos.

No sabes lo agradecido que estoy de encontrar un sitio donde aprender cosas nuevas y con personas que se lean un código y te orienten con ayudas solo por el placer de hacerlo.

Por eso cuelgo lo que voy haciendo/evolucionando , para que todos los noveles puedan sacar de ahí los pasos que les llevarán aun mas allá.

Si hubiera tenido estas ayudas en su momento quizás mi vida seria a dia de hoy muy distinta  ;)

Lo de controlar la velocidad por el disparo se puede hacer e incluso incluir las demás variables dentro de las que indican el valor a sumar para aprovechar aun mas la memoria.
Lo bueno de este sistema es que puedes sumarle lo que quieras a las coordenadas (dentro de un orden y sentido) que siempre funcionará el paso para conectar o desconectar el MSB del sprite deseado.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Julio 27, 2015, 10:42:40
Lo de ensamblador generico es porque no programo 6502, sino microcontroladores PIC, entonces me acostumbre a pensar en generico ya que todos los procesadores de 8 bits tienen mas o menos las mismas instrucciones basicas. Por ejemplo las comparaciones las pienso como si fueran IF, teniendo en cuenta que en asm todo se reduce a comparar igualdad, mayor o menor, o cero, entonces pienso la comparacion que tengo que hacer y luego veo como implementarlo en ese procesador. Se podria decir que lo compilo mentalmente, aunque no me sale de memoria el reemplazo de cada comparacion, siempre tengo que consultar el manual o copiar alguna otra similar que haya hecho antes, por eso aunque con este metodo puedo programar en lo que sea, me lleva mas tiempo hacer un programa. Sin embargo, lo bueno es que la documentacion queda muy bien porque lo que documento es lo que quise hacer en mas alto nivel, no el resultado en asm, es decir que suelo documentar cada bloque de 2 o 3 instrucciones. Pero cada cual tendra su metodo para programar, yo empece con 6502 en los 80s, y a principios de los 90s empece a programar PICs en asm, cosa que sigo haciendo, hace poco porte mi sintetizador de voz por soft para C64 a ordenadores con Z80 gracias a pensar en bloques logicos en lugar de en instrucciones, asi cada bloque seguia teniendo el mismo comentario en 6502 que en Z80, pero con distintas instrucciones y registros usados.
Un ejemplo de esto lo puse en el codigo que aparece en este mensaje:  http://retroinvaders.com/commodoremania/foro/index.php/topic,1080.msg12921.html#msg12921
En los comentarios se puede ver que comento todo, no dejo bloques muy largos sin comentar, pero que tampoco me pongo a detallar tanto, porque a veces el detalle aunque explica la razon de cada linea, oscurece lo que se pretende hacer. Hay veces en que se necesario el detalle linea por linea, por ejemplo en una rutina donde se hacen cosas con tiempos muy criticos y es necesario entender los tiempos de ejecucion, y otras donde basta con explicar de forma general lo que hace ese bloque, por ejemplo "copia tal bloque de memoria a tal direccion", "borra la pantalla", "inicializa y borra la pantalla de alta resolucion", etc.
En ese codigo de ejemplo use codigo automodificable para simplificar las cosas y ahorrar tiempo y memoria, como tenia muchos bucles donde se repetia mas o menos lo mismo y queria que tuviera un tiempo de ejecucion lo mas parejo posible, cargaba los valores directamente en el codigo, por ejemplo el numero de repeticiones de un bucle. A veces tambien "pokeaba" desde el codigo una instruccion de desplazamiento a la derecha o a la izquierda segun lo que necesitaba en ese momento, antes de ejecutar ese codigo modificado, y asi evitaba comparaciones y saltos que me hacian perder ciclos valiosos. Por supuesto que si no se hace bien puede ser desastroso, pero es una herramienta a tener en cuenta.
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Septiembre 13, 2015, 21:04:23
Hola, la rutina del Joystick que publique al inicio de este hilo ha ido evolucionando, he ido probando nuevas cosas y al final la rutina ya contempla música por interrupciones, sprites, colisiones sprite<>sprite, sprite<> carácter, pantalla alta resolución, scroll, un contador, con lo que se ha convertido en un minijuego completamente en ensamblador, el primero que programo.
Os lo adjunto para que le deis un vistazo, a ver que os parece.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Septiembre 13, 2015, 21:27:24
Hala, hala... lo que da una rutina de leer el joystick!! :D

Luego lo pruebo.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Septiembre 13, 2015, 22:18:20
Esta bién y es curioso , pero desconcierta el ver la pantalla de presentación donde muestra los coches en un sentido y al empezar el juego, van al contrario. Me he quedado todo descolocado  :D

Publicidad engañosa  ;D
Título: Re:Dudas en Ensamblador
Publicado por: riq en Septiembre 13, 2015, 22:26:34
@Laddh: es un buen comienzo!

Concuerdo con Maniako que la dirección de los autos confunden. Más natural sería que apunten hacia arriba.
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Septiembre 14, 2015, 10:56:12
@Maniako

La idea inicial era que fuese hacía arriba, de ahí la pantalla de inicio, pero haciendo pruebas me gustó más el scroll hacia abajo, es como más transgresor

@Riq

Gracias, la verdad es esto de crear algo te deja una gran sensación de satisfacción.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Septiembre 14, 2015, 16:03:14
Se a qué te refieres con lo de satisfacción. A mi me encanta aprender y encima poder dar forma a tus ideas en un programa para mi es fantástico.

Aunque últimamente me falta tiempo para todo  :'(
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 14, 2015, 23:15:03
Heey!,..ultimamente estoy petado de curro, pero en cuanto pueda vuelvo.
 
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Septiembre 18, 2015, 12:02:04
Hola Rulas, el tema de las colisiones lo gestiono con esta rutina:

Código: [Seleccionar]
V         = 53248 ;($D01E)

          JSR COL

COL    LDA V+30 ;TESTEAMOS SI HA HABIDO COLISIÓN ENTRE SPRITES
          AND #255
          CMP #3
          BEQ BOR
          CMP #5
          BEQ BOR
          CMP #9
          BEQ BOR
          CMP #129
          BEQ BOR
          CMP #33
          BEQ BOR
          LDA V+31 ;COLISIÓN SPRITE-CARACTER FONDO
          AND #1
          CMP #1
          BEQ BOR
          RTS

Cuando lo necesito llamo a COL, donde hago un AND de todos los sprites que quiero detectar si colisionan, en este caso todos. Luego simplemente con un CMP compruebo los sprites que colisionan sumando sus valores:

SPRITE0 SPRITE1 SPRITE2 SPRITE3 SPRITE4 SPRITE5 SPRITE6 SPRITE7
   1               2          4            8          16        32          64         128

Si quiero comprobar colisión entre spr0 y spr1 pues CMP #3, entre spr0 y spr3 CMP #9 y así con todos. Si esto sucede es cuando llamo a la rutina BOR donde incremento el color del borde pantalla, gestiono las vidas, etc. Por lo que he podido probar además es "PixelPerfect"

Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Septiembre 18, 2015, 14:03:15
Con esa rutina puedes saber que sprites están en colisión, pero no cuales están con cuales, ¿me equivoco?
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Septiembre 18, 2015, 14:42:35
Correcto, solo con el que haces el CMP, en mi caso solo busco colisión del sprite que manejo con el joystick. No se si sumando más valores en la comparación controlaría lo que dices, es cuestión de probar.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Septiembre 18, 2015, 16:21:54
Desde la ignorancia creo que se puede usar lo mejor de cada método.

Dejar que el VIC se encargue de detectar colisiones y sólo entonces hacer las comprobaciones por software.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Septiembre 21, 2015, 16:14:37
 Gracias Laddh, en breve me pongo con ello y te cuento dudas,...el tema de la colision de sprites es la ultima de las principales lagunas que me quedan por manejar y que quiero aplicar a Kabura, que por cierto sigo de Claustro trabajando y trabajando con el Proyecto aunque no lo parezca..

   Te cuento,...mandame un correo a retrogamesystes@gmail (tenia la tuya pero ya sabeis que soy un desastre) y te lo devuelvo con la ultima actualizacion de Kabura, que me molaría que la vieras y veras como está de mejorado el proyecto.

   Saludos.
   
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 01, 2015, 00:00:27
Con esa rutina puedes saber que sprites están en colisión, pero no cuales están con cuales, ¿me equivoco?

  Mientras cenaba he estado ojeando la rutina y como dices Carlos, dicha rutina no nos dice que Sprite colisiona con cual, pero creo que tampoco dicha circunstancia sea la funcion de ella,...como dice Laddh a él lo que le interesa es que le diga simplemente si ha habido colision sobre el sprite que controla con el Joy..
  La verdad es que la rutina ojeandola me parece muy interesante y sobre todo funcional en relacion a lo que quieres saber (si algo colisiono contra tu sprite/s, en cuanto tenga tiempo me enclastro y le doy prioridad uno a la hora de probarla y experimentarla en Kabura, creo que me puede venir perfecta para lo que yo quiero hacer que es reconocer si hay algun tipo de colision con el sprite/es que controlas con el Joy...

  En el fondo me maravilla como con un juego muy sencillo (pero muy jugable) has solucionado y manejado un tema/asunto (colision de sprites) que yo todavia no manejo incluso en juegos "digamos" mas complicados o complejos en su desarrollo, es por ello que en cuanto tenga tiempo con tu permiso experimentaré con tu rutina porque presiento que estoy a las puertas de dar un nuevo salto...

  De nuevo gracias y enhorabuena Laddh (dobles: una por la rutina y otra por Race), como digo estoy hasta el culo de curro pero en cuanto tenga tiempo me enclaustro a experimentar la rutina que en mi caso será comparando qué colisiona contra los sprites #0 y #1 que conforman el cuerpo de Kabura, luego extensible al sprite #2 que es el disparo de Kabura,..os cuento y como siempre...

   Saludos Ferreos!!

  P.D.: Laddh ya hemos contactado por mail, (aunque ya lo teniamos anteriormente) pero ya veras como dentro de algun mes te volvere a pedir el correo porque soy un desastre y siempre estoy muy liado,..por cierto Carlos a ver si te mando la ultima actualizacion de Kabura que va a toda cera y espero estrenar en el primer trimestre de 2016,..todavía me devato si descansar de todo esto una temporada o meterme en mi Proximo proyecto tras Kabura porque lo siguiente que tengo en mente quiero que sea algo muy gordo (pero que me llevara un año de trabajo como minimo, se estrenaria a finales de 2017) y tu Barón, creo que me dijiste que necesitas 3/4 Kb libres para la Music en Game (que este es otro tema a insertar y de hecho ya en Kabura)  a vosotros Bieno e Igor no os digo nada cacho Perros...

 

   

   

 
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 01, 2015, 00:09:54
  Ahora que lo pienso...Alakran, sigues vivo?,...en tus manos quedo La Carretera.
   
 
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Octubre 01, 2015, 12:17:41
Muchas gracias Rulas, y perfecto si puedes adaptar la rutina y cumple con tus necesidades.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 11, 2015, 21:10:00
 Laddh, hoy que tuve tiempo estube dandole cera desde por la mañana y llevo todo el dia,..he introducido la rutina en Kabura y va como,...LA SEDA!!,..comparo si algo ha colisionado con los Sprites 0 y 1 que son los del cuerpo de kabura con cualquier otro sprite de los enemigos, tambien comparo si el sprite 2 (disparo de kabura) ha impactado(matado) con algun enemigo...y esto va de la leche!!

  La rutina funciona perfecta y me soluciona y gestiona lo que queria hacer y aprender de una forma muy optima, creo que estoy ante un antes y un despues, parece mentira lo tanto que he conseguido con una rutina tan pequeña y tan modulable, recordad que yo antes hacia las colisiones cuando la coordenada X e Y estaban exacatas en coincidencia, era funcional pero muy chapucero,.las posibilidades que me ofrece esta rutina nueva son tremendas al simple contacto real de grafico con el sprite que sea...tengo que reconocer que estoy alucinando,..

  El funcionamiento es perfecto, el ahorro de bytes numeroso, reduccion de ciclos notable,..el caso es que antes me terminaba el juego sin problemas y ahora me cuesta trabajo llegar al Nivel 3,.ahora tengo que regular todo de nuevo (bendita suerte) ya que los ciclos se han reducido mucho y la colision es totalmente nueva y perfecta

  La verdad Laddh es que no se como agradecertelo,...hoy a habido un antes y un despues en mis conocimientos  y practicas, lo de manejarme en el tema de la colision tengo que reconocer que ya es un escaloncito mas..

  Aqui la rutina que utilizo en Kabura...compara lo que yo quiero y en funcion a la coincidencia hace lo que yo quiera...

   
Código: [Seleccionar]
; *****************
;     CONTACTO
; *****************
CONTACTO
V         = 53248
LDA V+30 ;TESTEAMOS SI HA HABIDO COLISIÓN ENTRE SPRITES
AND #255
CMP #9 ; COMPARA SPRITE 0 CONTRA SPRITE 3 1+8
BEQ FONO3
CMP #17 ; COMPARA SPRITE 0 CONTRA SPRITE 4 1+16
BEQ FONO3
CMP #33 ; COMPARA SPRITE 0 CONTRA SPRITE 5 1+32
BEQ FONO5
CMP #65 ; COMPARA SPRITE 0 CONTRA SPRITE 6 1+64
BEQ FONO6
CMP #129 ; COMPARA SPRITE 0 CONTRA SPRITE 7 1+128
BEQ FONO7

CMP #10 ; COMPARA SPRITE 1 CONTRA SPRITE 3 2+8
BEQ FONO3
CMP #18 ; COMPARA SPRITE 1 CONTRA SPRITE 4 2+16
BEQ FONO3
CMP #34 ; COMPARA SPRITE 1 CONTRA SPRITE 5 2+32
BEQ FONO5
CMP #66 ; COMPARA SPRITE 1 CONTRA SPRITE 6 2+64
BEQ FONO6
CMP #130 ; COMPARA SPRITE 1 CONTRA SPRITE 7 2+128
BEQ FONO7

CMP #12 ; COMPARA SPRITE 2 CONTRA SPRITE 3 4+8
BEQ DINA3
CMP #20 ; COMPARA SPRITE 2 CONTRA SPRITE 4 4+16
BEQ DINA3
CMP #36 ; COMPARA SPRITE 2 CONTRA SPRITE 5 4+32
BEQ DINA5
CMP #68 ; COMPARA SPRITE 2 CONTRA SPRITE 6 4+64
BEQ DINA6
CMP #132 ; COMPARA SPRITE 2 CONTRA SPRITE 6 4+128
BEQ DINA7
RTS

   Mil Gracias,..me vuelvo al Claustro.
 
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Octubre 13, 2015, 08:23:55
Perfecto! Deseando ver esos avances en Kabura.
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Octubre 15, 2015, 11:35:39
Una petición de ayuda, animado por el subidón moral que me ha proporcionado crear Race, me he embarcado en el segundo proyecto, Argos, aquí quiero que el sprite sea animado, pero no acabo de dar con una rutina satisfactoria.
De momento utilizo esto:

Código: [Seleccionar]
ANIMDER LDA 2040
        CMP #40
        BEQ UM1
        CMP #41
        BEQ UM2
        CMP #42
        BEQ UM3
        CMP #43
        BEQ UM4
        RTS
UM1     LDA #41
        STA 2040
        RTS
UM2     LDA #42
        STA 2040
        RTS
UM3     LDA #43
        STA 2040
        RTS
UM4     LDA #40
        STA 2040
        RTS

Cargo el puntero del sprite 0 y comparando le voy cambiando las 4 formas, pero el movimiento es muy alocado y poner retardos no mejora la sensación del movimiento. Llevo unos días estancado con esto y no doy con la rutina adecuada.
Rulas, la animación de Kabura esta muy bien, ¿Podrías comentar tú rutina de la animación aquí?
O cualquier guru del foro que ya tenga una rutina acabada y quiera comentarlo.

Saludos.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Octubre 15, 2015, 11:43:13
Yo usaria una variable y la iria incrementando.
Solo compararia cuando llegase a la máxima cifra y volveria a cero.

VarAnimSpritX = $3000 (una dirección libre de memoria)

                            inc VarAnimSpritX
                            lda VarAnimSpritx
                            cmp #4                ;Anim del 0 al 3 Si es mayor...
                            bne pasa
                            lda #00
                            sta VarAnimSpritX ;Bucle a cero

pasa                    A pegar puntero nuevo y a seguir

Lo he escrito de memoria en el curro, si hay fallos de sintaxis lo siento ;)
Título: Re:Dudas en Ensamblador
Publicado por: Portiella en Octubre 15, 2015, 12:07:04
El código de Maniako es el mas correcto, comparar con $40 para incrementar a $41, comparar con $41 para incrementar a $42, es muy mal método pero no porque no funcione, sino porque es mucho código.

Si la animación no va fina el problema es otro, diría que no sincronizas con el raster
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Octubre 15, 2015, 12:12:04
@Maniako

Prácticamente esa fue la primera que hice, y parecía funcionar, pero cuando mis hijos me hicieron de betatesters, moviendo el joy a 1000* hora de izquierda a derecha, el puntero sobrepasaba los limites y se perdía en las 255 formas posibles del sprite, por eso quite el INC y decidi acotar las posibles 4 formas.

Yo también lo escribo desde el curro, como nos enganchen... ;)
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Octubre 15, 2015, 12:16:49
@Portiella

El Raster, como las matemáticas, se que existen pero...;)



Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Octubre 15, 2015, 12:28:12
Pon el código machacado por tus betatesters a ver donde está el fallo.   ;)

Es decir, el primero que hicistes.
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Octubre 15, 2015, 12:47:50
@Maniako

Ya no lo tengo pero por lo que recuerdo debía ser algo así

Código: [Seleccionar]
ANIMDER INX
        LDA DERECHA,X
        STA 2040
        CPX #3
        BEQ RESET
        RTS
RESET   LDX #0
        RTS
ANIMIZQ INY
        LDA IZQUIERDA,Y
        STA 2040
        CPY #3
        BEQ RESET2
        RTS
RESET2  LDY #0
        RTS
       
DERECHA    BYTE 40,41,42,43
IZQUIERDA  BYTE 48,49,50,51

Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Octubre 15, 2015, 13:48:47
¿Con el resto del programa trabajas con los registros X e Y
y haces una llamada a las rutinas con un JSR. ?

Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Octubre 15, 2015, 15:04:54
Sí, todo son llamadas JSR. X e Y los guardo siempre en variables.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Octubre 15, 2015, 21:08:03
Por fin en casa.
No le veo nada raro. Deberia funcionar si realmente le cargas a X e Y los valores antes de saltar y los guardas al volver.


Creo que en el código anterior a estas funciones hace algo indebido.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 15, 2015, 22:48:02
 Así lo hago yo....

   
Código: [Seleccionar]
CICLO
LDA POINSP1 ; CARGA EL PUNTERO ASIGNADO A SPRITE #1, PIERNAS
CMP #$83 ; LO COMPARA CON ULTIMO FRAME PIERNAS HACIA LA DERECHA $83
BEQ BUCLE15 ; SI ES IGUAL MANDA A BUCLE15 Y CARGA EL PRIMER FRAME $80
INC POINSP1 ; INCREMENTE EN UNO EL PUNTERO DEL SPRITE #1 DE PIERNAS
...... ; CONTINUA PROGRAMA

BUCLE15 ; BUCLE NECESARIO PARA FRAME DE CICLO DE PIERNAS
LDA #$80 ; CARGA PUNTERO PRIMER FRAME DE SECUENCIA DE PIERNAS
STA POINSP1 ; APLICA AL PUNTERO DEL SPRITE #1
JMP CICLO ; VUELVE AL BUCLE QUE HACE LA ANIMACION DE PIERNAS

   Saludos.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 16, 2015, 00:05:17
 Cuando pongo listados en el Foro, intento hacer/incluir unas buenas explicaciones, mas que nada encaminadas a la gente que no conoce el Lenguaje o que puede interesarse por él en un furuto a medio plazo...

 Por cierto, yo al igual que Laddh estoy un poco Pichón en el tema del Raster, de momento no los utiizo y creo que tengo que manejarme en el tema, a ver si alguien que tenga conocimientos nos enseña de forma muy sencilla y para todos, que es, que hace y como utilzarlo en una rutina sencilla, yo la verdad es que agradeceria un poco de "luz" sobre el tema.

  Chao
 
Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Octubre 16, 2015, 13:02:41
Bueno, ya he encontrado el fallo, en realidad cualquiera de las rutinas era válida, el error era que incrementaba directamente el registro de la posición del sprite 2040 tanto para las 4 formas de la derecha como para las de la izquierda y claro era un caos, porque la rutina controlaba por un lado de 40 a 43 y por el otro de 48 a 51 y podía encontrarse los valores del otro rango cuando quería controlar el otro, y claro, se salía de madre.
El caso es que lo que he echo es crear dos variables Derecha, Izquierda y ahí es donde controlo el valor para poner en el puntero 2040.

Gracias y hasta la próxima.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 16, 2015, 15:45:46
El caso es que lo que he echo es crear dos variables Derecha, Izquierda y ahí es donde controlo el valor para poner en el puntero 2040.

  Asi es, tienes que hacer una rutina para el lado derecho y otra para el lado izquierdo y en cada una simplemente definir los limites de la secuencia de frames, yo en mi ejemplo veras en las explicaciones que te mostre que aplicaba a la rutina hacia la derecha..

  Animo con ese nuevo juego,..expectante me quedo!

 
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 28, 2015, 13:20:19
   He estado toda la mañana dandole al Hierro, me he dado cuenta que la rutina de colision de sprites me va perfecta pero me hace una cosa muy curiosa que produce un bug, ella misma se mete en un ciclo raro....explico:

  Decir que solo aplica al sprite 0, cuando el sprite 0 (sprite protagonista supongamos) es matado y digamos termina el juego, cuando el juego se resetea y vuelve a comenzar al principio, al volver a comenzar una nueva partida veremos que nada mas comenzarla el sprite 0 explota autotamaticamente como si hubiera colisionado con algo (todo comprobado y no hay nada),....el juego vuelve a resetearse y volvemos al principio y a comenzar una nueva partida y veremos que ahora no ocurre...

  Esto es asi en un ciclo de una vez ocurre y otra no cada vez que nuestro protagonista es matado y volvemos a comenzar una nueva partida,..al comenzar cada vez, una vez no pasara nada y otra colisiona contra nada,..asi una si y otra no y una si y otra no....

  Me he vuelto loco revisando todo, a ver si eran errores u olvidos en el listado que mal funcionaban pero nada,..es como si la rutina acaerrara algun valor que aparece una vez si y otra no cada vez que vuelvo a comenzar una partida...

   Seguire con ello...

Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Octubre 28, 2015, 16:12:29
Raro, prueba a leer el registro de colisión una vez antes de recomenzar. Creo que así se borrara.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 28, 2015, 21:09:24
 Creo que lo he soluciano (por lo menos ya funciona perfecto),...la rutina iba perfecta, era un pequeño asunto que me dejaba sin solucionar en las gestiones del programa,...me ha costado pero he dado con ello,...esto a veces es una lucha!!

   Chao.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Octubre 28, 2015, 22:19:42
Solo a veces?  ;)

Título: Re:Dudas en Ensamblador
Publicado por: Laddh en Octubre 29, 2015, 10:00:07
Y que lo digas! Estoy con un problema parecido en mi proyecto, cuando pierdo en el segundo nivel y vuelvo a comenzar "pierdo" un sprite al volver a jugar el primer nivel, y la rutina es exactamente la misma. En cambio volviendo desde los niveles 3 y 4 va bien. Y eso que tengo cuidado de borrarlo todo y volver a cargar como desde inicio, que a la primera pasada también lo hace bien. Maravilloso lenguaje ensamblador!!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Octubre 29, 2015, 19:49:47
Y que lo digas! Estoy con un problema parecido en mi proyecto, cuando pierdo en el segundo nivel y vuelvo a comenzar "pierdo" un sprite al volver a jugar el primer nivel, y la rutina es exactamente la misma

 Yo mas que parecido diría que el problema es exacto al que me pasaba a mi...

En cambio volviendo desde los niveles 3 y 4 va bien. Y eso que tengo cuidado de borrarlo todo y volver a cargar como desde inicio

  Aqui está el meollo del asunto,..en los siguientes niveles no te ocurre porque tras el reseteo de partida o inicio tras ser matado, los sprites fueron restaurados y los valores refrescados y no ocurre nada,...asi todo siempre todo depende de qué colisiono contra qué y si eso fue reconocido y manejado,...el caso es que el asunto se las trae..yo tambien utilizo una rutina que refresca, resetea y restaura todos los sprites pero no se porque aveces no funciona o hace su funcion exactamente...

  Con los demas sprites no me ocurria, cuando comparaba por ejemplo el sprite 1 (disparo) con todos los demas enemigos,..explotaban, sus posiciones eran RESTAURADAS y continuaba el juego,.en cambio cuando lo hacia con el sprite 0 (digamos el prota) las posiciones del sprite contra el que colisionaba no eran restauradas ya que a la hora de explotar simplemente le decia que lo hiciera sin saber contra que sprite habia colisionado,...es por ello que maneje dicha restauracion de sprite enemigo cuando nuestro sprite colisiona con el ampliando en cuatro lineas la rutina para saber contra que sprite habia colisionado y en ese momento restauraba la posicion del sprite enemigo antes incluso que la rutina que está encargada de hacerlo...

  Con esto consigo que las posiciones queden determinadas en todo momento y no me ocurre lo que me pasaba a mi y te ocurre a ti,...yo recomiendo restaurar (separar los sprites) las posiciones del sprite que colisiona con el que tu quieres saber en el mismo momento que se ha producido, por encima de rutinas porque sino, no se porque el valor quedara acumulado y aplicara aunque sea reseteada la partida..

  Buff,...vaya tomate,...yo de momento he conseguido que eso no me ocurra tras ayer un dia de batalla, en cualquier caso,..suerte!!

Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Noviembre 26, 2015, 23:12:37
  Pues tras siguientes revisiones y actualizaciones en Kabura, resulta que todavia me pasa alguna vez el tema de que cuando continuo tras ser matado me vuelva a hacer colision al volver a continuar,...creo que ya tengo localizado cuando pasa y es con el Sprite #7 que en algunos casos es el disparo enemigo y que no es restaurado convenientemente a otra posicion...

  La rutina de Laddh va como la seda pero es importante tras ocurrir la colision manejar la restauracion de sprites en todos los que participen en la colision porque si no quedan bien reseteados puede producir ese suceso que nos ocurria a Laddh y a mi..

  A ver si tengo tiempo y lo remato, pero como veras Laddh a mi todavia me ocurre, me queda alguna "coletilla" por ahi que corregir en el listado...

  Saludos
 
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Enero 24, 2016, 08:28:38
 Me voy a poner ya con la gestion de sprites por encima de la barrera de los 255 que practicamente es lo que le queda al juego mas una fase final de remates, detalles, etc,...antes de hacer lo de la gestion de sprites y ponerme con ello, me vienen dos dudas:

 - La primera: Imagino que la posicion $D01E (SPSPCL - SPRITE TO SPRITE COLLISION REGISTER) y que con la maravillosa rutina de Laddh (ya comentada en respuestas anteriores en éste hilo) funcionará igual tanto el sprite esté por encima o por debajo de la barrera de los 255,..yo creo que así sera...

 - La segunga: Tengo purulando los 8 sprites en pantalla, unos superaran la barrera y otros estando en ella ya superada volveran a la zona izquierda por debajo de los 255,...aqui el meollo pienso que será ligeramente mayor ya que solo querre actuar sobre un sprite concreto dependiendo de su posicion y cuando sea el caso,..llegue al limite de la barrera de los 255...

   Con lo cual,..supongamos el sprite #7 por ejemplo, que pasa de un lado a otro de la barrera, tendre que crear una rutina que le aplique a ese sprite, que detecte: 1º- si ha llegado al limite de la barrera, 2º- que reconozca en que lado de la barrera esta (si por debajo o por encima) y 3º que lo situe en un lado u otro segun donde este...
 
   Así en teoria y antes de meterme en pruebas, creo que esto se puede solventar asi:

 - Cargo en el acumulador la posicion $D010 (que incluye todos los registros de la posicion por encima o debajo de la barrera de todos los sprites en sus bits),...
 - En el ejemplo quiero saber donde esta el sprite #7, luego hago una comparacion con AND sobre el bit que controla el sprite #7 y cuyo valor es 128 (por ejemplo para el sprite #3 seria 8 ),...veo si es cero (esta por debajo de la barrera) o si es 1 (esta por encima de la barrera) y lo resuelvo por ejemplo con un BNE (que actuara si no es cero),...si esta por debajo lo paso a por encima de la barrera y si esta por encima lo paso a por debajo de la barrera y santas pascuas...

  A ver si luego tengo un huequito y muestro primera rutina sencilla de gestion a ver que pasa...

 
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Enero 24, 2016, 13:06:41
 Bueno tras una intensa mañana de Autentico combate con ganchos, corses e incluso algun golpe bajo contra las logicas y numeros Hexa,..(y no sin sufrimiento) ya he conseguido que el disparo de Kabura recorra a sus anchas la pantalla de extremo a extremo (me faltaba el lado derecho, superar los 255) hace la colision perfecta con cualquier sprite esté donde esté (incluso si se encuentra por encima de los 255) y han quedado delimitados los limites de pantalla del disparo (en especial por la derecha) llegados a los cuales el disparo se restaura para volver a ser disparado por Kabura desde su posicion Inicial....

  Todo Perfecto....

 Ahora lo siguiente hacer lo mismo con el comportamiento de los enemigos segun la teorica que expuse antes,..aunque tengo que probar que una cosa es la teorica y otra la tecnologia (conocimientos aplicados) y alomejor en la exposicion anterior es probable que tenga algun error de calculo,..

  Os cuento.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Enero 24, 2016, 13:47:14
Para activar el MSB simplemente voy sumando a X 1 hasta que desborda. Cuando eso pasa, activo el MSB de ese sprite.
A la inversa lo mismo pero desactivandolo.

Para eso va genial la idea que expuso Riq (creo). Usar coordenadas X2.
Me explico, usar una variable que contenga la posición X de un sprite y multiplicarla por 2. Si no desborda, no activas el MSB, si desborda, lo activas.
Este método tiene la pega de que el sprite se mueve de 2 en 2 pixeles, pero es perfecto para no complicarse la vida.

Yo uso un sistema algo mas malnacido. Para mover a la derecha, sumo $01 y para mover a la izquierda sumo $FF. Al ir hacia la derecha, no desborda hasta que es mayor de $FF (ahí activas el MSB y pasa al lado derecho).
Para la izquierda es algo mas lioso. Siempre desborda excepto cuando Acu tiene el valor #$00 y le sumas #$FF. Ahí (cuando no desborda) pasamos a desconectar el MSB de ese sprite y X pasa a ser #$FF
Hay código de ejemplo sobre esto en este mismo hilo. Colgué el código fuente.

Naturalmente, con estos método tienes que controlar los márgenes y evitar que "den la vuelta".

Como es habitual en mi, me explico fatal  ;D. Si necesitas que aclare algún punto me lo dices sin tapujos.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Enero 24, 2016, 15:17:33
 Yo la verdad es que lo hago muy parecido al tuyo,...sumo 1 a X tanto a derecha como a izquierda,..cuando desborda por la derecha activo MSG y cuando llega a 0 desactivo MSG en dicho Sprite...

 El lio viene cuando tienes que controlar los margenes de pantalla (como bien dices) dependiendo de donde ésta el Sprite para que no "de la vuelta" y otro pequeño lio mas viene cuando el sprite tanto Protagonista como Enemigo es eliminado y tiene que ser restaurado a su posicion inicial o de comienzo de comportamiento dependiendo también de donde murio...

 El caso es que esto es lo bonito del ensamblador,..que una misma cosa 1000 personas distintas lo pueden hacer de 1000 formas distintas para llegar al final al mismo punto,..es como una pizarra en blanco que tu vas rellenando y mientras vas aprendiendo cosas del Sistema...

 A mi lo que me alucina es que todo tiene una secuencia o recorrido de programa totalmente LOGICO,..a veces no hay errores o mal funcionamientos, sino erratas en la logica de actuacion (y no me refiero a las logicas AND, ORA, EOR) ,..quiero decir,..rutinas correctas pueden no funcionar si no respetan la Logica natural en el recorrido del Programa...

 Lo de la gestion de sprites enemigos lo dejare para otro dia libre, que hoy ya he tenido bastante con lo del Disparo de Kabura y el combate librado ésta mañana,..en cualquier caso...

   AL HIERRO!!

Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Enero 24, 2016, 19:50:45
  Buff!!,..en el tema del disparo de Kabura todo va bien, su comportamiento por encima y debajo de la barrera y la colision con los enemigos esten donde esten,...veo que tengo una coletilla por resolver ya que si el enemigo eliminado esta por encima de la barrera no me restaura el disparo correctamente,..pero  bueno ya lo vere otro dia...

  Cambiando de tema,...ya he comenzado a gestionar los Enemigos por encima o debajo de la barrera,..tengo un pequeño problemilla con una rutina que me MEDIO funciona bien,..os cuento a ver si me podeis ayudar o detectais el fallo o lo que hago mal,..os cuento:

  Supongamos el Sprite #5, queda posicionado en X=60 a la derecha de la pantalla por encima de la barrera de los 255, el sprite queda posicionado asi:
Código: [Seleccionar]
        LDA $D010 ; CARGA VALORES DE MSIGX
ORA #%00100000 ; POSICIONA SPRITE 5 POR ENCIMA DE BARRERA
STA $D010 ; APLICA A MSIGX Y SPRITE 5 SUPERA BARRERA
LDA #60 ; CARGA VALOR 50 COORDENADA X
STA SP5X             ; APLICA A X SPRITE 5

  Ahora pongo en funcionamiento la sencilla rutina que decrementa X del Sprite #5 y comienza a moverse hacia la izquierda,...notad que cada vez que decremento 1 en X, llamo a la rutina RAJI para que chequee posicion de X y actue según se encuentre X.
Código: [Seleccionar]
DEC SP5X
JSR RAJI
RTS

  La rutina RAJI consiste en lo siguiente:
Código: [Seleccionar]
RAJI
LDA SP5X                 ; CARGA X DE SPRITE 5
CMP #0                 ; REVISA SI HA LLEGADO A 0
BEQ RAJI2
RTS
RAJI2
LDA MSIGX ; CARGA POSICION DE JOY
AND #4 ; COMPARA CON VALOR ABAJO
BNE RAJI3                         ; SI NO ES CERO ACTUA
; EL SPRITE ESTA POR ENCIMA DE LA BARRERA
LDA $D010
EOR #%00100000           ; CARGA VALOR SPRITE O ENCENDIDO
STA $D010 ; APLICA A $D010, POR ENCIMA DE 255
LDA #255 ; CARGA VALOR 255 COORDENADA x
STA SP5X                          ; APLICA A X SPRITE 5
RTS
        ; EL SPRITE ESTA POR DEBAJO DE LA BARRERA
RAJI3
LDA $D010
ORA #%00100000          ; CARGA VALOR SPRITE O ENCENDIDO
STA $D010 ; APLICA A $D010, POR ENCIMA DE 255
LDA #60 ; CARGA VALOR 60 COORDENADAS DE XAIN
STA SP5X                         ; APLICA A X SPRITE 5
RTS

  Funciona pero no del todo,...vereis que en RAJI lo primero que hace es cargar la posicion de X del sprite #5 si compara si es 0, si no vuelve pero si es cero actua, ya que ha llegado al borde de la barrera de los 255 (si esta por encima de ella) o si ha llegado al borde izquierdo de la pantalla (si esta por debajo de ella), es entonces cuando manda a RAJI2...

  En RAJI2 carga el valor de MSG y compara con la Logica AND sobre el Bit con valor 4 que aplica al Sprite #5,..y compara con un BNE si no es 0 el resultado, con lo cual el programa sigue su curso, el sprite esta por encima de la barrera y con un EOR aplicado a MSG el Sprite se situa por debajo de la barrera de los 255 (aplicando X=255) y vuelve con RTS,....

  Aqui el malfuncionamiento,...si en la comparacion de RAJI2 cuando carga MSG y con el AND me da como resultado que es 0, eso quiere decir que el sprite ya se encontraba por debajo de la barrera,..salta a RAJI3 devolverlo a su posicion inicial, es decir, por encima de la barrera con un ORA al bit correspondiente y aplica 60 a X del sprite #5,....

  La Historia es que en RAJI3,..la subrutina me devuelve el sprite por encima de la Barrera pero no se porque leches no le aplica la posicion 60 a X,....sino que le aplica la 255 y por mas que hago no lo soluciono,...voy a parar y a cenar y a despejarme, que llevo un dia que tengo la cabeza ya machacada.

 Me contais.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Enero 24, 2016, 21:46:18
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.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Enero 24, 2016, 23:34:32
  Interesantisimo lo de que no intente controlar tanto todo y deje mas las cosas a su curso!!

    ahora me voy a meter en la cama y me quedare dormido escuchando algun capitulo nuevo de "Obsesion por el cielo" en Ivoox (os lo recomiendo encarecidamente) que hoy entre la programacion todo el dia y lo de crear las cuentas nuevas en Facebook ya tengo la cabeza como un Patatal!!

   Lo estudio y te cuento,...Gracias Maniako!!
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Enero 25, 2016, 08:44:59
  Interesantisimo lo de que no intente controlar tanto todo y deje mas las cosas a su curso!!


A su curso no o no funcionará nada :D

cuando me encuentro con un problema donde hay que hacer un numero elevado de "IF THEN" para tomar una decisión, suelo hacerme una tabla de la verdad. Pongo todas las situaciones posibles que se pueden dar y busco el patrón. Para eso tengo una pizarra veleda ;)

En el proyecto del HEAD-ON que intento crear, para mover los coches enemigos tenia que analizar 16 posibles.

Con la tabla de la verdad lo resumí en 2 con algo de preparación mínima antes.

Da perspectiva sobre un problema que parece complicado y lo vuelve mas simple o sencillo de implementar.

Con esto intento decir que a veces , una rutina de control que parece complicada, se puede resumir a lo básico haciendo tu programa mas sencillo , corto y rápido con solo un poco de preparación y reflexión.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 19, 2016, 23:48:04
 Estoy a cañon en Kabura con el tema de la Gestion de todos/8 Sprites por encima o debajo de la barrera de los 255, gestionar su comportamiento, restauracion y mas cosas, es un autentico girigai, yo ahora estoy experimentando mucho con esto y a la vez aprendiendo y disfrutando...

 En respuestas anteriores en relacion a este tema se hablo que esta muy bien utilizar la Logica ORA para superar la Barrera y EOR para ponerla por debajo (lado mas izquierdo) y se veian que funcionanban perfectamente,..eso sí, cuando la logica de comportamiento es esa, que pase de abajo a arriba (se da por entendido que está abajo) y de arriba a abajo (se da por entendido que esta arriba),..pero, que ocurre? cuando no se sabe ni se da por entendido donde estan?...

 En ese caso vemos que la Logica EOR, que tan bien nos ha venido para trastadar un Sprite de arriba a abajo (cuando se daban por seguras las posiciones iniciales antes del paso) ahora dicha Logica no nos es tan efectiva en el momento que el Sprite sobre el que queremos actuar se tiene que posicionar abajo, cuando ya estaba abajo...vemos la logica...

                                     "Uno u otro pero no ambos"
  EOR 1 1 > 0   
          1 0 > 1
          0 1 > 1
          0 0 > 0

  Como digo la logica va perfecta cuando quiereremos restaurar un enemigo (en este caso el Sprite #6) al lado izquierdo de la pantalla, si le meto un 1 a ese Bit funciona bien si el Sprite estaba por encima de la barrera (1 1 > 0),..pero funciona mal si el Sprite estaba ya por debajo de la Barrera ( 0 1 > 1),..como veis el resultado es 1 con lo que pone a nuestro Sprite por encima justo lo contrario de lo que queriamos...

  Experimentando y analizando he visto y he hecho una prueba,...utilizar el AND para mis objetivos,..hemos visto lo que pasa cuando queremos trasladar un sprite concreto al lado izquido (por debajo de la barrera) con el EOR,..funciona bien si el Sprite estaba por encima, si ya estaba por debajo mal funciona, se necesita algo que tanto este por encima como por debajo haga lo que queramos (en esta ocasion que se posicione hacia la izquierda,..valores 0..

  Un ejemlo de como he experimentado esto,...supongamos un enemigo, el Sprite #6 que se encuentra por encima de la Barrera de los 255 y que queremos que pase al lado Izquierdo por debajo de la barrera, pero recordemos que a su vez tenemos los otros siete Sprites purulando por la pantalla superando y bajando la barrera a su libre movimiento y no queremos que nuestra actuacion altere sus comportamiento,,.con un EOR lo hariamos asi:

   LDA $D010
   EOR #%01000000
   STA $D010

 Esto funciona si el Sprite #6 pasa de arriba a abajo,..si ya se encuenta arriba, pero cuando estando abajo hace el paso de abajo a abajo,...mal funciona!,..da 1 (ya lo explique antes y es lo que no queremos, sino que que 0 y se posicione a la izquierda/por debajo de la barrera),...para solventarlo he utilizado la Logica AND,..y ahora la escribo al contrario pero obtengo unos resultados muy efectivos que tengo que experimentar mas,..aqui lo mismo hecho con AND:

   LDA $D010
   AND #%10111111
   STA $D010
         
 Recordemos que la Logica AND funciona asi:

                                       "ambos"
  AND 1 1 > 1   
          1 0 > 0
          0 1 > 0
          0 0 > 0

   Con lo cual si aplicamos 1 lo dejara como esta tanto arriba como abajo sobre los Sprites que no queramos actual y aplicandi 0 tanto esté arriba como abajo,..se posiconara hacia abajo 0 que es lo que queriamos...estoy probando y probando cosas y funcionamiento,..os seguire contando y me contais como lo veis...

    Saludos.



 
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Febrero 20, 2016, 00:49:03
Se supone que uno debe verificar donde esta el sprite antes de hacer algo, si tu ya sabes donde esta, y estas seguro de que en este momento esta cruzando la barrera para cualquiera de los dos lados, EOR funciona siempre, porque no hace mas que invertir los bits a los cuales le apliques un 1 en la mascara. AND se suele usar para colocar ceros en los bits que uno quiera, y OR para colocar unos.
Si el programa empieza a tener cierta complejidad, con muchos enemigos y disparos en movimiento, no te va a quedar mas remedio que chequear el valor del bit correspondiente para saber donde esta cada sprite.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 20, 2016, 00:57:03
Si el programa empieza a tener cierta complejidad, con muchos enemigos y disparos en movimiento, no te va a quedar mas remedio que chequear el valor del bit correspondiente para saber donde esta cada sprite.

 Así es Pastbytes y de hecho eso ya lo gestiono con un gran numero de mini subrutinas que lo operan,..el asunto, es trasladar un sprite desde el lado derecho al lado izquierda (estar por debajo dela barrera) y que no sepamos en que lugar (si por encima o por debajo) se encontraba en el momento de hacer.o..

 Como he dicho antes EOR no nos da el resultado que queremos cuado no sabemos donde estaba el sprites (ya que si ya estaba por debajo nos da el resultado contrario que es 1 (por encima)), sin embargo parece que un AND lo soluciona ya que esté arriba o abajo lo pondra abajo 0 (que es lo que queremos en éste caso), entendido queda que de esa gestion se encargas unas mini subrutinas por sprite que lo gestionan el arriba o abajo segun se encuente,..como sabes la historia es qué utilizar en dichas subrutinas, si el EOR o el AND en el caso que nos ocupa..

  Seguimos hablando....y gracias por tu colaboracion siempre al cañon.

Título: Re:Dudas en Ensamblador
Publicado por: Jeff en Febrero 22, 2016, 14:20:03
R Tape Loading error
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 22, 2016, 15:39:46
 Simplemente.....Gracias Jeff!!!, tus palabras son dulcura para mis oidos (perdon ojos al leerlo) y gracias de nuevo por el encomio, la verdad es que le dedico a esto mucho,..mucho mas de lo que la gente se imagina, quizas (y aveces pienso) esto es lo que me hace estar fuera (pero dentro) de la Escena en España,...digamos que llevo un rollo especial y particular.

 Pongo un ejemplo y termino,...de la semana pasada, el lunes hasta las tres y media de la madrugada, el martes hasta pasadas las dos de la madrugada y el miercoles ya puse record,..hasta las cuatro y cuarto de la mañana...la gente muchas veces no sabe ni entiende ni comprende lo que hay detras de todo esto (lo cual no me da derecho a mis despotriques) pero si es verdad que influyen en mi actitud fruto del sacrificio que mentalmente queda tras horas y horas de lucha con el ASM.

  No tengo remedio!

 
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Febrero 22, 2016, 16:04:10
Si quieres aprender a programar, dormir es absolutamente necesario.

La de veces que me he quedado encallado y al día siguiente , con la mente fresca y renovada, te das cuenta de tu error . Aveces es garrafal y/o simplemente tonto . Te obsesionas y dejas de ver el conjunto.

Dormir y unas buenas palomitas al lado. ESENCIAL!!  ;)

Y si... le pones muchas ganas y eso es lo mejor.


Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 22, 2016, 22:09:32
 No lo podias haber explicado mejor Maniako, a mi me ha pasado muchas veces,....tras horas y horas y nocturnidad llega un momento que la mente se ofusca y empiezas a darte contra la misma pared una y otra vez y a tropezar con la misma priedra de igual forma...

 Al dia siguiente te levantas y lo que eras imposible de hacer ofuscado, de repente lo haces magistralmente en un momento,..es curioso.

  Saludazos a todos.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 22, 2016, 23:08:35
Solo falta que a lo largo del año incluyas música y efectos InGame

  Desde el 2010, primero me meti a los Gráficos, luego al Basic, luego al Ensamblador y tengo que reconocer que el tema de la Musica es mi gran carencia hoy en dia,..también te digo que llevo cinco años pidiendo ayuda o mini listados en Ensamblador y todavia estoy esperando respuesta, por desgracia no podre tener esas cosas en Kabura,..sí habrá Efectos pero sencillos aunque abundantes, ya no me da tiempo al tema del Music in game porque sino se retrasaría mucho el Estreno ya que eso me llevaría un estudio detallado de todos los libros relacionados con Musica y Sonido en Boomjack Commodore (http://www.bombjack.org/commodore/)..

  Pero prometo que para el siguiente proyecto (que nos gustaría estrenar tambien en 2016) el tema de la Music in game y super efectos será lo primero a aprender, porque tarde o temprano tras graficos y ensamblador algun dia tendre que "tocar" el sonido.

   No me enrollo mas y me vuelvo al Claustro.
Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Febrero 23, 2016, 09:24:45
Solo falta que a lo largo del año incluyas música y efectos InGame

  Desde el 2010, primero me meti a los Gráficos, luego al Basic, luego al Ensamblador y tengo que reconocer que el tema de la Musica es mi gran carencia hoy en dia,..también te digo que llevo cinco años pidiendo ayuda o mini listados en Ensamblador y todavia estoy esperando respuesta, por desgracia no podre tener esas cosas en Kabura,..sí habrá Efectos pero sencillos aunque abundantes, ya no me da tiempo al tema del Music in game porque sino se retrasaría mucho el Estreno ya que eso me llevaría un estudio detallado de todos los libros relacionados con Musica y Sonido en Boomjack Commodore (http://www.bombjack.org/commodore/)..

  Pero prometo que para el siguiente proyecto (que nos gustaría estrenar tambien en 2016) el tema de la Music in game y super efectos será lo primero a aprender, porque tarde o temprano tras graficos y ensamblador algun dia tendre que "tocar" el sonido.

   No me enrollo mas y me vuelvo al Claustro.


Habría que diferenciar entre generar música o sonido desde programa y reproducir un fichero SID donde ya tenemos una melodía generada con algún player.

Esto último (reproducir un fichero SID) es muy sencillo, mucho más de lo que parece. Yo aprendí con Lobo y me sorprendí de lo fácil que resulta.

Antes de nada hay que entender lo que es un SID, no es únicamente un fichero que contiene información de la melodía, sino que también tiene una rutina reproductora embebida, es decir, no tenemos que programar un player que lo reproduzca sino simplemente llamar a esa rutina de forma periódica. Como podéis imaginar, para llamar a esa rutina usaremos las interrupciones.

Antes de nada usemos un programa tipo sidplay2 para abrir un SID a nuestra elección, por ejemplo, la música del prisionero compuesta por Baron Ashler:

Citar
Filename:        ThePrisonerSFX.sid
Data size:       2711 bytes
File type:       PlaySID one-file format (PSID)
File status:     No errors
Name:            The Prisoner
Author:          Ron Grainer
Released:        Arranged by Baron Ashler
Load range:      $1000-$1A96
Init address:    $1000
Play address:    $1003
Number of songs: 1
Default song:    1
SID model:       6581
Clock speed:     PAL
Reloc region:    Auto

De ahí sacamos tres datos fundamentales para poder reproducir nuestro SID, el Load Range (donde debemos cargarlo), el Init address (dirección que hay que llamar para inicializar el SID) y el Play address (donde está la rutina que lo reproduce).

Vamos ahora a picar unas cuantas líneas de código (yo programo en KickAss):

Código: [Seleccionar]
.pc = $1000
.import c64 "musica.dat"

con esto lo que estoy haciendo es cargar el fichero SID a partir de la dirección $1000 de memoria (porqué esa dirección? pues por la información que nos proporciona el propio SID, recordad el Load Range).

Código: [Seleccionar]
lda #$00 // numero de pista
jsr $1000 // init music
sei
lda #<irq1
sta $0314
lda #>irq1
sta $0315
asl $d019
lda #$7b
sta $dc0d
lda #$81
sta $d01a
lda #$80
sta $d012
cli

con esta parte lo que estoy haciendo es seleccionar la primera pista del SID (si tuviera varias) y a continuación llamar (saltar) a la posición $1000 que es donde se encuentra la rutina de inicialización del SID (recordad la Init address).

Posteriormente estoy preparando la rutina raster que se encargará de llamar periódicamente al player embebido en el SID.

Código: [Seleccionar]
irq1:
asl $d019
jsr $1003 // play music
pla
tay
pla
tax
pla
rti

y con esta rutina raster (que llama a la dirección $1003 donde está el player, recordad la Play address) reproduzco el SID. Fácil verdad?

Lo he contado todo rápido y muy resumido pero espero que se entienda.
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Febrero 23, 2016, 09:33:25
Una duda: ¿porqué en $1000?, y si allí uno ya tuviera otra cosa? No se puede poner en otra dirección?
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Febrero 23, 2016, 09:53:41
Por poner, puedes ponerla donde quieras adaptando la rutina, pero por tema de manejo de pantallas, es uno de los mejores lugares donde ponerlos.

Título: Re:Dudas en Ensamblador
Publicado por: Carlos en Febrero 23, 2016, 12:10:40
Una duda: ¿porqué en $1000?, y si allí uno ya tuviera otra cosa? No se puede poner en otra dirección?

En $1000 porque la melodía se ha creado con un tracker que la sitúa ahí. Si la quieres situar en otro lado, el encargado de hacer la música (Baron Ashler seguro que de esto sabe más) tiene que crearla desde el tracker ya preparada para esa dirección.
Título: Re:Dudas en Ensamblador
Publicado por: Zub en Febrero 23, 2016, 12:41:23
Hola tocayo,

Añadiría como detalle que algunas rutinas echan mano de variables de zero-page que habría que tener en cuenta. No sé hasta qué punto esto se suele documentar... Yo integré un SID de Cadaver en mi proyecto para probar, y me daba errores. Viendo la documentación suya, su rutina de SID usaba 2 variables de zero-page que mi programa utilizaba para otra cosa (con el correspondiente conflicto). Creo que con goattracker usan las mismas siempre.

Respondiendo a lo de $1000, con algunos tracker se puede "reubicar" la rutina para colocarla en cualquier zona de memoria. Si el código tiene llamadas a variables absolutas, no se puede cambiar la posición de la rutina SID alegremente.

Saludos
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Febrero 23, 2016, 12:50:17
Que cosa mas rara... siempre pensé que el tema de la música eran sólo datos que luego había que pasarle al SID y nada más... :O
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Febrero 23, 2016, 13:11:15
Es mas o menos asi, solo que se hace indirectamente llamando a una rutina que interpreta notas y tiempos musicales, asi como efectos. La rutina se llama 50 o 60 veces por segundo segun el modelo de C64 (PAL o NTSC), en PAL serian 20 milisegundos entre cada posible nota, como las notas suelen durar mas, hay que contar interrupciones para saber donde activar o apagar el canal correspondiente del SID para tocar la nota. Tambien el SID determina la nota en un numero que indirectamente establece la frecuencia, mientras que el .sid se suele componer usando notas musicales, la rutina tambien tiene que adaptar la nota a frecuencia. Y ademas de eso, hay efectos que se suelen usar y que no estan implementados en el hard del SID, por decir alguno que se me viene a la memoria, algun efecto de deslizarse de una nota a la siguiente, tocando las frecuencias intermedias, eso lo haria la rutina reproductora tambien por soft.
En definitiva, la rutina lo que hace es interpretar los parametros que estan en un formato comprimido y mas compatible con valores musicales (octava, nota, instrumento, tiempos, efectos, etc.), convertirlos en los valores adecuados para "pokear" en el SID, y lo hace en la llamada a interrupcion mas conveniente para respetar los tiempos de la composicion.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 23, 2016, 14:57:54
  Buff!!,...gracias a todos, en especial a Carlos,..dadme un poco de tiempo para digerir los datos y os cuento, esta semana estoy apurado con el curro, pero el finde lo tengo libre y me enclaustrare a cañon!
 
  Chao

Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 24, 2016, 23:22:32
 En funcion a lo que hablamos de la Gestión de todos los Sprites por encima o por debajo de la Barrera de los 255, ya he cambiado en todas las subrutinas el EOR por el AND y esto funciona como la Seda, tengo que reconocer que lo veo todo purulando por toda la pantalla y me quedo Flipado viendolo, ..he dado un gran salto.

  Quizas pienso que he perdido una costumbre que me puso Madonna Makk II y era la de utilzar los TAX, TAY,TXA y TYA, los programadores me vais a matar pero os puedo asegurar que no los utilizo lo cual supone y muchas veces pienso que ocurre que juego al liminte de "sobrecargar" el Acumulador..

  En cualquier caso,...buenos resultados con Kabura, estoy a cañon para terminarlo, en breve seguimos hablando del sonido y las melodias, este finde lo veo...

  Chao.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 28, 2016, 11:55:50
 Una pregunta tonta Carlos,..la rutina de reproduccion de Musica que has puesto recientemente (y que tengo que probar en cuanto tenga un hueco) sirve para poder meter Music in Game o es solo para reproducir un SID?,..si sirviera para lo primero y aplicada a Kabura sería la leche!.

   
Título: Re:Dudas en Ensamblador
Publicado por: danytoon en Febrero 29, 2016, 16:05:21
He estado jugando un rato al juego y me parece un GRAN avance sobre el Xain...

Sólo hecho en falta tal vez un poco de mejora en el grafismo de los decorados, y un scroll doble le vendría de perlas, quedaría realmente pro... Por lo demás... todo perfecto... supongo que su baja dificultad es porque toda´via esto es un WIP... (ya que, por ejemplo ahora puedes pasar de los enemigos aéreos todo lo que quieras)
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Marzo 01, 2016, 00:24:57
  Hi Dany!

El tema del avance en relación a Xain es lo mas interesante del asunto,..creo que ha sido monumental y eso es lo importante: Control de colision de Sprites, Movimiento de Scroll y gestion de superion de 255...poco a poco en cada Proyecto seguir avanzando y aprendiendo...

  Para graficos de decorados he utilizado el paquete de chars de 2K por defecto modificado,..quitale numeros, letras y no es tanto, he tenido que estirarlo mucho ya que son siete Niveles, en el proximo proyecto solo seran tres niveles y podre aprovechar mas chars para enriquecer los niveles,..gracias por el comentario de estas cosas se aprende,..importante es que por primera vez he mostrado y movido un Scroll, de momento humilde pero que espero mejorar en el futuro.

  Me gustaria que me explicaras que es un Scroll doble, ..porque aunque no lo creas no se que es y me ha dejado muy interesado y con curiosidad por el tema, a veces soy un desastre y muchas cosas las desconozco o mejor dicho voy aprendiendo por el camino...

  El tema de dificultad ahora no esta definido, sigue en construccion, pero a corto plazo me interesara cuando esté termnado un Testeo entre los habituales en relacion a este sentido,...el nivel de dificultad!.

   Thanks!



 
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Marzo 01, 2016, 00:43:11
 Dany, voy a modificar la Pantalla de Credito y te voy a incluir en Asistentes, porque eres un Apoyo!,..y tambien incluiré a Jose (que siempre ha estado al igual que Bieno) porque sino no me lo perdonaría a mi mismo nunca...

   
 
 
Título: Re:Dudas en Ensamblador
Publicado por: danytoon en Marzo 01, 2016, 01:08:25
Pues pon "Asistente: Commodoremania Crew" y yasta hombre... a mí el que aparezca mi nombre en cosas no me... nome :) Fíjate que no firmo ni los libros que publico xD
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Marzo 01, 2016, 01:24:20
 Imagino que así es, en el fondo no es mas que el detalle, lo importante es estar al Hierro, te pondre como Dany Quest,...que sino se me desmadra de Chars!,...ja,jajaaj,...aparte, tú tienes que estar, que eres una Base Angular de todo esto.

Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 27, 2016, 10:48:00
 Buenas,,...en Kabura hacia la reposicion de un sprite eliminado mediante las Logicas ORA, EOR y AND,...partia de la base de que no sabia si estaba por encima o debajo de la barrera y dependia de donde lo queria situar si por debajo o por encima...

 Las Logicas no me funcionaron mal, pero no dieron el resultado que yo queria como vereis en alguna reposicion en Kabura que crearon un bug,...en el nuevo Proyecto quiero hacerlo de otra forma...

 Lo que voy a hacer es que el sprite me diga donde esta,...si por encima o por debajo, de esta forma sencilla ya no voy a ciegas y el manejo es mucho mas sencillo que si me encomiendo a Logicas,..si esta abajo lo pongo arriba o lo mantengo abajo y si esta arriba lo pongo abajo o lo mantengo arriba,..esto se traduciria en que tomo la accion que quiero (lo situo donde quiero) tras chequear las posiciones 0 y 255 de X de dicho sprite, me dice donde esta y lo pongo donde quiero...

  Pero como me dice el sprite donde esta?, si arriba o abajo, voy a utilizar la posicion $D010 para ello y leere (chequeare el estado) solamente del bit que yo quiero (bit correspondiente al sprite que yo quiero) con lo cual se el resultado es 0 esta por debajo, si el resultado es 1 esta por encima...

  Para leer el bit correspondiente voy a utilizar ASL (desplazamiento hacia la izquierda) o LSR (desplazamiento hacia la derecha), pongamos un ejemplo para el sprite#2,....con lo cual...

     LDA $D010                    ; CARGO POSICION QUE CONTROLA ASUNTO
     ASL                                ; DESPLAZO EL ACUMULADOR UN BIT A LA IZQUIERDA
     ASL                                ; DESPLAZO OTRO BIT EL ACUMULADOR HACIA LA IZQUIERDA
                                           ; AHORA YA ESTOY SOBRE EL BIT QUE CONTROLA EL SPRITE 2
     BCS  ARRIBA                  ; HACE COMPARACION, SI ES 0 ESTA ABAJO Y MANDA A SUBRUTINA ARRIBA
                                           ; QUE SITUA POR ENCIMA DE BARRERA
                                           ; SI ESTA POR ENCIMA CONTINUA PROGRAMA CON LO QUE QUIERA.....POR
                                           ; EJEMPLO PONGO EL SPRITE 2 POR DEBAJO
     LDA $D010
     AND #%11111011         ; CARGA VALOR SPRITE O ENCENDIDO
     STA $D010                     ; APLICA A $D010, POR ENCIMA DE 255
     RTS

ARRIBA
        LDA $D010
   ORA #%00000100      ; CARGA VALOR SPRITE 1 ENCENDIDO
   STA $D010         ; APLICA A $D010 Y PONE SPRITE 2 POR ENCIMA
        RTS

   Todo esto es teoría ya que no lo he probado,..os pregunto,..sería factible, la metodologia es correcta?

         Saludos a Todos.
Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 27, 2016, 11:04:37
Lo más sencillo seria:

        LDA $D010        ;Valor bits del BMS. (conecta o desconecta la barrera de los 255
        AND #$XX         ;Le preguntas si el sprite xx esta conectado (>255)
        BEQ conectar

        bla,bla,bla

Si tuvieras los bits 10010010 e hicieras ASL , te llevarias por delante los valores que quieres leer.

Ahora estoy en el trabajo, en casa me lo miro. Nunca recuerdo de memoria los mnemonicos y sus funciones y a que banderas del carry afectan.
 
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 27, 2016, 11:15:41
 Ok,...lo vemos luego, gracias.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 27, 2016, 12:46:10
te llevarias por delante los valores que quieres leer.

  No entiendo bien ésta frase, imagino que te refieres a que si quiero resultar el valor de varios bits, con los LSR y ASL me va mal, ya que solo puedo operar sobre un bit concreto, ademas con los LSR y ASL es mas trabajoso para la maquina ya que tiene que desplazarse sobre el byte y buscar el bit concreto que si por el contrario se le mete el valor directo, que para el Sprite#2 seria el numero 7....

  Quedaria entonces asi:

        LDA $D010        ;Valor bits del BMS. (conecta o desconecta la barrera de los 255
        AND #$07         ;pregunto estado de bit para sprite 2
        BEQ conectar    ;si el resultado es 0 mando a conectar y activo especifico con ORA
                                 ;
         ........                ; el resultado es 1 y el sprite 2 esta por encima

  Lo dicho,...luego lo vemos..


Título: Re:Dudas en Ensamblador
Publicado por: Maniako en Julio 27, 2016, 12:58:21
Me refiero a que si quieres consultar el bit del sprite 2 (℅00000100 #4), un AND #$4 te devolverá activado.

Si lo desplazas 2 veces pasa a ℅00010000 que es #16
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 27, 2016, 14:49:38
Ok,...creo que lo pillo, me habia dado un lapsus con la comparacion del numero ya que yo metia $07 para #0, #1 y #2 a la vez,...es $04 solo para Sprite #2

Con lo cual mas o menos se quedaría así:

        LDA $D010        ;Valor bits del BMS. (conecta o desconecta la barrera de los 255
        AND #$04         ;pregunto estado de bit para sprite 2
        BEQ conectar    ; no esta activado luego esta por debajo

 Luego ya lo pruebro y me peleo en listado compilandolo y te cuento....mil gracias.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 27, 2016, 14:57:15
 Si consigo gestionar el asunto de la Barrera en todos los sprites con cuatro rutina sencillas y logicas como la ultima mostrada seria un avance importante, porque lo hacia con unos cambalaches de rutinas personales que la flipas,..no se ni como funcionaban, por no hablar de los ciclos que consumian...
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Julio 27, 2016, 17:42:36
Vale,...va como la seda!!, para para pasar de un lado a otro de la barrera...mil gracias Maniako!!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Diciembre 31, 2016, 11:55:50
Buenos dias y ya de paso...Feliz año 2017 que hoy es dia 31, dicho esto....

  estoy de busqueda de listados de efectos de Audio por la red,...estoy ahora con las de Codebase64,..hay dos rutinas principales que contenen varios efectos peor por mas que pruebo y pruebo no soy capaz de hacer que ningun efecto suene,..llevo toda la mañana con esto y ya estoy desesperado...

http://codebase64.org/doku.php?id=base:sound_fx_routine#test_harnessasm

   A ver si me podeis ayudar....y otra cosa...

 Alguien sabe como con alguna pequeña rutinilla puedo hacer que una musica se escuche durante el juego, si pudiera hacer que las musicas de Baron sonasen durante el juego serie un gran salto...

  Gracias a todos.
Título: Re:Dudas en Ensamblador
Publicado por: riq en Diciembre 31, 2016, 17:01:58
que contenen varios efectos peor por mas que pruebo y pruebo no soy capaz de hacer que ningun efecto suene,..llevo toda la mañana con esto y ya estoy desesperado...

¿que probaste y que resultados te dió?
estaría bueno que postees el código que usaste.


Alguien sabe como con alguna pequeña rutinilla puedo hacer que una musica se escuche durante el juego, si pudiera hacer que las musicas de Baron sonasen durante el juego serie un gran salto...
¿sabes usar los IRQ? (el vector que esta en $0314/$0315)
Porque es lo que deberías hacer.
Aca hay un buen articulo acerca de como usarlo: http://dustlayer.com/c64-coding-tutorials/2013/4/8/episode-2-3-did-i-interrupt-you
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Diciembre 31, 2016, 18:33:13
 Saludos Riq, los listados los ves en el enlace (copie y pegue lo que supuse) y los resultados ya los he dicho...en relacion a las IRQ ni se lo que son y creo que no las habre utilizado nunca, mirare la pagina.

   Gracias,...así todo si alguien cuando tenga tiempo me puede dar mas luz se lo agradezco.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Diciembre 31, 2016, 22:10:24
Me parece codigo un poco complejo como para empezar a experimentar con sonido, porque esta preparado para emitir varios sonidos a la vez y asignar los 3 canales segun los que esten disponibles, como es mas complejo de lo normal puede costar un poco entender como modificarlo.
Convendria hacer unas rutinas propias para generar efectos simples, y en los juegos asignar siempre los mismos canales a los sonidos, por ejemplo los sonidos del protagonista en el canal 1, los de los enemigos en el 2 y 3, podria ser el canal 2 para disparos de los enemigos y el 3 para las explosiones o sonidos de cuando muere alguno.
Como dice riq, vas a tener que usar interrupciones, dispararias algun efecto de sonido "pokeando" alguna direccion con cierto valor, y luego el efecto se reproduciria en paralelo a la ejecucion del juego.
El 6510 tiene dos interrupciones, una IRQ que es enmascarable, es decir que se puede activar o desactivar, y una NMI que siempre se procesa, porque no se puede desactivar.
En el C64 estas interrupciones estan conectadas a varias fuentes que las generan, en el caso de la NMI por ejemplo, la tecla RESTORE la genera directamente, pero tambien puede ser disparada por una de las CIA.
Cuando ocurre una señal de interrupcion, el 6510 termina la ejecucion, coloca el contador de programa en la pila (como si saltara a una subrutina con JSR), coloca el registro de estado en la pila, y luego salta a una direccion especifica para procesar la interrupcion. La IRQ y la NMI tienen direcciones distintas en la ROM, esto esta diseñado asi en el 6510, Commodore en lugar de hacer las rutinas fijas en ROM, lo que hizo fue poner codigo que salta segun vectores de interrupcion almacenados en RAM, de esta manera nosotros podemos alterar esos vectores y hacer que las interrupciones se desvien a nuestras propias rutinas.
Por ejemplo es posible "anular" la tecla RESTORE, cosa que hacen algunos programas como medida de proteccion, haciendo que salte a una rutina propia que no haga mas que retornar inmediatamente, dando la impresion de que se anulo la NMI. Tambien hay juegos que alteran ese vector para que vaya a la pantalla de arranque del juego al presionar RESTORE.
Pero la interrupcion mas util es la IRQ, ya que esta puede habilitarse o deshabilitarse por medio de instrucciones del 6510. La instruccion SEI deshabilita las interrupciones, y CLI las vuelve a habilitar.
Esta interrupcion en el C64 se dispara 50 veces por segundo por medio de un timer que la ROM configura en una de las CIA al arrancar, y tambien tiene un vector con la direccion de la rutina en la ROM que procesa la interrupcion. En el C64 esta rutina se encarga entre otras cosas de leer el teclado, del parpadeo del cursor, y de actualizar la pantalla. La direccion de la rutina es $EA31.
Cuando quieres que algo se ejecute en "multitarea", por ejemplo una rutina para que toque un SID en paralelo con la ejecucion de un juego, lo que tienes que hacer es desviar el vector de interrupcion a la rutina que reproduce el SID. Normalmente las rutinas de reproduccion de SID estan diseñadas para llamarse en la IRQ, por lo que no deberia ser dificil ponerle musica a un juego, solo hay que ver donde se almacena el SID en memoria, inicializar las interrupciones y el SID al arrancar el juego, y despues controlar la reproduccion con las rutinas del propio SID, que suele tener rutinas para comenzar o detener la reproduccion, o seleccionar un numero de tema (si el SID tiene varios).
Lo mas simple en cuanto a sonido seria que en la pantalla de inicio des la opcion de tener musica durante el juego, o efectos de sonido, no creo que sea una buena idea tener ambos simultaneamente porque eso complicaria las cosas. Para poder reproducir efectos mientras suena la musica habria que hackear el reproductor de SID, y eso requiere entender bien su funcionamiento.
Lo que habria que hacer es tener una rutina de generacion de efectos de sonido y el reproductor de SID, y desviar la interrupcion a la rutina que corresponda segun si el usuario selecciono musica o fx. Para no complicar el juego, el programa siempre deberia disparar los efectos de sonido, y la rutina deberia detectar si esta seleccionada la musica o los efectos, si estan los efectos se reproducirian, si esta la musica simplemente se ignoraria, pero no habria que modificar el codigo del juego.
En cuanto a la IRQ, ademas de generarse 50 veces por segundo (cada 20 ms aproximadamente), se puede disparar en determinadas lineas de la imagen, esto es mas comun en juegos porque en el C64 normalmente se dispara en cualquier parte de la pantalla, y el codigo de la interrupcion puede a su vez ser interrumpido por el VIC. En cambio si deshabilitas la generacion de IRQ por timer (que es la que ocurre por defecto) y la reprogramas para que la dispare el VIC en determinada linea de la imagen, puedes asegurarte de que se dispare en un momento en que el VIC no interrumpa la ejecucion, por ejemplo durante el dibujado del borde inferior de la pantalla.
Espero que esto te haya dado una idea sobre de que se tratan las interrupciones, hay mucho mas para ver al respecto.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Enero 01, 2017, 05:20:25
Tuve que salir y me quedaron pendientes algunos detalles. La idea de las interrupciones es que el procesador pueda atender un evento urgente lo mas rapido posible. Al detectarse una señal de interrupcion, el procesador termina de ejecutar la instruccion actual, almacena en la pila el contador de programa y el registro de estado, y salta a la ROM, donde esta la rutina que lee el vector, y salta a la direccion apuntada por el. Entonces la rutina que atiende la interrupcion debe almacenar los valores de A, X e Y, sea en la pila o en otra parte de la RAM, ejecutar el codigo correspondiente a la interrupcion, y antes de salir, volver a cargar A, X e Y con los valores guardados, para luego retornar. Una vez que se retorna, con la instruccion RTI, el procesador vuelve a restaurar el valor del registro de estado y el contador de programa, y continua la ejecucion exactamente donde tenia que ejecutar cuando fue interrumpido. El programa principal entonces no sabra que fue interrumpido, ya que todo estara como antes (A, X, Y, y las banderas del registro de estado), lo unico que habra cambiado es que se habra perdido tiempo.
El codigo en la interrupcion debe ser corto, por empezar debe tomar menos tiempo que el intervalo entre interrupciones, por ejemplo la interrupcion de lectura del teclado que se ejecuta 50 veces por segundo, se dispara cada 20 milisegundos, por lo cual la ejecucion de la rutina deberia tomar menos tiempo que ese, de lo contrario se perderia la siguiente interrupcion.
Tambien, si el codigo de la interrupcion tarda demasiado en ejecutarse, hara mas lenta la ejecucion del programa principal. Si este programa ejecuta por ejemplo algun bucle para esperar cierta cantidad de tiempo, hay que tener en cuenta que las interrupciones incrementaran este tiempo, porque mientras estamos en la rutina de interrupcion no se continuara ejecutando el bucle de espera del programa principal, sino que estara congelado hasta terminar la interrupcion.
Ahora si creo que mas o menos quedo completa la idea general, aunque fue una explicacion superficial. Las interrupciones no son tan complicadas, pero requieren mucha planificacion antes de ponerse a programar, aunque asi suele ser el asm.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Enero 01, 2017, 09:26:26
 Jodo Pastbytes,..esto si que es dar luz y lo demas son tonterias,...he estado también chequeando en enlace de riq y parece muy interesante,...voy a preparar un ejercicio en el que un sprite simplemente se mueva por la pantalla a ver si soy capaz de que se escuche la musica mientras se mueve...

 Yo en Kabura y en lo nuevo los efectos de sonido no los hice con interrupciones, es simplemente un listado pequeño que contiene un efecto muy corto de sonido (para que no retarde mucho la accion) y que era llamado con un simple JSR, pero claro, mientras el ordenador llama a esa rutina no hace otra cosa, solo eso...

 Bueno, voy preparando el listadito del ejercicio chequeando la pagina de Riq y os seguire dando un poco la macrata a ver si consigo hacerlo..

 En cualquier caso siempre muy agradecido porque me dediqueis un poco de vuestro tiempo,...saludos
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Enero 01, 2017, 09:34:26
Me parece codigo un poco complejo como para empezar a experimentar con sonido, porque esta preparado para emitir varios sonidos a la vez y asignar los 3 canales segun los que esten disponibles, como es mas complejo de lo normal puede costar un poco entender como modificarlo.

 Esto que dices es muy importante, es mejor primero entender el porque y aplicar el conocimiento en algo sencillo para ir entendiendolo,...como digo, voy a ir haciendo un listadito en el que cargo por ejemplo la musica de Kabura y por otro lado muevo un sprite,...ahora hara una cosa o la otra,..ya me direis que pequeña rutina le pongo para que haga las dos cosas a la vez...

 Hoy me pongo con ello,....os cuento y adjunto cuando tenga el listado.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Enero 01, 2017, 12:57:02
 Bueno,..ya estoy aqui otra vez,...ya he hecho un pequeño listado en el que se muestra un sprite en pantalla (una flecha) que discurre de izquierda a derecha horizontalmente por la pantalla,...algunas cuestiones antes de entrar en materia:

1- si yo cargo algo en memoria con .INCLUDE,...el ordenador me lo pondra al final del listado en memoria, no?,..y si utilizo .BINARY me lo pondra en la posicion que yo le diga, por ejemplo *=$2000 y me lo fija en dicha posicion.

2 - he incluido en el listado (aunque no se escucha la musica de Kabura), viendo las propiedades del archivo SID de Baron veo que lleva insertado que lo carga en la posicion $1000,...yo lo cargo en el programa con:
*=$1003                  ; FIJA MUSICA EN ESA POSICION
.BINARY   KABURA.SID         ; CARGA LA MUSICA
 La duda: ¿esto tiene que ser así,..si o si, si en las propiedades me fija la posicion $1000 o puedo cargarlo en la posicion que yo quiera?

  Bueno, preguntado esto,...en esta respuesta adjunto el listado del programa, vereis que cargo las fuentes (chars), sprites y la musica y tambien cargo el archivo CONSTANTES.ASM que contiene el standar de Etiquetas Internacional (mas usado y standar para todo el mundo y su comprension) donde se le da nombre a posiciones en Hexa que controlan distintas cosas en memoria,.. configuro parametros, muestro el sprite y creo un bucle que lo mueve en pantalla, al principio del listado vereis que estan activadas las interrupciones...

Código: [Seleccionar]

; **************************************************************************
;    EJERCICIO PARA APRENDER INTERRUPCIONES MUSICA/MOVIMIENTO DE SPRITE
; **************************************************************************


.INCLUDE "CONSTANTES.ASM" ; PAQUETE DE CONSTANTES ESTANDARS A TODA LA COMUNIDAD
; QUE CARGO APARTE
*=$0801 ; INICIA PROGRAMA EN ESA POSICION
.WORD NEXT,10 ; CREA LINEA EN BASIC E INICIA CODIGO MAQUINA
.NULL $9E,^START ; "SYS START" (START=INICIA CODIGO MAQUINA)
NEXT .WORD 0 ; FIN BASIC
;
*=$2000 ; FIJA SPRITES EN ESA POSICION
.BINARY SPRITES.BIN ; LOS CARGA
FRAMES .BYTE 0 ; VIDEO FRAMES COUNTER
FRAMES2 .BYTE 0 ; VIDEO FRAMES COUNTER
;
*=FONTS_END ; CARGA PAQUETE DE CHARS SEGUIDAMENTE DEL LISTADO EN LA MEMORIA
;
*=$1003 ; FIJA MUSICA EN ESA POSICION
.BINARY KABURA.SID ; CARGA LA MUSICA
; ACTIVA O DESACTIVA INTERRUPCIONES
; SEI                       ; DESABILITA INTERRUPCIONES
START ; HABILITA INTERRUPCIONES

; PARAMETROS INICIALES
; LIMPIA PANTALLA
LDX #0 ; CARGA VALOR
LDX #$00 ; CARGA VALOR
BUCLE4 ; INICIO DE BUCLE
STA $800,X
STA $8FF,X
STA $9FE,X
STA $AFD,X
INX
CPX #255 ; TOPE DE ESPACIO
BNE BUCLE4 ; SI NO ES IGUAL VUELVE A BUCLE
; NO REPITE TECLA
LDA #$7F
STA $28A
; DESCONECTA TECLADO
LDA #$00
STA CIDDRA ; DATA DIRECTION REGISTER A
; COLOR PANTALLA
LDA #$00 ; NEGRO
STA EXTCOL ; APLICA A BORDE DE PANTALLA
LDA #$00 ; NEGRO
STA BGCOL0 ; APLICA A PANTALLA
; FIJA MODO TEXTO
LDA #$12
STA $D018
LDA #$1B
STA $D011
LDA #$18 ;ACTIVA MODO MULTICOLOR DE CHARS
STA $D016
; FIJA PUNTERO DE GRAFICO DE SPRITE 0
LDA #$80 ; CARGA EL PRIMER GRAFICO DE SPRITES
STA POINSP0 ; APLICA A SPRITE #0
; ACTIVA MULTICOLOR SPRITES
LDA #$FF ; CARGA VALOR 255 QUE CORRESPONDE A TODOS LOS SPRITES
STA SPMC ; APLICA A SPRITE MULTICOLOR REGISTERS
; SPMC ES UNA CONSTANTE FIJADA EN CONSTANTES.ASM
;
; CONFIGURA PARAMETROS DE SPRITE 0 QUE SERA MOSTRADO EN PANTALLA
; COORDENADAS X E Y
LDA #100 ; VALOR PARA X
STA SP0X ; APLICA A X SPRITE 0
LDA #100 ; VALOR PARA Y
STA SP0Y ; APLICA A Y SPRITE 0
; MULTICOLOR 1 Y 2 COMUNES A TODOS LOS SPRITES
LDA #$07 ; AMARILLO
STA SPMC0 ; MULTICOLOR 1
LDA #$06 ; AZUL
STA SPMC1 ; MULTICOLOR 2
; DA COLOR A SPRITE 0
LDA #$01 ; CARGA BLANCO
STA SP0COL ; APLICA A SPRITE 0
; MUESTRA EL SPRITE EN PANTALLA
LDA #$01 ; CARGA VALOR PARA SPRITE 0
STA SPENA ; APLICA A SPRITE ENABLE, POSICION QUE GESTIONA ENCENDIDO SPRITES
; Y MUESTRA DICHO SPRITE EN PANTALLA
;
;
; MENU PRINCIPAL
MENU
INC SP0X ; INCREMENTA UN PUNTO COORDENADA X DE SPRITE 0
JSR TIME ; LLAMA A LA RUTINA DE TIEMPO CUATRO VECES PARA CREAR UN RETARDO
; QUE RALENTICE EL MOVIMIENTO DEL SPRITE PARA QUE SEA VISIBLE
JSR TIME
JSR TIME
JSR TIME
JMP MENU ; VUELVE AL BUCLE DE MENU Y VUELVE A MOVER SPRITE

; RUTINA DE TIEMPO
TIME
LDX #$FF ; CARGA EN X EL VALOR 255
CICL
DEX ; DECREMENTA X
BNE CICL ; SI NO ES IGUAL A 0 VUELVE AL BUCLE DE TIEMPO Y SIGUE DECREMENTANDO
; SI ES IGUAL A CERO SALE DE BUCLE Y CONTINUA PROGRAMA
RTS ; RETORNA


; FUENTES LETRAS
*=$4000
.BINARY "FONTS.BIN" ; BANCO DE CARACTERES
FONTS_END

  Vereis tambien que pongo muchas explicaciones, lo suelo hacer siempre que subo codigo al foro para que la gente que no se maneja en ensamblador por lo menos pueda interpretar minimamente lo que esta viendo...

  Hecho todo esto,..partimos de cero y despacito y explicando lo que vayamos a hacer,...ahora solo falta que se escuche la musica mientras se mueve el sprites,..os lo dejo aqui y tranquilamente cuando tengais tiempo veis el listado y le podeis agregar la rutina que necesite de interrupciones...

  Como siempre,...mil gracias por vuestra ayuda.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Enero 01, 2017, 13:42:36
  Hago una parentesis para romper una lanza muy en favor de tí, Pastbytes, te vuelvo a agradecer los dos ladrillos que me has puesto en los que me explicas que son y que hacen las interrupciones y por haber empleado tu seguro que valioso tiempo en ello...
  Es como si yo quiero ir a Honolulu y no se donde esta honolulu,..lo primero sera enseñarme donde esta para saber hacia donde ir, todo lo que no sea eso son dar palos de ciego, el ensamblador entrraña su dificultad en el aprendizaje por lo sencillo que es,.pero es muy importante saber que vas a hacer y porque
  Te encomio mil veces y lo que tu haces no lo hacen todos los Programadores,..yo valoro un programador no por los conocimientos que tiene, sino por la capacidad y sobre todo el interes que tiene de transmitirlos a gente Amateur que se interesa por la programacion
  Yo no soy mas que un simple Carnicero y la Informatica en temas de programacion es algo dificil y desconocido para mi y todo lo que he aprendido y he hecho a sido mas por el corazon y la fuerza y empuje que le pongo que por otra cosa...
  Por desagracia en estos ultimos 5 años he padecido a muchos programadores que si,..saben muchisimo de ensamblador pero que ni quieren ni saben transmitir sus conocimientos y que adolecen de un cierto altruismo y en muchos casos van de sobraos....
 Pero por suerte hay gente como tu,..y te repito,...gracias por transmitirme tus conocimientos y sobre todo por saber explicarlos tan bien hacia gente que no sabe.

    Chao
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Enero 01, 2017, 22:34:37
Ando en mil cosas, en particular en estos dias estudiando el estandar MIDI para simplificar que mi chip sintetizador de voz cante a partir de un archivo MIDI, por lo que poco tiempo tengo para otras cosas, pero hago algunas aclaraciones a tu codigo, no lo vi detalladamente, pero hay cosas que faltan.
En primer lugar, el binario de la musica tiene que cargarse exactamente en la direccion que se especifica, no puedes correrlo porque es codigo asm y no va a funcionar en otro lugar. Cuando cargas un SID en un reproductor, este te da la informacion de la direccion de carga, y me parece que tambien se puede saber las direcciones de las rutinas para comenzar o detener la reproduccion, de esto no estoy seguro porque no suelo escuchar o trabajar con SIDs. Pero el asunto es que los SIDs son codigo asm +  datos, deben cargarse donde el autor (o el player, porque muchas veces se usa un reproductor estandar) lo especifica, y se debe llamar a las rutinas definidas para cada funcion.
Otro tema es que no basta con usar las instrucciones SEI o CLI para manejar las interrupciones, como habia explicado, hay un vector de interrupcion, en la IRQ cuando salta a la ROM, ejecuta un codigo que hace que salte a la rutina apuntada por el vector en $314 y $315, en esas dos direcciones se encuentra contenida una direccion de 16 bits que dice donde se encuentra la rutina que procesara la interrupcion.
Como habia mencionado, la rutina que procesa la interrupcion en el C64 esta en $EA31, si te fijas, el vector esta en $314, esto es 788, ahi esta el byte bajo del vector, y en 789 el byte alto. Prueba en el C64 a hacer PRINT PEEK(788) y PRINT PEEK(789), los valores que encontraras son 49 y 234. Esto en hexadecimal es $31 y $EA, que es justamente la direccion de la rutina en la ROM, $EA31. Si tu quieres desviar la IRQ a una rutina digamos en la direccion 49152 ($C000), lo que tienes que hacer es colocar $00 en $314 y $C0 en $315, aunque previamente tienes que deshabilitar las interrupciones, para evitar que justo se ejecute una en medio de los dos "pokes", y luego volverlas a habilitar una vez que coloques esos dos bytes.
Tu rutina de interrupcion en $C000 debe guardar los contenidos de A, X e Y, si es que vas a alterar, y antes de retornar debe restaurarlos, lo que se suele hacer es en lugar de retornar, saltar a $EA31 para que se ejecute la lectura de teclado de la ROM, de lo contrario no habra nada que lo lea, salvo que quieras implementar tus propias rutinas de lectura.
Deberias mirar esa web que paso riq, porque ahi explica la parte tecnica de como implementar una rutina de interrupcion, yo solo explique los conceptos basicos para que se entendiera mejor cuando leyeras algo mas al respecto.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 10, 2017, 22:32:26
 Buenas a todos,..ya está el pesao otra vez....

   Todos los juegos que he hecho siempre han sido en formato .prg pero tengo que reconocer que me atrae mucho hacer uno en formato .d64,..osea en disco,..para mi es desconocido pero a la vez necesario para lo proximo que quiero acometer,..me surgen algunas preguntas en relacion a este formato:

 - Imagino que me permitira hacer un juego multicarga?
 - Podría mostrar varias bitmaps, no?
 - Seria posible tambien en cada carga refrescar (cargar uno nuevo) el banco de chars, para tener asi mas variedad?

    Como siempre mil gracias por vuestra ayuda!
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 10, 2017, 22:46:08
  Es muy probable que me meta en algo gordo y voy a necesitar toda la ayuda posible,...ya cuento con Laddh,...Maniako, también cuento contigo.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Febrero 11, 2017, 05:22:55
Los prg tienen en la cabecera la direccion de carga de los datos binarios que siguen, asi que pueden contener programas o datos y la carga con LOAD ,8,1 se hace en esa direccion automaticamente. Uno podria tener una pantalla, un juego de caracteres, sprites o lo que sea e ir cangandolos por separado en cualquier momento. Si quieres alterar la direccion de carga de un prg solo tienes que usar un editor de disco o un editor hexadecimal en el PC y modificar los dos primeros bytes, sin alterar lo demas.
Un D64 no es mas que una imagen con prg adentro, tambien se pueden poner otros tipos de archivos como seq, rel, pero con prg ya puedes hacer todo lo que necesitas en un juego.
Para cargar desde asm hay que llamar algunas rutinas preparatorias de la ROM y despues una para cargar el prg, no es complicado de hacer, asi de memoria habia rutinas para especificar el nombre del archivo, otra para abrir el archivo y otra para cargar, ya hace años que no lo hago asi que no me acuerdo los detalles pero es bastante simple.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 26, 2017, 11:19:36
   Una pequeña duda,...supongamos que tengo un grafico montado en una pantalla con Chars,..todos ellos en modo multicolor,..imagino que con un Raster podría cambiar la configuración a modo Hires en  la linea que yo quisiera,..pero y aqui viene la pregunta....

  ¿Podría poner en modo Hires, chars concretos sin tener que hacerlo en toda la linea?

   Chao
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Febrero 26, 2017, 14:45:43
  ¿Podría poner en modo Hires, chars concretos sin tener que hacerlo en toda la linea?

Sin meterse en historias de interrupciones, hay una opción que mola bastante, se trata del modo que permite usar caracteres hires y MC al mismo tiempo, pero por usarlos de esa manera se limitan la cantidad de colores o algo asi.

Pregunté sobre este modo en el foro de CEZ, mira: http://computeremuzone.com/forum/viewtopic.php?t=4371
Una pena que falten las imagenes, las explicaciones de Wood siempre muy bien.
Título: Re:Dudas en Ensamblador
Publicado por: pastbytes en Febrero 26, 2017, 15:11:42
Si, tengo entendido que el modo multicolor ya permite eso, ahi dice que depende de que colores uses pero yo nunca probe eso.
Con interrupciones se podria disparar pero tendrias que hacerlo en cada linea, y no se puede tener la precision para activar un caracter particular, por la poca velocidad del 6510 y porque hay lineas en las que el VIC ademas lo interrumpe para acceder a la memoria de video. Normalmente con las interrupciones de barrido se hacen efectos verticales, por lineas enteras.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 26, 2017, 22:42:07
   Si no me equivoco por lo que me decis, la cosa está un poco complicada,..sí se puede hacer un barrido a la linea completa pero no por chars concretos,..dentro de lo malo, yo lo que quiero hacer es en una linea (pero a lo horizontal) sobre unos 16 chars que van seguidos cambiarlos de multicolor a Hires,..lo que no sabía que el barrido lo hace a la vertical lo cual lo pondría mas dificil,...me tengo que informar mas de este asunto,.

   A ver si hago un paron entre juego y juego (porque es que no termino uno y empiezo otro (no tengo remedio)) y me dedico a aprender cosas nuevas, que me quiero poner a cañon con ellas que basicamente son los rasters y las interrupciones,..Mil gracias a los dos por vuestra información, en especial a tí Jose por ese enlace que me has dejano en spanish,..lo voy a visitar fijo e incluso es muy probable que me registre para tambien lanzar dudas que toda ayuda siempre es poca.

  Por cierto Jose (y permiteme el O.T.),..de entre tantos y tantos programas de Astronomia que escucho de todo el mundo por Ivoox, destaco uno buenisimo que se llama "Desde el sur" que realiza Ricardo Sanchez (Argentino) y que es Monumental!!

   Saludos Ferreos a todos y hasta la proxima duda....

Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Febrero 26, 2017, 22:57:31
por ese enlace que me has dejano en spanish,..lo voy a visitar fijo e incluso es muy probable que me registre para tambien lanzar dudas que toda ayuda siempre es poca.
No vale la pena, que el foro de CEZ murió hace mucho tiempo ya, una pena.
Seguro que por aquí puedes preguntar el tema!

  Por cierto Jose (y permiteme el O.T.),..de entre tantos y tantos programas de Astronomia que escucho de todo el mundo por Ivoox, destaco uno buenisimo que se llama "Desde el sur" que realiza Ricardo Sanchez (Argentino) y que es Monumental!!
Me lo apunto, que el tema me interesa.
Título: Re:Dudas en Ensamblador
Publicado por: R. INTERNATIONAL en Febrero 26, 2017, 23:11:49
 Jolin que pena lo del foro,..con lo que fue Computer Emuzone en su momento,....y otra mala noticia, en su ultimo Programa Ricardo Sanchez se despide despues de 11 años y casi 470 programas, pero nos ha dejado un legado tremendo que estudiar a los amantes del tema, te dejo la liga y que los disfrutes.

   http://www.ivoox.com/podcast-podcast-desde-sur-explorando-cosmos_sq_f15085_1.html

    Chao
Título: Re:Dudas en Ensamblador
Publicado por: josepzin en Junio 12, 2017, 18:16:52
Por si no estais al tanto, @mscifu sigue con su blog de desarrollo de un juego en ensablador, explicando capítulo a capítulo cómo resolver las distintas cosas que componen un juego:

Recargas de combustible – parte 3 (final)
https://mscifu.wordpress.com/2017/06/12/recargas-de-combustible-parte-3-final/