Joel Gluck asked me how to use interrupts from an ACTION program. Here are two programs which, respectively, deal with the DLI and VBLD interrupts.
Notice that, since Action is not re-entrient, you can't call subroutines, or do anything else which might mess up a memory location that the main program is depending upon. For example, multiply and divide are both done by subroutines, so you can't use them within a VBLANK routine. It is, however, safe to add, subtract, index an array, and store. (But be sure to clear the decimal flag if your main program might be calling the floating point ROMs!)
; ; Example of use of display list ; interrupt from Action ; BYTE VCOUNT = $D40B, WSYNC = $D40A, NMIEN = $D40E, CH = $2FC, COLPF2 = $D018 CARD VDSLST = $200, SDLST = $230, OLDVEC DEFINE PHA = "$48", PLA = "$68", TAX = "$AA", TAY = "$A8", TXA = "$8A", TYA = "$98", RTI = "$40" ; ; During a DLI you can't call any ; other functions, nor multiply, ; nor divide ; PROC DLI() [PHA TYA PHA TXA PHA] WSYNC = VCOUNT COLPF2 = VCOUNT [PLA TAX PLA TAY PLA RTI] PROC MAIN() BYTE I BYTE POINTER TEMP PRINTE("Setting up DLI") NMIEN = $40 ;DISABLE DLI OLDVEC = VDSLST VDSLST = DLI TEMP = SDLST+3 TEMP^ = $C2 FOR I = 1 TO 23 DO TEMP = SDLST + I + 5 TEMP^ = $82 OD NMIEN = $C0 ;ENABLE DLI WHILE CH = $FF DO PRINTE("Press any key to quit") OD CH = $FF ;Swallow key press PrintE("Restoring DLI") NMIEN = $40 ;DISABLE DLI TEMP = SDLST+3 TEMP^ = $42 FOR I = 1 TO 23 DO TEMP = SDLST + I + 5 TEMP^ = $02 OD VDSLST = OLDVEC PRINTE("Returning") RETURN
; ; Example of using the vertical blank ; deferred interrupt from Action ; BYTE RTCLOCK = 20, CH = $2FC, COLOR2 = $2C6 CARD VVBLKD = $224, SDLST = $230, OLDVEC DEFINE JMPI = "$6C" ; ; Within a VBI you can't call any ; subroutines, nor can you multiply ; or divide. . . . PROC VBLANKD() COLOR2 = RTCLOCK [JMPI OLDVEC] ;Simulate the OS call SETVBV PROC SETVBV(BYTE WHICH CARD ADDR) CARD POINTER TEMP BYTE V TEMP = $216 + (WHICH LSH 1) V = RTCLOCK+ 1 WHILE V <> RTCLOCK DO OD TEMP^ = ADDR RETURN PROC MAIN() BYTE OLDC2 OLDC2 = COLOR2 PRINTE("Setting up Vblank") OLDVEC = VVBLKD SETVBV(7, VBLANKD) WHILE CH = $FF DO PRINTE("Press any key to quit") OD CH = $FF ;Swallow key press PrintE("Restoring Vblank") Setvbv(7, OLDVEC) COLOR2 = OLDC2 PRINTE("Returning") RETURN