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.