L'effetto che tu dici e' dovuto un "baco" del registro volume, che se ben sfruttato puo' diventare la 4a voce del sid, il digitalizzato e' realizzato proprio usando il click prodotto dall'accensione e speginmento del volume.
Un paio di suggerimenti:
*=startaddsong-2
.incbin mus.dat
fallo diventare
*=startaddsong
.INCPRG mus.dat
Ho implementato il pseudo op INCPRG apposta per non dover fare quel workaround, senza contare che come hai fatto tu includi anche i 2 byte di loadaddress nel binario compilato che anziche' iniziare a $1000 inizia appunto a $0ffe.
ah: il punto e' opzionale in DASM, puoi scrivere tranquillamente i pseudo op byte, word, org, incbin, incprg, etc.
*= $c000
L'indirizzo piu' usato e spesso a sproposito =)
Hai una musica che va da $1000 a $1a81, perche' andare a creare un prg di 44kb quando puo' essere di 3kb o meno? metti la tua routine piu' vicino possibile, $0f00, o $1a82, o $2000 ma $c000 e' decisamente fuori luogo.
Ma soprattutto, inizia a pensare di compattare i tuoi programmi. Ce ne sono migliaia nativi, ma i milgiori sono i cross crunchers, e dato che stai sviluppando da PC non vedo perche' sbattersi a trasferire i prg e impiegare ore a cruncharli su C64
Exomizer
http://hem.bredband.net/magli143/exo/Pucrunch (sul mio sito c'e' la mia modifica)
; stampo il testo
Ora che hai imparato a farlo un carattere alla volta, puoi usare (quando e' possibile) la routine di print del basic.
lda #<txt
ldy #>txt
jsr $ab1e
In A ci va il byte basso dell'indirizzo della stringa null terminated, in Y il byte alto.
Per maggiori info, ovviamente, Mapping the C64 e il disasseblato della rom.
Ci sono casi in cui non si puo' usare, ad esempio se blocchi le interrupt o disabiliti la rom del basic, ma questo lo vedrai quando ci arriverai.
Ora puoi passare a fare la stessa routine usando gli interrupt.