Action! was a
programming languageand integrated editor, debugger, and 6502 code generating compiler, editor for the Atari 8-bit familyof microcomputers. Action! was created by Clinton Parker and released on cartridge by Optimized Systems Softwarein 1983. Its syntax was similar to that of ALGOL 68.
Action! was significant for its high performance, which allowed games and graphics demos to be written in a high-level language in an era when it was generally understood that performance required hand-written
assembly languagecode. The language was tailored so there was a clean mapping between language constructs and the 6502 hardware.
A library was available as a separate product called the Action! Toolkit. Action! was used to develop at least one commercial product: the
Homepakproductivity suite. The language was never ported to other systems.
In 2007 it inspired Effectus - a cross-compiler currently running on Windows targeting the Atari 8-bit. Effectus resembles Action! syntax and is intended to be as compatible as possible with it.
Action! has three numerical
datatypes BYTEs, CARDinals and INTegers. The BYTE datatype is a single unsigned 8- bit byte, CARD is unsigned and two bytes long, and INT is signed and two bytes. Action! also has CHARs, ARRAYs, POINTERs and user defined TYPEs. No floating pointsupport was available.
An example of a user-defined TYPE:
TYPE CORD= [CARD x,y] CORD point point.x=42 point.y=23
AND FI OR UNTIL =< ( ARRAY FOR POINTER WHILE <> ) BYTE FUNC PROC XOR # . CARD IF RETURN = > [ CHAR INCLUDE RSH - >= ] DEFINE INT SET * < " DO LSH STEP / <= ' ELSE MOD THEN & $ ; ELSEIF MODULE TO % ! @ EXIT OD TYPE
Programming in Action! required working with the editor and compiling/debugging in the monitor. The editor had a full-screen, scrolling display capable of displaying two windows. The editor included block operations and global search and replace. Compiling took place in the monitor, a mode that allowed compiling and debugging.
Action! was a
one-pass compiler. It compiled the source codeentirely in memory. This allowed great speed, but limited the amount of code that could be compiled.
Local variables were assigned fixed addresses in memory instead of being allocated on the stack. This enabled tight code to be generated for the 6502, but precluded the use of
The following is example code for
Sieve of Eratostheneswritten in Action. In order to increase performance, it disables the ANTICgraphics coprocessor on the Atari hardware, thus preventing its DMA engine from "stealing" CPU cycles during the computation.
BYTE RTCLOK=20, ; addr of sys timer SDMCTL=559 ; DMA control BYTE ARRAY FLAGS(8190) CARD COUNT,I,K,PRIME,TIME PROC SIEVE() SDMCTL=0 ; shut off Antic RTCLOK=0 ; only one timer needed COUNT=0 ; init count FOR I=0 TO 8190 ; and flags DO FLAGS(I)='T ; "'T" is a compiler-provided constant for True OD FOR I=0 TO 8190 ; and flags DO IF FLAGS(I)='T THEN PRIME=I+I+3 K=I+PRIME WHILE K<=8190 DO FLAGS(K)='F ; "'F" is a compiler-provided constant for False K=+PRIME OD COUNT=+1 FI OD TIME=RTCLOK ; get timer reading SDMCTL=34 ; restore screen PRINTF("%E %U PRIMES IN",COUNT) PRINTF("%E %U JIFFIES",TIME) RETURN
* [http://www.cyberroach.com/analog/an16/action.htm Review of Action! from ANALOG Computing, with benchmarks]
* [http://retrobits.net/atari/action.shtml Action! info at Retrobits.com]
* [http://www.strotmann.de/twiki/bin/view/APG/LangACTION Action! Programming Wiki]
* [http://www.atarimagazines.com/hi-res/v1n4/action.php Hi-Res Vol. 1, No. 4 - May/June 1984] Lights, Camera, "Action!"
* [http://joyfulcoder.net/atari/action The ACTION! Archive]
* [http://joyfulcoder.net/atari/action/?tab=language Action! language reference ]
* [http://gury.atari8.info/effectus/ effectus]
Wikimedia Foundation. 2010.