Hallo Besucher, der Thread wurde 2,1k mal aufgerufen und enthält 14 Antworten

letzter Beitrag von Werner1971 am

Ausdekodierung der VIAs im VC-20

  • An einer Stelle werde ich aus dem Schaltplan des VC-20 echt nicht schlau:


    Die beiden VIAs erscheinen bei $91xx, üblicherweise werden die 16 Register von VIA #1 mit $911x und von VIA #2 mit $912x angesprochen. $913x selektiert beide gleichzeitig (naja...), und dann gibt es noch 3 Spiegelungen bei $915x/$916x, $919x/$91Ax und $91Dx/$91Ex. So weit, so gut. Bei $9000..$90FF die 16 Register des VIC, 16-fach gespiegelt. Und $92xx und $93xx verhalten sich wie "offen", d.h. nicht vorhanden.


    Nur sehe ich im Schaltplan keinen IC, der diese Ausdekodierung "vervollständigt"!


    UC6 erzeugt für den Bereich $9000 .. $93FF ein /CS für beide VIAs und geht dort jeweils an /CS2. CA4 ist mit CS1 von VIA1 und CA5 mit CS1 von VIA2 verbunden (womit sich auch die Doppel-Selektierung für $913x erklärt).


    Warum aber werden die VIAs nur in $91xx eingeblendet, und nicht auch in $90xx, $92xx und $93xx?

  • hi,
    bin komplett unbelastet was den VC 20 angeht, hab mir aber mal die Beschaltung von UC6 angeschaut, leider blick ich nicht so ganz wie die $91xx überhaupt zustande kommen..


    laut Beschaltung des UC6 wird _Q4 verwendet um das gemeinsame _CS2 für VIA 1&2 zu erzeugen.
    hab mir das aus dem Plan so rausgelesen:


    IC UC6:
    /Q4 =/G2A+ /G2B+ G1+ /A0+ /A1+ A2
    ->
    /Q4 = /A14+ /A13+ A15 + /A10+ /A11+ A12
    ->
    /Q4 = $8000+$1000
    /Q4= $9000-$93FF
    dazu dann noch A4 für CS1 VIA1 und A5 für CS1 VIA2


    mir fehlt bei der Rechnung A8 um auf die $91xx zu kommen..??
    wo ist mein Denkfehler?

  • Ja, es muß gelten CA8=1 und CA9=0.


    Das ganze würde ja evtl. so wie beobachtet funktionieren, wenn sich da *irgendwo* ein Wired-AND von CA4/CA5 mit CA8 an CS1 und ein Wired-OR von I/O0 (Select $9000 .. $93FF von UC6) mit CA9 an /CS2 auf der Platine befinden würde.


    Schlimmstenfalls ist da eine Timing-Sauerei am Werk.


    Aber erstmal schön zu wissen, daß ich da mit meiner Konfusion nicht allein bin. :drunk:

  • wie gesagt,keine Ahnung vom VC20, aber laut einer Memory Map die ich unter Zimmers.net gefunden habe belegt der VIC den Raum von $9000-$900F, da aber ja der ganze I/O 0 Bereich gar nicht weiter aufgedröselt wird in Ermangelung der Auswertung von A8 vermute ich das die VIA1 und 2 ebenfalls ab $9010 und $9020 selektiert werden und dann eben ab $9110 $9120 ,$9210 $9220, $9310 $9320 nochmal. Da ja Via 1 dann auf $9010 und Via 2 auf $9020 hören würden, würden sie sich auch nicht mit dem VIC in die Quere kommen der $9000-$900F belegt.

  • So wie von dir beschrieben ist es aber leider nicht: Im VA-Bus "sieht" sich der VIC bei $1000 und laut Datenblatt und übereinstimmend mit dem beobachteten Verhalten werden die Register des VIC selektiert, wenn VA12=VA11=VA10=VA9=VA8=0 und VA13=1 ist. VA4 bis VA7 werden nicht abgeprüft, und damit tauchen die Register 16x gespiegelt in der Speicherseite $90xx auf.


    Im "VC-20 Intern" wird ab Seite 194 unten und Seite 195 auch kräftig herumgerudert. Das tatsächlich beobachtete Verhalten, daß die VIAs nur 4-mal in der Seite $91xx auftauchen, sich aber bei $90xx nicht mit dem VIC beißen und in $92xx und $93xx nicht selektiert werden, wird dort auch nicht stichhaltig geklärt.


    Edit: WTF, in VICE sieht das jetzt so aus, als ob die VIAs doch auch in $92xx und $93xx auftauchen - das muß ich nochmal an echter Hardware gegenchecken. Aber selbst, wenn es so ist, erklärt es immer noch nicht die "Kollisionsfreiheit" zum VIC. ...


    Edit 2: oder es gibt dann tatsächlich diese Kollisionen. Das bedeutet, daß es eine schlechte Idee ist, die Spiegel des VIC herzunehmen, für die CA4=1 oder CA5=1 ist ...!


    Ich weiß jetzt, was ich nächste Woche mal zu überprüfen hab. Ich hab da jetzt folgende Theorie: beim gleichzeitigen Lesen von einem VIC- und VIA-Register "drückt" der 245 die Ausgabe vom VIA weg. Und beim Schreiben, tja, werden halt sowohl VIC-Register als auch VIA-Register beschrieben.

  • hmm, so ganz im Film bin ich da nicht, aber mit scheint der Adressbus des VICs ist durch die beiden LS245 vom Adressbus der 6502 entkoppelt je nachdem wer grad dran ist , ist der VIC "Busmaster" ,dann wird die CPU durch die 245er vom Bus getrennt und eben anders herum..So ähnlich wie bei C64 mittels AEC an der CPU,die der 6510 hat aber der 6502 eben noch nicht.
    Dann kann die Memory Map wie der VIC sie sieht natürlich eine komplett andere sein, als die Statische durch die CS Auswertung der LS138..


    also möglicherweise so:


    9000-900F VIC
    9010-911F VIA 1 (CS1=A4 = 16Byte Space)
    9020-903F VIA 2 (CS1=A5 = 32Byte Space)
    9040-90FF Keine Ahnung wer hier wohnt..


    9100-91FF Spiegelung
    9200-92FF Spiegelung
    9300-93FF Spiegelung

  • Deine Antwort hat sich mit meinen Edits überkreuzt, da hatte ich die Daten- und Adreßbusbuffer schon ins Spiel gebracht.


    Der VIC wird auf jeden Fall durch den 6502 bei $90xx selektiert - das ist $10xx im VA-Bus, aber VA13 ist über den Adreßbusbuffer mit /BLK4 verbunden, wenn die CPU das Sagen hat.


    Die VIAs werden im ganzen Bereich $9000..$93FF selektiert und überlappen bei $90xx auch mit dem VIC.


    Dadurch, daß entweder CA4=1 oder CA5=1 sein müssen, gibt es aber in der $90xx-Seite Lücken, so daß auf den VIC zugegriffen werden kann, ohne daß sich die VIAs angesprochen fühlen: bei $900x, $904x, $908x und $90Cx. Wählt man andere 16-Byte Paragraphen, so passiert folgendes: beim Lesen arbeiten die Ausgangstreiber der VIA-Register gegen den 245 des Datenbusses den VIC und verlieren. Der 6502 liest den Inhalt des VIC-Registers. Schreibt die CPU, so geht der Wert gleichzeitig in (mindestens) einen der VIAs und in das VIC-Register.


    Ab $9100 ist dann der Zugriff auf die VIAs möglich, ohne daß der VIC oder ein anderer Chip auf der VIC-Seite selektiert sind. Der 245 am Datenbus hat keine "Vorgabe", was er auf dem Datenbus CPU-seitig treiben soll, also kann die CPU die VIA-Register lesen. Und Schreiben geht ohnehin. Edit: Quatsch: noch mal ein scharfer Blick in den Schaltplan zeigt, daß die VIAs tatsächlich ja auf der VIC-Seite des Datenbusses hängen! Damit müssen sie beim Lesen nicht gegen den Treiber arbeiten - und verlieren nur auf der $90xx-Seite beim Lesen gegen den VIC. :whistling:


    Muß, wie gesagt, nur noch an echter Hardware verifiziert werden. :)

  • schade, hab leider keinen VC20 zum spielen :-(
    aber spannendes Thema, gib mal Rückmeldung wenn Du was raus-gefunden hast am lebenden Objekt!




    http://web.archive.org/web/200…ties.com/rmelick/6561.txt



    da steht:


    VIC chip addresses Ordinary addresses memory


    0 ---------------------- 32768 Unreversed Character ROM
    1024 ------------------- 33792 Reversed Character ROM
    2048 ------------------- 34816 Unreversed upper/lower case ROM
    3072 ------------------- 35840 Reversed upper/lower case ROM
    4096 ------------------- 36864 VIC and VIA chips
    5120 ------------------- 37888 Colour memory
    6144 ------------------- 38912 Reserved for expansion
    7168 ------------------- 39936 Reserved for expansion


    8192 ----------------------- 0 System memory
    9216 ------------------- 1024 Reserved for expansion
    12288 ------------------ 4096 Program
    15360 ------------------ 7168 Screen

  • Also, zum Testen hab' ich jetzt mal folgende zwei Programme vorgesehen:


    Code
    1. 1 V=36864:A=PEEK(V+2):S=1
    2. 2 POKEV+256+32+2,255
    3. 3 POKEV+32+2,127
    4. 4 POKEV+2,A
    5. 5 IF0=(128ANDPEEK(V+256+32))THENPRINTS:S=S+1
    6. 6 GOTO5
    7. 7 :
    8. 8 REM ** VIC-VIA-WRITE-COLLISION


    Code
    1. 1 V=36864:A=PEEK(V)
    2. 2 POKEV+256+16+2,255
    3. 3 POKEV,85:POKEV+256+16,170
    4. 4 X=PEEK(V+16):POKEV,A
    5. 5 PRINTX
    6. 6 :
    7. 7 REM ** VIC-VIA-READ-COLLISION


    Der Write-Collision-Test setzt zunächst das VIA #2 Port B DDR auf den Standardwert 255 und dann evtl. gleichzeitig zusammen mit einem VIC-Register auf 127, so daß Joystick rechts doch ausgelesen werden kann und S hochzählt.


    Der Read-Collision-Test setzt VIA #1 Port B auf Ausgang und schreibt 170 in Port B. VIC-Register 0 wird auf 85 gesetzt. Dann versucht das PEEK() in Zeile 4 evtl. sowohl aus dem VIC-Register als auch aus dem VIA-Register zu lesen. Was kommt raus? 85? 170? Oder etwa 0?

  • Wo ist das Problem? Die VIA liegen von 9000 bis 93FF im Schema 16 Bytes frei, 16 Bytes VIA1, 16 Bytes VIA2, 16 Bytes beide gleichzeitig. Da drüber liegt von 9000 bis 90FF die VIC-Registerbank (16 Register mal 16 Spiegel).


    Ergo fällt die erste VIC-Registerkopie (9000) in eine freie Stelle, die VIAs sind erstmals ab 9110 bzw. 9120 konfliktfrei erreichbar, und das sind auch die Standard-Adressen.


    Weitere nutzbare VIC-Kopien liegen bei 9040, 9080 und 90C0; die VIA-Register wiederholen sich ebenfals alle $40 Bytes in den Pages 91xx, 92xx und 93xx. Alles andere gibt entweder einen Konflikt zwischen VIC und den beiden VIAs oder ist freier Adreßraum.


    Tricky, aber weit entfernt von Hexerei, Timing-Tricks oder selektiv geschalteten Bus-Puffern. Es wäre natürlich schöner, wenn A4-A7 in der VIC-Adresse auch noch ausdekodiert wären, oder es wie beim 64er einen externen CS-Pin gäbe, aber unterm Strich geht das auch so ganz gut.


    (übrigens, das Mapping von BLK8 auf VA7 dient nur dazu, den VIC-Adreßrau auf 0000/1000 und 8000/9000 im Prozessor-Adreßraum aufzuteilen)

  • Wo ist das Problem? Die VIA liegen von 9000 bis 93FF im Schema 16 Bytes frei, 16 Bytes VIA1, 16 Bytes VIA2, 16 Bytes beide gleichzeitig. Da drüber liegt von 9000 bis 90FF die VIC-Registerbank (16 Register mal 16 Spiegel).


    Ergo fällt die erste VIC-Registerkopie (9000) in eine freie Stelle, die VIAs sind erstmals ab 9110 bzw. 9120 konfliktfrei erreichbar, und das sind auch die Standard-Adressen.


    Weitere nutzbare VIC-Kopien liegen bei 9040, 9080 und 90C0; die VIA-Register wiederholen sich ebenfals alle $40 Bytes in den Pages 91xx, 92xx und 93xx. Alles andere gibt entweder einen Konflikt zwischen VIC und den beiden VIAs oder ist freier Adreßraum.


    Danke. Das faßt meine Überlegungen von Post #1 bis Post #8 gut zusammen. :)


    Ich war halt von der falschen Annahme ausgegangen, daß der VIC nur in $90xx selektiert wird, die beiden VIAs nur in $91xx selektiert sind, und $9200 .. $93FF "offen" sind.


    Zitat

    (übrigens, das Mapping von BLK8 auf VA7 dient nur dazu, den VIC-Adreßrau auf 0000/1000 und 8000/9000 im Prozessor-Adreßraum aufzuteilen)


    Du meinst /BLK4 auf VA13. ;)