Trotzdem lief das Programm nicht unter PAL OS-A.
Seltsamerweise lief das Programm aber unter NTSC OS-B, aber wiederum nicht unter NTSC OS-A. Dafür aber mit dem Altirra OS for 400/800 .
Anscheinend gibt es irgendein Verhalten des OS-A, welches sich sowohl von OS-B als auch von den XL/XE OS unterscheidet. Also begann das lange Suchen:
Recht schnell war klar, dass meine DLIs nicht angesprungen werden, sehr wohl aber meine VBI Routine.
Also mal alles mögliche ausprobiert und dann kam ich zum Ergebnis, dass DLI kein Problem ist, solange ich nicht auch meinen VBI nutze. Aber warum?
Also weiter gesucht und letztendlich die Lösung gefunden:
In meinem Programm schalte ich zunächst den DLI scharf und danach dann den VBI:
Code: Alles auswählen
* EINSCHALTEN DLI
LDA #64 ZUR SICHERHEIT DLI
STA NMIEN ERST ABSCHALTEN
LDA #DLI1:L DEN VEKTOR AUF
STA VDSLST DIE DLI ROUTINE
LDA #DLI1:H SETZEN
STA VDSLST+1
LDA #192
STA NMIEN ERST JETZT EINSCHALTEN
* EINSCHALTEN VBI
LDY #VBI:L VBI VECTOR AUF EIGENE
LDX #VBI:H ROUTINE SETZEN
LDA #6 ALS IMMEDIATE VBI
JSR SETVBV
Dann habe ich mal das Einschalten des VBI nicht über die Systemroutine SETVBV vorgenommen sondern durch direktes Ändern des VBI Vektors:
Code: Alles auswählen
* EINSCHALTEN VBI OHNE SETVBV
LDA TIMER
LOOPT1 CMP TIMER WARTE BIS IN VBI, UM AUFRUF WÄHREND
BEQ LOOPT1 ADRESSÄNDERUNG ZU VERMEIDEN
LDY #VBI:L VBI VECTOR AUF EIGENE
STY $222
LDX #VBI:H ROUTINE SETZEN
STX $223
Sollte möglicherweise die SETVBV-Routine das DLI-Bit in NMIEN löschen?
Also wieder die ursprüngliche Routine mit SETVBV verwendet aber am Ende nochmals gezielt VBI und DLI eingeschaltet:
Code: Alles auswählen
LDA #192
STA NMIEN
Was haben ich daraus gelernt:
Um auch nach unten zur 400/800er Reihe kompatibel zu bleiben sollte zuerst der VBI eingeschaltet werden und erst dann der DLI, oder zumindest nach dem Aufruf der SETVBV Routine nochmals zur Sicherheit auch DLI in NMIEN eingeschaltet werden.