Harman Patil (Editor)

Action! (programming language)

Updated on
Edit
Like
Comment
Share on FacebookTweet on TwitterShare on LinkedInShare on Reddit
Original author(s)
  
Clinton Parker

Platform
  
Atari 8-bit family

Developer(s)
  
Optimized Systems Software

Last release
  
v3.6 / 1983; 34 years ago (1983)

Size
  
16K bank-switched cartridge

Action! is a procedural programming language similar to ALGOL 68 which is part of a development environment containing an integrated editor, compiler, and debugger for the Atari 8-bit family of computers. It was created by Clinton Parker, who had previously developed the Micro SPL language with Henry Baker, and released on cartridge by Optimized Systems Software in 1983. Action! was used to develop at least two commercial products—the Homepak productivity suite and Games Computers Play client program—and numerous programs in ANALOG Computing and Antic magazines. The language was never ported to other systems.

Contents

Action! is a one-pass compiler, which compiles the source code entirely in memory or from a file. Constructs were designed to map cleanly to 6502 opcodes, to provide high performance without needing complex optimizations in the compiler. For example, local variables are assigned fixed addresses in memory, instead of being allocated on the stack. This enables tight code for the 6502, but precludes the use of recursion.

The 6502 assembly language source code for Action! was made available under the GNU General Public License by the author in 2015.

Development environment

Action! consists of the editor, the compiler, a monitor for testing code and switching between the editor and compiler, and the run-time library. The run-time library is stored in the cartridge itself. To distribute standalone applications requires a separate run-time package which was sold by OSS as the Action! Toolkit.

Unlike the integrated Atari BASIC and Atari Assembler Editor environments, the Action! editor is full-screen, so it does not use line numbers. It features a full-screen, scrolling display capable of displaying two windows, as well as block operations and global search and replace.

The monitor serves as a debugger, allowing an entire program or individual functions to be run, memory to be displayed and modified, and program execution to be traced.

Data types

Action! has three fundamental data types, all of which are numeric.

BYTE

Internally represented as an unsigned 8-bit integer. Values range from 0 to 255.
The CHAR keyword can also be used to declare BYTE variables.

BYTE age=[21] ; declare age and initialize it to the value 21 BYTE leftMargin=82 ; declare leftMargin and store it at address 82

CARDinal

Internally represented as an unsigned 16-bit integer. Values range from 0 to 65,535.

CARD population=$600 ; declare population and store it at address 1536 and 1537 CARD prevYear, curYear, nextYear ; use commas to declare multiple variables

INTeger

Internally represented as a signed 16-bit integer. Values range from -32,768 to 32,767.

INT veryCold = [-10] INT profitsQ1, profitsQ2, ; declaring multiple variables can profitsQ3, profitsQ4 ; span across multiple lines

Action! also has ARRAYs, POINTERs and user-defined TYPEs. No floating point support is provided.

An example of a user-defined TYPE:

TYPE CORD=[CARD x,y] CORD point point.x=42 point.y=23

Reserved words

A reserved word is any identifier or symbol that the Action! compiler recognizes as something special. It can be an operator, a data type name, a statement, or a compiler directive.

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 ! @

Example code

The following is example code for Sieve of Eratosthenes written in Action!. In order to increase performance, it disables the ANTIC graphics co-processor, preventing its DMA engine from "stealing" CPU cycles during 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

Reception

BYTE in 1985 praised the compilation and execution speed of software written in Action!—ten iterations of the Sieve of Eratosthenes ran in less than 18 seconds, compared to 10 seconds for assembly and 38 minutes in BASIC—and its editor. The magazine reported that the language resembled C closely enough to "routinely convert programs between the two", and approved of its pointer support. BYTE concluded that "Action! is easy to use, quick, and efficient. It can exploit the Atari's full power. Action! puts programming for the Atari in a whole new dimension."

Brian Moriarty, in a February 1984 review for ANALOG Computing, cited the manual as the weak point of the package: "[it] suffers from lack of confidence, uncertain organization and a shortage of good, hard technical data." He concluded by calling Action! "one of the most valuable development tools ever published for the Atari."

References

Action! (programming language) Wikipedia