von Frederik Holst Nachdem wir letztes Mal einen einfachen Interrupt kennengelernt haben, wollen wir uns wie versprochen dem DLI, dem Display List Interrupt widmen. Wir wissen ja, daß der VBI alle 1/50 Sekunde ausgelöst wird, immer dann, wenn der Elektronenstrahl von unten rechts nach links oben wandert. Da dies ein großer Sprung ist, kann auch viel Assembler Code in dieser Zeit ausgeführt werden. Es gibt aber noch eine zweite Pause des Strahls, in der ebenfalls Routinen abgearbeitet werden können: In der Zeit, in der der Elektronenstrahl von einer Zeile ganz rechts nach ganz links in die nächstfolgende wechselt. Bei einem normalen GR.0 oder 8 Bildschrim geschieht das etwas mehr als 320 Mal. Etwas mehr daher, da es ja wie bei der DL besprochen noch die drei Leerbalken oben gibt. Wenn Sie sich noch recht erinnern, dann gab es bei den DL-Werten den Offset +128. Dieser Offset bewirkt, daß in Speicherstelle 512, 513 nachgesehen wird und ein Sprung zu der dort angegebenen Adresse durchgeführt wird. Diese Routine wird nicht wie bei einem VBI mit einem Sprung in das Betriebs- system beendet, sondern durch einen ganz einfachen RTI (ReTurn from Interrupt). Wie beim letzten Mal beginnen wir erstmal mit der Initialiserung des Interrupts, was fast gleich geschieht: ORG $A800 LDA #0 STA $D40E LDA #DLI:LO STA 512 LDA #DLI:HI STA 513 LDA #192 STA $D40E RTS Zu Beginn werden die Interrupts abgeschaltet, damit es während der Änderung nicht zu Komplikationen kommen kann, und dann wird die Startadresse des DLI in die Adressen 512 und 513 geschrieben und die Interrupts wieder angeschaltet. Der Aufbau eines DLI unterscheidet sich aber schon etwas von dem eines VBI: DLI LDA #0 STA $D018 RTI Dieser kleine DLI bewirkt, daß, wenn das Offset 128 gefunden wird, der Wert null in das Register $D018 geschrieben wird. Fachkundige wissen gleich, daß $D018 das Hardwareregister für den Hintergrund in GR.0 ist. Das Schattenregister ist 710. Hier sehen wir schon einen Unterschied: Im VBI durften wir 710 zum Wechseln der Hintergrundfarbe benutzen, im DLI darf man das nicht. Das hat den Einfachen Grund, daß die Schattenregister nur alle 1/50 Sekunde (kennen wir doch, oder ?) ausgelesen wird und dann in das Hardwareregister geschrieben wird. Da der DLI aber mitten in der DL ausgelöst wird und nicht an deren Ende, müssen wir also die Hardwareregister nehmen. Ein interessanter Effekt entsteht auch, wenn man von Turbo-Basic mal eingibt POKE $D018,0. Dann wird der Bildschirm nur kurz aufblitzen. Anders sieht das in einer Endlosschleife aus... Aber zurück zum DLI. Eine Sache fehlt nämlich noch, ... , richtig, die DL, unsere Displayliste. Wir nehmen hierzu eine normale GR.0 DL: DL DFB 112, 112, 112 DFB 64+2 DFW TEXT DFB 2,2,2,2,2,2,2,2,2,2+128 DFB 2,2,2,2,2,2,2,2,2,2,2,2,2 DFB 65 DFW DL TEXT ASC %Dies ist ein Test-Text% Natürlich muß auch diese DL noch eingebunden werden, deshalb fügen Sie oben in der Initialisierungsroutine nach dem STA 513 folgende Zeilen ein: LDA #DL:LO STA 560 LDA #DL:HI STA 561 Wenn Sie das Programm nun kompilieren und in den Monitor wechseln, können Sie sich das Ergebnis einmal ansehen: Rufen Sie das Programm mit G A800 auf und Sie werden sehen, daß ab der 12. Zeile der Bildschirmhintergrund schwarz, es oben jedoch weiterhin hellblau ist. Findige Leser werden aber sagen: Wieso erst ab der 12. Zeile, wir haben doch im 11. Zweierwert das Offset +128 gesetzt ?! Das hat schon seine Richtigkeit. Denn dieser Interrupt wird erst dann ausgelöst, wenn der Elektronenstrahl am Ende einer Bildschirmzeile ist. Daher erfolgt die Ausführung zwischen der 11. und der 12. Zeile und die Auswirkungen werden erst in der 12. Zeile sichtbar. Das soll für heute erstmal reichen was sich noch für Möglichkeiten im DLI verstecken, werden wir in den nächsten Malen sehen.