Beiträge von Frenetic im Thema „Wie 6510 vom Expansionsport aus "anhalten"?“

    Die Beschreibung ist teilweise falsch, mit einem RMW-Befehl wie zB DEC abs könnte man zwei aufeinanderfolgende Schreibzugriffe auf das Triggerregister der REU provozieren.

    Ok, danke für den Hinweis! Weisst Du, wie/ob die REU das abfängt?

    Ich habe jetzt mal in Vice (kurz, stichprobenartig) geschaut, was so passiert: ich emuliere ja ein Easyflash und da wird das Statusregister $DE00 immer per STA oder STX geschrieben.

    Die vermeintlich(?) kritischste Passage, die ich gesehen habe ist: STA $DE00 und STX $DE02 direkt hintereinander. Aber das sollte doch auch OK sein (erstmal wieder 2x Lesezyklus, richtig?)

    In Gideon's Beschreibung steht jetzt allerdings noch eine

    Bemerkung zu NMI, die habe ich noch nicht komplett

    verstanden.

    Auch Dir Danke, das Manual werde ich mal suchen. Die Abhandlung zu NMI hat m.W. nur mit den Freezern zu tun, um die es dort ja eigentlich geht.

    hm... wie verstehst Du diesen Absatz:

    "The REU does not have any problems either, because it always asserts the –DMA line

    right after an I/O write, namely the write that initiates the DMA transfer. There is no

    condition that the following cycle would have been a write as well, so the –DMA line is

    always asserted in a read cycle of the CPU."

    Oder anders rum: wie macht's die REU, oder ggf. warum geht da nichts schief?

    Ein Teil der KERNAL-Routine ist das Initialisieren

    der Speichers, vlt. wird ja da der Bereich D000-DFFF gelesen/geschrieben,

    das würde ja bei dir eine entpsrechende Aktion auslösen. Liegt es

    vlt. daran?

    Das ist möglich -- da ich aber ein Cartridge emuliere spielt das Basic nicht mit. Vielleicht schaue ich mir das mal in Vice mit dem Debugger an...


    Und: Mit Gideon's Beschreibung "Safely Freezing the C64 on async. Events"?

    Das lese ich mir gerade durch.

    Ja genau das -- wobei er natürlich den schwierigen Fall beschreibt. Ich reagiere ja nur auf ein soeben erfolgtes Write.

    So, ich konnte jetzt mal etwas testen.

    Test: bei Schreibzugriff auf IO1 (einfaches Basic-Programm POKE ...) ziehe ich DMA für eine Sekunde, dann geht's weiter. Das funktioniert, allerdings muss ich DMA freigeben, wenn PHI2=low (so wie's in Gideon's Dokument steht).

    Das habe ich dann auch in meine EasyFlash-Emulation eingebaut -- hier war die Problematik, dass ich nach dem Bankswitching bei zu großen CRTs erst noch die Caches vorwärmen muss. Das funktioniert jetzt prinzipiell auch. Stabil scheint es zu laufen, wenn ich DMA=low noch in der PHI2=high-Phase setze (nicht wie oben erwähnt nach der fallenden Flanke).

    Jetzt hatte ich noch den Eindruck, dass man DMA kurz nach dem Start/Reset des C64 nicht verändern darf. Eventuell schreibt der Kernal etwas in die IO-Ranges und triggert meinen Code? Hat da jemand eine Idee, wie ich erkenne, ab wann man DMA steuern darf?

    Mit einem RT Kernel für Debian hat man keine Chance, ich mache das Bare Metal. Die Timings habe ich ganz gut im Griff (siehe Repo/anderer Thread), das Anhalten möchte ich testen, für den Fall, dass bspw. die Daten, die ich brauche noch nicht in L1/L2 Cache sind (z.B. wenn ich ein Bankswitching Cart mit zu viel Speicher emuliere)

    Wenn du dich also nur auf das R/W-Signal

    konzentrierst, dann kannst du auch Pech haben. Ich würd's eher lassen.

    In meinem Fall würde der Ablauf sowieso durch einen Schreibzugriff auf IO1/2 getriggert werden, d.h. ich beginne mit der Verarbeitung desselben.

    In Gideon's Dokument hieß es, die REU würde kurz nach der fallenden Phi2-Flanke an DMA ziehen -- nur nochmal um sicherzugehen: Du meinst das müsste egal sein und ich kann einfach loslegen? (das könnte ich schon einfach probieren, aber nachdem immer ein paar Dinge zusätzlich laufen, ist jede belastbare Information wertvoll :-))

    Eventuell sagt du einfach was GENAU du vorhast, dann liesse sich sicher besser helfen.

    Welche Peripherie ist es denn?

    ein Raspberry Pi3, in etwa der Beschaltung wie im Repo in meiner Signatur ... aber nachdem ich nichts machen möchte, außer den CPU anhalten und mich da nach den Notwendigkeiten richten würde, ist es vermutlich nicht so relevant und ich hab's erstmal ausgeklammert :P


    von den 3 Zyklen habe ich gelesen -- kann ich nicht auch Phi2 nehmen? In meinem Test, der am Ende dann funktioniert hat, habe ich DMA nach x Phi2-Zyklen wieder freigegeben, also müsste es weiterlaufen...


    Und das mit den 80ns habe ich noch nie gehöhrt, ich selbst

    habe mal einen Standalone-6510 per DMA deaktiviert und wieder

    aktiviert, hat prima funktioniert.

    die 80ns wurden wohl bei der REU gemessen, die DMA immer nach einem Schreibzugriff triggert (so wie ich es auch vorhätte)

    Danke für die Erläuterungen! So hatte ich das auch verstanden, nur nicht, warum es nicht EDIT: tut tat =)

    Wenn du also die CPU warten lassen willst, dann musst du zum

    einen das DMA-Signal auf LOW ziehen, zum anderen bei Systemzugriff

    (z.B. Speicher-Lese/Schreib-Zugriff) das BA-Signal berücksichtigen.

    ich will ja gar nichts machen -- darf ich also DMA ziehen und ansonsten gar nichts tun? Zu welchem Zeitpunkt müsste man DMA denn ziehen?

    In Gideon's Beschreibung steht (wenn sich das auf meinen Fall übertragen lässt):

    nach einem Schreibzugriff darf man DMA ca. 80ns nach Flanke Phi2->low ziehen und irgendwann später bei Phi2=low wieder loslassen. Richtig?

    EDIT: ok, so funktioniert es tatsächlich, daher ändere ich meine Frage ab: was gibt es zu beachten, während ich DMA gezogen habe? Wann passiert irgendetwas, was dann doch die CPU/VIC/sonstwas beeinflusst?

    Hallo,

    ich suche eine Möglichkeit, die CPU vom C64 vom Expansionsport aus für kurze Zeit (sagen wir mal ein paar Millisekunden) einzufrieren, bis meine angeschlossene Peripherie bereit ist. Nicht zu verwechseln mit dem, was Freezer-Module vorhaben (per NMI), es muss auf C64-Seite nichts ausgeführt werden. Normalerweise würde man das ins Kommunikationsprotokoll C64-Peripherie aufnehmen, aber das geht in diesem Fall nicht.

    Meine erste Idee war die IRQ-Leitung zu ziehen (inspiriert durch die CPU-Bremsen), aber das stoppt ja nicht alles. Die zweite war, mit der DMA-Leitung zu experimentieren, aber da bin ich mir nicht sicher, wann man da was macht. Der Zeitpunkt zu dem ich das tun möchte ist direkt nach einem Schreibzugriff in IO1/2, könnte also ein Mechanismus ähnlich der REU funktionieren? (nur dass ich von außen nichts mit dem C64 tun möchte) Ich hatte mal Safely Freezing the C64 von Gideon angeschaut, aber so auf Anhieb einfach nur an DMA ziehen, wollte nicht klappen.

    Gibt es da Möglichkeiten? Was genau müsste man mit und bei DMA anstellen?