Mehrere DLIs in Action!


Mehrere DLIs in Action!

von FlorianD » Mo 23. Mär 2020, 00:59
Action ist ein One-Pass Compiler. Das bedeutet zwar kurze Compilierzeit (weil nur 1 Durchlauf), man kann aber keine Vorwärts-Referenzierungen machen - d.h. in einer PROCedure auf eine PROCedure weiter unter verweisen.
Will ich nun z.B. 3 Display List Interrupts machen, habe ich ein Problem, denn ich muss beim 1 ja auf den letzten verweisen. Beim 2. auf den 1. und beim 3. auf den 2. keine Problem, weil die ja jeweils weiter vorne im Code stehen. Was nun? Hier ist eine Lösung:

Code: Alles auswählen
 
MODULE
CARD VDSLST=512 ; Zeiger auf den DLI Code
CARD ZDLI3 ; brauchen wir als Merker für die "Rücksprungadresse"

PROC DLI1() ;
[$48 $8A $48 $98 $48] ;Register A,X,Y auf den Stack sichern
[$8D $D40A] ;WSYNC
[$A9 $9C $8D $D01A];COLBAK ; Hintergrundfarbe ändern
VDSLST=ZDLI3 ; zeigt auf die (zur Compilierung noch leere Rücksprungadresse)
[$68 $A8 $68 $AA $68 $40] ;Register Y,X,A zurückholen und dann RTI

PROC DLI2() ;
[$48 $8A $48 $98 $48] ; wie oben
[$8D $D40A] ;WSYNC
[$A9 $9A $8D $D01A];COLBAK ;wie oben, aber anderer Farbton
VDSLST=DLI1 ; Zeiger ändern auf den DLI oben drüber
[$68 $A8 $68 $AA $68 $40] ;wie oben

PROC DLI3() ;
[$48 $8A $48 $98 $48] ;wie oben
[$8D $D40A] ;WSYNC
[$A9 $9C0 $8D $D01A];COLBAK ;wie oben, aber anderer Farbton
VDSLST=DLI2  ; Zeiger ändern auf den DLI oben drüber
[$68 $A8 $68 $AA $68 $40] ;wie oben

PROC MAIN()
 BYTE NMIEN=$D40E
 ;
 ZDLI3=DLI3
 ;
 ;Die Display List bauen und Interruptpunkte einsetzen (lasse ich hier weg)
 ;
 NMIEN==&$7F  ; Bit 8 ausschalten, damit es kein Unglück gibt, falls der folgende Vektor genau in dem Moment geändert wird, wenn das OS da durch springt
 VDSLST=DLI1 ; Vektor ändern
 NMIEN==&%80 ; Bit 8 wieder an und los geht es

 DO
  ;Endlosschleife
 OD
RETURN