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
}}}
-------
VBL.ACT
-------
{{{
;
; 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
}}}