Einleitung Die wichtigsten Parametrisierungen Programmierpraxis Registertabelle mit Erläuterungen Die MOS 6381 Hardware

-

C64 SID-Chip Programmierung

Erzeugung von Tönen mit dem Commodore 64 und Basic


C64 SID Chip

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.:

NR

NOTE

FREQUENZ

HIGHBYTE

LOWBYTE

36

C - 3

130,8

8

180

37

C# - 3

138,6

9

56

38

D - 3

146.8

9

196

....

 

 

 

 

52

E - 4

329,6

21

237

Selbst rechnen ist müßig…siehe C64 NotenTabelle.txt

 

Lautstärkeverlauf

Der Lautstärke-Verlauf teilt sich auf

in Attackzeit bis zur vollen Lautstarke,

 

Decayzeit auf Sustainlautstärke,

 

die Zeit, bis das Steuerbit in Reg.$04 auf 0 gesetzt wird (Sustainzeit) und die

 

Releasezeit, das Abklingen des Tons.

 

 

Wie und in welche Register diese Werte gesetzt werden müssen, siehe Tabelle unten.

Lautstärkeverlauf C64 SID Chip

Wellenform

Register $04, $11 und $18

Im Highbyte des Register $04 wird die Wellenform gesetzt. Es gibt zur Auswahl:

10002 = Rauschen

Rauschen C64 SID Chip

01002 = Sägezahnwelle

Saegezahn C64 SID Chip

00102 = Recheckwelle

C64 SID Chip

00012 = Dreieck

dreieck C64 SID Chip

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.

 

 

 

Zur praktischen Seite:

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

C64 SID Chip

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-Frequenz LOWBYTE

 

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-Frequenz HIGHBYTE

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
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)

00

2 ms

08

100 ms

01

8 ms

09

250 ms

02

16 ms

10

500 ms

03

24 ms

11

800ms

04

38 ms

12

1 s

05

56 ms

13

3 s

06

68 ms

14

5 s

07

80 ms

15

8 s

Dauer Decayphase (DECAYZEIT=0-15)

00

8 ms

08

300 ms

01

24 ms

09

750 ms

02

48 ms

10

1500 ms

03

72 ms

11

2400ms

04

114 ms

12

3 s

05

168 ms

13

9 s

06

204 ms

14

15 s

07

240 ms

15

24 s

Poke 54277, WERT

Calculation:

WERT = 16*ATTACKZEIT

+DECAYZEIT

W

$ 06

Sustainpegel

 

SUSTAINPEGEL = 0 bis 15

Releasezeit

00

8 ms

08

300 ms

01

24 ms

09

750 ms

02

48 ms

10

1500 ms

03

72 ms

11

2400ms

04

114 ms

12

3 s

05

168 ms

13

9 s

06

204 ms

14

15 s

07

240 ms

15

24 s

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-Frequenz LOWBYTE

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-Frequenz HIGHBYTE

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)

00

2 ms

08

100 ms

01

8 ms

09

250 ms

02

16 ms

10

500 ms

03

24 ms

11

800ms

04

38 ms

12

1 s

05

56 ms

13

3 s

06

68 ms

14

5 s

07

80 ms

15

8 s

Dauer Decayphase (DECAY=0-15)

00

8 ms

08

300 ms

01

24 ms

09

750 ms

02

48 ms

10

1500 ms

03

72 ms

11

2400ms

04

114 ms

12

3 s

05

168 ms

13

9 s

06

204 ms

14

15 s

07

240 ms

15

24 s

Poke 54284, WERT

Calculation:

WERT = 16*ATTACKZEIT

+DECAYZEIT

W

$ 13

Sustainpegel

 

SUSTAINPEGEL = 0 bis 15

Releasezeit

00

8 ms

08

300 ms

01

24 ms

09

750 ms

02

48 ms

10

1500 ms

03

72 ms

11

2400ms

04

114 ms

12

3 s

05

168 ms

13

9 s

06

204 ms

14

15 s

07

240 ms

15

24 s

 

Poke 54285, WERT

Calculation:

WERT = 16*SUSTAINPEGEL +RELEASEZEIT

W

S

T

I

M

M

E

 

D

R

E

I

$ 14

Oszillator-Frequenz LOWBYTE

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-Frequenz HIGHBYTE

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)

00

2 ms

08

100 ms

01

8 ms

09

250 ms

02

16 ms

10

500 ms

03

24 ms

11

800ms

04

38 ms

12

1 s

05

56 ms

13

3 s

06

68 ms

14

5 s

07

80 ms

15

8 s

Dauer Decayphase (DECAY=0-15)

00

8 ms

08

300 ms

01

24 ms

09

750 ms

02

48 ms

10

1500 ms

03

72 ms

11

2400ms

04

114 ms

12

3 s

05

168 ms

13

9 s

06

204 ms

14

15 s

07

240 ms

15

24 s

Poke 54291, WERT

 

Calculation:

WERT = 16*ATTACKZEIT

+DECAYZEIT

W

$ 20

Sustainpegel

 

SUSTAINPEGEL = 0 bis 15

Releasezeit

00

8 ms

08

300 ms

01

24 ms

09

750 ms

02

48 ms

10

1500 ms

03

72 ms

11

2400ms

04

114 ms

12

3 s

05

168 ms

13

9 s

06

204 ms

14

15 s

07

240 ms

15

24 s

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)

Der AD Wandler1 ist ein Eingang. 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.

C64 SID Poti-Aufbau
Beispielhafter Aufbau mit Potentiometer und Vorwiderstand.
! Nicht kurzschließen ! Sonst ist’s hinüber !

 

Kennlinie A/D Wandler C64 SID Chip

C64 Portbelegung

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
SID Chip MOS6581
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)

SID 9581 Position
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:

 
Zeile                   Erläuterung                  
 
1 Titel ausgeben, "C64 MOS6581 GUITAR TUNER"
 
10-20 Standardwerte für HIGHBYTE und LOWBYTE festlegen
 
100 Abfrage: Der User soll die Note angeben. Gespeichert wird in die Variable A$.
 
200-1000 IF-Abfragen, HIGHBYTE und LOWBYTE werden entsprechend der C64 NotenTabelle.txt gesetzt.
Gibt der User "QUIT" ein, springe zu 2000.
Steht am Ende der Abfragen LOWBYTE immer noch auf Standardwert=0, springe zu Zeile 1510.
 
1100-1300 Spiele die vom User gewünschte Note als Dreiecksignal, dann springe zu Zeile 10.
 
1510-1610 Ein kurzes Rauschsignal wird gespielt, da der Nutzer keine sinnvolle Eingabe gemacht hat. Danach springe zu Zeile 10.
 
2000 Programmende
 
download d64 image
C64 SID MOS 6581 GUITAR TUNER PROGRAMM

 

 

 

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 :

Commodore 64 Emulator Vice

Commodore 64 Emulator CCS

High-Voltage SID Collection

 

 

 

Der Autor übernimmt keine Verantwortung für Fehler oder Irrtümer.