This page (revision-9) was last changed on 03-Feb-2023 15:21 by Florian Dingler 

This page was created on 13-Mar-2010 19:16 by Carsten Strotmann

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
9 03-Feb-2023 15:21 4 KB Florian Dingler to previous
8 05-Jul-2019 06:26 4 KB Florian Dingler to previous | to last
7 05-Jul-2019 06:18 4 KB Florian Dingler to previous | to last
6 31-Jan-2011 18:54 4 KB Gromit to previous | to last
5 31-Jan-2011 09:17 4 KB Gromit to previous | to last
4 26-Jul-2010 09:31 4 KB Gromit to previous | to last
3 26-Jul-2010 09:27 2 KB Gromit to previous | to last
2 13-Mar-2010 19:17 333 bytes Carsten Strotmann to previous | to last
1 13-Mar-2010 19:16 169 bytes Carsten Strotmann to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 1 changed 4 lines
!!!Interrupts in ACTION
General Information
!General Information
At line 8 changed one line
Published: ANALOG July 1984 \\
Published: Antic July 1984 \\
----
!!!Interrupts in ACTION
At line 9 added 111 lines
;Synopsis: ''This article discusses advanced programming techniques using the ACTION! language. To use the accompanying listings, you must have the ACTION! cartridge from Optimized Systems Software.''
An "interrupt" takes place in a computer system whenever one process takes precedence over a process that is being executed. It interrupts the lower-priority process so that it (the interrupt) can be executed first. Several interrupts are available on the Atari computers, including the display-list interrupt (DLI), the vertical-blank interrupt (VBI), and the system-timer interrupt, which was discussed in the January issue (Antic, "Page Flipping!" P. 34).
Before ACTION! came along, you had to be able to program in machine language to use these interrupts. Clinton Parker, ACTION!'s author, may have envisioned that ACTION! programmers would continue to use machine code to write interrupt routines, installing blocks of machine-language codes generated by their assemblers into their ACTION! programs. But ACTlON! is so fast that you call actually write a VBI or a system-timer interrupt in this high-level language, which is much easier than writing it in machine language.
Unfortunately when an ACTION! VBI interrupts an ACTION! program, the two use the same space in memory to hold temporary math variables for calculation. Because of this, the interrupt routine can alter the variables from the interrupted routine. As a result, results can be quite unpredictable.
Mike Fitch of Optimized Systems Software (OSS), ACTION!'s publisher, has solved this dilemma with two short machine-language routines that save the contents of the temporary math registers to the stack at the beginning of the interrupt, and then restore them just before the interrupt ends. Mike calls these routines SAVETEMPS and GETTEMPS.
You use the DEFINE command to assign machine-language code blocks to SAVETEMPS and GETTEMPS. The accompanying ACTION! program demonstrates the use of GETTEMPS and SAVETEMPS in a VBI. It also produces an interesting effect on the screen. These routines are just what you need if you want to use interrupts written in ACTION!
''David Plotkin is a chemical engineer with Standard Oil Company of California and an avid game programmer.
''
{{{
MODULE; VBI DEMO FOR ANTIC
DEFINE RTI="$40",
PHA="$48",
PLA="$68",
TXA="$8A",
TAX="$AA",
TYA="$98",
TAY="$A8",
JMP="$4C",
XITVBV="$E462",
SAVETEMPS="[$A2 $07 $B5 $C0 $48 $B5
$A8 $48 $B5 $A0 $48 $B5 $80 $48
$CA $10 $F1 $A5 $D3 $48]",
; diese SAVETEMPS Routine ist aus der Action! Fehlerkorrekturliste. Sie ist umfangreicher als das originale Beispiel aus dem Magazin
; und funktioniert sicher. Das Original sichert nur die Variablen für Addition/Subtraktion
GETTEMPS="[$68 $85 $D3 $A2 $00 $68
$95 $80 $68 $95 $A0 $68 $95 $A8
$68 $95 $C0 $E8 $E0 $08 $D0 $EF]"
; das gleiche wie oben gilt auch für die GETTEMPS Routine
CARD SDLST=560,VDSLST=512,
VVBLKD=$224
BYTE NMIEN=$D40E,COLBK=$D01A,
WSYNC=$D40A,COUNT=[0]
BYTE ARRAY DLIST
BYTE ARRAY CLRS(0)=[64 66 68 70 72 74
72 70 68 66 64 66 68 70 72
74 72 70 68 66 64 66 68
70 72 74 76 ]
PROC DLINT(); a DLI written in ACTION!
BYTE DUM
[PHA TXA PHA TYA PHA]
IF COUNT=26 THEN DUM=0
ELSE DUM=CLRS(COUNT) FI
WSYNC=1
COLBK=DUM
COUNT=COUNT+1
IF COUNT=27
THEN COUNT=0
FI
[PLA TAY PLA TAX PLA RTI]
PROC INIT7()
GRAPHICS(7)
SETCOLOR(0,2,10)
SETCOLOR(1,5,12)
SETCOLOR(2,0,0)
RETURN
PROC DLSETUP(); custom Display List
BYTE I
INIT7()
NMIEN=$40
DLIST=SDLST
VDSLST=DLINT
FOR I=30 TO 40
DO DLIST(I)=141 OD
FOR I=42 TO 54 STEP 2
DO DLIST(I)=141 OD
FOR I=57 TO 72 STEP 3
DO DLIST(I)=141 OD
FOR I=76 TO 84 STEP 4
DO DLIST(I)=141 OD
NMIEN=$C0
RETURN
PROC ROTATE(); the VBI routine
BYTE HOLD,CTR,CNTR
SAVETEMPS; save the temp registers
HOLD=CLRS(26); save the last element
FOR CTR=0 TO 25; the loop
DO CNTR=25-CTR; to count backwards, Action! has no STEP-1 statement
CLRS(CNTR+1)=CLRS(CNTR) OD; rotate
CLRS(0)=HOLD; put the last element into the first
GETTEMPS; get the temp registers
[JMP XITVBV]; exit the VBI
PROC VBINST(); install the VBI
NMIEN=0; turn off the interrupts
VVBLKD=ROTATE; vector to PROC ROTATE
NMIEN=$40; turn the interrupts back on
RETURN
PROC DJD(); the driver routine, named for a famous computer genius
BYTE CRSINH=752
VBINST(); install the VBI
DLSETUP(); set up the Display List
CRSINH=1
PRINTE()
PRINTE("Áîôéã Interrupts in ACTION!")
PRINT(" by DAVID PLOTKIN")
DO OD; an endless loop...
RETURN
}}}