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 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 coprocessor, 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 ; reset the clock to zero 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 ; now run the sieve 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