Mehrere DLIs in Action!
von FlorianD » Mo 23. Mär 2020, 00:59Action 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:
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