Einleitung | Die wichtigsten Parametrisierungen | Programmierpraxis | Registertabelle mit Erläuterungen | Die MOS 6381 Hardware |
-
Erzeugung von Tönen mit dem Commodore 64 und Basic
MOS Technology 6581 SID
zusammengestellt von Christian Riedel/ MH, x3works, dopeconnection.net
Das Sound Interface Device des Commodore 64 besteht aus 3 Tongeneratoren, welche über die 29 Register 54272 bis 54300 kontrolliert werden können. Ein Register hat dabei eine Länge von einem Byte bzw. acht Bits:
1 Byte Register |
|||||||
High-Nibble |
Low-Nibble |
||||||
Bit |
Bit |
Bit |
Bit |
Bit |
Bit |
Bit |
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Um Register zu setzen gibt es unter C64 Basic den Befehl : POKE Register , Wert
Der Commodore 64 ist in der Lage ein breites Spektrum an Tönen zu erzeugen. In der folgenden Tabelle sind die wichtigsten Parametrisierungen zusammengestellt: |
||||||||||||||||||||||||||||||||||
Frequenz Register $00 und $01 |
Mit dem Commodore 64 SID lassen sich Frequenzen von 16Hz bis 3738Hz erzeugen. Die Ton-Frequenzen der chromatischen Tonleiter können nach folgendem Schema berechnet werden: FREQUENZ = 2^( NR / 12 ) * 16.35 Hz Dabei entspricht NR=0 dem Ton C-0, NR=1 dem Ton C#, NR=2 dem Ton D, NR = 3 dem Ton D#, NR = 4 dem Ton E, NR=5 dem Ton F …usw… Um das C eine Oktave höher zu transponieren muss 12 zu NR addiert werden. Der Ton D-3
hat also die NR=2+36=38.
Der zu berechnende 16bit WERT ist = FREQUENZ * 2^24 / TAKTFREQUENZ Die TAKTFREQUENZ kennt regionale Unterschiede: Europäischer C64: TAKTFREQUENZ = 17734472 / 18 Hz Amerikanischer C64: TAKTFREQUENZ = 14318180 / 14 Hz
Der 16bit WERT wird aufgespalten in 8bit-LOWBYTE und 8bit-HIGHBYTE und so jeweils in die Register $00 und $01 (Stimme 1) geschrieben. HIGHBYTE= INT( WERT / 256 ) , LOWBYTE = WERT - 256 * HIGHBYTE
Zur Erleichterung ist sinnvoll sich eine Tabelle mit den benötigten Tönen anzulegen.
z.B.:
Selbst rechnen ist müßig…siehe C64 NotenTabelle.txt
|
|||||||||||||||||||||||||||||||||
Lautstärkeverlauf |
|
|||||||||||||||||||||||||||||||||
Wellenform Register $04, $11 und $18 |
Im Highbyte des Register $04 wird die Wellenform gesetzt. Es gibt zur Auswahl: |
|||||||||||||||||||||||||||||||||
10002 = Rauschen
|
01002 = Sägezahnwelle
|
00102 = Recheckwelle
|
00012 = Dreieck
|
|||||||||||||||||||||||||||||||
Startbit auf 1 setzen |
Setzen des Bit 0 von Register $04 auf 1 (ungerade Integerzahl) : Der SID Chip spielt die Attack und Decayphase. |
|||||||||||||||||||||||||||||||||
Startbit auf 0 setzen |
Die Sustainphase bleibt erhalten, bis Bit 0 von Register $04 zurück auf 0 gesetzt wird und die Releasephase den Ton ausblendet. |
Im folgenden soll veranschaulicht werden, wie man in Basic einen Ton mit Tongenerator 1 erzeugen kann.
|
||
|
||
10 POKE 54296,15 |
REM: Kein Filter, maximale Lautstärke=15 |
|
20 POKE 54272, 196 |
REM: LOWBYTE, Note D-3, Oszillatorfrequenz 146.8Hz |
|
30 POKE 54273, 9 |
REM: HIGHBYTE, Note D-3, Oszillatorfrequenz 146.8Hz |
|
40 POKE 54277, 105 |
REM: Attackphase 1s, Decayphase = 750ms |
|
60 POKE 54278, 252 |
REM: Sustainlautstärke = 10, Releasezeit = 2,4s |
|
70 POKE 54276, 33 |
REM: Rechteckform gewählt, Steuerbit gesetzt, abspielen beginnt |
|
80 FOR I= 1 TO 1700:NEXT |
REM: Das Timing der Sustainphase+Attackphase+Decayphase muss selbst überbrückt werden! Z.B.: durch eine Schleife (ca.850 Durchläufe / Sekunde) |
|
90 POKE 54276,34 |
REM: Rechteckkurve gewählt, Steuerbit nullgesetzt, Releasephase beginnt, abspielen des Tons endet danach. |
|
|
Download d64 Image : SIDchip.zip |
|
Erzeugt wird ein D mit einer Frequenz von 146.8Hz und eingeprägter Rechtecksform. Die Lautstärke steigt in 1s auf volle Lautstärke, klingt dann in 750ms auf 2/3 dieser Lautstärke ab. Der Ton wird bis zum Ende der FOR-Schleife gehalten und in 24ms Releasezeit ausgeblendet.
Die genaue Funktion der mit dem Poke-Befehl beschriebenen Register kann der folgenden Tabelle entnommen werden.
|
Die folgende Tabelle stellt die Funktionen aller 29 Register des MOS 6581 dar. Angaben zur Berechnung der C64 Basic Poke-Codes sind in der Zeile Poke it! zusammengefasst. Damit ist man in der Lage jeden beliebigen Ton mit dem C64 zu erzeugen, also viel Spaß bei ausprobieren! Möchten sie ganze Musikstücke mit dem C64 komponieren, vereinfachen sogenannte Tracker (z.B.: asterion sid tracker) die Arbeit. |
OSC
|
54272+ REG |
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
Poke it ! |
R/W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
S T I M M E
E I N S
|
$ 00 |
Oszillator-FrequenzLOWBYTE
FREQUENZ=2^(NR/12)*16.35 Änderung von NR um 1 bewirkt Halbtonschritt, NR+12 erhöht um eine Oktave NR=0, C NR=1, C# NR=3, D usw… WERT=FREQUENZ*2^24/TAKTFREQUENZ (Europa TAKTFREQUENZ = 17734472/18, Amerika TAKTFREQUENZ 14318180/14) LOWBYTE=WERT-256*HIGHBYTE |
Poke 54272,LOWBYTE
Calculation: LOWBYTE= WERT-256*HIGHBYTE
|
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 01 |
Oszillator-FrequenzHIGHBYTE HIGHBYTE= INT(WERT /256) |
Poke 54273,HIGHBYTE Calculation: HIGHBYTE = INT(WERT /256) |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 02 |
Pulsbreite bei Rechteckwelle LOWBYTE WERT = 0 bis 255 |
Poke 54274, WERT |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 03 |
unbenutzt |
unbenutzt |
unbenutzt |
unbenutzt |
Pulsbreite bei Rechteckwelle HIGHNIBBEL, WERT = 0 bis 15 |
Poke 54275,WERT |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 04 |
Rauschen
|
Sägezahn |
Rechteck |
Dreieck |
Eine Doppelauswahl von Rauschen und einer andren Schwingungsform kann den Rauschgenerator blockieren. Mit setzen des Bit3=1 wird diese Blockade gelöst. |
1: Dreiecksschwingungsausgang von Oszillator 1 gibt an Oszilator 1 die Ringmodulation (Multiplikation) der Signale an Osz. 1 und 3 aus. ![]() Ringmodulation mit fRechteck = 6 mal fDreieck |
1: Synchronisieren Synchronisiert die Grundfrequenz von Oszillator 1 mit Osc. 3. Um einen hörbaren Effekt zu erziehlen muss Osc.3 auf eine niedrigere Frequenz (!=0) als Osc.1 gesetzt sein. |
Steuerbit 1:Attack 0:Release Phase einleiten |
Poke 54276,WERT Calculation: Bsp.: WERT 11000001=193, binär umformen! [ gerader WERT=Attack Ungerader WERT=Release ]
|
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Es ist möglich mehrere Wellenformen gleichzeitig zu aktivieren. Das Ergebnis entspricht dann einer logischen AND Verknüpfung der Signale. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 05 |
Dauer Attackphase(ATTACKZEIT = 0-15)
|
Dauer Decayphase(DECAYZEIT=0-15)
|
Poke 54277, WERT Calculation: WERT = 16*ATTACKZEIT +DECAYZEIT |
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 06 |
Sustainpegel
SUSTAINPEGEL = 0 bis 15 |
Releasezeit
|
Poke 54278, WERT Calculation: WERT= 16*SUSTAINPEGEL +RELEASEZEIT |
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
S T I M M E
Z W E I
&
D R E I |
$ 07 |
Oszillator-FrequenzLOWBYTE FREQUENZ=2^(NR/12)*16.35 Änderung von NR um 1 bewirkt Halbtonschritt, NR+12 erhöht um eine Oktave NR=0, C NR=1, C# NR=3, D usw… WERT=FREQUENZ*2^24/TAKTFREQUENZ (Europa TAKTFREQUENZ = 17734472/18, Amerika TAKTFREQUENZ 14318180/14) LOWBYTE=WERT-256*HIGHBYTE |
Poke 54279, LOWBYTE Calculation: LOWBYTE= WERT-256*HIGHBYTE
|
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 08 |
Oszillator-FrequenzHIGHBYTE HIGHBYTE= INT(WERT /256) |
Poke 54280, HIGHBYTE Calculation: HIGHBYTE= INT(WERT /256) |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 09 |
Pulsbreite bei Rechteckwelle LOWBYTE WERT = 0 bis 255 |
Poke 54281, WERT |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 10 |
unbenutzt |
unbenutzt |
unbenutzt |
unbenutzt |
Pulsbreite bei Rechteckwelle HIGHNIBBEL, WERT = 0 bis 15 |
Poke 54282, WERT |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 11 |
Rauschen |
Sägezahn |
Rechteck |
Dreieck |
Eine Doppelauswahl von Rauschen und einer anderen Schwingungsform kann den Rauschgenerator blockieren. Mit setzen des Bit 3 wird diese Blockade gelöst. |
1: Dreiecksschwingungsausgang von Oszillator 1 gibt an Oszilator 1 die Ringmodulation (Multiplikation) der Signale an Osz. 1 und 2 aus. |
1: Synchronisieren Synchronisiert die Grundfrequenz von Oszillator 1 mit Osc. 2. Um einen hörbaren Effekt zu erziehlen muss Osc.2 auf eine niedrigere Frequenz (!=0) als Osc.1 gesetzt sein. |
Steuerbit 1 : Attack 0 : Release Phase einleiten |
Poke 54283, WERT Calculation: Bsp.: WERT 11000001=193, einfach binär umformen [ gerader WERT=Attack Ungerader WERT=Release ]
|
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Es ist möglich mehrere Wellenformen gleichzeitig zu aktivieren. Das Ergebnis entspricht dann einer logischen AND Verknüpfung der Signale. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 12 |
Dauer Attackphase (ATTACK = 0-15)
|
Dauer Decayphase (DECAY=0-15)
|
Poke 54284, WERT Calculation: WERT = 16*ATTACKZEIT +DECAYZEIT |
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 13 |
Sustainpegel
SUSTAINPEGEL = 0 bis 15 |
Releasezeit
|
Poke 54285, WERT Calculation: WERT= 16*SUSTAINPEGEL +RELEASEZEIT |
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
S T I M M E
D R E I |
$ 14 |
Oszillator-FrequenzLOWBYTE FREQUENZ=2^(NR/12)*16.35 Änderung von NR um 1 bewirkt Halbtonschritt, NR+12 erhöht um eine Oktave NR=0, C NR=1, C# NR=3, D usw… WERT=FREQUENZ*2^24/TAKTFREQUENZ (Europa TAKTFREQUENZ = 17734472/18, Amerika TAKTFREQUENZ 14318180/14) LOWBYTE=WERT-256*HIGHBYTE |
Poke 54286, LOWBYTE Calculation: Lowbyte= WERT-256*Highbyte
|
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 15 |
Oszillator-FrequenzHIGHBYTE HIGHBYTE= INT(WERT /256) |
Poke 54287, HIGHBYTE Calculation: Highbyte = INT(WERT /256) |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 16 |
Pulsbreite bei Rechteckwelle LOWBYTE WERT = 0 bis 255 |
Poke 54288, WERT |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 17 |
unbenutzt |
unbenutzt |
unbenutzt |
unbenutzt |
Pulsbreite bei Rechteckwelle HIGHNIBBEL, Wert = 0 bis 15 |
Poke 54289,WERT |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 18 |
Rauschen |
Sägezahn |
Rechteck |
Dreieck |
Eine Doppelauswahl von Rauschen und einer andren Schwingungsform kann den Rauschgenerator blockieren. Mit setzen des Bit 3 wird diese Blockade gelöst. |
1: Dreiecksschwingungsausgang von Oszillator 1 gibt an Oszilator 1 die Ringmodulation (Multiplikation) der Signale an Osz. 2 und 3 aus. |
1: Synchronisieren Synchronisiert die Grundfrequenz von Oszillator 2 mit Osc. 3. Um einen hörbaren Effekt zu erziehlen muss Osc.3 auf eine niedrigere Frequenz (!=0) als Osc.2 gesetzt sein. |
Steuerbit 1 : Attack 0 : Release Phase einleiten |
Poke 54290, WERT Calculation: Bsp.: WERT 11000001=193, einfach binär umformen [ gerader WERT=Attack ungerader WERT=Release ]
|
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Es ist möglich mehrere Wellenformen gleichzeitig zu aktivieren. Das Ergebnis entspricht dann einer logischen AND Verknüpfung der Signale. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 19 |
Dauer Attackphase (ATTACK = 0-15)
|
Dauer Decayphase (DECAY=0-15)
|
Poke 54291, WERT
Calculation: WERT = 16*ATTACKZEIT +DECAYZEIT |
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 20 |
Sustainpegel
SUSTAINPEGEL = 0 bis 15 |
Releasezeit
|
Poke 54292, WERT Calculation: WERT= 16*SUSTAINPEGEL +RELEASEZEIT |
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
F I L T E R |
$ 21 |
unbenutzt |
unbenutzt |
unbenutzt |
unbenutzt |
unbenutzt |
unbenutzt |
Filterfrequenz LOWBYTE (2 bits) |
Poke 54293, LOWBYTE Calculation: LOWBYTE=WERT-256*HIGHBYTE |
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 22 |
Filterfrequenz, HIGHBYTE WERT = (FREQUENZ-30)/5.8182 Max.WERT = 2^11 ($21 und $ 22, zusammen 11 Bits !) = 2048 |
Poke 54294, HIGHBYTE Calculation: HIGHBYTE = INT(WERT /256) |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 23 |
Resonanz des Filters, RESONANZ Von 0 ( Niedrigere Resonanz) bis 15 (hohe Resonanz) |
Externe Signalquelle filtern |
Stimme 3 über Filter |
Stimme 2 über Filter |
Stimme 1 über Filter |
Poke 54295, WERT Calculation: WERT = 16 * RESONANZ + FILTERMODUS |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 24 |
Stimme 3 nicht hörbar. Sinnvoll wenn Stimme 3 nur zur Parametergewinnung genutzt wird. |
Hochpasszweig Frequenzen < Filterfrequenz werden um 12dB/octave reduziert |
Bandpasszweig Frequenzen <> Filterfrequenz werden um 6dB/octave reduziert |
Tiefpasszweig Frequenzen > Filterfrequenz werden um 12dB/octave reduziert |
Gesamtlautstärke LOWNIBBEL = 0 bis 15 |
Poke 54296, WERT Calculation: WERT= PASSMODUS*16+LOWNIBBEL |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A/D |
$ 25 |
A/D Wandler
1, Control Port 1 (Input, read
only)
|
|
|
A=PEEK(54297) PRINT A |
R |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$ 26 |
A/D Wandler 2 Control Port 1 (Input, read only) Der AD Wandler2 ist ein Eingang. Das Register enthält einen Wert, proportional zu einem zwischen +5V und POT Y angelegten elektrischen Wiederstand (min. 300 Ohm).
|
A=PEEK(54298) PRINT A |
R |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RND |
$ 27 |
Oszillator 3 gibt eine Zufallszahl welche dem Rauschen des Rauschgenerators entspricht. Generator 3 muss eingeschaltet sein, jedoch kann man die Stimme 3 mit $24 unterdrücken. (read only) |
A=PEEK(54299) PRINT A |
R |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
$ 28 |
Hüllkurvengenerator 3, entspricht der relativen Lautstärke von Stimme 3. (read only) |
A=PEEK(54300) PRINT A |
R |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
V-08-11, zusammengestellt von Christian Riedel/ MH, x3works, dopeconnection.net |
|
Die MOS 6581 SID Hardware: | |||
Diese Abbildung soll nur einen kurzen Überblick über die Art der Pinanschlüsse des MOS6581 geben. | PIN | NAME | Erläuterungen |
![]() Wenn sie mehr über die Elektronik hinter dem MOS 6581 erfahren wollen, dann können sie dem offiziellen Datenblatt zum Chip ausführlichere Informationen entnehmen. (Dieses kann z.B.: bei http://sid.kubarth.com/specifications.html gefunden werden) ![]() Hier befindet sich der SID im C64. (Die Position variiert bei den einzelnen Versionen des C64) |
01 | CAP 1A | Anschlüsse für externe
Kondensatoren. Die Kapazitäten (min.
1000pF) werden vom Frequenzfilter als Integratoren benötigt.
Angeschlossen wird je ein Kondensator zwischen Pin 0 und 1 sowie
zwischen Pin 3 und 4. Der Kapazitätswert beeinflusst das Klangbild des MOS 6581 SID. Die Mit je 1000pF können höhere Töne erzeugt werden. 2000pF Kondensatoren ermöglichen eine bessere Bass-Dynamik. |
02 | CAP 1A | ||
03 | CAP 1A | ||
04 | CAP 1A | ||
05 | -RES | Reset. Der SID Chip setzt die Register zurück, wenn ein Low-Signal anliegt. (TTL Signal, Low-Time min. 10 Zyklen) | |
06 | S2 | Über diesen Pin bezieht der SID Chip den I/O-Takt des Prozessors. Die nominale Frequenz liegt bei 1MHz, im High-Takt (5V-TTL) werden die Daten transferriert. Der Takt dient auch als Basis für die durch ihn abgeleiteten Stimmfrequenzen. (siehe $0,$1) | |
07 | R/W | Read/Write. Bei anliegendem TTL Low Signal wird ins Register geschrieben, bei High gelesen. | |
08 | -CS | Chip Select. Wenn der Prozessor eine Adresse im Registerbereich des SID Chips auf den Adressbus legt wird dieser Eingang Low. | |
09 | A0 | Adressbits A0-A4. Mit 00000 wird $1 angesprochen, mit 00010 $2, mit 00011 $3, usw. (binär umformen). TTL-Level, kommend vom MOS 6510 Mikroprozessor. | |
10 | A1 | ||
11 | A2 | ||
12 | A3 | ||
13 | A4 | ||
14 | GND | Hat der Sid
gegenüber den anderen Schaltungen eine eigene Masse, so lässt sich das Klangbild
verbessern. |
|
15 | D0 | Datenbits D0 bis D7. Der Datenfluss ist bidirektional. Wird -CS low, entscheidet R/W ob das durch A0 bis A4 adressierte Register die Datenbits gelesen oder geschrieden werden. Es liegt 5V-TTL-Level an, verbunden sind die Datenleitungen mit dem MOS 6510 Mikroprozessor. |
|
16 | D1 | ||
17 | D2 | ||
18 | D3 | ||
19 | D4 | ||
20 | D5 | ||
21 | D6 | ||
22 | D7 | ||
23 | POTY | Eingang für A/D Wandler 2, siehe $26 | |
24 | POTX | Eingang für A/D Wandler 1, Der Wert des Registers wird bestimmt durch einen zwischen +5V und POT X angelegten elektrischen Wiederstands (min. 300 Ohm bis 400 kOhm). Die max. mögliche Abtastrate beträgt ~2000Hz. (siehe $25) | |
25 | V5V | 5 Volt Betriebsspannung, max 100mA / 500mW | |
26 | EXT-IN | EXT IN ist ein Signaleingang für Singale bis max. 3V z.B. von einem Mikrophon, einer Stereoanlage oder etwa einem zweiten SID Chip. Der Pin 26 ist verbunden mit dem Kontakt 5 der 8-poligen AudioVideobuchse. | |
27 | AUDIO OUT | Audio Out mit maximal 2V Spannung. | |
28 | V12V | 12 Volt Betriebsspannung, bis zu 40mA / 480mW | |
total: | max. 1000mW SID Power (Yeah!) |
Zusatzbeispiel : C64 Guitar Tuner | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Das
rechts abgebildete Programm ist ein einfach gehaltener
Gitarren-Stimmer. Die Saiten einer Gitarre entsprechen von oben nach unten den Noten E2,A2,D3,G3,H3 und E4. Das Programm soll nur kurz erläutert werden:
|
![]() |
Quellen :
64 Intern, (Brückmann, Englisch, Felt, Gelfand, Gerits, Krsnik) , 5.Auflage, Data Becker, 1986
Commodore 64 Bedienungshandbuch, Commodore GmbH, Commodore AG
Commodore NMOS 6581 SID, Commodore Semiconductor Group, 1986
Links :
Der Autor übernimmt keine Verantwortung für Fehler oder Irrtümer.