Kernal-ROM-Umschslter per Software

Es gibt 49 Antworten in diesem Thema, welches 6.752 mal aufgerufen wurde. Der letzte Beitrag (4. Juni 2023 um 16:47) ist von kinzi.

  • Die Idee gefällt mir, bin mir aber nicht sicher, ob das exakt so zuverlässig funktioniert:

    1. Verstehe ich das falsch, weil bei $cxxx wäre A12 m.E. nicht 1 sondern 0?

    2. Die Schaltung setzt so wie ich es verstehe voraus, dass die Adressleitungen alle gleichzeitig (mindestens aber A12 als letztes) gültig werden, was meiner Erfahrung nach aber nicht der Fall ist, das kann sich schon über 20 ns hinziehen.

    3. Außerdem fordert das Datenblatt des 74LS75 eine setup Zeit von 20 ns, die wäre sicher nicht gegeben.

    Ein evtl. möglicher anderer Trick wäre, die Bank vom Daten- statt vom Adressbus abzugreifen und die Sprungbefehle durch "lda #$80 / sta $80", "lda #$81 / sta $81", ... Kombinationen zu ersetzen ($80, ... statt $00, ... weil man nicht nach $01 schreiben will, alternativ ginge z.B. auch D1 bis D3 statt D0 bis D2).

    Wenn ich jetzt keinen Denkfehler mache, dann müsste vor dem Schreibzugriff (für den A12 dann auf 0 geht) auf dem Datenbus noch die Zieladresse vom Lesen des Befehls liegen, so dass die setup Zeit erfüllt sein müsste. Und damit die Daten möglichst lange gültig bleiben, schreibt man dann auch noch diesen Wert (weiß nicht, ob das wirklich notwendig ist, schaden wird es aber auch nicht). Leider ginge es nicht ganz aus dem ROM, weil das im Betrieb umgeschaltet wird, aber ein "sta $xx / jmp ($fffc)" bringt man auch in irgendwelchen VIC-Registern o.ä. unter.

    Setzt voraus, dass auf dem Datenbus zwischen Lesen des zweiten Befehlsbytes und dem Schreibzugriff kein Blödsinn passiert, wenn man den VIC rechtzeitig ausschaltet, aber hoffentlich nicht (ich glaube aber nicht, dass man die VIC-Zugriffe generell ignorieren kann, da muss man schon aufpassen, dass der auf keine Adresse zugreift bei der A12 0 wird).

    Was auch noch ein Problem sein könnte, ist dass es nach dem Reset ein paar Taktzyklen (6?) dauert, bis tatsächlich der Resetvektor gelesen wird. Ich bin mir auswendig nicht sicher, was genau passiert, aber ich glaube dass A12 da erst noch 0 ist.

    Ist dafür der 22uF Kondensator da?

  • thierer Danke für die Inputs! :thumbup:

    1. Verstehe ich das falsch, weil bei $cxxx wäre A12 m.E. nicht 1 sondern 0?

    Fxxx = 1111 xxxx xxxx xxxx

    Exxx = 1110 xxxx xxxx xxxx

    Dxxx = 1101 xxxx xxxx xxxx

    Cxxx = 1100 xxxx xxxx xxxx

    Du hast recht. Man kann ja auch nach weiter runter kopieren. Nach dem Reset ist ja "alles frei".

    7xxx = 0111 xxxx xxxx xxxx - müsste klappen, und da ist sicher kein "Modul "drüber" eingeblendet.

    2. Die Schaltung setzt so wie ich es verstehe voraus, dass die Adressleitungen alle gleichzeitig (mindestens aber A12 als letztes) gültig werden, was meiner Erfahrung nach aber nicht der Fall ist, das kann sich schon über 20 ns hinziehen.

    Das stimmt. Muss man ausprobieren. Die Idee stammt ja ursprünglich von einem anderen "Konzept". A0..A3 und A12 wurden gewählt, weil alles am Kernal-Sockel vorhanden ist. Man könnte natürlich auch einen CIA-Port nehmen, z. B.den Tastatur-Ausgangs-Port. Muss man halt Strippen ziehen. Oder notfalls verlängert man A12 etwas mit einem C.

    [edit]

    Notfalls spendiert man noch einen IC (7404 oder 7400) und lässt A12 durch ein paar Gatter durchlaufen. Dann sollte es jedenfalls passen.

    [/edit]

    Setzt voraus, dass auf dem Datenbus zwischen Lesen des zweiten Befehlsbytes und dem Schreibzugriff kein Blödsinn passiert, wenn man den VIC rechtzeitig ausschaltet, aber hoffentlich nicht (ich glaube aber nicht, dass man die VIC-Zugriffe generell ignorieren kann, da muss man schon aufpassen, dass der auf keine Adresse zugreift bei der A12 0 wird).

    Auf A12 sollte vom VIC nichts am ROM ankommen. Der greift bis A11 auf die ROMs und das Color-RAM zu; das RAM ist abgekoppelt vom CPU-Bus. A15..A12 hängen ja genau deshalb per Pull-Ups auf Vcc.

    Was auch noch ein Problem sein könnte, ist dass es nach dem Reset ein paar Taktzyklen (6?) dauert, bis tatsächlich der Resetvektor gelesen wird. Ich bin mir auswendig nicht sicher, was genau passiert, aber ich glaube dass A12 da erst noch 0 ist.


    Ist dafür der 22uF Kondensator da?

    Vermutlich. Die Zeitkonstante des R/C-Gliedes ist irgendwas um drei Sekunden - das dient wohl dazu, dass sichere Verhältnisse herrschen, bevor umgeschaltet wird. Sollte also gegeben sein.

    Ich sag einfach mal: Wir probieren das aus. ^^

  • das RAM ist abgekoppelt vom CPU-Bus

    Oh, tatsächlich! Das war mir bisher gar nicht bewusst.

    Ich sag einfach mal: Wir probieren das aus. ^^

    Ja, das interessiert mich auch. Wenn das funktionieren würde wäre es schon cool. Ich persönlich kann aber für keine Zeitschiene garantieren :)

  • Im ROM sind $E000..$E00F mit $60 (= "RTS") belegt.

    [...]

    [...] die CPU kehrt per RTS zur Hilfsroutine nach $Cxxx zurück,

    Dieser Teil funktioniert glaube ich nicht, weil m.E. das RTS bevor es gelesen werden kann schon weg ist.

  • Dieser Teil funktioniert glaube ich nicht, weil m.E. das RTS bevor es gelesen werden kann schon weg ist.

    Ja, das ging mit auch schon durch den Kopf. Muss man halt weniger elegant lösen.

    [edit]

    Z. B. mit einer NOP-Rutsche.

    [/edit]

    [EDIT 2]

    E000 NOP

    E001 NOP

    E002 NOP

    E003 NOP

    E004 NOP

    E005 NOP

    E006 NOP

    E007 NOP

    E008 NOP

    E009 NOP

    E00A NOP

    E00B NOP

    E00C NOP

    E00D NOP

    E00E NOP

    E00F NOP

    E010 NOP

    E011 NOP

    E012 NOP

    E013 NOP

    E014 NOP

    E015 NOP

    E016 NOP

    E017 NOP

    E018 NOP

    E019 NOP

    E01A NOP

    E01B NOP

    E01C NOP

    E01D NOP

    E01E NOP

    E01F NOP

    E020 JMP FCE2

    Das nach $7000 kopieren und mit JMP (xxxx) an den richtigen Ort springen.

    Der zweite Teil der Rutsche ist quasi "Verzögerungszeit". Nicht nötig, aber spielt auch keine Rolle.

    [/EDIT 2]

  • Und wenn wir doch nen GAL nehmen?

    Dann könnte man weitere Adressen im ROM-Adressraum ausdecodieren und das /CS zur Hilfe nehmen. Dann müsste das doch vom Timing her sauber sein, oder?

  • Sollte das mit der Gatterlaufzeit / Setup-Time wirklich ein Problem sein, würde ich das vorschlagen:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Damit wäre A12 mindestens 30 ns verzögert gegenüber A0..A3. Ansonsten muss man mit PHI2 gaten.

  • Damit wäre A12 mindestens 30 ns verzögert gegenüber A0..A3.

    Ich habe den Flip-Flop Teil mal auf einem Breadboard nachgebaut.Die zwei zusätzlichen Gatter bringen nur ca. 10 ns, allerdings ist das Ganze nicht nötig: Der 100 nF Kondensator sorgt schon alleine für eine Verzögerung von 3-4 us. Das ist eher zu viel, weil da kann dann je nach Trigger-Methode schon wieder was anderes auf dem Bus liegen. Mit 1 nF messe ich 70 ns, das sollte besser passen.

    Allerdings gibt es m.E. noch ein anderes Problem (in beiden Varianten der Schaltung), nämlich dass so lange das Latch aktiv ist, A0 bis A3 1:1 an A13 bis A16 durchgereicht werden (eine einfache Lösung ist mir aber auch noch nicht eingefallen).

    Deine NOP-Rutsche kann m.E. auch nicht funktionieren, weil ich denke dass die Umschaltlogik schon durch das Kopieren getriggert würde. Da bin ich aber noch guter Hoffnung, dass man irgendeine Lösung finden kann (ich bin z.B. bzgl. meiner STA-Methode noch zuversichtlich).

  • Allerdings gibt es m.E. noch ein anderes Problem (in beiden Varianten der Schaltung), nämlich dass so lange das Latch aktiv ist, A0 bis A3 1:1 an A13 bis A16 durchgereicht werden (eine einfache Lösung ist mir aber auch noch nicht eingefallen).

    Das ist kein Problem, weil A13..A16 von den Dioden vom Flip-Flop-Ausgang auf "0" gehalten werden. Auch sonst ist es kein Problem, weil siehe unten.

    Deine NOP-Rutsche kann m.E. auch nicht funktionieren, weil ich denke dass die Umschaltlogik schon durch das Kopieren getriggert würde. Da bin ich aber noch guter Hoffnung, dass man irgendeine Lösung finden kann (ich bin z.B. bzgl. meiner STA-Methode noch zuversichtlich).

    Habe ich inzwischen auch bemerkt. Ich kopiere am Anfang erst mal das ROM von F000..FFFF ins RAM. Dann kann ich dort Werte ändern. Das Umschalten der ROM-Bank kann dann, wenn der Code im RAM läuft, irgendwann passieren. Nach dem Umschalten der Bank kann man dann auch überall hinspringen, springt von Fxxx weg, schaltet das ROM wieder ein und macht ein JMP(FFFC).

    Das Auswählen der ROM-Bank passiert mit einem LDA E00x. Nur wie ich elegant das "x" ändern kann, ist mir noch nicht eingefallen. Wahrscheinlich einfach mit selbstmodifizierdendem Code. :wink:

  • Das ist kein Problem, weil A13..A16 von den Dioden vom Flip-Flop-Ausgang auf "0" gehalten werden.

    Ach ja, stimmt.

    Das mit dem ROM ins RAM kopieren ist eine gute Idee! Was spricht denn gegen selbstmodifizierenden Code, das wäre doch naheliegend? Was für eine Form von "elegant" strebst du da an?

  • Inzwischen sind Platinchen angekommen. thierer , deine "Befürchtungen" haben sich bestätigt, dass die Adressleitungen wohl nicht schnell genug stabil genug sind. Es hat ein paar mal funktioniert, wenn ich mit dem Oszi-Tastkopf an A13 war - offensichtllich reichen die 30 pF des Oszis dann, um A13 entsprechend zu verzögern. Stabil ist mir das aber noch nicht gelungen. Ich muss jetzt noch versuchen, das durch Gatter zu verzögern.

    Ansonsten käme auch in Frage, das über die Tastatur-Pins zu machen - die sind immer steckbar und werden am Anfang auch nicht benötigt. Sobald das Flip-Flop getriggert hat, spielt die Tastaturabfrage dann keine Rolle mehr. Wäre so ne Art "Notlösung" dann.

  • Was versucht ihr da, Kernal-switch per Software ?

    Wozu? Weil es geht ?

    Mfg Jood

    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.,
    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.,
    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.

  • Die Idee finde ich genial.


    Daraus könnte man doch prima einen Dreifach-Kernalumschalter basteln.

    gibt's alles schon, rEPROM heisst das und ist von Henning !

    da hast Du 4 Kernals, 4 Charsets und 2 BASIC's.

    Und wenn Du auch noch einen Keyman64 verbaust, kannste das (und vieles Andere) schön mit diversen Tastenkombinationen umschalten - ganz ohne Löcher für Schalter im Gehäuse !

    hier die Webseite mit sehr guten Dokumentationen zu Allem ....

    Bitte melde dich an, um diesen Link zu sehen.

    EDIT: ich hab die Vollausstattung von Ihm in 3 C64 verbaut, also rEPROM, MixSID, Keyman64 und Overlay64 - bin immer wieder begeistert !!

    Viele Grüße,
    GI-Joe
    Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen.