!!!Action!
Clinton Parker, OSS, 1983

!Background
Action! is an Atari-specific programming language written by Clinton Parker and sold by Optimized Systems Software (OSS) in ROM cartridge form starting in August 1983. It is perhaps the only 3rd party language (as opposed to BASIC or assembler) that had real popularity on the platform and saw any significant coverage in the Atari press; type-in programs and various technical articles were found in most magazines. In comparison, languages like [Forth] and [Logo] saw much less use and almost no press coverage.

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 original manual set.

Action! uses a greatly cut-down version of the ALGOL syntax, and thus bears strong similarities with [Pascal] and [C]. 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}}. Variables were assigned to memory in procedures, not on a stack, so recursion was not supported internally. 

Curiously, Action! did not include support for floating point types, although such support is built into the machine's OS ROM (see [Atari Basic|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, but made up for this somewhat with a PRINTF command 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 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].

''Editor's note:'' A version of Action! with support for a FLOAT type and a replacement floating point library like the one in [TURBO-BASIC XL] would be a ''very'' interesting project. A STRING type would also be useful!

!Examples

{{{
; Hello world in Action! programming language for the Atari 8-Bit computers
PROC Main()
   PrintE("Hello World!")
RETURN
}}}

The {{;}} is a comment marker, which was a commonly used in assembler. 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 "Main". 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 Main()
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)
RETURN
}}}
Note 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, which provides a value from 0 to 65535 jiffies, about 36 minutes. This avoids the need to read two bytes and manipulate them into a 16-bit value, something that is commonly found in BASIC programs.

[{TableOfContents }]

!! ACTION! source code 

at that point AtariWiki must give the highest award possible:

* [ACTION! source code]

!! Thanks

Thank you so much Mr. Parker, we can't thank you enough for what you have done for us.

[{Image src='Thank you Mr. Parker.jpg' width=533 height=109 }]
Thank you so much Mr. Parker\\
\\

Further thank you Alfred from AtariAge for preserving the source code for generations to come. We are deep in your debt.

[{Image src='Thank you Alfred.jpg' width=450 height=106 }]
Thank you Alfred\\
\\
!! Blogs
* [Learning Atari Action!|http://atariaction.tumblr.com/]

!!Manuals and Docs
* [Action_manual_3rd-revised_edition_2015_by_GBXL.pdf] ;The complete Action! manual! Editor, Monitor, Language, Compiler, Library, Run Time, Toolkit. 3rd revised edition 2015 by [GoodByteXL|http://home.arcor.de/walter.lojek/MyATARIHomepage/old_hp/OSS/OSS.HTM]. Highly recommended by the AtariWiki! This is, without any(!) doubt, the very best edition worldwide available. Nobody does it better. Mega-thanks to [GoodByteXL|http://home.arcor.de/walter.lojek/MyATARIHomepage/old_hp/OSS/OSS.HTM] for this outstanding work and the many hours of work to the community. We are deep in your debt! Thank you so much. :-)))
* [Action-Handbuch-komplett_2016_von_GBXL.pdf] ; Das komplette, vollständige, restaurierte und überarbeitete Action!-Handbuch in deutsch! Der totale Hammer, inkl. Editor, Monitor, Language, Compiler, Library, Run Time, Toolkit. Vollständig überarbeitete Version von 2016 von [GoodByteXL|http://home.arcor.de/walter.lojek/MyATARIHomepage/old_hp/OSS/OSS.HTM]. So müssen PDF-Dateien aussehen, es gibt weltweit nichts vergleichbares. AtariWiki empfiehlt die PDF-Datei auf das Wärmste! Wer diese nicht lädt, ist selber schuld. Wir bedanken uns an dieser Stelle sehr, sehr herzlich bei [GoodByteXL|http://home.arcor.de/walter.lojek/MyATARIHomepage/old_hp/OSS/OSS.HTM] für seine lange andauernde und intensive Arbeit an diesem Werk, dass er hiermit der Atari-Gemeinschaft zur Verfügung stellt. Empfohlen sei auch seine Webseite: [GoodByteXL|http://home.arcor.de/walter.lojek/MyATARIHomepage/old_hp/OSS/OSS.HTM] in der immer die neueste Version sowie viele andere interessante Sachen über Atari zu finden sind. [GoodByteXL|http://home.arcor.de/walter.lojek/MyATARIHomepage/old_hp/OSS/OSS.HTM] mega-Danke für Deine Arbeit, die Gemeinschaft steht tief in Deiner Schuld. :-)))
* [ACTION! Reference Manual]
* [ACTION! Handbuch] (German ACTION! Manual)
* [The ACTION! Toolkit]
* [The ACTION! Run Time Package]
* [ACTION! Reference Card]
* [ACTION! error codes]
* [Action! and BBS Express! PRO Tutorial]
* [Larry's ACTION! Tutorial]
* [Aktion mit ACTION] - Report about the ACTION! Programming Language from the German Magazin "Happy Computer"
* [Step-by-Step Tutorial - How to create a stand-alone ACTION! Program]
* [How to setup an ACTION! Development Disk]
* [Action! Bugsheet #3]
* [Fix for the Bugs in divide in ACTION!]
* [Fix for Bug in PrintF]
* [Optimized Systems Software, Inc. - SOFTWARE LICENSE AGREEMENT|Optimized_Systems_Software_Software_License_Agreement.pdf] ; thanks to Atarimania

!! New ACTION! versions > 3.6
* [Action! greater than version 3.6|http://www.wudsn.com/productions/atari800/action/action.zip] ; thanks to JAC! for compiling and fixing the known bugs. Please go ahead with your outstanding work in this, we really appreciate your help and work very much.

!! CAR-Images
* [ACTION_Version_3.6_(C)_1983_ACS_034M.car]
* [ACTION_Version_3.6_(C)_1983_ACS_M091.car]

!! ROM-Images
* [ACTION_Version_3.6_(C)_1983_ACS_034M.rom]
* [ACTION_Version_3.6_(C)_1983_ACS_M091.rom]

!! Runtimes
* [OSS_ACTION_Programmers_Aid_Disk_100.atr]
* [The ACTION! Toolkit.atr]
* [The Action RunTime Disk-Original.atr] protected image copy of the original disk from a good soul from AtariAge
* [The ACTION! RunTime Disk.atr] unprotected copy of the original disk from a good soul from AtariAge
* [Original ACTION! System Runtime Source]
* [Alternative ACTION! Runtime Source]
* [ACTION! Runtime von Jeff Reister]
* [OSS_ACTION_3.6_and_REAL_files_with_DOS_XL_2.30p_Color.atr]
* [TURBO-DOS_XE_with_ACTION_Disk_1.atr]
* [TURBO-DOS_XE_with_ACTION_Disk_2.atr]

!! XEX-File
* [ACTION.XEX] ; Thanks goes to Peter Dell for making the XEX-file out of the above source code. Peter, we owe you so much, please go ahead! :-) 

!! Mini-LIBs (and/or independant Runtime Parts)
* [_Intro] (Eine kleine Einführung zu den Mini-LIBs)
* [Simple PRINT Runtime] (Mini-LIB)
* [ZERO and SETBLOCK] (RT Part)

!! Functions

* [Misc useful ACTION! Functions] - (DIVERS.ACT)
* [Chartest] - a group of routines which perform various functions and tests on characters.
* [Fast Screen IO]
* [Player Missile]
* [String Library PSC] - (STRING.ACT)

!!Code

* [A pseudo Assembler in ACTION!] 
* [ACTION! Logo] ACS
* [Atari Fuji Logo in ACTION!]
* [Atari ST Mouse Driver for ACTION!]
* [Backtrack in ACTION!]
* [BASIC USR Machine Language Call Simulation for ACTION!]
* [Big Symbol Table for ACTION!] ACS
* [Binary File Load in ACTION!]
* [Butterfly Demo]
* [C Style Strings]
* [Catch and Throw Error Handling] ACS
* [Catepill] unfinished Game with Level editor in ACTION!
* [COM File Segment Dump]
* [Compile to Disk] ACS
* [Data Entry Routines]
* [Date Routines] - Library of routines supporting the input, storage and manipulation of dates.
* [Delete EOL Char in Textfiles]
* [Displaylist in ACTION!]
* [DLI in ACTION!] 
* [DOS Setup] - A small tool to copy some files from disk to ramdisk. can be configured by a textfile.
* [END Procedure] - Call prodedure to leave ACTION! Program
* [ERROR] (Converts SpartaDOS, BeWeDOS and RealDOS error # to readable text)
* [Fast Graphics 15 Routines]
* [Fast Graphics 8 Routines]
* [File Compare]
* [File IO Routines]
* [File Select Box]
* [File Select Shell]
* [Game AMAZING in ACTION!]
* [Grep for Sparta DOS]
* [HexDump] - Dump - Print the contents of binary files in hexadecimal and ATASCII
* [Kermit in ACTION!] 
* [Load APL Display-List Files]
* [Load Font Files in ACTION!]
* [Load Koala Pictures]
* [Multi Player Animation]
* [PERCOM Block Manipulation]
* [PERCOM Service] -- Disk Format Configuration
* [Printing Routine for Epson Printer]
* [Query Console Keys]
* [SIO CIO Routine]
* [VTEmulator]
* [VT52 Terminal Emulator]
* [Windowing Routines]
* [OS Vectors]
* [use RAM under ROM on XL-XE machines]
* [Symbol table lister] ACS
* [XFD Disk Transfer tool] XFormer Filetransfere
* [XModem Filetransfer]
* [Starburst]
* [Atari Picture Mirror Tool]
* [ATARI Rainbow effect]
* [Access SpartaDOS commandline parameters]
* [Jump to DOS DUP]
* [Trackball]
* [Timer Programming]
* [MiniDOS]
* [SourceCodeDisk1] ; SpartaDOS X disk image with ACTION! source code

!! Tools

* [Action Source Code Formatter]
* [Infoline] for ACTION! and BASIC
* [ACTION OBJECT CODE RELOCATION PROGRAM] ; Thank you so much Alfred from AtariAge, we all really appreciate your help here again.
* [Relocator] for ACTION!, relocates ACTION! code to run independent from the code location
* [acsterm.txt] ; ACSTERM is a terminal emulator for the Atari 800, 800XL, 1200XL and 130XE
* [How to find the revision number of ACTION]

!! Misc

* [ACTION! Workshop 1] 24. October 2010 "Unperfekthaus" in Essen
* [ACTION! Workshop 2] October 2011 "Unperfekthaus" in Essen
* [ACTION! Workshop 3] 28. October 2012 "Unperfekthaus" in Essen

!!Still missing: Graphics Utilities Library and Shape Editor

Now just these two are missing. Any hint, any help is welcome at any time. We would really appreciate your help in that case.\\

[{Image src='Graphics Utilities Library 1.jpg' width=384 height=240 }]
Graphics Utilities Library for ACTION! screen 1\\
\\
[{Image src='Graphics Utilities Library 2.jpg' width=384 height=240 }]
Graphics Utilities Library for ACTION! screen 2\\
\\
[{Image src='Shape Editor and Animator.jpg' width=384 height=240 }]
Shape Editor and Animator for ACTION! \\

!!Action Articles in Magzines
!Analog
||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|
|[ACTION! Zero Free]|#54 (05/ 87) |en|tool

!Antic
||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)

!ATARI''magazin''
||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

!CK Computer Kontakt
||Title||Issue||Language||Comment
|[Musik in ACTION] |#10/85|ge| tutorial
|[ACTION! noch schneller] |#6-7/86|ge| tutorial

!Atari Magazine
||Title||Issue||Language||Comment
|[ACTION! Deel]| |nl|A collection of ACTION! Articles