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.