Reviewers at the time gushed about the system. They noted that practically every aspect was superior to anything available at the time; compiling was almost instantaneous, the resulting code ran almost as fast as hand-coded assembler, the full-screen editor was universally loved, and the entire system took up only 8k due to clever memory management. The only complaint, also universal, was the poor quality of the original manual set.
Action! uses a greatly cut-down version of the ALGOL syntax, and thus bears strong similarities with Pascal and C, which were also derived from ALGOL. Like those languages, Action! is procedural, with programs essentially consisting of a large collection of functions that call each other. It lacked encapsulation or data hiding, but that is not a serious concern in the limited program sizes available on an 8-bit machine. Syntactically it looks very similar to Pascal, with the exception that it uses ALGOL 68 DO/OD style bracketing rather than Pascal's BEGIN/END.
Action! included a number of features to allow it to run as fast as possible. Notably, it's main data types were BYTE, INT and CARD, 8-bit and 16-bit signed and unsigned values, respectively. These map directly onto the basic 6502-types. The language also included a syntax to directly refer to these objects in memory so they could be mapped into hardware registers. For instance, one could set a variable to BYTE RTCLOK=20 which defined the 8-bit value at memory location 20 to be the value of the real-time clock. The user could then read or write to that register using the name RTCLOK.
These design details helped increase performance, but the primary reason Action! was much faster than other languages of the era was due to its memory management model. In languages like C and Pascal, procedure calls use a stack of records known as "activation records" that record the values of variables when the procedure was called. This allows a procedure to call itself, as each call can have its own values, and it is this feature that allows recursion. This concept requires the manipulation of a stack, which in the 6502 was a non-trivial prospect given the CPU stack was only 256 bytes.
Action! solved this problem by simply not implementing activation records. Instead, the storage space for variables was allocated at compile time (not dissimilar to Atari BASIC's model). This meant Action! could not support recursion, but also eliminated the necessity to build and manipulate a complex stack. This dramatically lowers the overhead of procedure calls, and in a language that organizes a program as a series of procedure calls, this represents a significant amount of time.
Action! had a number of limitations, none of them very serious. Curiously, Action! did not include support for floating-point types, although such support is built into the machine's OS ROM (see Atari BASIC for details) and available to any programming language. This is a significant limitation in some roles, although perhaps not for its target market. It also lacked most string handling routines, but made up for this somewhat with a series of PRINT commands that made formatted output easy.
Generally, Action! programs had performance on-par with reasonable-quality assembler, while being much easier to program. In one review, it ran Byte's Sieve of Eratosthenes 219 times faster than Atari BASIC, while its source was only a few lines longer. In comparison, the assembler version's source ran on for several pages. Such performance, combined with terse code and library functions to access much of the platform's hardware, made it suitable for action games while still having a simple source format suitable for type-in programs. It deserved to be much more popular, and may have been had it been released earlier, or by Atari itself.
Action! inspired several similar languages that differ largely in syntax and various features that they do or do not support. Examples include PL65 and Quick.
; Hello world in Action! programming language for the Atari 8-Bit computers PROC Hello() PrintE("Hello World!") RETURN
The ; is a comment marker, which was a commonly used as the comment marker in assembler as well. The PROC is the start of a PROCedure, which ends (perhaps oddly) with RETURN. In Action!, the last PROC in the program is the one that runs first, in this case "Hello". This is something of a mix between Pascal where the "global code" defines the program entry point, and C, where the function called "Main" is the entry point. The only line of code in this example is PrintE, which simply prints a string, while the more common PrintF is a formatted print similar to printf in C.
Like assembler, it was common for variables to be specified at a particular address that mapped onto one of the Atari's "shadow registers" that were used to communicate between the hardware and user programs. Here is a simple variation on Hello World that demonstrates this concept, as well as a basic loop:
; Hello world in a loop PROC Hello() BYTE RTCLOK=20, ; decimal address of system timer CONSOL=$D01F ; hex address of the key-pressed register CARD TIME RTCLOK=0 ; reset the clock WHILE CONSOL>6 ; did the user press a key? DO PRINTE("Hello World!") OD TIME = RTCLOK PRINTF("Ran for %E %U jiffies",TIME) RETURNNote that the definitions of RTCLOK and CONSOL are not setting the values, but stating that they are at those memory locations. The syntax changes when those variables are accessed; the RTCLOK=0 does set the value of that location. Also notice the syntax of loops, which work similarly to Pascal's BEGIN/END but use DO/OD.
There is a clever trick in this code. Note that RTCLOK is defined as a BYTE but TIME is defined as a CARD, a 16-bit value. This is because the clock value is stored in three bytes, 18, 19 and 20. By defining TIME as a CARD, when that value is read it automatically reads two bytes, thereby getting a value from both 20 and 19. This solution ignores the third byte, but since the value is from 0 to 65535 jiffies, about 36 minutes, this can safely be ignored for a program that is likely to run for a few seconds. This solution avoids the need to read two bytes and manipulate them into a 16-bit value, something that is commonly found in BASIC programs.
at that point AtariWiki must give the highest award possible:
Thank you so much Mr. Parker, we can't thank you enough for what you have done for us.
Further thank you Alfred from AtariAge for preserving the source code for generations to come. We are deep in your debt.
Now just these two are missing. Any hint, any help is welcome at any time. We would really appreciate your help in that case.
Title | Issue | Language | Comment |
---|---|---|---|
Review Action! | #16 (02/ 84) | en | review |
An Introduction to ACTION! | #17 + #18 (03+ 04/ 84) | en | tutorial |
Stars in 3D | #20 (07/ 84) | en | demo |
Bounce in ACTION! | #20 (07/ 84) | en | game |
Pulse in ACTION! | #26 (01/ 85) | en | demo |
More Fun with Bounce! | #27 (02/ 85) | en | game |
Demon Birds | #28 (03/ 85) | en | game |
Roto | #31 (06/ 85) | en | game |
Color the shapes | #32 (07/ 85) | en | game |
Getting in on the Action! 1 | #32 (07/ 85) | en | ON-LINE Action! Tutorial |
Getting in on the Action! 2 | #35 (10/ 85) | en | ON-LINE Action! Tutorial |
Sneak attack | #36 (11/ 85) | en | game |
Air hockey | #38 (01/ 86) | en | game |
D-Check | #44 (07/ 86) | en | tool |
Trails | #50 (01/ 87) | en | tool for using the KoalaPad in ACTION! |
ACTION! Zero Free | #54 (05/ 87) | en | tool |
Title | Issue | Language | Comment |
---|---|---|---|
Interrupts in ACTION! | Vol. 3 #3 (07/ 84) | en | |
Demo Pretty | Vol. 3 #7 (11/ 84) | en | demo from Antic I/O-Board |
SPLASH in ACTION! | Vol. 3 #12 (04/ 85) | en | demo |
Game AMAZING in ACTION! | Vol. 4 #1 (05/ 85) | en | game |
View 3D | Vol. 4 #2 (06/ 85) | en | tool |
Dark Star | Vol. 4 #3 (07/ 85) | en | game:Zapping Aliens With Radioactive Waste |
Display Master | Vol. 4 #4 (08/ 85) | en | |
Eight Queens | Vol. 4 #5 (09/ 85) | en | 92 chess solutions in 40 seconds |
Video Stretch | Vol. 5 #6 (10/ 86) | en | tool |
Killer Chess | Vol. 6 #10 (02/ 88) | en | game |
Reardoor | Vol. 6 #10 (02/ 88) | en | game |
Frog | Vol. 6 #10 (02/ 88) | en | game |
ACTION! Toolbox | Vol. 7 #6 (10/ 88) | en | Lightning-fast command finder (Wordfind and Matchup) |
Title | Issue | Language | Comment |
---|---|---|---|
Schnelle Vektoren in ACTION! | #1 (1-2/ 87) | ge | tutorial:Action!-Center Teil 1 |
Schnelle Umwege in ACTION! | #2 (3-4/ 87) | ge | tutorial:Action!-Center Teil 2 |
Interne Variablen | #3 (5-6/ 87) | ge | tutorial:Action!-Center Teil 3 |
Was ist dran an Action!? | #4 (7-8/ 87) | ge | tutorial:Action!-Center Teil 4 |
Title | Issue | Language | Comment |
---|---|---|---|
Musik in ACTION | #10/85 | ge | tutorial |
ACTION! noch schneller | #6-7/86 | ge | tutorial |
Title | Issue | Language | Comment |
---|---|---|---|
ACTION! Deel | nl | A collection of ACTION! Articles |