65 6502 SBC FPGA
← Übersicht
Übersicht / Komponente 03
Audio

SID-kompatibler Sound-Chip $D400–$D418

Ein recht vollständiges MOS-6581-Modell in Logik — vollständig genug, um originale .sid-Dateien samt ihrem 6502-Player-Code mit nur leichter Konvertierung direkt auf der Hardware abzuspielen.

Was es ist

Der aktive Tang-Primer-20K-Bitstream instanziiert sid6581.vhd — eine VHDL-Nachbildung des MOS 6581 (SID) aus dem Commodore 64. Sie legt das Standard-6581-Registerfenster bei $D400–$D418 offen, sodass SID-Player den Chip genau so ansprechen wie auf einem echten C64.

Der Chip ist mehr oder weniger SID-kompatibel: Der Großteil des 6581-Verhaltens ist nachgebildet, einige analoge Eigenheiten bewusst angenähert (siehe unten). Auf dem Tang-Build ersetzt er den älteren Vierstimmen-Synthesizer — beide gleichzeitig erschöpften die globalen Taktnetze des Bausteins und destabilisierten die DDR3-PHY-Kalibrierung.

Modell
MOS 6581 (SID)
Stimmen
3 · 24-Bit-Phasenakkus
Oszillatortakt
~985 kHz PAL φ2
Filter
2-polig Multimode (LP/BP/HP)

Nachgebildete 6581-Funktionen

FunktionDetail
Oszillatoren3 Stimmen, 24-Bit-Phasenakkumulatoren, ~985 kHz PAL-φ2-Rate
Wellenformen12-Bit Dreieck, Sägezahn, Pulse (12-Bit Breite), Rauschen (23-Bit-LFSR)
Kombiniertmehrere Wellenform-Bits werden wire-AND-verknüpft (klassische 6581-Annäherung)
ADSRzyklusgenau: reSID-Rate-Counter-Perioden, linearer Attack, exponentieller Decay/Release-Teiler
Filter2-polige State-Variable-Multimode (LP/BP/HP), Per-Voice-Routing ($D417), 11-Bit-Cutoff
Cutoff-Kurvenichtlineare „Dark-6581"-Annäherung — mittlere Werte bleiben tief, der Bass klingt rund
Resonanzbewusst schwaches Q (~0,7…2), wie beim 6581, ohne Limiter-Clipping
Hard SyncOszillator-Reset bei steigendem MSB der Vorstimme (CONTROL-Bit 1)
RingmodulationDreieck-Fold-Bit XOR mit MSB der Vorstimme (CONTROL-Bit 2)
Master-Volume$D418-Lownibble; Voice-3-Abschaltung ($D418 Bit 7) berücksichtigt

Der Filter läuft einmal pro SID-Tick über eine interne 3-Stufen-Pipeline (eine Multiplikation pro Takt), sodass die beiden seriellen Koeffizienten-Multiplikationen nie denselben 54-MHz-Pfad teilen; die Filterzustände saturieren, damit die SVF nicht „explodiert".

Noch nicht modelliert: die analoge DAC-Nichtlinearität / DC-„Wärme" des 6581 und die sample-ROM-exakten Tabellen für kombinierte Wellenformen (das Wire-AND ist eine Annäherung). Cutoff- und Resonanz-Mapping sind in sid6581.vhd für helleres/dunkleres Voicing einstellbar.

Originale SID-Dateien abspielen

Das ist das Herzstück der Demo. tools/build_native_sid_rom.py macht aus einer PSID/RSID-Datei eine lauffähige ROM — und zwar ohne verlustbehaftete 50-Hz-Registerkonvertierung. Stattdessen:

  • Der originale 6502-Payload der SID-Datei wird unverändert eingebettet,
  • zur nativen Ladeadresse kopiert,
  • die init-Routine der Tune einmal aufgerufen,
  • und die play-Routine alle 20 ms (50 Hz) ausgeführt.

Dadurch erreichen alle Schreibzugriffe — Frequenz, Pulsbreite, Control, ADSR und Filter — die Hardware exakt so, wie der Original-Player sie erzeugt. Es läuft echter C64-Player-Code auf dem echten 6502-Kern, der einen echten SID-Nachbau ansteuert.

Voraussetzungen einer Tune

  • echte play-Adresse (kein IRQ/CIA-getriebenes RSID),
  • lädt in den linearen RAM $0200–$5FFF,
  • Payload passt ins 12-KB-ROM-Fenster bei $A000,
  • Single-Speed-PAL (50 Hz play).

Mitgelieferte Beispiele

ROMTuneBesonderheit
soundsid.romWorld_Record_2.sidohne Filter/Sync/Ring
sound_commando.romCommando.sidnutzt den Tiefpassfilter stark
# eine Tune wrappen und abspielen
python tools/build_native_sid_rom.py path/to/tune.sid sw/<name>.s
make -C sw upload-sound-commando      # Build + Upload in einem Schritt

# oder gleich eine ganze Sammlung wrappen
python tools/build_all_sid_roms.py    # baut spielbare ROMs + .bat-Dateien

Der Bulk-Builder lässt jede Tune zusätzlich durch den Bare-Metal-6502-SID-Emulator laufen und überspringt stumme Tunes — Player, die ohne CIA/VIC/KERNAL keinen Ton erzeugen.

SID-Register ($D400)

Standard-6581-Layout, drei Stimmen je 7 Register plus globale Filter-/Volume-Register:

AdresseRegister
$D400–$D406Stimme 1: Freq, Pulsbreite, Control, ADSR
$D407–$D40DStimme 2 (gleiche Aufteilung)
$D40E–$D414Stimme 3 (gleiche Aufteilung)
$D415–$D416Filter-Cutoff (11 Bit)
$D417Resonanz & Filter-Routing pro Stimme
$D418Filtermodus & Master-Volume

Hardware-Ausgabe

Das vorzeichenbehaftete 16-Bit-Sample wird über den I²S-Serializer in pt8211_dac.vhd zum PT8211 (TM8211)-DAC des Docks geschoben (~47 kHz). Der Power-Amp-Enable-Pin (PA_EN, R16) wird fest auf High gehalten, sonst bleibt der Kopfhörerverstärker stumm.

Alternative Synthesizer

Im Repository liegen für andere Ziele zwei weitere, register-kompatible Klangerzeuger:

  • Großer 4-Stimmen-Chip (sound_chip4.vhd) — 4 Stimmen, fünf Wellenformen (Sinus, Rechteck, Sägezahn, Dreieck, Rauschen), volle ADSR, Notenlänge und Mixer; das vollständige Modell des C-Emulators.
  • Bring-up-Einzelstimme (sound_voice.vhd) — eine Stimme, Rechteck + Rauschen, ohne Hüllkurve; die minimale Variante.

Verifikation

GHDL-Testbenches prüfen, dass der SID-Kern Audio erzeugt (Filter aus, rückwärtskompatibler Pegel), der Filter beschränkt bleibt und eine niedrige Cutoff dämpft, sowie dass kombinierte Wellenformen, Ringmodulation und Hard Sync verdrahtet, beschränkt und nicht stumm sind.