Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Problem mit ISR im IM2, ausgelöst durch U855 » Themenansicht

Autor Thread - Seiten: -1-
000
23.03.2026, 21:34 Uhr
HeikoS



Eine Frage an die U880/U855 Hardware-Experten. Ich habe ein Problem mit einer ISR, die durch eine PIO U855 im IM2 ausgelöst wird. Das Problem tritt nur auf, wenn Bit 3 im Low-Teil des Interrupt-Vektors mit D3=1 definiert wurde, also z.B. F8, FA, FC, FE. Scheinbar kehrt diese ISR nicht korrekt zurück, erreicht EI, RETI nicht.

Es soll da ein Problem mit den NMOS Varianten der PIO, speziell mit dem U855, geben. Davon habe ich noch nie etwas gehört. Ist das bekannt?

Viele Grüße, Heiko
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
Heute, 10:45 Uhr
Early8Bitz

Avatar von Early8Bitz

Kehrt die ISR nur nicht zurück oder wird die ISR in den beschriebenen Situationen gar nicht erst aufgerufen?
Poste mal bitte den betroffenen Codeausschnitt:
- PIO Initialisierung
- Interrupt Vectortabelle
- ISR
Am besten als Listing, damit man sieht wo was im Speicher steht.

Bekannt ist mir ein derartiges Problem nicht.

Kannst Du überprüfen, ob das Datenbit 3 der PIO auch sauber mit dem Datenbus der CPU verbunden ist?
--
Gruß
Ralf

Ist ein alter Schaltkreis ein Schaltgreis?

Dieser Beitrag wurde am 24.03.2026 um 10:48 Uhr von Early8Bitz editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
Heute, 11:21 Uhr
Bert



Kannst Du mit dem Oszilloskop in der Schaltung nachmessen?
Sieht der PIO-Chip evtl. des RETI nicht richtig, weil ein Datentreiber schon vorher wegschaltet?
Und braucht man überhaupt ein EI vorm RETI? Oder sollen damit geschachtelte Interrupts unterbunden werden?
--
Viele Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
Heute, 11:27 Uhr
Early8Bitz

Avatar von Early8Bitz

Ich interpretiere Heikos Anfrage so, dass es funzt, wenn Bit 3=0 ist im Interrupt Vectorregister der PIO. Oder?
--
Gruß
Ralf

Ist ein alter Schaltkreis ein Schaltgreis?
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
Heute, 13:17 Uhr
HeikoS



Vielen Dank schon mal für Eure Hinweise! Ich bin noch ein paar Informationen zum Umfeld des Phänomens schuldig. Da ich wirklich nicht mehr weiter wusste, hatte ich mal kurz die Anfrage ohne weitere Infos „in den Raum gehauen“.

Es geht um meinen ZX-Spectrum-Nachbau, der sehr ähnlich dem GC204-82 aufgebaut ist. Der läuft schon seit fast 40 Jahren tadellos, war/ist aber nicht zu allen Spectrum-Programmen kompatibel. Nun sollte dort auch mal die Krönung laufen, ELITE ! … und das gang nicht, damit fing das Elend an … also mal untersucht, was da so abläuft.

ELITE verbiegt den 50Hz-Interrupt des Speccy mit einem Trick.

Original Spectrum:

- 50 Hz Signal über ULA direkt an /INT der CPU
- IM1
- ISR auf 0038
- Ende der ISR mit RET

Original Spectrum (IM2 Trick bei ELITE):

- 50 Hz Signal über ULA direkt an /INT der CPU
- IM2
- Register I = FD
- INT-Vektor LOW = FF durch Pull-Up-Widerstände an D0-D7
- FDFF -> FEFE -> Start der ISR
- Ende der ISR mit EI, RETI

Mein Spectrum-Nachbau:

- 50 Hz V-Sync an PIO-Port-A Bit0
- PIO in Mode 3, nur PIO-Port-A, Bit0 kann INT auslösen
- IEI = +5V, keine anderen INT-Quellen im System
- IM2
- Register I = 38
- INT-Vektor LOW = B0
- 38B0 -> 0038
- Ende der ISR mit EI, RETI (gepatcht)

-> Alles geht super !

Meine Änderung, damit auch ELITE laufen sollte:

- 50 Hz V-Sync an PIO-Port-A Bit0
- PIO in Mode 3, nur PIO-Port-A, Bit0 kann INT auslösen
- IEI = +5V, keine anderen INT-Quellen im System
- IM2
- Register I =FD
- INT-Vektor LOW = FE (muss gerade sein, FF geht nicht)
- FDFE -> FEFE -> Start der ISR (ein Byte vor FDFF steht bei ELITE tatsächlich auch FE :-)
- Ende der ISR mit EI, RETI

-> Absturz !!!

Dann dachte ich, ok - erstmal den Speccy ohne ELITE weiter testen:

- 50 Hz V-Sync an PIO-Port-A Bit0
- PIO in Mode 3, nur PIO-Port-A, Bit0 kann INT auslösen
- IEI = +5V, keine anderen INT-Quellen im System
- IM2
- Register I =38H
- INT-Vektor LOW = BE !!!!! Bit 3 = 1 !!!!!!
- 38BE -> 0038
- Ende der ISR EI, RETI (gepatcht)

-> Crash nach wenigen Eingaben auf der Tastatur

Das Problem kann ich eindeutig mit allen INT-Vektoren reproduzieren, bei denen Bit3 = 1 ist, wenn Bit3 = 0 ist, läuft sogar ELITE, aber da sitzt der Vektor dann an einer Stelle, wo Text steht, aber ELITE läuft.

Was habe ich schon probiert:

- Alle 128 Vektoren identisch befüllt, da müsste ja einer greifen, falls CPU den nicht richtig liest -> Trotzdem Crash bei Bit3 = 1!
- Bit3 des Datenbus mit Pull-Up 2,2K gezogen -> hilft nicht
- IEO an PIO mit Pull-Down 10K auf Masse -> hilft nicht
- Andere PIO genommen -> hilft nicht
- Andere Hardware soweit es geht entfernt (ist ja ein Steckkarten-System) und DMA (GC204/82) deaktiviert -> hilft nicht

EDIT:

Mit Oszi den INT-Quittierungszyklus gemessen:
- getriggert mit INT-Auslöser (V-Sync)
- /IORQ und D3 parallel angeschaut. D3 hat HIGH-Pegel (4-5V), wenn ein Vektor mit D3=1 programmiert wurde und die ISR noch läuft. Aber ich konnte unterschiedliche HIGH-Pegel messen (4V, fast 5V). Da zu diesem Zeitpunkt ja die PIO den Vektor erzeugt, müsste der doch immer den gleichen Pegel haben ... ?

Und nun kommt es: Das Internet will Folgendes wissen:

- Interne Logik-Verknüpfung: In der Z80-PIO-Architektur ist Bit 3 im Steuerregister das entscheidende Mask-Follows-Bit. Bei den NMOS-Nachbauten (U855) wurde beobachtet, dass die interne Adress-Dekodierung für den Interrupt-Vektor und die Zustandsmaschine für das Steuerwort räumlich und logisch so eng beieinanderliegen, dass es zu Kopplungseffekten kommen kann.

- RETI-Erkennung vs. Vektor-Bit: Die PIO muss permanent den Datenbus auf den Opcode ED 4D (RETI) überwachen. Ist Bit 3 im Vektor-Register auf 1 gesetzt, neigt die interne Vergleichslogik der U855 bei bestimmten Bus-Lasten (wie sie bei Tastaturscans auftreten) dazu, fälschlicherweise eine Übereinstimmung mit dem RETI-Befehl zu „erkennen“. Dies löscht das IUS-Flag vorzeitig und ermöglicht den Nested Interrupt, der deinen Stack zerstört.

Das müsste doch hier bekannt sein, wenn es denn wirklich stimmen sollte. Quellen habe ich keine dazu gefunden. Nur KI-Geraune? Man kann den Brüdern ja nicht immer trauen ... ;-)

Viele Grüße, Heiko

Dieser Beitrag wurde am 24.03.2026 um 13:53 Uhr von HeikoS editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek