SIDBERRY RASPBERRYPI SID PLAYER

17/05/2015

Un SID jukebox realizzato con RasberryPi e il SID chip originale 6581. Il chip è alloggiato in una board custom collegata direttamente ai gpio del Rasberry!

La board può riprodurre qualsiasi SID file, basta caricare i file .sid nella sdcard del Rasberry, avviare il player e collegare all'uscita jack un paio di casse preamplificate o meglio uno stereo.

SID chip

Il SID originale, nelle varianti 6581 e 8580, è controllato caricando i suoi 29 registri interni con i valori opportuni al momento opportuno. La sequenza di byte inviati genera l'effetto o la musica desiderati. Ogni registro è 1 byte ed i registri sono in tutto 29 quindi c'è bisogno di almeno 5 gpio di indirizzo (2^5=32) e 8 gpio di dati per un totale di 13 gpio. Un altro gpio è richiesto per la linea CS del chip (Chip Select).

220px-MOS6581.svg

Fortunatamente il Raspberry ha ben 17 gpio e i 14 richiesti sono perfettamente pilotabili con la libreria WiringPi. Gli altri pin del chip servono per i due condensatori dei filtri interni (CAP_a e CAP_b), alimentazione, linea R/W (che andremo a collegare direttamente a GND, siamo sempre in scrittura), entrata del segnale di clock, linea di reset (collegata sempre a VCC) e uscita audio analogica (AUDIO OUT).

Ecco la configurazione dei registri interni del SID:

SID_registers_fit

Qui per una descrizione più dettagliata del funzionamento interno del chip:

http://www.waitingforfriday.com/index.php/Commodore_SID_6581_Datasheet

Hardware

La board riproduce esattamente le "condizioni al contorno" per il SID chip come se si trovasse alloggiato in un Commodore 64 originale. L'application note originale mostra chiaramente i collegamenti da effettuare e i pochi componenti esterni richiesti (generatore di clock, condensatori e poco altro).

SID_original_schematic_fit

Unica differenza, le linee di indirizzo e dati vengono dirottate direttamente sui gpio del RasberryPi.

NOTA IMPORTANTE!

Il RasberryPi ragiona in logica CMOS a 3.3V mentre il SID chip è TTL a 5V quindi completamente incompatibili a livello di tensioni. Fortunatamente, siccome andiamo unicamente a scrivere nei registri, il RasberryPi dovrà soltanto applicare 3.3v ai capi del chip, più che sufficienti per essere interpretati come livello logico alto dal SID.

20150516_160221

Lo schematico completo:

sidberry

Software

Il grosso del lavoro. Volevo una soluzione completamente stand-alone, senza l'ausilio di player esterni (come ACID64) e quindi ho realizzato un player che emula gran parte di un C64 originale. L'emulatore è necessario in quanto i file .sid sono programmi in linguaggio macchina 6502 e come tali devono essere eseguiti. Il player è scritto in C/C++ e basato sul mio emulatore MOS CPU 6502  più un semplice array di 65535 byte come memoria RAM (il C64 originale ha infatti 64K di RAM). Il player carica il codice programma contenuto nel file .sid nella RAM virtuale più un codice assembly aggiuntivo che ho chiamato micro-player: sostanzialmente si tratta di un programma minimale scritta in linguaggio macchina per CPU 6502 che assolve a due compiti specifici:

Questo perchè il codice che genera la musica in un comune C64 è una funzione chiamata ad intervalli regolari (50 volte al secondo, 50Hz). La chiamata è effettuata per mezzo di un interrupt esterno. In questo modo è possibile avere musica e un qualsiasi altro programma (videogioco ad esempio) in esecuzione nello stesso momento.

Altre componenti sono il parser per i file .sid e la libreria WiringPi per pilotare i GPIO del RaspberryPi.

Questo il layout dell'intero applicativo, a destra è la memoria RAM virtuale 64K

Screen shot 2015-05-17 at 5.41.36 PM

Questo è il codice assembler del micro-player:

// istallazione del vettore di reset (0x0000)
memory[0xFFFD] = 0x00;
memory[0xFFFC] = 0x00;</p>
// istallazione del vettore di interrupt, punta alla play routine (0x0013)
memory[0xFFFF] = 0x00;
memory[0xFFFE] = 0x13;

// codice del micro-player
memory[0x0000] = 0xA9;
memory[0x0001] = atoi(argv[2]); // il registro A viene caricato con il numero della traccia (0-16)

memory[0x0002] = 0x20; // salta alla init-routine nel codice sid
memory[0x0003] = init &amp; 0xFF; // lo addr
memory[0x0004] = (init &gt;&gt; 8) &amp; 0xFF; // hi addr

memory[0x0005] = 0x58; // abilitiamo gli interrupt
memory[0x0006] = 0xEA; // nop
memory[0x0007] = 0x4C; // loop infinito
memory[0x0008] = 0x06;
memory[0x0009] = 0x00;

// Interrupt service routine (ISR)
memory[0x0013] = 0xEA; // nop
memory[0x0014] = 0xEA; // nop
memory[0x0015] = 0xEA; // nop
memory[0x0016] = 0x20; // saltiamo alla play routine
memory[0x0017] = play &amp; 0xFF;
memory[0x0018] = (play &gt;&gt; 8) &amp; 0xFF;
memory[0x0019] = 0xEA; // nop
memory[0x001A] = 0x40; // return from interrupt

Pagina GitHub del progetto: https://github.com/gianlucag/SidBerry


Torna alla home

Commenti

16 commenti


Raffaele (Raros) (raffaele.rotondo@alice.it)
il 26 Maggio 2015 alle 03:40

Bellissimo!

Sono stato sempre affascinato dal SID ed ho realizzato varie boards con lo stesso: dalla 'Parallel Sid" (con qualche mia modifica) funzionante con la porta parallela del PC, al 'MIDIbox SID', ed uno con il 'SynthEdit' (con molta latenza probabilmente dovuta alla costruzione e compilazione del modulo .sep) sfruttando sempre la porta parrallela del PC.

Possiedo un Raspberry B+ ed il tuo progetto è molto interessante e vorrei realizzarlo ma sono ancora un 'newbie' con il Raspberry e con Raspbian! E' possibile ottenere un programma già compilato?

Ti ringrazio per l'attenzione e complimenti per la realizzazione.

Raros

Rispondi


Gianluca (Admin)
il 26 Maggio 2015 alle 10:32

Ciao Raffaele!
Si certo, posso includere un link con i binari precompilati. Considera però che hai un Rasberry B+ e il mapping dei GPIO è diverso. O prevedo un file di configurazione esterno con il mapping dei gpio oppure puoi modificare e ricompilare i sorgenti (hai già gcc probabilmente, poi ti passo il comando esatto). Compilare i sorgenti è semplicissimo.

P.S. potrei avere qualche link delle board che mi dicevi?

Rispondi


Pippios (pippio_pippione@yahoo.it)
il 26 Maggio 2015 alle 22:37

Bello Bello Bello

Pippios

Rispondi


Gianluca (gianluca@media0101.com)
il 26 Maggio 2015 alle 22:54

Anche io ho realizzato in passato una cosa del genere con il PC.
E' molto interessante farlo con il Raspberry.

Rispondi


Raffaele (Raros) (raffaele.rotondo@alice.it)
il 26 Maggio 2015 alle 23:11

Ciao Gianluca

Certo mi faresti un grosso regalo se mi dai i binari....

Le mie realizzazioni risalgono a circa una decina di anni fa......
e a seguito di problemi ho abbandonato un po' tutto.
Comunque questi sono i link:
Parallel Port SID:
www.loper-os.org/vintage/parallelsid/parasid.html

MIDIbox SID:
www.ucapps.de/midibox_sid_v1.html
www.ucapps.de/midibox_sid.html

SynthEdit:
www.synthedit.com/
SynthEdit - The SDK
www.synthedit.com/software-development-kit/

Questo è un bel progetto di cui ho tutto il materiale ma mai realizzato
SIDblaster:
wiki.forskningsavd.se/index.php/SIDblaster
E' interessante il componente 'RNM-0512S' che con i 5V ti da' i 12V per il SID!
si crea una realizzazione molto compatta.

Chiaramente ho anche i sorgenti delle realizzazioni che ho fatto che posso passarteli.

Fammi sapere e grazie.

Raros

Rispondi


Raffaele (Raros) (raffaele.rotondo@alice.it)
il 26 Maggio 2015 alle 23:19

Scusa Gianluca ma ti ho inviato la risposta più volte perche non la vedo pubblicata!!!!!!

Raros

Rispondi


Gianluca (Admin)
il 12 Giugno 2015 alle 16:52

Ciao Raffaele!
Hai veramente realizzato molti di quei progetti? Complimenti!
Ok posso passarti il precompilato fammi sapere a quale email posso inviarteli.
Mi passeresti invece il materiale delle tue realizzazioni?

Rispondi


Gianluca (Admin)
il 26 Giugno 2015 alle 17:04

Ciao Raffaele,
ti ho mandato l'eseguibile per email. E' un elf file precompilato per processore ARM

Rispondi


Norbert ()
il 3 Febbraio 2016 alle 01:12

Hello,

I've got a question. Seems that GPIO 6581 mapping are different in code and schematics ? Comments in code are not correct ?

Best,
Norbert

Rispondi


Norbert ()
il 3 Febbraio 2016 alle 01:26

sorry, my mistake, it's wiringPi numbering.

Rispondi


Gianluca (Admin)
il 3 Febbraio 2016 alle 20:49

Hi Norbert,
Yes, the WiringPi numbering is quite a mess. This comes straight from the crazy GPIO numbering system used across all the RPi versions.

Rispondi


Antonello (antonello.g@tiscali.it)
il 5 Giugno 2018 alle 12:11

Non so come ma mi era sfuggito questo interessante progetto!
Potrebbe funzionare anche su Raspberry PI zero?
Saluti

Rispondi


Gianluca (Admin)
il 5 Giugno 2018 alle 12:48

certo! La numerazione dei pin probabilmente è diversa però

Rispondi


Antonello (antonello.g@tiscali.it)
il 5 Giugno 2018 alle 17:03

Bella notizia!
Grazie per la tempestiva risposta!
Dovrei avere già tutto il materiale ...
Inizia l'avventura :)

Rispondi


Sprataco (theshinyknight@me.com)
il 21 Aprile 2020 alle 21:28

Progetto molto interessante! Funziona anche con RPI moderne come la 3 or 4? Inoltre volevo sapere se e' possibile pilotare il suono a prescundere dal SID file; praticamente usare i rimanenti GPIO con un paio di multiplexer per controllare il chip come se fosse un oscillatore di un sintetizzatore, via bottoni, switch e potenziometri. Grazie!

Rispondi


Gianluca (Admin)
il 30 Aprile 2020 alle 18:32

Ciao, grazie! Funziona con qualsiasi board RPI (3 e 4 incluse). Poi assolutamente fare quello che dici! Occorre riscrivere il driver in modo tale che legga continuamente lo stato degli altri GPIO dove hai collegato i bottoni e potenziometri e converta tali segnali in comandi per il SID. Puoi anche rimuovere tutta la parte di emulazione della CPU 6502 dato che sostanzialmente si tratta di scrivere i byte opportuni direttamente nel SID (5 bit address + 8 bit data)

Rispondi


Il tuo nome o email (Se usi l'email potrai essere notificato delle risposte)
Il tuo messaggio