Forum: Projekte & Code mos6581 SID (C64 Soundchip) für AVR


von Nils S. (kruemeltee) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi,

ich bastle seit einiger Zeit mit den ersten SID-Chips von MOS/Commodore 
herum, den 6581 wie er im C64 verbaut war.

Jetzt habe ich mal (natürlich nur für euch ;)) das Grundgerüst an Code 
rausgeschrieben, siehe Anhang.

Die Funktionen dürften selbsterklärend sein und die funktion sid() zeigt 
ein kleines Beispiel.

Zuerst wird ein Ton erzeugt, dann in einer Endlosschleife das Poti an 
POTX eingelesen (Paddles) und als Frequenz gesetzt.

Das Poti muss 470k sein.

Im Anhang ist auch ein Schaltplan zur Grundschaltung des SIDs.

Der Anschluss an einen AVR wie mein Code ihn haben will steht im C Code 
im Kopf, sowie hier jetzt:
1
/*
2
 *  pin connections on atmega 16/32/64/164p/324p/644p/1284p, ... :
3
 *    SID            AVR
4
 *    ---------------------------
5
 *    D0-D7         PA0 - PA7
6
 *    A0-A5          PB0 - PB5
7
 *    CLOCK (o2)     OC1A (PD5)
8
 *    RESET       PD4
9
 *    R/W            PC2
10
 *    CS             PC3
11
 */

Mein Code erzeugt an OC1A das benötigte 1MHZ Clock Signal bei einer 
CPU-Speed von 20MHZ.
Daten und Adressbus sind nicht gemultiplext, wär mir zuviel Löterei und 
Pins habe ich genug ;)
An Controllen wie dem atmega162 und 8515/8535 lässt sich der SID im 
Memory Mapped Modus verwenden. Hier halt eben Bitbang...

Der Schaltplan im Anhang stammt aus den Datenblatt zum 6581, hier als 
Bild her 
http://www.waitingforfriday.com/images/7/72/SID_Typical_Application.PNG

von Nils S. (kruemeltee) Benutzerseite


Angehängte Dateien:

Lesenswert?

Soo, ich habe gerade eben noch mein C64 Manual ausgegraben und das 
"Michael Row The Boat Ashore" Beispiel von Seite 90 auf meinen Code nach 
C übersetzt.

Die meisten, die an der Kiste angefangen haben, werdens wohl noch kennen 
:)

Hier der Code, zwar sehr umständlich, aber 1:1 wie im Beispiel, so dass 
man sieht wie der SID anzusprechen ist:
1
void michael(void) {
2
  int i;
3
  
4
  short data[42] = { 17, 103, 250, 21, 237, 250, 26, 20, 400, 21, 237, 100, 26, 20, 250, 29, 69, 250, 26, 20, 250, 0, 0, 250, 21, 237, 250, 26, 20, 250, 29, 69, 1000, 26, 20, 250, 0, 0, 250, -1, -1, 0 };
5
  
6
  unsigned char fl = 0;
7
  unsigned char fh = 1;
8
  unsigned char tl = 2;
9
  unsigned char th = 3;
10
  unsigned char w = 4;
11
  unsigned char a = 5;
12
  unsigned char h = 6;
13
  unsigned char l = 24;
14
  
15
  sid_write(l, 15);
16
  sid_write(th, 13);
17
  sid_write(tl, 15);
18
  sid_write(a, 3*16+15);
19
  sid_write(h, 9);
20
  
21
  short x, y;
22
  int d;
23
  short z;
24
  
25
  for(i = 0; i <= 42; i+=3) {
26
    x = data[i];
27
    y = data[i+1];
28
    d = data[i+2];
29
    if(x == -1) return;
30
    sid_write(fh, (unsigned char)x);
31
    sid_write(fl, (unsigned char)y);
32
    sid_write(w, 65);
33
    for(z = 0; z < d; z++) _delay_us(700);
34
    sid_write(w, 0);
35
  }
36
  
37
  return;
38
  
39
}

von Hugo (Gast)


Lesenswert?

Hier neben mir steht noch der alte Brotkasten mit Stiro verpackt und ner 
Pappe drüber (Originalverpackung). Steht hier wirklich! Find ich cool 
das Du den Wurzeln nachforschst!

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Hehe, in OVP hab ich nix, dafür steht mein Bastelzimmer von oben bis 
unten voll mir Amiga und Commodore Krams, nach und nach 
zusammengesammelt, auch sehr sehr viel Schrott dabei, daher stammen 
meine SIDs zum Basteln.

>Find ich cool das Du den Wurzeln nachforschst!
Joa, macht halt Spass :) Hab jetzt schon einiges gemacht, allerdings 
noch nix 100%ig fertig
...
6502 Simulator/Debugger, compiliert auf PC wie auf AVR, ARM, ... 
Linux/Windows/ohne OS,
Tools um Hex/Binärdateien zu Bearbeiten und ROM-Simulator zum einstecken 
in EPROM Sockel,
VICII an mini2440,
C64 Nachbau, soll mal Hardwarekompatibel werden. Bisher startet aber 
noch nicht mal das BASIC ohne im Monitor nebenher rumzupfuschen...,
Synthesizer mit 4 SIDs bin ich grad dran,
Teletextdecoder via I2C am Userport (allerdings sehr mühselig zu 
bedienen und vorallem zu lesen),
I2C und SPI Adapter am User Port,
Diverse ADCs, DACs, LED Treiber usw am C64,
...

Viel viel Zeug halt :D

Hauptsache rumgebastelt und alles verstanden, daher die alte Technik ;)

von Hugo (Gast)


Lesenswert?


von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Ja kenn ich und hab einen, find ich aber nich so interessant, die meinen 
er wäre fast 100%ig, aber ich behaupte irgendwo bei 70% stecken 
geblieben ;)

Vorallem ist er elektrisch und von den Timings her gar nich kompatibel. 
Wenn du dir das Datenblatt zu z.B. zu den Timings ansiehst, siehst du 
dass ein Clock Cycle zwischen 1µS und 20µS liegen darf. Die anderen 
Werte alle im nano bis zu 10µS Bereich.

Klar, der 6502 kam niemals an diese Grenzen, aber ich schon ein paar mal 
beim herumspielen. Und ich frage mich, wie in AVR das Schaffen will, den 
Bus so schnell abzuhören, Daten entgegennehmen, rausgeben und auch noch 
Ton machen ;).

Vorallem, bis auf den Puls kann der AVR alles nur in Software, da steckt 
einiges an Know-How und Software auf kosten der 100%igen Kompatiblität 
drin. Mein Wahl wäre für sowas ein kleiner ARM, Propeller oder ein PIC 
mit Taktraten > 30Mhz gewesen.

Und man hört den Unterschied schon deutlich, gerade wenn man seine 
Lieblingsspiele laufen lässt, deren original Sound man immer im Kopf 
hat.

Schlecht find ich SwinSID nicht, aber brauchbar auch nicht unbedingt, 
Bastelei eben :)

von chris (Gast)


Lesenswert?


von Nils S. (kruemeltee) Benutzerseite


Angehängte Dateien:

Lesenswert?

So, hier nochmal der SID angeschlossen an zwei PCF8574, so kommt man mit 
einem extra Pin am Controller für CLOCK aus, neben dem I2C Bus. Ingesamt 
also 3 Pins.

Zu Anfangs hab ich den SID an Shift Registern gehabt, aber damit 
"verschwende" ich die zwei ADC Kanäle des SID (POTX und POTY) sowie das 
RANDOM und ENV Register, kann ja nicht einlesen damit.

Mit den PCFs gehen alle Funktionen des SIDs und es ist die 
pin-sparendste Lösung.

Im Headerfile werden die zwei Chip-Adressen für die PCFs angegeben, am 
einen hängen die 8 Datenleitungen, am anderen die Control Leitungen:

Der erste PCF:
PCF_P0 = SID_D0
PCF_P1 = SID_D1
...........
PCF_P7 = SID_D7

Der zweite PCF:
PCF_P0 = SID_A0
PCF_P1 = SID_A1
PCF_P2 = SID_A2
PCF_P3 = SID_A3
PCF_P4 = SID_A4
PCF_P5 = SID_RW
PCF_P6 = SID_RESET
PCF_P7 = SID_CS

Steht aber auch nochmal im Header als Kommentar.

Der Code hat hier, compiliert für einen mega1284p mit -Os, eine Grösse 
von 318Bytes Flash, 0Bytes RAM.

Passt also ohne weiteres sogar in kleine Controller wie dem Tiny2313.

Gerade bin ich dabei meinen 6502 Emulator-Core auf den 1284p zu 
portieren, zusammen mit einer SD Karte wird das dann ein SID-File 
Player.
Ich denke mal, das Teil dürfte, wenns fertig ist, mit FAT32, SD, SID, 
LCD in einen mega32 passen.
Nur über den RAM mach ich mir grad ein wenig sorgen, die 16kb vom 
mega1284p dürften reichen, beim m32 wirds wahrschenlich sehr eng. Ich 
hoffe, dass es reicht.

Kennt einer von euch vielleicht einen Controller im DIP Gehäuse mit 
>=64kb Flash, >=80kb RAM? Muss ja kein AVR sein.

Somit könnte man den 6502 Core mit seinem 64k Adressraum ziemlich 
einfach voll ausnutzen.

Dachte zuerst an den Propeller, den mit 512k externem RAM füttern und 
dann einen der fertigen 6502 Emus dafür verwenden, aber das scheint mir 
ein wenig oversized...

von chris (Gast)


Lesenswert?

>Dachte zuerst an den Propeller, den mit 512k externem RAM füttern und
>dann einen der fertigen 6502 Emus dafür verwenden, aber das scheint mir
>ein wenig oversized...
oder gleich den SID emulieren:
http://forums.parallax.com/showthread.php?118285-SIDcog-The-sound-of-the-Commodore-64-!-%28Now-in-the-OBEX%29&highlight=sid+emulator

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

SIDCog kenn ich auch schon ;) Und mir gehts ja auch darum, den original 
SID an aktuellen Controllern zu verwenden.

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Nils S. schrieb:
> Kennt einer von euch vielleicht einen Controller im DIP Gehäuse mit
>>=64kb Flash, >=80kb RAM? Muss ja kein AVR sein.

Nehm doch einen 8515 oder so mit ExtRAM. Durch das Memory-Mapped-IO 
musst du die ZeroPage 'umbiegen', aber die paar Bytes dürfte wohl kaum 
ein SID-File benötigen (auf'm C64 brauchte man Platz für's VideoRAM). 
Hab das auch mal gemacht, dass ich den Zugriff auf RAM und Flash 
aufteile (bspw. bis 16K RAM, darüber den 6502-Code im Flash vom AVR).

Mark

von stru_aus (Gast)


Lesenswert?

ist ja nett.

ich hab hier auch noch ne kleine kiste mit ner platine und atmega8 und 
nem sid drinnen. düdelt wunderbar, typischer c64 sound.
hier zum anhören: http://www.youtube.com/watch?v=BH67oOswf0s

ein wenig hab ich mich von dem "monovoice" inspirieren lassen: 
http://synthdiy.com/show/?id=1041

zwei anmerkungungen:
-ich hatte nen echten 1mhz oszillator verwendet. der schwingt mit genau 
1mhz, der original c64 hatte da einen etwas anderen takt, abhängig davon 
ob PAL oder NTSC funktion
-dann verbaute ich die erste transistorverstärkerstufe nach dem SID mit 
bauteilen aus dem ausgeschlachteten c64 - der sid soll recht empfindlich 
sein bei dem ausgang

die sid-kiste wartet eigentlich auf eine erweiterung, und einem 
aufgeräumten code. bei bedarf kram ich mal ein paar bilder und 
schaltplan und meinen c code heraus.

und zuletzt: c64 gebraucht preise.. die kiste kostet gebraucht mit SID 
gerne 20€, der SID alleine kostet 20€, und n c64 ohne SID gibts fast 
geschenkt ;D
hier lagert noch n kompletter c64-II im keller, den hab ich mal für 10€ 
vorm müll gerettet ;D

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

>-ich hatte nen echten 1mhz oszillator verwendet. der schwingt mit genau
>1mhz, der original c64 hatte da einen etwas anderen takt, abhängig davon
>ob PAL oder NTSC funktion
985khz in der PAL Version und knapp über 1MHZ in der NTSC Version.

Den Takt hab ich Ursprünglich auch mit Oszillator erzeugt, aber das ist 
nur mehr-Aufwand, da man sowieso einen Pin am Controller für den Clock 
braucht, man kann ja den SID nur schreiben, solange CLK High ist.

>-dann verbaute ich die erste transistorverstärkerstufe nach dem SID mit
>bauteilen aus dem ausgeschlachteten c64 - der sid soll recht empfindlich
>sein bei dem ausgang
Ich hatte da noch keine ernsten Probleme, an manchen Verstärkern (z.B. 
mein Autoradio im Regal in der Werkstatt) hört sichs sehr dumpf an. Hab 
daher einen NE5532 als Spannungsfolger reingepackt, geht wunderbar.

>die sid-kiste wartet eigentlich auf eine erweiterung, und einem
>aufgeräumten code. bei bedarf kram ich mal ein paar bilder und
>schaltplan und meinen c code heraus.
Immer her, hier in die Codesammlung :)

Die Preise sind mittlerweile Böse, grad nochmal 4 Stück einem Bekannten 
abgekauft, 25 Euro dafür..., bin gerade dabei eine ISA Karte mit zwei 
SIDs drauf zu basteln. Das ganze wird ein HW-Kompatibler 64er Klon mit 
eigenem Simulator drauf, das war das ursprüngliche Ziel vor ca. 2 Jahren 
als ich angefangen hab mich mit dem 64er intern auseinander zu setzen.

Die CIAs aus den Kisten bekomm ich auch noch, bei allen vieren ist 
allerdings wahrscheinlich CIA2 defekt, welcher zum Userport geht, daher 
das Schlachtfest...

von chris (Gast)


Lesenswert?

Hmm, wie lange die SIDs wohl halten. Ich dachte immer, die meisten ICs 
sind für eine Lebensdauer von 10 Jahren konzipiert. Aber die SIDs haben 
bestimmt noch ziemlich grobe Strukturen, verglichen mit den heutigen 
ICs. Vielleicht können die auch 100 Jahre durchhalten.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

chris schrieb:
> Hmm, wie lange die SIDs wohl halten. Ich dachte immer, die meisten ICs
> sind für eine Lebensdauer von 10 Jahren konzipiert. Aber die SIDs haben
> bestimmt noch ziemlich grobe Strukturen, verglichen mit den heutigen
> ICs. Vielleicht können die auch 100 Jahre durchhalten.

Ich hab hier Haufenweise 74er und 40er, die mindestens schon 15 Jahre 
auf dem Buckel haben, tun ohne Probelem. C64, Aminga 500, 286er, 386er, 
alte Festplatten, Drucker, Mäuse, Tastaturen, ..., ..., ich wüsste nicht 
warum ICs nur 10 Jahre halten sollten...

Vielleicht hat das mal irgend ein Hersteller als eine Art "MHD" 
angegeben, aber kaputte ICs kenn ich nur von Überhitzung, Überspannung 
oder falsch angeschlossen...

Dass Daten in EPROMs nach 10 Jahren weg sein können ist klar, wenn 
entweder der Kleber Schrott ist oder die Teile durchwegs am Licht lagen, 
trotz Kleber.

von Andreas D. (rackandboneman)


Lesenswert?

Eher 10 Jahre BETRIEB. Habe hier zB zwei funktionierende 7447 von 1972, 
habe ich stilgerecht auf ein Breakout mit zwei 3015F gesetzt :)

Eher sollte man dem Vernehmen nach bei altem MOS-Zeug ESD sehr 
ernstnehmen.

Es gibt wohl Herstellungsfehler/Materialwissenschaftliche Fallstricke 
geben die zum "Verrotten" bestimmter Bauteile führen können (Tinwhisker, 
zerfallende Polymere, Risse, eindringende Feuchtigkeit...), aber 
irgendetwas was generell zum Ausfall in der Lagerung führt ist mir nicht 
bekannt.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Andy D. schrieb:
> Eher sollte man dem Vernehmen nach bei altem MOS-Zeug ESD sehr
> ernstnehmen.

Ja nehme ich schon Ernst, obwohl mir noch nie ein Chip wegen ESD 
verreckt ist. Die SIDs lagen bei mir lange in irgendwelche wühlkisten, 
nen halben Schuhkarton voll mit 40xx ohne Leitschaumstoff, dauernd am 
wühlen, Ausschlacht-Controller-Schaltungen usw lose in Bananenkartons, 
...

Nur was wirklich wichtig, noch 100% funktionierend und brauchbar oder 
teuer ist wird ordentlich verpackt weggeräumt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.