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

Maniako

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

R. INTERNATIONAL

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

« última modificación: Enero 24, 2016, 15:19:42 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #332 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.
« última modificación: Enero 24, 2016, 19:56:57 por R. INTERNATIONAL »

Maniako

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

R. INTERNATIONAL

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

Maniako

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

R. INTERNATIONAL

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



 
« última modificación: Febrero 20, 2016, 22:21:19 por R. INTERNATIONAL »

pastbytes

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

R. INTERNATIONAL

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

« última modificación: Febrero 20, 2016, 01:13:40 por R. INTERNATIONAL »

Jeff

  • Commodore Master
  • *****
  • Mensajes: 811
  • RUN/STOP + RESTORE
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #339 en: Febrero 22, 2016, 14:20:03 »
R Tape Loading error
« última modificación: Diciembre 17, 2019, 19:52:43 por Jeff »
Press ANY key (¿Donde esta la tecla ANY???)

R. INTERNATIONAL

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

 

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #341 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.


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

R. INTERNATIONAL

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

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #343 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.
« última modificación: Febrero 22, 2016, 23:33:57 por R. INTERNATIONAL »

Carlos

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