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

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #360 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.
 
« última modificación: Julio 27, 2016, 11:46:33 por Maniako »
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #361 en: Julio 27, 2016, 11:15:41 »
 Ok,...lo vemos luego, gracias.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #362 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..



Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #363 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
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #364 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.
« última modificación: Julio 28, 2016, 01:18:25 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #365 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...

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #366 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!!

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #367 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.

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Dudas en Ensamblador
« Respuesta #368 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

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #369 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.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 534
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #370 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.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 534
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #371 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.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #372 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

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #373 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.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #374 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.