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

letzter Beitrag von cbmhardware am

C16-Plus/4: Module und Bankswitching

  • Ich habe etwas im Buch "Alles über den Plus/4" nachgelesen. Mich persönlich hatte mal interessiert, ob es möglich ist, ein RAM-Modul in den Speicherbereich einzublenden. Und dort auch möglichst zu beschreiben, also Flash, E²Prom oder SRAM. Laut den Ausführungen in dem Buch geht das nicht so einfach.


    Ich habe dennoch etwas versucht:


    Code
    1. *=$1000
    2. sei
    3. ldx #$02 ; ext. Speicher Low, Kernal
    4. stx $fb
    5. lda #$<fake ; fake-addr for jump-in
    6. sta $02fe
    7. lda #$>fake
    8. sta $02ff
    9. jsr $fcc9 ; an and jmp-in
    10. fake: rti ; an und kein jmp-in ;)


    Damit liegt das eingesteckte Modul dann im Speicher ab $8000. BASIC-ROM ist weg und in diesem Fall ein eingestecktes Logo-Modul da. Ist nebenbei auch eine schöne Methode um Module zu sichern.


    Ob nun ein Schreibzugriff in diesem Bereich möglich ist ? - Ich habe leider keine Modul-Platine da, die über ausreichend Singal-Pins verfügt, damit man mal ein SRAM einblenden kann.


  • Ob nun ein Schreibzugriff in diesem Bereich möglich ist ? - Ich habe leider keine Modul-Platine da, die über ausreichend Singal-Pins verfügt, damit man mal ein SRAM einblenden kann.


    Nachdem was ich gelesen habe landen Schreibzugriffe immer im RAM auf der Hauptplatine weil TED die _CS-Leitungen (aus denen die Bankingsignale generiert werden) nur für Lesezugriffe aktiviert.

  • Ich habe mal einen Logik-Tester an R/W am Exp.-Port gehängt. Beim versuchten Schreibzugriff auf $8000 kam ein Puls. Im Buch auf Seite 283 ist auch in einem Satz in Bezug auf Bankswitching die Rede von "..RAM oder ROM einzuschalten, das am Expansionsport angeschlossen ist".
    Nach dem Einschalten des RAM und Basic-ROM war nebenbei im RAM nichts aufzufinden. Es gab zudem mal eine SRAM-Karte von Solder/Synergy : Nummer 11) http://solder-synergy.de/plus4/hardware/index.html


    Werde am Wochenende für die fehlenden Signale an den Exp-Port Kabel anlöten und eine Modul-Platine aufbessern. Das möchte ich testen.


    Ich würde die Software für RS232 zu gerne auf einem beschreibbaren Cartridge unterbringen.


    Edit: shit, bin doch im RAM gelandet

  • Ich habe mal einen Logik-Tester an R/W am Exp.-Port gehängt. Beim versuchten Schreibzugriff auf $8000 kam ein Puls.


    Natürlich, denn die DRAMs auf der Hauptplatine benutzen dieses Signal auch... Im System-Handbuch zur 264er-Serie (Als PDF im Netz zu finden), steht folgendes:


    "When ROM is selected, the program residing in ROM appears in place of RAM. The execption to this is a write operation to ROM will always bleed through to underlying RAM." (Seite 5 von 48, System Architecture)



    Zitat


    Nach dem Einschalten des RAM und Basic-ROM war nebenbei im RAM nichts aufzufinden. Es gab zudem mal eine SRAM-Karte von Solder/Synergy : Nummer 11) http://solder-synergy.de/plus4/hardware/index.html


    Was soll da auch zu finden sein? Der Plus/4 macht keinen Speichertest der über die Erkennung der drei möglichen Speichergrössen (16, 32 und 64K) rausgeht, also hat das RAM beim Einschalten einen zufälligen Inhalt (abhängig vom Hersteller). Wenn du das BASIC-ROM auf $8000 aktiv hast auf sich selbst kopierst sollte es beim Umschalten auf RAM als Kopie in selbigem zu finden sein.


    Möglich, dass du statt eines ROM hier auch ein SRAM hinsetzen kannst, nur dürfte das extra Hardware brauchen und beim Beschreiben das RAM auf der Hauptplatine auch betreffen. Die _CS-Signale dürften eigentlich aber nur bei Lesezugriffen aktiv sein, sonst würden bei einem Schreibzugriff auf das ROM dessen Treiber und die der CPU gegeneinander arbeiten.


    Zitat


    Ich würde die Software für RS232 zu gerne auf einem beschreibbaren Cartridge unterbringen.


    Interessante Idee, nur sollte das ohne Hacks abgehen. TED und CPU im C16/+4 sind etwas empfindlich.


    Wolltest du nicht eigentlich die RS232 für die CBMs benutzen?

  • Zitat von Gerrit

    Was soll da auch zu finden sein? Der Plus/4 macht keinen Speichertest der über die Erkennung der drei möglichen Speichergrössen (16, 32 und 64K) rausgeht, also hat das RAM beim Einschalten einen zufälligen Inhalt (abhängig vom Hersteller).


    Ich meinte nach dem Umschalten auf die ursprüngliche Konfiguration. Nach dem Einschalten ist natürlich "Rauschen" im RAM. Hat sich auch erledigt. War doch im RAM angekommen. :/



    Interessante Idee, nur sollte das ohne Hacks abgehen. TED und CPU im C16/+4 sind etwas empfindlich.


    Eine andere Variante wäre: mit 74ls30 : $8000 (?) dekodieren und per Bus-Treiber ins externe "RAM" schreiben. Dazu wird man dann noch zwei Latches und etwas Kleinkram brauchen. Dann wird man wahrscheinlich intern und extern ankommen. Ansonsten hätte ich da nicht allzu viele Ideen.


    Zitat

    Wolltest du nicht eigentlich die RS232 für die CBMs benutzen?


    Ja, auf jeden Fall. Aber wenn es für den P/4 schon halb fertig ist, könnte man es auch zu einem ordentlichen Ende bringen. Fand nebenbei den Exp-Port im Moment interessant.



    Edit: 74ls30 war Quatsch. Versehentlich die Hex-Zahl falsch ins Binäre gebracht.

  • Eine andere Variante wäre: mit 74ls30 : $8000 (?) dekodieren und per Bus-Treiber ins externe "RAM" schreiben. Dazu wird man dann noch zwei Latches und etwas Kleinkram brauchen. Dann wird man wahrscheinlich intern und extern ankommen. Ansonsten hätte ich da nicht allzu viele Ideen.


    Du hast an der PLA im C16/+4 noch einen freien Speicherbereich ausdekodiert. Im Schaltplan des C16 steht an F0 ( Pin18 ) nur das Kürzel 'SCS', aber wenn du die Gleichungen durchgehst siehst du, dass dieser Pin dir $FD20-$FD2F dekodiert. Da könnte man problemlos einen VIA oder sonstigen I/O-Chip reinhängen. Laut dem was ich weiss sollte hier der Sprachsynthesizer zu finden sein. Ich weiss allerdings nicht ob der Kernal beim Reset auf diesen Adressen rumfurwerkt oder sie in Frieden lässt.

  • Ja, der Bereich bietet das dann an. Ich hätte dann aber gern eine Lösung ohne Eingriffe in den Rechner. Und mit Standard-TTL ist der Adressbereich nicht mal eben so dekodiert. Es sollte möglichst leicht nachbaubar sein.
    $8000 wäre da eine einfachere Variante. Btw 74ls30 im vorherigen Posting war Quatsch. Hatte die Hex-Zahl versehentlich in den Dez-Bin-Konverter geworfen.


    Ich werde am Wochenende mal ein bisschen testen.

  • Ja, der Bereich bietet das dann an. Ich hätte dann aber gern eine Lösung ohne Eingriffe in den Rechner. Und mit Standard-TTL ist der Adressbereich nicht mal eben so dekodiert.


    Doch, es gibt da einen passenden IC für sowas. Den 74LS133, 1x NAND mit 13 Eingängen. Zusammen mit einem oder zwei 74LS04 kann man damit ein 8Byte-Fenster in einem 16Bit-Adressraum problemlos ausdekodieren. Für den Bereich $FD2x reicht ein 74LS04 und ein Eingang des 74LS133 fest auf Vcc gelegt.

  • Doch, es gibt da einen passenden IC für sowas. Den 74LS133, 1x NAND mit 13 Eingängen. Zusammen mit einem oder zwei 74LS04 kann man damit ein 8Byte-Fenster in einem 16Bit-Adressraum problemlos ausdekodieren. Für den Bereich $FD2x reicht ein 74LS04 und ein Eingang des 74LS133 fest auf Vcc gelegt.


    Ja, das ist dann leider erst der Anfang. Man hat dann eine 16 Byte-Page ? Demnach muss man die oberen 9 Adressleitungen für die Paging-Schaltung isolieren und nochmals für den ROM-Betrieb. Und dann kommt noch einiges dazu. Das wird dann ein sehr umfangreicher Schaltungskropf.


    Ich hätte eine unsaubere Lösung: Man nimmt z.B. nur einen 74ls138 für eine Adresse und eine Aufbereitung für /OE /WE des z.B. 28c64. Da kommen dann noch ein 74ls125 (oder Multiplexer) und ein paar Portbits des Userport ins Spiel. Die sind dann zum Umschalten zwischen Schreiben und Lesen notwendig.
    Geschrieben wird im normalen Modus ($00). Wenn eine Page oder auch mehr geschrieben wurde, kommt der als erstes gepostete Hack (oder ähnlich) zum Einsatz. Man blendet sich das Modul auf $8000 (+8K) ein und kann die geschriebenen Bytes vergleichen. Danach geht es dann zurück nach Konfiguration $00 und Schreiben. Dann wieder $02 zum Vergleichen, bis das ROM beschrieben ist. Die Verbindung zum Userport braucht man dann nur zur Programmierung eines ICs. Für den ROM-Betrieb ohne diese Verbindung müsste man dann noch evtl. Jumper einplanen, damit die passenden Pegel für die 74125er Schalter da sind.
    2 Bit des Userport werden sowieso für den interne RS232-Adapter verwendet. 6 wären dann also noch da. Der einzige unschöne Faktor daran wäre dann, dass man beim Schreiben auch im RAM darunter landet. Imo ist das aber ungefährlich.


    Ich würde für diesen Ansatz brauchen:


    1x 74ls138 ($8000-9fff)
    1x 74ls138 (/WE /OE Aufbereitung)
    1 oder eher 2 74125, vielleicht besser Multiplexer (einige Signale passend umleiten: /OE /WE /CE)
    ein paar Bits vom Userport + evtl. einem Dekoder


    Diese Angaben sind ohne Gewähr. Vielleicht geht das auch einfacher. Ich hoffe, dass das halbwegs verständlich war.


  • Ich hätte eine unsaubere Lösung: Man nimmt z.B. nur einen 74ls138 für eine Adresse und eine Aufbereitung für /OE /WE des z.B. 28c64. Da kommen dann noch ein 74ls125 (oder Multiplexer) und ein paar Portbits des Userport ins Spiel. Die sind dann zum Umschalten zwischen Schreiben und Lesen notwendig.
    Geschrieben wird im normalen Modus ($00). Wenn eine Page oder auch mehr geschrieben wurde, kommt der als erstes gepostete Hack (oder ähnlich) zum Einsatz. Man blendet sich das Modul auf $8000 (+8K) ein und kann die geschriebenen Bytes vergleichen. Danach geht es dann zurück nach Konfiguration $00 und Schreiben. Dann wieder $02 zum Vergleichen, bis das ROM beschrieben ist.


    Nette Idee, aber nicht vergessen, dass das onboard-RAM bei $8000 beim Schreiben immer aktiv ist (also dortiges überschrieben wird) und du auf keinen Fall das SRAM lesen darfst wenn TED auf RAM steht weil sonst das onboard-RAM und dein SRAM gegeneinander arbeiten wenn die Inhalte nicht stimmen. Zum Auslesen des SRAMs musst du TED auf ROM schalten und die passende Bank auswählen. Leider gibt es keine Leitung am TED oder Bit im TED welches dir den aktuellen Zustand meldet, die Umschaltung ROM/RAM über 2 Register sieht nach 'schnell noch eingebaut' aus.


    Die Idee mit dem Ausdekodieren von $FD2x würde dir erlauben einen VIA oder anderes zu benutzen und damit einen brauchbaren Userport zu haben.



    Zitat


    Die Verbindung zum Userport braucht man dann nur zur Programmierung eines ICs. Für den ROM-Betrieb ohne diese Verbindung müsste man dann noch evtl. Jumper einplanen, damit die passenden Pegel für die 74125er Schalter da sind.
    2 Bit des Userport werden sowieso für den interne RS232-Adapter verwendet. 6 wären dann also noch da. Der einzige unschöne Faktor daran wäre dann, dass man beim Schreiben auch im RAM darunter landet. Imo ist das aber ungefährlich.


    Schreiben in 2 Bausteine zur gleichen Zeit ist kein Problem. Lesen hingegen schon, das tut der Hardware nicht unbedingt gut.


    Zitat


    1x 74ls138 ($8000-9fff)


    Ich würde hier auf $8000-$BFFF ausdekodieren. Das BASIC-ROM ist sowieso weg, dann kann man den Platz ( 16KB ) auch voll ausnutzen. Das ist mit 2 Gattern eines 74LS00 machbar (Ein NAND als Inverter beschaltet für A14 und ein NAND
    welches das invertierte A14 und normales A15 verknüpft).


    Zitat


    1x 74ls138 (/WE /OE Aufbereitung)


    Hm? Das kenne ich als Schaltung mit einem 74LS00. Dafür einen 74LS138 zu verbraten ist Overkill.

  • Ich würde hier auf $8000-$BFFF ausdekodieren. Das BASIC-ROM ist sowieso weg, dann kann man den Platz ( 16KB ) auch voll ausnutzen. Das ist mit 2 Gattern eines 74LS00 machbar (Ein NAND als Inverter beschaltet für A14 und ein NAND
    welches das invertierte A14 und normales A15 verknüpft).


    So ein programmierbares Cart, auch für beide Bänke lässt sich imo dann daraus ableiten. Ich musste leider einen Kompromiss eingehen. Die Verbindung zum Userport war mir ein Dorn im Auge, daher habe ich 2 bit (Flipflop) in den Adressraum gelegt ($b000). So kann man das Cart dann einstecken und mit einem Jumper konfigurieren.



    Zitat

    Hm? Das kenne ich als Schaltung mit einem 74LS00. Dafür einen 74LS138 zu verbraten ist Overkill.


    Ja, ein Dekoder ist wohl "Perlen vor die Säue" für eine solche Anwendung. Es spart aber auch Routing-Platz. Und da die Dinger heute sowieso ungefähr gleichviel kosten, benutzte ich die auch schon mal dafür. Ich habe es auf 74*139 reduziert. ;)


    http://www.cbmhardware.de/temp/c16draft.gif


    Das ist nun eine Draft-Version speziell für die RS232-Anwendung. 8K sind dafür imo schon sehr üppig. Mir geht es im Besonderen darum, dass der komplette RAM für zu übertragende Programme frei bleibt und auch mal ein Update eingespielt werden kann. Der Schaltplan ist noch nicht vollständig und mag den einen oder anderen Lapsus beinhalten (?). Ich werde das noch genau prüfen, ein Board routen, und dann eine Platine anfertigen lassen.
    In der Zeit kann dann die RS232-Software entstehen.

  • So ein programmierbares Cart, auch für beide Bänke lässt sich imo dann daraus ableiten. Ich musste leider einen Kompromiss eingehen. Die Verbindung zum Userport war mir ein Dorn im Auge, daher habe ich 2 bit (Flipflop) in den Adressraum gelegt ($b000). So kann man das Cart dann einstecken und mit einem Jumper konfigurieren.


    Wobei die aktuelle Schaltung das SRAM mit der dargestellten Dekodierung auf 2KB beschränkt. Du hast zwar am SRAM auch noch A11 und A12, hilft dir aber nichts weil du nur bei A11, A12 und A13 = 0 das _CS am RAM auf LOW geht. Du müsstest Y0 - Y3 mit einem 4port AND verknüpfen, dann gehts. Auch hast du den CS2 am 8K SRAM vergessen. Pin 26 ist bei den 6264 ein high-active Chipselect, also einfach mit Vcc verbinden.


    Mit welchem Programm baust du eigentlich diese netten Schaltbilder?

  • Zitat


    Wobei die aktuelle Schaltung das SRAM mit der dargestellten Dekodierung auf 2KB beschränkt. Du hast zwar am SRAM auch noch A11 und A12, hilft dir aber nichts weil du nur bei A11, A12 und A13 = 0 das _CS am RAM auf LOW geht. Du müsstest Y0 - Y3 mit einem 4port AND verknüpfen, dann gehts.


    Richtig, da hatte ich gepennt. Dank für den Hinweis, habe es eben geändert : ( http://www.cbmhardware.de/temp/c16draft.gif ) Ist aber wahrscheinlich noch nicht die letzte Version. Das müsste dann auch ohne 138er gehen. Es ist noch ein halber 139er übrig. Mal sehen ...



    Zitat

    Auch hast du den CS2 am 8K SRAM vergessen. Pin 26 ist bei den 6264 ein high-active Chipselect, also einfach mit Vcc verbinden.


    Das war für ein AT28C64 E²Prom. Ich habe einen Pullup eingezeichnet, dann kann auch ein SRAM verwendet werden. Das dürfte nur von Vorteil sein.



    Zitat

    Mit welchem Programm baust du eigentlich diese netten Schaltbilder?


    Das ist Eagle: http://www.cadsoft.de/ . Ich hänge den aktuellen Schaltplan und die Lib für das C16-Cartridge an.

  • Richtig, da hatte ich gepennt. Dank für den Hinweis, habe es eben geändert : ( http://www.cbmhardware.de/temp/c16draft.gif ) Ist aber wahrscheinlich noch nicht die letzte Version. Das müsste dann auch ohne 138er gehen. Es ist noch ein halber 139er übrig. Mal sehen ...


    Reicht immer noch nicht, mit der aktuellen Schaltung hast du 6 KB von 8 sichtbar. Der 74x138 produziert so wie beschaltet Dekodierung für 2KB-Blöcke. Also muss Y3 auch noch mit rein.



    Zitat

    Das ist Eagle: http://www.cadsoft.de/ .



    Aha... Mal genauer anschauen.

  • Zitat

    Reicht immer noch nicht, mit der aktuellen Schaltung hast du 6 KB von 8 sichtbar. Der 74x138 produziert so wie beschaltet Dekodierung für 2KB-Blöcke. Also muss Y3 auch noch mit rein.


    Hmpf, habe es passend geändert. ;)



    Zitat

    Aha... Mal genauer anschauen.


    Das lohnt sich bestimmt. Die Routing-Fläche ist in der Free-Version begrenzt, ansonsten lässt sich das sehr gut einsetzen.


    Ich habe die Schaltung mal durch den Autorouter laufen lassen. Mit Bottom- und Toprouting: *, also jede Richtung erlaubt und halbem Standard-Grid packt der das noch. Sieht aber wirklich nicht schön aus. Ich werde das demnächst mal etwas von Hand routen und das Bündel Signal-Leitungen weitestgehend dem Auto-Router überlassen. Das wird nicht einfach.

  • Hallo cbmhardware,


    nette Bastelei,ich lese mir gerne sowas durch.Es ist zwar etwas her,dass ich an meinem C16 gebastelt habe,aber
    ich glaube,dass die Konstruktion mit dem D-FlipFlop 7474 so nicht funktionieren wird.Der IC2 HC138 Dekoder
    ist rein kombinatorisch und erzeugt an Y7 immer dann eine positive Flanke,wenn sich die Addresse von ($B800-$BFFF)
    auf was anderes ändert.Weiss jetzt nicht mehr so genau ob da die Daten noch richtig anliegen !?.Müsste nicht auch die R/W , PHI2 ,Leitung dran!? Jeder beliebege Schreib / Lesezugriff kann ja das Register beschreiben unabhängig davon ob der TED auf RAM oder ROM steht!?
    Ich kann mich natürlich auch irren.


    Grüsse,
    Vassilis

  • Da ist was dran. Ich habe nun /WE vom 139er angezapft. Der hat nur die Aufgabe aus R/W und Phi2 passend /WE bzw. /RD zu generieren. Dazu habe ich nun die noch freie zweite Hälfte des 139ers verwendet: Pin 1 und 2: /WE , Pin 3 (I/O $B800-$BFFF) = Ausgang Pin 4 (y0) an die Clock (Pin 3) des Flipflops. Dann dürften nur noch Schreibzugriffe auf den erwähnten Bereich erfolgen. Bit 1 mit der LED habe ich rausgeworfen. Die würde auch bei Schreibzugriffen dauernd flackern.


    Btw dieses ROM/RAM des TED müsste man doch eigentlich an den CS-Leitungen erkennen. CS*, CSLow und CSHigh* dürften eigentlich nicht selektiert sein, wenn RAM aktiv ist ?


    Ich glaube nicht, dass ich diese Schaltung aufbauen werde. Da muss man zu viel halbgaren Murks umschiffen.

  • Btw dieses ROM/RAM des TED müsste man doch eigentlich an den CS-Leitungen erkennen. CS*, CSLow und CSHigh* dürften eigentlich nicht selektiert sein, wenn RAM aktiv ist ?


    _CS0 und _CS1 vom TED sind nur bei Lesezugriffen aktiv und das auch nur wenn er auf ROM steht. Ansonsten generiert er statt dessen _CAS fürs RAM. Leider gibt es keine statische Leitung die ROM/RAM anzeigt, du weisst es also immer erst bei einem Lesezugriff was gemeint ist. Immerhin hast du _CS0 und _CS1 am Expansionport.

  • Hallo cbmhardware,


    ich kann leider aus dem Kopf nicht genau sagen,ob die neue Änderung funktionieren wird,da ich das Timing des C16
    nicht mehr genau weiss.Aber im Thread "FE3 für C16,..." hier hatte ich im Beitrag #90 vier Timing Diagramme angehängt,die Dir vielleicht hilfreich sein könnten!? (Ich hatte damals meine "wüste" Bastelei nicht stabil zum laufen bekommen und hatte am Ende aufgegeben.)
    Sonst hat Gerrit ja hier schon alles gesagt.Es ist halt so,dass die externe Anbindung von ram nicht vorgesehen war und man das interne ram nicht abschalten kann! Ist ein bischen "murksig" am C16.
    Genau, wenn man den TED auf ROM stellt werden diese CSxx Leitungen beim lesen aktiv,bei RAM wird CAS aktiv.Schreiben geht *immer* ins RAM,kann man nicht abschalten beim TED, jedenfalls wüsste ich nicht wie.
    Für I/O stehen nur zwei Pages bereit bei $FDxx und $FExx glaube ich.Dort wird kein Signal vom TED aktiv.


    Ich hoffe ich entmutige Dich nicht,der C16 ist halt bischen Eigenartig!


    Grüsse,
    Vassilis


    Edit: Gerrit war schneller!

  • Ich mache mir da auch Sorgen. Man müsste das Step-by-Step aufbauen und dann testen. Das ist nun schon eine sehr umfangreiche Theorie, die durch eine Unsicherheit zu Fall gebracht werden kann. Vielleicht baue ich es zur Grundlagenforschung irgendwann auf. Ist aber sehr unsicher, wann ich die Zeit dafür finden werde.
    Auf einem Cartridge sieht das mit 6 TTLs und einem großen Speicherchip schon sehr schlecht aus. Man muss sehr viele Leitungen über die schmale Leiterplatte hoch routen und auch einiges Kreuz und Quer verbinden. Das schreit geradezu nach GAL oder besser CPLD. Dazu habe ich aber keine Möglichkeiten.
    Ich werde mich mal an die ausstehende RS232-Software machen und die dann auf ROM brennen.


    Entmutigt hast Du mich nicht. Das ist eher eine Vernunft-Entscheidung.


    Ich habe CS0 und 1 noch berücksichtigt ( http://www.cbmhardware.de/temp/c16draft.gif ). Vielleicht ist es auch nicht notwendig.


    Es gäbe noch eine andere Möglichkeit: man baut es wie die damaligen Speichererweiterungen für den C16. Mit einem Bustreiber ist man immer stärker als das interne RAM. So einen Schrott möchte ich heutzutage aber besser nicht mehr verzapfen. ;)