C02 for C programmers TYPES C02 only supports one data type: unsigned char. POINTERS C02 does not support pointer type variables or parameters. However, the address-of operator may be used in function calls and the inline statement. DIRECTIVES C02 does not use a preprocessor. All directives are directly processed by the compiler. C02 supports the directives #include and #pragma. The directive #define is currently unimplemented and generates an error. The #if, #else, and #endif directives are not recognized by C02. CONSTANTS The syntax of the const keyword in C02 differs from that use in standard C. In C02, all constant names are prefixed with a # symbol. ENUMERATION The syntax of an enum statement in C02 is similar to standard C, except that no type name is specified and values may not be explicitly assigned to the enumerated constants. DECLARATIONS Variable and function names may be no more than six characters in length. Multiple variable declarations separated by commas are allowed. A variable in a declaration may be initialized by following it with an equal sign and a constant, however this declaration is done at compile time, so no re-initialization will occur during code execution. Array declarations using bracket syntax specify the upper bound, rather than the array size. Therefore, the array will be allocated with one more element than the specified number. Only one-dimensional arrays of type char are allowed and are limited to a total of 256 elements. Multi-dimensional arrays, arrays of arrays, and arrays of structs are not supported. Struct definition and syntax is similar to standard C. When defining a struct, the char keyword is optional, since char the char type is implied. Struct members may only be simple variables or arrays. The maximum total size of a struct is 256 bytes. Initialization of members during declaration of a struct variable is not supported. REGISTERS The 6502 registers may be explicitly referenced by name, i.e. A, X, and Y. These may only be used in specific places due to the nature of the compiled code a well as the limitations of the 6502 instruction set. EXPRESSIONS C02 supports the addition, subtraction, bitwise-and, bitwise-or, and exclusive-or operators. The multiplication, division, and binary shift operators are not supported. These can be implemented through functions. Unary minus may only be used at the beginning of an expression, in which case it is treated as a literal 0 and the subtraction operater, and the term following the minus is used as the second term of the expression. Functions calls may only be used in the first term of an expression. However, the first argument of any function call may be any expression (including one with a function call as the first term). As in standard C, subscripted array elements may be used in any term of an exptression and the index may be any expression (including one with a function call as the first term). The sizeof operator in C02 is the at sign @. It may only be used with declared variables and struct members, not types. FUNCTIONS Parameter passing uses the 6502's A, Y, and X registers. This limits function calls to a maximum of three char variables or address reference plus and optional char variable. However this also allows the return of up to three char variables (see assignments below). However, the non-standard push and pop statements allow explicit parameter passing via the stack, and the inline keyword has been re-purposed to allow explicit passing of inline parameters. ASSIGNMENTS Unlike standard C, struct contents may not be copied via simple assignment. Struct variables may be copied byte by byte or using memory move functions. Up to three comma-separated variables may be specified on the left side of the = assignment operator. This is generally only useful when the expression contains a function with multiple return values. STATEMENTS Instead of the switch statement, C02 uses the select statement. The select statement works almost identically to the switch statement except that case blocks do not fall through.