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. |