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
24.03.2026, 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
24.03.2026, 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
24.03.2026, 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
24.03.2026, 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 ging 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


EDIT:

PIO-Initialisierung:


Quellcode:

3996  3E 38            LD      A,38H        ; INT-Vector HIGH
3998  ED 47            LD      I,A
399A  3E B0            LD      A,0B0H       ; INT-Vector LOW
399C  D3 07            OUT     (07H),A
399E  3E CF            LD      A,0CFH       ; Mode 3, Bit Control
39A0  D3 07            OUT     (07H),A
39A2  3E 01            LD      A,01H        ; Ein/Ausgänge, Bit0 = Eingang
39A4  D3 07            OUT     (07H),A
39A6  3E 97            LD      A,97H        ; 1001 0111 INT-Steuerwort: EI, Maske folgt
39A8  D3 07            OUT     (07H),A
39AA  3E FE            LD      A,0FEH       ; Maske: nur Bit0 kann INT auslösen
39AC  D3 07            OUT     (07H),A
39AE  ED 5E            IM      2


Dieser Beitrag wurde am 24.03.2026 um 14:35 Uhr von HeikoS editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
24.03.2026, 19:50 Uhr
Early8Bitz

Avatar von Early8Bitz

Kannst Du die U855 PIO wechseln (Sockel) gegen eine echte Z80 u/o CMOS Version?
Und dann vergleichen?

Edit: lese gerade, dass Du schon mit einer anderen PIO probiert hast.
--
Gruß
Ralf

Ist ein alter Schaltkreis ein Schaltgreis?

Dieser Beitrag wurde am 24.03.2026 um 19:54 Uhr von Early8Bitz editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
24.03.2026, 20:15 Uhr
HeikoS




Zitat:
Early8Bitz schrieb
Kannst Du die U855 PIO wechseln (Sockel) gegen eine echte Z80 u/o CMOS Version?
Und dann vergleichen?

Edit: lese gerade, dass Du schon mit einer anderen PIO probiert hast.



Ja, aber eine andere PIO U855, die schon im System vorhanden war, habe ich probiert. Hatte damals alles schön eingelötet und eine echte Z80 u/o CMOS Version habe ich leider auch nicht. Bin jetzt echt ratlos, glaube aber nicht so richtig an einen PIO-Fehler. Es könnten ja auch andere BUS-Konflikte auftreten während der ISR oder bei der INT-Annahme.

Grüße, Heiko
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
24.03.2026, 20:24 Uhr
kaiOr

Avatar von kaiOr

Das "Mask-Follows-Bit" ist doch aber Bit 4.

Vielleicht ist die Adressdekodierung anderer Bausteine unvollständig und führt in dem Zusammenhang zum Fehler.

Habe eben ein wenig mit dem LC80 probiert:

Quellcode:
;LC80 Tasteninterrupt
PIO1AD    EQU    0F4h
PIO1BD    EQU    0F5h
PIO2BD    EQU    0F9h
PIO2BS    EQU    0FBh

    ORG    2000h

    JR    START

    ALIGN    8        ;fuer Bit 3 = 1
INTTAB    DEFW    ISR

START    DI
    IM    2
    LD    A,HIGH(INTTAB)
    LD    I,A

    LD    HL,PINI
    LD    B,PINIE-PINI
    LD    C,PIO2BS
    OTIR

    LD    A,0FFh
    OUT    (PIO1AD),A    ;LED-Segmente aus
    AND    3        ;zur Tastenerkennung
    OUT    (PIO1BD),A    ;B2..7 auf Low

    EI
    HALT            ;rote LED
    JR    $-1

ISR    XOR    A
    OUT    (PIO1BD),A    ;gruene LED an + Klick
LOOP    IN    A,(PIO2BD)
    OR    0Fh        ;maskieren
    INC    A
    JR    NZ,LOOP        ;warte auf Tastenfreigabe
    LD    A,2
    OUT    (PIO1BD),A    ;gruene LED aus + Klick

    EI
    RETI

PINI    DEFB    LOW(INTTAB)
    DEFB    0CFh        ;Modus 3
    DEFB    0FFh        ;alles auf Eingang
    DEFB    97h        ;Interrupt-Kontrollwort
    DEFB    0Fh        ;Maske, B0..3 inaktiv
PINIE

Aber da kann ich drücken so oft ich will und auch ewiges Tastenprellen provozieren ohne das sich etwas weghängt.

Gruß,
Kai

Dieser Beitrag wurde am 24.03.2026 um 20:25 Uhr von kaiOr editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
24.03.2026, 20:27 Uhr
Early8Bitz

Avatar von Early8Bitz


Zitat:
HeikoS schrieb
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 !!!



Der Interuptvector, den Du in die PIO schreibst, muss immer gerade sein.
Durch Bit 0 = 0 beim Schreiben eines Steuerwortes identifiziert die PIO das Byte als Interuptvector.
Mit Steuerworten mit Bit 0 = 1 werden dann die Betriebsarten der PIO initialisiert.

Bei Dir würde also auf Speicheradresse FDFE der Lowteil und auf FDFF der Highteil der Startadresse der ISR stehen müssen.
Die ISR Startadresse selber, die auf FDFE/FDFF gespeichert ist, kann sowohl gerade als auch ungerade sein.
--
Gruß
Ralf

Ist ein alter Schaltkreis ein Schaltgreis?
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
24.03.2026, 21:35 Uhr
HeikoS



@KaiOr:
Danke, dass du das wirklich mal getestet hast. Diese komischen Hinweise waren wohl bezogen auf bestimmte Chargen und ich bin nicht sicher, was ich damals so eingesetzt habe. Das mit "Mask-Follows-Bit = Bit3“ zeigt ja, dass man das vergessen kann, denke ich. Ich muss den Fehler an anderer Stelle suchen.

@Early8Bitz:
Die Vektoren bei der PIO im IM2 müssen immer gerade sein. Habe ich auch immer so gemacht. Beim „IM2-Trick“ im Spectrum ist der Vektor aber ungerade (FDFF), durch die Pull-Up-Widerstande am Datenbus. Ich könnte das auch so umbauen bei mir, aber mit der PIO und dem I-Register muss ja der Vektor FDFE (gerade) erzeugt werden können. Das würde in ELITE auch gehen und ist wohl auch so vorgesehen, denn da steht 3 x FE im Speicher:

Quellcode:

FDFE: FE <- IM2 PIO- Vektor
FDFF: FE <- IM2 Spectrum-Trick-Vektor    
FE00: FE

Start ISR:  FEFE


Im Spectrum-Mode ist übrigens nur ein 64K DRAM aktiv. Alle ROM’s etc. sind weggeschaltet.

Grüße, Heiko
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
24.03.2026, 22:53 Uhr
Early8Bitz

Avatar von Early8Bitz

Tricky mit dem Trick. Aber sieht erstmal bzgl. der PIO richtig aus.
Das FE auf FDFE steht immer da? D. H keine Software im Spectrum/Elite ändert das zwischendurch?
--
Gruß
Ralf

Ist ein alter Schaltkreis ein Schaltgreis?
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