Hallo Besucher, der Thread wurde 14k mal aufgerufen und enthält 74 Antworten

letzter Beitrag von stynx am

FPGASID Register Map

  • Hallo Leute,


    um die Wartezeit auf die Ankunft der FPGASID Prototypen gut zu nutzen, habe ich mir über die Registerbelegung des FPGASID noch ein paar Gedanken gemacht. Vor allem um die Sonderregister, mit denen man die Spezialfunktionen des FPGASID aktivieren kann. Die momentane Registerbelegung ist nicht gerade optimal und ich möchte das quasi vor dem ersten offiziellen Release noch gerade ziehen.


    Da ich mir in einigen Punkten noch nicht ganz sicher bin, möchte ich das hier zur Diskussion stellen:


    FPGASID beinhaltet 2 komplette SIDs. Ein einzelner SID belegt prinzipiell 31 Register 0...31.
    Die Register 0...24 sind exakt genau so wie beim originalen SID.


    Register 25:
    read: paddle x
    write: $81 - magic_low


    Register 26:
    read: paddle y
    write: $65 - magic_high


    Man kann also in die Paddle Register hinein schreiben. Sobald der geschriebene Wert magic = $6581 ist, werden die Spezialregister aktiviert. Sie sind dann schreibbar. Wenn magic != $6581 ist, behalten die Spezialregister ihren aktuellen Wert bei, sind aber schreibgeschützt. Auf diese Weise können andere Programme, die z.B. den SID von Adresse 0...31 einfach mit Nullen löschen, diese Register nicht überschreiben und die momentane Konfiguration bleibt so erhalten. Dies ist prinzipiell für beide SIDs im FPGASID so, es können also mit wenigen Ausnahmen alle Settings für beide SIDs separat eingestellt werden.


    Folgende Register sind also nur im Magic-Modus verfügbar: (magic = $6581)


    Register 25: Revision Platine (also nicht mehr paddle x)
    Register 26: Revision FPGA (also nicht mehr paddle y)


    Register 30:
    bits 0..2: Adresse des zweiten SID
    bit 0: d420
    bit 1: d500
    bit 2: de00
    Wenn alle bits 000 sind, dann liegt der zweite SID auf d400. Das ist mehr oder weniger ein mono-mode bzw Pseudeo-Stereo mode (siehe später)
    Man kann auch mehrere bits setzen, also z.B. D420 und D500. Dann liegt der zweite SID an beiden Adressen und man muss nicht immer umkonfigurieren, wenn man andere Stereo-tunes mit anderer Belegung verwendet.
    Wichtig: Diese bits sollten nur im ersten SID verändert werden und sie wirken sich auf die Adresse des zweiten SIDs aus. Ein Beschreiben der bits im zweiten SID hat keine Auswirkung.


    Register 31:
    bit 0: Filter Modus: 0=6581, 1=8580
    bit 1: DAC-Modus: 0=crunchy (6581), 1=clean (8580)
    bit 2-3: Quelle für EXTIN:
    00: analoger Eingang
    01: deaktiviert
    10: der jeweils andere SID
    11: digifix (8580)
    bit 4: Stimme 1 deaktivieren
    bit 5: Stimme 2 deaktivieren
    bit 6: Stimme 3 deaktivieren
    mit den bits 4, 5 und 6 kann man jeweils pro SID einzelne Stimmen deaktivieren. Wenn man bei jedem SID andere Stimmen deaktiviert, dann verteilen sich die Stimmen entsprechend auf beide SIDs und man hat Stereoklang auch bei mono-SID-Tunes. Man kann also z. Stimme 1+2 links und Stimme 2+3 rechts haben. Das ist der erwähnte Pseudostereo-Effekt.


    Register 27,28 und 29 möchte ich später benutzen, um die internen lookup-Tabellen mit neuen Werten zu laden und auf diese Weise neue SID-Profile in FPGASID zu laden. Hierzu brauche ich eine Adresse (16 bit) und ein byte für die Daten. Daher 3 Bytes.


    Was meint Ihr? Ist die Registeraufteilung so sinnvoll? Fehlt noch was Wichtiges? Ich lasse mir hier gerne auch noch ein paar neue Features vorschlagen, wenn sie sich ohne große Umbauten erledigen lassen. Was ich hier aufgeführt habe funktioniert auch noch nicht alles komplett, ist aber so weit, dass ich mich traue das hier schon anzukündigen.


    Meinen momentanen Stand habe ich hier nochmal als Tabelle rein kopiert. Sonderfunktionen in blau. Ist evtl. etwas übersichtlicher:

  • OK, kaum habe ich es geschrieben, kommt mir die erste Erweiterung in den Sinn:


    Momentan kann man alle Register im FPGASID lesen. Im originalen SID ist das nicht so. Dort kann man die write-Register prinzipiell nicht zurücklesen. Allerdings ist der zuletzt geschriebene Wert für ein paar hundert Mikrosekunden noch auslesbar. Einige SID-Typ Erkennungen basieren auf diesem Effekt, weshalb ich das auch noch einbauen wollte. Um dies zu konfigurieren brauche ich 2 bits:
    00: Schreibregister können immer gelesen werden
    01: das zuletzt geschriebene Register kann eine kurze Zeit ausgelesen werden, Zeitkonstante typisch für 6581
    10: das zuletzt geschriebene Register kann eine kurze Zeit ausgelesen werden, Zeitkonstante typisch für 8580
    11: Schreibregister können generell nie gelesen werden.


    Oder aber nur ein bit:
    0: Schreibregister können für kurze Zeit zurück gelesen werden. Zeitkonstante hängt vom Filtertyp (6581 oder 8580, Register 31, bit 0) ab.
    1: Schreibregister können grundsätzlich immer zurück gelesen werden.


    Für die letzte Variante hätte ich im Register 31 gerade noch das eine bit frei - die ist daher mein Favorit.


    Meinungen?

  • ganz naiv gefragt: wie waere es mit einer echten 4. analog stimme mit 8 bit? also ein 8bit register, das man einfach mit einem sample beschreibt.

    Ja, das könnte man evtl mit dem EXTIN-Eingang verknüpfen. Allerdings gibts hierfür dann keine Software, die das ausnutzt. Die Funktion wäre damit inkompatibel zu existierenden Lösungen. Daher habe ich vor sowas bisher immer etwas zurückgeschreckt.


    Registervorschlag hierfür? Evtl 29...


    EDIT: Hmmm. Mit dem EXTIN Quellenregisterbits könnte man dann auf digifix schalten und im Register 29 steht dann der digifix Wert, ähnlich dem Poti, was manche an EXTIN anlöten. Wenn man den Wert nun mit Samples beschreibt werden diese abgespielt... Müsste man mal ausprobieren.

  • bit 4: Stimme 1 deaktivieren
    bit 5: Stimme 2 deaktivieren
    bit 6: Stimme 3 deaktivieren
    mit den bits 4, 5 und 6 kann man jeweils pro SID einzelne Stimmen deaktivieren.

    Wird nur die Ausgabe deaktiviert oder auch die interne Berechnung? Im zweiten Fall wären ja auch die Ringmodulation und Ozcillator-Synchronisation betroffen.

  • Könntest Du ZWEI Register-Maps machen, damit man sieht welche Register wo verfügbar sind? Ich glaube, beispielsweise die Adresse für den zweiten SID (Register 30) würde ja in der zweiten Map wegfallen, oder?


    Register 25: Revision PCB? (nicht PCA, oder?) Wie ermittelst Du die? Oder ist das ein fester Wert im FPGA?


    Register 26: Write: Magic HIGH (nicht Low, oder?)


    Gruß,
    Thomas

  • heisst das man kann auch EXTIN 'samplen' indem man von register 29 liest? das waer natuerlich oberscharf.

    Nee, das heißt es nicht :baeh:
    Prinzipiell ist der Wert des AD-Wandlers in unterschiedlichen Verarbeitungsstufen intern verfügbar:
    roh: 12-bit @ 1MHz sample rate
    gefiltert: 16 bit @ 1 MHz sample rate '(low pass @~30kHz)
    Die konnte man auf ein Register auslesbar machen. Nur welches Register nehmen?



    Evtl. würde noch ein Bit für eine Resonanzverstärkung Sinn machen, denn es gab ja auch die "AR"s.

    Das würde ich dann eher über unterschiedliche SID-Profile abhandeln. Der Support dafür ist bisher nur angedacht und noch weit weg von der Realisierung.


    Könntest Du ZWEI Register-Maps machen, damit man sieht welche Register wo verfügbar sind? Ich glaube, beispielsweise die Adresse für den zweiten SID (Register 30) würde ja in der zweiten Map wegfallen, oder?


    Register 25: Revision PCB? (nicht PCA, oder?) Wie ermittelst Du die? Oder ist das ein fester Wert im FPGA?


    Register 26: Write: Magic HIGH (nicht Low, oder?)

    Du bist wieder mal ein Fuchs, dem nichts entgeht!


    Der einzige Unterschied zw. beiden SIDs ist in der Tat Register 30, welches auf dem zweiten SID keine Auswirkung hat, wohl aber auf dem ersten. Deswegen wollte ich jetzt nicht unbedingt eine zweite Tabelle machen.


    PCA = printed circuit assembly = Platine mit Bauteiilen. PCB = printed circuit board = Platine ohne Bauteile
    Ermittelt über pulldowns an noch zu definierenden FPGA-pins. Muss mal schauen, ob man das für die akteulle Revision noch machen kann. Ansonsten dann eben erst ab Revision 2.


    und ja, Register 26 ist das high-byte des magic-Wertes.


    Was noch ein Problem wird ist, wenn beide für EXTIN jeweils den anderen SID auswählen. Das gibt dann eine feedback-Schleife... In diesem Fall würde ich EXTIN bei SID2 deaktivieren, wenn keiner eine bessere Idee hat.

  • neue Version:



    neu ist, dass man auch die mixed waveforms unabhängig umschalten kann. Außerdem wird der readback für die write register jetzt doch mit 2 bit konfiguriert.
    Im digifix Register kann man dann die Samples von EXTIN mit 8-bit Auflösung auslesen (gute Idee, @everslick!).

  • Beim Readback verschenkst Du mit Deiner getrennten, bitweisen Aufteilung aber die Möglichkeit, das Auslesen abzuschalten, sofern diese Möglichkeit sinnvoll wäre...


    Gegenvorschlag von mir:


    Reg 31 Bit 4: 0=bitrot, 1=fixed


    Reg 31 Bit 3:
    Für bitrot: 0=6581, 1=8580
    Für fixed: 0=never, 1=always


    Oder man gibt beide Bits zusammen an: 00=bitrot 6581, 01=bitrot 8580, 10=never, 11=always



    Gruß,
    Thomas

  • so in der Art???



    eine Idee von mir war, dass man in das Register für den 6581 einfach eine 0 rein schreibt und für den 8580 eine 255. Das ginge so dann nicht mehr.
    Prinzipiell finde ich die 'never read' Option auch wichtig. Normalerweise kommt ja immer eine 0 zurück, wenn man den SID auszulesen versucht.

  • Es sollte noch eine Möglichkeit geben, den FPGASID per Software zu erkennen. Z.B. könnte man den String "FPGASID" in die ersten 7 Register einblenden, sofern "readback" auf "never read" konfiguriert ist.

    hmmm, ich verstehe das Ansinnen. Aber gleich in die ersten 7 Register? Finde ich ein bisschen plakativ.


    Statt das 'read never' zu missbrauchen fände ich es besser ein bit als "identify" zu definieren (z.B. bit 7 in reg 30). Wenn das gesetzt ist, steht in 25/26 nicht die Revision sondern die Kennung F51D für 'FpgaS1D'


    Wer hat ne bessere Idee?

  • Wer hat ne bessere Idee?

    Eventuell eine Identifikation weglassen?


    Wenn man bedenkt, dass die Anzahl der FPGASIDs im Vergleich zu realen SIDs doch eher gering ist :) , dann wird so eine Erkennung eigentlich nie einen FPGASID anzeigen.


    Warum sollte ich ihn auch erkennen? Ok, es gäbe die Möglichkeit einer programmgesteuerten Konfiguration, aber eigentlich will der User doch die Eigenschaften einstellen und die Musik dann mit den selbst eingestellten Werten hören. Der FPGASID sollte sich dann doch eher transparent und nicht unterscheidbar von einem normalen SID verhalten.


    Um einen FPGASID doch zu erkennen, ist das Magic-Word eigentlich so schon extrem hilfreich. Ich glaube nicht, das normale SIDs ein Schreiben dieser Werte zulassen und sich dann die oberen beiden Register (oder eventuell auch die beiden Read-Register 27 (OSC3) und 28 (ENV3), die im "Setup-Mode" als "Lookup-Table-Adressregister" dienen) "wie RAM-Zellen" verhalten (ich schreibe was rein und kann das Geschriebene wieder auslesen). Das würde doch quasi schon für eine Erkennung ausreichen.



    Gruß,
    Thomas

  • ok, @Freak hat natürlich recht: Irgendwie bekommt man den FPGASID schon erkannt. Aber ich gebe zu beddenken, dass es ja möglicherweise irgendwann mal Programme geben wird, die speziell auf den FPGASID zugeschnitten sind. Z.b. Konfigurationsprogramme, oder ein Programm, welches das oben frisch dazu definierte Sampleregister benutzt. Für diese Programme wäre es schon ein Vorteil einen klar definierten Weg zu haben, die Hardware zu erkennen. Sonst kocht jeder sein Süppchen und nach der nächsten FPGA Revision geht es aus irgend einem blöden Grund nicht mehr.
    Wenn es nur wenig Kraft kostet, sowas einzubauen, warum dann nicht?

  • Statt das 'read never' zu missbrauchen fände ich es besser ein bit als "identify" zu definieren (z.B. bit 7 in reg 30). Wenn das gesetzt ist, steht in 25/26 nicht die Revision sondern die Kennung F51D für 'FpgaS1D'


    Wer hat ne bessere Idee?

    Ich würde eine Methode zur Erkennung des FPGASID "vorschreiben", nicht dass jeder die Erkennung an anderen implizit definierten Eigenschaften des FPGASID festmacht.
    Sinnvoll fände ich wie Freak die Verwendung des Magic-Werts in den Paddle-Registern. Im Magic-Mode erscheint dann in Registern Deiner Wahl eine eindeutige Kennung (zusätzlich zu PCA und FPGA-Version). Somit hat man alles auf einmal, eindeutige Identifizierung des FPGASID incl. Versionen.

  • Mit welcher Frequenz wird den gesampelt? Um es sauber zum Digitalisieren nutzen zu können, benötigt man auf jeden Fall noch eine Möglichkeit, zu erkennen, wenn das nächste Byte zum Lesen zur Verfügung steht, also z.B. irgendein Bit, welches anzeigt, daß das aktuelle Byte noch nicht ausgelesen wurde. Bit 7 in Register 30 würde sich dafür anbieten.