Autore Topic: Aggiungere Musica Di Un Sid A Gioco In Basic  (Letto 3753 volte)

luigi_ing

  • Neo-iscritto
  • *
  • Post: 30
  • Gioco Preferito: Bubble Bobble
Aggiungere Musica Di Un Sid A Gioco In Basic
« il: 11 Marzo 2013, 15:10:14 »
 Salve a tutti, ho il seguente problema: sto creando un gioco in basic compilato sono gia a buon punto ho creato la logica e la parte grafica, ma di musica ne so ben poco, quindi ho pensato di aggiungere al gioco una musichetta di sottofondo data da un sid. So che in pratica mi servirebbe una routine in assembler che  sfrutta gli interrupts e che esegue il sid  mentre il gioco procede normalmente, poi ovviamente questa routine la carico con il basic e la faccio partire all'inizio del gioco, ma non so proprio da dove iniziare visto che di assembler sono proprio a digiuno. Quindi chiedo aiuto a voi del forum per sapere come fare per risolvere questa problema. Vi ringrazio.

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Aggiungere Musica Di Un Sid A Gioco In Basic
« Risposta #1 il: 14 Marzo 2013, 20:32:04 »
 Ciao Luigi,
 il problema che hai sollevato è potenzialmente piuttosto ostico da risolvere.
La routine di play del SID è la parte più semplice: potrebbe essere codificata nel programma basic con 5/6 righe di "DATA" e copiata in runtime in una qualsiasi zona della RAM (si può tranquillamente farla rilocabile). A quel punto con una semplice SYS si potrebbe avere il sottofondo musicale.
Per come la vedo io però ci sono due grossi problemi:

1)
Salvo avere a che fare con SID rilocabili (ad esempio quelli fatti con SDI, ma ce ne sono molti altri) c'è il problema di dover scegliere un SID che lavori in una zona più alta possibile della RAM: per non interferire con la memoria basic dovrebbe avere un indirizzo base >=$a000 (49160).
SID con indirizzo base inferiore comportano dei compromessi.
Purtroppo gran parte dei SID viene tipicamente allocata a partire da $1000 per motivi legati al chip video: è chiaro che è piuttosto difficile far convivere un SID in $1000 con un programma basic. Esistono soluzioni anche per gestire sid posizionati in memoria "bassa" ma tutte comportano limitazioni (più o meno serie) della memoria utilizzabile da basic.

2)
Il SID potrebbe fare uso di zone di memoria vitali al basic: in particolare potrebbe appoggiarsi a valori in zero page che l'interprete utilizza per altri scopi: questo genere di sovrapposizioni ha effetti nefasti.
Se un SID ne fa uso... è un bel problema: fixarlo non è esattamente una passeggiata.
L'unica cosa che si può fare è controllare che il SID non faccia uso della zero page (o che, al massimo, si limiti a quei pochi registri che il basic non usa).

Deto questo non voglio scoraggiarti: magari il SID che hai in testa è perfettamente adattabile. Volevo solo chiariti quali siano, in realtà, i veri problemi legati all'uso di SID in un programma basic.

Che SID volevi mettere? Magari posso (possiamo?) darti una mano ad adattarlo alle tue esigenze.

 

luigi_ing

  • Neo-iscritto
  • *
  • Post: 30
  • Gioco Preferito: Bubble Bobble
Aggiungere Musica Di Un Sid A Gioco In Basic
« Risposta #2 il: 15 Marzo 2013, 12:11:12 »
 Grazie Freshness79 per la spiegazione dei problemi che possono esserci. In realtà non ho ancora scelto nessun sid perchè volevo prima capire come si fa per aggiungerlo. Il gioco che sto creando è lo snake in una versione un pò più migliorata tipo il Feed the snake quindi avevo pensato ti metterci una musichetta divertente ma comunque semplice che si adattasse al movimento del serpente niente di complicato. Se mi posti qualche routine per farlo e mi spieghi meglio come fare posso provare con dei sid che mi piacciono e scegliere ovviamente quello che può essere inserito. Io sto programmando con CBM Studio e mi sto trovando bene.
Sono conscio delle limitazioni del basic per cui gia il fatto che sto utilizzando del basic compilato mi permette di avere dei miglioramenti sulla velocità per cui non chiedo molto voglio solo vedere dove posso arrivare programmando in basic, poi quando avrò imparato meglio l'assembler potrò convertirlo in assembler e goderne delle possibilità offerte.
Grazie mille dell'auito aspetto tue notizie.

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Aggiungere Musica Di Un Sid A Gioco In Basic
« Risposta #3 il: 19 Marzo 2013, 12:44:13 »
 Come prevedevo la fatica maggiore è stata cercare un SID adatto alle necessità. Comunque sia, ecco la routine.
Tieni presente che il player è rilocabile, io l'ho messo nel buffer tape ($033c) ma puoi metterlo dove ti pare.
Il SID che ho usato è "720 Degrees" che, per inciso, si carica in memoria alta e non (almeno mi pare) usa registri in zeropage.
Gli indirizzi di init e di play li puoi vedere usando un qualsiasi sidplayer per windows/mac oppure direttamente in HVSC guardando nei dettagli di un sid. Ti passo anche il disco di test.
Ricordati che per usare un SID devi "strippargli" l'header e tenere solo il programma vero e proprio.
Codice: [Seleziona]
10 rem programma di test
20 rem carico il sid in memoria
30 if ok=0 then ok=1:load"720degrees",8,1
40 sid=828:rem metto il player nel tape buffer
50 gosub 1000:rem carico la routine
60 init=53056:play=53062:num=0:rem $bf40/$bf46/0
70 gosub 1040:rem faccio partire il sid
80 print"...busy waiting...":geta$:if a$="" then 80
90 gosub 1050:rem stoppo il sid
100 end

1000 rem load sid routine
1001 rem sid = indirizzo di partenza
1002 data "78","85","02","a9","7f","8d","0d","dd","ad","0d","dd","a9"
1003 data "35","85","01","20","8a","00","ba","ca","18","bd","00","01"
1004 data "85","03","69","50","8d","18","03","bd","01","01","85","04"
1005 data "69","00","8d","19","03","a0","31","a5","fb","91","03","c8"
1006 data "a5","fc","91","03","a0","61","a5","fd","91","03","c8","a5"
1007 data "fe","91","03","a5","02","20","8a","00","a9","c7","8d","04"
1008 data "dd","a9","4c","8d","05","dd","a2","00","86","02","e8","8e"
1009 data "0e","dd","a9","81","8d","0d","dd","a9","37","85","01","58"
1010 data "60","2c","0d","dd","48","46","02","b0","12","8a","48","98"
1011 data "48","a9","35","85","01","20","8a","00","a9","37","85","01"
1012 data "4c","81","ea","a9","47","8d","18","03","a9","fe","8d","19"
1013 data "03","a9","7f","8d","0d","dd","68","40","--","69"
1014 i=0
1015 read a$:if a$="--" then 1017
1016 gosub 1060:pokesid+i,d:sum=sum+d:i=i+1:goto 1015
1017 read a$:gosub 1060
1018 sum=sum and 255:if sum<>d then 1020
1019 return
1020 print"errore nel checksum. controllare i data.":end

1040 rem start sid
1041 rem imposta init/play come indicato nel sid
1042 rem imposta num a 0 (diverso da 0 per multisid)
1043 poke252,int(init/256):poke251,init-(peek(252)*256):rem set init
1044 poke254,int(play/256):poke253,play-(peek(254)*256):rem set play
1045 poke 780,num:rem settings (num. sid)
1046 sys sid:return

1050 rem stop sid
1051 poke 2,1:return

1060 rem hex to dec
1061 d=0
1062 n=asc(mid$(a$,1,1))-48
1063 if n>16 then n=n-7
1064 d=d+n*16
1065 n=asc(mid$(a$,2,1))-48
1066 if n>16 then n=n-7
1067 d=d+n
1068 return


Moderatore: dove posso uppare il file?

tsm_carmine

  • Redazione
  • Utente
  • ****
  • Post: 515
  • Gioco Preferito: Krakout
Aggiungere Musica Di Un Sid A Gioco In Basic
« Risposta #4 il: 19 Marzo 2013, 13:14:46 »
 Fatto.
test.zip
Riusciremo a costruire un mondo dove più nessuno osi pronunciare le parole... "lettore floppy"?

luigi_ing

  • Neo-iscritto
  • *
  • Post: 30
  • Gioco Preferito: Bubble Bobble
Aggiungere Musica Di Un Sid A Gioco In Basic
« Risposta #5 il: 19 Marzo 2013, 19:44:59 »
 Grazie Freshness79, ora ho qualcosa di funzionante che posso utilizzare. Ora analizzo il codice per vedere come funziona e capirci qualcosa di più, poi vedo anche quali sid posso metterci. Poi ti faccio sapere. Grazie mille ancora.