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

    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?)

    Du meinst kritisch bzgl. Anzahl aufeinanderfolgender Schreibzugriffe?

    Da ist BRK kritischer, da sind es 3 writes. Aber das mit 2

    aufeinanderfolgenden Lesezugriffe nach einem Schreibzugriff gilt immer.

    Edit: eine Zyklenfolge wie Write-Read-Write habe ich noch nie gesehen

    (z.B. im Visual6502, am echten 6510) und auch noch nie von gelesen.

    Ich hab's jetzt mal grob überflogen, für ein gutes Verständnis

    sollte mal mMn den Ablauf der Befehlsabarbeitung kennen:

    Die ersten beiden Zyklen sind immer Lesezugriffe,

    Schreibzugriffen folgen immer mindestens 2 Lesezugriffe etc.

    Damit hat man also die Sicherheit nach einem Schreibzugriff

    (R/W-Pegel zieht auf HIGH?, sonst wird weiter geschrieben)

    mindestens 2 Lesezugriffe. Und hier hilft ein Blick ins

    MOS6500 HardwareManual (such mal danach), da ist das

    RDY-Signal so beschrieben: falls in einem Lesezugriff das

    RDY auf LOW gezogen wird, dann wird die CPU sofort

    angehalten. Ich würde hier aber das Timing so gestallten,

    dass der aktuelle Lesezugriff noch abgearbeitet wird.

    Das heisst also, nach einem Write-Ende bis du mit deine

    DMA-Zugriff auf der sicheren Seite.

    In Gideon's Beschreibung steht jetzt allerdings noch eine

    Bemerkung zu NMI, die habe ich noch nicht komplett

    verstanden. Aber ob das was mit deinem DMA-Zugriff in

    der Resetphase zu tun hat, glaube ich kaum.

    Edit: sowohl im MOS6500-Manual als auch im 6510-Datasheet

    wird das Timing von AEC beschrieben, das von BA fehlt leider!

    Beim Lesen bin ich gerade auf einen grossen Denkfeher meinerseits

    gestossen: DMA löst ja sowohl BA als auch AEC aus, d.h. ein noch

    auszuführender Schreibbefehl (es können auch zwei sein) wird

    nicht mehr ausgeführt. D.h. du musst im schlimmsten Fall zwei

    aufeinanderfolgende Schreibbefehle abwarten. Das Problem ggü

    dem 6502 ist aber, das die CPU kein SYNC-Signal hat. Wie man

    also das Ende der Schreibzugriffe (und Lesezugriffe sind auch

    wichtig) des aktuellen Befehls erkennen kann muss ich mir noch

    überlegen. Sorry für die gestiffteteVerwirrung, aber bis jetzt

    habe ich nur die CPU issoliert angesteuert, da mache ich das

    mit den 3 Taktzyklen immer automatisch, ist aber am ExPort so

    nicht möglich. Puh!

    Ich bin nochmal über den Schaltplan gehuscht und habe nochmal

    über meine Bemerkungen nachgedacht. Meine Kenntnisse

    umfassen nur einen sehr kleinen Teil des C64 (Timing-Kenntnisse

    z.B. sind nur sehr grob vorhanden), und auch den 6510 kenne

    ich nur einigermassen, von daher lerne ich auch (gerne) immer

    wieder was dazu: meiner Meinung nach darf man BA des 6510

    jederzeit ansteuern, das Problem beim C64 ist aber, das DMA

    sowohl BA als auch AEC gleichzeitig ansteuern (siehe Schaltplan,

    da sind es zwei UND-Gatter, leicht zu finden). Das heisst also,

    wenn du ungünstig DMA auf LOW ziehst, dann kannst du evtl.

    einen Schreib- oder auch Lesezugriff beeinflussen. Beides kann

    schlimm sein. Von daher muss man nochmal in das 6510-Datasheet

    (6502-Datasheet geht auch) reinschauen und dir klarmachen,

    wann ein R/W-Zugriff abgeschlossen ist. Erst dann darf der

    Addressbus per AEC abgeklemmt werden. Von diesem Zeitpunkt

    abziehen (NICHT hinzuaddieren!) kann man noch die Laufzeit

    für die erwähnten UND-Gatter, von daher kann das mit deinen

    80ns schon stimmen. Von daher, streich mal meine disbezüglichen

    Bemerkungen weiter Oben.

    Falls du eine Möglichkeit hast, des Bus mal per Logikanalyzer

    auszulesen, setzt mal hier Bilder rein.

    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?

    Nach einem Reset wird ja zuerst die KERNAL-Resetroutine abgearbeitet,

    dann erst die BASIC-Resetroutine (oder falls ein Modul vorhanden ist,

    dort hingesprungen). 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?

    Ansonsten würde ich sagen, das bei einer softwaretransparenten

    Behandlung des DMAs wie oben schon von mir beschrieben zu

    jeder Zeit möglich sein sollte, ein Grund fällt mir so auf die schnelle

    nicht ein.

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

    Das lese ich mir gerade durch.

    Wenn mein Gerät den IO Schreibzugriff bekommt (ist hier der Fall), dann behandle ich den natürlich, aber ob ich den Bus lese oder nicht dürfte doch dem Rest nichts machen?

    Wenn die CPU schreibend auf dein Gerät zugreift (ist ja auch die einzige

    Möglichkeit für einen IO-Zugriff?), dann musst du ja den Datenbus

    auslesen. Sonst gehen ja deinem Gerät Daten verloren.

    Und, welchen Rest meinst du, den kompletten C64? Dem ist es ja

    egal. Deinem Programm, das auf dein Gerät gerade zugreift, aber

    nicht.

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

    Oh ha, das wird gefährlich. Denn ein IO1/2-Signal zeigt ja an, das der aktuelle Befehl auf

    dein Device zugreifen will, und dieser Zugriff muss natürlich entsprechend behandelt

    werden. D.h. ein Lese-Zugriff muss ein Ergebnis auf dem Datenbus leifern und ein

    Schreib-Zugriff muss den Datenbus auswerden, sonst geht irgendwo etwas verloren.

    Am besten ist also, du setzt möglichst früh, z.B. nach dem Reset bzw. Einschalten

    des C64 das DMA-Signal und bist so auf der sicheren Seite.

    kann ich nicht auch Phi2 nehmen?

    Sorry, mein Fehler, ich habe hier nur einen sehr schlechten Schaltplan und

    deshalb Phi2 übersehen. Hatte mich auch schon gewundert, dass auf dem

    ExPort kein Clocksignal ausgegeben wird. Natürlich kannst du dann Phi2

    verwenden.

    Und was mir gerade noch so durch den Kopf schiesst: einige Befehle bzw.

    deren Addressierungsmodi schreiben teilweise zweimal, beim ersten mal

    auf die Addresse, die sich durch z.B. Addition von AddrLo + X ergibt, beim

    anschliessenden (d.h. nächster Takt) auf die Addresse, die sich durch

    einen Überlauf von AddrLo+X ergibt. D.h. hier ist Vorsicht geboten.

    Soweit ich aber weiss, ist die 3-Takt-Regel auf jedenfall zuverlässig (der

    einzige Fall, den ich aber noch nicht ausprobiert habe, ist der der

    illegalen Befehle. Da weiss ich leider nicht, ob Schreibzugriffe auch

    mehr als einen Takt auseinanderliegen, gelesen habe ich davon in Foren

    bzw. Blogs noch nichts). Wenn du dich also nur auf das R/W-Signal

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

    Insgesamt, da du eh nicht liest/schreibst: setze DMA einfach auf LOW

    und wenn dein Modul bereit ist wieder auf HIGH, die 3-Takt-Regel

    kannst du in dem Fall ignorieren. Du musst nur bedenken, dass der

    aktuelle Befehl noch abgearbeitet wird. Falls du das ganze nach

    einem Reset machst (braucht glaube ich 6 Taktzyklen), dann geht

    dir eiglich keine CPU-Operation durch die Lappen.

    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?

    Gideon's Beschreibung kenne ich jetzt nicht, aber soweit ich es bisher

    verstanden habe kann man zu jedem beliebigen Zeitpunkt

    DMA=LOW setzen.

    UND GANZ WICHTIG(!!), was ich explizit vergessen habe zu erwähnen,

    was aber für dein Projekt nicht wichtig zu sein scheint: Die CPU schaltet

    nach einem RDY=LOW erst nach 3 Taktzyklen in den Idle-Modus, d.h.

    du hättest erst nach diesen 3 Taktzyklen Zugriff auf das Bussystem,

    vorausgesetzt der VIC greift gerade nicht drauf zu. Der ExPort hat aber

    kein Phi0-Signal als Ausgang, nur die Dotclock, d.h. du müsstest also

    8*3 Dotclock-Takte abwarten und auf den Bus zuzugreifen. Das schreibe

    ich aber nur für den Fall, dass du doch noch Lust auf einen Buszugriff

    bekommst. 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.

    Aber warte bitte noch auf ein anderes Forenmittglied, das dir meine

    Beschreibung bestätigt. Sicher ist sicher (alte tautologische Weissheit).

    Edit: schau dir mal die VIC-II-Docs von Christian Bauer an, die

    beschreiben das grobe Timing für DMA-Zugriff vom VIC.

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

    Du hast ja am ExPort 2 wichtige Signale:

    - DMA erlaubt dir im Prinzip, die CPU anzuhalten und auf das gesamte

    System zuzugreifen (dazu wird gleichzeitig der RDY-Pin und der

    AEC-Pin der CPU auf LOW gezogen, d.h. die CPU hält nach spätestens

    3 Takten und der Address-Bus wird für dich freigegeben).

    - BA (vom VIC) signalisiert dir, dass der Graphikchip auf das System

    zugreifen will. Das lässt sich nicht verhindern, d.h. das muss bei

    deinem Projekt berücksichtigt werden.

    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.

    Das BA-Signal ist im Prinzip für dich das selbe wie das AEC-Signal

    für die CPU, du musst bei BA=LOW deinen Addressbus inaktivieren

    und deine Zugriffe bis BA=HI warten lassen.

    Schau dir am besten mal den Schaltplan an, dann sollte es klar sein.