007
13.05.2024, 21:52 Uhr
Early8Bitz
|
Hallo Kai,
im Prinzip stimmt das bisher beschriebene. Eine Feinheit habe ich aus dem verlinkten Dokument noch heraus gelesen, was in den normalen technischen Manuals des Z80-Systems gar nicht beschrieben ist.
Nehmen wir mal an, die SIO (der niedriger priorisierte Baustein) hat ein Zeichen empfangen und den Empfangsinterrupt ausgelöst wird, der gerade von der CPU bedient wird. Dann haben wir den Zustand in der Prioritätenkette
High-[IEI CTC IEO]-High-[IEI SIO IOE]-Low
Nehmen wir weiter an, dass in der ISR der SIO kein EI am Anfang steht, erst am Ende unmittelbar vor dem RETI. Jetzt hat der CTC (der höher priorisierte Bausten) das Bedürfnis, einen Interrupt bedient zu bekommen. Er zieht /INT und sein IEO auf Low. Zustand der Prioritätenkette jetzt
High-[IEI CTC IEO]-Low-[IEI SIO IOE]-Low
Die CPU ignoriert jedoch die Interruptanforderung des CTC, da sie noch von der Interruptbestätigung der SIO im disable Zustand (IFF1=0) ist. D.h. die ISR der SIO läuft unbeeindruckt ihrem Ende entgegen. Jetzt kommt das EI als vorletzter Befehl in der SIO-ISR, aber da der EI-Befehl die Interruptannahme um einen weiteren Befehl verzögert, ist als nächstes das RETI der SIO-ISR dran (und der CTC wartet immer noch, dass sein Interrupt bedient wird).
Nun der Knackpunkt: Ein RETI bei IEIsio=Low und IEOsio=Low würde von der SIO ignoriert, da diese dann 'denkt', das RETI gehöre zur ISR eines höher priorisierten Bausteins. Die SIO-Hardware kann ja nicht 'wissen', dass der höher priorisierte Baustein gar nicht bedient wird, sie geht aber auf Grund von IEOctc=IEIsio=Low davon aus.
Aus diesem Grund wirkt noch folgender zusätzlicher Mechanismus: Der CTC, der den Interrupt angemeldet hat aber nicht bedient wird, nimmt nach Erkennen eines ED-Bytes im M1-Zyklus (Instruction fetch, wir erinnern uns, der Opcode von RETI ist ED 4D) sein IEO für den nächsten M1-Zyklus zurück auf High. Damit wird auch IEI an der SIO für den nächstem M1-Zyklus High.
High-[IEI CTC IEO]-High-[IEI SIO IOE]-Low
Jetzt folgt der zweite M1-Zyklus der RETI, wo das 4D auf dem Bus liegt. Jetzt erkennt die SIO korrekt, dass das RETI für sie bestimmt ist und beendet korrekt ihren Interruptzustand. Nach dem M1-Zyklus geht das IEO des CTC (und damit der Rest der Prioritätenkette) wieder auf Low und signalisiert somit, dass er jetzt den nächsten zu bedienenden Interrupt angemeldet hat.
High-[IEI CTC IEO]-Low-[IEI SIO IOE]-Low
Jetzt wird der Interrupt des CTC angenommen.
High-[IEI CTC IEO]-Low-[IEI SIO IOE]-Low
Nach dem RETI in der CTC-ISR (sofern die SIO nicht schon wieder quengelt):
High-[IEI CTC IEO]-High-[IEI SIO IOE]-High
EDIT: Legende: Kein Interrupt Interrupt angemeldet, aber nicht bestätigt Interrupt in Bearbeitung -- Gruß Ralf
Ist ein alter Schaltkreis ein Schaltgreis? Dieser Beitrag wurde am 13.05.2024 um 22:12 Uhr von Early8Bitz editiert. |