Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: Elder0010 - 02 Febbraio 2011, 00:18:20
-
Sto cercando di aggiungere una musica di sottofondo a uno dei tanti esempi trovati in rete.
Sto usando DASM su OSX.
La risorsa "music.sid" viene caricata (se provo a spostare il file ricevo un errore in fase di compilazione), però in fase di esecuzione il programma si ferma all'istruzione
jsr $1000 ; initialize music
(torna al basic semplicemente)
se la commento, tutto funziona a meraviglia (ovviamente nessun audio) :| cosa sto sbagliando?
ringrazio anticipatamente :)
; Set up target processor and address where we wish to be loaded.
; Apparently these _have_ to be indented at least one step, otherwise
; DASM throws a fit.
processor 6502
org $0810
;
; Main code
;
sei
jsr $e544;screen clear
ldx #$00
lda #$00
tax
tay
jsr $1000; initialize music
dmsg lda htxt,x
cmp #$40
bcc charok
sec
sbc #$40
charok sta $0400,x
inx
cpx #$0a
bne dmsg
mainloop ldx #$00 ;Set 'X' as 0
loopx ldy #$00 ;Set 'Y' as 0
loopy lda colours,X ;Flashy border
sta $d020
iny ;Increment Y
cpy #$08 ; Is 'Y' equal to #$77
bne loopy ; If not then Y=Y+1, goto LOOPY
inx ; Increment X
cpx #$08 ; Is 'X' equal to #$77
bne loopx ;If not then X=X+1, goto LOOPX
lda $DC01;Load Spacebar command
cmp #$EF;Is spacebar pressed
bne mainloop;If not then jump to the MAINLOOP prompt
rts; else END program operation
colours
.BYTE $00,$06,$0E,$03
.BYTE $03,$0E,$06,$00
htxt .byte "TESTT 0010"
org $1000-2
incbin "music.sid"
-
Semplice... non puoi includere un file sid così com'è all'interno di un programma!!! Devi prima salvarlo in formato .prg. In teoria puoi usare lo stesso sidplayer.
Il salto che fai con jsr $1000 salta infatti a queste istruzioni:
EOR #$44
BRK
JAM
... ecc ecc!!!
Chiaro? :)
-
Per essere più precisi una soluzione senza fare troppe modifiche ci sarebbe...
devi semplicemente rilocare il file...
In altre parole sostituisci
org $1000-2
incbin "music.sid"
con
org $1000-124
incbin "music.sid"
e così dovrebbe funzionare!
(io in questo momento non posso provare perchè scrivo da un computer non mio, quindi se non è 124 prova o con 123 o con 125, ma stai sicuro che funzionerà).
Un alternativa sarebbe quella di far caricare il file dall'indirizzo contenuto nell'header del file sid (anche se non è un header, ma un testo indicante la scritta "PSID") e cioè:
org $5350
incbin "music.sid"
e quindi rilocare il tutto tramite un'apposita routine subito dopo il tuo "sei":
ldx #$00
ciclo lda $53cc,x
sta $1000,x
lda $54cc,x
sta $1100,x
lda $55cc,x
sta $1200,x
lda $56cc,x
sta $1300,x
lda $57cc,x
sta $1400,x
lda $58cc,x
sta $1500,x
lda $59cc,x
sta $1600,x
lda $5acc,x
sta $1700,x
lda $5bcc,x
sta $1800,x
dex
bne ciclo
e continuare con la tua routine. In questo modo la parte del file sid che realmente ti interessa verrebbe correttamente "locata" a partire da $1000 e stavolta il tuo jsr $1000 funzionerebbe.
Tiene a mente che affinchè tu possa sentire un qualche suono è necessario che ad ogni frame video tu esegua un semplice salto "jsr 1003", altrimenti non sentirai mai nulla.
Se vuoi fare una prova, basta che inserisci una routine del tipo:
suona lda #$ff
frame cmp $d012
bne frame
jsr $1003 ;suona la musica
jmp suona
Fammi sapere. A limite più tardi (dal mio computer) ti assemblo il file correttamente e te lo allego... ma secondo me, almeno questo lo dovresti fare tu!!! :P
Buona serata.
-
Ho provato a convertire il .sid in .prg con sidplay (macosx). Il file generato è perfettamente lanciabile da VICE. Sidplay utilizza PSID64 come tool di conversione.
Resta inteso che:
uso jsr $1000
per far partire il prg
e lo includo con
org $1000-2
incbin "music.prg"
ti allego il file .prg, magari è sbagliata la conversione??
nota: il monitor di vice presenta questo messaggio "Sound: Warning - Buffer drained"
ho provato anche gli altri due sistemi, ma nessun risultato. :( grazie per la disponibilità
-
Non devi convertire in prg eseguibile con psid64 ma estrarre la parte di codice.
Devi togliere l'header PSID che e' di $7c bytes. In Sidplay2/w si fa "Save as" e selezioni *.dat come tipo file.
Altrimenti usa un hexeditor. Il .dat risultante e' in effetti un .prg con tanto di load address
Ad ogni modo un sid che ha indirizzo di init e play va suonato chiamando l'indirizzo di play ad ogni frame. Si puo' fare aspettando il raster ad una posizione fissa dentro un loop come ha detto med, ma e' sempre meglio usare un irq settato ad una data posizione del raster che vuoi tu.
Consiglio spassionato: usa il mio dasm, poi ognuno e' libero di farsi del male come preferisce :P
http://iancoog.altervista.org/C/dasm2.20.07-iAN_Rev_L.rar
; versione con irq player.
org $0801
word eop
word 10
byte $9e,"2061",0
eop
word 0
;
; Main code
;
sei
jsr $e544 ;screen clear
lda #$00
tax
tay
jsr $1000; initialize music
; installa un irq per suonare la musica
sei
lda #$7f
sta $dc0d
lda $dc0d
lda #<irqplayer
sta $0314
lda #>irqplayer
sta $0315
lda #$01
sta $d01a
sta $d019
lda $d019
lda #$00
sta $d012
lda #$9b
sta $d011
cli
ldx #0
dmsg lda htxt,x
sta $0400,x
inx
cpx #[endhtxt-htxt]
bne dmsg
; anche questo colorscroller andrebbe messo in irq;)
mainloop
ldx #$00
loopx ldy #$00
loopy lda colours,X
sta $d020
iny
cpy #$08
bne loopy
inx
cpx #$08
bne loopx
lda $DC01
cmp #$EF
bne mainloop
sei
jsr $fd15
jsr $fda3
jsr $e5a0
debounce
ldx $dc01
cpx #$ff
bne debounce
inx
stx $c6
cli
rts
colours
byte $00,$06,$0E,$03
byte $03,$0E,$06,$00
htxt scru "TESTT 0010"
endhtxt
irqplayer
inc $d019
jsr $1003
jmp $ea31
*=$1000
incprg "music.dat"
PS: non mi stanchero' MAI di ricordarlo, dare sempre un'occhiata ai vecchi thread, questi sono argomenti gia' trattati in precedenza anche su questo forum, ad es
http://ready64.org/smf/index.php?topic=1768
http://ready64.org/smf/index.php?topic=2893
-
Consiglio spassionato: usa il mio dasm, poi ognuno e' libero di farsi del male come preferisce
Concordo pienamente ;)
-
prima di tutto grazie per tutte le info.
Ian: avevo visto la tua release di DASM, ma pensavo fosse un miglioramento con delle aggiunte per realizzare tecniche "da maestri" :) invece leggendo le modifiche che hai apportato, mi accorgo che hai implementato molte "comodità" ! Lo proverò sicuramente!
Avevo provato anche la tua routine trovata sul forum, e avevo la stesso identica situazione, da qui avevo intuito un possibile problema sul file importato! La prox volta prima di chiedere faro' un po piu' di RTFM ;) ;) ;) ;)
-
ok il tuo codice ovviamente funziona a perfezione, ora mi chiudo a studiare un po le tecniche che hai usato
:)