Interrupts

das OS initialisiert den Interrupt-Mode IM2 und lädt das I-Register mit 02h (hi(INTV)). Die Lo-Adresse des Interrupt-Vektors wird vom externen Baustein (PIO, CTC, …) erzeugt. Die Lo-Adressen 00..0C sind vom System belegt.

0200	INTV: 	EQU # 		;Interruptadresstabelle
0200 	CTC0	DA IKACT 	;Kassette schreiben
0202 	CTC1	DA 0 		;frei für Anwender CTC Kanal 1
0204 	CTC2	DA ICTC 	;Entprellen Tastatur, Vorteiler für Systemuhr
0206 	CTC3	DA INUHR 	;Sekundentakt Systemuhr
0208 	PIO2A	DA INTP 	;Tastaturinterrupt (Tastatur-PIO)
020A 	PIO1A	DA IKEP 	;Kassette lesen    (System-PIO)
020C 		BER 74H 	;frei für Anwenderinterrupts

Zu beachten ist, dass der für Anwenderinterrupts freie Speicherbereich zwischen 20Ch und 027Fh von diversen Programmen genutzt wird. Ich empfehle, nur den Bereich 20Ch..20Fh zu nutzen. Das sollte für eine PIO oder CTC reichen.

Es gibt nur wenige Module und Software, die von externen Interrupts Gebrauch machen. Das Spracheingabe-Modul nutzt eine CTC und den Interruptadresstabellen-Bereich 0210h-213h.

Die zugehörige Software, die auf die externe Interruptquelle reagieren soll, muss im Bereich 4000h-EFFFh liegen!

Bei der Behandlung externer Interruptquellen (Interruptquelle ist über Systembus im Modulschacht an den KC angeschlossen) sind bei den robotron-Kleincomputern die folgenden Hinweise zu beachten.

Der Modul mit der externen Interruptquelle muß auf dem ersten Steckplatz (von der Tastatur aus gesehen) gesteckt sein. Damit wird diese Interruptquelle an die bestehende Interruptprioritätenkette angeschlossen.

Die peripheren Systemelemente des Systems U880 erkennen durch interne Dekodierung des Befehls RETI, daß ihre Interruptbearbeitungsroutine (ISR) beendet ist, und können somit ihren Bearbeitungszustand zurücksetzen.

Bei externem Interrupt muß der Befehl RETI als Abschluß der ISR auf einer Speicheradresse zwischen 4000H und 0EFFFH stehen, da sonst das den externen Interrupt auslösende Systemelement diesen RETI-Befehl nicht dekodieren kann. Das ist in der Schaltungskonzeption begründet, bei der die Datenbustreiber, welche den Datenbus vom bzw. zum Modulschacht treiben, nur dann aktiv sind, wenn eine Speicheradresse zwischen 4000H und 0EFFFH angesprochen wird.

Zur Erfüllung dieser Bedingung bieten sich folgende Möglichkeiten an:

1. Die gesamte ISR befindet sich im Adreßbereich oberhalb des Grund-RAM, so also in einem RAM- oder ROM-Erweiterungsmodul.

2. Die ISR ist im Grund-RAM abgelegt, wobei anstelle des abschließenden Befehls RETI ein Sprungsbefehl auf eine Adresse im Bereich zwischen 4000H und 0EFFFH stehen muß. Ab dieser Adresse muß dann die Kodierung für RETI im Speicher abgelegt sein.

Hinweis: Soll die Interruptfreigabe des Prozessors erst nach beendeter ISR erfolgen, so muß der Befehl El (Interruptfreigabe) unmittelbar vor dem RETI-Befehl stehen. In diesem Fall muß die Befehlsfolge EI, RETI im Bereich zwischen 4000H und 0EFFFH stehen.

Damit für die bei 2. benötigten 2 oder 3 Speicherplätze nicht extra ein RAM-Modul notwendig wird, können die freien Speicherplätze im Bildwiederholspeicher (0EFF1 H 0EFFFH) dafür genutzt werden.

G. Lützner

Mikroprozessortechnik, 1 (1987) 10, S. 317

Also z.B. bei der Variante 2 (kein externes RAM-Modul) vor der CTC-Initialisierung EI+RETI aus dem OS-ROM kopieren:

LD HL,0FFCEh
LD DE,0EFFDh
LD BC,3
LDIR

und am Ende der ISR statt EI+RETI:

JP 0EFFDh
  • z9001/software/os/interrupts.txt
  • Zuletzt geändert: 2025/01/09 13:29
  • von volkerp