Verkaufe 700副鼻腔炎SPC~l'amour éternel~ (PAL, OVP, ohne Anl.)
Verfasst: 14. Januar 2013, 20:46
Tja, sorry Jungs, ist lieder schon weg:
Eine SPC700-Materialsammlung. Für "Von null auf hundert", un' so.
Brainstorming: Was muss ein allumfassendes SPC700-Tutorial alles enthalten?
$2140 = Status
$2141 = Befehl / Daten
$2142/3 = Adresse
source
Was der Status ist, ist eine ganz eigene Geschichte. Augenscheinlich kann man über $2141 sowohl Befehle, als auch Daten übergeben. Im Falle von Daten ist es recht einfach beschrieben: Man schreibt das "Wohin" in $2142 (Low Byte) und $2143 (High Byte) und das "Was" in $2141.
Der Adressraum des SPC700 reicht von $0000 bis $FFFF.
SPC700 Memory Map:
$0000->$00EF Page 0
$00F0->$00FF Register
$0100->$01FF Page 1 (= Stack)
$0200->$FFBF Speicher
$FFC0->$FFFF Speicher (nicht immer, aber die Spitzfindigkeiten lassen wir erstmal aus)
source
Kurz zusammengefasst: Ab $0200 kann man sich nach Herzenslust austoben.
Die Page 0 und Page 1 sind soetwas wie die Zero-Page bzw. Direct Page. Alle zweistelligen Adressen führen auf diese Pages. Also: $3F ist folglich entweder $003F oder $013F, und man kann einen ganzen Byte sparen, weil man als Adresse eben nur 8 Byte schreiben muss. Welche von beiden es ist, entscheidet sich nach einer Flag im Statusregister, der P-Flag, dem "Direct Page Flag", Bit 5.
Dieser jene Status ist der "neunte Bit" in der Adresse. $3F bei P=0 = $003F, $3F bei P=1 = $013F.
source
Als Grundsätzliches sei gesagt, dass ich die Bezeichnung "SPC700" als "der Soundchip des SNES" hier verwandt habe.
Genauer ist: Der Klang beim SNES entsteht durch S-SMP und S-DSP. Programmiert wird der S-SMP. Der DSP bekommt vom SMP die Rohdaten geliefert und schustert daraus die Tonsignale, die dann ausgegeben werden. SMP und DSP teilen sich denselben Arbeitsspeicher.
Wenn jemand hierzu Korrekturen und Zusatzinfos anbringen kann, bin ich sehr glücklich darüber - dashier ist nur aus einem doofen englischen Wikipedia-Artikel zusammengestokelt. (wo gesagt wird, dass der SPC700 ein Prozessor innerhalb des SMP ist...?)
Um das ganze nochmal verständlich zu verketten:
Du schreibst ein Programm für den 65816, in den du Befehle schreibst, in dem Werte an den SPC700 (=SMP) übergeben werden.
Diese Werte wiederum sind Befehle für den SMP, der entsprechende Daten in 8 Stimm-Kanälen an den DSP übergibt, der daraus eine "Klang-Collage" bildet und die dann aus dem Fernseher tuten lässt.
Bildlich gesprochen gibt es zwei Möglichkeiten (auf unterschiedlichen Leveln der Galanz), Sound zu erzeugen, die man so vergleichen kann, ob man einem Singvogel das Singen beibringt, oder kräftig an seinem Schwanz zieht, um ihm Töne zu entlocken.
Die galante Variante ist, wenn man tatsächlich ein Programm für den SMP schreibt, das eigenständig, das heißt losgelöst vom 65816 agiert. Dazu muss man aber größeren Aufwand betreiben, denn die Lieder sind nicht bloß digitale Notenblätter, sondern Programme für einen eigenen Prozessor, der in manchem dem 65816 sogar überlegen ist/zu sein scheint. Bei dieser Variante programmiert man Programmer für den SPC, kompiliert sie (bei WLA DX ist ein SPC-Compiler dabei, übrigens), und lässt sie im SNES-Programm vom 65816 transferieren.
Die ungalante Art und Weise geht da mit weniger Aufwand: Man schmeißt die Samples in den SPC-RAM und arbeitet mit dem SMP lediglich als Handpuppe, um mit dem DSP zu kommunizieren - wann immer man einen Sound will, schreibt man die entsprechenden Befehle über $2140-3 in die SMP/DSP-Register. Das ist funktional, um ein bisschen Sound zu machen, allerdings vollends unpraktikabel, wenn man Musik machen will (weil der 65816 einen Großteil der Zeit damit beschäftigt wäre, im richtigen Moment den richtigen Vogelschwanz zu ziehen, und folglich weniger Zeit hätte, Sprites sinuswellen-artig über die Glotze zu schupsen).
Betrachten wir noch einmal die Memory Map, ein wenig vereinfacht:
$0000 - $00EF Page 0
$00F0 - $00FF Register
$0100 - $01FF Page 1 (Stack)
$0200 - $FFFF Speicher
Eine genaue Liste der Page 0 ist sehr aufschlussreich:
Noch einmal im Schnelldurchgang: Die Register $00, $10, $20 ... $60, $70 tun alle dasselbe, nur jeweils für einen einzelnen der acht Soundkanäle.
Interessante Sache ist z. B. Register $6C. Das ist das Status Register, also Flag Register, vom DSP (nicht vom SMP!). Hier lassen sich Effekte wie Echo oder Mute einstellen. Weitere interessante Sachen ist z. B. das Regsiter $6D. Darüber konnte ich heute in mics SPC-Dokumentation etwas lesen. Eigentlich wollte mic nur den SPC-Player fixen, dessen Sourcecode bei Wikibooks angeboten wird. Seine Funde hat er zusammengetragen, und mir haben sie geholfen, ein etwas besseres Verständnis zu bekommen.
Es gäb dazu noch so viel zu schreiben...
... ein andern Mal...
tbc
~~~ChronoBoogie hat geschrieben:lytron --> hast pm.
Eine SPC700-Materialsammlung. Für "Von null auf hundert", un' so.
Brainstorming: Was muss ein allumfassendes SPC700-Tutorial alles enthalten?
- BRR-Sample-Kompression
- Datentransfer (65816-Code)
- Weitere Kommunikation zwischen 65816 und SPC700 (SPC700 sendet Signale und 65816 fängt sie auf; 65816 startet oder stoppt Musik)
- Die Register des SPC700
- Das Instruction-Set des SPC700 (im Vergleich zum 65816)
- Struktur eines SPC700-Programm
$2140 = Status
$2141 = Befehl / Daten
$2142/3 = Adresse
source
Was der Status ist, ist eine ganz eigene Geschichte. Augenscheinlich kann man über $2141 sowohl Befehle, als auch Daten übergeben. Im Falle von Daten ist es recht einfach beschrieben: Man schreibt das "Wohin" in $2142 (Low Byte) und $2143 (High Byte) und das "Was" in $2141.
Der Adressraum des SPC700 reicht von $0000 bis $FFFF.
SPC700 Memory Map:
$0000->$00EF Page 0
$00F0->$00FF Register
$0100->$01FF Page 1 (= Stack)
$0200->$FFBF Speicher
$FFC0->$FFFF Speicher (nicht immer, aber die Spitzfindigkeiten lassen wir erstmal aus)
source
Kurz zusammengefasst: Ab $0200 kann man sich nach Herzenslust austoben.
Die Page 0 und Page 1 sind soetwas wie die Zero-Page bzw. Direct Page. Alle zweistelligen Adressen führen auf diese Pages. Also: $3F ist folglich entweder $003F oder $013F, und man kann einen ganzen Byte sparen, weil man als Adresse eben nur 8 Byte schreiben muss. Welche von beiden es ist, entscheidet sich nach einer Flag im Statusregister, der P-Flag, dem "Direct Page Flag", Bit 5.
Dieser jene Status ist der "neunte Bit" in der Adresse. $3F bei P=0 = $003F, $3F bei P=1 = $013F.
source
Als Grundsätzliches sei gesagt, dass ich die Bezeichnung "SPC700" als "der Soundchip des SNES" hier verwandt habe.
Genauer ist: Der Klang beim SNES entsteht durch S-SMP und S-DSP. Programmiert wird der S-SMP. Der DSP bekommt vom SMP die Rohdaten geliefert und schustert daraus die Tonsignale, die dann ausgegeben werden. SMP und DSP teilen sich denselben Arbeitsspeicher.
Wenn jemand hierzu Korrekturen und Zusatzinfos anbringen kann, bin ich sehr glücklich darüber - dashier ist nur aus einem doofen englischen Wikipedia-Artikel zusammengestokelt. (wo gesagt wird, dass der SPC700 ein Prozessor innerhalb des SMP ist...?)
Um das ganze nochmal verständlich zu verketten:
Du schreibst ein Programm für den 65816, in den du Befehle schreibst, in dem Werte an den SPC700 (=SMP) übergeben werden.
Diese Werte wiederum sind Befehle für den SMP, der entsprechende Daten in 8 Stimm-Kanälen an den DSP übergibt, der daraus eine "Klang-Collage" bildet und die dann aus dem Fernseher tuten lässt.
Bildlich gesprochen gibt es zwei Möglichkeiten (auf unterschiedlichen Leveln der Galanz), Sound zu erzeugen, die man so vergleichen kann, ob man einem Singvogel das Singen beibringt, oder kräftig an seinem Schwanz zieht, um ihm Töne zu entlocken.
Die galante Variante ist, wenn man tatsächlich ein Programm für den SMP schreibt, das eigenständig, das heißt losgelöst vom 65816 agiert. Dazu muss man aber größeren Aufwand betreiben, denn die Lieder sind nicht bloß digitale Notenblätter, sondern Programme für einen eigenen Prozessor, der in manchem dem 65816 sogar überlegen ist/zu sein scheint. Bei dieser Variante programmiert man Programmer für den SPC, kompiliert sie (bei WLA DX ist ein SPC-Compiler dabei, übrigens), und lässt sie im SNES-Programm vom 65816 transferieren.
Die ungalante Art und Weise geht da mit weniger Aufwand: Man schmeißt die Samples in den SPC-RAM und arbeitet mit dem SMP lediglich als Handpuppe, um mit dem DSP zu kommunizieren - wann immer man einen Sound will, schreibt man die entsprechenden Befehle über $2140-3 in die SMP/DSP-Register. Das ist funktional, um ein bisschen Sound zu machen, allerdings vollends unpraktikabel, wenn man Musik machen will (weil der 65816 einen Großteil der Zeit damit beschäftigt wäre, im richtigen Moment den richtigen Vogelschwanz zu ziehen, und folglich weniger Zeit hätte, Sprites sinuswellen-artig über die Glotze zu schupsen).
Betrachten wir noch einmal die Memory Map, ein wenig vereinfacht:
$0000 - $00EF Page 0
$00F0 - $00FF Register
$0100 - $01FF Page 1 (Stack)
$0200 - $FFFF Speicher
Eine genaue Liste der Page 0 ist sehr aufschlussreich:
sourceFor each voice (x=voice#):
x0 | VOL (L) | Left channel volume.
x1 | VOL (R) | Right channel volume.
x2 | P (L) | Lower 8 bits of pitch.
x3 | P (H) | Higher 8-bits of pitch.
x4 | SRCN | Source number (0-255). (references the source directory)
x5 | ADSR (1) | If bit7 is set, ADSR is enabled. If cleared GAIN is used.
x6 | ADSR (2) | These two registers control the ADSR envelope.
x7 | GAIN | This register provides function for software envelopes.
x8 | -ENVX | The DSP writes the current value of the envelope to this register. (read it)
x9 | -OUTX | The DSP writes the current waveform value after envelope multiplication
and before volume multiplication.
---------------------------------------------------------------------
0C | MVOL (L) | Main Volume (left output)
1C | MVOL (R) | Main Volume (right output)
2C | EVOL (L) | Echo Volume (left output)
3C | EVOL (R) | Echo Volume (right output)
4C | KON | Key On (1 bit for each voice)
5C | KOF | Key Off (1 bit for each voice)
6C | FLG | DSP Flags. (used for MUTE,ECHO,RESET,NOISE CLOCK)
7C | -ENDX | 1 bit for each voice.
---------------------------------------------------------------------
0D | EFB | Echo Feedback
1D | --- | Not used
2D | PMON | Pitch modulation
3D | NON | Noise enable
4D | EON | Echo enable
5D | DIR | Offset of source directory (DIR*100h = memory offset)
6D | ESA | Echo buffer start offset (ESA*100h = memory offset)
7D | EDL | Echo delay, 4-bits, higher values require more memory.
---------------------------------------------------------------------
xF | COEF | 8-tap FIR Filter coefficients
Noch einmal im Schnelldurchgang: Die Register $00, $10, $20 ... $60, $70 tun alle dasselbe, nur jeweils für einen einzelnen der acht Soundkanäle.
Interessante Sache ist z. B. Register $6C. Das ist das Status Register, also Flag Register, vom DSP (nicht vom SMP!). Hier lassen sich Effekte wie Echo oder Mute einstellen. Weitere interessante Sachen ist z. B. das Regsiter $6D. Darüber konnte ich heute in mics SPC-Dokumentation etwas lesen. Eigentlich wollte mic nur den SPC-Player fixen, dessen Sourcecode bei Wikibooks angeboten wird. Seine Funde hat er zusammengetragen, und mir haben sie geholfen, ein etwas besseres Verständnis zu bekommen.
Es gäb dazu noch so viel zu schreiben...
... ein andern Mal...
tbc