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
}}}