Verständnisfrage CIA, Tastatur, Joystick

Es gibt 15 Antworten in diesem Thema, welches 2.221 mal aufgerufen wurde. Der letzte Beitrag (13. November 2015 um 08:02) ist von Claus.

  • Hallo,
    ein paar Fragen zum grundlegenden Ablauf der Kommunikation mit der Aussenwelt:

    Laut Bitte melde dich an, um diesen Link zu sehen. ist ja die CIA1 für Tastatur und Joystickabfrage zuständig, und die Abfrage erfolgt im Kernal.
    Dabei wird wohl Port A Als Ausgang und Port B als Eingang definiert. Soweit noch alles klar.
    Die Tastaturabfrage geschieht nun über eine 0 die durch die einzelnen PortBits von Port A geshiftet wird und dann wird an Port B geprüft ob eine Leitung nun auf Low liegt -> Tastendruck. Auch das verstehe ich noch.
    Wie läuft das aber jetzt mit den Joysticks?
    An Port B (Joy1) verstehe ich es ja noch, der Port ist auf Eingang gestellt, durch die internen Pull-Ups auf High und der Joystick zieht die entsprechenden Leitungen auf Low, indem ein Schluss zu GND geschaffen wird.

    Aber was ist mit Port2 (also CIA Port A)? Der ist doch auf Ausgang programmiert - wie kommt da die Pegeländerung zustande? Da sollte doch immer das anliegen was als letztes ins Datenregister reingepoked wurde, warum also reagiert der Port auf den Schluss zur Masse im Joystick? Da würde doch de facto ein Kurzer entstehen, da der ausgang 5V direkt an Masse anlegt, belastet das nicht den Ausgang arg?

    (Ach ja, kurze Seitenfrage: Die $7F die da ohne Betätigung anliegen ergeben sich daraus dass der Ausgang zwischen den Shiftereien so 'geparkt' wird- es wird also nicht bei jeder Tastaturabfrage durch den Kernal der Zustand des Ports abgefragt?)

    Was würde eigentlich passieren wenn man beide DDR der CIA auf Ausgang programmiert und dann eine Taste drückt? Die Ausgänge kollidieren dann ja, könnte das einen Schaden an der CIA verursachen (aka 'Killerpoke')?

    GREETINGS PROFESSOR FALKEN
    A STRANGE GAME.
    THE ONLY WINNING MOVE IS NOT TO PLAY.
    HOW ABOUT A NICE GAME OF CHESS?

  • Was würde eigentlich passieren wenn man beide DDR der CIA auf Ausgang programmiert und dann eine Taste drückt? Die Ausgänge kollidieren dann ja, könnte das einen Schaden an der CIA verursachen (aka 'Killerpoke')?

    Das Datenblatt der NMOS6526 sagt "CMOS-compatible I/O-lines" - sind also quasi kurzschlußfest (also nicht niederohmig - sonst wäre solch ein "POKE" in der Tat ein Overkill). Die meisten CIA´s sterben durch statische Überladung/Potentialunterschiede von außen oder durch zu hohe Stromversorgung.

    Joy2 Abfrage ? Is mir neu, daß es dafür ne Kernal-Routine gibt ( oder macht $FFE4 die Joysticks mit (bin mir gerad nich sicher)).
    Joystick-Abfragen macht man doch eigentlich direkt mit Setzen/Auswertungen von $DC00/$DC01 (bzw. $DC01/$DC00) - ich seh da jetzt kein Problem ....

    EDIT:
    aufpassen mußte man nur beim DTV, weil sich da nur 1 der beiden Ports auf Ausgang schalten lässt.

    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.

  • Joy2 Abfrage ? Is mir neu, daß es dafür ne Kernal-Routine gibt ( oder macht $FFE4 die Joysticks mit (bin mir gerad nich sicher)).
    Joystick-Abfragen macht man doch eigentlich direkt mit Setzen/Auswertungen von $DC00/$DC01 (bzw. $DC01/$DC00) - ich seh da jetzt kein Problem ....


    Ich bezog mich auch hier auf die Bitte melde dich an, um diesen Link zu sehen.
    Da ja bei Port 2 andere Werte anliegen als bei Port 1 ging ich davon aus dass dies der unterschiedlichen Nutzung geschuldet sei - da keine tiefergehenden Erklärungen dabei waren auch meine Nachfrage.
    Denn wenn Port2 ja wirklich dauerhaft als Ausgang programmiert ist frage ich mich in der Tat wie das klappt.

    GREETINGS PROFESSOR FALKEN
    A STRANGE GAME.
    THE ONLY WINNING MOVE IS NOT TO PLAY.
    HOW ABOUT A NICE GAME OF CHESS?

  • Bladerunner meinte vmtl mit KERNAL die IO/Init (die wohl nur als Referenz im Artikel verlinkt wurde, evtl verwirrend)
    Bitte melde dich an, um diesen Link zu sehen.
    Zum Auslesen der Tastaturmatrix/Joysticks genügt in der Tat völlig LDA $DC00 und LDA $DC01 wie hier erklärt
    Bitte melde dich an, um diesen Link zu sehen.

  • Denn wenn Port2 ja wirklich dauerhaft als Ausgang programmiert ist frage ich mich in der Tat wie das klappt.

    wenn ein Port auf Ausgang gesetzt wurde, wird trotzdem bei einem READ-Zugriff der Pegelstatus an den Portpins übergeben.
    Also ist bei DDR=1 Lesen und Setzen der Ports möglich, bei DDR=0 ist nur Lesen möglich - auch wenn du ein STA auf den Port machen würdest (so sagt es zumindest das Datenblatt des 6526).

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

    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.

  • Und da hakt es: Wenn ich den Port per DDR auf Ausgang stelle, wird doch der Inhalt des Datenregisters auf die PortPins gelegt, also definiere ich doch dann selbst was da auf dem Port anliegt.
    Oder arbeitet das mit einer Art Latch und wenn ich lese wird kurzfristig auf Eingang umgeschaltet?

    GREETINGS PROFESSOR FALKEN
    A STRANGE GAME.
    THE ONLY WINNING MOVE IS NOT TO PLAY.
    HOW ABOUT A NICE GAME OF CHESS?

  • Oder arbeitet das mit einer Art Latch und wenn ich lese wird kurzfristig auf Eingang umgeschaltet?

    genau so.
    Und da an den Ports interne PullUps hängen, schalten die Joysticks direkt gegen GND
    Setzt Du einen Port auf Ausgang (DDR=1) und schreibst in den Port ein #$00, dann ist der Port nur so lange auf #$00, solange du diesen Port nicht ausliest.
    So kannst Du direkt die Joysticks abfragen, Joy1 mit LDA$DC01 und Joy2 mit LDA$DC00 (natürlich mit anschließender Auswertung der Bits 0-4).

    EDIT:
    nur der gleichzeitige Druck einer "passenden" Taste könnte Dir da in die Suppe spucken, sofern der jeweils andere Port eines der Bit´s 0-4 noch auf 0 gesetzt hat.

    Bilder

    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.

  • nur der gleichzeitige Druck einer "passenden" Taste könnte Dir da in die Suppe spucken, sofern der jeweils andere Port eines der Bit´s 0-4 noch auf 0 gesetzt hat.

    und genau das beobachtet man ja auch reichlich.

    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.

  • Ok, das mit dem Latch ist nun klar, dann kommt aber die nächste Frage auf: Warum lese ich dann bei Port zwei bei nicht gedrückter Taste / Joystick eine $7F aus anstatt eine $ff, wie ich es bei acht Eingängen die auf High gezogen werden erwarten würde?
    Liegt das An der Paddle-Konfiguration?

    GREETINGS PROFESSOR FALKEN
    A STRANGE GAME.
    THE ONLY WINNING MOVE IS NOT TO PLAY.
    HOW ABOUT A NICE GAME OF CHESS?

  • Oder arbeitet das mit einer Art Latch und wenn ich lese wird kurzfristig auf Eingang umgeschaltet?

    Nein, auch nicht. Schau dir das angehängte Bild aus dem Datenblatt des 6522 an, es zeigt die Schaltung der Ports, einmal für Port A und einmal für Port B. Man sieht hier deutlich, daß die Leitung die beim Auslesen des Registers benutzt wird direkt am Pin hängt. Du liest also, wenn du das Datenregister ausliest immer den Zustand des Pins und nicht den Zustand des Registers selbst aus.

    Welchen Treibertyp der 6526 verwendet steht leider nicht im Datenblatt (zumindest in dem was ich habe), aber es ist sehr wahrscheinlich einer von beiden.

  • Warum lese ich dann bei Port zwei bei nicht gedrückter Taste / Joystick eine $7F aus anstatt eine $ff, wie ich es bei acht Eingängen die auf High gezogen werden erwarten würde?

    Sicher, daß dir hier nicht der KERNAL reinspuckt und in der IRQ-Routine im Register rumspielt? Teste das nochmal mit abgeschalteten IRQs.

  • Ok, das mit dem Latch ist nun klar, dann kommt aber die nächste Frage auf: Warum lese ich dann bei Port zwei bei nicht gedrückter Taste / Joystick eine $7F aus anstatt eine $ff, wie ich es bei acht Eingängen die auf High gezogen werden erwarten würde?


    Das was aussen am Gehäuse als Control Port 2 bezeichnet wird ist intern Port A, also der Ausgang, $7f ist der Wert, der dort am Ende der Keyscan Kernelroutine hineingeschrieben wird.

    Control Port 1 ist dagegen Port B, also der Eingang, und liefert auch wie erwartet $ff zurück, wenn keine Taste gedrückt ist.

  • hallo Gerrit,

    im Datenblatt des 6526 steht zwar kein entsprechendes Diagramm der inneren Port-Beschaltung,
    aber auf Seite 5 (von - nur - 8 Seiten, verglichen mit 22 beim 6522!) befindet sich folgende textliche Passage:

    Zitat

    Port A and B have passive pull-up devices as well as active pull-ups, providing both CMOS and TTL compatibility

    ... wobei dieses "both" eigentlich ein Overkill ist und eine Unklarheit im Design bedeutet.
    Diese textliche Beschreibung trifft exakt auf die von dir zitierte Innenschaltung von Port B des VIA 6522 zu.
    Port A und Port B des CIA entsprechen somit in etwa der Ausgangstreiberbeschaltung von Port B des VIA 6522.

    Somit hat der CIA 6526 die feindifferenzierte Innenbeschaltung des VIA aufgegeben und durch eine "Monokultur" ersetzt; obendrein wurde die Unterscheidung auch bei CA1/CB1 einerseits und CA2/CB2 wobei letztere auch als Inputs konfiguriert werden konnten, nivelliert bzw. durch "Fachidiotenmässig" spezialisierte Pins an denen man nicht mehr viel konfigurieren kann, ersetzt. Zum Ausgleich für all diese Sparmaßnahmen hat man die Buffer-Treiberleistung von 1 auf 2 TTL-Lasten verdoppelt - wie ich finde ein sehr banaler, schwacher Ausgleich für den Verlust an Reichhaltigkeit.

    Zu sagen, beim Lesen werde beim CIA immer der tatsächliche Pegel am Pin gelesen, steht zwar so im Datenblatt des 6526, und ergibt sich in der Praxis (meist) aus den tatsächlichen Beobachtungen, war aber meines Erachtens ursprünglich nicht so intendiert, jedenfalls nicht beim 6522.

    Vielmehr ist es Stress für den Baustein, wenn Port B als Output programmiert ist , eine "1" ausgegeben wird und die äussere Beschaltung diesen Pegel auf "0" zu ziehen versucht. Mein Informatiklehrer hat mich damals ausdrücklich vor sowas gewarnt. Ihm verdanke ich auch meine heute stark zerlesenen Fotokopien des R6522-Datenblatts.

    Die o.g. Schaltung steht in Widerspruch zu dem Text des Datenblatts. Es scheint, dass MOS wohl ursprünglich geplant hatte, die Ausgangsleitungen des ORB-Registers bevor sie an die Gates der Ausgangstreiber gelangen (nicht des ORA-Registers! dort werden wirklich nur die Pegel am physikalischen Pin bei Lesezugriffen ausgewertet / zurückgelesen) beim Lesen zurück auf den internen Datenbus zu schalten (über eine 74LS244-ähnliche Treiberkonstruktion). Dann aber hat man gesehen dass das "fast" dasselbe ist wie den externen Pin zurückzulesen, jedenfalls bei der Open-Collector-ähnlichen Variante von Port A, und bei Port B hat man das gewünschte Verhalten dadurch "angenähert", dass dieser Ausgang zusätzlich eine Push-Stufe erhielt (daher berühmt sich dieser Port der "zusätzlichen" CMOS-Kompatibilität und kann Darlington-NPN-Transistoren direkt treiben.) Man meinte wohl, wenn man nicht nur pullen sondern auch pushen kann, wird man mit jedem externen Fremdpegel fertig und wenn man Fremdpegel "niederknüppeln" kann, dann ist das schon so gut wie "unverfälschtes Zurücklesen des ORB-Inhalts".

    Also es war intendiert, dass das ORB-Register beim Zurücklesen ausschlaggebend ist und nicht der tatsächliche Pegel, wenn der betreffende Port-Pin als Output programmiert ist. Man sollte also den zuvor rein softwaremässig geschriebenen Wert zurückerhalten. Ob das beim VIA wirklich gelungen ist, habe ich wohl mal nachgeprüft aber nicht mehr genau in Erinnerung. Selbst wenn der VIA es schafft , ORB zurückzulesen, wird man beim Übergang zum CIA diese löbliche Eigenschaft wohl geopfert haben zugunsten der garstigen Vereinfachung und Verflachung.

    Beim Port A des VIA ist alles ganz anders, und zwar auch intendiert. Zum einen sind hier beim Lesen aufs Datenregister immer die Pegel am Pin ausschlaggebend. Es entscheidet aber noch zusätzlich der Inhalt des Auxiliary-Control-Registers 11, Bit 0, ob der Port (und zwar alle 8 bit Global) als "latched" oder "nicht latched" behandelt wird. in ersterem Fall ist der gelesene Wert nicht der momentan aktuelle, sondern ein zeitlich zurückliegender, der bei der letzten aktiven Flanke von CA1 eingefroren (gespeichert) wurde.

    EDIT: Dieses "Einfrieren" kann noch zusätzlich durch den programmierbaren Hardware-Handshake beeinflusst werden und der programmierte Hardware-Handshake kann wiederum umgangen werden durch Lesen des Alias-Registers, indem man Port A nicht über Adresse 1 sondern Adresse 15 ausliest. Das sind die letzten Feinheiten des VIA 6522 und wer einen PET 3032 oder VC20 besitzt kann sich wahrlich glücklich schätzen ob der bis in die Haarspitzen reichenden wirklich genialen Variationsmöglichkeiten.

    Bei Port A sind mögliche Informationsquellen: 1. der alte gespeicherte Pegel, der während des Lesens durch den aktuellen ersetzt wird, 2. der momentane Pegel, 3. der alte gespeicherte Pegel, der beim Auslesen aber erhalten bleibt (= Register 15)

    Bei Port B sind mögliche Quellen: 1. und 2. wie bei Port A; 3. der softwaremässig geschriebene Wert in ORB kann zurückgelesen werden.

    Komplex, oder? 8)

  • Vielmehr ist es Stress für den Baustein, wenn Port B als Output programmiert ist , eine "1" ausgegeben wird und die äussere Beschaltung diesen Pegel auf "0" zu ziehen versucht. Mein Informatiklehrer hat mich damals ausdrücklich vor sowas gewarnt. Ihm verdanke ich auch meine heute stark zerlesenen Fotokopien des R6522-Datenblatts.

    Wobei es bei NMOS nicht wirklich ein Problem ist einen auf 1 programmiertn Pin extern auf 0 zu ziehen. Was NMOS nicht mag ist ein auf 0 programmierten Pin auf 1 zwingen.

    Gilt nicht mehr für die CMOS-Versionen. Man muss also einen 6522 in dieser Hinsicht anders behandeln als einen 65C22. Bei ersterem ist man auf der sicheren Seite wenn man im Ausgaberegister $FF stehen hat.

  • Zumindest bei Port A würde ich das so stehen lassen.

    Bei Port B des VIA wäre ich da vorsichtiger, denn beschaltungsmässig ist dieser auch beim NMOS-6522 eine waschechte CMOS-Schaltung. (Wir hatten IIRC diese Debatte schonmal bei dem R/W-Pin des TED 8360.) Ob Silikongate- CMOS oder dasselbe nachgebildet in NMOS macht finde ich keinen großen Unterschied, wenn statt des Pullup-Widerstands eine aktive Pull-up-Transistorstufe nach +5Volt zieht. Überleg doch mal, wenn Port B einen Darlington-Transistor nach Plus treiben kann, dann ist da viel mehr Strom dahinter.

    Und der CIA hat nun 2 "VIA-Port-B's".... also Vorsicht. Stand nicht irgendwo, dass die CIA's leicht sterblich seien?

  • Ok, das mit dem Latch ist nun klar, dann kommt aber die nächste Frage auf: Warum lese ich dann bei Port zwei bei nicht gedrückter Taste / Joystick eine $7F aus anstatt eine $ff, wie ich es bei acht Eingängen die auf High gezogen werden erwarten würde?
    Liegt das An der Paddle-Konfiguration?


    Das könnte auch das Problem sein, in das ich kürzlich gelaufen bin: Bit 7 von Port B der CIA1 kann mittels DC0F so konfiguriert werden, dass es einen Unterlauf von Timer B anzeigt. Also entweder Timer deaktivieren, oder Bit 1 in DC0F löschen.

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

    Einmal editiert, zuletzt von Claus (13. November 2015 um 10:00)