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.
Nachgebildete 6581-Funktionen
| Funktion | Detail |
|---|---|
| Oszillatoren | 3 Stimmen, 24-Bit-Phasenakkumulatoren, ~985 kHz PAL-φ2-Rate |
| Wellenformen | 12-Bit Dreieck, Sägezahn, Pulse (12-Bit Breite), Rauschen (23-Bit-LFSR) |
| Kombiniert | mehrere Wellenform-Bits werden wire-AND-verknüpft (klassische 6581-Annäherung) |
| ADSR | zyklusgenau: reSID-Rate-Counter-Perioden, linearer Attack, exponentieller Decay/Release-Teiler |
| Filter | 2-polige State-Variable-Multimode (LP/BP/HP), Per-Voice-Routing ($D417), 11-Bit-Cutoff |
| Cutoff-Kurve | nichtlineare „Dark-6581"-Annäherung — mittlere Werte bleiben tief, der Bass klingt rund |
| Resonanz | bewusst schwaches Q (~0,7…2), wie beim 6581, ohne Limiter-Clipping |
| Hard Sync | Oszillator-Reset bei steigendem MSB der Vorstimme (CONTROL-Bit 1) |
| Ringmodulation | Dreieck-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".
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
| ROM | Tune | Besonderheit |
|---|---|---|
| soundsid.rom | World_Record_2.sid | ohne Filter/Sync/Ring |
| sound_commando.rom | Commando.sid | nutzt 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:
| Adresse | Register |
|---|---|
| $D400–$D406 | Stimme 1: Freq, Pulsbreite, Control, ADSR |
| $D407–$D40D | Stimme 2 (gleiche Aufteilung) |
| $D40E–$D414 | Stimme 3 (gleiche Aufteilung) |
| $D415–$D416 | Filter-Cutoff (11 Bit) |
| $D417 | Resonanz & Filter-Routing pro Stimme |
| $D418 | Filtermodus & 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.